From 2238c1dd78530a0ccf217564de7b563bcb1c2162 Mon Sep 17 00:00:00 2001 From: Avi Alkalay Date: Sat, 25 Apr 2026 12:03:44 -0300 Subject: [PATCH 1/4] feat(playlist): add weight and add_time fileds to playlist_tracks table --- ...700_add_weight_addtime_playlist_tracks.sql | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql diff --git a/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql new file mode 100644 index 000000000..f3dd8a702 --- /dev/null +++ b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql @@ -0,0 +1,45 @@ +-- +goose Up + +-- Add useful information to playlist tracks. +-- +-- The fields: +-- add_time - The UTC time when the item was added to the playlist. +-- weight - A random integer generated by SQLite. +-- +-- They allow: +-- - Let users recall when they added the track to playlist. Navidrome +-- currently doesn't store this information which might be important +-- to music curators. +-- - A fixed randomness to the playlist (shuffle) defined by the database. +-- - Let user sort playlist by time added (last week, last month, last year), +-- by a fixed random order (given by weight field), and also shuffle the +-- playlist via the player as it is currently supported by players. UI for +-- all these sorting modes currently doesn't exists, so lets build the +-- information infrastructure first so the UI can be built on top of that. +CREATE TABLE IF NOT EXISTS "playlist_tracks_new" +( + id integer default 0 not null, + playlist_id varchar(255) not null + constraint playlist_tracks_playlist_id_fk + references playlist + on update cascade on delete cascade, + media_file_id varchar(255) not null, + + add_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + weight INTEGER DEFAULT (random()) +); + +-- Copy old table data into patched table; the new fields will be +-- filled with defaults. +INSERT INTO playlist_tracks_new (id,playlist_id,media_file_id) +SELECT id,playlist_id,media_file_id FROM playlist_tracks; + +-- Drop old table +DROP TABLE playlist_tracks; + +-- Put new table to work +ALTER TABLE playlist_tracks_new RENAME TO playlist_tracks; + +-- +goose Down + +SELECT 1; From e70bcf3628afb8df7ecf947ae94aded7c62b3009 Mon Sep 17 00:00:00 2001 From: Avi Alkalay Date: Sat, 25 Apr 2026 12:29:57 -0300 Subject: [PATCH 2/4] add fields related to missing tracks --- ...0425115700_add_weight_addtime_playlist_tracks.sql | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql index f3dd8a702..2201dd058 100644 --- a/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql +++ b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql @@ -24,15 +24,21 @@ CREATE TABLE IF NOT EXISTS "playlist_tracks_new" references playlist on update cascade on delete cascade, media_file_id varchar(255) not null, + constraint playlist_tracks_media_file_id_fk + references media_file + on update cascade on delete cascade, + missing boolean default 0 not null, add_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - weight INTEGER DEFAULT (random()) + weight INTEGER DEFAULT (random()), + + PRIMARY KEY (playlist_id, id) ); -- Copy old table data into patched table; the new fields will be -- filled with defaults. -INSERT INTO playlist_tracks_new (id,playlist_id,media_file_id) -SELECT id,playlist_id,media_file_id FROM playlist_tracks; +INSERT INTO playlist_tracks_new (id,playlist_id,media_file_id,missing) +SELECT id,playlist_id,media_file_id,missing FROM playlist_tracks; -- Drop old table DROP TABLE playlist_tracks; From 55aa1c66138d1775943c1ee1e7cdb35c79e3280f Mon Sep 17 00:00:00 2001 From: Avi Alkalay Date: Sun, 26 Apr 2026 07:01:49 -0300 Subject: [PATCH 3/4] removed proposed weight column --- .../20260425115700_add_weight_addtime_playlist_tracks.sql | 3 --- 1 file changed, 3 deletions(-) diff --git a/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql index 2201dd058..c0887a80a 100644 --- a/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql +++ b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql @@ -30,7 +30,6 @@ CREATE TABLE IF NOT EXISTS "playlist_tracks_new" missing boolean default 0 not null, add_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - weight INTEGER DEFAULT (random()), PRIMARY KEY (playlist_id, id) ); @@ -46,6 +45,4 @@ DROP TABLE playlist_tracks; -- Put new table to work ALTER TABLE playlist_tracks_new RENAME TO playlist_tracks; --- +goose Down - SELECT 1; From f22cca069d2ebe5aadd3f551cf13e6b7d2b6bc41 Mon Sep 17 00:00:00 2001 From: Avi Alkalay Date: Sun, 26 Apr 2026 07:03:49 -0300 Subject: [PATCH 4/4] add_time renamed to added_at --- .../20260425115700_add_weight_addtime_playlist_tracks.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql index c0887a80a..807c6ca55 100644 --- a/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql +++ b/db/migrations/20260425115700_add_weight_addtime_playlist_tracks.sql @@ -29,7 +29,7 @@ CREATE TABLE IF NOT EXISTS "playlist_tracks_new" on update cascade on delete cascade, missing boolean default 0 not null, - add_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (playlist_id, id) );