packages feed

MusicBrainz 0.2.4 → 0.3

raw patch · 4 files changed

+85/−86 lines, 4 filesdep ~timedep ~xml-conduitPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: time, xml-conduit

API changes (from Hackage documentation)

- Network.Protocol.MusicBrainz.Types: _areaISO3166_1Codes :: Area -> [ISO3166Code]
- Network.Protocol.MusicBrainz.Types: _areaISO3166_2Codes :: Area -> [ISO3166Code]
- Network.Protocol.MusicBrainz.Types: _areaISO3166_3Codes :: Area -> [ISO3166Code]
- Network.Protocol.MusicBrainz.Types: _areaId :: Area -> MBID
- Network.Protocol.MusicBrainz.Types: _areaName :: Area -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _areaSortName :: Area -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _artistCreditArtist :: ArtistCredit -> Artist
- Network.Protocol.MusicBrainz.Types: _artistCreditJoinPhrase :: ArtistCredit -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _artistCreditName :: ArtistCredit -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _artistDisambiguation :: Artist -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _artistId :: Artist -> MBID
- Network.Protocol.MusicBrainz.Types: _artistName :: Artist -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _artistSortName :: Artist -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _coverArtArchiveArtwork :: CoverArtArchive -> Maybe Bool
- Network.Protocol.MusicBrainz.Types: _coverArtArchiveBack :: CoverArtArchive -> Maybe Bool
- Network.Protocol.MusicBrainz.Types: _coverArtArchiveCount :: CoverArtArchive -> Maybe Integer
- Network.Protocol.MusicBrainz.Types: _coverArtArchiveFront :: CoverArtArchive -> Maybe Bool
- Network.Protocol.MusicBrainz.Types: _labelId :: Label -> MBID
- Network.Protocol.MusicBrainz.Types: _labelInfoCatalogNumber :: LabelInfo -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _labelInfoLabel :: LabelInfo -> Label
- Network.Protocol.MusicBrainz.Types: _labelLabelCode :: Label -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _labelName :: Label -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _labelSortName :: Label -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _mediumFormat :: Medium -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _mediumPosition :: Medium -> Maybe Integer
- Network.Protocol.MusicBrainz.Types: _mediumTitle :: Medium -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _mediumTrackCount :: Medium -> Integer
- Network.Protocol.MusicBrainz.Types: _mediumTrackList :: Medium -> Maybe [Track]
- Network.Protocol.MusicBrainz.Types: _mediumTrackOffset :: Medium -> Maybe Integer
- Network.Protocol.MusicBrainz.Types: _recordingArtistCredit :: Recording -> [ArtistCredit]
- Network.Protocol.MusicBrainz.Types: _recordingId :: Recording -> MBID
- Network.Protocol.MusicBrainz.Types: _recordingLength :: Recording -> Maybe Integer
- Network.Protocol.MusicBrainz.Types: _recordingTitle :: Recording -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseASIN :: Release -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseArtistCredit :: Release -> [ArtistCredit]
- Network.Protocol.MusicBrainz.Types: _releaseBarcode :: Release -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseCountry :: Release -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseCoverArtArchive :: Release -> Maybe CoverArtArchive
- Network.Protocol.MusicBrainz.Types: _releaseDate :: Release -> Maybe Day
- Network.Protocol.MusicBrainz.Types: _releaseEventArea :: ReleaseEvent -> Maybe Area
- Network.Protocol.MusicBrainz.Types: _releaseEventDate :: ReleaseEvent -> Maybe Day
- Network.Protocol.MusicBrainz.Types: _releaseEvents :: Release -> [ReleaseEvent]
- Network.Protocol.MusicBrainz.Types: _releaseGroupArtistCredit :: ReleaseGroup -> [ArtistCredit]
- Network.Protocol.MusicBrainz.Types: _releaseGroupFirstReleaseDate :: ReleaseGroup -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseGroupId :: ReleaseGroup -> MBID
- Network.Protocol.MusicBrainz.Types: _releaseGroupPrimaryType :: ReleaseGroup -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseGroupTitle :: ReleaseGroup -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseGroupType :: ReleaseGroup -> Text
- Network.Protocol.MusicBrainz.Types: _releaseId :: Release -> MBID
- Network.Protocol.MusicBrainz.Types: _releaseMedia :: Release -> Vector Medium
- Network.Protocol.MusicBrainz.Types: _releasePackaging :: Release -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseQuality :: Release -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseStatus :: Release -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _releaseTextRepresentation :: Release -> Maybe TextRepresentation
- Network.Protocol.MusicBrainz.Types: _releaseTitle :: Release -> Text
- Network.Protocol.MusicBrainz.Types: _textRepLanguage :: TextRepresentation -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _textRepScript :: TextRepresentation -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _trackArtistCredit :: Track -> [ArtistCredit]
- Network.Protocol.MusicBrainz.Types: _trackId :: Track -> MBID
- Network.Protocol.MusicBrainz.Types: _trackLength :: Track -> Maybe Integer
- Network.Protocol.MusicBrainz.Types: _trackNumber :: Track -> Maybe Text
- Network.Protocol.MusicBrainz.Types: _trackPosition :: Track -> Maybe Integer
- Network.Protocol.MusicBrainz.Types: _trackRecording :: Track -> Recording
- Network.Protocol.MusicBrainz.Types: instance Eq Area
- Network.Protocol.MusicBrainz.Types: instance Eq Artist
- Network.Protocol.MusicBrainz.Types: instance Eq ArtistCredit
- Network.Protocol.MusicBrainz.Types: instance Eq CoverArtArchive
- Network.Protocol.MusicBrainz.Types: instance Eq ISO3166Code
- Network.Protocol.MusicBrainz.Types: instance Eq Label
- Network.Protocol.MusicBrainz.Types: instance Eq LabelInfo
- Network.Protocol.MusicBrainz.Types: instance Eq MBID
- Network.Protocol.MusicBrainz.Types: instance Eq Medium
- Network.Protocol.MusicBrainz.Types: instance Eq Recording
- Network.Protocol.MusicBrainz.Types: instance Eq Release
- Network.Protocol.MusicBrainz.Types: instance Eq ReleaseEvent
- Network.Protocol.MusicBrainz.Types: instance Eq ReleaseGroup
- Network.Protocol.MusicBrainz.Types: instance Eq TextRepresentation
- Network.Protocol.MusicBrainz.Types: instance Eq Track
- Network.Protocol.MusicBrainz.Types: instance FromJSON Area
- Network.Protocol.MusicBrainz.Types: instance FromJSON Artist
- Network.Protocol.MusicBrainz.Types: instance FromJSON ArtistCredit
- Network.Protocol.MusicBrainz.Types: instance FromJSON CoverArtArchive
- Network.Protocol.MusicBrainz.Types: instance FromJSON ISO3166Code
- Network.Protocol.MusicBrainz.Types: instance FromJSON Medium
- Network.Protocol.MusicBrainz.Types: instance FromJSON Recording
- Network.Protocol.MusicBrainz.Types: instance FromJSON Release
- Network.Protocol.MusicBrainz.Types: instance FromJSON ReleaseEvent
- Network.Protocol.MusicBrainz.Types: instance FromJSON TextRepresentation
- Network.Protocol.MusicBrainz.Types: instance FromJSON Track
- Network.Protocol.MusicBrainz.Types: instance Show Area
- Network.Protocol.MusicBrainz.Types: instance Show Artist
- Network.Protocol.MusicBrainz.Types: instance Show ArtistCredit
- Network.Protocol.MusicBrainz.Types: instance Show CoverArtArchive
- Network.Protocol.MusicBrainz.Types: instance Show ISO3166Code
- Network.Protocol.MusicBrainz.Types: instance Show Label
- Network.Protocol.MusicBrainz.Types: instance Show LabelInfo
- Network.Protocol.MusicBrainz.Types: instance Show MBID
- Network.Protocol.MusicBrainz.Types: instance Show Medium
- Network.Protocol.MusicBrainz.Types: instance Show Recording
- Network.Protocol.MusicBrainz.Types: instance Show Release
- Network.Protocol.MusicBrainz.Types: instance Show ReleaseEvent
- Network.Protocol.MusicBrainz.Types: instance Show ReleaseGroup
- Network.Protocol.MusicBrainz.Types: instance Show TextRepresentation
- Network.Protocol.MusicBrainz.Types: instance Show Track
- Network.Protocol.MusicBrainz.Types: unISO3166Code :: ISO3166Code -> Text
- Network.Protocol.MusicBrainz.Types: unMBID :: MBID -> Text
+ Network.Protocol.MusicBrainz.Types: [_areaISO3166_1Codes] :: Area -> [ISO3166Code]
+ Network.Protocol.MusicBrainz.Types: [_areaISO3166_2Codes] :: Area -> [ISO3166Code]
+ Network.Protocol.MusicBrainz.Types: [_areaISO3166_3Codes] :: Area -> [ISO3166Code]
+ Network.Protocol.MusicBrainz.Types: [_areaId] :: Area -> MBID
+ Network.Protocol.MusicBrainz.Types: [_areaName] :: Area -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_areaSortName] :: Area -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_artistCreditArtist] :: ArtistCredit -> Artist
+ Network.Protocol.MusicBrainz.Types: [_artistCreditJoinPhrase] :: ArtistCredit -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_artistCreditName] :: ArtistCredit -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_artistDisambiguation] :: Artist -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_artistId] :: Artist -> MBID
+ Network.Protocol.MusicBrainz.Types: [_artistName] :: Artist -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_artistSortName] :: Artist -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_coverArtArchiveArtwork] :: CoverArtArchive -> Maybe Bool
+ Network.Protocol.MusicBrainz.Types: [_coverArtArchiveBack] :: CoverArtArchive -> Maybe Bool
+ Network.Protocol.MusicBrainz.Types: [_coverArtArchiveCount] :: CoverArtArchive -> Maybe Integer
+ Network.Protocol.MusicBrainz.Types: [_coverArtArchiveFront] :: CoverArtArchive -> Maybe Bool
+ Network.Protocol.MusicBrainz.Types: [_labelId] :: Label -> MBID
+ Network.Protocol.MusicBrainz.Types: [_labelInfoCatalogNumber] :: LabelInfo -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_labelInfoLabel] :: LabelInfo -> Label
+ Network.Protocol.MusicBrainz.Types: [_labelLabelCode] :: Label -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_labelName] :: Label -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_labelSortName] :: Label -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_mediumFormat] :: Medium -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_mediumPosition] :: Medium -> Maybe Integer
+ Network.Protocol.MusicBrainz.Types: [_mediumTitle] :: Medium -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_mediumTrackCount] :: Medium -> Integer
+ Network.Protocol.MusicBrainz.Types: [_mediumTrackList] :: Medium -> Maybe [Track]
+ Network.Protocol.MusicBrainz.Types: [_mediumTrackOffset] :: Medium -> Maybe Integer
+ Network.Protocol.MusicBrainz.Types: [_recordingArtistCredit] :: Recording -> [ArtistCredit]
+ Network.Protocol.MusicBrainz.Types: [_recordingId] :: Recording -> MBID
+ Network.Protocol.MusicBrainz.Types: [_recordingLength] :: Recording -> Maybe Integer
+ Network.Protocol.MusicBrainz.Types: [_recordingTitle] :: Recording -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseASIN] :: Release -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseArtistCredit] :: Release -> [ArtistCredit]
+ Network.Protocol.MusicBrainz.Types: [_releaseBarcode] :: Release -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseCountry] :: Release -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseCoverArtArchive] :: Release -> Maybe CoverArtArchive
+ Network.Protocol.MusicBrainz.Types: [_releaseDate] :: Release -> Maybe Day
+ Network.Protocol.MusicBrainz.Types: [_releaseEventArea] :: ReleaseEvent -> Maybe Area
+ Network.Protocol.MusicBrainz.Types: [_releaseEventDate] :: ReleaseEvent -> Maybe Day
+ Network.Protocol.MusicBrainz.Types: [_releaseEvents] :: Release -> [ReleaseEvent]
+ Network.Protocol.MusicBrainz.Types: [_releaseGroupArtistCredit] :: ReleaseGroup -> [ArtistCredit]
+ Network.Protocol.MusicBrainz.Types: [_releaseGroupFirstReleaseDate] :: ReleaseGroup -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseGroupId] :: ReleaseGroup -> MBID
+ Network.Protocol.MusicBrainz.Types: [_releaseGroupPrimaryType] :: ReleaseGroup -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseGroupTitle] :: ReleaseGroup -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseGroupType] :: ReleaseGroup -> Text
+ Network.Protocol.MusicBrainz.Types: [_releaseId] :: Release -> MBID
+ Network.Protocol.MusicBrainz.Types: [_releaseMedia] :: Release -> Vector Medium
+ Network.Protocol.MusicBrainz.Types: [_releasePackaging] :: Release -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseQuality] :: Release -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseStatus] :: Release -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_releaseTextRepresentation] :: Release -> Maybe TextRepresentation
+ Network.Protocol.MusicBrainz.Types: [_releaseTitle] :: Release -> Text
+ Network.Protocol.MusicBrainz.Types: [_textRepLanguage] :: TextRepresentation -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_textRepScript] :: TextRepresentation -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_trackArtistCredit] :: Track -> [ArtistCredit]
+ Network.Protocol.MusicBrainz.Types: [_trackId] :: Track -> MBID
+ Network.Protocol.MusicBrainz.Types: [_trackLength] :: Track -> Maybe Integer
+ Network.Protocol.MusicBrainz.Types: [_trackNumber] :: Track -> Maybe Text
+ Network.Protocol.MusicBrainz.Types: [_trackPosition] :: Track -> Maybe Integer
+ Network.Protocol.MusicBrainz.Types: [_trackRecording] :: Track -> Recording
+ Network.Protocol.MusicBrainz.Types: [unISO3166Code] :: ISO3166Code -> Text
+ Network.Protocol.MusicBrainz.Types: [unMBID] :: MBID -> Text
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.Area
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.Artist
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.ArtistCredit
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.CoverArtArchive
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.ISO3166Code
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.Medium
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.Recording
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.Release
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.ReleaseEvent
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.TextRepresentation
+ Network.Protocol.MusicBrainz.Types: instance Data.Aeson.Types.FromJSON.FromJSON Network.Protocol.MusicBrainz.Types.Track
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.Area
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.Artist
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.ArtistCredit
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.CoverArtArchive
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.ISO3166Code
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.Label
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.LabelInfo
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.MBID
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.Medium
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.Recording
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.Release
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.ReleaseEvent
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.ReleaseGroup
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.TextRepresentation
+ Network.Protocol.MusicBrainz.Types: instance GHC.Classes.Eq Network.Protocol.MusicBrainz.Types.Track
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.Area
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.Artist
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.ArtistCredit
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.CoverArtArchive
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.ISO3166Code
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.Label
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.LabelInfo
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.MBID
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.Medium
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.Recording
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.Release
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.ReleaseEvent
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.ReleaseGroup
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.TextRepresentation
+ Network.Protocol.MusicBrainz.Types: instance GHC.Show.Show Network.Protocol.MusicBrainz.Types.Track
- Network.Protocol.MusicBrainz.JSON.WebService: getRecordingById :: (MonadBaseControl IO m, MonadIO m) => MBID -> m (Either String Recording)
+ Network.Protocol.MusicBrainz.JSON.WebService: getRecordingById :: MonadIO m => MBID -> m (Either String Recording)
- Network.Protocol.MusicBrainz.JSON.WebService: getReleaseById :: (MonadBaseControl IO m, MonadIO m) => MBID -> m (Either String Release)
+ Network.Protocol.MusicBrainz.JSON.WebService: getReleaseById :: MonadIO m => MBID -> m (Either String Release)
- Network.Protocol.MusicBrainz.JSON.WebService: searchReleasesByArtistAndRelease :: (MonadIO m, MonadBaseControl IO m) => Text -> Text -> Maybe Int -> Maybe Int -> m (Either String [(Int, Release)])
+ Network.Protocol.MusicBrainz.JSON.WebService: searchReleasesByArtistAndRelease :: MonadIO m => Text -> Text -> Maybe Int -> Maybe Int -> m (Either String [(Int, Release)])

Files

MusicBrainz.cabal view
@@ -1,5 +1,5 @@ name:                MusicBrainz-version:             0.2.4+version:             0.3 synopsis:            interface to MusicBrainz XML2 web service description:         interface to MusicBrainz XML2 web service homepage:            http://floss.scru.org/hMusicBrainz@@ -7,7 +7,7 @@ license-file:        LICENSE author:              Clint Adams maintainer:          clint@debian.org-copyright:           2012-2015 Clint Adams+copyright:           2012-2017 Clint Adams category:            Network build-type:          Simple cabal-version:       >=1.8@@ -32,17 +32,17 @@                , xml-types     >= 0.3                , http-conduit  >= 1.8.8                , http-types    >= 0.6-               , xml-conduit   >= 1.1+               , xml-conduit   >= 1.5                , HTTP          >= 4000.0                , aeson         >= 0.6.1   ghc-options: -Wall  source-repository head   type:     git-  location: git://anonscm.debian.org/users/clint/MusicBrainz.git+  location: https://anonscm.debian.org/git/users/clint/MusicBrainz.git   branch:   master  source-repository this   type:     git-  location: git://anonscm.debian.org/users/clint/MusicBrainz.git-  tag:      hMB/0.2.4+  location: https://anonscm.debian.org/git/users/clint/MusicBrainz.git+  tag:      hMB/0.3
Network/Protocol/MusicBrainz/JSON/WebService.hs view
@@ -9,7 +9,6 @@ import Network.Protocol.MusicBrainz.Types  import Control.Monad.IO.Class (MonadIO)-import Control.Monad.Trans.Control (MonadBaseControl) import Data.Aeson (eitherDecode) import qualified Data.ByteString.Lazy as BL import Data.List (intercalate)@@ -24,8 +23,8 @@     simpleHttp url     where         incs [] = ""-	incs xs = ("?inc="++) . intercalate "+" . map T.unpack $ xs-	fj = "&fmt=json"+        incs xs = ("?inc="++) . intercalate "+" . map T.unpack $ xs+        fj = "&fmt=json"  musicBrainzWSSearch :: MonadIO m => Text -> Text -> Maybe Int -> Maybe Int -> m BL.ByteString musicBrainzWSSearch reqtype query mlimit moffset = do@@ -33,22 +32,22 @@     simpleHttp url     where         limit Nothing = ""-	limit (Just l) = "&limit=" ++ show l+        limit (Just l) = "&limit=" ++ show l         offset Nothing = ""-	offset (Just o) = "&offset=" ++ show o-	fj = "&fmt=json"+        offset (Just o) = "&offset=" ++ show o+        fj = "&fmt=json" -getRecordingById :: (MonadBaseControl IO m, MonadIO m) => MBID -> m (Either String Recording)+getRecordingById :: MonadIO m => MBID -> m (Either String Recording) getRecordingById mbid = do     lbs <- musicBrainzWSLookup "recording" (unMBID mbid) ["artist-credits"]     return $ eitherDecode lbs -getReleaseById :: (MonadBaseControl IO m, MonadIO m) => MBID -> m (Either String Release)+getReleaseById :: MonadIO m => MBID -> m (Either String Release) getReleaseById mbid = do     lbs <- musicBrainzWSLookup "release" (unMBID mbid) ["recordings", "artist-credits"]     return $ eitherDecode lbs -searchReleasesByArtistAndRelease :: (MonadIO m, MonadBaseControl IO m)  => Text -> Text -> Maybe Int -> Maybe Int -> m (Either String [(Int, Release)])+searchReleasesByArtistAndRelease :: MonadIO m => Text -> Text -> Maybe Int -> Maybe Int -> m (Either String [(Int, Release)]) searchReleasesByArtistAndRelease artist release mlimit moffset = do     lbs <- musicBrainzWSSearch "release" (T.concat ["artist:\"", artist, "\" AND release:\"", release, "\""]) mlimit moffset     return $ eitherDecode lbs
Network/Protocol/MusicBrainz/Types.hs view
@@ -27,7 +27,7 @@ import Data.Aeson (FromJSON(..), (.:), (.:?), Value(..)) import Data.Maybe (fromMaybe) import qualified Data.Text as T-import Data.Time.Format (parseTime)+import Data.Time.Format (parseTimeM) import Data.Time.Locale.Compat (defaultTimeLocale)  newtype MBID = MBID { unMBID :: Text }@@ -53,19 +53,19 @@ instance FromJSON Release where     parseJSON (Object v) = Release <$>                                  (MBID <$> v .: "id") <*>-				 v .: "title" <*>-				 v .:? "status" <*>-				 v .:? "quality" <*>-				 v .:? "packaging" <*>-				 v .:? "text-representation" <*>-				 v .: "artist-credit" <*>-				 ((parseTime defaultTimeLocale "%Y-%m-%d" . T.unpack =<<) <$> v .:? "date") <*>-				 v .:? "country" <*>-				 v .: "release-events" <*>-				 v .:? "barcode" <*>-				 v .:? "asin" <*>-				 v .:? "cover-art-archive" <*>-				 v .: "media"+                                 v .: "title" <*>+                                 v .:? "status" <*>+                                 v .:? "quality" <*>+                                 v .:? "packaging" <*>+                                 v .:? "text-representation" <*>+                                 v .: "artist-credit" <*>+                                 ((parseTimeM True defaultTimeLocale "%Y-%m-%d" . T.unpack =<<) <$> v .:? "date") <*>+                                 v .:? "country" <*>+                                 v .: "release-events" <*>+                                 v .:? "barcode" <*>+                                 v .:? "asin" <*>+                                 v .:? "cover-art-archive" <*>+                                 v .: "media"     parseJSON _          = mzero  data TextRepresentation = TextRepresentation {@@ -75,8 +75,8 @@  instance FromJSON TextRepresentation where     parseJSON (Object v) = TextRepresentation <$>-				 v .:? "language" <*>-				 v .:? "script"+                                 v .:? "language" <*>+                                 v .:? "script"     parseJSON _          = mzero  data Medium = Medium {@@ -90,12 +90,12 @@  instance FromJSON Medium where     parseJSON (Object v) = Medium <$>-				 v .:? "title" <*>-				 v .:? "position" <*>-				 v .:? "format" <*>-				 v .:  "track-count" <*>-				 v .:? "track-offset" <*>-				 v .:? "tracks"+                                 v .:? "title" <*>+                                 v .:? "position" <*>+                                 v .:? "format" <*>+                                 v .:  "track-count" <*>+                                 v .:? "track-offset" <*>+                                 v .:? "tracks"     parseJSON _          = mzero  data Track = Track {@@ -109,12 +109,12 @@  instance FromJSON Track where     parseJSON (Object v) = Track <$>-				 (MBID <$> v .: "id") <*>-				 v .: "artist-credit" <*>-				 v .:? "position" <*>-				 v .:? "number" <*>-				 v .:? "length" <*>-				 v .: "recording"+                                 (MBID <$> v .: "id") <*>+                                 v .: "artist-credit" <*>+                                 v .:? "position" <*>+                                 v .:? "number" <*>+                                 v .:? "length" <*>+                                 v .: "recording"     parseJSON _          = mzero  data Recording = Recording {@@ -126,10 +126,10 @@  instance FromJSON Recording where     parseJSON (Object v) = Recording <$>-				 (MBID <$> v .: "id") <*>-				 v .:? "title" <*>-				 v .:? "length" <*>-				 v .: "artist-credit"+                                 (MBID <$> v .: "id") <*>+                                 v .:? "title" <*>+                                 v .:? "length" <*>+                                 v .: "artist-credit"     parseJSON _          = mzero  data ArtistCredit = ArtistCredit {@@ -140,9 +140,9 @@  instance FromJSON ArtistCredit where     parseJSON (Object v) = ArtistCredit <$>-				 v .: "artist" <*>-				 v .:? "joinphrase" <*>-				 v .:? "name"+                                 v .: "artist" <*>+                                 v .:? "joinphrase" <*>+                                 v .:? "name"     parseJSON _          = mzero  data Artist = Artist {@@ -154,10 +154,10 @@  instance FromJSON Artist where     parseJSON (Object v) = Artist <$>-				 (MBID <$> v .: "id") <*>-				 v .:? "name" <*>-				 v .:? "sort-name" <*>-				 v .:? "disambiguation"+                                 (MBID <$> v .: "id") <*>+                                 v .:? "name" <*>+                                 v .:? "sort-name" <*>+                                 v .:? "disambiguation"     parseJSON _          = mzero  data ReleaseGroup = ReleaseGroup {@@ -188,8 +188,8 @@  instance FromJSON ReleaseEvent where     parseJSON (Object v) = ReleaseEvent <$>-				 ((parseTime defaultTimeLocale "%Y-%m-%d" . T.unpack =<<) <$> v .:? "date") <*>-				 v .:? "area"+                                 ((parseTimeM True defaultTimeLocale "%Y-%m-%d" . T.unpack =<<) <$> v .:? "date") <*>+                                 v .:? "area"     parseJSON _          = mzero  data Area = Area {@@ -203,12 +203,12 @@  instance FromJSON Area where     parseJSON (Object v) = Area <$>-				 (MBID <$> v .: "id") <*>-				 v .:? "name" <*>-				 v .:? "sort-name" <*>-				 (fromMaybe [] <$> v .:? "iso_3166_1_codes") <*>-				 (fromMaybe [] <$> v .:? "iso_3166_2_codes") <*>-				 (fromMaybe [] <$> v .:? "iso_3166_3_codes")+                                 (MBID <$> v .: "id") <*>+                                 v .:? "name" <*>+                                 v .:? "sort-name" <*>+                                 (fromMaybe [] <$> v .:? "iso_3166_1_codes") <*>+                                 (fromMaybe [] <$> v .:? "iso_3166_2_codes") <*>+                                 (fromMaybe [] <$> v .:? "iso_3166_3_codes")     parseJSON _          = mzero  data CoverArtArchive = CoverArtArchive {@@ -220,10 +220,10 @@  instance FromJSON CoverArtArchive where     parseJSON (Object v) = CoverArtArchive <$>-				 v .:? "artwork" <*>-				 v .:? "count" <*>-				 v .:? "front" <*>-				 v .:? "back"+                                 v .:? "artwork" <*>+                                 v .:? "count" <*>+                                 v .:? "front" <*>+                                 v .:? "back"     parseJSON _          = mzero  newtype ISO3166Code = ISO3166Code { unISO3166Code :: Text }
Network/Protocol/MusicBrainz/XML2/WebService.hs view
@@ -20,13 +20,13 @@ import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Read as TR-import Data.Time.Format (parseTime)+import Data.Time.Format (parseTimeM) import qualified Data.Vector as V import Data.XML.Types (Event) import Network.HTTP.Base (urlEncode) import Network.HTTP.Conduit (simpleHttp) import Data.Time.Locale.Compat (defaultTimeLocale)-import Text.XML.Stream.Parse (parseBytes, def, content, tagNoAttr, tagName, requireAttr, optionalAttr, force, many, AttrParser)+import Text.XML.Stream.Parse (parseBytes, def, content, tagNoAttr, tag', requireAttr, attr, force, many, AttrParser) import Text.XML (Name(..))  musicBrainzWSLookup :: MonadIO m => Text -> Text -> [Text] -> m BL.ByteString@@ -35,7 +35,7 @@     simpleHttp url     where         incs [] = ""-	incs xs = ("?inc="++) . intercalate "+" . map T.unpack $ xs+        incs xs = ("?inc="++) . intercalate "+" . map T.unpack $ xs  musicBrainzWSSearch :: MonadIO m => Text -> Text -> Maybe Int -> Maybe Int -> m BL.ByteString musicBrainzWSSearch reqtype query mlimit moffset = do@@ -43,9 +43,9 @@     simpleHttp url     where         limit Nothing = ""-	limit (Just l) = "&limit=" ++ show l+        limit (Just l) = "&limit=" ++ show l         offset Nothing = ""-	offset (Just o) = "&offset=" ++ show o+        offset (Just o) = "&offset=" ++ show o  getRecordingById :: (MonadBaseControl IO m, MonadIO m, MonadThrow m) => MBID -> m Recording getRecordingById mbid = do@@ -66,18 +66,18 @@ sinkReleases = force "metadata required" (tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}metadata" $ many (fmap (fmap snd) parseRelease))  sinkReleaseList :: MonadThrow m => Consumer Event m [(Int, Release)]-sinkReleaseList = force "metadata required" (tagName "{http://musicbrainz.org/ns/mmd-2.0#}metadata" (optionalAttr "created") $ \_ ->-    force "release-list required" (tagName "{http://musicbrainz.org/ns/mmd-2.0#}release-list" (liftA2 (,) (requireAttr "count") (requireAttr "offset")) $ \_ -> many parseRelease))+sinkReleaseList = force "metadata required" (tag' "{http://musicbrainz.org/ns/mmd-2.0#}metadata" (attr "created") $ \_ ->+    force "release-list required" (tag' "{http://musicbrainz.org/ns/mmd-2.0#}release-list" (liftA2 (,) (requireAttr "count") (requireAttr "offset")) $ \_ -> many parseRelease))  parseRecording :: MonadThrow m => Consumer Event m (Maybe Recording)-parseRecording = tagName "{http://musicbrainz.org/ns/mmd-2.0#}recording" (requireAttr "id") $ \rid -> do+parseRecording = tag' "{http://musicbrainz.org/ns/mmd-2.0#}recording" (requireAttr "id") $ \rid -> do     title <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}title" content     len <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}length" content     ncs <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}artist-credit" $ many parseArtistCredit     return Recording { _recordingId = MBID rid, _recordingTitle = title, _recordingLength = fmap forceReadDec len, _recordingArtistCredit = fromMaybe [] ncs }  parseArtistCredit :: MonadThrow m => Consumer Event m (Maybe ArtistCredit)-parseArtistCredit = tagName "{http://musicbrainz.org/ns/mmd-2.0#}name-credit" (buggyJoinPhrase) $ \mjp -> force "artist required" (tagName "{http://musicbrainz.org/ns/mmd-2.0#}artist" (requireAttr "id") $ \aid -> do+parseArtistCredit = tag' "{http://musicbrainz.org/ns/mmd-2.0#}name-credit" (buggyJoinPhrase) $ \mjp -> force "artist required" (tag' "{http://musicbrainz.org/ns/mmd-2.0#}artist" (requireAttr "id") $ \aid -> do     name <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}name" content     sortName <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}sort-name" content     _ <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}disambiguation" content@@ -88,13 +88,13 @@ -- what's up with this buggyJoinPhrase :: AttrParser (Maybe Text) buggyJoinPhrase = fmap Just (requireAttr "{http://musicbrainz.org/ns/mmd-2.0#}joinphrase")-    <|> optionalAttr "{http://musicbrainz.org/ns/mmd-2.0#}joinphrase" { nameNamespace = Nothing }+    <|> attr "{http://musicbrainz.org/ns/mmd-2.0#}joinphrase" { nameNamespace = Nothing }  forceReadDec :: Integral a => Text -> a forceReadDec = (\(Right (d, _)) -> d) . TR.decimal  parseRelease :: MonadThrow m => Consumer Event m (Maybe (Int, Release))-parseRelease = tagName "{http://musicbrainz.org/ns/mmd-2.0#}release" (liftA2 (,) (requireAttr "id") (optionalAttr "{http://musicbrainz.org/ns/ext#-2.0}score")) $ \(rid,score) -> do+parseRelease = tag' "{http://musicbrainz.org/ns/mmd-2.0#}release" (liftA2 (,) (requireAttr "id") (attr "{http://musicbrainz.org/ns/ext#-2.0}score")) $ \(rid,score) -> do     title <- force "title required" (tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}title" content)     status <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}status" content     quality <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}quality" content@@ -104,12 +104,12 @@     _ <- parseReleaseGroup     date <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}date" content     country <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}country" content-    rel <- tagName "{http://musicbrainz.org/ns/mmd-2.0#}release-event-list" (requireAttr "count") $ \_ -> many parseReleaseEvent+    rel <- tag' "{http://musicbrainz.org/ns/mmd-2.0#}release-event-list" (requireAttr "count") $ \_ -> many parseReleaseEvent     barcode <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}barcode" content     amazonASIN <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}asin" content     coverArtArchive <- parseCoverArtArchive     _ <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}label-info-list" $ parseLabelInfo-    media <- tagName "{http://musicbrainz.org/ns/mmd-2.0#}medium-list" (requireAttr "count") $ \_ -> (tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}track-count" content >> many parseMedium)+    media <- tag' "{http://musicbrainz.org/ns/mmd-2.0#}medium-list" (requireAttr "count") $ \_ -> (tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}track-count" content >> many parseMedium)     return (maybe 0 forceReadDec score, Release {         _releaseId = MBID rid       , _releaseTitle = title@@ -118,7 +118,7 @@       , _releasePackaging = packaging       , _releaseTextRepresentation = tr       , _releaseArtistCredit = fromMaybe [] ncs-      , _releaseDate = parseTime defaultTimeLocale "%Y-%m-%d" . T.unpack =<< date+      , _releaseDate = parseTimeM True defaultTimeLocale "%Y-%m-%d" . T.unpack =<< date       , _releaseCountry = country       , _releaseEvents = fromMaybe [] rel       , _releaseBarcode = barcode@@ -141,7 +141,7 @@     title <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}title" content     position <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}position" content     format <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}format" content-    Just med <- tagName "{http://musicbrainz.org/ns/mmd-2.0#}track-list" (liftA2 (,) (requireAttr "count") (optionalAttr "offset")) $ \(c,o) -> do -- not Just+    Just med <- tag' "{http://musicbrainz.org/ns/mmd-2.0#}track-list" (liftA2 (,) (requireAttr "count") (attr "offset")) $ \(c,o) -> do -- not Just         tracks <- many parseTrack         return Medium {             _mediumTitle = title@@ -154,7 +154,7 @@     return med  parseTrack :: MonadThrow m => Consumer Event m (Maybe Track)-parseTrack = tagName "{http://musicbrainz.org/ns/mmd-2.0#}track" (requireAttr "id") $ \i -> do+parseTrack = tag' "{http://musicbrainz.org/ns/mmd-2.0#}track" (requireAttr "id") $ \i -> do     position <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}position" content     number <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}number" content     len <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}length" content@@ -170,7 +170,7 @@     }  parseReleaseGroup :: MonadThrow m => Consumer Event m (Maybe ReleaseGroup)-parseReleaseGroup = tagName "{http://musicbrainz.org/ns/mmd-2.0#}release-group" (liftA2 (,) (requireAttr "type") (requireAttr "id")) $ \(t,i) -> do+parseReleaseGroup = tag' "{http://musicbrainz.org/ns/mmd-2.0#}release-group" (liftA2 (,) (requireAttr "type") (requireAttr "id")) $ \(t,i) -> do     title <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}title" content     frd <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}first-release-date" content     pt <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}primary-type" content@@ -194,7 +194,7 @@     }  parseLabel :: MonadThrow m => Consumer Event m (Maybe Label)-parseLabel = tagName "{http://musicbrainz.org/ns/mmd-2.0#}label" (requireAttr "id") $ \i -> do+parseLabel = tag' "{http://musicbrainz.org/ns/mmd-2.0#}label" (requireAttr "id") $ \i -> do     name <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}name" content     sortname <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}sort-name" content     labelcode <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}label-code" content@@ -210,12 +210,12 @@     date <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}date" content     area <- parseArea     return ReleaseEvent {-      _releaseEventDate = parseTime defaultTimeLocale "%Y-%m-%d" . T.unpack =<< date+      _releaseEventDate = parseTimeM True defaultTimeLocale "%Y-%m-%d" . T.unpack =<< date     , _releaseEventArea = area     }  parseArea :: MonadThrow m => Consumer Event m (Maybe Area)-parseArea = tagName "{http://musicbrainz.org/ns/mmd-2.0#}area" (requireAttr "id") $ \i -> do+parseArea = tag' "{http://musicbrainz.org/ns/mmd-2.0#}area" (requireAttr "id") $ \i -> do     name <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}name" content     sortname <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}sort-name" content     isocodes1 <- tagNoAttr "{http://musicbrainz.org/ns/mmd-2.0#}iso-3166-1-code-list" $ many parseISO3166Code