idiii-0.0: src/ID3/WriteTag.hs
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
--import Data.Word (Word8)
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))
--rest <- readFrom $ 10+(oldTag^.size) :: IO [Word8]
--withBinaryFile "_m.mp3" WriteMode $ \h -> hPutBufStr h rest
where
pad = 4096 -- default padding size
insertTag t pos = do
hSeek hdl AbsoluteSeek pos
rest <- hGetBufStr hdl . fromInteger =<< hFileSize hdl
--withBinaryFile "_m.mp3" WriteMode $ \h -> hPutBufStr h rest
hSeek hdl AbsoluteSeek 0
hPutBufStr hdl (unparse t ++ rest)
writeTag :: FilePath -> ID3Tag -> IO ()
writeTag file = withBinaryFile file ReadWriteMode . hWriteTag