idiii-0.1.3: src/ID3/Type/FrameInfo.hs
module ID3.Type.FrameInfo where
import ID3.Parser.UnSync (integerToWords)
import ID3.Type.Unparse
import Codec.Binary.UTF8.String (encode)
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 :: [String] -> [Word8]
encodeAll = concatMap encode
infoTextContent :: Accessor FrameInfo String
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 owner0 theid0 -> (encode owner0) ++ [0x00] ++ theid0
Text enc0 text0 -> (fromInteger enc0) : (encode text0)
TXXX enc0 descr0 text0 -> (fromInteger enc0) : (encode descr0) ++ [0x00] ++ (encode text0)
URL url0 -> encode url0
WXXX enc0 descr0 url0 -> (fromInteger enc0) : (encode descr0) ++ [0x00] ++ (encode url0)
MCDI tocData0 -> tocData0
--ETCO -- { format :: Integer
-- , events :: [Event]} -- TODO
--MLLT -- TODO
--SYTC -- TODO
USLT enc0 lang0 descr0 text0 -> (fromInteger enc0) : (encodeAll [lang0, descr0]) ++ [0x00] ++ (encode text0)
--SYLT enc lang timeFormat content descr
COMM enc0 lang0 descr0 text0 -> (fromInteger enc0) : (encodeAll [lang0, descr0]) ++ [0x00] ++ (encode text0)
--RVA2 -- TODO
--EQU2 -- TODO
--RVRB -- TODO
APIC enc0 mime0 picType0 descr0 picData0 -> (fromInteger enc0) : (encode mime0) ++ [0x00,picType0] ++ (encode descr0) ++[0x00]++ picData0
--GEOB -- TODO
PCNT counter0 -> integerToWords 4 counter0
POPM email0 rating0 counter0 -> (encode email0) ++ [0x00, fromInteger rating0] ++ (integerToWords 4 counter0)
--RBUF -- TODO
--AENC -- TODO
--LINK -- TODO
--POSS -- TODO
USER enc0 lang0 text0 -> (fromInteger enc0) : (encode lang0) ++ [0x00] ++ (encode text0)
--OWNE -- TODO
--COMR -- TODO
--ENCR -- TODO
--GRID -- TODO
PRIV ownerId0 privateData0 -> (encode ownerId0) ++ privateData0
--SIGN -- TODO
--ASPI -- TODO
TCMP isPart0 -> 0x03 : (encode $ if isPart0 then "1" else "0")
Unknown x -> x
f -> error $ "No pattern matched for encoding following frame: " ++ show f