Migrate to dropbox api v2
This commit is contained in:
parent
7750d5015e
commit
13aa0adc84
|
@ -23,6 +23,7 @@
|
|||
#include <QTimer>
|
||||
|
||||
#include <qjson/parser.h>
|
||||
#include <qjson/serializer.h>
|
||||
|
||||
#include "core/application.h"
|
||||
#include "core/logging.h"
|
||||
|
@ -44,10 +45,14 @@ namespace {
|
|||
|
||||
static const char* kServiceId = "dropbox";
|
||||
|
||||
static const char* kMediaEndpoint = "https://api.dropbox.com/1/media/dropbox/";
|
||||
static const char* kDeltaEndpoint = "https://api.dropbox.com/1/delta";
|
||||
static const char* kMediaEndpoint =
|
||||
"https://api.dropboxapi.com/2/files/get_temporary_link";
|
||||
static const char* kListFolderEndpoint =
|
||||
"https://api.dropboxapi.com/2/files/list_folder";
|
||||
static const char* kListFolderContinueEndpoint =
|
||||
"https://api.dropboxapi.com/2/files/list_folder/continue";
|
||||
static const char* kLongPollEndpoint =
|
||||
"https://api-notify.dropbox.com/1/longpoll_delta";
|
||||
"https://notify.dropboxapi.com/2/files/list_folder/longpoll";
|
||||
|
||||
} // namespace
|
||||
|
||||
|
@ -97,16 +102,37 @@ void DropboxService::RequestFileList() {
|
|||
QSettings s;
|
||||
s.beginGroup(kSettingsGroup);
|
||||
|
||||
QUrl url = QUrl(QString(kDeltaEndpoint));
|
||||
if (s.contains("cursor")) {
|
||||
url.addQueryItem("cursor", s.value("cursor").toString());
|
||||
}
|
||||
QNetworkRequest request(url);
|
||||
request.setRawHeader("Authorization", GenerateAuthorisationHeader());
|
||||
QString cursor = s.value("cursor", "").toString();
|
||||
|
||||
QNetworkReply* reply = network_->post(request, QByteArray());
|
||||
NewClosure(reply, SIGNAL(finished()), this,
|
||||
SLOT(RequestFileListFinished(QNetworkReply*)), reply);
|
||||
if (cursor.isEmpty()) {
|
||||
QUrl url = QUrl(QString(kListFolderEndpoint));
|
||||
|
||||
QVariantMap json;
|
||||
json.insert("path", "");
|
||||
json.insert("recursive", true);
|
||||
json.insert("include_deleted", true);
|
||||
|
||||
QNetworkRequest request(url);
|
||||
request.setRawHeader("Authorization", GenerateAuthorisationHeader());
|
||||
request.setRawHeader("Content-Type", "application/json; charset=utf-8");
|
||||
|
||||
QJson::Serializer serializer;
|
||||
|
||||
QNetworkReply* reply = network_->post(request, serializer.serialize(json));
|
||||
NewClosure(reply, SIGNAL(finished()), this,
|
||||
SLOT(RequestFileListFinished(QNetworkReply*)), reply);
|
||||
} else {
|
||||
QUrl url = QUrl(kListFolderContinueEndpoint);
|
||||
QVariantMap json;
|
||||
json.insert("cursor", cursor);
|
||||
QJson::Serializer serializer;
|
||||
QNetworkRequest request(url);
|
||||
request.setRawHeader("Authorization", GenerateAuthorisationHeader());
|
||||
request.setRawHeader("Content-Type", "application/json; charset=utf-8");
|
||||
QNetworkReply* reply = network_->post(request, serializer.serialize(json));
|
||||
NewClosure(reply, SIGNAL(finished()), this,
|
||||
SLOT(RequestFileListFinished(QNetworkReply*)), reply);
|
||||
}
|
||||
}
|
||||
|
||||
void DropboxService::RequestFileListFinished(QNetworkReply* reply) {
|
||||
|
@ -114,27 +140,22 @@ void DropboxService::RequestFileListFinished(QNetworkReply* reply) {
|
|||
|
||||
QJson::Parser parser;
|
||||
QVariantMap response = parser.parse(reply).toMap();
|
||||
if (response.contains("reset") && response["reset"].toBool()) {
|
||||
qLog(Debug) << "Resetting Dropbox DB";
|
||||
library_backend_->DeleteAll();
|
||||
}
|
||||
|
||||
QSettings settings;
|
||||
settings.beginGroup(kSettingsGroup);
|
||||
settings.setValue("cursor", response["cursor"].toString());
|
||||
|
||||
QVariantList contents = response["entries"].toList();
|
||||
qLog(Debug) << "Delta found:" << contents.size();
|
||||
qLog(Debug) << "File list found:" << contents.size();
|
||||
for (const QVariant& c : contents) {
|
||||
QVariantList item = c.toList();
|
||||
QString path = item[0].toString();
|
||||
QVariantMap item = c.toMap();
|
||||
QString path = item["path_lower"].toString();
|
||||
|
||||
QUrl url;
|
||||
url.setScheme("dropbox");
|
||||
url.setPath(path);
|
||||
|
||||
if (item[1].isNull()) {
|
||||
// Null metadata indicates path deleted.
|
||||
if (item[".tag"].toString() == "deleted") {
|
||||
qLog(Debug) << "Deleting:" << url;
|
||||
Song song = library_backend_->GetSongByUrl(url);
|
||||
if (song.is_valid()) {
|
||||
|
@ -143,27 +164,22 @@ void DropboxService::RequestFileListFinished(QNetworkReply* reply) {
|
|||
continue;
|
||||
}
|
||||
|
||||
QVariantMap metadata = item[1].toMap();
|
||||
if (metadata["is_dir"].toBool()) {
|
||||
if (item[".tag"].toString() == "folder") {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Workaround: Since Dropbox doesn't recognize Opus files and thus treats
|
||||
// them
|
||||
// as application/octet-stream, we overwrite the mime type here
|
||||
if (metadata["mime_type"].toString() == "application/octet-stream" &&
|
||||
url.toString().endsWith(".opus"))
|
||||
metadata["mime_type"] = GuessMimeTypeForFile(url.toString());
|
||||
|
||||
if (ShouldIndexFile(url, metadata["mime_type"].toString())) {
|
||||
if (ShouldIndexFile(url, GuessMimeTypeForFile(url.toString()))) {
|
||||
QNetworkReply* reply = FetchContentUrl(url);
|
||||
NewClosure(reply, SIGNAL(finished()), this,
|
||||
SLOT(FetchContentUrlFinished(QNetworkReply*, QVariantMap)),
|
||||
reply, metadata);
|
||||
reply, item);
|
||||
}
|
||||
}
|
||||
|
||||
if (response.contains("has_more") && response["has_more"].toBool()) {
|
||||
QSettings s;
|
||||
s.beginGroup(kSettingsGroup);
|
||||
s.setValue("cursor", response["cursor"]);
|
||||
RequestFileList();
|
||||
} else {
|
||||
// Long-poll wait for changes.
|
||||
|
@ -180,12 +196,13 @@ void DropboxService::LongPollDelta() {
|
|||
s.beginGroup(kSettingsGroup);
|
||||
|
||||
QUrl request_url = QUrl(QString(kLongPollEndpoint));
|
||||
if (s.contains("cursor")) {
|
||||
request_url.addQueryItem("cursor", s.value("cursor").toString());
|
||||
}
|
||||
QVariantMap json;
|
||||
json.insert("cursor", s.value("cursor").toString());
|
||||
json.insert("timeout", 30);
|
||||
QNetworkRequest request(request_url);
|
||||
request.setRawHeader("Authorization", GenerateAuthorisationHeader());
|
||||
QNetworkReply* reply = network_->get(request);
|
||||
request.setRawHeader("Content-Type", "application/json; charset=utf-8");
|
||||
QJson::Serializer serializer;
|
||||
QNetworkReply* reply = network_->post(request, serializer.serialize(json));
|
||||
NewClosure(reply, SIGNAL(finished()), this,
|
||||
SLOT(LongPollFinished(QNetworkReply*)), reply);
|
||||
}
|
||||
|
@ -208,11 +225,14 @@ void DropboxService::LongPollFinished(QNetworkReply* reply) {
|
|||
}
|
||||
|
||||
QNetworkReply* DropboxService::FetchContentUrl(const QUrl& url) {
|
||||
QUrl request_url = QUrl((QString(kMediaEndpoint)));
|
||||
request_url.setPath(request_url.path() + url.path().mid(1));
|
||||
QUrl request_url(kMediaEndpoint);
|
||||
QVariantMap json;
|
||||
json.insert("path", url.path());
|
||||
QJson::Serializer serializer;
|
||||
QNetworkRequest request(request_url);
|
||||
request.setRawHeader("Authorization", GenerateAuthorisationHeader());
|
||||
return network_->post(request, QByteArray());
|
||||
request.setRawHeader("Content-Type", "application/json; charset=utf-8");
|
||||
return network_->post(request, serializer.serialize(json));
|
||||
}
|
||||
|
||||
void DropboxService::FetchContentUrlFinished(QNetworkReply* reply,
|
||||
|
@ -220,22 +240,23 @@ void DropboxService::FetchContentUrlFinished(QNetworkReply* reply,
|
|||
reply->deleteLater();
|
||||
QJson::Parser parser;
|
||||
QVariantMap response = parser.parse(reply).toMap();
|
||||
QFileInfo info(data["path"].toString());
|
||||
QFileInfo info(data["path_lower"].toString());
|
||||
|
||||
QUrl url;
|
||||
url.setScheme("dropbox");
|
||||
url.setPath(data["path"].toString());
|
||||
url.setPath(data["path_lower"].toString());
|
||||
|
||||
Song song;
|
||||
song.set_url(url);
|
||||
song.set_etag(data["rev"].toString());
|
||||
song.set_mtime(ParseRFC822DateTime(data["modified"].toString()).toTime_t());
|
||||
song.set_mtime(QDateTime::fromString(data["server_modified"].toString(),
|
||||
Qt::ISODate).toTime_t());
|
||||
song.set_title(info.fileName());
|
||||
song.set_filesize(data["bytes"].toInt());
|
||||
song.set_filesize(data["size"].toInt());
|
||||
song.set_ctime(0);
|
||||
|
||||
MaybeAddFileToDatabase(song, data["mime_type"].toString(),
|
||||
QUrl::fromEncoded(response["url"].toByteArray()),
|
||||
MaybeAddFileToDatabase(song, GuessMimeTypeForFile(url.toString()),
|
||||
QUrl::fromEncoded(response["link"].toByteArray()),
|
||||
QString::null);
|
||||
}
|
||||
|
||||
|
@ -245,5 +266,5 @@ QUrl DropboxService::GetStreamingUrlFromSongId(const QUrl& url) {
|
|||
|
||||
QJson::Parser parser;
|
||||
QVariantMap response = parser.parse(reply).toMap();
|
||||
return QUrl::fromEncoded(response["url"].toByteArray());
|
||||
return QUrl::fromEncoded(response["link"].toByteArray());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue