{-# OPTIONS -fglasgow-exts #-} module Eg.Music.Music where import System.Time import Data.Char import Data.Dynamic data Music = Music { musicTitle :: String , musicArtist :: String , musicAlbum :: String , musicGenre :: String , musicSize :: Integer , musicSecs :: Int , musicTrackNum :: Int , musicTrackCount :: Int , musicYear :: Int , musicDate :: CalendarTime , musicSelected :: Bool } deriving (Eq, Show, Typeable) musicTime :: Music -> Double musicTime m = fromIntegral (round ((fromIntegral (musicSecs m)) / 0.6)) / 100.0; musicTrack :: Music -> String musicTrack m = (show (musicTrackNum m)) ++ " of " ++ (show (musicTrackCount m)) parseMusic line = let tokens = tokenise line in Music { musicTitle = tokens !! 0 , musicArtist = tokens !! 1 , musicAlbum = tokens !! 2 , musicGenre = tokens !! 3 , musicSize = read (tokens !! 4) , musicSecs = read (tokens !! 5) , musicTrackNum = read (tokens !! 6) , musicTrackCount = read (tokens !! 7) , musicYear = read (tokens !! 8) , musicDate = parseDatetime (tokens !! 9) , musicSelected = False } tokenise line = tokenise' line [] tokenise' [] acc = reverse acc tokenise' line acc = let (f, fs) = span ('\t' /=) line in tokenise' (myTail fs) (f:acc) myTail [] = [] myTail (x:xs) = xs parseDatetime s = let (m, r1) = span isDigit s (d, r2) = span isDigit (tail r1) (y, r3) = span isDigit (tail r2) (h, r4) = span isDigit (tail r3) (mi, r5) = span isDigit (tail r4) hour = if head (tail r5) == 'A' then (read h) else (read h) + 12 yr = read y year = case () of _ | yr < 50 -> 2000 + yr | yr >= 50 && yr < 100 -> 1900 + yr | otherwise -> yr in CalendarTime { ctYear = year , ctMonth = toEnum ((read m) - 1) , ctDay = read d , ctHour = hour , ctMin = read mi , ctSec = 0 , ctPicosec = 0 , ctWDay = Sunday , ctYDay = 0 , ctTZ = 0 , ctTZName = "" , ctIsDST = False }