diff --git a/data/data.qrc b/data/data.qrc
index a6e491775..218c43072 100644
--- a/data/data.qrc
+++ b/data/data.qrc
@@ -12,6 +12,7 @@
schema/schema-18.sql
schema/schema-19.sql
schema/schema-20.sql
+ schema/schema-21.sql
schema/device-schema.sql
style/strawberry.css
style/smartplaylistsearchterm.css
diff --git a/data/schema/device-schema.sql b/data/schema/device-schema.sql
index dc5274afb..914c19e39 100644
--- a/data/schema/device-schema.sql
+++ b/data/schema/device-schema.sql
@@ -12,9 +12,13 @@ CREATE TABLE device_%deviceid_subdirectories (
CREATE TABLE device_%deviceid_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -22,7 +26,9 @@ CREATE TABLE device_%deviceid_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -86,7 +92,11 @@ CREATE TABLE device_%deviceid_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
@@ -94,4 +104,4 @@ CREATE INDEX idx_device_%deviceid_songs_album ON device_%deviceid_songs (album);
CREATE INDEX idx_device_%deviceid_songs_comp_artist ON device_%deviceid_songs (compilation_effective, artist);
-UPDATE devices SET schema_version=5 WHERE ROWID=%deviceid;
+UPDATE devices SET schema_version=6 WHERE ROWID=%deviceid;
diff --git a/data/schema/schema-21.sql b/data/schema/schema-21.sql
new file mode 100644
index 000000000..67c90013d
--- /dev/null
+++ b/data/schema/schema-21.sql
@@ -0,0 +1,43 @@
+DROP INDEX IF EXISTS idx_albumartistsort;
+
+DROP INDEX IF EXISTS idx_albumsort;
+
+DROP INDEX IF EXISTS idx_artistsort;
+
+DROP INDEX IF EXISTS idx_composersort;
+
+DROP INDEX IF EXISTS idx_performersort;
+
+DROP INDEX IF EXISTS idx_titlesort;
+
+ALTER TABLE %allsongstables ADD COLUMN albumartistsort TEXT;
+
+ALTER TABLE %allsongstables ADD COLUMN albumsort TEXT;
+
+ALTER TABLE %allsongstables ADD COLUMN artistsort TEXT;
+
+ALTER TABLE %allsongstables ADD COLUMN composersort TEXT;
+
+ALTER TABLE %allsongstables ADD COLUMN performersort TEXT;
+
+ALTER TABLE %allsongstables ADD COLUMN titlesort TEXT;
+
+ALTER TABLE %allsongstables ADD COLUMN bpm REAL;
+
+ALTER TABLE %allsongstables ADD COLUMN mood TEXT;
+
+ALTER TABLE %allsongstables ADD COLUMN initial_key TEXT;
+
+CREATE INDEX IF NOT EXISTS idx_albumartistsort ON songs (albumartistsort);
+
+CREATE INDEX IF NOT EXISTS idx_albumsort ON songs (album);
+
+CREATE INDEX IF NOT EXISTS idx_artistsort ON songs (artistsort);
+
+CREATE INDEX IF NOT EXISTS idx_composersort ON songs (title);
+
+CREATE INDEX IF NOT EXISTS idx_performersort ON songs (title);
+
+CREATE INDEX IF NOT EXISTS idx_titlesort ON songs (title);
+
+UPDATE schema_version SET version=21;
diff --git a/data/schema/schema.sql b/data/schema/schema.sql
index cdbb49dfb..919fe7974 100644
--- a/data/schema/schema.sql
+++ b/data/schema/schema.sql
@@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS schema_version (
DELETE FROM schema_version;
-INSERT INTO schema_version (version) VALUES (20);
+INSERT INTO schema_version (version) VALUES (21);
CREATE TABLE IF NOT EXISTS directories (
path TEXT NOT NULL,
@@ -20,9 +20,13 @@ CREATE TABLE IF NOT EXISTS subdirectories (
CREATE TABLE IF NOT EXISTS songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -30,7 +34,9 @@ CREATE TABLE IF NOT EXISTS songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -94,16 +100,24 @@ CREATE TABLE IF NOT EXISTS songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS subsonic_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -111,7 +125,9 @@ CREATE TABLE IF NOT EXISTS subsonic_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -175,16 +191,24 @@ CREATE TABLE IF NOT EXISTS subsonic_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS tidal_artists_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -192,7 +216,9 @@ CREATE TABLE IF NOT EXISTS tidal_artists_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -256,16 +282,24 @@ CREATE TABLE IF NOT EXISTS tidal_artists_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS tidal_albums_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -273,7 +307,9 @@ CREATE TABLE IF NOT EXISTS tidal_albums_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -337,16 +373,24 @@ CREATE TABLE IF NOT EXISTS tidal_albums_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS tidal_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -354,7 +398,9 @@ CREATE TABLE IF NOT EXISTS tidal_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -418,16 +464,24 @@ CREATE TABLE IF NOT EXISTS tidal_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS spotify_artists_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -435,7 +489,9 @@ CREATE TABLE IF NOT EXISTS spotify_artists_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -499,16 +555,24 @@ CREATE TABLE IF NOT EXISTS spotify_artists_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS spotify_albums_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -516,7 +580,9 @@ CREATE TABLE IF NOT EXISTS spotify_albums_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -580,16 +646,24 @@ CREATE TABLE IF NOT EXISTS spotify_albums_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS spotify_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -597,7 +671,9 @@ CREATE TABLE IF NOT EXISTS spotify_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -661,16 +737,24 @@ CREATE TABLE IF NOT EXISTS spotify_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS qobuz_artists_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -678,7 +762,9 @@ CREATE TABLE IF NOT EXISTS qobuz_artists_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -742,16 +828,24 @@ CREATE TABLE IF NOT EXISTS qobuz_artists_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS qobuz_albums_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -759,7 +853,9 @@ CREATE TABLE IF NOT EXISTS qobuz_albums_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -823,16 +919,24 @@ CREATE TABLE IF NOT EXISTS qobuz_albums_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
CREATE TABLE IF NOT EXISTS qobuz_songs (
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER NOT NULL DEFAULT -1,
disc INTEGER NOT NULL DEFAULT -1,
year INTEGER NOT NULL DEFAULT -1,
@@ -840,7 +944,9 @@ CREATE TABLE IF NOT EXISTS qobuz_songs (
genre TEXT,
compilation INTEGER NOT NULL DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -904,7 +1010,11 @@ CREATE TABLE IF NOT EXISTS qobuz_songs (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
@@ -931,9 +1041,13 @@ CREATE TABLE IF NOT EXISTS playlist_items (
playlist_url TEXT,
title TEXT,
+ titlesort TEXT,
album TEXT,
+ albumsort TEXT,
artist TEXT,
+ artistsort TEXT,
albumartist TEXT,
+ albumartistsort TEXT,
track INTEGER,
disc INTEGER,
year INTEGER,
@@ -941,7 +1055,9 @@ CREATE TABLE IF NOT EXISTS playlist_items (
genre TEXT,
compilation INTEGER DEFAULT 0,
composer TEXT,
+ composersort TEXT,
performer TEXT,
+ performersort TEXT,
grouping TEXT,
comment TEXT,
lyrics TEXT,
@@ -1005,7 +1121,11 @@ CREATE TABLE IF NOT EXISTS playlist_items (
musicbrainz_work_id TEXT,
ebur128_integrated_loudness_lufs REAL,
- ebur128_loudness_range_lu REAL
+ ebur128_loudness_range_lu REAL,
+
+ bpm REAL,
+ mood TEXT,
+ initial_key TEXT
);
@@ -1032,10 +1152,22 @@ CREATE INDEX IF NOT EXISTS idx_comp_artist ON songs (compilation_effective, arti
CREATE INDEX IF NOT EXISTS idx_albumartist ON songs (albumartist);
+CREATE INDEX IF NOT EXISTS idx_albumartistsort ON songs (albumartistsort);
+
CREATE INDEX IF NOT EXISTS idx_artist ON songs (artist);
+CREATE INDEX IF NOT EXISTS idx_artistsort ON songs (artistsort);
+
CREATE INDEX IF NOT EXISTS idx_album ON songs (album);
+CREATE INDEX IF NOT EXISTS idx_albumsort ON songs (album);
+
CREATE INDEX IF NOT EXISTS idx_title ON songs (title);
+CREATE INDEX IF NOT EXISTS idx_titlesort ON songs (title);
+
+CREATE INDEX IF NOT EXISTS idx_composersort ON songs (title);
+
+CREATE INDEX IF NOT EXISTS idx_performersort ON songs (title);
+
CREATE VIEW IF NOT EXISTS duplicated_songs as select artist dup_artist, album dup_album, title dup_title from songs as inner_songs where artist != '' and album != '' and title != '' and unavailable = 0 group by artist, album , title having count(*) > 1;
diff --git a/src/core/database.cpp b/src/core/database.cpp
index 379249ff7..09ae9c3fb 100644
--- a/src/core/database.cpp
+++ b/src/core/database.cpp
@@ -50,7 +50,7 @@
using namespace Qt::Literals::StringLiterals;
-const int Database::kSchemaVersion = 20;
+const int Database::kSchemaVersion = 21;
namespace {
constexpr char kDatabaseFilename[] = "strawberry.db";
diff --git a/src/device/devicedatabasebackend.cpp b/src/device/devicedatabasebackend.cpp
index b29951be0..7dae15b24 100644
--- a/src/device/devicedatabasebackend.cpp
+++ b/src/device/devicedatabasebackend.cpp
@@ -41,7 +41,7 @@
using namespace Qt::Literals::StringLiterals;
namespace {
-constexpr int kDeviceSchemaVersion = 5;
+constexpr int kDeviceSchemaVersion = 6;
}
DeviceDatabaseBackend::DeviceDatabaseBackend(QObject *parent)