Commit 159ee13b39b9

Vincent Demeester <vincent@sbr.pm>
2026-01-29 11:06:12
feat(beets): add sort order to all smartplaylists
Add sorting directives to playlist queries: - artist-: year+ album+ disc+ track+ (chronological discography) - decade-: year+ artist+ album+ disc+ track+ - discover-: added- album+ disc+ track+ (newest first) - genre-: artist+ year+ album+ disc+ track+ - lang-: artist+ year+ album+ disc+ track+ - mood-: artist+ album+ disc+ track+ - ost-: album+ disc+ track+ (proper soundtrack order) - recent-: added- album+ disc+ track+ (newest first) - series-: album+ disc+ track+ - type-: artist+ year+ album+ disc+ track+ - podcast-: title+ (episode order) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 5c966c7
Changed files (1)
home
common
services
home/common/services/beets.nix
@@ -168,324 +168,335 @@ in
         playlists = [
           # ===========================================
           # Artist Collections (artist-)
+          # Sorted by year, then album, disc, track (chronological discography)
           # ===========================================
           {
             name = "artist-brian-eno.m3u";
-            query = "artist:'Brian Eno'";
+            query = "artist:'Brian Eno' year+ album+ disc+ track+";
           }
           {
             name = "artist-joe-hisaishi.m3u";
-            query = "artist:久石譲 , artist:'Joe Hisaishi'";
+            query = "artist:久石譲 , artist:'Joe Hisaishi' year+ album+ disc+ track+";
           }
           {
             name = "artist-queen.m3u";
-            query = "artist:Queen";
+            query = "artist:Queen year+ album+ disc+ track+";
           }
           {
             name = "artist-tangerine-dream.m3u";
-            query = "artist:'Tangerine Dream'";
+            query = "artist:'Tangerine Dream' year+ album+ disc+ track+";
           }
           {
             name = "artist-u2.m3u";
-            query = "artist:U2";
+            query = "artist:U2 year+ album+ disc+ track+";
           }
           {
             name = "artist-vangelis.m3u";
-            query = "artist:Vangelis";
+            query = "artist:Vangelis year+ album+ disc+ track+";
           }
           {
             name = "artist-yoko-kanno.m3u";
-            query = "artist:菅野よう子 , artist:'Yoko Kanno'";
+            query = "artist:菅野よう子 , artist:'Yoko Kanno' year+ album+ disc+ track+";
           }
           # ===========================================
           # Decades (decade-)
+          # Sorted by year, artist, album, disc, track
           # ===========================================
           {
             name = "decade-1960s.m3u";
-            query = "year:1960..1969";
+            query = "year:1960..1969 year+ artist+ album+ disc+ track+";
           }
           {
             name = "decade-1970s.m3u";
-            query = "year:1970..1979";
+            query = "year:1970..1979 year+ artist+ album+ disc+ track+";
           }
           {
             name = "decade-1980s.m3u";
-            query = "year:1980..1989";
+            query = "year:1980..1989 year+ artist+ album+ disc+ track+";
           }
           {
             name = "decade-1990s.m3u";
-            query = "year:1990..1999";
+            query = "year:1990..1999 year+ artist+ album+ disc+ track+";
           }
           {
             name = "decade-2000s.m3u";
-            query = "year:2000..2009";
+            query = "year:2000..2009 year+ artist+ album+ disc+ track+";
           }
           {
             name = "decade-2010s.m3u";
-            query = "year:2010..2019";
+            query = "year:2010..2019 year+ artist+ album+ disc+ track+";
           }
           {
             name = "decade-2020s.m3u";
-            query = "year:2020..2029";
+            query = "year:2020..2029 year+ artist+ album+ disc+ track+";
           }
           # ===========================================
           # Discovery (discover-)
+          # Sorted by added date (newest first), then album order
           # ===========================================
           {
             name = "discover-unplayed.m3u";
-            query = "play_count:0";
+            query = "play_count:0 added- album+ disc+ track+";
           }
           {
             name = "discover-rarely-played.m3u";
-            query = "play_count:..3 added:..2024-01-01";
+            query = "play_count:..3 added:..2024-01-01 added- album+ disc+ track+";
           }
           # ===========================================
           # Genre (genre-)
+          # Sorted by artist, year, album, disc, track
           # ===========================================
           {
             name = "genre-ambient.m3u";
-            query = "genre:Ambient";
+            query = "genre:Ambient artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-classical.m3u";
-            query = "genre:Classical";
+            query = "genre:Classical artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-electronic.m3u";
-            query = "genre:Electronic";
+            query = "genre:Electronic artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-folk.m3u";
-            query = "genre:Folk";
+            query = "genre:Folk artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-hiphop.m3u";
-            query = "genre:'Hip Hop'";
+            query = "genre:'Hip Hop' artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-jazz.m3u";
-            query = "genre:Jazz";
+            query = "genre:Jazz artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-metal.m3u";
-            query = "genre:Metal";
+            query = "genre:Metal artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-pop.m3u";
-            query = "genre:Pop";
+            query = "genre:Pop artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-rock.m3u";
-            query = "genre:Rock";
+            query = "genre:Rock artist+ year+ album+ disc+ track+";
           }
           {
             name = "genre-trance.m3u";
-            query = "genre:Trance";
+            query = "genre:Trance artist+ year+ album+ disc+ track+";
           }
           # ===========================================
           # Language (lang-)
+          # Sorted by artist, year, album, disc, track
           # ===========================================
           {
             name = "lang-asian.m3u";
-            query = "language:jpn,kor,cmn,zho";
+            query = "language:jpn,kor,cmn,zho artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-english.m3u";
-            query = "language:eng";
+            query = "language:eng artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-european.m3u";
-            query = "language:fra,deu,ita,spa";
+            query = "language:fra,deu,ita,spa artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-french.m3u";
-            query = "language:fra";
+            query = "language:fra artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-german.m3u";
-            query = "language:deu";
+            query = "language:deu artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-instrumental.m3u";
-            query = "language:zxx";
+            query = "language:zxx artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-italian.m3u";
-            query = "language:ita";
+            query = "language:ita artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-japanese.m3u";
-            query = "language:jpn";
+            query = "language:jpn artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-korean.m3u";
-            query = "language:kor";
+            query = "language:kor artist+ year+ album+ disc+ track+";
           }
           {
             name = "lang-spanish.m3u";
-            query = "language:spa";
+            query = "language:spa artist+ year+ album+ disc+ track+";
           }
           # ===========================================
           # Mood & Activity (mood-)
+          # Sorted by artist, album, disc, track
           # ===========================================
           {
             name = "mood-chill.m3u";
-            query = "genre:Ambient,Jazz,Folk bpm:..100";
+            query = "genre:Ambient,Jazz,Folk bpm:..100 artist+ album+ disc+ track+";
           }
           {
             name = "mood-christmas.m3u";
-            query = "genre:Christmas,Holiday";
+            query = "genre:Christmas,Holiday artist+ album+ disc+ track+";
           }
           {
             name = "mood-driving.m3u";
-            query = "genre:Rock,Electronic,'Indie Rock' bpm:100..130";
+            query = "genre:Rock,Electronic,'Indie Rock' bpm:100..130 artist+ album+ disc+ track+";
           }
           {
             name = "mood-focus.m3u";
-            query = "genre:Classical,Ambient,'Post-Rock' bpm:..90";
+            query = "genre:Classical,Ambient,'Post-Rock' bpm:..90 artist+ album+ disc+ track+";
           }
           {
             name = "mood-party.m3u";
-            query = "genre:Pop,Dance,Electronic,'Hip Hop' bpm:110..140 year:2015..";
+            query = "genre:Pop,Dance,Electronic,'Hip Hop' bpm:110..140 year:2015.. artist+ album+ disc+ track+";
           }
           {
             name = "mood-summer.m3u";
-            query = "genre:Reggae,Ska,'Surf Rock'";
+            query = "genre:Reggae,Ska,'Surf Rock' artist+ album+ disc+ track+";
           }
           {
             name = "mood-workout.m3u";
-            query = "genre:Electronic,Rock,'Hip Hop' bpm:120..";
+            query = "genre:Electronic,Rock,'Hip Hop' bpm:120.. artist+ album+ disc+ track+";
           }
           # ===========================================
           # Soundtrack Series (ost-)
+          # Sorted by album, disc, track (proper soundtrack order)
           # ===========================================
           {
             name = "ost-elder-scrolls.m3u";
-            query = "album:'Elder Scrolls'";
+            query = "album:'Elder Scrolls' album+ disc+ track+";
           }
           {
             name = "ost-escaflowne.m3u";
-            query = "album:Escaflowne";
+            query = "album:Escaflowne album+ disc+ track+";
           }
           {
             name = "ost-ghibli.m3u";
-            query = "album:Ghibli , album:Totoro , album:Mononoke , album:Ponyo , album:Howl , album:Laputa , album:Nausicaä";
+            query = "album:Ghibli , album:Totoro , album:Mononoke , album:Ponyo , album:Howl , album:Laputa , album:Nausicaä album+ disc+ track+";
           }
           {
             name = "ost-minecraft.m3u";
-            query = "album:Minecraft";
+            query = "album:Minecraft album+ disc+ track+";
           }
           {
             name = "ost-samurai-champloo.m3u";
-            query = "album:'Samurai Champloo'";
+            query = "album:'Samurai Champloo' album+ disc+ track+";
           }
           {
             name = "ost-stranger-things.m3u";
-            query = "album:'Stranger Things'";
+            query = "album:'Stranger Things' album+ disc+ track+";
           }
           # ===========================================
           # Recent Additions (recent-)
+          # Sorted by added date (newest first), then album order
           # ===========================================
           {
             name = "recent-last-week.m3u";
-            query = "added:-1w..";
+            query = "added:-1w.. added- album+ disc+ track+";
           }
           {
             name = "recent-this-year.m3u";
-            query = "added:-1y..";
+            query = "added:-1y.. added- album+ disc+ track+";
           }
           # ===========================================
           # Compilation Series (series-)
+          # Sorted by album, disc, track
           # ===========================================
           {
             name = "series-greatest-hits-millennium.m3u";
-            query = "album:'Greatest Hits of the Millennium'";
+            query = "album:'Greatest Hits of the Millennium' album+ disc+ track+";
           }
           {
             name = "series-lofi-girl.m3u";
-            query = "album:lofi-girl";
+            query = "album:lofi-girl album+ disc+ track+";
           }
           {
             name = "series-nova-all.m3u";
-            query = "album:Nova path:compilation";
+            query = "album:Nova path:compilation album+ disc+ track+";
           }
           {
             name = "series-nova-tunes.m3u";
-            query = "album:'Nova Tunes'";
+            query = "album:'Nova Tunes' album+ disc+ track+";
           }
           # ===========================================
           # Album Types (type-)
+          # Sorted by artist, year, album, disc, track
           # ===========================================
           {
             name = "type-all-compilations.m3u";
-            query = "path:compilation";
+            query = "path:compilation artist+ year+ album+ disc+ track+";
           }
           {
             name = "type-all-soundtracks.m3u";
-            query = "path:soundtrack";
+            query = "path:soundtrack artist+ year+ album+ disc+ track+";
           }
           {
             name = "type-compilations.m3u";
-            query = "albumtype:compilation";
+            query = "albumtype:compilation artist+ year+ album+ disc+ track+";
           }
           {
             name = "type-eps.m3u";
-            query = "albumtype:ep";
+            query = "albumtype:ep artist+ year+ album+ disc+ track+";
           }
           {
             name = "type-live-albums.m3u";
-            query = "albumtype:live";
+            query = "albumtype:live artist+ year+ album+ disc+ track+";
           }
           {
             name = "type-podcasts.m3u";
-            query = "albumtype:podcast";
+            query = "albumtype:podcast artist+ year+ album+ disc+ track+";
           }
           {
             name = "type-remixes.m3u";
-            query = "albumtype:remix";
+            query = "albumtype:remix artist+ year+ album+ disc+ track+";
           }
           {
             name = "type-singles.m3u";
-            query = "albumtype:single";
+            query = "albumtype:single artist+ year+ album+ disc+ track+";
           }
           # ===========================================
           # Music Podcasts (podcast-)
+          # Sorted by title (episode name/date)
           # ===========================================
           {
             name = "podcast-deep-search.m3u";
-            query = "path::podcasts/\\[DEEP\\]Search";
+            query = "path::podcasts/\\[DEEP\\]Search title+";
           }
           {
             name = "podcast-bon-entendeur.m3u";
-            query = "path::podcasts/Bon Entendeur";
+            query = "path::podcasts/Bon Entendeur title+";
           }
           {
             name = "podcast-wym-radio.m3u";
-            query = "path::podcasts/Cosmic Gate";
+            query = "path::podcasts/Cosmic Gate title+";
           }
           {
             name = "podcast-fip-tape.m3u";
-            query = "path::podcasts/Fip Tape";
+            query = "path::podcasts/Fip Tape title+";
           }
           {
             name = "podcast-global-dj-broadcast.m3u";
-            query = "path::podcasts/Markus Schulz";
+            query = "path::podcasts/Markus Schulz title+";
           }
           {
             name = "podcast-vonyc-sessions.m3u";
-            query = "path::podcasts/Paul van Dyk";
+            query = "path::podcasts/Paul van Dyk title+";
           }
           {
             name = "podcast-perfecto.m3u";
-            query = "path::podcasts/Perfecto";
+            query = "path::podcasts/Perfecto title+";
           }
           {
             name = "podcast-resonation-radio.m3u";
-            query = "path::podcasts/Resonation";
+            query = "path::podcasts/Resonation title+";
           }
           {
             name = "podcast-pogo-chill.m3u";
-            query = "path::podcasts/P\\(\\)G\\(\\)";
+            query = "path::podcasts/P\\(\\)G\\(\\) title+";
           }
         ];
       };