{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
module MPD.Current.JSON.Parse
( getTags
) where
import MPD.Current.JSON.Types ( Tags(..), TagField(..) )
import Network.MPD ( Metadata(..) )
import qualified Network.MPD as MPD
getTags :: MPD.Song -> Tags
getTags :: Song -> Tags
getTags Song
song = Tags
{ artist :: Maybe TagField
artist = Metadata -> Song -> Maybe TagField
getTag Metadata
Artist Song
song
, artistSort :: Maybe TagField
artistSort = Metadata -> Song -> Maybe TagField
getTag Metadata
ArtistSort Song
song
, album :: Maybe TagField
album = Metadata -> Song -> Maybe TagField
getTag Metadata
Album Song
song
, albumSort :: Maybe TagField
albumSort = Metadata -> Song -> Maybe TagField
getTag Metadata
AlbumSort Song
song
, albumArtist :: Maybe TagField
albumArtist = Metadata -> Song -> Maybe TagField
getTag Metadata
AlbumArtist Song
song
, albumArtistSort :: Maybe TagField
albumArtistSort = Metadata -> Song -> Maybe TagField
getTag Metadata
AlbumArtistSort Song
song
, title :: Maybe TagField
title = Metadata -> Song -> Maybe TagField
getTag Metadata
Title Song
song
, track :: Maybe TagField
track = Metadata -> Song -> Maybe TagField
getTag Metadata
Track Song
song
, name :: Maybe TagField
name = Metadata -> Song -> Maybe TagField
getTag Metadata
Name Song
song
, genre :: Maybe TagField
genre = Metadata -> Song -> Maybe TagField
getTag Metadata
Genre Song
song
, date :: Maybe TagField
date = Metadata -> Song -> Maybe TagField
getTag Metadata
Date Song
song
, originalDate :: Maybe TagField
originalDate = Metadata -> Song -> Maybe TagField
getTag Metadata
OriginalDate Song
song
, composer :: Maybe TagField
composer = Metadata -> Song -> Maybe TagField
getTag Metadata
Composer Song
song
, performer :: Maybe TagField
performer = Metadata -> Song -> Maybe TagField
getTag Metadata
Performer Song
song
, conductor :: Maybe TagField
conductor = Metadata -> Song -> Maybe TagField
getTag Metadata
Conductor Song
song
, work :: Maybe TagField
work = Metadata -> Song -> Maybe TagField
getTag Metadata
Work Song
song
, grouping :: Maybe TagField
grouping = Metadata -> Song -> Maybe TagField
getTag Metadata
Grouping Song
song
, comment :: Maybe TagField
comment = Metadata -> Song -> Maybe TagField
getTag Metadata
Comment Song
song
, disc :: Maybe TagField
disc = Metadata -> Song -> Maybe TagField
getTag Metadata
Disc Song
song
, label :: Maybe TagField
label = Metadata -> Song -> Maybe TagField
getTag Metadata
Label Song
song
, musicbrainzArtistId :: Maybe TagField
musicbrainzArtistId = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_ARTISTID Song
song
, musicbrainzAlbumId :: Maybe TagField
musicbrainzAlbumId = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_ALBUMID Song
song
, musicbrainzAlbumartistId :: Maybe TagField
musicbrainzAlbumartistId = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_ALBUMARTISTID Song
song
, musicbrainzTrackId :: Maybe TagField
musicbrainzTrackId = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_TRACKID Song
song
, musicbrainzReleasetrackId :: Maybe TagField
musicbrainzReleasetrackId = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_RELEASETRACKID Song
song
, musicbrainzWorkId :: Maybe TagField
musicbrainzWorkId = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_WORKID Song
song
}
getTag :: Metadata -> MPD.Song -> Maybe TagField
getTag :: Metadata -> Song -> Maybe TagField
getTag Metadata
tag Song
song = Maybe [Value] -> Maybe TagField
tagSingleOrList (Metadata -> Song -> Maybe [Value]
MPD.sgGetTag Metadata
tag Song
song)
where
tagSingleOrList :: Maybe [MPD.Value] -> Maybe TagField
tagSingleOrList :: Maybe [Value] -> Maybe TagField
tagSingleOrList Maybe [Value]
val = case Maybe [Value]
val of
Just [Value
v] -> TagField -> Maybe TagField
forall a. a -> Maybe a
Just (TagField -> Maybe TagField)
-> (String -> TagField) -> String -> Maybe TagField
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> TagField
SingleTagField (String -> Maybe TagField) -> String -> Maybe TagField
forall a b. (a -> b) -> a -> b
$ Value -> String
forall a. ToString a => a -> String
MPD.toString Value
v
Just [Value]
v -> TagField -> Maybe TagField
forall a. a -> Maybe a
Just (TagField -> Maybe TagField)
-> ([String] -> TagField) -> [String] -> Maybe TagField
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> TagField
MultiTagField ([String] -> Maybe TagField) -> [String] -> Maybe TagField
forall a b. (a -> b) -> a -> b
$ (Value -> String) -> [Value] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Value -> String
forall a. ToString a => a -> String
MPD.toString [Value]
v
Maybe [Value]
Nothing -> Maybe TagField
forall a. Maybe a
Nothing