liblastfm-0.1.0.0: src/Network/Lastfm/Track.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE UnicodeSyntax #-}
-- | Lastfm track API
--
-- This module is intended to be imported qualified:
--
-- @
-- import qualified Network.Lastfm.Track as Track
-- @
module Network.Lastfm.Track
( ArtistTrackOrMBID
, addTags, ban, getBuyLinks, getCorrection, getFingerprintMetadata
, getInfo, getShouts, getSimilar, getTags, getTopFans
, getTopTags, love, removeTag, scrobble
, search, share, unban, unlove, updateNowPlaying
) where
import Control.Applicative
import Network.Lastfm.Request
-- | Unify ('Artist' → 'Track' → …) and ('MBID' → …)
class ArtistTrackOrMBID a
instance ArtistTrackOrMBID (MBID → APIKey → Ready)
instance ArtistTrackOrMBID (Artist → Track → APIKey → Ready)
-- | Tag a track using a list of user supplied tags.
--
-- <http://www.last.fm/api/show/track.addTags>
addTags ∷ Request f Sign (Artist → Track → [Tag] → APIKey → SessionKey → Ready)
addTags = api "track.addTags" <* post
{-# INLINE addTags #-}
-- | Ban a track for a given user profile.
--
-- <http://www.last.fm/api/show/track.ban>
ban ∷ Request f Sign (Artist → Track → APIKey → SessionKey → Ready)
ban = api "track.ban" <* post
{-# INLINE ban #-}
-- | Get a list of Buy Links for a particular track.
--
-- Optional: 'autocorrect'
--
-- <http://www.last.fm/api/show/track.getBuylinks>
getBuyLinks ∷ ArtistTrackOrMBID t ⇒ Request f Send (Country → t)
getBuyLinks = api "track.getBuyLinks"
{-# INLINE getBuyLinks #-}
-- | Use the last.fm corrections data to check whether
-- the supplied track has a correction to a canonical track.
--
-- <http://www.last.fm/api/show/track.getCorrection>
getCorrection ∷ Request f Send (Artist → Track → APIKey → Ready)
getCorrection = api "track.getCorrection"
{-# INLINE getCorrection #-}
-- | Retrieve track metadata associated with a fingerprint id
-- generated by the Last.fm Fingerprinter. Returns track
-- elements, along with a 'rank' value between 0 and 1 reflecting the confidence for each match.
--
-- <http://www.last.fm/api/show/track.getFingerprintMetadata>
getFingerprintMetadata ∷ Request f Send (Fingerprint → APIKey → Ready)
getFingerprintMetadata = api "track.getFingerprintMetadata"
{-# INLINE getFingerprintMetadata #-}
-- | Get the metadata for a track on Last.fm.
--
-- Optional: 'autocorrect', 'username'
--
-- <http://www.last.fm/api/show/track.getInfo>
getInfo ∷ ArtistTrackOrMBID t ⇒ Request f Send t
getInfo = api "track.getInfo"
{-# INLINE getInfo #-}
-- | Get shouts for this track. Also available as an rss feed.
--
-- Optional: 'autocorrect', 'limit', 'page'
--
-- <http://www.last.fm/api/show/track.getShouts>
getShouts ∷ ArtistTrackOrMBID t ⇒ Request f Send t
getShouts = api "track.getShouts"
{-# INLINE getShouts #-}
-- | Get the similar tracks for this track on Last.fm, based on listening data.
--
-- Optional: 'autocorrect', 'limit'
--
-- <http://www.last.fm/api/show/track.getSimilar>
getSimilar ∷ ArtistTrackOrMBID t ⇒ Request f Send t
getSimilar = api "track.getSimilar"
{-# INLINE getSimilar #-}
-- | Get the tags applied by an individual user to a track on Last.fm.
--
-- Optional: 'autocorrect', 'user'
--
-- <http://www.last.fm/api/show/track.getTags>
getTags ∷ ArtistTrackOrMBID t ⇒ Request f Send t
getTags = api "track.getTags"
{-# INLINE getTags #-}
-- | Get the top fans for this track on Last.fm, based on listening data.
--
-- Optional: 'autocorrect'
--
-- <http://www.last.fm/api/show/track.getTopFans>
getTopFans ∷ ArtistTrackOrMBID t ⇒ Request f Send t
getTopFans = api "track.getTopFans"
{-# INLINE getTopFans #-}
-- | Get the top tags for this track on Last.fm, ordered by tag count.
--
-- Optional: 'autocorrect'
--
-- <http://www.last.fm/api/show/track.getTopTags>
getTopTags ∷ ArtistTrackOrMBID t ⇒ Request f Send t
getTopTags = api "track.getTopTags"
{-# INLINE getTopTags #-}
-- | Love a track for a user profile.
--
-- <http://www.last.fm/api/show/track.love>
love ∷ Request f Sign (Artist → Track → APIKey → SessionKey → Ready)
love = api "track.love" <* post
{-# INLINE love #-}
-- | Remove a user's tag from a track.
--
-- <http://www.last.fm/api/show/track.removeTag>
removeTag ∷ Request f Sign (Artist → Track → Tag → APIKey → SessionKey → Ready)
removeTag = api "track.removeTag" <* post
{-# INLINE removeTag #-}
-- | Used to add a track-play to a user's profile.
--
-- Optional: 'album', 'albumArtist', 'chosenByUser', 'context',
-- 'duration', 'mbid', 'streamId', 'trackNumber'
--
-- <http://www.last.fm/api/show/track.scrobble>
scrobble ∷ Request f Sign (Artist → Track → Timestamp → APIKey → SessionKey → Ready)
scrobble = api "track.scrobble" <* post
{-# INLINE scrobble #-}
-- | Search for a track by track name. Returns track matches sorted by relevance.
--
-- Optional: 'artist', 'limit', 'page'
--
-- <http://www.last.fm/api/show/track.search>
search ∷ Request f Send (Track → APIKey → Ready)
search = api "track.search"
{-# INLINE search #-}
-- | Share a track twith one or more Last.fm users or other friends.
--
-- Optional: 'public', 'message', 'recipient'
--
-- <http://www.last.fm/api/show/track.share>
share ∷ Request f Sign (Artist → Track → Recipient → APIKey → SessionKey → Ready)
share = api "track.share" <* post
{-# INLINE share #-}
-- | Unban a track for a user profile.
--
-- <http://www.last.fm/api/show/track.unban>
unban ∷ Request f Sign (Artist → Track → APIKey → SessionKey → Ready)
unban = api "track.unban" <* post
{-# INLINE unban #-}
-- | Unlove a track for a user profile.
--
-- <http://www.last.fm/api/show/track.unlove>
unlove ∷ Request f Sign (Artist → Track → APIKey → SessionKey → Ready)
unlove = api "track.unlove" <* post
{-# INLINE unlove #-}
-- | Used to notify Last.fm that a user has started listening
-- to a track. Parameter names are case sensitive.
--
-- Optional: 'album', 'albumArtist', 'context',
-- 'duration', 'mbid', 'trackNumber'
--
-- <http://www.last.fm/api/show/track.updateNowPlaying>
updateNowPlaying ∷ Request f Sign (Artist → Track → APIKey → SessionKey → Ready)
updateNowPlaying = api "track.updateNowPlaying" <* post
{-# INLINE updateNowPlaying #-}