Make skydrive urls playable.

This commit is contained in:
John Maguire 2012-12-13 14:44:59 +01:00
parent 919e9215c4
commit c57c47ae08
5 changed files with 78 additions and 2 deletions

View File

@ -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

View File

@ -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()));
}

View File

@ -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_;

View 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);
}

View 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