-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Scrobbling server.
--   
--   A library providing server-side support for the Audioscrobbler
--   Realtime Submission protocol:
--   http://www.audioscrobbler.net/development/protocol/
@package scrobble
@version 0.2.1.0

-- | Scrobbling data types.
module Scrobble.Types

-- | Server configuration.
data Config
Config :: PortNumber -> String -> NominalDiffTime -> Config

-- | Port to listen on.
cfgPort :: Config -> PortNumber

-- | Host name used for server (probably just localhost).
cfgHost :: Config -> String

-- | Number of seconds of inactivity before a session expires.
cfgExpire :: Config -> NominalDiffTime

-- | Event handlers.
data Handlers
Handlers :: (Session -> IO ()) -> (Session -> IO ()) -> (Session -> NowPlaying -> IO ()) -> (Session -> [Submission] -> IO Bool) -> Handlers

-- | Initial connection hand-shake.
handleHandshake :: Handlers -> Session -> IO ()

-- | Session expiry.
handleExpire :: Handlers -> Session -> IO ()

-- | Now-playing notification.
handleNowPlaying :: Handlers -> Session -> NowPlaying -> IO ()

-- | Played tracks submission.
handleSubmissions :: Handlers -> Session -> [Submission] -> IO Bool

-- | A scrobbling session.
data Session
Session :: Bool -> String -> String -> String -> String -> UTCTime -> String -> Session

-- | Does the session require handshake?
sesHandshake :: Session -> Bool

-- | Version of the protocol.
sesVersion :: Session -> String

-- | Client (music player's) id.
sesClientId :: Session -> String

-- | Client version.
sesClientVer :: Session -> String

-- | Username.
sesUser :: Session -> String

-- | Timestamp of connection.
sesTimestamp :: Session -> UTCTime

-- | Session token.
sesToken :: Session -> String

-- | A now playing track.
data NowPlaying
NowPlaying :: String -> String -> Maybe String -> Maybe Integer -> Maybe Integer -> Maybe String -> NowPlaying

-- | Artist name.
npArtist :: NowPlaying -> String

-- | Track title.
npTrack :: NowPlaying -> String

-- | Album name (if any).
npAlbum :: NowPlaying -> Maybe String

-- | Track length in seconds (if known).
npLength :: NowPlaying -> Maybe Integer

-- | Track position (if known).
npPosition :: NowPlaying -> Maybe Integer

-- | MusicBrainz track id (if known).
npMusicBrainz :: NowPlaying -> Maybe String

-- | A track submission.
data Submission
Submission :: String -> String -> UTCTime -> Source -> Maybe Rating -> Maybe Integer -> Maybe String -> Maybe Integer -> Maybe String -> Submission

-- | Artist name.
subArtist :: Submission -> String

-- | Track title.
subTrack :: Submission -> String

-- | Track timestamp.
subTimestamp :: Submission -> UTCTime

-- | Source of track.
subSource :: Submission -> Source

-- | Rating (if any).
subRating :: Submission -> Maybe Rating

-- | Track length (if any).
subLength :: Submission -> Maybe Integer

-- | Album (if any).
subAlbum :: Submission -> Maybe String

-- | Track position in album (if any).
subPosition :: Submission -> Maybe Integer

-- | MusicBrainz track id (if any).
subMusicBrainz :: Submission -> Maybe String

-- | A rating of a track.
--   
--   Note: Currently, a web-service must also be called to set love/ban
--   status. We anticipate that this will be phased out soon, and the
--   submission service will handle the whole process.
data Rating

-- | Love (on any mode if the user has manually loved the track). This
--   implies a listen.
Love :: Rating

-- | Ban (only if source=L). This implies a skip, and the client should
--   skip to the next track when a ban happens.
Ban :: Rating

-- | Skip (only if source=L).
Skip :: Rating

-- | The source of the track. Required, must be one of the following codes:
--   
--   Please note, for the time being, sources other than P and L are not
--   supported.
data Source

-- | Chosen by the user
UserChosen :: Source

-- | Non-personalised broadcast (e.g. Shoutcast, BBC Radio 1)
NonPersonlizedBroadcast :: Source

-- | Personalised recommendation except Last.fm (e.g. Pandora, Launchcast)
Personalized :: Source

-- | Last.fm (any mode). In this case, the 5-digit Last.fm recommendation
--   key must be appended to this source ID to prove the validity of the
--   submission (for example, o[0]=L1b48a).
LastFm :: Source

-- | Source unknown.
Unknown :: Source

-- | Server response.
data Response
OK :: Response
BANNED :: Response
BADAUTH :: Response
FAILED :: String -> Response
BADSESSION :: Response

-- | A scrobbling client.
data Client
Client :: String -> URI -> URI -> Client

-- | Session token.
cliToken :: Client -> String

-- | Now playing URL to submit to.
cliNowPlaying :: Client -> URI

-- | URL to submit listened tracks to.
cliSubmit :: Client -> URI

-- | Details for creating a scrobbling client.
data Details
Details :: String -> String -> String -> String -> URI -> Details
detPassword :: Details -> String
detUsername :: Details -> String

-- | E.g. “qlb”.
detClient :: Details -> String

-- | E.g. “0.9.2”.
detVersion :: Details -> String

-- | See defaultServer in Scrobble.Client.
detServer :: Details -> URI

-- | Scrobble exception.
data ScrobblerError
ScrobblerBanned :: ScrobblerError
ScrobblerBadAuth :: ScrobblerError
ScrobblerBadTime :: ScrobblerError
ScrobblerFailed :: String -> ScrobblerError
ScrobblerHardFail :: ScrobblerError
ScrobblerSubmitFail :: String -> ScrobblerError
ScrobblerNowPlayingFail :: String -> ScrobblerError
instance Typeable ScrobblerError
instance Show Config
instance Show Session
instance Show NowPlaying
instance Enum Rating
instance Eq Rating
instance Show Rating
instance Read Rating
instance Show Source
instance Enum Source
instance Eq Source
instance Read Source
instance Show Submission
instance Show Response
instance Show Client
instance Show Details
instance Show ScrobblerError
instance Data ScrobblerError
instance Exception ScrobblerError

-- | A client for scrobbling, based upon the Audioscrobbler Realtime
--   Submission protocol v1.2
--   http://www.audioscrobbler.net/development/protocol/
--   
--   Example:
--   
--   
--    import Scrobble.Client
--    import Data.Time
--   
--   example = do
--      client <- newClient Details
--        { detPassword = "YOURPASS"
--        , detUsername = "YOURUSER"
--        , detClient   = "qlb"
--        , detVersion  = "0.9.2"
--        , detServer   = defaultServer
--        }
--      nowPlaying client NowPlaying
--        { npArtist      = "Kasabian"
--        , npTrack       = "Ladies and Gentlemen"
--        , npAlbum       = Just "West Ryder Pauper Lunatic Asylum"
--        , npLength      = Just 288
--        , npPosition    = Nothing
--        , npMusicBrainz = Nothing
--        }
--      timestamp <- getCurrentTime
--      submitTracks client
--                   [Submission { subArtist      = "Kasabian"
--                               , subTrack       = "Ladies and Gentlemen"
--                               , subTimestamp   = timestamp
--                               , subSource      = UserChosen
--                               , subRating      = Nothing
--                               , subLength      = Just 288
--                               , subAlbum       = Just "West Ryder Pauper Lunatic Asylum"
--                               , subPosition    = Nothing
--                               , subMusicBrainz = Nothing
--                               }]
--   
module Scrobble.Client

-- | Create a client session. Throws ScrobblerError.
newClient :: Details -> IO Client

-- | Send a now playing message. Throws ScrobblerError.
nowPlaying :: Client -> NowPlaying -> IO ()

-- | Submit track(s). Throws ScrobblerError.
submitTracks :: Client -> [Submission] -> IO ()

-- | Default Audioscrobbler server: http:post.audioscrobbler.com/
defaultServer :: URI
instance Show CurlGrab

-- | A server for scrobbling, based upon the Audioscrobbler Realtime
--   Submission protocol v1.2
--   http://www.audioscrobbler.net/development/protocol/
module Scrobble.Server

-- | Start a scrobbling server.
startScrobbleServer :: Config -> Handlers -> IO ()
