module ID3.WriteTag
( hWriteTag
, writeTag
) where
import ID3.Type
import ID3.Parser
import ID3.ReadTag
import Data.Accessor
import System.IO
import System.IO.Binary
hWriteTag :: ID3Tag -> Handle -> IO ()
hWriteTag newTag hdl = do
smth <- hReadTag hdl
case smth of
Nothing -> insertTag (padding^=pad $ newTag) 0
Just oldTag ->
let diff = (getFullSize oldTag) (getActualSize newTag)
in if diff <= 0
then insertTag (padding^=pad $ newTag) $ 10 + (oldTag^.size)
else do
hSeek hdl AbsoluteSeek 0
hPutBufStr hdl (unparse (padding^=diff $ newTag))
where
pad = 4096
insertTag t pos = do
hSeek hdl AbsoluteSeek pos
rest <- hGetBufStr hdl . fromInteger =<< hFileSize hdl
hSeek hdl AbsoluteSeek 0
hPutBufStr hdl (unparse t ++ rest)
writeTag :: FilePath -> ID3Tag -> IO ()
writeTag file = withBinaryFile file ReadWriteMode . hWriteTag