@@ -25,12 +25,14 @@ module Sound.HTagLib.Setter
2525 genreSetter ,
2626 yearSetter ,
2727 trackNumberSetter ,
28+ propertySetter ,
2829 )
2930where
3031
3132import Control.Applicative ((<|>) )
3233import Control.Monad.IO.Class
3334import Data.Foldable (forM_ )
35+ import Data.Text (Text )
3436import Sound.HTagLib.Internal qualified as I
3537import Sound.HTagLib.Type
3638
@@ -49,7 +51,8 @@ data TagSetter = TagSetter
4951 sdComment :: Maybe Comment ,
5052 sdGenre :: Maybe Genre ,
5153 sdYear :: Maybe (Maybe Year ),
52- sdTrackNumber :: Maybe (Maybe TrackNumber )
54+ sdTrackNumber :: Maybe (Maybe TrackNumber ),
55+ sdProperties :: [(Text , [Text ])]
5356 }
5457
5558-- | @since 1.2.0
@@ -63,7 +66,8 @@ instance Semigroup TagSetter where
6366 sdComment = f sdComment,
6467 sdGenre = f sdGenre,
6568 sdYear = f sdYear,
66- sdTrackNumber = f sdTrackNumber
69+ sdTrackNumber = f sdTrackNumber,
70+ sdProperties = f sdProperties
6771 }
6872
6973instance Monoid TagSetter where
@@ -75,7 +79,8 @@ instance Monoid TagSetter where
7579 sdComment = Nothing ,
7680 sdGenre = Nothing ,
7781 sdYear = Nothing ,
78- sdTrackNumber = Nothing
82+ sdTrackNumber = Nothing ,
83+ sdProperties = []
7984 }
8085 mappend = (<>)
8186
@@ -131,7 +136,13 @@ execSetter path enc t TagSetter {..} = liftIO . I.withFile path t $ \fid -> do
131136 writeTag sdGenre I. setGenre
132137 writeTag sdYear I. setYear
133138 writeTag sdTrackNumber I. setTrackNumber
139+ forM_ sdProperties (writeProperty fid)
134140 I. saveFile path fid
141+ where
142+ writeProperty fid (k, [] ) = I. propertySet k Nothing fid
143+ writeProperty fid (k, v : vs) = do
144+ I. propertySet k (Just v) fid
145+ forM_ vs $ \ v' -> I. propertySetAppend k (Just v') fid
135146
136147-- | Setter for the track title.
137148titleSetter :: Title -> TagSetter
@@ -160,3 +171,7 @@ yearSetter x = mempty {sdYear = Just x}
160171-- | Setter for the track number, use 'Nothing' to clear the field.
161172trackNumberSetter :: Maybe TrackNumber -> TagSetter
162173trackNumberSetter x = mempty {sdTrackNumber = Just x}
174+
175+ -- | Setter for a property with a given key, use an empty list to clear it.
176+ propertySetter :: Text -> [Text ] -> TagSetter
177+ propertySetter k v = mempty {sdProperties = [(k, v)]}
0 commit comments