vimus-0.1.0: src/Song.hs
-- | Songs metadata
module Song (
metaQueries
, album
, artist
, title
, track
) where
import Data.List (intercalate)
import Data.Map (Map)
import qualified Data.Map as Map
import Prelude hiding (length)
import qualified System.FilePath as FilePath
import Text.Printf (printf)
import qualified Network.MPD as MPD hiding (withMPD)
type MetaQuery = MPD.Song -> Maybe String
metaQueries :: Map String MetaQuery
metaQueries = Map.fromList
[ ("artist" , artist)
, ("album" , album)
, ("title" , title)
, ("track" , track)
, ("genre" , genre)
, ("year" , year)
, ("composer" , composer)
, ("performer" , performer)
, ("comment" , comment)
, ("disc" , disc)
, ("length" , length)
, ("filename" , filename)
, ("directory" , directory)
]
-- | Song tags queries
artist, album, title, track, genre, year, composer, performer, comment, disc :: MetaQuery
[artist, album, title, genre, year, composer, performer, comment, disc] =
map lookupMetadata
[ MPD.Artist
, MPD.Album
, MPD.Title
, MPD.Genre
, MPD.Date
, MPD.Composer
, MPD.Performer
, MPD.Comment
, MPD.Disc
]
track = fmap (printf "%02s") . lookupMetadata MPD.Track
-- | Get comma-separated list of meta data
lookupMetadata :: MPD.Metadata -> MetaQuery
lookupMetadata key song = case Map.lookup key tags of
Nothing -> Nothing
Just xs -> Just $ intercalate ", " (map MPD.toString xs)
where
tags = MPD.sgTags song
-- | Song file queries
length, filename, directory :: MetaQuery
length s =
let (minutes, seconds) = MPD.sgLength s `divMod` 60
in Just $ printf "%d:%02d" minutes seconds
filename = Just . FilePath.takeFileName . MPD.toString . MPD.sgFilePath
directory = Just . FilePath.takeDirectory . MPD.toString . MPD.sgFilePath