/* This file is part of Clementine.
   Copyright 2011, David Sansome <me@davidsansome.com>

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

// Note: this file is licensed under the Apache License instead of GPL because
// it is used by the Spotify blob which links against libspotify and is not GPL
// compatible.


package pb.spotify;

message LoginRequest {
  required string username = 1;
  optional string password = 2;

  optional PlaybackSettings playback_settings = 3;
}

message LoginResponse {
  enum Error {
    BadUsernameOrPassword = 1;
    UserBanned = 2;
    UserNeedsPremium = 3;
    Other = 4;
    ReloginFailed = 5;
  }

  required bool success = 1;
  required string error = 2;
  optional Error error_code = 3 [default = Other];
}

message Playlists {
  message Playlist {
    required int32 index = 1;
    required string name = 2;
    required int32 nb_tracks = 3;
    required bool is_mine = 4;
    required string owner= 5;
    required bool is_offline = 6;
    required string uri = 7;
    // Offline sync progress between 0-100.
    optional int32 download_progress = 8;
  }

  repeated Playlist playlist = 1;
}

message Track {
  required bool starred = 1;
  required string title = 2;
  repeated string artist = 3;
  required string album = 4;
  required int32 duration_msec = 5;
  required int32 popularity = 6;
  required int32 disc = 7;
  required int32 track = 8;
  required int32 year = 9;
  required string uri = 10;
  required string album_art_id = 11;
}

message Album {
  required Track metadata = 1;
  repeated Track track = 2;
}

enum PlaylistType {
  Starred = 1;
  Inbox = 2;
  UserPlaylist = 3;
}

message LoadPlaylistRequest {
  required PlaylistType type = 1;
  optional int32 user_playlist_index = 2;
}

message LoadPlaylistResponse {
  required LoadPlaylistRequest request = 1;
  repeated Track track = 2;
}

message SyncPlaylistRequest {
  required LoadPlaylistRequest request = 1;
  required bool offline_sync = 2;
}

message SyncPlaylistProgress {
  required LoadPlaylistRequest request = 1;
  required int32 sync_progress = 2;
}

message PlaybackRequest {
  required string track_uri = 1;
  required int32 media_port = 2;
}

message PlaybackError {
  required string error = 1;
}

message SearchRequest {
  required string query = 1;
  optional int32 limit = 2 [default = 250];
  optional int32 limit_album = 3 [default = 0];
}

message SearchResponse {
  required SearchRequest request = 1;
  repeated Track result = 2;
  optional int32 total_tracks = 3;
  optional string did_you_mean = 4;
  optional string error = 5;

  // field 6 is deprecated

  repeated Album album = 7;
}

message ImageRequest {
  required string id = 1;
}

message ImageResponse {
  required string id = 1;
  optional bytes data = 2;
}

message BrowseAlbumRequest {
  required string uri = 1;
}

message BrowseAlbumResponse {
  required string uri = 1;
  repeated Track track = 2;
}

message BrowseToplistRequest {
  enum ToplistType {
    Artists = 1;
    Albums = 2;
    Tracks = 3;
  };

  enum Region {
    Everywhere = 1;
    User = 2;
  };

  required ToplistType type = 1;
  optional Region region = 2 [default=Everywhere];
  // Username to use if region is User.
  optional string username = 3;
}

message BrowseToplistResponse {
  required BrowseToplistRequest request = 1;

  repeated Track track = 2;
  repeated Album album = 3;
}

message SeekRequest {
  optional int64 offset_nsec = 1;
}

enum Bitrate {
  Bitrate96k = 1;
  Bitrate160k = 2;
  Bitrate320k = 3;
}

message PlaybackSettings {
  optional Bitrate bitrate = 1 [default = Bitrate320k];
  optional bool volume_normalisation = 2 [default = false];
}

message PauseRequest {
  optional bool paused = 1 [default = false];
}

message AddTracksToPlaylistRequest {
  required PlaylistType playlist_type = 1;
  optional int64 playlist_index = 2; // Used if playlist_index == UserPlaylist
  repeated string track_uri = 3;
}

message RemoveTracksFromPlaylistRequest {
  required PlaylistType playlist_type = 1;
  optional int64 playlist_index = 2; // Used if playlist_index == UserPlaylist
  repeated int64 track_index = 3;
}

// NEXT_ID: 25
message Message {
  // Not currently used
  optional int32 id = 18;

  optional LoginRequest login_request = 1;
  optional LoginResponse login_response = 2;
  optional Playlists playlists_updated = 3;
  optional LoadPlaylistRequest load_playlist_request = 4;
  optional LoadPlaylistResponse load_playlist_response = 5;
  optional PlaybackRequest playback_request = 6;
  optional PlaybackError playback_error = 7;
  optional SearchRequest search_request = 8;
  optional SearchResponse search_response = 9;
  optional ImageRequest image_request = 10;
  optional ImageResponse image_response = 11;
  optional SyncPlaylistRequest sync_playlist_request = 12;
  optional SyncPlaylistProgress sync_playlist_progress = 13;
  optional BrowseAlbumRequest browse_album_request = 14;
  optional BrowseAlbumResponse browse_album_response = 15;
  optional SeekRequest seek_request = 16;
  optional PlaybackSettings set_playback_settings_request = 17;
  optional BrowseToplistRequest browse_toplist_request = 19;
  optional BrowseToplistResponse browse_toplist_response = 20;
  optional PauseRequest pause_request = 21;
  // ID 22 unused.
  optional AddTracksToPlaylistRequest add_tracks_to_playlist = 23;
  optional RemoveTracksFromPlaylistRequest remove_tracks_from_playlist = 24;
}
