Rename filename to url, change album_id to string and recreate songs tables (#182)

This commit is contained in:
Jonas Kvinge
2019-06-20 02:14:44 +02:00
committed by GitHub
parent 033300d659
commit 9d222e2c57
19 changed files with 673 additions and 72 deletions

View File

@@ -136,7 +136,7 @@ void CollectionBackend::ChangeDirPath(int id, const QString &old_path, const QSt
// Do the songs table
{
QSqlQuery q(db);
q.prepare(QString("UPDATE %1 SET filename=:path || substr(filename, %2) WHERE directory=:id").arg(songs_table_).arg(path_len));
q.prepare(QString("UPDATE %1 SET url=:path || substr(url, %2) WHERE directory=:id").arg(songs_table_).arg(path_len));
q.bindValue(":path", new_url);
q.bindValue(":id", id);
q.exec();
@@ -748,7 +748,7 @@ Song CollectionBackend::GetSongByUrl(const QUrl &url, qint64 beginning) {
CollectionQuery query;
query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec);
query.AddWhere("filename", url.toString());
query.AddWhere("url", url.toString());
query.AddWhere("beginning", beginning);
Song song;
@@ -763,7 +763,7 @@ SongList CollectionBackend::GetSongsByUrl(const QUrl &url) {
CollectionQuery query;
query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec);
query.AddWhere("filename", url.toString());
query.AddWhere("url", url.toString());
SongList songlist;
if (ExecQuery(&query)) {
@@ -860,7 +860,7 @@ void CollectionBackend::UpdateCompilations() {
// Look for albums that have songs by more than one 'effective album artist' in the same directory
QSqlQuery q(db);
q.prepare(QString("SELECT effective_albumartist, album, filename, compilation_detected FROM %1 WHERE unavailable = 0 ORDER BY album").arg(songs_table_));
q.prepare(QString("SELECT effective_albumartist, album, url, compilation_detected FROM %1 WHERE unavailable = 0 ORDER BY album").arg(songs_table_));
q.exec();
if (db_->CheckErrors(q)) return;
@@ -948,7 +948,7 @@ CollectionBackend::AlbumList CollectionBackend::GetAlbums(const QString &artist,
AlbumList ret;
CollectionQuery query(opt);
query.SetColumnSpec("album, artist, albumartist, compilation, compilation_detected, art_automatic, art_manual, filename");
query.SetColumnSpec("album, artist, albumartist, compilation, compilation_detected, art_automatic, art_manual, url");
query.SetOrderBy("album");
if (compilation) {
@@ -1000,7 +1000,7 @@ CollectionBackend::Album CollectionBackend::GetAlbumArt(const QString &artist, c
ret.album_artist = albumartist;
CollectionQuery query = CollectionQuery(QueryOptions());
query.SetColumnSpec("art_automatic, art_manual, filename");
query.SetColumnSpec("art_automatic, art_manual, url");
if (!albumartist.isEmpty()) {
query.AddWhere("albumartist", albumartist);
}

View File

@@ -1011,7 +1011,7 @@ CollectionItem *CollectionModel::ItemFromQuery(GroupBy type, bool signal, bool c
item->key = row.value(0).toString();
item->display_text = TextOrUnknown(item->key);
item->sort_text = SortTextForArtist(item->key);
item->metadata.set_album_id(row.value(1).toInt());
item->metadata.set_album_id(row.value(1).toString());
break;
case GroupBy_OriginalYear:{

View File

@@ -52,7 +52,7 @@
#include "scopedtransaction.h"
const char *Database::kDatabaseFilename = "strawberry.db";
const int Database::kSchemaVersion = 7;
const int Database::kSchemaVersion = 8;
const char *Database::kMagicAllSongsTables = "%allsongstables";
int Database::sNextConnectionId = 1;

View File

@@ -102,7 +102,7 @@ const QStringList Song::kColumns = QStringList() << "title"
<< "source"
<< "directory_id"
<< "filename"
<< "url"
<< "filetype"
<< "filesize"
<< "mtime"
@@ -177,7 +177,7 @@ struct Song::Private : public QSharedData {
QString lyrics_;
qint64 artist_id_;
qint64 album_id_;
QString album_id_;
qint64 song_id_;
qint64 beginning_;
@@ -230,7 +230,6 @@ Song::Private::Private(Song::Source source)
compilation_(false),
artist_id_(-1),
album_id_(-1),
song_id_(-1),
beginning_(0),
@@ -275,7 +274,7 @@ bool Song::is_unavailable() const { return d->unavailable_; }
int Song::id() const { return d->id_; }
qint64 Song::artist_id() const { return d->artist_id_; }
qint64 Song::album_id() const { return d->album_id_; }
QString Song::album_id() const { return d->album_id_; }
qint64 Song::song_id() const { return d->song_id_; }
const QString &Song::title() const { return d->title_; }
@@ -342,7 +341,8 @@ void Song::set_id(int id) { d->id_ = id; }
void Song::set_valid(bool v) { d->valid_ = v; }
void Song::set_artist_id(qint64 v) { d->artist_id_ = v; }
void Song::set_album_id(qint64 v) { d->album_id_ = v; }
void Song::set_album_id(qint64 v) { d->album_id_ = QString::number(v); }
void Song::set_album_id(const QString &v) { d->album_id_ = v; }
void Song::set_song_id(qint64 v) { d->song_id_ = v; }
void Song::set_title(const QString &v) { d->title_ = v; }
@@ -774,7 +774,7 @@ void Song::InitFromQuery(const SqlRow &q, bool reliable_metadata, int col) {
d->artist_id_ = tolonglong(x);
}
else if (Song::kColumns.value(i) == "album_id") {
d->album_id_ = tolonglong(x);
d->album_id_ = tostr(x);
}
else if (Song::kColumns.value(i) == "song_id") {
d->song_id_ = tolonglong(x);
@@ -803,7 +803,7 @@ void Song::InitFromQuery(const SqlRow &q, bool reliable_metadata, int col) {
else if (Song::kColumns.value(i) == "directory_id") {
d->directory_id_ = toint(x);
}
else if (Song::kColumns.value(i) == "filename") {
else if (Song::kColumns.value(i) == "url") {
set_url(QUrl::fromEncoded(tostr(x).toUtf8()));
d->basefilename_ = QFileInfo(d->url_.toLocalFile()).fileName();
}
@@ -944,7 +944,8 @@ void Song::InitFromItdb(const Itdb_Track *track, const QString &prefix) {
filename.replace(':', '/');
if (prefix.contains("://")) {
set_url(QUrl(prefix + filename));
} else {
}
else {
set_url(QUrl::fromLocalFile(prefix + filename));
}
d->basefilename_ = QFileInfo(filename).fileName();
@@ -1130,7 +1131,7 @@ void Song::BindToQuery(QSqlQuery *query) const {
query->bindValue(":lyrics", strval(d->lyrics_));
query->bindValue(":artist_id", intval(d->artist_id_));
query->bindValue(":album_id", intval(d->album_id_));
query->bindValue(":album_id", strval(d->album_id_));
query->bindValue(":song_id", intval(d->song_id_));
query->bindValue(":beginning", d->beginning_);
@@ -1152,7 +1153,7 @@ void Song::BindToQuery(QSqlQuery *query) const {
url = d->url_.toEncoded();
}
}
query->bindValue(":filename", url);
query->bindValue(":url", url);
query->bindValue(":filetype", d->filetype_);
query->bindValue(":filesize", notnullintval(d->filesize_));

View File

@@ -200,7 +200,7 @@ class Song {
const QString &lyrics() const;
qint64 artist_id() const;
qint64 album_id() const;
QString album_id() const;
qint64 song_id() const;
qint64 beginning_nanosec() const;
@@ -291,6 +291,7 @@ class Song {
void set_artist_id(qint64 v);
void set_album_id(qint64 v);
void set_album_id(const QString &v);
void set_song_id(qint64 v);
void set_beginning_nanosec(qint64 v);

View File

@@ -85,7 +85,7 @@ QStandardItem *InternetSearchModel::BuildContainers(const Song &s, QStandardItem
bool has_album_icon = false;
QString display_text;
QString sort_text;
int unique_tag = -1;
QString unique_tag;
int year = 0;
switch (group_by_[level]) {
@@ -222,7 +222,7 @@ QStandardItem *InternetSearchModel::BuildContainers(const Song &s, QStandardItem
if (sort_text.isEmpty()) sort_text = "Unknown";
// Find a container for this level
key->group_[level] = display_text + QString::number(unique_tag);
key->group_[level] = display_text + unique_tag;
QStandardItem *container = containers_[*key];
if (!container) {
container = new QStandardItem(display_text);

View File

@@ -108,8 +108,8 @@ void QobuzFavoriteRequest::AddFavorites(const FavoriteType type, const SongList
id = QString::number(song.artist_id());
break;
case FavoriteType_Albums:
if (song.album_id() <= 0) continue;
id = QString::number(song.album_id());
if (song.album_id().isEmpty()) continue;
id = song.album_id();
break;
case FavoriteType_Songs:
if (song.song_id() <= 0) continue;
@@ -215,8 +215,8 @@ void QobuzFavoriteRequest::RemoveFavorites(const FavoriteType type, const SongLi
id = QString::number(song.artist_id());
break;
case FavoriteType_Albums:
if (song.album_id() <= 0) continue;
id = QString::number(song.album_id());
if (song.album_id().isEmpty()) continue;
id = song.album_id();
break;
case FavoriteType_Songs:
if (song.song_id() <= 0) continue;

View File

@@ -1027,6 +1027,7 @@ int QobuzRequest::ParseSong(Song &song, const QJsonObject &json_obj, qint64 arti
song.set_source(Song::Source_Qobuz);
song.set_song_id(song_id);
song.set_album_id(album_id);
song.set_artist_id(artist_id);
song.set_album(album);
song.set_artist(album_artist);

View File

@@ -628,13 +628,13 @@ void SubsonicRequest::FlushAlbumCoverRequests() {
QNetworkReply *reply = network_->get(req);
album_cover_replies_ << reply;
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumCoverReceived(QNetworkReply*, const qint64, const QUrl&, const QString&)), reply, request.album_id, request.url, request.filename);
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumCoverReceived(QNetworkReply*, const QString&, const QUrl&, const QString&)), reply, request.album_id, request.url, request.filename);
}
}
void SubsonicRequest::AlbumCoverReceived(QNetworkReply *reply, const qint64 album_id, const QUrl &url, const QString &filename) {
void SubsonicRequest::AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url, const QString &filename) {
if (album_cover_replies_.contains(reply)) {
album_cover_replies_.removeAll(reply);

View File

@@ -69,7 +69,7 @@ class SubsonicRequest : public SubsonicBaseRequest {
void AlbumsReplyReceived(QNetworkReply *reply, const int offset_requested);
void AlbumSongsReplyReceived(QNetworkReply *reply, const qint64 artist_id, const qint64 album_id, const QString &album_artist);
void AlbumCoverReceived(QNetworkReply *reply, const qint64 album_id, const QUrl &url, const QString &filename);
void AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url, const QString &filename);
private:
typedef QPair<QString, QString> Param;
@@ -85,7 +85,7 @@ class SubsonicRequest : public SubsonicBaseRequest {
};
struct AlbumCoverRequest {
qint64 artist_id = 0;
qint64 album_id = 0;
QString album_id = 0;
QUrl url;
QString filename;
};
@@ -127,7 +127,7 @@ class SubsonicRequest : public SubsonicBaseRequest {
QQueue<AlbumCoverRequest> album_cover_requests_queue_;
QHash<int, Request> album_songs_requests_pending_;
QMultiMap<int, Song*> album_covers_requests_sent_;
QMultiMap<QString, Song*> album_covers_requests_sent_;
int albums_requests_active_;

View File

@@ -61,7 +61,7 @@ TidalBaseRequest::~TidalBaseRequest() {
QNetworkReply *TidalBaseRequest::CreateRequest(const QString &ressource_name, const QList<Param> &params_provided) {
ParamList params = ParamList() << params_provided
<< Param("countryCode", country_code());
<< Param("countryCode", country_code());
QUrlQuery url_query;
for (const Param& param : params) {

View File

@@ -109,8 +109,8 @@ void TidalFavoriteRequest::AddFavorites(const FavoriteType type, const SongList
id = QString::number(song.artist_id());
break;
case FavoriteType_Albums:
if (song.album_id() <= 0) continue;
id = QString::number(song.album_id());
if (song.album_id().isEmpty()) continue;
id = song.album_id();
break;
case FavoriteType_Songs:
if (song.song_id() <= 0) continue;
@@ -201,18 +201,18 @@ void TidalFavoriteRequest::RemoveFavorites(const FavoriteType type, const SongLi
if (songs.isEmpty()) return;
QList<int> ids;
QMultiMap<int, Song> songs_map;
QList<qint64> ids;
QMultiMap<qint64, Song> songs_map;
for (const Song &song : songs) {
int id = -1;
qint64 id = -1;
switch (type) {
case FavoriteType_Artists:
if (song.artist_id() <= 0) continue;
id = song.artist_id();
break;
case FavoriteType_Albums:
if (song.album_id() <= 0) continue;
id = song.album_id();
if (song.album_id().isEmpty()) continue;
id = song.album_id().toLongLong();
break;
case FavoriteType_Songs:
if (song.song_id() <= 0) continue;

View File

@@ -1033,13 +1033,13 @@ void TidalRequest::FlushAlbumCoverRequests() {
QNetworkRequest req(request.url);
QNetworkReply *reply = network_->get(req);
album_cover_replies_ << reply;
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumCoverReceived(QNetworkReply*, const qint64, const QUrl&)), reply, request.album_id, request.url);
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumCoverReceived(QNetworkReply*, const QString&, const QUrl&)), reply, request.album_id, request.url);
}
}
void TidalRequest::AlbumCoverReceived(QNetworkReply *reply, const qint64 album_id, const QUrl &url) {
void TidalRequest::AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url) {
if (album_cover_replies_.contains(reply)) {
album_cover_replies_.removeAll(reply);
@@ -1083,7 +1083,7 @@ void TidalRequest::AlbumCoverReceived(QNetworkReply *reply, const qint64 album_i
QDir dir;
if (dir.mkpath(service_->CoverCacheDir())) {
QString filename(service_->CoverCacheDir() + "/" + QString::number(album_id) + "-" + url.fileName());
QString filename(service_->CoverCacheDir() + "/" + album_id + "-" + url.fileName());
if (image.save(filename, "JPG")) {
while (album_covers_requests_sent_.contains(album_id)) {
Song *song = album_covers_requests_sent_.take(album_id);

View File

@@ -85,7 +85,7 @@ class TidalRequest : public TidalBaseRequest {
void ArtistAlbumsReplyReceived(QNetworkReply *reply, const qint64 artist_id, const int offset_requested);
void AlbumSongsReplyReceived(QNetworkReply *reply, const qint64 artist_id, const qint64 album_id, const int offset_requested, const QString &album_artist);
void AlbumCoverReceived(QNetworkReply *reply, const qint64 album_id, const QUrl &url);
void AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url);
private:
typedef QPair<QString, QString> Param;
@@ -101,7 +101,7 @@ class TidalRequest : public TidalBaseRequest {
};
struct AlbumCoverRequest {
qint64 artist_id = 0;
qint64 album_id = 0;
QString album_id = 0;
QUrl url;
};
@@ -176,7 +176,7 @@ class TidalRequest : public TidalBaseRequest {
QList<int> artist_albums_requests_pending_;
QHash<int, Request> album_songs_requests_pending_;
QMultiMap<int, Song*> album_covers_requests_sent_;
QMultiMap<QString, Song*> album_covers_requests_sent_;
int artists_requests_active_;
int artists_total_;

View File

@@ -204,8 +204,6 @@ void TidalService::ReloadSettings() {
if (client_id_.isEmpty()) client_id_ = QString::fromUtf8(QByteArray::fromBase64(kClientIdB64));
api_token_ = s.value("api_token").toString();
if (api_token_.isEmpty()) api_token_ = QString::fromUtf8(QByteArray::fromBase64(kApiTokenB64));
user_id_ = s.value("user_id", 0).toInt();
country_code_ = s.value("country_code", "US").toString();
username_ = s.value("username").toString();
QByteArray password = s.value("password").toByteArray();
@@ -222,6 +220,8 @@ void TidalService::ReloadSettings() {
cache_album_covers_ = s.value("cachealbumcovers", true).toBool();
stream_url_method_ = static_cast<TidalSettingsPage::StreamUrlMethod>(s.value("streamurl").toInt());
user_id_ = s.value("user_id").toInt();
country_code_ = s.value("country_code", "US").toString();
access_token_ = s.value("access_token").toString();
refresh_token_ = s.value("refresh_token").toString();
session_id_ = s.value("session_id").toString();
@@ -559,12 +559,12 @@ void TidalService::HandleAuthReply(QNetworkReply *reply) {
QSettings s;
s.beginGroup(TidalSettingsPage::kSettingsGroup);
s.setValue("user_id", user_id_);
s.setValue("session_id", session_id_);
s.setValue("country_code", country_code_);
s.remove("access_token");
s.remove("refresh_token");
s.remove("expiry_time");
s.setValue("user_id", user_id_);
s.setValue("session_id", session_id_);
s.setValue("country_code", country_code_);
s.endGroup();
qLog(Debug) << "Tidal: Login successful" << "user id" << user_id_ << "session id" << session_id_ << "country code" << country_code_;
@@ -585,6 +585,8 @@ void TidalService::Logout() {
QSettings s;
s.beginGroup(TidalSettingsPage::kSettingsGroup);
s.remove("user_id");
s.remove("country_code");
s.remove("access_token");
s.remove("session_id");
s.remove("expiry_time");