1module Tracks.Encoding exposing (..)
2
3import Json.Decode as Decode
4import Json.Decode.Pipeline exposing (optional, required)
5import Json.Encode as Encode
6import Json.Encode.Ext exposing (..)
7import Time.Ext as Time
8import Tracks exposing (..)
9
10
11
12-- ENCODE
13
14
15encodeFavourite : Favourite -> Encode.Value
16encodeFavourite fav =
17 Encode.object
18 [ ( "artist", encodeMaybe fav.artist Encode.string )
19 , ( "title", Encode.string fav.title )
20 ]
21
22
23encodeGrouping : Grouping -> Encode.Value
24encodeGrouping v =
25 case v of
26 AddedOn ->
27 Encode.string "ADDED_ON"
28
29 Directory ->
30 Encode.string "DIRECTORY"
31
32 FirstAlphaCharacter ->
33 Encode.string "FIRST_ALPHA_CHARACTER"
34
35 TrackYear ->
36 Encode.string "TRACK_YEAR"
37
38
39encodeScene : Scene -> Encode.Value
40encodeScene scene =
41 case scene of
42 Covers ->
43 Encode.string "COVERS"
44
45 List ->
46 Encode.string "LIST"
47
48
49encodeSortBy : SortBy -> Encode.Value
50encodeSortBy v =
51 case v of
52 Artist ->
53 Encode.string "ARTIST"
54
55 Album ->
56 Encode.string "ALBUM"
57
58 PlaylistIndex ->
59 Encode.string "PLAYLIST_INDEX"
60
61 Title ->
62 Encode.string "TITLE"
63
64
65encodeSortDirection : SortDirection -> Encode.Value
66encodeSortDirection v =
67 case v of
68 Asc ->
69 Encode.string "ASC"
70
71 Desc ->
72 Encode.string "DESC"
73
74
75encodeTrack : Track -> Encode.Value
76encodeTrack track =
77 Encode.object
78 [ ( "id", Encode.string track.id )
79 , ( "insertedAt", Time.encode track.insertedAt )
80 , ( "path", Encode.string track.path )
81 , ( "sourceId", Encode.string track.sourceId )
82 , ( "tags", encodeTags track.tags )
83 ]
84
85
86encodeTags : Tags -> Encode.Value
87encodeTags tags =
88 Encode.object
89 [ ( "disc", Encode.int tags.disc )
90 , ( "nr", Encode.int tags.nr )
91
92 --
93 , ( "album", encodeMaybe tags.album Encode.string )
94 , ( "artist", encodeMaybe tags.artist Encode.string )
95 , ( "title", Encode.string tags.title )
96
97 --
98 , ( "genre", encodeMaybe tags.genre Encode.string )
99 , ( "picture", encodeMaybe tags.picture Encode.string )
100 , ( "year", encodeMaybe tags.year Encode.int )
101 ]
102
103
104
105-- DECODE
106
107
108decodeFavourite : Decode.Value -> Maybe Favourite
109decodeFavourite =
110 Decode.decodeValue favouriteDecoder
111 >> Result.toMaybe
112
113
114decodeTrack : Decode.Value -> Maybe Track
115decodeTrack =
116 Decode.decodeValue trackDecoder
117 >> Result.toMaybe
118
119
120favouriteDecoder : Decode.Decoder Favourite
121favouriteDecoder =
122 Decode.map2 Favourite
123 (Decode.maybe <| Decode.field "artist" Decode.string)
124 (Decode.field "title" Decode.string)
125
126
127groupingDecoder : Decode.Decoder Grouping
128groupingDecoder =
129 Decode.andThen
130 (\string ->
131 case string of
132 "ADDED_ON" ->
133 Decode.succeed AddedOn
134
135 "DIRECTORY" ->
136 Decode.succeed Directory
137
138 "FIRST_ALPHA_CHARACTER" ->
139 Decode.succeed FirstAlphaCharacter
140
141 "TRACK_YEAR" ->
142 Decode.succeed TrackYear
143
144 _ ->
145 Decode.fail "Invalid Grouping"
146 )
147 Decode.string
148
149
150sceneDecoder : Decode.Decoder Scene
151sceneDecoder =
152 Decode.andThen
153 (\string ->
154 case string of
155 "COVERS" ->
156 Decode.succeed Covers
157
158 "LIST" ->
159 Decode.succeed List
160
161 _ ->
162 Decode.fail "Invalid Scene"
163 )
164 Decode.string
165
166
167sortByDecoder : Decode.Decoder SortBy
168sortByDecoder =
169 Decode.andThen
170 (\string ->
171 case string of
172 "ARTIST" ->
173 Decode.succeed Artist
174
175 "ALBUM" ->
176 Decode.succeed Album
177
178 "PLAYLIST_INDEX" ->
179 Decode.succeed PlaylistIndex
180
181 "TITLE" ->
182 Decode.succeed Title
183
184 _ ->
185 Decode.fail "Invalid SortBy"
186 )
187 Decode.string
188
189
190sortDirectionDecoder : Decode.Decoder SortDirection
191sortDirectionDecoder =
192 Decode.andThen
193 (\string ->
194 case string of
195 "ASC" ->
196 Decode.succeed Asc
197
198 "DESC" ->
199 Decode.succeed Desc
200
201 _ ->
202 Decode.fail "Invalid SortDirection"
203 )
204 Decode.string
205
206
207tagsDecoder : Decode.Decoder Tags
208tagsDecoder =
209 Decode.map8 Tags
210 (Decode.field "disc" Decode.int)
211 (Decode.field "nr" Decode.int)
212 (Decode.maybe <| Decode.field "album" Decode.string)
213 (Decode.maybe <| Decode.field "artist" Decode.string)
214 (Decode.field "title" Decode.string)
215 (Decode.maybe <| Decode.field "genre" Decode.string)
216 (Decode.maybe <| Decode.field "picture" Decode.string)
217 (Decode.maybe <| Decode.field "year" Decode.int)
218
219
220trackDecoder : Decode.Decoder Track
221trackDecoder =
222 Decode.succeed Track
223 |> required "id" Decode.string
224 |> optional "insertedAt" Time.decoder Time.default
225 |> required "path" Decode.string
226 |> required "sourceId" Decode.string
227 |> required "tags" tagsDecoder