From 2ddacf2f9886c67944834a360819e990e7d49255 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 10 Jul 2025 15:27:11 +0200 Subject: [PATCH] Database: Add *sort fields, bpm, mood, initial_key Upgrade from schema version 20 to 21. This includes: - six fields for sort tags - new fields bpm, mood, initial_key See https://github.com/strawberrymusicplayer/strawberry/pull/1779#pullrequestreview-3003042802 --- data/data.qrc | 1 + data/schema/device-schema.sql | 14 ++- data/schema/schema-21.sql | 43 ++++++++ data/schema/schema.sql | 158 ++++++++++++++++++++++++--- src/core/database.cpp | 2 +- src/device/devicedatabasebackend.cpp | 2 +- 6 files changed, 203 insertions(+), 17 deletions(-) create mode 100644 data/schema/schema-21.sql 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)