A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Convert autogenerated playlist into regular

+75 -21
+2 -2
CHANGELOG.md
··· 3 3 ## 3.2.0 4 4 5 5 - **Native builds with [Tauri](https://tauri.app/)**. 6 - - Add support for non-standard `audio/x-flac` mimetype 6 + - Add support for non-standard `audio/x-flac` mimetype. 7 7 - Fixes a playback issue with Google Drive on Safari/iOS. 8 8 - Improves Google Drive support, access tokens are now refreshed when needed (before it only refreshed on source processing) 9 - - Several playlist improvements: add to queue, add options to autogenerated playlists, etc. 9 + - Several playlist improvements: add to queue, add options to autogenerated playlists, convert autogenerated playlist into regular playlist, etc. 10 10 11 11 12 12 ## 3.1.1
+27 -4
src/Applications/UI/Playlists/ContextMenu.elm
··· 6 6 import Material.Icons.Round as Icons 7 7 import Playlists exposing (Playlist) 8 8 import Playlists.Matching 9 - import Tracks exposing (IdentifiedTrack) 9 + import Tracks exposing (IdentifiedTrack, SortBy(..), SortDirection(..)) 10 + import Tracks.Sorting 10 11 import UI.Page 11 12 import UI.Playlists.Page 12 13 import UI.Queue.Types as Queue ··· 34 35 |> Tuple.first 35 36 36 37 tracksFromPlaylist = 37 - identifiedTracksFromPlaylist 38 - |> List.sortBy (Tuple.first >> .indexInPlaylist >> Maybe.withDefault 0) 39 - |> List.map Tuple.second 38 + if playlist.autoGenerated then 39 + identifiedTracksFromPlaylist 40 + |> Tracks.Sorting.sort Album Asc 41 + |> List.map Tuple.second 42 + 43 + else 44 + identifiedTracksFromPlaylist 45 + |> List.sortBy (\( i, t ) -> Maybe.withDefault (t.tags.disc * 1000 + t.tags.nr) i.indexInPlaylist) 46 + |> List.map Tuple.second 40 47 41 48 menuMsg = 42 49 ShowPlaylistListMenu ··· 52 59 if playlist.autoGenerated then 53 60 ContextMenu 54 61 [ addToQueue identifiedTracksFromPlaylist 62 + , convertToRegularPlaylist tracksFromPlaylist playlist 55 63 , downloadAsZip tracksFromPlaylist playlist 56 64 , storeInCache tracksFromPlaylist 57 65 ] ··· 80 88 { inFront = False, tracks = identifiedTracks } 81 89 |> Queue.AddTracks 82 90 |> QueueMsg 91 + 92 + -- 93 + , active = False 94 + } 95 + 96 + 97 + convertToRegularPlaylist tracksFromPlaylist playlist = 98 + Item 99 + { icon = Icons.waves 100 + , label = "Convert to regular playlist" 101 + , msg = 102 + AddTracksToPlaylist 103 + { playlistName = playlist.name 104 + , tracks = List.map Tracks.playlistTrackFromTrack tracksFromPlaylist 105 + } 83 106 84 107 -- 85 108 , active = False
+33 -4
src/Applications/UI/Playlists/State.elm
··· 11 11 import Playlists exposing (..) 12 12 import Playlists.Encoding as Playlists 13 13 import Return exposing (andThen, return) 14 - import Tracks exposing (IdentifiedTrack) 14 + import Tracks exposing (IdentifiedTrack, SortBy(..), SortDirection(..)) 15 15 import Tracks.Collection 16 16 import UI.Alfred.State as Alfred 17 17 import UI.Common.State as Common ··· 146 146 147 147 delete : { playlistName : String } -> Manager 148 148 delete { playlistName } model = 149 + let 150 + selectedPlaylist = 151 + Maybe.map 152 + (\p -> ( p.autoGenerated, p.name )) 153 + model.selectedPlaylist 154 + 155 + ( selectedPlaylistChanged, newSelectedPlaylist ) = 156 + if selectedPlaylist == Just ( False, playlistName ) then 157 + ( True, Nothing ) 158 + 159 + else 160 + ( False, model.selectedPlaylist ) 161 + in 149 162 model.playlists 150 163 |> List.filter 151 164 (\p -> ··· 155 168 else 156 169 p.name /= playlistName 157 170 ) 158 - |> (\col -> { model | playlists = col }) 159 - |> save 171 + |> (\col -> 172 + { model 173 + | playlists = col 174 + , selectedPlaylist = newSelectedPlaylist 175 + } 176 + ) 177 + |> (if selectedPlaylistChanged then 178 + Tracks.reviseCollection Tracks.Collection.arrange 179 + 180 + else 181 + Return.singleton 182 + ) 183 + |> andThen save 160 184 161 185 162 186 modify : Manager ··· 221 245 222 246 updatedPlaylistCollection = 223 247 List.map 224 - (\p -> ifThenElse (p.name == updatedPlaylist.name) updatedPlaylist p) 248 + (\p -> 249 + ifThenElse 250 + (p.autoGenerated == False && p.name == updatedPlaylist.name) 251 + updatedPlaylist 252 + p 253 + ) 225 254 model.playlists 226 255 in 227 256 { model
+4 -4
src/Applications/UI/Playlists/View.elm
··· 56 56 index : List Playlist -> Maybe Playlist -> Maybe Color -> Bool -> List (Html Msg) 57 57 index playlists selectedPlaylist bgColor authMethodSupportsPublicData = 58 58 let 59 - selectedPlaylistName = 60 - Maybe.map .name selectedPlaylist 59 + isSelected playlist = 60 + Maybe.map (\s -> ( s.autoGenerated, s.name )) selectedPlaylist == Just ( playlist.autoGenerated, playlist.name ) 61 61 62 62 customPlaylists = 63 63 playlists ··· 65 65 |> List.sortBy lowercaseName 66 66 67 67 customPlaylistListItem playlist = 68 - if selectedPlaylistName == Just playlist.name then 68 + if isSelected playlist then 69 69 selectedPlaylistListItem playlist bgColor 70 70 71 71 else ··· 107 107 |> List.sortBy lowercaseName 108 108 109 109 directoryPlaylistListItem playlist = 110 - if selectedPlaylistName == Just playlist.name then 110 + if isSelected playlist then 111 111 selectedPlaylistListItem playlist bgColor 112 112 113 113 else
+9 -7
src/Library/Tracks.elm
··· 375 375 |> Maybe.withDefault False 376 376 377 377 378 + playlistTrackFromTrack : Track -> PlaylistTrack 379 + playlistTrackFromTrack track = 380 + { album = track.tags.album 381 + , artist = track.tags.artist 382 + , title = track.tags.title 383 + } 384 + 385 + 378 386 toPlaylistTracks : List IdentifiedTrack -> List PlaylistTrack 379 387 toPlaylistTracks = 380 - List.map 381 - (\( _, t ) -> 382 - { album = t.tags.album 383 - , artist = t.tags.artist 384 - , title = t.tags.title 385 - } 386 - ) 388 + List.map (Tuple.second >> playlistTrackFromTrack) 387 389 388 390 389 391