sig
  type client = { client : string; version : string; }
  type login = { user : string; password : string; }
  module Audioscrobbler :
    sig
      type source = User | Broadcast | Recommendation | Lastfm | Unknown
      type rating = Love | Ban | Skip
      type action = NowPlaying | Submit
      type song = {
        artist : string;
        track : string;
        time : float option;
        source : Lastfm.Audioscrobbler.source option;
        rating : Lastfm.Audioscrobbler.rating option;
        length : float option;
        album : string option;
        trackauth : string option;
        tracknumber : int option;
        musicbrainzid : string option;
      }
      type error =
          Http of string
        | Banned
        | Badauth
        | Badtime
        | Failed of string
        | UnknownError of string
        | Success
        | Internal of string
        | BadData of string
      exception Error of Lastfm.Audioscrobbler.error
      val string_of_error : Lastfm.Audioscrobbler.error -> string
      val get_song :
        ?time:float ->
        ?source:Lastfm.Audioscrobbler.source ->
        ?rating:Lastfm.Audioscrobbler.rating ->
        ?length:float ->
        ?album:string ->
        ?tracknumber:int ->
        ?musicbrainzid:string ->
        ?trackauth:string ->
        artist:string -> track:string -> unit -> Lastfm.Audioscrobbler.song
      val check_song :
        Lastfm.Audioscrobbler.song -> Lastfm.Audioscrobbler.action -> unit
      val do_np :
        Lastfm.client -> Lastfm.login -> Lastfm.Audioscrobbler.song -> unit
      val do_submit :
        Lastfm.client ->
        Lastfm.login ->
        Lastfm.Audioscrobbler.song list ->
        (Lastfm.Audioscrobbler.error * Lastfm.Audioscrobbler.song) list
      val handshake : Lastfm.client -> Lastfm.login -> string
      val np : string -> Lastfm.Audioscrobbler.song -> unit
      val submit :
        string ->
        Lastfm.Audioscrobbler.song list ->
        (Lastfm.Audioscrobbler.error * Lastfm.Audioscrobbler.song) list
    end
  module Radio :
    sig
      type track = (string * string) list * string
      type error =
          Http of string
        | Auth of string
        | Adjust of string * string
        | Playlist
        | Empty
      exception Error of Lastfm.Radio.error
      val string_of_error : Lastfm.Radio.error -> string
      val get : string -> Lastfm.Radio.track list
      val parse : string -> Lastfm.login option * string * string option
      val init : Lastfm.login option -> string
      val adjust : string -> string -> (string * string) list
      val playlist : string -> string option -> string
      val tracks : string -> string option -> Lastfm.Radio.track list
      val clear : string -> unit
    end
end