module ID3.Type.FrameInfo where import ID3.Parser.UnSync (synchronise, integerToWords) import ID3.Type.Unparse import Codec.Binary.UTF8.String (encode, encodeString, decode) import Data.Accessor import Data.Word (Word8) data FrameInfo = UFID { owner :: String , id :: [Word8] } | Text { enc :: Integer , text :: String } | TXXX { enc :: Integer , descr :: String , text :: String } | URL { url :: String } | WXXX { enc :: Integer , descr :: String , url :: String } | MCDI { tocData :: [Word8] } | ETCO -- { format :: Integer -- , events :: [Event]} -- TODO | MLLT -- TODO | SYTC -- TODO | USLT { enc :: Integer , lang :: String , descr :: String , text :: String } | SYLT { enc :: Integer , lang :: String , timeFormat :: Integer , content :: Integer , descr :: String } -- .... TODO | COMM { enc :: Integer , lang :: String , descr :: String , text :: String } | RVA2 -- TODO | EQU2 -- TODO | RVRB -- TODO | APIC { enc :: Integer , mime :: String , picType :: Word8 , descr :: String , picData :: [Word8] } -- .... TODO | GEOB -- TODO | PCNT { counter :: Integer } | POPM { email :: String , rating :: Integer , counter :: Integer } | RBUF -- TODO | AENC -- TODO | LINK -- TODO | POSS -- TODO | USER { enc :: Integer , lang :: String , text :: String } | OWNE -- TODO | COMR -- TODO | ENCR -- TODO | GRID -- TODO | PRIV { ownerId :: String , privateData :: [Word8] } | SIGN -- TODO | ASPI -- TODO -- not native | TCMP { isPart :: Bool } | Unknown { frameData :: [Word8] } deriving (Eq, Show) encodeAll = concatMap encode infoTextContent = accessor text (\x f -> f {text = x}) --url = accessor (encode . url) (\x f -> f {url = decode x}) instance Parsed FrameInfo where unparse inf = case inf of UFID owner theid -> (encode owner) ++ [0x00] ++ theid Text enc text -> (fromInteger enc) : (encode text) TXXX enc descr text -> (fromInteger enc) : (encode descr) ++ [0x00] ++ (encode text) URL url -> encode url WXXX enc descr url -> (fromInteger enc) : (encode descr) ++ [0x00] ++ (encode url) MCDI tocData -> tocData --ETCO -- { format :: Integer -- , events :: [Event]} -- TODO --MLLT -- TODO --SYTC -- TODO USLT enc lang descr text -> (fromInteger enc) : (encodeAll [lang, descr]) ++ [0x00] ++ (encode text) --SYLT enc lang timeFormat content descr COMM enc lang descr text -> (fromInteger enc) : (encodeAll [lang, descr]) ++ [0x00] ++ (encode text) --RVA2 -- TODO --EQU2 -- TODO --RVRB -- TODO APIC enc mime picType descr picData -> (fromInteger enc) : (encode mime) ++ [0x00,picType] ++ (encode descr) ++[0x00]++ picData --GEOB -- TODO PCNT counter -> integerToWords 4 counter POPM email rating counter -> (encode email) ++ [0x00, fromInteger rating] ++ (integerToWords 4 counter) --RBUF -- TODO --AENC -- TODO --LINK -- TODO --POSS -- TODO USER enc lang text -> (fromInteger enc) : (encode lang) ++ [0x00] ++ (encode text) --OWNE -- TODO --COMR -- TODO --ENCR -- TODO --GRID -- TODO PRIV ownerId privateData -> (encode ownerId) ++ privateData --SIGN -- TODO --ASPI -- TODO TCMP isPart -> 0x03 : (encode $ if isPart then "1" else "0") Unknown x -> x f -> error $ "No pattern matched for encoding following frame: " ++ show f