idiii-0.0: src/ID3/ReadTag.hs
module ID3.ReadTag
( hReadTag
, readTag
) where
import Data.Accessor
import ID3.Parser.Tag
import ID3.Parser.Header
import ID3.Type.Header
import System.IO
import System.IO.Binary
hReadTag :: Handle -> IO (Maybe ID3Tag)
hReadTag hdl = do
hSeek hdl AbsoluteSeek 0
beginning <- hGetBufStr hdl 10
case run parseHeader beginning of
(Left _ , _) -> return Nothing
(Right header, _) -> do
chunk <- hGetBufStr hdl $ fromInteger (header^.tagSize)
case run (parseTag_ header) chunk of
(Left _ , _) -> return Nothing
(Right tag, _) -> return (Just tag)
readTag :: FilePath -> IO (Maybe ID3Tag)
readTag file = withBinaryFile file ReadWriteMode hReadTag