A music player that connects to your cloud/distributed storage.
at main 5.4 kB view raw
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