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 )