Make skydrive urls playable.
This commit is contained in:
parent
919e9215c4
commit
c57c47ae08
@ -1076,8 +1076,10 @@ optional_source(HAVE_DROPBOX
|
||||
optional_source(HAVE_SKYDRIVE
|
||||
SOURCES
|
||||
internet/skydriveservice.cpp
|
||||
internet/skydriveurlhandler.cpp
|
||||
HEADERS
|
||||
internet/skydriveservice.h
|
||||
internet/skydriveurlhandler.h
|
||||
)
|
||||
|
||||
# Hack to add Clementine to the Unity system tray whitelist
|
||||
|
@ -1,8 +1,15 @@
|
||||
#include "skydriveservice.h"
|
||||
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
using boost::scoped_ptr;
|
||||
|
||||
#include <qjson/parser.h>
|
||||
|
||||
#include "oauthenticator.h"
|
||||
#include "core/application.h"
|
||||
#include "core/player.h"
|
||||
#include "core/waitforsignal.h"
|
||||
#include "internet/oauthenticator.h"
|
||||
#include "internet/skydriveurlhandler.h"
|
||||
|
||||
namespace {
|
||||
|
||||
@ -30,6 +37,7 @@ SkydriveService::SkydriveService(
|
||||
: CloudFileService(
|
||||
app, parent, kServiceName, kServiceId,
|
||||
QIcon(":providers/skydrive.png"), SettingsDialog::Page_Skydrive) {
|
||||
app->player()->RegisterUrlHandler(new SkydriveUrlHandler(this, this));
|
||||
}
|
||||
|
||||
bool SkydriveService::has_credentials() const {
|
||||
@ -92,6 +100,8 @@ void SkydriveService::FetchUserInfoFinished(QNetworkReply* reply) {
|
||||
s.setValue("name", name);
|
||||
}
|
||||
|
||||
emit Connected();
|
||||
|
||||
ListFiles("me/skydrive");
|
||||
}
|
||||
|
||||
@ -138,7 +148,29 @@ void SkydriveService::ListFilesFinished(QNetworkReply* reply) {
|
||||
mime_type,
|
||||
download_url,
|
||||
QString::null);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QUrl SkydriveService::GetStreamingUrlFromSongId(const QString& file_id) {
|
||||
EnsureConnected();
|
||||
|
||||
QUrl url(QString(kSkydriveBase) + file_id);
|
||||
QNetworkRequest request(url);
|
||||
AddAuthorizationHeader(&request);
|
||||
scoped_ptr<QNetworkReply> reply(network_->get(request));
|
||||
WaitForSignal(reply.get(), SIGNAL(finished()));
|
||||
|
||||
QJson::Parser parser;
|
||||
QVariantMap response = parser.parse(reply.get()).toMap();
|
||||
return response["source"].toUrl();
|
||||
}
|
||||
|
||||
void SkydriveService::EnsureConnected() {
|
||||
if (!access_token_.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Connect();
|
||||
WaitForSignal(this, SIGNAL(Connected()));
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ class SkydriveService : public CloudFileService {
|
||||
SkydriveService(
|
||||
Application* app,
|
||||
InternetModel* parent);
|
||||
QUrl GetStreamingUrlFromSongId(const QString& song_id);
|
||||
|
||||
protected:
|
||||
// CloudFileService
|
||||
@ -27,9 +28,13 @@ class SkydriveService : public CloudFileService {
|
||||
void FetchUserInfoFinished(QNetworkReply* reply);
|
||||
void ListFilesFinished(QNetworkReply* reply);
|
||||
|
||||
signals:
|
||||
void Connected();
|
||||
|
||||
private:
|
||||
void AddAuthorizationHeader(QNetworkRequest* request);
|
||||
void ListFiles(const QString& folder);
|
||||
void EnsureConnected();
|
||||
|
||||
QString access_token_;
|
||||
QDateTime expiry_time_;
|
||||
|
16
src/internet/skydriveurlhandler.cpp
Normal file
16
src/internet/skydriveurlhandler.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
#include "skydriveurlhandler.h"
|
||||
|
||||
#include "skydriveservice.h"
|
||||
|
||||
SkydriveUrlHandler::SkydriveUrlHandler(
|
||||
SkydriveService* service,
|
||||
QObject* parent)
|
||||
: UrlHandler(parent),
|
||||
service_(service) {
|
||||
}
|
||||
|
||||
UrlHandler::LoadResult SkydriveUrlHandler::StartLoading(const QUrl& url) {
|
||||
QString file_id(url.path());
|
||||
QUrl real_url = service_->GetStreamingUrlFromSongId(file_id);
|
||||
return LoadResult(url, LoadResult::TrackAvailable, real_url);
|
||||
}
|
21
src/internet/skydriveurlhandler.h
Normal file
21
src/internet/skydriveurlhandler.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef SKYDRIVEURLHANDLER_H
|
||||
#define SKYDRIVEURLHANDLER_H
|
||||
|
||||
#include "core/urlhandler.h"
|
||||
|
||||
class SkydriveService;
|
||||
|
||||
class SkydriveUrlHandler : public UrlHandler {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SkydriveUrlHandler(SkydriveService* service, QObject* parent = 0);
|
||||
|
||||
QString scheme() const { return "skydrive"; }
|
||||
QIcon icon() const { return QIcon(":providers/skydrive.png"); }
|
||||
LoadResult StartLoading(const QUrl& url);
|
||||
|
||||
private:
|
||||
SkydriveService* service_;
|
||||
};
|
||||
|
||||
#endif // SKYDRIVEURLHANDLER_H
|
Loading…
x
Reference in New Issue
Block a user