A music player that connects to your cloud/distributed storage. diffuse.sh
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228module Tracks.Encoding exposing (..)
import Json.Decode as Decodeimport Json.Decode.Pipeline exposing (optional, required)import Json.Encode as Encodeimport Json.Encode.Ext exposing (..)import Time.Ext as Timeimport Tracks exposing (..)
-- ENCODE
encodeFavourite : Favourite -> Encode.ValueencodeFavourite fav = Encode.object [ ( "artist", encodeMaybe fav.artist Encode.string ) , ( "title", Encode.string fav.title ) ]
encodeGrouping : Grouping -> Encode.ValueencodeGrouping v = case v of AddedOn -> Encode.string "ADDED_ON"
Directory -> Encode.string "DIRECTORY"
FirstAlphaCharacter -> Encode.string "FIRST_ALPHA_CHARACTER"
TrackYear -> Encode.string "TRACK_YEAR"
encodeScene : Scene -> Encode.ValueencodeScene scene = case scene of Covers -> Encode.string "COVERS"
List -> Encode.string "LIST"
encodeSortBy : SortBy -> Encode.ValueencodeSortBy v = case v of Artist -> Encode.string "ARTIST"
Album -> Encode.string "ALBUM"
PlaylistIndex -> Encode.string "PLAYLIST_INDEX"
Title -> Encode.string "TITLE"
encodeSortDirection : SortDirection -> Encode.ValueencodeSortDirection v = case v of Asc -> Encode.string "ASC"
Desc -> Encode.string "DESC"
encodeTrack : Track -> Encode.ValueencodeTrack track = Encode.object [ ( "id", Encode.string track.id ) , ( "insertedAt", Time.encode track.insertedAt ) , ( "path", Encode.string track.path ) , ( "sourceId", Encode.string track.sourceId ) , ( "tags", encodeTags track.tags ) ]
encodeTags : Tags -> Encode.ValueencodeTags tags = Encode.object [ ( "disc", Encode.int tags.disc ) , ( "nr", Encode.int tags.nr )
-- , ( "album", encodeMaybe tags.album Encode.string ) , ( "artist", encodeMaybe tags.artist Encode.string ) , ( "title", Encode.string tags.title )
-- , ( "genre", encodeMaybe tags.genre Encode.string ) , ( "picture", encodeMaybe tags.picture Encode.string ) , ( "year", encodeMaybe tags.year Encode.int ) ]
-- DECODE
decodeFavourite : Decode.Value -> Maybe FavouritedecodeFavourite = Decode.decodeValue favouriteDecoder >> Result.toMaybe
decodeTrack : Decode.Value -> Maybe TrackdecodeTrack = Decode.decodeValue trackDecoder >> Result.toMaybe
favouriteDecoder : Decode.Decoder FavouritefavouriteDecoder = Decode.map2 Favourite (Decode.maybe <| Decode.field "artist" Decode.string) (Decode.field "title" Decode.string)
groupingDecoder : Decode.Decoder GroupinggroupingDecoder = Decode.andThen (\string -> case string of "ADDED_ON" -> Decode.succeed AddedOn
"DIRECTORY" -> Decode.succeed Directory
"FIRST_ALPHA_CHARACTER" -> Decode.succeed FirstAlphaCharacter
"TRACK_YEAR" -> Decode.succeed TrackYear
_ -> Decode.fail "Invalid Grouping" ) Decode.string
sceneDecoder : Decode.Decoder ScenesceneDecoder = Decode.andThen (\string -> case string of "COVERS" -> Decode.succeed Covers
"LIST" -> Decode.succeed List
_ -> Decode.fail "Invalid Scene" ) Decode.string
sortByDecoder : Decode.Decoder SortBysortByDecoder = Decode.andThen (\string -> case string of "ARTIST" -> Decode.succeed Artist
"ALBUM" -> Decode.succeed Album
"PLAYLIST_INDEX" -> Decode.succeed PlaylistIndex
"TITLE" -> Decode.succeed Title
_ -> Decode.fail "Invalid SortBy" ) Decode.string
sortDirectionDecoder : Decode.Decoder SortDirectionsortDirectionDecoder = Decode.andThen (\string -> case string of "ASC" -> Decode.succeed Asc
"DESC" -> Decode.succeed Desc
_ -> Decode.fail "Invalid SortDirection" ) Decode.string
tagsDecoder : Decode.Decoder TagstagsDecoder = Decode.map8 Tags (Decode.field "disc" Decode.int) (Decode.field "nr" Decode.int) (Decode.maybe <| Decode.field "album" Decode.string) (Decode.maybe <| Decode.field "artist" Decode.string) (Decode.field "title" Decode.string) (Decode.maybe <| Decode.field "genre" Decode.string) (Decode.maybe <| Decode.field "picture" Decode.string) (Decode.maybe <| Decode.field "year" Decode.int)
trackDecoder : Decode.Decoder TracktrackDecoder = Decode.succeed Track |> required "id" Decode.string |> optional "insertedAt" Time.decoder Time.default |> required "path" Decode.string |> required "sourceId" Decode.string |> required "tags" tagsDecoder