packages feed

mpd-current-json-3.1.0.0: lib/MPD/Current/JSON/Parse.hs

{-# 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


-- | Builder for `Tags' from `Network.MPD.Song' that assigns `TagField' values
-- based on them being a single string or multi-value array.
getTags :: MPD.Song -> Tags
getTags song = Tags
  { artist                    = getTag Artist                     song
  , artistSort                = getTag ArtistSort                 song
  , album                     = getTag Album                      song
  , albumSort                 = getTag AlbumSort                  song
  , albumArtist               = getTag AlbumArtist                song
  , albumArtistSort           = getTag AlbumArtistSort            song
  , title                     = getTag Title                      song
  , track                     = getTag Track                      song
  , name                      = getTag Name                       song
  , genre                     = getTag Genre                      song
  , date                      = getTag Date                       song
  , originalDate              = getTag OriginalDate               song
  , composer                  = getTag Composer                   song
  , performer                 = getTag Performer                  song
  , conductor                 = getTag Conductor                  song
  , work                      = getTag Work                       song
  , grouping                  = getTag Grouping                   song
  , comment                   = getTag Comment                    song
  , disc                      = getTag Disc                       song
  , label                     = getTag Label                      song
  , musicbrainzArtistId       = getTag MUSICBRAINZ_ARTISTID       song
  , musicbrainzAlbumId        = getTag MUSICBRAINZ_ALBUMID        song
  , musicbrainzAlbumartistId  = getTag MUSICBRAINZ_ALBUMARTISTID  song
  , musicbrainzTrackId        = getTag MUSICBRAINZ_TRACKID        song
  , musicbrainzReleasetrackId = getTag MUSICBRAINZ_RELEASETRACKID song
  , musicbrainzWorkId         = getTag MUSICBRAINZ_WORKID         song
  }


-- | Parse single or multi `Network.MPD.Value'
getTag :: Metadata -> MPD.Song -> Maybe TagField
getTag tag song = tagSingleOrList (MPD.sgGetTag tag song)
  where
    tagSingleOrList :: Maybe [MPD.Value] -> Maybe TagField
    tagSingleOrList val = case val of
      Just [v] -> Just . SingleTagField $ MPD.toString v
      Just v -> Just . MultiTagField . reverse $ map MPD.toString v
      Nothing -> Nothing