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 :: String }
| Text { enc :: Integer
, text :: String }
| TXXX { enc :: Integer
, descr :: String
, text :: String }
| URL { url :: String }
| WXXX { enc :: Integer
, descr :: String
, url :: String }
| MCDI
| 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
| SIGN
| ASPI
| TCMP { isPart :: Bool }
| Unknown { value :: String }
deriving (Eq, Show)
encodeAll = concatMap encode
infoTextContent = accessor text (\x f -> f {text = x})
instance Parsed FrameInfo where
unparse inf = case inf of
UFID owner id -> (encode owner) ++ [0x00] ++ (encode id)
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)
USLT enc lang descr text -> (fromInteger enc) : (encodeAll [lang, descr]) ++ [0x00] ++ (encode text)
COMM enc lang descr text -> (fromInteger enc) : (encodeAll [lang, descr]) ++ [0x00] ++ (encode text)
APIC enc mime picType descr picData -> (fromInteger enc) : (encode mime) ++ [0x00,picType] ++ (encode descr) ++[0x00]++ picData
PCNT counter -> integerToWords 4 counter
POPM email rating counter -> (encode email) ++ [0x00, fromInteger rating] ++ (integerToWords 4 counter)
USER enc lang text -> (fromInteger enc) : (encode lang) ++ [0x00] ++ (encode text)
TCMP isPart -> 0x03 : (encode $ if isPart then "1" else "0")
Unknown x -> encode x
_ -> encode "unknown!!!"