A music player that connects to your cloud/distributed storage.
at main 4.4 kB view raw
1module Tracks.Collection.Internal.Identify exposing (identify) 2 3import Dict 4import List.Extra as List 5import Time.Ext as Time 6import Tracks exposing (..) 7 8 9 10-- 🔱 11 12 13identify : Parcel -> Parcel 14identify ( deps, collection ) = 15 let 16 ( favouritesDictionary, simplifiedFavourites ) = 17 List.foldr 18 (\fav ( dict, acc ) -> 19 let 20 simpl = 21 case fav.artist of 22 Just artist -> 23 String.toLower artist ++ String.toLower fav.title 24 25 Nothing -> 26 String.toLower fav.title 27 in 28 ( Dict.insert simpl fav dict 29 , simpl :: acc 30 ) 31 ) 32 ( Dict.empty, [] ) 33 deps.favourites 34 35 ( identifiedUnsorted, missingFavouritesSimplified ) = 36 List.foldl 37 (identifyTrack 38 deps.enabledSourceIds 39 simplifiedFavourites 40 ) 41 ( [], simplifiedFavourites ) 42 collection.untouched 43 44 missingFavourites = 45 List.foldr 46 (\simpl acc -> 47 case Dict.get simpl favouritesDictionary of 48 Just fav -> 49 fav :: acc 50 51 Nothing -> 52 acc 53 ) 54 [] 55 missingFavouritesSimplified 56 in 57 identifiedUnsorted 58 |> List.append (List.map makeMissingFavouriteTrack missingFavourites) 59 |> (\x -> { collection | identified = x }) 60 |> (\x -> ( deps, x )) 61 62 63 64-- IDENTIFY 65 66 67identifyTrack : 68 List String 69 -> List String 70 -> Track 71 -> ( List IdentifiedTrack, List String ) 72 -> ( List IdentifiedTrack, List String ) 73identifyTrack enabledSourceIds favourites track = 74 if List.member track.sourceId enabledSourceIds then 75 partTwo favourites track 76 77 else 78 identity 79 80 81partTwo : 82 List String 83 -> Track 84 -> ( List IdentifiedTrack, List String ) 85 -> ( List IdentifiedTrack, List String ) 86partTwo favourites track ( acc, remainingFavourites ) = 87 let 88 isFavourite_ = 89 isFavourite track 90 91 isFav = 92 List.any isFavourite_ favourites 93 94 { filename, parentDirectory } = 95 pathParts track 96 97 identifiedTrack = 98 ( { isFavourite = isFav 99 , isMissing = False 100 101 -- 102 , filename = filename 103 , group = Nothing 104 , indexInList = 0 105 , indexInPlaylist = Nothing 106 , parentDirectory = parentDirectory 107 } 108 , track 109 ) 110 in 111 if isFav then 112 -- 113 -- A favourite 114 -- 115 ( identifiedTrack :: acc 116 , remainingFavourites 117 |> List.findIndex isFavourite_ 118 |> Maybe.map (\idx -> List.removeAt idx remainingFavourites) 119 |> Maybe.withDefault remainingFavourites 120 ) 121 122 else 123 -- 124 -- Not a favourite 125 -- 126 ( identifiedTrack :: acc 127 , remainingFavourites 128 ) 129 130 131 132-- FAVOURITES 133 134 135isFavourite : Track -> String -> Bool 136isFavourite track = 137 -- This needs to match the `simplifiedFavourites` format from above 138 (==) 139 (case track.tags.artist of 140 Just artist -> 141 String.toLower artist ++ String.toLower track.tags.title 142 143 Nothing -> 144 String.toLower track.tags.title 145 ) 146 147 148makeMissingFavouriteTrack : Favourite -> IdentifiedTrack 149makeMissingFavouriteTrack fav = 150 let 151 tags = 152 { disc = 1 153 , nr = 0 154 , artist = fav.artist 155 , title = fav.title 156 , album = Nothing 157 , genre = Nothing 158 , picture = Nothing 159 , year = Nothing 160 } 161 in 162 ( { isFavourite = True 163 , isMissing = True 164 165 -- 166 , filename = "" 167 , group = Nothing 168 , indexInList = 0 169 , indexInPlaylist = Nothing 170 , parentDirectory = "" 171 } 172 , { tags = tags 173 , id = missingId 174 , insertedAt = Time.default 175 , path = missingId 176 , sourceId = missingId 177 } 178 )