Change artist and song ID to strings

This commit is contained in:
Jonas Kvinge
2020-04-13 03:39:51 +02:00
parent 30e6ced4e9
commit 5591472dbd
10 changed files with 328 additions and 121 deletions

View File

@@ -822,35 +822,29 @@ SongList CollectionBackend::GetSongsByUrl(const QUrl &url) {
}
Song CollectionBackend::GetSongBySongId(int song_id) {
Song CollectionBackend::GetSongBySongId(const QString &song_id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
return GetSongBySongId(song_id, db);
}
SongList CollectionBackend::GetSongsBySongId(const QList<int> &song_ids) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
QStringList str_song_ids;
for (int song_id : song_ids) {
str_song_ids << QString::number(song_id);
}
return GetSongsBySongId(str_song_ids, db);
}
SongList CollectionBackend::GetSongsBySongId(const QStringList &song_ids) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
return GetSongsBySongId(song_ids, db);
}
Song CollectionBackend::GetSongBySongId(int song_id, QSqlDatabase &db) {
SongList list = GetSongsBySongId(QStringList() << QString::number(song_id), db);
Song CollectionBackend::GetSongBySongId(const QString &song_id, QSqlDatabase &db) {
SongList list = GetSongsBySongId(QStringList() << song_id, db);
if (list.isEmpty()) return Song();
return list.first();
}
SongList CollectionBackend::GetSongsBySongId(const QStringList &song_ids, QSqlDatabase &db) {

View File

@@ -181,8 +181,7 @@ class CollectionBackend : public CollectionBackendInterface {
void DeleteAll();
Song GetSongBySongId(int song_id);
SongList GetSongsBySongId(const QList<int> &song_ids);
Song GetSongBySongId(const QString &song_id);
SongList GetSongsBySongId(const QStringList &song_ids);
Song::Source Source() const;
@@ -241,7 +240,7 @@ class CollectionBackend : public CollectionBackendInterface {
Song GetSongById(int id, QSqlDatabase &db);
SongList GetSongsById(const QStringList &ids, QSqlDatabase &db);
Song GetSongBySongId(int song_id, QSqlDatabase &db);
Song GetSongBySongId(const QString &song_id, QSqlDatabase &db);
SongList GetSongsBySongId(const QStringList &song_ids, QSqlDatabase &db);
private:

View File

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

View File

@@ -181,9 +181,9 @@ struct Song::Private : public QSharedData {
QString comment_;
QString lyrics_;
qint64 artist_id_;
QString artist_id_;
QString album_id_;
qint64 song_id_;
QString song_id_;
qint64 beginning_;
qint64 end_;
@@ -279,9 +279,9 @@ bool Song::is_valid() const { return d->valid_; }
bool Song::is_unavailable() const { return d->unavailable_; }
int Song::id() const { return d->id_; }
qint64 Song::artist_id() const { return d->artist_id_; }
QString Song::artist_id() const { return d->artist_id_.isNull() ? "" : d->artist_id_; }
QString Song::album_id() const { return d->album_id_.isNull() ? "" : d->album_id_; }
qint64 Song::song_id() const { return d->song_id_; }
QString Song::song_id() const { return d->song_id_.isNull() ? "" : d->song_id_; }
const QString &Song::title() const { return d->title_; }
const QString &Song::title_sortable() const { return d->title_sortable_; }
@@ -380,10 +380,9 @@ const QString &Song::error() const { return d->error_; }
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_ = QString::number(v); }
void Song::set_artist_id(const QString &v) { d->artist_id_ = 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_song_id(const QString &v) { d->song_id_ = v; }
QString Song::sortable(const QString &v) const {
@@ -860,13 +859,13 @@ void Song::InitFromQuery(const SqlRow &q, bool reliable_metadata, int col) {
}
else if (Song::kColumns.value(i) == "artist_id") {
d->artist_id_ = tolonglong(x);
d->artist_id_ = tostr(x);
}
else if (Song::kColumns.value(i) == "album_id") {
d->album_id_ = tostr(x);
}
else if (Song::kColumns.value(i) == "song_id") {
d->song_id_ = tolonglong(x);
d->song_id_ = tostr(x);
}
else if (Song::kColumns.value(i) == "beginning") {
@@ -1265,9 +1264,9 @@ void Song::BindToQuery(QSqlQuery *query) const {
query->bindValue(":comment", strval(d->comment_));
query->bindValue(":lyrics", strval(d->lyrics_));
query->bindValue(":artist_id", intval(d->artist_id_));
query->bindValue(":artist_id", strval(d->artist_id_));
query->bindValue(":album_id", strval(d->album_id_));
query->bindValue(":song_id", intval(d->song_id_));
query->bindValue(":song_id", strval(d->song_id_));
query->bindValue(":beginning", d->beginning_);
query->bindValue(":length", intval(length_nanosec()));

View File

@@ -208,9 +208,9 @@ class Song {
const QString &comment() const;
const QString &lyrics() const;
qint64 artist_id() const;
QString artist_id() const;
QString album_id() const;
qint64 song_id() const;
QString song_id() const;
qint64 beginning_nanosec() const;
qint64 end_nanosec() const;
@@ -309,10 +309,9 @@ class Song {
void set_comment(const QString &v);
void set_lyrics(const QString &v);
void set_artist_id(qint64 v);
void set_album_id(qint64 v);
void set_artist_id(const QString &v);
void set_album_id(const QString &v);
void set_song_id(qint64 v);
void set_song_id(const QString &v);
void set_beginning_nanosec(qint64 v);
void set_end_nanosec(qint64 v);

View File

@@ -324,7 +324,7 @@ void SubsonicRequest::AlbumsFinishCheck(const int offset, const int albums_recei
}
void SubsonicRequest::AddAlbumSongsRequest(const qint64 artist_id, const QString &album_id, const QString &album_artist, const int offset) {
void SubsonicRequest::AddAlbumSongsRequest(const QString &artist_id, const QString &album_id, const QString &album_artist, const int offset) {
Request request;
request.artist_id = artist_id;
@@ -346,13 +346,13 @@ void SubsonicRequest::FlushAlbumSongsRequests() {
ParamList params = ParamList() << Param("id", request.album_id);
QNetworkReply *reply = CreateGetRequest(QString("getAlbum"), params);
replies_ << reply;
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumSongsReplyReceived(QNetworkReply*, const qint64, const qint64, const QString&)), reply, request.artist_id, request.album_id, request.album_artist);
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumSongsReplyReceived(QNetworkReply*, QString, QString, QString)), reply, request.artist_id, request.album_id, request.album_artist);
}
}
void SubsonicRequest::AlbumSongsReplyReceived(QNetworkReply *reply, const qint64 artist_id, const qint64 album_id, const QString &album_artist) {
void SubsonicRequest::AlbumSongsReplyReceived(QNetworkReply *reply, const QString &artist_id, const QString &album_id, const QString &album_artist) {
if (!replies_.contains(reply)) return;
replies_.removeAll(reply);
@@ -482,7 +482,7 @@ void SubsonicRequest::SongsFinishCheck() {
}
int SubsonicRequest::ParseSong(Song &song, const QJsonObject &json_obj, const qint64 artist_id_requested, const qint64 album_id_requested, const QString &album_artist) {
QString SubsonicRequest::ParseSong(Song &song, const QJsonObject &json_obj, const QString &artist_id_requested, const QString &album_id_requested, const QString &album_artist) {
Q_UNUSED(artist_id_requested);
Q_UNUSED(album_id_requested);
@@ -496,18 +496,15 @@ int SubsonicRequest::ParseSong(Song &song, const QJsonObject &json_obj, const qi
!json_obj.contains("type")
) {
Error("Invalid Json reply, song is missing one or more values.", json_obj);
return -1;
return QString();
}
qint64 song_id = 0;
QString song_id_str;
QString song_id;
if (json_obj["id"].type() == QJsonValue::String) {
song_id_str = json_obj["id"].toString();
song_id = QString(song_id_str).remove(QRegExp("[^0-9]+")).toLongLong();
song_id = json_obj["id"].toString();
}
else {
song_id = json_obj["id"].toInt();
song_id_str = QString::number(song_id);
song_id = QString::number(json_obj["id"].toInt());
}
QString album_id;
@@ -520,14 +517,13 @@ int SubsonicRequest::ParseSong(Song &song, const QJsonObject &json_obj, const qi
}
}
qint64 artist_id = -1;
QString artist_id;
if (json_obj.contains("artistId")) {
if (json_obj["artistId"].type() == QJsonValue::String) {
QString artist_id_str = json_obj["artistId"].toString();
artist_id = QString(artist_id_str).remove(QRegExp("[^0-9]+")).toLongLong();
artist_id = json_obj["artistId"].toString();
}
else {
artist_id = json_obj["artistId"].toInt();
artist_id = QString::number(json_obj["artistId"].toInt());
}
}
@@ -619,7 +615,7 @@ int SubsonicRequest::ParseSong(Song &song, const QJsonObject &json_obj, const qi
QUrl url;
url.setScheme(url_handler_->scheme());
url.setPath(song_id_str);
url.setPath(song_id);
QUrl cover_url;
if (!cover_art_id.isEmpty()) {
@@ -641,9 +637,9 @@ int SubsonicRequest::ParseSong(Song &song, const QJsonObject &json_obj, const qi
song.set_source(Song::Source_Subsonic);
song.set_song_id(song_id);
if (album_id > 0) song.set_album_id(album_id);
if (artist_id > 0) song.set_artist_id(artist_id);
if (album_artist != artist) song.set_albumartist(album_artist);
if (!album_id.isEmpty()) song.set_album_id(album_id);
if (!artist_id.isEmpty()) song.set_artist_id(artist_id);
if (!album_artist.isEmpty()) song.set_albumartist(album_artist);
song.set_album(album);
song.set_artist(artist);
song.set_title(title);
@@ -721,7 +717,7 @@ void SubsonicRequest::FlushAlbumCoverRequests() {
QNetworkReply *reply = network_->get(req);
album_cover_replies_ << reply;
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumCoverReceived(QNetworkReply*, const QString&, const QUrl&, const QString&)), reply, request.album_id, request.url, request.filename);
NewClosure(reply, SIGNAL(finished()), this, SLOT(AlbumCoverReceived(QNetworkReply*, QString, QUrl, QString)), reply, request.album_id, request.url, request.filename);
}

View File

@@ -68,7 +68,7 @@ class SubsonicRequest : public SubsonicBaseRequest {
private slots:
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 AlbumSongsReplyReceived(QNetworkReply *reply, const QString &artist_id, const QString &album_id, const QString &album_artist);
void AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url, const QString &filename);
private:
@@ -76,15 +76,15 @@ class SubsonicRequest : public SubsonicBaseRequest {
typedef QList<Param> ParamList;
struct Request {
qint64 artist_id = 0;
QString artist_id = 0;
QString album_id;
qint64 song_id = 0;
QString song_id = 0;
int offset = 0;
int size = 0;
QString album_artist;
};
struct AlbumCoverRequest {
qint64 artist_id = 0;
QString artist_id = 0;
QString album_id = 0;
QUrl url;
QString filename;
@@ -96,10 +96,10 @@ class SubsonicRequest : public SubsonicBaseRequest {
void AlbumsFinishCheck(const int offset = 0, const int albums_received = 0);
void SongsFinishCheck();
void AddAlbumSongsRequest(const qint64 artist_id, const QString &album_id, const QString &album_artist, const int offset = 0);
void AddAlbumSongsRequest(const QString &artist_id, const QString &album_id, const QString &album_artist, const int offset = 0);
void FlushAlbumSongsRequests();
int ParseSong(Song &song, const QJsonObject &json_obj, const qint64 artist_id_requested = 0, const qint64 album_id_requested = 0, const QString &album_artist = QString());
QString ParseSong(Song &song, const QJsonObject &json_obj, const QString &artist_id_requested = QString(), const QString &album_id_requested = QString(), const QString &album_artist = QString());
void GetAlbumCovers();
void AddAlbumCoverRequest(Song &song);