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