{-# LANGUAGE ConstrainedClassMethods #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Codec.Audio.FLAC.Metadata
(
FlacMeta,
MetaSettings (..),
defaultMetaSettings,
MetaException (..),
MetaChainStatus (..),
runFlacMeta,
MetaValue (..),
MinBlockSize (..),
MaxBlockSize (..),
MinFrameSize (..),
MaxFrameSize (..),
SampleRate (..),
Channels (..),
ChannelMask (..),
BitsPerSample (..),
TotalSamples (..),
FileSize (..),
BitRate (..),
MD5Sum (..),
Duration (..),
Application (..),
ApplicationId,
mkApplicationId,
unApplicationId,
SeekTable (..),
SeekPoint (..),
VorbisVendor (..),
VorbisComment (..),
VorbisField (..),
CueSheet (..),
Picture (..),
PictureType (..),
PictureData (..),
wipeVorbisComment,
wipeApplications,
wipeSeekTable,
wipeCueSheets,
wipePictures,
MetadataType (..),
getMetaChain,
isMetaChainModified,
)
where
import Codec.Audio.FLAC.Metadata.Internal.Level2Interface
import Codec.Audio.FLAC.Metadata.Internal.Level2Interface.Helpers
import Codec.Audio.FLAC.Metadata.Internal.Object
import Codec.Audio.FLAC.Metadata.Internal.Types
import Codec.Audio.Wave
import Control.Monad
import Control.Monad.Catch
import Control.Monad.Except
import Control.Monad.Reader
import Data.Bool (bool)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B8
import Data.Char (toUpper)
import Data.IORef
import Data.Kind (Constraint, Type)
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.List.NonEmpty as NE
import Data.Maybe (fromJust, listToMaybe)
import Data.Set (Set)
import qualified Data.Set as E
import Data.Text (Text)
import Data.Vector (Vector)
import qualified Data.Vector as V
import Foreign hiding (void)
import GHC.TypeLits
import Numeric.Natural
import System.IO
newtype FlacMeta a = FlacMeta {FlacMeta a -> Inner a
unFlacMeta :: Inner a}
deriving
( a -> FlacMeta b -> FlacMeta a
(a -> b) -> FlacMeta a -> FlacMeta b
(forall a b. (a -> b) -> FlacMeta a -> FlacMeta b)
-> (forall a b. a -> FlacMeta b -> FlacMeta a) -> Functor FlacMeta
forall a b. a -> FlacMeta b -> FlacMeta a
forall a b. (a -> b) -> FlacMeta a -> FlacMeta b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> FlacMeta b -> FlacMeta a
$c<$ :: forall a b. a -> FlacMeta b -> FlacMeta a
fmap :: (a -> b) -> FlacMeta a -> FlacMeta b
$cfmap :: forall a b. (a -> b) -> FlacMeta a -> FlacMeta b
Functor,
Functor FlacMeta
a -> FlacMeta a
Functor FlacMeta =>
(forall a. a -> FlacMeta a)
-> (forall a b. FlacMeta (a -> b) -> FlacMeta a -> FlacMeta b)
-> (forall a b c.
(a -> b -> c) -> FlacMeta a -> FlacMeta b -> FlacMeta c)
-> (forall a b. FlacMeta a -> FlacMeta b -> FlacMeta b)
-> (forall a b. FlacMeta a -> FlacMeta b -> FlacMeta a)
-> Applicative FlacMeta
FlacMeta a -> FlacMeta b -> FlacMeta b
FlacMeta a -> FlacMeta b -> FlacMeta a
FlacMeta (a -> b) -> FlacMeta a -> FlacMeta b
(a -> b -> c) -> FlacMeta a -> FlacMeta b -> FlacMeta c
forall a. a -> FlacMeta a
forall a b. FlacMeta a -> FlacMeta b -> FlacMeta a
forall a b. FlacMeta a -> FlacMeta b -> FlacMeta b
forall a b. FlacMeta (a -> b) -> FlacMeta a -> FlacMeta b
forall a b c.
(a -> b -> c) -> FlacMeta a -> FlacMeta b -> FlacMeta c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: FlacMeta a -> FlacMeta b -> FlacMeta a
$c<* :: forall a b. FlacMeta a -> FlacMeta b -> FlacMeta a
*> :: FlacMeta a -> FlacMeta b -> FlacMeta b
$c*> :: forall a b. FlacMeta a -> FlacMeta b -> FlacMeta b
liftA2 :: (a -> b -> c) -> FlacMeta a -> FlacMeta b -> FlacMeta c
$cliftA2 :: forall a b c.
(a -> b -> c) -> FlacMeta a -> FlacMeta b -> FlacMeta c
<*> :: FlacMeta (a -> b) -> FlacMeta a -> FlacMeta b
$c<*> :: forall a b. FlacMeta (a -> b) -> FlacMeta a -> FlacMeta b
pure :: a -> FlacMeta a
$cpure :: forall a. a -> FlacMeta a
$cp1Applicative :: Functor FlacMeta
Applicative,
Applicative FlacMeta
a -> FlacMeta a
Applicative FlacMeta =>
(forall a b. FlacMeta a -> (a -> FlacMeta b) -> FlacMeta b)
-> (forall a b. FlacMeta a -> FlacMeta b -> FlacMeta b)
-> (forall a. a -> FlacMeta a)
-> Monad FlacMeta
FlacMeta a -> (a -> FlacMeta b) -> FlacMeta b
FlacMeta a -> FlacMeta b -> FlacMeta b
forall a. a -> FlacMeta a
forall a b. FlacMeta a -> FlacMeta b -> FlacMeta b
forall a b. FlacMeta a -> (a -> FlacMeta b) -> FlacMeta b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> FlacMeta a
$creturn :: forall a. a -> FlacMeta a
>> :: FlacMeta a -> FlacMeta b -> FlacMeta b
$c>> :: forall a b. FlacMeta a -> FlacMeta b -> FlacMeta b
>>= :: FlacMeta a -> (a -> FlacMeta b) -> FlacMeta b
$c>>= :: forall a b. FlacMeta a -> (a -> FlacMeta b) -> FlacMeta b
$cp1Monad :: Applicative FlacMeta
Monad,
Monad FlacMeta
Monad FlacMeta =>
(forall a. IO a -> FlacMeta a) -> MonadIO FlacMeta
IO a -> FlacMeta a
forall a. IO a -> FlacMeta a
forall (m :: * -> *).
Monad m =>
(forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> FlacMeta a
$cliftIO :: forall a. IO a -> FlacMeta a
$cp1MonadIO :: Monad FlacMeta
MonadIO,
Monad FlacMeta
e -> FlacMeta a
Monad FlacMeta =>
(forall e a. Exception e => e -> FlacMeta a) -> MonadThrow FlacMeta
forall e a. Exception e => e -> FlacMeta a
forall (m :: * -> *).
Monad m =>
(forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> FlacMeta a
$cthrowM :: forall e a. Exception e => e -> FlacMeta a
$cp1MonadThrow :: Monad FlacMeta
MonadThrow,
MonadThrow FlacMeta
MonadThrow FlacMeta =>
(forall e a.
Exception e =>
FlacMeta a -> (e -> FlacMeta a) -> FlacMeta a)
-> MonadCatch FlacMeta
FlacMeta a -> (e -> FlacMeta a) -> FlacMeta a
forall e a.
Exception e =>
FlacMeta a -> (e -> FlacMeta a) -> FlacMeta a
forall (m :: * -> *).
MonadThrow m =>
(forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: FlacMeta a -> (e -> FlacMeta a) -> FlacMeta a
$ccatch :: forall e a.
Exception e =>
FlacMeta a -> (e -> FlacMeta a) -> FlacMeta a
$cp1MonadCatch :: MonadThrow FlacMeta
MonadCatch,
MonadCatch FlacMeta
MonadCatch FlacMeta =>
(forall b.
((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b)
-> (forall b.
((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b)
-> (forall a b c.
FlacMeta a
-> (a -> ExitCase b -> FlacMeta c)
-> (a -> FlacMeta b)
-> FlacMeta (b, c))
-> MonadMask FlacMeta
FlacMeta a
-> (a -> ExitCase b -> FlacMeta c)
-> (a -> FlacMeta b)
-> FlacMeta (b, c)
((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b
((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b
forall b.
((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b
forall a b c.
FlacMeta a
-> (a -> ExitCase b -> FlacMeta c)
-> (a -> FlacMeta b)
-> FlacMeta (b, c)
forall (m :: * -> *).
MonadCatch m =>
(forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: FlacMeta a
-> (a -> ExitCase b -> FlacMeta c)
-> (a -> FlacMeta b)
-> FlacMeta (b, c)
$cgeneralBracket :: forall a b c.
FlacMeta a
-> (a -> ExitCase b -> FlacMeta c)
-> (a -> FlacMeta b)
-> FlacMeta (b, c)
uninterruptibleMask :: ((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b
$cuninterruptibleMask :: forall b.
((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b
mask :: ((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b
$cmask :: forall b.
((forall a. FlacMeta a -> FlacMeta a) -> FlacMeta b) -> FlacMeta b
$cp1MonadMask :: MonadCatch FlacMeta
MonadMask
)
type Inner a = ReaderT Context IO a
data Context = Context
{
Context -> MetaChain
metaChain :: MetaChain,
Context -> IORef Bool
metaModified :: IORef Bool,
Context -> Natural
metaFileSize :: Natural
}
data MetaSettings = MetaSettings
{
MetaSettings -> Bool
metaAutoVacuum :: !Bool,
MetaSettings -> Bool
metaSortPadding :: !Bool,
MetaSettings -> Bool
metaUsePadding :: !Bool,
MetaSettings -> Bool
metaPreserveFileStats :: !Bool
}
deriving (Int -> MetaSettings -> ShowS
[MetaSettings] -> ShowS
MetaSettings -> String
(Int -> MetaSettings -> ShowS)
-> (MetaSettings -> String)
-> ([MetaSettings] -> ShowS)
-> Show MetaSettings
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MetaSettings] -> ShowS
$cshowList :: [MetaSettings] -> ShowS
show :: MetaSettings -> String
$cshow :: MetaSettings -> String
showsPrec :: Int -> MetaSettings -> ShowS
$cshowsPrec :: Int -> MetaSettings -> ShowS
Show, ReadPrec [MetaSettings]
ReadPrec MetaSettings
Int -> ReadS MetaSettings
ReadS [MetaSettings]
(Int -> ReadS MetaSettings)
-> ReadS [MetaSettings]
-> ReadPrec MetaSettings
-> ReadPrec [MetaSettings]
-> Read MetaSettings
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MetaSettings]
$creadListPrec :: ReadPrec [MetaSettings]
readPrec :: ReadPrec MetaSettings
$creadPrec :: ReadPrec MetaSettings
readList :: ReadS [MetaSettings]
$creadList :: ReadS [MetaSettings]
readsPrec :: Int -> ReadS MetaSettings
$creadsPrec :: Int -> ReadS MetaSettings
Read, MetaSettings -> MetaSettings -> Bool
(MetaSettings -> MetaSettings -> Bool)
-> (MetaSettings -> MetaSettings -> Bool) -> Eq MetaSettings
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MetaSettings -> MetaSettings -> Bool
$c/= :: MetaSettings -> MetaSettings -> Bool
== :: MetaSettings -> MetaSettings -> Bool
$c== :: MetaSettings -> MetaSettings -> Bool
Eq, Eq MetaSettings
Eq MetaSettings =>
(MetaSettings -> MetaSettings -> Ordering)
-> (MetaSettings -> MetaSettings -> Bool)
-> (MetaSettings -> MetaSettings -> Bool)
-> (MetaSettings -> MetaSettings -> Bool)
-> (MetaSettings -> MetaSettings -> Bool)
-> (MetaSettings -> MetaSettings -> MetaSettings)
-> (MetaSettings -> MetaSettings -> MetaSettings)
-> Ord MetaSettings
MetaSettings -> MetaSettings -> Bool
MetaSettings -> MetaSettings -> Ordering
MetaSettings -> MetaSettings -> MetaSettings
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MetaSettings -> MetaSettings -> MetaSettings
$cmin :: MetaSettings -> MetaSettings -> MetaSettings
max :: MetaSettings -> MetaSettings -> MetaSettings
$cmax :: MetaSettings -> MetaSettings -> MetaSettings
>= :: MetaSettings -> MetaSettings -> Bool
$c>= :: MetaSettings -> MetaSettings -> Bool
> :: MetaSettings -> MetaSettings -> Bool
$c> :: MetaSettings -> MetaSettings -> Bool
<= :: MetaSettings -> MetaSettings -> Bool
$c<= :: MetaSettings -> MetaSettings -> Bool
< :: MetaSettings -> MetaSettings -> Bool
$c< :: MetaSettings -> MetaSettings -> Bool
compare :: MetaSettings -> MetaSettings -> Ordering
$ccompare :: MetaSettings -> MetaSettings -> Ordering
$cp1Ord :: Eq MetaSettings
Ord)
defaultMetaSettings :: MetaSettings
defaultMetaSettings :: MetaSettings
defaultMetaSettings =
$WMetaSettings :: Bool -> Bool -> Bool -> Bool -> MetaSettings
MetaSettings
{ metaAutoVacuum :: Bool
metaAutoVacuum = Bool
True,
metaSortPadding :: Bool
metaSortPadding = Bool
True,
metaUsePadding :: Bool
metaUsePadding = Bool
True,
metaPreserveFileStats :: Bool
metaPreserveFileStats = Bool
True
}
runFlacMeta ::
MonadIO m =>
MetaSettings ->
FilePath ->
FlacMeta a ->
m a
runFlacMeta :: MetaSettings -> String -> FlacMeta a -> m a
runFlacMeta MetaSettings {..} path :: String
path m :: FlacMeta a
m = IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a)
-> ((MetaChain -> IO a) -> IO a) -> (MetaChain -> IO a) -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaChain -> IO a) -> IO a
forall a. (MetaChain -> IO a) -> IO a
withChain ((MetaChain -> IO a) -> m a) -> (MetaChain -> IO a) -> m a
forall a b. (a -> b) -> a -> b
$ \metaChain :: MetaChain
metaChain -> do
IORef Bool
metaModified <- Bool -> IO (IORef Bool)
forall a. a -> IO (IORef a)
newIORef Bool
False
Natural
metaFileSize <- Integer -> Natural
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> Natural) -> IO Integer -> IO Natural
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IOMode -> (Handle -> IO Integer) -> IO Integer
forall r. String -> IOMode -> (Handle -> IO r) -> IO r
withFile String
path IOMode
ReadMode Handle -> IO Integer
hFileSize
(ReaderT Context IO a -> Context -> IO a)
-> Context -> ReaderT Context IO a -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT Context IO a -> Context -> IO a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Context :: MetaChain -> IORef Bool -> Natural -> Context
Context {..} (ReaderT Context IO a -> IO a) -> ReaderT Context IO a -> IO a
forall a b. (a -> b) -> a -> b
$ do
IO Bool -> Inner ()
liftBool (MetaChain -> String -> IO Bool
chainRead MetaChain
metaChain String
path)
a
result <- FlacMeta a -> ReaderT Context IO a
forall a. FlacMeta a -> Inner a
unFlacMeta FlacMeta a
m
Bool
modified <- IO Bool -> ReaderT Context IO Bool
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IORef Bool -> IO Bool
forall a. IORef a -> IO a
readIORef IORef Bool
metaModified)
Bool -> Inner () -> Inner ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
modified (Inner () -> Inner ()) -> Inner () -> Inner ()
forall a b. (a -> b) -> a -> b
$ do
Bool -> Inner () -> Inner ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
metaAutoVacuum Inner ()
applyVacuum
Bool -> Inner () -> Inner ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
metaSortPadding (Inner () -> Inner ()) -> Inner () -> Inner ()
forall a b. (a -> b) -> a -> b
$
IO () -> Inner ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaChain -> IO ()
chainSortPadding MetaChain
metaChain)
IO Bool -> Inner ()
liftBool
(MetaChain -> Bool -> Bool -> IO Bool
chainWrite MetaChain
metaChain Bool
metaUsePadding Bool
metaPreserveFileStats)
a -> ReaderT Context IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result
class MetaValue a where
type MetaType a :: Type
type MetaWritable a :: Constraint
retrieve :: a -> FlacMeta (MetaType a)
(=->) :: MetaWritable a => a -> MetaType a -> FlacMeta ()
_ =-> _ = String -> FlacMeta ()
forall a. HasCallStack => String -> a
error "Codec.Audio.FLAC.Metadata.(=->) is not defined"
infix 1 =->
type NotWritable = 'Text "This attribute is not writable."
data MinBlockSize = MinBlockSize
instance MetaValue MinBlockSize where
type MetaType MinBlockSize = Word32
type MetaWritable MinBlockSize = TypeError NotWritable
retrieve :: MinBlockSize -> FlacMeta (MetaType MinBlockSize)
retrieve MinBlockSize = (Metadata -> IO Word32) -> FlacMeta Word32
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word32
getMinBlockSize
data MaxBlockSize = MaxBlockSize
instance MetaValue MaxBlockSize where
type MetaType MaxBlockSize = Word32
type MetaWritable MaxBlockSize = TypeError NotWritable
retrieve :: MaxBlockSize -> FlacMeta (MetaType MaxBlockSize)
retrieve MaxBlockSize = (Metadata -> IO Word32) -> FlacMeta Word32
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word32
getMaxBlockSize
data MinFrameSize = MinFrameSize
instance MetaValue MinFrameSize where
type MetaType MinFrameSize = Word32
type MetaWritable MinFrameSize = TypeError NotWritable
retrieve :: MinFrameSize -> FlacMeta (MetaType MinFrameSize)
retrieve MinFrameSize = (Metadata -> IO Word32) -> FlacMeta Word32
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word32
getMinFrameSize
data MaxFrameSize = MaxFrameSize
instance MetaValue MaxFrameSize where
type MetaType MaxFrameSize = Word32
type MetaWritable MaxFrameSize = TypeError NotWritable
retrieve :: MaxFrameSize -> FlacMeta (MetaType MaxFrameSize)
retrieve MaxFrameSize = (Metadata -> IO Word32) -> FlacMeta Word32
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word32
getMaxFrameSize
data SampleRate = SampleRate
instance MetaValue SampleRate where
type MetaType SampleRate = Word32
type MetaWritable SampleRate = TypeError NotWritable
retrieve :: SampleRate -> FlacMeta (MetaType SampleRate)
retrieve SampleRate = (Metadata -> IO Word32) -> FlacMeta Word32
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word32
getSampleRate
data Channels = Channels
instance MetaValue Channels where
type MetaType Channels = Word32
type MetaWritable Channels = TypeError NotWritable
retrieve :: Channels -> FlacMeta (MetaType Channels)
retrieve Channels = (Metadata -> IO Word32) -> FlacMeta Word32
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word32
getChannels
data ChannelMask = ChannelMask
instance MetaValue ChannelMask where
type MetaType ChannelMask = Set SpeakerPosition
type MetaWritable ChannelMask = TypeError NotWritable
retrieve :: ChannelMask -> FlacMeta (MetaType ChannelMask)
retrieve ChannelMask = Word32 -> Set SpeakerPosition
toChannelMask (Word32 -> Set SpeakerPosition)
-> FlacMeta Word32 -> FlacMeta (Set SpeakerPosition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Channels -> FlacMeta (MetaType Channels)
forall a. MetaValue a => a -> FlacMeta (MetaType a)
retrieve Channels
Channels
data BitsPerSample = BitsPerSample
instance MetaValue BitsPerSample where
type MetaType BitsPerSample = Word32
type MetaWritable BitsPerSample = TypeError NotWritable
retrieve :: BitsPerSample -> FlacMeta (MetaType BitsPerSample)
retrieve BitsPerSample = (Metadata -> IO Word32) -> FlacMeta Word32
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word32
getBitsPerSample
data TotalSamples = TotalSamples
instance MetaValue TotalSamples where
type MetaType TotalSamples = Word64
type MetaWritable TotalSamples = TypeError NotWritable
retrieve :: TotalSamples -> FlacMeta (MetaType TotalSamples)
retrieve TotalSamples = (Metadata -> IO Word64) -> FlacMeta Word64
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO Word64
getTotalSamples
data FileSize = FileSize
instance MetaValue FileSize where
type MetaType FileSize = Natural
type MetaWritable FileSize = TypeError NotWritable
retrieve :: FileSize -> FlacMeta (MetaType FileSize)
retrieve FileSize = Inner Natural -> FlacMeta Natural
forall a. Inner a -> FlacMeta a
FlacMeta ((Context -> Natural) -> Inner Natural
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> Natural
metaFileSize)
data BitRate = BitRate
instance MetaValue BitRate where
type MetaType BitRate = Word32
type MetaWritable BitRate = TypeError NotWritable
retrieve :: BitRate -> FlacMeta (MetaType BitRate)
retrieve BitRate = do
Double
fileSize <- Natural -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Natural -> Double) -> FlacMeta Natural -> FlacMeta Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FileSize -> FlacMeta (MetaType FileSize)
forall a. MetaValue a => a -> FlacMeta (MetaType a)
retrieve FileSize
FileSize
Double
duration <- Duration -> FlacMeta (MetaType Duration)
forall a. MetaValue a => a -> FlacMeta (MetaType a)
retrieve Duration
Duration
(Word32 -> FlacMeta Word32
forall (m :: * -> *) a. Monad m => a -> m a
return (Word32 -> FlacMeta Word32)
-> (Double -> Word32) -> Double -> FlacMeta Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Word32
forall a b. (RealFrac a, Integral b) => a -> b
floor) (Double
fileSize Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ (Double
duration Double -> Double -> Double
forall a. Num a => a -> a -> a
* 125))
data MD5Sum = MD5Sum
instance MetaValue MD5Sum where
type MetaType MD5Sum = ByteString
type MetaWritable MD5Sum = TypeError NotWritable
retrieve :: MD5Sum -> FlacMeta (MetaType MD5Sum)
retrieve MD5Sum = (Metadata -> IO ByteString) -> FlacMeta ByteString
forall a. (Metadata -> IO a) -> FlacMeta a
inStreamInfo Metadata -> IO ByteString
getMd5Sum
data Duration = Duration
instance MetaValue Duration where
type MetaType Duration = Double
type MetaWritable Duration = TypeError NotWritable
retrieve :: Duration -> FlacMeta (MetaType Duration)
retrieve Duration = do
Double
totalSamples <- Word64 -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Double) -> FlacMeta Word64 -> FlacMeta Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TotalSamples -> FlacMeta (MetaType TotalSamples)
forall a. MetaValue a => a -> FlacMeta (MetaType a)
retrieve TotalSamples
TotalSamples
Double
sampleRate <- Word32 -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32 -> Double) -> FlacMeta Word32 -> FlacMeta Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SampleRate -> FlacMeta (MetaType SampleRate)
forall a. MetaValue a => a -> FlacMeta (MetaType a)
retrieve SampleRate
SampleRate
Double -> FlacMeta Double
forall (m :: * -> *) a. Monad m => a -> m a
return (Double
totalSamples Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
sampleRate)
data Application = Application ApplicationId
instance MetaValue Application where
type MetaType Application = Maybe ByteString
type MetaWritable Application = ()
retrieve :: Application -> FlacMeta (MetaType Application)
retrieve (Application appId :: ApplicationId
appId) =
Inner (Maybe ByteString) -> FlacMeta (Maybe ByteString)
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ByteString) -> FlacMeta (Maybe ByteString))
-> ((MetaIterator -> Inner ByteString) -> Inner (Maybe ByteString))
-> (MetaIterator -> Inner ByteString)
-> FlacMeta (Maybe ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ApplicationId
-> (MetaIterator -> Inner ByteString) -> Inner (Maybe ByteString)
forall a.
ApplicationId -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withApplicationBlock ApplicationId
appId ((MetaIterator -> Inner ByteString)
-> FlacMeta (MetaType Application))
-> (MetaIterator -> Inner ByteString)
-> FlacMeta (MetaType Application)
forall a b. (a -> b) -> a -> b
$
IO ByteString -> Inner ByteString
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ByteString -> Inner ByteString)
-> (MetaIterator -> IO ByteString)
-> MetaIterator
-> Inner ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaIterator -> IO Metadata
iteratorGetBlock (MetaIterator -> IO Metadata)
-> (Metadata -> IO ByteString) -> MetaIterator -> IO ByteString
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Metadata -> IO ByteString
getApplicationData)
Application appId :: ApplicationId
appId =-> :: Application -> MetaType Application -> FlacMeta ()
=-> Nothing =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ApplicationId -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
ApplicationId -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withApplicationBlock ApplicationId
appId ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
Application appId :: ApplicationId
appId =-> Just data' =
Inner () -> FlacMeta ()
forall a. Inner a -> FlacMeta a
FlacMeta (Inner () -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> Inner ())
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ApplicationId -> (MetaIterator -> Inner ()) -> Inner ()
forall a. ApplicationId -> (MetaIterator -> Inner a) -> Inner a
withApplicationBlock' ApplicationId
appId ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (Metadata -> ByteString -> IO Bool
setApplicationData Metadata
block ByteString
data')
Inner ()
setModified
data SeekTable = SeekTable
instance MetaValue SeekTable where
type MetaType SeekTable = Maybe (Vector SeekPoint)
type MetaWritable SeekTable = ()
retrieve :: SeekTable -> FlacMeta (MetaType SeekTable)
retrieve SeekTable =
Inner (Maybe (Vector SeekPoint))
-> FlacMeta (Maybe (Vector SeekPoint))
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe (Vector SeekPoint))
-> FlacMeta (Maybe (Vector SeekPoint)))
-> ((MetaIterator -> Inner (Vector SeekPoint))
-> Inner (Maybe (Vector SeekPoint)))
-> (MetaIterator -> Inner (Vector SeekPoint))
-> FlacMeta (Maybe (Vector SeekPoint))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType
-> (MetaIterator -> Inner (Vector SeekPoint))
-> Inner (Maybe (Vector SeekPoint))
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
SeekTableBlock ((MetaIterator -> Inner (Vector SeekPoint))
-> FlacMeta (MetaType SeekTable))
-> (MetaIterator -> Inner (Vector SeekPoint))
-> FlacMeta (MetaType SeekTable)
forall a b. (a -> b) -> a -> b
$
IO (Vector SeekPoint) -> Inner (Vector SeekPoint)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Vector SeekPoint) -> Inner (Vector SeekPoint))
-> (MetaIterator -> IO (Vector SeekPoint))
-> MetaIterator
-> Inner (Vector SeekPoint)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaIterator -> IO Metadata
iteratorGetBlock (MetaIterator -> IO Metadata)
-> (Metadata -> IO (Vector SeekPoint))
-> MetaIterator
-> IO (Vector SeekPoint)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Metadata -> IO (Vector SeekPoint)
getSeekPoints)
SeekTable =-> :: SeekTable -> MetaType SeekTable -> FlacMeta ()
=-> Nothing =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
SeekTableBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
SeekTable =-> Just seekPoints =
Inner () -> FlacMeta ()
forall a. Inner a -> FlacMeta a
FlacMeta (Inner () -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> Inner ())
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner ()
forall a. MetadataType -> (MetaIterator -> Inner a) -> Inner a
withMetaBlock' MetadataType
SeekTableBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (Metadata -> Vector SeekPoint -> IO Bool
setSeekPoints Metadata
block Vector SeekPoint
seekPoints)
Inner ()
setModified
data VorbisVendor = VorbisVendor
instance MetaValue VorbisVendor where
type MetaType VorbisVendor = Maybe Text
type MetaWritable VorbisVendor = ()
retrieve :: VorbisVendor -> FlacMeta (MetaType VorbisVendor)
retrieve VorbisVendor =
Inner (Maybe Text) -> FlacMeta (Maybe Text)
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe Text) -> FlacMeta (Maybe Text))
-> ((MetaIterator -> Inner Text) -> Inner (Maybe Text))
-> (MetaIterator -> Inner Text)
-> FlacMeta (Maybe Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner Text) -> Inner (Maybe Text)
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
VorbisCommentBlock ((MetaIterator -> Inner Text) -> FlacMeta (MetaType VorbisVendor))
-> (MetaIterator -> Inner Text) -> FlacMeta (MetaType VorbisVendor)
forall a b. (a -> b) -> a -> b
$
IO Text -> Inner Text
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Text -> Inner Text)
-> (MetaIterator -> IO Text) -> MetaIterator -> Inner Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaIterator -> IO Metadata
iteratorGetBlock (MetaIterator -> IO Metadata)
-> (Metadata -> IO Text) -> MetaIterator -> IO Text
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Metadata -> IO Text
getVorbisVendor)
VorbisVendor =-> :: VorbisVendor -> MetaType VorbisVendor -> FlacMeta ()
=-> Nothing =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
VorbisCommentBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (Metadata -> Text -> IO Bool
setVorbisVendor Metadata
block "")
Inner ()
setModified
VorbisVendor =-> (Just value) =
Inner () -> FlacMeta ()
forall a. Inner a -> FlacMeta a
FlacMeta (Inner () -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> Inner ())
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner ()
forall a. MetadataType -> (MetaIterator -> Inner a) -> Inner a
withMetaBlock' MetadataType
VorbisCommentBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (Metadata -> Text -> IO Bool
setVorbisVendor Metadata
block Text
value)
Inner ()
setModified
data = VorbisField
data VorbisField
=
Title
|
Version
|
Album
|
TrackNumber
|
TrackTotal
|
DiscNumber
|
DiscTotal
|
Artist
|
Performer
|
Copyright
|
License
|
Organization
|
Description
|
Genre
|
Date
|
Location
|
Contact
|
ISRC
|
Rating
|
RGTrackPeak
|
RGTrackGain
|
RGAlbumPeak
|
RGAlbumGain
deriving (Int -> VorbisField -> ShowS
[VorbisField] -> ShowS
VorbisField -> String
(Int -> VorbisField -> ShowS)
-> (VorbisField -> String)
-> ([VorbisField] -> ShowS)
-> Show VorbisField
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VorbisField] -> ShowS
$cshowList :: [VorbisField] -> ShowS
show :: VorbisField -> String
$cshow :: VorbisField -> String
showsPrec :: Int -> VorbisField -> ShowS
$cshowsPrec :: Int -> VorbisField -> ShowS
Show, ReadPrec [VorbisField]
ReadPrec VorbisField
Int -> ReadS VorbisField
ReadS [VorbisField]
(Int -> ReadS VorbisField)
-> ReadS [VorbisField]
-> ReadPrec VorbisField
-> ReadPrec [VorbisField]
-> Read VorbisField
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [VorbisField]
$creadListPrec :: ReadPrec [VorbisField]
readPrec :: ReadPrec VorbisField
$creadPrec :: ReadPrec VorbisField
readList :: ReadS [VorbisField]
$creadList :: ReadS [VorbisField]
readsPrec :: Int -> ReadS VorbisField
$creadsPrec :: Int -> ReadS VorbisField
Read, VorbisField -> VorbisField -> Bool
(VorbisField -> VorbisField -> Bool)
-> (VorbisField -> VorbisField -> Bool) -> Eq VorbisField
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: VorbisField -> VorbisField -> Bool
$c/= :: VorbisField -> VorbisField -> Bool
== :: VorbisField -> VorbisField -> Bool
$c== :: VorbisField -> VorbisField -> Bool
Eq, Eq VorbisField
Eq VorbisField =>
(VorbisField -> VorbisField -> Ordering)
-> (VorbisField -> VorbisField -> Bool)
-> (VorbisField -> VorbisField -> Bool)
-> (VorbisField -> VorbisField -> Bool)
-> (VorbisField -> VorbisField -> Bool)
-> (VorbisField -> VorbisField -> VorbisField)
-> (VorbisField -> VorbisField -> VorbisField)
-> Ord VorbisField
VorbisField -> VorbisField -> Bool
VorbisField -> VorbisField -> Ordering
VorbisField -> VorbisField -> VorbisField
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: VorbisField -> VorbisField -> VorbisField
$cmin :: VorbisField -> VorbisField -> VorbisField
max :: VorbisField -> VorbisField -> VorbisField
$cmax :: VorbisField -> VorbisField -> VorbisField
>= :: VorbisField -> VorbisField -> Bool
$c>= :: VorbisField -> VorbisField -> Bool
> :: VorbisField -> VorbisField -> Bool
$c> :: VorbisField -> VorbisField -> Bool
<= :: VorbisField -> VorbisField -> Bool
$c<= :: VorbisField -> VorbisField -> Bool
< :: VorbisField -> VorbisField -> Bool
$c< :: VorbisField -> VorbisField -> Bool
compare :: VorbisField -> VorbisField -> Ordering
$ccompare :: VorbisField -> VorbisField -> Ordering
$cp1Ord :: Eq VorbisField
Ord, VorbisField
VorbisField -> VorbisField -> Bounded VorbisField
forall a. a -> a -> Bounded a
maxBound :: VorbisField
$cmaxBound :: VorbisField
minBound :: VorbisField
$cminBound :: VorbisField
Bounded, Int -> VorbisField
VorbisField -> Int
VorbisField -> [VorbisField]
VorbisField -> VorbisField
VorbisField -> VorbisField -> [VorbisField]
VorbisField -> VorbisField -> VorbisField -> [VorbisField]
(VorbisField -> VorbisField)
-> (VorbisField -> VorbisField)
-> (Int -> VorbisField)
-> (VorbisField -> Int)
-> (VorbisField -> [VorbisField])
-> (VorbisField -> VorbisField -> [VorbisField])
-> (VorbisField -> VorbisField -> [VorbisField])
-> (VorbisField -> VorbisField -> VorbisField -> [VorbisField])
-> Enum VorbisField
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: VorbisField -> VorbisField -> VorbisField -> [VorbisField]
$cenumFromThenTo :: VorbisField -> VorbisField -> VorbisField -> [VorbisField]
enumFromTo :: VorbisField -> VorbisField -> [VorbisField]
$cenumFromTo :: VorbisField -> VorbisField -> [VorbisField]
enumFromThen :: VorbisField -> VorbisField -> [VorbisField]
$cenumFromThen :: VorbisField -> VorbisField -> [VorbisField]
enumFrom :: VorbisField -> [VorbisField]
$cenumFrom :: VorbisField -> [VorbisField]
fromEnum :: VorbisField -> Int
$cfromEnum :: VorbisField -> Int
toEnum :: Int -> VorbisField
$ctoEnum :: Int -> VorbisField
pred :: VorbisField -> VorbisField
$cpred :: VorbisField -> VorbisField
succ :: VorbisField -> VorbisField
$csucc :: VorbisField -> VorbisField
Enum)
instance MetaValue VorbisComment where
type MetaType VorbisComment = Maybe Text
type MetaWritable VorbisComment = ()
retrieve :: VorbisComment -> FlacMeta (MetaType VorbisComment)
retrieve (VorbisComment field :: VorbisField
field) =
Inner (Maybe Text) -> FlacMeta (Maybe Text)
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe Text) -> FlacMeta (Maybe Text))
-> ((MetaIterator -> Inner (Maybe Text)) -> Inner (Maybe Text))
-> (MetaIterator -> Inner (Maybe Text))
-> FlacMeta (Maybe Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe (Maybe Text) -> Maybe Text)
-> ReaderT Context IO (Maybe (Maybe Text)) -> Inner (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe (Maybe Text) -> Maybe Text
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ReaderT Context IO (Maybe (Maybe Text)) -> Inner (Maybe Text))
-> ((MetaIterator -> Inner (Maybe Text))
-> ReaderT Context IO (Maybe (Maybe Text)))
-> (MetaIterator -> Inner (Maybe Text))
-> Inner (Maybe Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType
-> (MetaIterator -> Inner (Maybe Text))
-> ReaderT Context IO (Maybe (Maybe Text))
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
VorbisCommentBlock ((MetaIterator -> Inner (Maybe Text))
-> FlacMeta (MetaType VorbisComment))
-> (MetaIterator -> Inner (Maybe Text))
-> FlacMeta (MetaType VorbisComment)
forall a b. (a -> b) -> a -> b
$
IO (Maybe Text) -> Inner (Maybe Text)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe Text) -> Inner (Maybe Text))
-> (MetaIterator -> IO (Maybe Text))
-> MetaIterator
-> Inner (Maybe Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaIterator -> IO Metadata
iteratorGetBlock (MetaIterator -> IO Metadata)
-> (Metadata -> IO (Maybe Text)) -> MetaIterator -> IO (Maybe Text)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> ByteString -> Metadata -> IO (Maybe Text)
getVorbisComment (VorbisField -> ByteString
vorbisFieldName VorbisField
field))
VorbisComment field :: VorbisField
field =-> :: VorbisComment -> MetaType VorbisComment -> FlacMeta ()
=-> Nothing =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
VorbisCommentBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (ByteString -> Metadata -> IO Bool
deleteVorbisComment (VorbisField -> ByteString
vorbisFieldName VorbisField
field) Metadata
block)
Inner ()
setModified
VorbisComment field :: VorbisField
field =-> Just value =
Inner () -> FlacMeta ()
forall a. Inner a -> FlacMeta a
FlacMeta (Inner () -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> Inner ())
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner ()
forall a. MetadataType -> (MetaIterator -> Inner a) -> Inner a
withMetaBlock' MetadataType
VorbisCommentBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (ByteString -> Text -> Metadata -> IO Bool
setVorbisComment (VorbisField -> ByteString
vorbisFieldName VorbisField
field) Text
value Metadata
block)
Inner ()
setModified
data CueSheet = CueSheet
instance MetaValue CueSheet where
type MetaType CueSheet = Maybe CueSheetData
type MetaWritable CueSheet = ()
retrieve :: CueSheet -> FlacMeta (MetaType CueSheet)
retrieve CueSheet =
Inner (Maybe CueSheetData) -> FlacMeta (Maybe CueSheetData)
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe CueSheetData) -> FlacMeta (Maybe CueSheetData))
-> ((MetaIterator -> Inner CueSheetData)
-> Inner (Maybe CueSheetData))
-> (MetaIterator -> Inner CueSheetData)
-> FlacMeta (Maybe CueSheetData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType
-> (MetaIterator -> Inner CueSheetData)
-> Inner (Maybe CueSheetData)
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
CueSheetBlock ((MetaIterator -> Inner CueSheetData)
-> FlacMeta (MetaType CueSheet))
-> (MetaIterator -> Inner CueSheetData)
-> FlacMeta (MetaType CueSheet)
forall a b. (a -> b) -> a -> b
$
IO CueSheetData -> Inner CueSheetData
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO CueSheetData -> Inner CueSheetData)
-> (MetaIterator -> IO CueSheetData)
-> MetaIterator
-> Inner CueSheetData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaIterator -> IO Metadata
iteratorGetBlock (MetaIterator -> IO Metadata)
-> (Metadata -> IO CueSheetData) -> MetaIterator -> IO CueSheetData
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Metadata -> IO CueSheetData
getCueSheetData)
CueSheet =-> :: CueSheet -> MetaType CueSheet -> FlacMeta ()
=-> Nothing =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
CueSheetBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
CueSheet =-> Just cueSheetData =
Inner () -> FlacMeta ()
forall a. Inner a -> FlacMeta a
FlacMeta (Inner () -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> Inner ())
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner ()
forall a. MetadataType -> (MetaIterator -> Inner a) -> Inner a
withMetaBlock' MetadataType
CueSheetBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (Metadata -> CueSheetData -> IO Bool
setCueSheetData Metadata
block CueSheetData
cueSheetData)
Inner ()
setModified
data Picture = Picture PictureType
instance MetaValue Picture where
type MetaType Picture = Maybe PictureData
type MetaWritable Picture = ()
retrieve :: Picture -> FlacMeta (MetaType Picture)
retrieve (Picture pictureType :: PictureType
pictureType) =
Inner (Maybe PictureData) -> FlacMeta (Maybe PictureData)
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe PictureData) -> FlacMeta (Maybe PictureData))
-> ((MetaIterator -> Inner PictureData)
-> Inner (Maybe PictureData))
-> (MetaIterator -> Inner PictureData)
-> FlacMeta (Maybe PictureData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PictureType
-> (MetaIterator -> Inner PictureData) -> Inner (Maybe PictureData)
forall a.
PictureType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withPictureBlock PictureType
pictureType ((MetaIterator -> Inner PictureData)
-> FlacMeta (MetaType Picture))
-> (MetaIterator -> Inner PictureData)
-> FlacMeta (MetaType Picture)
forall a b. (a -> b) -> a -> b
$
IO PictureData -> Inner PictureData
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO PictureData -> Inner PictureData)
-> (MetaIterator -> IO PictureData)
-> MetaIterator
-> Inner PictureData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaIterator -> IO Metadata
iteratorGetBlock (MetaIterator -> IO Metadata)
-> (Metadata -> IO PictureData) -> MetaIterator -> IO PictureData
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Metadata -> IO PictureData
getPictureData)
Picture pictureType :: PictureType
pictureType =-> :: Picture -> MetaType Picture -> FlacMeta ()
=-> Nothing =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PictureType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
PictureType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withPictureBlock PictureType
pictureType ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
Picture pictureType :: PictureType
pictureType =-> Just pictureData =
FlacMeta () -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta () -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner () -> FlacMeta ()
forall a. Inner a -> FlacMeta a
FlacMeta (Inner () -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> Inner ())
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PictureType -> (MetaIterator -> Inner ()) -> Inner ()
forall a. PictureType -> (MetaIterator -> Inner a) -> Inner a
withPictureBlock' PictureType
pictureType ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
IO Bool -> Inner ()
liftBool (Metadata -> PictureData -> IO Bool
setPictureData Metadata
block PictureData
pictureData)
Inner ()
setModified
wipeVorbisComment :: FlacMeta ()
=
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
VorbisCommentBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
wipeApplications :: FlacMeta ()
wipeApplications :: FlacMeta ()
wipeApplications =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
ApplicationBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
wipeSeekTable :: FlacMeta ()
wipeSeekTable :: FlacMeta ()
wipeSeekTable =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
SeekTableBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
wipeCueSheets :: FlacMeta ()
wipeCueSheets :: FlacMeta ()
wipeCueSheets =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
CueSheetBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
wipePictures :: FlacMeta ()
wipePictures :: FlacMeta ()
wipePictures =
FlacMeta (Maybe ()) -> FlacMeta ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (FlacMeta (Maybe ()) -> FlacMeta ())
-> ((MetaIterator -> Inner ()) -> FlacMeta (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inner (Maybe ()) -> FlacMeta (Maybe ())
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (Maybe ()) -> FlacMeta (Maybe ()))
-> ((MetaIterator -> Inner ()) -> Inner (Maybe ()))
-> (MetaIterator -> Inner ())
-> FlacMeta (Maybe ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType -> (MetaIterator -> Inner ()) -> Inner (Maybe ())
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
PictureBlock ((MetaIterator -> Inner ()) -> FlacMeta ())
-> (MetaIterator -> Inner ()) -> FlacMeta ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Inner ()
setModified
getMetaChain :: FlacMeta (NonEmpty MetadataType)
getMetaChain :: FlacMeta (NonEmpty MetadataType)
getMetaChain = Inner (NonEmpty MetadataType) -> FlacMeta (NonEmpty MetadataType)
forall a. Inner a -> FlacMeta a
FlacMeta (Inner (NonEmpty MetadataType) -> FlacMeta (NonEmpty MetadataType))
-> Inner (NonEmpty MetadataType)
-> FlacMeta (NonEmpty MetadataType)
forall a b. (a -> b) -> a -> b
$ do
MetaChain
chain <- (Context -> MetaChain) -> ReaderT Context IO MetaChain
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> MetaChain
metaChain
[MetadataType] -> NonEmpty MetadataType
forall a. [a] -> NonEmpty a
NE.fromList ([MetadataType] -> NonEmpty MetadataType)
-> ReaderT Context IO [MetadataType]
-> Inner (NonEmpty MetadataType)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaChain
-> (MetaIterator -> ReaderT Context IO (Maybe MetadataType))
-> ReaderT Context IO [MetadataType]
forall (m :: * -> *) a.
(MonadMask m, MonadIO m) =>
MetaChain -> (MetaIterator -> m (Maybe a)) -> m [a]
withIterator MetaChain
chain ((MetadataType -> Maybe MetadataType)
-> ReaderT Context IO MetadataType
-> ReaderT Context IO (Maybe MetadataType)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap MetadataType -> Maybe MetadataType
forall a. a -> Maybe a
Just (ReaderT Context IO MetadataType
-> ReaderT Context IO (Maybe MetadataType))
-> (MetaIterator -> ReaderT Context IO MetadataType)
-> MetaIterator
-> ReaderT Context IO (Maybe MetadataType)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO MetadataType -> ReaderT Context IO MetadataType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO MetadataType -> ReaderT Context IO MetadataType)
-> (MetaIterator -> IO MetadataType)
-> MetaIterator
-> ReaderT Context IO MetadataType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetaIterator -> IO MetadataType
iteratorGetBlockType)
isMetaChainModified :: FlacMeta Bool
isMetaChainModified :: FlacMeta Bool
isMetaChainModified = ReaderT Context IO Bool -> FlacMeta Bool
forall a. Inner a -> FlacMeta a
FlacMeta ((Context -> IORef Bool) -> ReaderT Context IO (IORef Bool)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> IORef Bool
metaModified ReaderT Context IO (IORef Bool)
-> (IORef Bool -> ReaderT Context IO Bool)
-> ReaderT Context IO Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO Bool -> ReaderT Context IO Bool
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Bool -> ReaderT Context IO Bool)
-> (IORef Bool -> IO Bool) -> IORef Bool -> ReaderT Context IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IORef Bool -> IO Bool
forall a. IORef a -> IO a
readIORef)
inStreamInfo :: (Metadata -> IO a) -> FlacMeta a
inStreamInfo :: (Metadata -> IO a) -> FlacMeta a
inStreamInfo f :: Metadata -> IO a
f =
Inner a -> FlacMeta a
forall a. Inner a -> FlacMeta a
FlacMeta (Inner a -> FlacMeta a)
-> ((MetaIterator -> Inner a) -> Inner a)
-> (MetaIterator -> Inner a)
-> FlacMeta a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe a -> a) -> ReaderT Context IO (Maybe a) -> Inner a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe a -> a
forall a. HasCallStack => Maybe a -> a
fromJust (ReaderT Context IO (Maybe a) -> Inner a)
-> ((MetaIterator -> Inner a) -> ReaderT Context IO (Maybe a))
-> (MetaIterator -> Inner a)
-> Inner a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataType
-> (MetaIterator -> Inner a) -> ReaderT Context IO (Maybe a)
forall a.
MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock MetadataType
StreamInfoBlock ((MetaIterator -> Inner a) -> FlacMeta a)
-> (MetaIterator -> Inner a) -> FlacMeta a
forall a b. (a -> b) -> a -> b
$
IO a -> Inner a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> Inner a)
-> (MetaIterator -> IO a) -> MetaIterator -> Inner a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MetaIterator -> IO Metadata
iteratorGetBlock (MetaIterator -> IO Metadata)
-> (Metadata -> IO a) -> MetaIterator -> IO a
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Metadata -> IO a
f)
withMetaBlock ::
MetadataType ->
(MetaIterator -> Inner a) ->
Inner (Maybe a)
withMetaBlock :: MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlock = (Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
forall a.
(Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlockGen Metadata -> ReaderT Context IO Bool
forall (m :: * -> *) p. Monad m => p -> m Bool
noCheck
where
noCheck :: p -> m Bool
noCheck _ = Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
withMetaBlock' ::
MetadataType ->
(MetaIterator -> Inner a) ->
Inner a
withMetaBlock' :: MetadataType -> (MetaIterator -> Inner a) -> Inner a
withMetaBlock' = (Metadata -> ReaderT Context IO Bool)
-> (Metadata -> Inner ())
-> MetadataType
-> (MetaIterator -> Inner a)
-> Inner a
forall a.
(Metadata -> ReaderT Context IO Bool)
-> (Metadata -> Inner ())
-> MetadataType
-> (MetaIterator -> Inner a)
-> Inner a
withMetaBlockGen' Metadata -> ReaderT Context IO Bool
forall (m :: * -> *) p. Monad m => p -> m Bool
noCheck Metadata -> Inner ()
forall (m :: * -> *) p. Monad m => p -> m ()
noSet
where
noCheck :: p -> m Bool
noCheck _ = Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
noSet :: p -> m ()
noSet _ = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
withApplicationBlock ::
ApplicationId ->
(MetaIterator -> Inner a) ->
Inner (Maybe a)
withApplicationBlock :: ApplicationId -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withApplicationBlock givenId :: ApplicationId
givenId =
(Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
forall a.
(Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlockGen Metadata -> ReaderT Context IO Bool
idCheck MetadataType
ApplicationBlock
where
idCheck :: Metadata -> ReaderT Context IO Bool
idCheck = (ApplicationId -> Bool)
-> ReaderT Context IO ApplicationId -> ReaderT Context IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ApplicationId -> ApplicationId -> Bool
forall a. Eq a => a -> a -> Bool
== ApplicationId
givenId) (ReaderT Context IO ApplicationId -> ReaderT Context IO Bool)
-> (Metadata -> ReaderT Context IO ApplicationId)
-> Metadata
-> ReaderT Context IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO ApplicationId -> ReaderT Context IO ApplicationId
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ApplicationId -> ReaderT Context IO ApplicationId)
-> (Metadata -> IO ApplicationId)
-> Metadata
-> ReaderT Context IO ApplicationId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Metadata -> IO ApplicationId
getApplicationId
withApplicationBlock' ::
ApplicationId ->
(MetaIterator -> Inner a) ->
Inner a
withApplicationBlock' :: ApplicationId -> (MetaIterator -> Inner a) -> Inner a
withApplicationBlock' givenId :: ApplicationId
givenId =
(Metadata -> ReaderT Context IO Bool)
-> (Metadata -> Inner ())
-> MetadataType
-> (MetaIterator -> Inner a)
-> Inner a
forall a.
(Metadata -> ReaderT Context IO Bool)
-> (Metadata -> Inner ())
-> MetadataType
-> (MetaIterator -> Inner a)
-> Inner a
withMetaBlockGen' Metadata -> ReaderT Context IO Bool
idCheck Metadata -> Inner ()
setId MetadataType
ApplicationBlock
where
idCheck :: Metadata -> ReaderT Context IO Bool
idCheck = (ApplicationId -> Bool)
-> ReaderT Context IO ApplicationId -> ReaderT Context IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ApplicationId -> ApplicationId -> Bool
forall a. Eq a => a -> a -> Bool
== ApplicationId
givenId) (ReaderT Context IO ApplicationId -> ReaderT Context IO Bool)
-> (Metadata -> ReaderT Context IO ApplicationId)
-> Metadata
-> ReaderT Context IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO ApplicationId -> ReaderT Context IO ApplicationId
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ApplicationId -> ReaderT Context IO ApplicationId)
-> (Metadata -> IO ApplicationId)
-> Metadata
-> ReaderT Context IO ApplicationId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Metadata -> IO ApplicationId
getApplicationId
setId :: Metadata -> Inner ()
setId block :: Metadata
block = IO () -> Inner ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Metadata -> ApplicationId -> IO ()
setApplicationId Metadata
block ApplicationId
givenId)
withPictureBlock ::
PictureType ->
(MetaIterator -> Inner a) ->
Inner (Maybe a)
withPictureBlock :: PictureType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withPictureBlock givenType :: PictureType
givenType = (Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
forall a.
(Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlockGen Metadata -> ReaderT Context IO Bool
typeCheck MetadataType
PictureBlock
where
typeCheck :: Metadata -> ReaderT Context IO Bool
typeCheck = (PictureType -> Bool)
-> ReaderT Context IO PictureType -> ReaderT Context IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (PictureType -> PictureType -> Bool
forall a. Eq a => a -> a -> Bool
== PictureType
givenType) (ReaderT Context IO PictureType -> ReaderT Context IO Bool)
-> (Metadata -> ReaderT Context IO PictureType)
-> Metadata
-> ReaderT Context IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO PictureType -> ReaderT Context IO PictureType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO PictureType -> ReaderT Context IO PictureType)
-> (Metadata -> IO PictureType)
-> Metadata
-> ReaderT Context IO PictureType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Metadata -> IO PictureType
getPictureType
withPictureBlock' ::
PictureType ->
(MetaIterator -> Inner a) ->
Inner a
withPictureBlock' :: PictureType -> (MetaIterator -> Inner a) -> Inner a
withPictureBlock' givenType :: PictureType
givenType =
(Metadata -> ReaderT Context IO Bool)
-> (Metadata -> Inner ())
-> MetadataType
-> (MetaIterator -> Inner a)
-> Inner a
forall a.
(Metadata -> ReaderT Context IO Bool)
-> (Metadata -> Inner ())
-> MetadataType
-> (MetaIterator -> Inner a)
-> Inner a
withMetaBlockGen' Metadata -> ReaderT Context IO Bool
typeCheck Metadata -> Inner ()
setType MetadataType
PictureBlock
where
typeCheck :: Metadata -> ReaderT Context IO Bool
typeCheck = (PictureType -> Bool)
-> ReaderT Context IO PictureType -> ReaderT Context IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (PictureType -> PictureType -> Bool
forall a. Eq a => a -> a -> Bool
== PictureType
givenType) (ReaderT Context IO PictureType -> ReaderT Context IO Bool)
-> (Metadata -> ReaderT Context IO PictureType)
-> Metadata
-> ReaderT Context IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO PictureType -> ReaderT Context IO PictureType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO PictureType -> ReaderT Context IO PictureType)
-> (Metadata -> IO PictureType)
-> Metadata
-> ReaderT Context IO PictureType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Metadata -> IO PictureType
getPictureType
setType :: Metadata -> Inner ()
setType block :: Metadata
block = IO () -> Inner ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Metadata -> PictureType -> IO ()
setPictureType Metadata
block PictureType
givenType)
withMetaBlockGen ::
(Metadata -> Inner Bool) ->
MetadataType ->
(MetaIterator -> Inner a) ->
Inner (Maybe a)
withMetaBlockGen :: (Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlockGen check :: Metadata -> ReaderT Context IO Bool
check givenType :: MetadataType
givenType f :: MetaIterator -> Inner a
f = do
MetaChain
chain <- (Context -> MetaChain) -> ReaderT Context IO MetaChain
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> MetaChain
metaChain
([a] -> Maybe a) -> ReaderT Context IO [a] -> Inner (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe (ReaderT Context IO [a] -> Inner (Maybe a))
-> ((MetaIterator -> Inner (Maybe a)) -> ReaderT Context IO [a])
-> (MetaIterator -> Inner (Maybe a))
-> Inner (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetaChain
-> (MetaIterator -> Inner (Maybe a)) -> ReaderT Context IO [a]
forall (m :: * -> *) a.
(MonadMask m, MonadIO m) =>
MetaChain -> (MetaIterator -> m (Maybe a)) -> m [a]
withIterator MetaChain
chain ((MetaIterator -> Inner (Maybe a)) -> Inner (Maybe a))
-> (MetaIterator -> Inner (Maybe a)) -> Inner (Maybe a)
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
MetadataType
actualType <- IO MetadataType -> ReaderT Context IO MetadataType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO MetadataType
iteratorGetBlockType MetaIterator
i)
if MetadataType
actualType MetadataType -> MetadataType -> Bool
forall a. Eq a => a -> a -> Bool
== MetadataType
givenType
then do
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
Bool
match <- Metadata -> ReaderT Context IO Bool
check Metadata
block
if Bool
match
then a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Inner a -> Inner (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaIterator -> Inner a
f MetaIterator
i
else Maybe a -> Inner (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
else Maybe a -> Inner (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
withMetaBlockGen' ::
(Metadata -> Inner Bool) ->
(Metadata -> Inner ()) ->
MetadataType ->
(MetaIterator -> Inner a) ->
Inner a
withMetaBlockGen' :: (Metadata -> ReaderT Context IO Bool)
-> (Metadata -> Inner ())
-> MetadataType
-> (MetaIterator -> Inner a)
-> Inner a
withMetaBlockGen' check :: Metadata -> ReaderT Context IO Bool
check setParam :: Metadata -> Inner ()
setParam givenType :: MetadataType
givenType f :: MetaIterator -> Inner a
f = do
MetaChain
chain <- (Context -> MetaChain) -> ReaderT Context IO MetaChain
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> MetaChain
metaChain
Maybe a
res <- (Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
forall a.
(Metadata -> ReaderT Context IO Bool)
-> MetadataType -> (MetaIterator -> Inner a) -> Inner (Maybe a)
withMetaBlockGen Metadata -> ReaderT Context IO Bool
check MetadataType
givenType MetaIterator -> Inner a
f
case Maybe a
res of
Nothing -> ([a] -> a) -> ReaderT Context IO [a] -> Inner a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> a
forall a. [a] -> a
head (ReaderT Context IO [a] -> Inner a)
-> ((MetaIterator -> Inner (Maybe a)) -> ReaderT Context IO [a])
-> (MetaIterator -> Inner (Maybe a))
-> Inner a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetaChain
-> (MetaIterator -> Inner (Maybe a)) -> ReaderT Context IO [a]
forall (m :: * -> *) a.
(MonadMask m, MonadIO m) =>
MetaChain -> (MetaIterator -> m (Maybe a)) -> m [a]
withIterator MetaChain
chain ((MetaIterator -> Inner (Maybe a)) -> Inner a)
-> (MetaIterator -> Inner (Maybe a)) -> Inner a
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
MetadataType
actual <- IO MetadataType -> ReaderT Context IO MetadataType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO MetadataType
iteratorGetBlockType MetaIterator
i)
if MetadataType
actual MetadataType -> MetadataType -> Bool
forall a. Eq a => a -> a -> Bool
== MetadataType
StreamInfoBlock
then
let acquire :: ReaderT Context IO Metadata
acquire = IO (Maybe Metadata) -> ReaderT Context IO Metadata
forall a. IO (Maybe a) -> Inner a
liftMaybe (MetadataType -> IO (Maybe Metadata)
objectNew MetadataType
givenType)
release :: Metadata -> Inner ()
release = IO () -> Inner ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Inner ()) -> (Metadata -> IO ()) -> Metadata -> Inner ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Metadata -> IO ()
objectDelete
in do
ReaderT Context IO Metadata
-> (Metadata -> Inner ()) -> (Metadata -> Inner ()) -> Inner ()
forall (m :: * -> *) a c b.
MonadMask m =>
m a -> (a -> m c) -> (a -> m b) -> m b
bracketOnError ReaderT Context IO Metadata
acquire Metadata -> Inner ()
release ((Metadata -> Inner ()) -> Inner ())
-> (Metadata -> Inner ()) -> Inner ()
forall a b. (a -> b) -> a -> b
$ \block :: Metadata
block -> do
Metadata -> Inner ()
setParam Metadata
block
IO Bool -> Inner ()
liftBool (MetaIterator -> Metadata -> IO Bool
iteratorInsertBlockAfter MetaIterator
i Metadata
block)
a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Inner a -> Inner (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MetaIterator -> Inner a
f MetaIterator
i
else Maybe a -> Inner (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
Just x :: a
x -> a -> Inner a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
applyVacuum :: Inner ()
applyVacuum :: Inner ()
applyVacuum = do
MetaChain
chain <- (Context -> MetaChain) -> ReaderT Context IO MetaChain
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> MetaChain
metaChain
ReaderT Context IO [Any] -> Inner ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ReaderT Context IO [Any] -> Inner ())
-> ((MetaIterator -> ReaderT Context IO (Maybe Any))
-> ReaderT Context IO [Any])
-> (MetaIterator -> ReaderT Context IO (Maybe Any))
-> Inner ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetaChain
-> (MetaIterator -> ReaderT Context IO (Maybe Any))
-> ReaderT Context IO [Any]
forall (m :: * -> *) a.
(MonadMask m, MonadIO m) =>
MetaChain -> (MetaIterator -> m (Maybe a)) -> m [a]
withIterator MetaChain
chain ((MetaIterator -> ReaderT Context IO (Maybe Any)) -> Inner ())
-> (MetaIterator -> ReaderT Context IO (Maybe Any)) -> Inner ()
forall a b. (a -> b) -> a -> b
$ \i :: MetaIterator
i -> do
MetadataType
blockType <- IO MetadataType -> ReaderT Context IO MetadataType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO MetadataType
iteratorGetBlockType MetaIterator
i)
Metadata
block <- IO Metadata -> ReaderT Context IO Metadata
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaIterator -> IO Metadata
iteratorGetBlock MetaIterator
i)
Bool
empty <- IO Bool -> ReaderT Context IO Bool
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetadataType -> Metadata -> IO Bool
forall (m :: * -> *).
MonadIO m =>
MetadataType -> Metadata -> m Bool
isMetaBlockEmpty MetadataType
blockType Metadata
block)
Bool -> Inner () -> Inner ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
empty (Inner () -> Inner ()) -> Inner () -> Inner ()
forall a b. (a -> b) -> a -> b
$
IO Bool -> Inner ()
liftBool (MetaIterator -> IO Bool
iteratorDeleteBlock MetaIterator
i)
Maybe Any -> ReaderT Context IO (Maybe Any)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Any
forall a. Maybe a
Nothing
isMetaBlockEmpty :: MonadIO m => MetadataType -> Metadata -> m Bool
isMetaBlockEmpty :: MetadataType -> Metadata -> m Bool
isMetaBlockEmpty SeekTableBlock block :: Metadata
block =
Vector SeekPoint -> Bool
forall a. Vector a -> Bool
V.null (Vector SeekPoint -> Bool) -> m (Vector SeekPoint) -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO (Vector SeekPoint) -> m (Vector SeekPoint)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Metadata -> IO (Vector SeekPoint)
getSeekPoints Metadata
block)
isMetaBlockEmpty VorbisCommentBlock block :: Metadata
block =
IO Bool -> m Bool
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Metadata -> IO Bool
isVorbisCommentEmpty Metadata
block)
isMetaBlockEmpty _ _ = Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
liftMaybe :: IO (Maybe a) -> Inner a
liftMaybe :: IO (Maybe a) -> Inner a
liftMaybe m :: IO (Maybe a)
m = IO (Maybe a) -> ReaderT Context IO (Maybe a)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO (Maybe a)
m ReaderT Context IO (Maybe a) -> (Maybe a -> Inner a) -> Inner a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Inner a -> (a -> Inner a) -> Maybe a -> Inner a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Inner a
forall a. Inner a
throwStatus a -> Inner a
forall (m :: * -> *) a. Monad m => a -> m a
return
liftBool :: IO Bool -> Inner ()
liftBool :: IO Bool -> Inner ()
liftBool m :: IO Bool
m = IO Bool -> ReaderT Context IO Bool
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO Bool
m ReaderT Context IO Bool -> (Bool -> Inner ()) -> Inner ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Inner () -> Inner () -> Bool -> Inner ()
forall a. a -> a -> Bool -> a
bool Inner ()
forall a. Inner a
throwStatus (() -> Inner ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
throwStatus :: Inner a
throwStatus :: Inner a
throwStatus = do
MetaChain
chain <- (Context -> MetaChain) -> ReaderT Context IO MetaChain
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> MetaChain
metaChain
MetaChainStatus
status <- IO MetaChainStatus -> ReaderT Context IO MetaChainStatus
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MetaChain -> IO MetaChainStatus
chainStatus MetaChain
chain)
MetaException -> Inner a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (MetaChainStatus -> MetaException
MetaGeneralProblem MetaChainStatus
status)
setModified :: Inner ()
setModified :: Inner ()
setModified = do
IORef Bool
modified <- (Context -> IORef Bool) -> ReaderT Context IO (IORef Bool)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks Context -> IORef Bool
metaModified
IO () -> Inner ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IORef Bool -> Bool -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Bool
modified Bool
True)
vorbisFieldName :: VorbisField -> ByteString
vorbisFieldName :: VorbisField -> ByteString
vorbisFieldName RGTrackPeak = "REPLAYGAIN_TRACK_PEAK"
vorbisFieldName RGTrackGain = "REPLAYGAIN_TRACK_GAIN"
vorbisFieldName RGAlbumPeak = "REPLAYGAIN_ALBUM_PEAK"
vorbisFieldName RGAlbumGain = "REPLAYGAIN_ALBUM_GAIN"
vorbisFieldName field :: VorbisField
field = (String -> ByteString
B8.pack (String -> ByteString)
-> (VorbisField -> String) -> VorbisField -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toUpper ShowS -> (VorbisField -> String) -> VorbisField -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VorbisField -> String
forall a. Show a => a -> String
show) VorbisField
field
toChannelMask :: Word32 -> Set SpeakerPosition
toChannelMask :: Word32 -> Set SpeakerPosition
toChannelMask n :: Word32
n = case Word32
n of
0 -> Set SpeakerPosition
forall a. Set a
E.empty
1 -> Set SpeakerPosition
speakerMono
2 -> Set SpeakerPosition
speakerStereo
3 -> [SpeakerPosition] -> Set SpeakerPosition
forall a. Ord a => [a] -> Set a
E.fromList [SpeakerPosition
SpeakerFrontLeft, SpeakerPosition
SpeakerFrontRight, SpeakerPosition
SpeakerFrontCenter]
4 -> Set SpeakerPosition
speakerQuad
5 -> SpeakerPosition -> Set SpeakerPosition -> Set SpeakerPosition
forall a. Ord a => a -> Set a -> Set a
E.insert SpeakerPosition
SpeakerFrontCenter Set SpeakerPosition
speakerQuad
6 -> Set SpeakerPosition
speaker5_1
7 -> SpeakerPosition -> Set SpeakerPosition -> Set SpeakerPosition
forall a. Ord a => a -> Set a -> Set a
E.insert SpeakerPosition
SpeakerBackCenter Set SpeakerPosition
speaker5_1Surround
8 -> Set SpeakerPosition
speaker7_1Surround
x :: Word32
x -> [SpeakerPosition] -> Set SpeakerPosition
forall a. Ord a => [a] -> Set a
E.fromList ([SpeakerPosition] -> Set SpeakerPosition)
-> [SpeakerPosition] -> Set SpeakerPosition
forall a b. (a -> b) -> a -> b
$ Int -> [SpeakerPosition] -> [SpeakerPosition]
forall a. Int -> [a] -> [a]
take (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
x) [SpeakerPosition
forall a. Bounded a => a
minBound .. SpeakerPosition
forall a. Bounded a => a
maxBound]