module ID3.Parser.ExtHeader
(parseExtHeader)
where
import ID3.Parser.General
import ID3.Type.ExtHeader
import Data.Accessor
import Data.Bits (testBit)
import Data.Word (Word8)
parseExtHeader :: TagParser ID3ExtHeader
parseExtHeader = do
s <- parseSize 4 True `err` "ext header size"
_ <- word8 0x01 `err` "ext header pre-flags"
flags <- anyWord8 `err` "ext header flags"
let (b, c, d) = (testBit flags 6, testBit flags 5, testBit flags 4)
bb <- if b then parseB else return False
cc <- if c
then do
crc <- parseC
return $ Just crc
else return Nothing
dd <- if d then parseD else return False
return $ initID3ExtHeader [ extSize^=s
, isUpdate^=bb
, crcData^=cc
, restrictionsPresent^=dd
]
parseB :: TagParser Bool
parseB = do
_ <- word8 0x00
return True
parseC :: TagParser [Word8]
parseC = do
_ <- word8 0x05
count (5::Integer) anyWord8
parseD :: TagParser Bool
parseD = do
_ <- word8 0x01
_ <- anyWord8
return True