syntax = "proto2";

message TopTracks {
    optional string country = 0x1;
    repeated Track track = 0x2;
}

message ActivityPeriod {
    optional sint32 start_year = 0x1;
    optional sint32 end_year = 0x2;
    optional sint32 decade = 0x3;
}

message Artist {
    optional bytes gid = 0x1;
    optional string name = 0x2;
    optional sint32 popularity = 0x3;
    repeated TopTracks top_track = 0x4;
    repeated AlbumGroup album_group = 0x5;
    repeated AlbumGroup single_group = 0x6;
    repeated AlbumGroup compilation_group = 0x7;
    repeated AlbumGroup appears_on_group = 0x8;
    repeated string genre = 0x9;
    repeated ExternalId external_id = 0xa;
    repeated Image portrait = 0xb;
    repeated Biography biography = 0xc;
    repeated ActivityPeriod activity_period = 0xd;
    repeated Restriction restriction = 0xe;
    repeated Artist related = 0xf;
    optional bool is_portrait_album_cover = 0x10;
    optional ImageGroup portrait_group = 0x11;
}

message AlbumGroup {
    repeated Album album = 0x1;
}

message Date {
    optional sint32 year = 0x1;
    optional sint32 month = 0x2;
    optional sint32 day = 0x3;
    optional sint32 hour = 0x4;
    optional sint32 minute = 0x5;
}

message Album {
    optional bytes gid = 0x1;
    optional string name = 0x2;
    repeated Artist artist = 0x3;
    optional Type typ = 0x4;
    enum Type {
        ALBUM = 0x1;
        SINGLE = 0x2;
        COMPILATION = 0x3;
        EP = 0x4;
    }
    optional string label = 0x5;
    optional Date date = 0x6;
    optional sint32 popularity = 0x7;
    repeated string genre = 0x8;
    repeated Image cover = 0x9;
    repeated ExternalId external_id = 0xa;
    repeated Disc disc = 0xb;
    repeated string review = 0xc;
    repeated Copyright copyright = 0xd;
    repeated Restriction restriction = 0xe;
    repeated Album related = 0xf;
    repeated SalePeriod sale_period = 0x10;
    optional ImageGroup cover_group = 0x11;
}

message Track {
    optional bytes gid = 0x1;
    optional string name = 0x2;
    optional Album album = 0x3;
    repeated Artist artist = 0x4;
    optional sint32 number = 0x5;
    optional sint32 disc_number = 0x6;
    optional sint32 duration = 0x7;
    optional sint32 popularity = 0x8;
    optional bool explicit = 0x9;
    repeated ExternalId external_id = 0xa;
    repeated Restriction restriction = 0xb;
    repeated AudioFile file = 0xc;
    repeated Track alternative = 0xd;
    repeated SalePeriod sale_period = 0xe;
    repeated AudioFile preview = 0xf;
}

message Image {
    optional bytes file_id = 0x1;
    optional Size size = 0x2;
    enum Size {
        DEFAULT = 0x0;
        SMALL = 0x1;
        LARGE = 0x2;
        XLARGE = 0x3;
    }
    optional sint32 width = 0x3;
    optional sint32 height = 0x4;
}

message ImageGroup {
    repeated Image image = 0x1;
}

message Biography {
    optional string text = 0x1;
    repeated Image portrait = 0x2;
    repeated ImageGroup portrait_group = 0x3;
}

message Disc {
    optional sint32 number = 0x1;
    optional string name = 0x2;
    repeated Track track = 0x3;
}

message Copyright {
    optional Type typ = 0x1;
    enum Type {
        P = 0x0;
        C = 0x1;
    }
    optional string text = 0x2;
}

message Restriction {
    enum Catalogue {
      AD = 0;
      SUBSCRIPTION = 1;
      CATALOGUE_ALL = 2;
      SHUFFLE = 3;
      COMMERCIAL = 4;
    }
    enum Type {
        STREAMING = 0x0;
    }
    repeated Catalogue catalogue = 0x1;
    optional string countries_allowed = 0x2;
    optional string countries_forbidden = 0x3;
    optional Type typ = 0x4;

    repeated string catalogue_str = 0x5;
}

message Availability {
	repeated string catalogue_str = 0x1;
	optional Date start = 0x2;
}

message SalePeriod {
    repeated Restriction restriction = 0x1;
    optional Date start = 0x2;
    optional Date end = 0x3;
}

message ExternalId {
    optional string typ = 0x1;
    optional string id = 0x2;
}

message AudioFile {
    optional bytes file_id = 0x1;
    optional Format format = 0x2;
    enum Format {
        OGG_VORBIS_96 = 0x0;
        OGG_VORBIS_160 = 0x1;
        OGG_VORBIS_320 = 0x2;
        MP3_256 = 0x3;
        MP3_320 = 0x4;
        MP3_160 = 0x5;
        MP3_96 = 0x6;
        MP3_160_ENC = 0x7;
        // v4 
        // AAC_24 = 0x8;
        // AAC_48 = 0x9;
        MP4_128_DUAL = 0x8;
        OTHER3 = 0x9;
        AAC_160 = 0xa;
        AAC_320 = 0xb;
        MP4_128 = 0xc;
        OTHER5 = 0xd;
    }
}

message VideoFile {
	optional bytes file_id = 1;
}

// Podcast Protos
message Show {
  enum MediaType {
      MIXED = 0;
      AUDIO = 1;
      VIDEO = 2;
  }
  enum ConsumptionOrder {
      SEQUENTIAL = 1;
      EPISODIC = 2;
      RECENT = 3;
    }
  enum PassthroughEnum {
      UNKNOWN = 0;
      NONE = 1;
      ALLOWED = 2;
  }
  optional bytes gid = 0x1;
  optional string name = 0x2;
  optional string description = 0x40;
  optional sint32 deprecated_popularity = 0x41;
  optional string publisher = 0x42;
  optional string language = 0x43;
  optional bool explicit = 0x44;
  optional ImageGroup covers = 0x45;
  repeated Episode episode = 0x46;
  repeated Copyright copyright = 0x47;
  repeated Restriction restriction = 0x48;
  repeated string keyword = 0x49;
  optional MediaType media_type = 0x4A;
  optional ConsumptionOrder consumption_order = 0x4B;
  optional bool interpret_restriction_using_geoip = 0x4C;
  repeated Availability availability = 0x4E;
  optional string country_of_origin = 0x4F;	
  repeated Category categories = 0x50;
  optional PassthroughEnum passthrough = 0x51;
}

message Episode {
  optional bytes gid = 0x1;
  optional string name = 0x2;
  optional sint32 duration = 0x7;
  optional sint32 popularity = 0x8;
  repeated AudioFile file = 0xc;
  optional string description = 0x40;
  optional sint32 number = 0x41;
  optional Date publish_time = 0x42;
  optional sint32 deprecated_popularity = 0x43;
  optional ImageGroup covers = 0x44;
  optional string language = 0x45;
  optional bool explicit = 0x46;
  optional Show show = 0x47;
  repeated VideoFile video = 0x48;
	repeated VideoFile video_preview = 0x49;
  repeated AudioFile audio_preview = 0x4A;
  repeated Restriction restriction = 0x4B;
  optional ImageGroup freeze_frame = 0x4C;
  repeated string keyword = 0x4D;
  // Order of these two flags might be wrong! 
  optional bool suppress_monetization = 0x4E;
  optional bool interpret_restriction_using_geoip = 0x4F;
  
  optional bool allow_background_playback = 0x51;
  repeated Availability availability = 0x52;
  optional string external_url = 0x53;
  optional OriginalAudio original_audio = 0x54;
}

message Category {
  optional string name =  0x1;
  repeated Category subcategories = 0x2;
}

message OriginalAudio {
  optional bytes uuid = 0x1;
}
