Safe Haskell | None |
---|---|
Language | Haskell2010 |
- class Monad m => MonadListenBrainz m where
- runListenBrainzEff :: (Member IO effs, Member (Exc ServantError) effs) => Manager -> Eff (ListenBrainzAPICall ': effs) a -> Eff effs a
- runListenBrainzT :: ListenBrainzT m a -> Manager -> m a
- submitListens :: MonadListenBrainz m => UserToken -> SubmitListens -> m Value
- data SubmitListens
- data ListenData = ListenData {}
- data TrackMetadata = TrackMetadata {
- trackArtist :: Text
- trackName :: Text
- newtype Listens = Listens [ListenData]
- getListens :: MonadListenBrainz m => Text -> Maybe Int -> Maybe Int -> Maybe Int -> m [ListenData]
- getLatestImport :: MonadListenBrainz m => Text -> m LatestImport
- updateLatestImport :: MonadListenBrainz m => UserToken -> UTCTime -> m Value
- newtype UserToken = UserToken Text
- data ListenBrainzAPICall a where
- SubmitListens :: UserToken -> SubmitListens -> ListenBrainzAPICall Value
- GetLatestImport :: Text -> ListenBrainzAPICall LatestImport
- UpdateLatestImport :: UserToken -> UTCTime -> ListenBrainzAPICall Value
- GetListens :: Text -> Maybe Int -> Maybe Int -> Maybe Int -> ListenBrainzAPICall [ListenData]
- newtype ListenBrainzT m a = ListenBrainzT (ReaderT Manager m a)
- performAPICall :: Manager -> ListenBrainzAPICall a -> IO (Either ServantError a)
- type ListenBrainzAPI = (Header "Authorization" Authorization :> ("1" :> ("submit-listens" :> (ReqBody '[JSON] SubmitListens :> Post '[JSON] Value)))) :<|> (("1" :> ("latest-import" :> (QueryParam "user_name" UserName :> Get '[JSON] LatestImport))) :<|> ((Header "Authorization" Authorization :> ("1" :> ("latest-import" :> (ReqBody '[JSON] TimeStamp :> Post '[JSON] Value)))) :<|> ("1" :> ("user" :> (Capture "user-name" Text :> ("listens" :> (QueryParam "max_ts" Int :> (QueryParam "min_ts" Int :> (QueryParam "count" Int :> Get '[JSON] Listens)))))))))
Documentation
class Monad m => MonadListenBrainz m where Source #
The class of monads that can embed calls to the ListenBrainz API.
liftListenBrainz :: Free (Coyoneda ListenBrainzAPICall) a -> m a Source #
Member ListenBrainzAPICall effs => MonadListenBrainz (Eff effs) Source # | |
(MonadIO m, MonadError ServantError m) => MonadListenBrainz (ListenBrainzT m) Source # | |
runListenBrainzEff :: (Member IO effs, Member (Exc ServantError) effs) => Manager -> Eff (ListenBrainzAPICall ': effs) a -> Eff effs a Source #
Eliminate ListenBrainzAPICall
effects by performing HTTP calls.
This implementation uses extensible effects as provided by freer-effects
.
runListenBrainzT :: ListenBrainzT m a -> Manager -> m a Source #
Run ListenBrainz calls using a traditional monad transformer stack.
API Calls
Submitting Listens
:: MonadListenBrainz m | |
=> UserToken | The private token of the user to submit a listen for. |
-> SubmitListens | |
-> m Value |
data SubmitListens Source #
A submission of listens to ListenBrainz.
The ListenBrainz documentation states:
Listens should be submitted for tracks when the user has listened to half the track or 4 minutes of the track, whichever is lower. If the user hasn’t listened to 4 minutes or half the track, it doesn’t fully count as a listen and should not be submitted.
SingleListen ListenData | Submit a single track. |
NowPlaying TrackMetadata | Submit now playing information. |
Import [ListenData] | Submit a batch of listens as an import. |
data ListenData Source #
data TrackMetadata Source #
Retrieving Listens
getListens :: MonadListenBrainz m => Text -> Maybe Int -> Maybe Int -> Maybe Int -> m [ListenData] Source #
Retrieving Import Timestamps
:: MonadListenBrainz m | |
=> Text | The user name (not user token) of the user to find the latest import timestamp |
-> m LatestImport |
Updating Import Timestamps
updateLatestImport :: MonadListenBrainz m => UserToken -> UTCTime -> m Value Source #
Types
Implementation Details
data ListenBrainzAPICall a where Source #
Possible API calls, tagged with their successful return value.
SubmitListens :: UserToken -> SubmitListens -> ListenBrainzAPICall Value | |
GetLatestImport :: Text -> ListenBrainzAPICall LatestImport | |
UpdateLatestImport :: UserToken -> UTCTime -> ListenBrainzAPICall Value | |
GetListens :: Text -> Maybe Int -> Maybe Int -> Maybe Int -> ListenBrainzAPICall [ListenData] |
newtype ListenBrainzT m a Source #
A monad transformer to interpret ListenBrainz API calls as HTTP calls.
ListenBrainzT (ReaderT Manager m a) |
MonadTrans ListenBrainzT Source # | |
Monad m => Monad (ListenBrainzT m) Source # | |
Functor m => Functor (ListenBrainzT m) Source # | |
Applicative m => Applicative (ListenBrainzT m) Source # | |
MonadIO m => MonadIO (ListenBrainzT m) Source # | |
(MonadIO m, MonadError ServantError m) => MonadListenBrainz (ListenBrainzT m) Source # | |
performAPICall :: Manager -> ListenBrainzAPICall a -> IO (Either ServantError a) Source #
type ListenBrainzAPI = (Header "Authorization" Authorization :> ("1" :> ("submit-listens" :> (ReqBody '[JSON] SubmitListens :> Post '[JSON] Value)))) :<|> (("1" :> ("latest-import" :> (QueryParam "user_name" UserName :> Get '[JSON] LatestImport))) :<|> ((Header "Authorization" Authorization :> ("1" :> ("latest-import" :> (ReqBody '[JSON] TimeStamp :> Post '[JSON] Value)))) :<|> ("1" :> ("user" :> (Capture "user-name" Text :> ("listens" :> (QueryParam "max_ts" Int :> (QueryParam "min_ts" Int :> (QueryParam "count" Int :> Get '[JSON] Listens))))))))) Source #