diff --git a/src/Core/Themes/Sunrise/Playlists/View.elm b/src/Core/Themes/Sunrise/Playlists/View.elm index f0d17722..6d560806 100644 --- a/src/Core/Themes/Sunrise/Playlists/View.elm +++ b/src/Core/Themes/Sunrise/Playlists/View.elm @@ -9,6 +9,7 @@ import Html.Events exposing (onInput, onSubmit) import List.Extra as List import Material.Icons.Round as Icons import Material.Icons.Types exposing (Coloring(..)) +import Maybe.Extra as Maybe import Playlists exposing (..) import Themes.Sunrise.Kit as Kit exposing (ButtonType(..)) import Themes.Sunrise.List @@ -33,7 +34,7 @@ view page playlists selectedPlaylist editContext bgColor authMethodSupportsPubli let filtered = List.filter - (.autoGenerated >> (==) False) + (.autoGenerated >> Maybe.isNothing) playlists in encodedName @@ -62,7 +63,7 @@ index playlists selectedPlaylist bgColor authMethodSupportsPublicData = customPlaylists = playlists - |> List.filterNot .autoGenerated + |> List.filterNot (.autoGenerated >> Maybe.isJust) |> List.sortBy lowercaseName customPlaylistListItem playlist = @@ -105,8 +106,9 @@ index playlists selectedPlaylist bgColor authMethodSupportsPublicData = directoryPlaylists = playlists - |> List.filter .autoGenerated + |> List.filter (.autoGenerated >> Maybe.isJust) |> List.sortBy lowercaseName + |> List.uniqueBy .name directoryPlaylistListItem playlist = if isSelected playlist then diff --git a/src/Core/Themes/Sunrise/Tracks/View.elm b/src/Core/Themes/Sunrise/Tracks/View.elm index e63cca9f..aad68b3f 100644 --- a/src/Core/Themes/Sunrise/Tracks/View.elm +++ b/src/Core/Themes/Sunrise/Tracks/View.elm @@ -108,14 +108,14 @@ view model = List -> model.selectedPlaylist - |> Maybe.map .autoGenerated |> Maybe.andThen - (\bool -> - if bool then - Nothing + (\playlist -> + case playlist.autoGenerated of + Just _ -> + Nothing - else - Just model.dnd + Nothing -> + Just model.dnd ) |> Themes.Sunrise.Tracks.Scene.List.view { bgColor = model.extractedBackdropColor diff --git a/src/Core/UI/Commands/Alfred.elm b/src/Core/UI/Commands/Alfred.elm index 8d47deb1..d13315cf 100644 --- a/src/Core/UI/Commands/Alfred.elm +++ b/src/Core/UI/Commands/Alfred.elm @@ -222,8 +222,8 @@ sourcesCommands model = viewCommands model = let sortCommands = - (case Maybe.map .autoGenerated model.selectedPlaylist of - Just False -> + (case Maybe.andThen .autoGenerated model.selectedPlaylist of + Nothing -> [] _ -> diff --git a/src/Core/UI/Common/State.elm b/src/Core/UI/Common/State.elm index 6b8d244e..7774a1ff 100644 --- a/src/Core/UI/Common/State.elm +++ b/src/Core/UI/Common/State.elm @@ -5,6 +5,7 @@ import Common exposing (..) import ContextMenu exposing (ContextMenu) import Debouncer.Basic as Debouncer exposing (Debouncer) import List.Extra as List +import Maybe.Extra as Maybe import Monocle.Lens as Lens exposing (Lens) import Notifications exposing (Notification) import Return exposing (return) @@ -82,7 +83,7 @@ generateDirectoryPlaylists model = let nonDirectoryPlaylists = List.filterNot - .autoGenerated + (.autoGenerated >> Maybe.isJust) model.playlists directoryPlaylists = diff --git a/src/Core/UI/Playlists/Alfred.elm b/src/Core/UI/Playlists/Alfred.elm index 1573ebbd..c6d218a2 100644 --- a/src/Core/UI/Playlists/Alfred.elm +++ b/src/Core/UI/Playlists/Alfred.elm @@ -106,7 +106,14 @@ selectAction playlists { result } = makeIndex playlists = playlists |> Dict.groupBy - (\p -> ifThenElse p.autoGenerated "AutoGenerated Directory Playlists" "Your Playlists") + (\p -> + case p.autoGenerated of + Just _ -> + "AutoGenerated Directory Playlists" + + Nothing -> + "Your Playlists" + ) |> Dict.toList |> List.reverse |> List.map diff --git a/src/Core/UI/Playlists/ContextMenu.elm b/src/Core/UI/Playlists/ContextMenu.elm index ae39b297..caa7ddfd 100644 --- a/src/Core/UI/Playlists/ContextMenu.elm +++ b/src/Core/UI/Playlists/ContextMenu.elm @@ -24,26 +24,28 @@ listMenu : Playlist -> List IdentifiedTrack -> Maybe String -> Coordinates -> Co listMenu playlist allTracks confirmation coordinates = let identifiedTracksFromPlaylist = - if playlist.autoGenerated then - List.filter - (Tuple.second >> Tracks.matchesAutoGeneratedPlaylist playlist) - allTracks + case playlist.autoGenerated of + Just _ -> + List.filter + (Tuple.second >> Tracks.matchesAutoGeneratedPlaylist playlist) + allTracks - else - allTracks - |> Playlists.Matching.match playlist - |> Tuple.first + Nothing -> + allTracks + |> Playlists.Matching.match playlist + |> Tuple.first tracksFromPlaylist = - if playlist.autoGenerated then - identifiedTracksFromPlaylist - |> Tracks.Sorting.sort Album Asc - |> List.map Tuple.second + case playlist.autoGenerated of + Just _ -> + identifiedTracksFromPlaylist + |> Tracks.Sorting.sort Album Asc + |> List.map Tuple.second - else - identifiedTracksFromPlaylist - |> List.sortBy (\( i, t ) -> Maybe.withDefault (t.tags.disc * 1000 + t.tags.nr) i.indexInPlaylist) - |> List.map Tuple.second + Nothing -> + identifiedTracksFromPlaylist + |> List.sortBy (\( i, t ) -> Maybe.withDefault (t.tags.disc * 1000 + t.tags.nr) i.indexInPlaylist) + |> List.map Tuple.second menuMsg = ShowPlaylistListMenu @@ -56,24 +58,25 @@ listMenu playlist allTracks confirmation coordinates = , screenPos = ( 0, 0 ) } in - if playlist.autoGenerated then - ContextMenu - [ addToQueue identifiedTracksFromPlaylist - , convertToRegularPlaylist tracksFromPlaylist playlist - , downloadAsZip tracksFromPlaylist playlist - , storeInCache tracksFromPlaylist - ] - coordinates - - else - ContextMenu - [ addToQueue identifiedTracksFromPlaylist - , downloadAsZip tracksFromPlaylist playlist - , removePlaylist menuMsg confirmation playlist - , renamePlaylist playlist - , storeInCache tracksFromPlaylist - ] - coordinates + case playlist.autoGenerated of + Just _ -> + ContextMenu + [ addToQueue identifiedTracksFromPlaylist + , convertToRegularPlaylist tracksFromPlaylist playlist + , downloadAsZip tracksFromPlaylist playlist + , storeInCache tracksFromPlaylist + ] + coordinates + + Nothing -> + ContextMenu + [ addToQueue identifiedTracksFromPlaylist + , downloadAsZip tracksFromPlaylist playlist + , removePlaylist menuMsg confirmation playlist + , renamePlaylist playlist + , storeInCache tracksFromPlaylist + ] + coordinates diff --git a/src/Core/UI/Playlists/Directory.elm b/src/Core/UI/Playlists/Directory.elm index ca9a363e..ff3a5595 100644 --- a/src/Core/UI/Playlists/Directory.elm +++ b/src/Core/UI/Playlists/Directory.elm @@ -6,7 +6,7 @@ import Set exposing (Set) import Sources exposing (Source) import String.Ext as String import Tracks exposing (Track) - +import List.Extra as List -- 🔱 @@ -39,19 +39,14 @@ generate sources tracks = in playlistNames |> Set.toList - |> List.filter - (\n -> - case n of - "" -> - False - - _ -> - True - ) |> List.map (\n -> - { autoGenerated = True - , name = n + let + s = + String.split "/" n + in + { autoGenerated = Just { level = List.length s - 1 } + , name = Maybe.withDefault n (List.last s) , public = False , tracks = [] } @@ -84,8 +79,16 @@ reducer sourceDirectories track = String.dropLeft (String.length prefix) track.path in case String.split "/" path of + "" :: _ :: _ -> + identity + a :: _ :: _ -> - Set.insert a + case prefix of + "" -> + Set.insert a + + _ -> + Set.insert (prefix ++ "/" ++ a) _ -> identity diff --git a/src/Core/UI/Playlists/State.elm b/src/Core/UI/Playlists/State.elm index 762b59aa..01987f82 100644 --- a/src/Core/UI/Playlists/State.elm +++ b/src/Core/UI/Playlists/State.elm @@ -5,6 +5,7 @@ import Coordinates import Html.Events.Extra.Mouse as Mouse import List.Ext as List import List.Extra as List +import Maybe.Extra as Maybe import Notifications import Playlists exposing (..) import Return exposing (andThen) @@ -40,7 +41,7 @@ addTracksToPlaylist { playlistName, tracks } model = playlistIndex = List.findIndex - (\p -> p.autoGenerated == False && p.name == properPlaylistName) + (\p -> Maybe.isNothing p.autoGenerated && p.name == properPlaylistName) model.playlists newCollection = @@ -52,7 +53,7 @@ addTracksToPlaylist { playlistName, tracks } model = model.playlists Nothing -> - { autoGenerated = False + { autoGenerated = Nothing , name = properPlaylistName , public = False , tracks = tracks @@ -81,7 +82,7 @@ addTracksToPlaylist { playlistName, tracks } model = assistWithAddingTracksToPlaylist : List IdentifiedTrack -> Manager assistWithAddingTracksToPlaylist tracks model = model.playlists - |> List.filterNot .autoGenerated + |> List.filterNot (.autoGenerated >> Maybe.isJust) |> UI.Playlists.Alfred.create tracks |> (\a -> Alfred.assign a model) @@ -101,10 +102,10 @@ create model = alreadyExists = List.any (.name >> (==) playlistName) - (List.filterNot .autoGenerated model.playlists) + (List.filterNot (.autoGenerated >> Maybe.isJust) model.playlists) playlist = - { autoGenerated = False + { autoGenerated = Nothing , name = playlistName , public = False , tracks = [] @@ -149,7 +150,7 @@ delete { playlistName } model = model.selectedPlaylist ( selectedPlaylistChanged, newSelectedPlaylist ) = - if selectedPlaylist == Just ( False, playlistName ) then + if selectedPlaylist == Just ( Nothing, playlistName ) then ( True, Nothing ) else @@ -158,7 +159,7 @@ delete { playlistName } model = model.playlists |> List.filter (\p -> - if p.autoGenerated then + if Maybe.isJust p.autoGenerated then True else @@ -191,7 +192,7 @@ modify model = String.isEmpty properName == False ( autoGenerated, notAutoGenerated ) = - List.partition .autoGenerated model.playlists + List.partition (.autoGenerated >> Maybe.isJust) model.playlists alreadyExists = List.any @@ -243,7 +244,7 @@ moveTrackInSelected { to } model = List.map (\p -> ifThenElse - (p.autoGenerated == False && p.name == updatedPlaylist.name) + (p.autoGenerated == Nothing && p.name == updatedPlaylist.name) updatedPlaylist p ) diff --git a/src/Core/UI/Tracks/ContextMenu.elm b/src/Core/UI/Tracks/ContextMenu.elm index c9e6886a..b8d75879 100644 --- a/src/Core/UI/Tracks/ContextMenu.elm +++ b/src/Core/UI/Tracks/ContextMenu.elm @@ -160,7 +160,14 @@ playlistActions { selectedPlaylist, lastModifiedPlaylistName } tracks = let maybeCustomPlaylist = Maybe.andThen - (\p -> ifThenElse p.autoGenerated Nothing (Just p)) + (\p -> + case p.autoGenerated of + Just _ -> + Nothing + + Nothing -> + Just p + ) selectedPlaylist maybeAddToLastModifiedPlaylist = diff --git a/src/Core/UI/User/State/Export.elm b/src/Core/UI/User/State/Export.elm index bb9d60b6..7a304b82 100644 --- a/src/Core/UI/User/State/Export.elm +++ b/src/Core/UI/User/State/Export.elm @@ -4,6 +4,7 @@ import Alien import File.Download import Json.Encode import List.Extra as List +import Maybe.Extra as Maybe exposing (isJust) import Playlists.Encoding as Playlists import Return exposing (return) import Settings exposing (Settings) @@ -20,7 +21,7 @@ import User.Layer exposing (..) export model = { favourites = model.favourites - , playlists = List.filterNot .autoGenerated model.playlists + , playlists = List.filterNot (.autoGenerated >> Maybe.isJust) model.playlists , progress = model.progress , settings = Just (gatherSettings model) , sources = model.sources @@ -91,7 +92,7 @@ saveModifiedAt = savePlaylists : Manager savePlaylists model = model.playlists - |> List.filterNot .autoGenerated + |> List.filterNot (.autoGenerated >> Maybe.isJust) |> Json.Encode.list Playlists.encode |> Alien.broadcast Alien.SavePlaylists |> Ports.toBrain diff --git a/src/Library/Playlists.elm b/src/Library/Playlists.elm index 4612c064..c452772b 100644 --- a/src/Library/Playlists.elm +++ b/src/Library/Playlists.elm @@ -4,7 +4,7 @@ module Playlists exposing (..) type alias Playlist = - { autoGenerated : Bool + { autoGenerated : Maybe { level : Int } , name : String , public : Bool , tracks : List PlaylistTrack diff --git a/src/Library/Playlists/Encoding.elm b/src/Library/Playlists/Encoding.elm index f16fd1a2..d6b1b192 100644 --- a/src/Library/Playlists/Encoding.elm +++ b/src/Library/Playlists/Encoding.elm @@ -4,6 +4,7 @@ import Json.Decode as Decode import Json.Decode.Ext as Decode import Json.Encode as Encode import Json.Encode.Ext exposing (..) +import Maybe.Extra as Maybe exposing (isJust) import Playlists exposing (..) @@ -14,7 +15,15 @@ import Playlists exposing (..) encode : Playlist -> Encode.Value encode playlist = Encode.object - [ ( "autoGenerated", Encode.bool playlist.autoGenerated ) + [ ( "autoGenerated" + , case playlist.autoGenerated of + Just { level } -> + Encode.object + [ ( "level", Encode.int level ) ] + + Nothing -> + Encode.null + ) , ( "name", Encode.string playlist.name ) , ( "public", Encode.bool playlist.public ) , ( "tracks", Encode.list encodePlaylistTrack playlist.tracks ) @@ -37,7 +46,7 @@ encodePlaylistTrack playlistTrack = decoder : Decode.Decoder Playlist decoder = Decode.map4 Playlist - (Decode.field "autoGenerated" Decode.bool) + (Decode.field "autoGenerated" <| Decode.maybe <| Decode.map (\l -> { level = l }) <| Decode.field "level" Decode.int) (Decode.field "name" Decode.string) (Decode.optionalField "public" Decode.bool False) (Decode.field "tracks" <| Decode.list playlistTrackDecoder) diff --git a/src/Library/Tracks.elm b/src/Library/Tracks.elm index 7638c054..7cd5070d 100644 --- a/src/Library/Tracks.elm +++ b/src/Library/Tracks.elm @@ -306,11 +306,16 @@ makeTrack sourceId ( path, tags ) = matchesAutoGeneratedPlaylist : Playlist -> Track -> Bool matchesAutoGeneratedPlaylist playlist track = - track.path - |> String.split "/" - |> List.head - |> (==) (Just playlist.name) - |> (&&) playlist.autoGenerated + case playlist.autoGenerated of + Just { level } -> + track.path + |> String.split "/" + |> List.drop (max 0 (level - 1)) + |> List.head + |> (==) (Just playlist.name) + + Nothing -> + False missingId : String diff --git a/src/Library/Tracks/Collection/Internal/Arrange.elm b/src/Library/Tracks/Collection/Internal/Arrange.elm index 44887386..e7cbc696 100644 --- a/src/Library/Tracks/Collection/Internal/Arrange.elm +++ b/src/Library/Tracks/Collection/Internal/Arrange.elm @@ -21,11 +21,12 @@ arrange : Parcel -> Parcel arrange ( deps, collection ) = case deps.selectedPlaylist of Just playlist -> - if playlist.autoGenerated then - arrangeByGroup ( deps, collection ) + case playlist.autoGenerated of + Just _ -> + arrangeByGroup ( deps, collection ) - else - arrangeByPlaylist ( deps, collection ) playlist + Nothing -> + arrangeByPlaylist ( deps, collection ) playlist Nothing -> arrangeByGroup ( deps, collection ) @@ -130,23 +131,17 @@ groupByDirectory deps = groupByDirectoryFolder : CollectionDependencies -> IdentifiedTrack -> Dict String (List IdentifiedTrack) -> Dict String (List IdentifiedTrack) groupByDirectoryFolder deps ( i, t ) = let - prefix = - case deps.selectedPlaylist of - Just playlist -> - if playlist.autoGenerated then - playlist.name ++ "/" - - else - "" - - _ -> - "" - directory = t.path - |> String.dropLeft (String.length prefix) |> String.chopStart "/" |> String.split "/" + |> (case Maybe.andThen .autoGenerated deps.selectedPlaylist of + Just { level } -> + List.drop (max 0 (level - 1) + 1) + + Nothing -> + identity + ) |> List.init |> Maybe.map (String.join " / ") |> Maybe.withDefault t.path diff --git a/src/Library/Tracks/Collection/Internal/Harvest.elm b/src/Library/Tracks/Collection/Internal/Harvest.elm index ee57cb75..dbd45918 100644 --- a/src/Library/Tracks/Collection/Internal/Harvest.elm +++ b/src/Library/Tracks/Collection/Internal/Harvest.elm @@ -32,7 +32,7 @@ harvest ( deps, collection ) = if deps.favouritesOnly then Tuple.first >> .isFavourite >> (==) True - else if Maybe.map .autoGenerated deps.selectedPlaylist == Just False then + else if Maybe.map .autoGenerated deps.selectedPlaylist == Just Nothing then always True else @@ -42,13 +42,14 @@ harvest ( deps, collection ) = ----------- , case deps.selectedPlaylist of Just playlist -> - if playlist.autoGenerated then - \( _, t ) -> - Tracks.matchesAutoGeneratedPlaylist playlist t - - else - \( i, _ ) -> - Maybe.isJust i.indexInPlaylist + case playlist.autoGenerated of + Just _ -> + \( _, t ) -> + Tracks.matchesAutoGeneratedPlaylist playlist t + + Nothing -> + \( i, _ ) -> + Maybe.isJust i.indexInPlaylist Nothing -> always True