Change artist and song ID to strings
This commit is contained in:
parent
30e6ced4e9
commit
5591472dbd
@ -11,6 +11,7 @@
|
|||||||
<file>schema/schema-8.sql</file>
|
<file>schema/schema-8.sql</file>
|
||||||
<file>schema/schema-9.sql</file>
|
<file>schema/schema-9.sql</file>
|
||||||
<file>schema/schema-10.sql</file>
|
<file>schema/schema-10.sql</file>
|
||||||
|
<file>schema/schema-11.sql</file>
|
||||||
<file>schema/device-schema.sql</file>
|
<file>schema/device-schema.sql</file>
|
||||||
<file>style/strawberry.css</file>
|
<file>style/strawberry.css</file>
|
||||||
<file>html/playing-tooltip-plain.html</file>
|
<file>html/playing-tooltip-plain.html</file>
|
||||||
|
219
data/schema/schema-11.sql
Normal file
219
data/schema/schema-11.sql
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
ALTER TABLE songs RENAME TO songs_old;
|
||||||
|
|
||||||
|
ALTER TABLE subsonic_songs RENAME TO subsonic_songs_old;
|
||||||
|
|
||||||
|
ALTER TABLE playlist_items RENAME TO playlist_items_old;
|
||||||
|
|
||||||
|
CREATE TABLE songs (
|
||||||
|
|
||||||
|
title TEXT,
|
||||||
|
album TEXT,
|
||||||
|
artist TEXT,
|
||||||
|
albumartist TEXT,
|
||||||
|
track INTEGER NOT NULL DEFAULT -1,
|
||||||
|
disc INTEGER NOT NULL DEFAULT -1,
|
||||||
|
year INTEGER NOT NULL DEFAULT -1,
|
||||||
|
originalyear INTEGER NOT NULL DEFAULT 0,
|
||||||
|
genre TEXT,
|
||||||
|
compilation INTEGER NOT NULL DEFAULT 0,
|
||||||
|
composer TEXT,
|
||||||
|
performer TEXT,
|
||||||
|
grouping TEXT,
|
||||||
|
comment TEXT,
|
||||||
|
lyrics TEXT,
|
||||||
|
|
||||||
|
artist_id TEXT,
|
||||||
|
album_id TEXT,
|
||||||
|
song_id TEXT,
|
||||||
|
|
||||||
|
beginning INTEGER NOT NULL DEFAULT 0,
|
||||||
|
length INTEGER NOT NULL DEFAULT 0,
|
||||||
|
|
||||||
|
bitrate INTEGER NOT NULL DEFAULT -1,
|
||||||
|
samplerate INTEGER NOT NULL DEFAULT -1,
|
||||||
|
bitdepth INTEGER NOT NULL DEFAULT -1,
|
||||||
|
|
||||||
|
source INTEGER NOT NULL DEFAULT 0,
|
||||||
|
directory_id INTEGER NOT NULL DEFAULT -1,
|
||||||
|
url TEXT NOT NULL,
|
||||||
|
filetype INTEGER NOT NULL DEFAULT 0,
|
||||||
|
filesize INTEGER NOT NULL DEFAULT -1,
|
||||||
|
mtime INTEGER NOT NULL DEFAULT -1,
|
||||||
|
ctime INTEGER NOT NULL DEFAULT -1,
|
||||||
|
unavailable INTEGER DEFAULT 0,
|
||||||
|
|
||||||
|
playcount INTEGER NOT NULL DEFAULT 0,
|
||||||
|
skipcount INTEGER NOT NULL DEFAULT 0,
|
||||||
|
lastplayed INTEGER NOT NULL DEFAULT -1,
|
||||||
|
|
||||||
|
compilation_detected INTEGER DEFAULT 0,
|
||||||
|
compilation_on INTEGER NOT NULL DEFAULT 0,
|
||||||
|
compilation_off INTEGER NOT NULL DEFAULT 0,
|
||||||
|
compilation_effective INTEGER NOT NULL DEFAULT 0,
|
||||||
|
|
||||||
|
art_automatic TEXT,
|
||||||
|
art_manual TEXT,
|
||||||
|
|
||||||
|
effective_albumartist TEXT,
|
||||||
|
effective_originalyear INTEGER NOT NULL DEFAULT 0,
|
||||||
|
|
||||||
|
cue_path TEXT
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE subsonic_songs (
|
||||||
|
|
||||||
|
title TEXT,
|
||||||
|
album TEXT,
|
||||||
|
artist TEXT,
|
||||||
|
albumartist TEXT,
|
||||||
|
track INTEGER NOT NULL DEFAULT -1,
|
||||||
|
disc INTEGER NOT NULL DEFAULT -1,
|
||||||
|
year INTEGER NOT NULL DEFAULT -1,
|
||||||
|
originalyear INTEGER NOT NULL DEFAULT 0,
|
||||||
|
genre TEXT,
|
||||||
|
compilation INTEGER NOT NULL DEFAULT 0,
|
||||||
|
composer TEXT,
|
||||||
|
performer TEXT,
|
||||||
|
grouping TEXT,
|
||||||
|
comment TEXT,
|
||||||
|
lyrics TEXT,
|
||||||
|
|
||||||
|
artist_id TEXT,
|
||||||
|
album_id TEXT,
|
||||||
|
song_id TEXT,
|
||||||
|
|
||||||
|
beginning INTEGER NOT NULL DEFAULT 0,
|
||||||
|
length INTEGER NOT NULL DEFAULT 0,
|
||||||
|
|
||||||
|
bitrate INTEGER NOT NULL DEFAULT -1,
|
||||||
|
samplerate INTEGER NOT NULL DEFAULT -1,
|
||||||
|
bitdepth INTEGER NOT NULL DEFAULT -1,
|
||||||
|
|
||||||
|
source INTEGER NOT NULL DEFAULT 0,
|
||||||
|
directory_id INTEGER NOT NULL DEFAULT -1,
|
||||||
|
url TEXT NOT NULL,
|
||||||
|
filetype INTEGER NOT NULL DEFAULT 0,
|
||||||
|
filesize INTEGER NOT NULL DEFAULT -1,
|
||||||
|
mtime INTEGER NOT NULL DEFAULT -1,
|
||||||
|
ctime INTEGER NOT NULL DEFAULT -1,
|
||||||
|
unavailable INTEGER DEFAULT 0,
|
||||||
|
|
||||||
|
playcount INTEGER NOT NULL DEFAULT 0,
|
||||||
|
skipcount INTEGER NOT NULL DEFAULT 0,
|
||||||
|
lastplayed INTEGER NOT NULL DEFAULT -1,
|
||||||
|
|
||||||
|
compilation_detected INTEGER DEFAULT 0,
|
||||||
|
compilation_on INTEGER NOT NULL DEFAULT 0,
|
||||||
|
compilation_off INTEGER NOT NULL DEFAULT 0,
|
||||||
|
compilation_effective INTEGER NOT NULL DEFAULT 0,
|
||||||
|
|
||||||
|
art_automatic TEXT,
|
||||||
|
art_manual TEXT,
|
||||||
|
|
||||||
|
effective_albumartist TEXT,
|
||||||
|
effective_originalyear INTEGER NOT NULL DEFAULT 0,
|
||||||
|
|
||||||
|
cue_path TEXT
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO songs (ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, artist_id, album_id, song_id, beginning, length, bitrate, samplerate, bitdepth, source, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path)
|
||||||
|
SELECT ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, artist_id, album_id, song_id, beginning, length, bitrate, samplerate, bitdepth, source, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path
|
||||||
|
FROM songs_old;
|
||||||
|
|
||||||
|
DROP TABLE songs_old;
|
||||||
|
|
||||||
|
DELETE FROM songs_fts;
|
||||||
|
|
||||||
|
INSERT INTO songs_fts (ROWID, ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment)
|
||||||
|
SELECT ROWID, title, album, artist, albumartist, composer, performer, grouping, genre, comment
|
||||||
|
FROM songs;
|
||||||
|
|
||||||
|
INSERT INTO subsonic_songs (ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, artist_id, album_id, song_id, beginning, length, bitrate, samplerate, bitdepth, source, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path)
|
||||||
|
SELECT ROWID, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, artist_id, album_id, song_id, beginning, length, bitrate, samplerate, bitdepth, source, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path
|
||||||
|
FROM subsonic_songs_old;
|
||||||
|
|
||||||
|
DROP TABLE subsonic_songs_old;
|
||||||
|
|
||||||
|
DELETE FROM subsonic_songs_fts;
|
||||||
|
|
||||||
|
INSERT INTO subsonic_songs_fts (ROWID, ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment)
|
||||||
|
SELECT ROWID, title, album, artist, albumartist, composer, performer, grouping, genre, comment
|
||||||
|
FROM subsonic_songs;
|
||||||
|
|
||||||
|
CREATE TABLE playlist_items (
|
||||||
|
|
||||||
|
playlist INTEGER NOT NULL,
|
||||||
|
type INTEGER NOT NULL DEFAULT 0,
|
||||||
|
collection_id INTEGER,
|
||||||
|
playlist_url TEXT,
|
||||||
|
|
||||||
|
title TEXT,
|
||||||
|
album TEXT,
|
||||||
|
artist TEXT,
|
||||||
|
albumartist TEXT,
|
||||||
|
track INTEGER,
|
||||||
|
disc INTEGER,
|
||||||
|
year INTEGER,
|
||||||
|
originalyear INTEGER,
|
||||||
|
genre TEXT,
|
||||||
|
compilation INTEGER DEFAULT 0,
|
||||||
|
composer TEXT,
|
||||||
|
performer TEXT,
|
||||||
|
grouping TEXT,
|
||||||
|
comment TEXT,
|
||||||
|
lyrics TEXT,
|
||||||
|
|
||||||
|
artist_id TEXT,
|
||||||
|
album_id TEXT,
|
||||||
|
song_id TEXT,
|
||||||
|
|
||||||
|
beginning INTEGER,
|
||||||
|
length INTEGER,
|
||||||
|
|
||||||
|
bitrate INTEGER,
|
||||||
|
samplerate INTEGER,
|
||||||
|
bitdepth INTEGER,
|
||||||
|
|
||||||
|
source INTEGER,
|
||||||
|
directory_id INTEGER,
|
||||||
|
url TEXT,
|
||||||
|
filetype INTEGER,
|
||||||
|
filesize INTEGER,
|
||||||
|
mtime INTEGER,
|
||||||
|
ctime INTEGER,
|
||||||
|
unavailable INTEGER DEFAULT 0,
|
||||||
|
|
||||||
|
playcount INTEGER DEFAULT 0,
|
||||||
|
skipcount INTEGER DEFAULT 0,
|
||||||
|
lastplayed INTEGER DEFAULT 0,
|
||||||
|
|
||||||
|
compilation_detected INTEGER DEFAULT 0,
|
||||||
|
compilation_on INTEGER DEFAULT 0,
|
||||||
|
compilation_off INTEGER DEFAULT 0,
|
||||||
|
compilation_effective INTEGER DEFAULT 0,
|
||||||
|
|
||||||
|
art_automatic TEXT,
|
||||||
|
art_manual TEXT,
|
||||||
|
|
||||||
|
effective_albumartist TEXT,
|
||||||
|
effective_originalyear INTEGER,
|
||||||
|
|
||||||
|
cue_path TEXT
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO playlist_items (ROWID, playlist, type, collection_id, playlist_url, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, artist_id, album_id, song_id, beginning, length, bitrate, samplerate, bitdepth, source, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path)
|
||||||
|
SELECT ROWID, playlist, type, collection_id, playlist_url, title, album, artist, albumartist, track, disc, year, originalyear, genre, compilation, composer, performer, grouping, comment, lyrics, artist_id, album_id, song_id, beginning, length, bitrate, samplerate, bitdepth, source, directory_id, url, filetype, filesize, mtime, ctime, unavailable, playcount, skipcount, lastplayed, compilation_detected, compilation_on, compilation_off, compilation_effective, art_automatic, art_manual, effective_albumartist, effective_originalyear, cue_path
|
||||||
|
FROM playlist_items_old;
|
||||||
|
|
||||||
|
DROP TABLE playlist_items_old;
|
||||||
|
|
||||||
|
DELETE FROM playlist_items_fts_;
|
||||||
|
|
||||||
|
INSERT INTO playlist_items_fts_ (ROWID, ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsperformer, ftsgrouping, ftsgenre, ftscomment)
|
||||||
|
SELECT ROWID, title, album, artist, albumartist, composer, performer, grouping, genre, comment
|
||||||
|
FROM playlist_items;
|
||||||
|
|
||||||
|
UPDATE schema_version SET version=11;
|
@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS schema_version (
|
|||||||
|
|
||||||
DELETE FROM schema_version;
|
DELETE FROM schema_version;
|
||||||
|
|
||||||
INSERT INTO schema_version (version) VALUES (10);
|
INSERT INTO schema_version (version) VALUES (11);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS directories (
|
CREATE TABLE IF NOT EXISTS directories (
|
||||||
path TEXT NOT NULL,
|
path TEXT NOT NULL,
|
||||||
@ -19,25 +19,25 @@ CREATE TABLE IF NOT EXISTS subdirectories (
|
|||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS songs (
|
CREATE TABLE IF NOT EXISTS songs (
|
||||||
|
|
||||||
title TEXT NOT NULL,
|
title TEXT,
|
||||||
album TEXT NOT NULL,
|
album TEXT,
|
||||||
artist TEXT NOT NULL,
|
artist TEXT,
|
||||||
albumartist TEXT NOT NULL,
|
albumartist TEXT,
|
||||||
track INTEGER NOT NULL DEFAULT -1,
|
track INTEGER NOT NULL DEFAULT -1,
|
||||||
disc INTEGER NOT NULL DEFAULT -1,
|
disc INTEGER NOT NULL DEFAULT -1,
|
||||||
year INTEGER NOT NULL DEFAULT -1,
|
year INTEGER NOT NULL DEFAULT -1,
|
||||||
originalyear INTEGER NOT NULL DEFAULT 0,
|
originalyear INTEGER NOT NULL DEFAULT 0,
|
||||||
genre TEXT NOT NULL,
|
genre TEXT,
|
||||||
compilation INTEGER NOT NULL DEFAULT -1,
|
compilation INTEGER NOT NULL DEFAULT 0,
|
||||||
composer TEXT NOT NULL,
|
composer TEXT,
|
||||||
performer TEXT NOT NULL,
|
performer TEXT,
|
||||||
grouping TEXT NOT NULL,
|
grouping TEXT,
|
||||||
comment TEXT NOT NULL,
|
comment TEXT,
|
||||||
lyrics TEXT NOT NULL,
|
lyrics TEXT,
|
||||||
|
|
||||||
artist_id INTEGER NOT NULL DEFAULT -1,
|
artist_id TEXT,
|
||||||
album_id TEXT NOT NULL,
|
album_id TEXT,
|
||||||
song_id INTEGER NOT NULL DEFAULT -1,
|
song_id TEXT,
|
||||||
|
|
||||||
beginning INTEGER NOT NULL DEFAULT 0,
|
beginning INTEGER NOT NULL DEFAULT 0,
|
||||||
length INTEGER NOT NULL DEFAULT 0,
|
length INTEGER NOT NULL DEFAULT 0,
|
||||||
@ -76,25 +76,25 @@ CREATE TABLE IF NOT EXISTS songs (
|
|||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS subsonic_songs (
|
CREATE TABLE IF NOT EXISTS subsonic_songs (
|
||||||
|
|
||||||
title TEXT NOT NULL,
|
title TEXT,
|
||||||
album TEXT NOT NULL,
|
album TEXT,
|
||||||
artist TEXT NOT NULL,
|
artist TEXT,
|
||||||
albumartist TEXT NOT NULL,
|
albumartist TEXT,
|
||||||
track INTEGER NOT NULL DEFAULT -1,
|
track INTEGER NOT NULL DEFAULT -1,
|
||||||
disc INTEGER NOT NULL DEFAULT -1,
|
disc INTEGER NOT NULL DEFAULT -1,
|
||||||
year INTEGER NOT NULL DEFAULT -1,
|
year INTEGER NOT NULL DEFAULT -1,
|
||||||
originalyear INTEGER NOT NULL DEFAULT 0,
|
originalyear INTEGER NOT NULL DEFAULT 0,
|
||||||
genre TEXT NOT NULL,
|
genre TEXT,
|
||||||
compilation INTEGER NOT NULL DEFAULT -1,
|
compilation INTEGER NOT NULL DEFAULT 0,
|
||||||
composer TEXT NOT NULL,
|
composer TEXT,
|
||||||
performer TEXT NOT NULL,
|
performer TEXT,
|
||||||
grouping TEXT NOT NULL,
|
grouping TEXT,
|
||||||
comment TEXT NOT NULL,
|
comment TEXT,
|
||||||
lyrics TEXT NOT NULL,
|
lyrics TEXT,
|
||||||
|
|
||||||
artist_id INTEGER NOT NULL DEFAULT -1,
|
artist_id TEXT,
|
||||||
album_id TEXT NOT NULL,
|
album_id TEXT,
|
||||||
song_id INTEGER NOT NULL DEFAULT -1,
|
song_id TEXT,
|
||||||
|
|
||||||
beginning INTEGER NOT NULL DEFAULT 0,
|
beginning INTEGER NOT NULL DEFAULT 0,
|
||||||
length INTEGER NOT NULL DEFAULT 0,
|
length INTEGER NOT NULL DEFAULT 0,
|
||||||
@ -149,56 +149,56 @@ CREATE TABLE IF NOT EXISTS playlist_items (
|
|||||||
collection_id INTEGER,
|
collection_id INTEGER,
|
||||||
playlist_url TEXT,
|
playlist_url TEXT,
|
||||||
|
|
||||||
title TEXT NOT NULL,
|
title TEXT,
|
||||||
album TEXT NOT NULL,
|
album TEXT,
|
||||||
artist TEXT NOT NULL,
|
artist TEXT,
|
||||||
albumartist TEXT NOT NULL,
|
albumartist TEXT,
|
||||||
track INTEGER NOT NULL DEFAULT -1,
|
track INTEGER,
|
||||||
disc INTEGER NOT NULL DEFAULT -1,
|
disc INTEGER,
|
||||||
year INTEGER NOT NULL DEFAULT -1,
|
year INTEGER,
|
||||||
originalyear INTEGER NOT NULL DEFAULT 0,
|
originalyear INTEGER,
|
||||||
genre TEXT NOT NULL,
|
genre TEXT,
|
||||||
compilation INTEGER NOT NULL DEFAULT -1,
|
compilation INTEGER DEFAULT 0,
|
||||||
composer TEXT NOT NULL,
|
composer TEXT,
|
||||||
performer TEXT NOT NULL,
|
performer TEXT,
|
||||||
grouping TEXT NOT NULL,
|
grouping TEXT,
|
||||||
comment TEXT NOT NULL,
|
comment TEXT,
|
||||||
lyrics TEXT NOT NULL,
|
lyrics TEXT,
|
||||||
|
|
||||||
artist_id INTEGER NOT NULL DEFAULT -1,
|
artist_id TEXT,
|
||||||
album_id TEXT NOT NULL,
|
album_id TEXT,
|
||||||
song_id INTEGER NOT NULL DEFAULT -1,
|
song_id TEXT,
|
||||||
|
|
||||||
beginning INTEGER NOT NULL DEFAULT 0,
|
beginning INTEGER,
|
||||||
length INTEGER NOT NULL DEFAULT 0,
|
length INTEGER,
|
||||||
|
|
||||||
bitrate INTEGER NOT NULL DEFAULT -1,
|
bitrate INTEGER,
|
||||||
samplerate INTEGER NOT NULL DEFAULT -1,
|
samplerate INTEGER,
|
||||||
bitdepth INTEGER NOT NULL DEFAULT -1,
|
bitdepth INTEGER,
|
||||||
|
|
||||||
source INTEGER NOT NULL DEFAULT 0,
|
source INTEGER,
|
||||||
directory_id INTEGER,
|
directory_id INTEGER,
|
||||||
url TEXT,
|
url TEXT,
|
||||||
filetype INTEGER NOT NULL DEFAULT 0,
|
filetype INTEGER,
|
||||||
filesize INTEGER,
|
filesize INTEGER,
|
||||||
mtime INTEGER,
|
mtime INTEGER,
|
||||||
ctime INTEGER,
|
ctime INTEGER,
|
||||||
unavailable INTEGER DEFAULT 0,
|
unavailable INTEGER DEFAULT 0,
|
||||||
|
|
||||||
playcount INTEGER NOT NULL DEFAULT 0,
|
playcount INTEGER DEFAULT 0,
|
||||||
skipcount INTEGER NOT NULL DEFAULT 0,
|
skipcount INTEGER DEFAULT 0,
|
||||||
lastplayed INTEGER NOT NULL DEFAULT -1,
|
lastplayed INTEGER DEFAULT 0,
|
||||||
|
|
||||||
compilation_detected INTEGER DEFAULT 0,
|
compilation_detected INTEGER DEFAULT 0,
|
||||||
compilation_on INTEGER NOT NULL DEFAULT 0,
|
compilation_on INTEGER DEFAULT 0,
|
||||||
compilation_off INTEGER NOT NULL DEFAULT 0,
|
compilation_off INTEGER DEFAULT 0,
|
||||||
compilation_effective INTEGER NOT NULL DEFAULT 0,
|
compilation_effective INTEGER DEFAULT 0,
|
||||||
|
|
||||||
art_automatic TEXT,
|
art_automatic TEXT,
|
||||||
art_manual TEXT,
|
art_manual TEXT,
|
||||||
|
|
||||||
effective_albumartist TEXT,
|
effective_albumartist TEXT,
|
||||||
effective_originalyear INTEGER NOT NULL DEFAULT 0,
|
effective_originalyear INTEGER,
|
||||||
|
|
||||||
cue_path TEXT
|
cue_path TEXT
|
||||||
|
|
||||||
|
@ -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());
|
QMutexLocker l(db_->Mutex());
|
||||||
QSqlDatabase db(db_->Connect());
|
QSqlDatabase db(db_->Connect());
|
||||||
return GetSongBySongId(song_id, db);
|
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) {
|
SongList CollectionBackend::GetSongsBySongId(const QStringList &song_ids) {
|
||||||
|
|
||||||
QMutexLocker l(db_->Mutex());
|
QMutexLocker l(db_->Mutex());
|
||||||
QSqlDatabase db(db_->Connect());
|
QSqlDatabase db(db_->Connect());
|
||||||
|
|
||||||
return GetSongsBySongId(song_ids, db);
|
return GetSongsBySongId(song_ids, db);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Song CollectionBackend::GetSongBySongId(int song_id, QSqlDatabase &db) {
|
Song CollectionBackend::GetSongBySongId(const QString &song_id, QSqlDatabase &db) {
|
||||||
SongList list = GetSongsBySongId(QStringList() << QString::number(song_id), db);
|
|
||||||
|
SongList list = GetSongsBySongId(QStringList() << song_id, db);
|
||||||
if (list.isEmpty()) return Song();
|
if (list.isEmpty()) return Song();
|
||||||
return list.first();
|
return list.first();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SongList CollectionBackend::GetSongsBySongId(const QStringList &song_ids, QSqlDatabase &db) {
|
SongList CollectionBackend::GetSongsBySongId(const QStringList &song_ids, QSqlDatabase &db) {
|
||||||
|
@ -181,8 +181,7 @@ class CollectionBackend : public CollectionBackendInterface {
|
|||||||
|
|
||||||
void DeleteAll();
|
void DeleteAll();
|
||||||
|
|
||||||
Song GetSongBySongId(int song_id);
|
Song GetSongBySongId(const QString &song_id);
|
||||||
SongList GetSongsBySongId(const QList<int> &song_ids);
|
|
||||||
SongList GetSongsBySongId(const QStringList &song_ids);
|
SongList GetSongsBySongId(const QStringList &song_ids);
|
||||||
|
|
||||||
Song::Source Source() const;
|
Song::Source Source() const;
|
||||||
@ -241,7 +240,7 @@ class CollectionBackend : public CollectionBackendInterface {
|
|||||||
Song GetSongById(int id, QSqlDatabase &db);
|
Song GetSongById(int id, QSqlDatabase &db);
|
||||||
SongList GetSongsById(const QStringList &ids, 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);
|
SongList GetSongsBySongId(const QStringList &song_ids, QSqlDatabase &db);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
#include "scopedtransaction.h"
|
#include "scopedtransaction.h"
|
||||||
|
|
||||||
const char *Database::kDatabaseFilename = "strawberry.db";
|
const char *Database::kDatabaseFilename = "strawberry.db";
|
||||||
const int Database::kSchemaVersion = 10;
|
const int Database::kSchemaVersion = 11;
|
||||||
const char *Database::kMagicAllSongsTables = "%allsongstables";
|
const char *Database::kMagicAllSongsTables = "%allsongstables";
|
||||||
|
|
||||||
int Database::sNextConnectionId = 1;
|
int Database::sNextConnectionId = 1;
|
||||||
|
@ -181,9 +181,9 @@ struct Song::Private : public QSharedData {
|
|||||||
QString comment_;
|
QString comment_;
|
||||||
QString lyrics_;
|
QString lyrics_;
|
||||||
|
|
||||||
qint64 artist_id_;
|
QString artist_id_;
|
||||||
QString album_id_;
|
QString album_id_;
|
||||||
qint64 song_id_;
|
QString song_id_;
|
||||||
|
|
||||||
qint64 beginning_;
|
qint64 beginning_;
|
||||||
qint64 end_;
|
qint64 end_;
|
||||||
@ -279,9 +279,9 @@ bool Song::is_valid() const { return d->valid_; }
|
|||||||
bool Song::is_unavailable() const { return d->unavailable_; }
|
bool Song::is_unavailable() const { return d->unavailable_; }
|
||||||
int Song::id() const { return d->id_; }
|
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_; }
|
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() const { return d->title_; }
|
||||||
const QString &Song::title_sortable() const { return d->title_sortable_; }
|
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_id(int id) { d->id_ = id; }
|
||||||
void Song::set_valid(bool v) { d->valid_ = v; }
|
void Song::set_valid(bool v) { d->valid_ = v; }
|
||||||
|
|
||||||
void Song::set_artist_id(qint64 v) { d->artist_id_ = v; }
|
void Song::set_artist_id(const QString &v) { d->artist_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_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 {
|
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") {
|
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") {
|
else if (Song::kColumns.value(i) == "album_id") {
|
||||||
d->album_id_ = tostr(x);
|
d->album_id_ = tostr(x);
|
||||||
}
|
}
|
||||||
else if (Song::kColumns.value(i) == "song_id") {
|
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") {
|
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(":comment", strval(d->comment_));
|
||||||
query->bindValue(":lyrics", strval(d->lyrics_));
|
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(":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(":beginning", d->beginning_);
|
||||||
query->bindValue(":length", intval(length_nanosec()));
|
query->bindValue(":length", intval(length_nanosec()));
|
||||||
|
@ -208,9 +208,9 @@ class Song {
|
|||||||
const QString &comment() const;
|
const QString &comment() const;
|
||||||
const QString &lyrics() const;
|
const QString &lyrics() const;
|
||||||
|
|
||||||
qint64 artist_id() const;
|
QString artist_id() const;
|
||||||
QString album_id() const;
|
QString album_id() const;
|
||||||
qint64 song_id() const;
|
QString song_id() const;
|
||||||
|
|
||||||
qint64 beginning_nanosec() const;
|
qint64 beginning_nanosec() const;
|
||||||
qint64 end_nanosec() const;
|
qint64 end_nanosec() const;
|
||||||
@ -309,10 +309,9 @@ class Song {
|
|||||||
void set_comment(const QString &v);
|
void set_comment(const QString &v);
|
||||||
void set_lyrics(const QString &v);
|
void set_lyrics(const QString &v);
|
||||||
|
|
||||||
void set_artist_id(qint64 v);
|
void set_artist_id(const QString &v);
|
||||||
void set_album_id(qint64 v);
|
|
||||||
void set_album_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_beginning_nanosec(qint64 v);
|
||||||
void set_end_nanosec(qint64 v);
|
void set_end_nanosec(qint64 v);
|
||||||
|
@ -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 request;
|
||||||
request.artist_id = artist_id;
|
request.artist_id = artist_id;
|
||||||
@ -346,13 +346,13 @@ void SubsonicRequest::FlushAlbumSongsRequests() {
|
|||||||
ParamList params = ParamList() << Param("id", request.album_id);
|
ParamList params = ParamList() << Param("id", request.album_id);
|
||||||
QNetworkReply *reply = CreateGetRequest(QString("getAlbum"), params);
|
QNetworkReply *reply = CreateGetRequest(QString("getAlbum"), params);
|
||||||
replies_ << reply;
|
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;
|
if (!replies_.contains(reply)) return;
|
||||||
replies_.removeAll(reply);
|
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(artist_id_requested);
|
||||||
Q_UNUSED(album_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")
|
!json_obj.contains("type")
|
||||||
) {
|
) {
|
||||||
Error("Invalid Json reply, song is missing one or more values.", json_obj);
|
Error("Invalid Json reply, song is missing one or more values.", json_obj);
|
||||||
return -1;
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 song_id = 0;
|
QString song_id;
|
||||||
QString song_id_str;
|
|
||||||
if (json_obj["id"].type() == QJsonValue::String) {
|
if (json_obj["id"].type() == QJsonValue::String) {
|
||||||
song_id_str = json_obj["id"].toString();
|
song_id = json_obj["id"].toString();
|
||||||
song_id = QString(song_id_str).remove(QRegExp("[^0-9]+")).toLongLong();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
song_id = json_obj["id"].toInt();
|
song_id = QString::number(json_obj["id"].toInt());
|
||||||
song_id_str = QString::number(song_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString album_id;
|
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.contains("artistId")) {
|
||||||
if (json_obj["artistId"].type() == QJsonValue::String) {
|
if (json_obj["artistId"].type() == QJsonValue::String) {
|
||||||
QString artist_id_str = json_obj["artistId"].toString();
|
artist_id = json_obj["artistId"].toString();
|
||||||
artist_id = QString(artist_id_str).remove(QRegExp("[^0-9]+")).toLongLong();
|
|
||||||
}
|
}
|
||||||
else {
|
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;
|
QUrl url;
|
||||||
url.setScheme(url_handler_->scheme());
|
url.setScheme(url_handler_->scheme());
|
||||||
url.setPath(song_id_str);
|
url.setPath(song_id);
|
||||||
|
|
||||||
QUrl cover_url;
|
QUrl cover_url;
|
||||||
if (!cover_art_id.isEmpty()) {
|
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_source(Song::Source_Subsonic);
|
||||||
song.set_song_id(song_id);
|
song.set_song_id(song_id);
|
||||||
if (album_id > 0) song.set_album_id(album_id);
|
if (!album_id.isEmpty()) song.set_album_id(album_id);
|
||||||
if (artist_id > 0) song.set_artist_id(artist_id);
|
if (!artist_id.isEmpty()) song.set_artist_id(artist_id);
|
||||||
if (album_artist != artist) song.set_albumartist(album_artist);
|
if (!album_artist.isEmpty()) song.set_albumartist(album_artist);
|
||||||
song.set_album(album);
|
song.set_album(album);
|
||||||
song.set_artist(artist);
|
song.set_artist(artist);
|
||||||
song.set_title(title);
|
song.set_title(title);
|
||||||
@ -721,7 +717,7 @@ void SubsonicRequest::FlushAlbumCoverRequests() {
|
|||||||
|
|
||||||
QNetworkReply *reply = network_->get(req);
|
QNetworkReply *reply = network_->get(req);
|
||||||
album_cover_replies_ << reply;
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ class SubsonicRequest : public SubsonicBaseRequest {
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void AlbumsReplyReceived(QNetworkReply *reply, const int offset_requested);
|
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);
|
void AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url, const QString &filename);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -76,15 +76,15 @@ class SubsonicRequest : public SubsonicBaseRequest {
|
|||||||
typedef QList<Param> ParamList;
|
typedef QList<Param> ParamList;
|
||||||
|
|
||||||
struct Request {
|
struct Request {
|
||||||
qint64 artist_id = 0;
|
QString artist_id = 0;
|
||||||
QString album_id;
|
QString album_id;
|
||||||
qint64 song_id = 0;
|
QString song_id = 0;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
QString album_artist;
|
QString album_artist;
|
||||||
};
|
};
|
||||||
struct AlbumCoverRequest {
|
struct AlbumCoverRequest {
|
||||||
qint64 artist_id = 0;
|
QString artist_id = 0;
|
||||||
QString album_id = 0;
|
QString album_id = 0;
|
||||||
QUrl url;
|
QUrl url;
|
||||||
QString filename;
|
QString filename;
|
||||||
@ -96,10 +96,10 @@ class SubsonicRequest : public SubsonicBaseRequest {
|
|||||||
void AlbumsFinishCheck(const int offset = 0, const int albums_received = 0);
|
void AlbumsFinishCheck(const int offset = 0, const int albums_received = 0);
|
||||||
void SongsFinishCheck();
|
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();
|
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 GetAlbumCovers();
|
||||||
void AddAlbumCoverRequest(Song &song);
|
void AddAlbumCoverRequest(Song &song);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user