idiii-0.1: src/ID3/Parser/Header.hs
{- |
This module provides parsers for Header.
(<http://www.id3.org/id3v2.4.0-structure>)
-}
module ID3.Parser.Header
( parseHeader
, parseFooter
)
where
---- IMPORTS
import Text.ParserCombinators.Poly.State
import ID3.Parser.General
import ID3.Type.Header
import ID3.Type.Flags
import Data.Accessor
----
---,-----------------------------
-- | Parses id3v2 'Header'
parseHeader :: TagParser ID3Header
parseHeader = do
string "ID3" `err` "ID3"
parseHeader_
parseHeader_ = do
v <- parseVersion `err` "tag version"
f <- parseFlags `err` "tag flags"
s <- parseTagSize `err` "tag size"
return $ initID3Header [tagVersion^=v, tagFlags^=f, tagSize^=s]
parseVersion :: TagParser TagVersion
parseVersion = do
v1 <- anyWord8
v2 <- anyWord8
return $ (v1, v2)
parseFlags :: TagParser TagFlags
parseFlags = do
fs <- parseFlags_ [1..4]
return $ mkFlags [1..4] fs
-- i.e. %abcd0000
parseTagSize :: TagParser TagSize
parseTagSize = parseSize 4 True
{- | /ID3v2 FOOTER/ (optional)
To speed up the process of locating an ID3v2 tag when searching from
the end of a file, a footer can be added to the tag. It is REQUIRED
to add a footer to an appended tag, i.e. a tag located after all
audio data. The footer is a copy of the header, but with a different
identifier.
@
ID3v2 identifier \"3DI\"
ID3v2 version $04 00
ID3v2 flags %abcd0000
ID3v2 size 4 * %0xxxxxxx
@
-}
parseFooter :: TagParser ID3Header
parseFooter = do
string "3DI"
parseHeader_