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 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
      exception Error of Lastfm.Audioscrobbler.error
      val string_of_error : Lastfm.Audioscrobbler.error -> string
      val do_np :
        Lastfm.client -> Lastfm.login -> Lastfm.Audioscrobbler.song -> unit
      val do_submit :
        Lastfm.client ->
        Lastfm.login -> Lastfm.Audioscrobbler.song list -> unit
      val handshake : Lastfm.client -> Lastfm.login -> string
      val np : string -> Lastfm.Audioscrobbler.song -> unit
      val submit : string -> Lastfm.Audioscrobbler.song list -> unit
    end
  module Radio :
    sig
      type track = (string * string) list * string
      type error =
          Http of string
        | Init 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 -> unit
      val url : string -> string option -> string
      val playlist : string -> string option -> string
      val tracks : string -> string option -> Lastfm.Radio.track list
      val clear : string -> unit
    end
end