package pb.tagreader;

message SongMetadata {
  enum Type {
    UNKNOWN = 0;
    ASF = 1;
    FLAC = 2;
    MP4 = 3;
    MPC = 4;
    MPEG = 5;
    OGGFLAC = 6;
    OGGSPEEX = 7;
    OGGVORBIS = 8;
    AIFF = 9;
    WAV = 10;
    TRUEAUDIO = 11;
    CDDA = 12;
    OGGOPUS = 13;
    STREAM = 99;
  }

  optional bool valid = 1;
  optional string title = 2;
  optional string album = 3;
  optional string artist = 4;
  optional string albumartist = 5;
  optional string composer = 6;
  optional int32 track = 7;
  optional int32 disc = 8;
  optional float bpm = 9;
  optional int32 year = 10;
  optional string genre = 11;
  optional string comment = 12;
  optional bool compilation = 13;
  optional float rating = 14;
  optional int32 playcount = 15;
  optional int32 skipcount = 16;
  optional int32 lastplayed = 17;
  optional int32 score = 18;
  optional uint64 length_nanosec = 19;
  optional int32 bitrate = 20;
  optional int32 samplerate = 21;
  optional string url = 22;
  optional string basefilename = 23;
  optional int32 mtime = 24;
  optional int32 ctime = 25;
  optional int32 filesize = 26;
  optional bool suspicious_tags = 27;
  optional string art_automatic = 28;
  optional Type type = 29;
  optional string etag = 30;
  optional string performer = 31;
  optional string grouping = 32;
}

message ReadFileRequest {
  optional string filename = 1;
}

message ReadFileResponse {
  optional SongMetadata metadata = 1;
}

message SaveFileRequest {
  optional string filename = 1;
  optional SongMetadata metadata = 2;
}

message SaveFileResponse {
  optional bool success = 1;
}

message IsMediaFileRequest {
  optional string filename = 1;
}

message IsMediaFileResponse {
  optional bool success = 1;
}

message LoadEmbeddedArtRequest {
  optional string filename = 1;
}

message LoadEmbeddedArtResponse {
  optional bytes data = 1;
}

message ReadCloudFileRequest {
  optional string download_url = 1;
  optional string title = 2;
  optional int32 size = 3;
  optional string authorisation_header = 4;
  optional string mime_type = 5;
}

message ReadCloudFileResponse {
  optional SongMetadata metadata = 1;
}

message SaveSongStatisticsToFileRequest {
  optional string filename = 1;
  optional SongMetadata metadata = 2;
}

message SaveSongStatisticsToFileResponse {
  optional bool success = 1;
}

message SaveSongRatingToFileRequest {
  optional string filename = 1;
  optional SongMetadata metadata = 2;
}

message SaveSongRatingToFileResponse {
  optional bool success = 1;
}

message Message {
  optional int32 id = 1;

  optional ReadFileRequest read_file_request = 2;
  optional ReadFileResponse read_file_response = 3;

  optional SaveFileRequest save_file_request = 4;
  optional SaveFileResponse save_file_response = 5;

  optional IsMediaFileRequest is_media_file_request = 6;
  optional IsMediaFileResponse is_media_file_response = 7;

  optional LoadEmbeddedArtRequest load_embedded_art_request = 8;
  optional LoadEmbeddedArtResponse load_embedded_art_response = 9;

  optional ReadCloudFileRequest read_cloud_file_request = 10;
  optional ReadCloudFileResponse read_cloud_file_response = 11;
  
  optional SaveSongStatisticsToFileRequest save_song_statistics_to_file_request = 12;
  optional SaveSongStatisticsToFileResponse save_song_statistics_to_file_response = 13;
  
  optional SaveSongRatingToFileRequest save_song_rating_to_file_request = 14;
  optional SaveSongRatingToFileResponse save_song_rating_to_file_response = 15;
}
