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
| MLLT
| SYTC
| USLT { enc :: Integer
, lang :: String
, descr :: String
, text :: String }
| SYLT { enc :: Integer
, lang :: String
, timeFormat :: Integer
, content :: Integer
, descr :: String }
| COMM { enc :: Integer
, lang :: String
, descr :: String
, text :: String }
| RVA2
| EQU2
| RVRB
| APIC { enc :: Integer
, mime :: String
, picType :: Word8
, descr :: String
, picData :: [Word8] }
| GEOB
| PCNT { counter :: Integer }
| POPM { email :: String
, rating :: Integer
, counter :: Integer }
| RBUF
| AENC
| LINK
| POSS
| USER { enc :: Integer
, lang :: String
, text :: String }
| OWNE
| COMR
| ENCR
| GRID
| PRIV { ownerId :: String
, privateData :: [Word8] }
| SIGN
| ASPI
| 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})
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
USLT enc0 lang0 descr0 text0 -> (fromInteger enc0) : (encodeAll [lang0, descr0]) ++ [0x00] ++ (encode text0)
COMM enc0 lang0 descr0 text0 -> (fromInteger enc0) : (encodeAll [lang0, descr0]) ++ [0x00] ++ (encode text0)
APIC enc0 mime0 picType0 descr0 picData0 -> (fromInteger enc0) : (encode mime0) ++ [0x00,picType0] ++ (encode descr0) ++[0x00]++ picData0
PCNT counter0 -> integerToWords 4 counter0
POPM email0 rating0 counter0 -> (encode email0) ++ [0x00, fromInteger rating0] ++ (integerToWords 4 counter0)
USER enc0 lang0 text0 -> (fromInteger enc0) : (encode lang0) ++ [0x00] ++ (encode text0)
PRIV ownerId0 privateData0 -> (encode ownerId0) ++ privateData0
TCMP isPart0 -> 0x03 : (encode $ if isPart0 then "1" else "0")
Unknown x -> x
f -> error $ "No pattern matched for encoding following frame: " ++ show f