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; } 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 { optional string countries_allowed = 0x2; optional string countries_forbidden = 0x3; optional Type typ = 0x4; enum Type { STREAMING = 0x0; } repeated string catalogue_str = 0x5; } 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; MP4_128_DUAL = 0x8; OTHER3 = 0x9; AAC_160 = 0xa; AAC_320 = 0xb; MP4_128 = 0xc; OTHER5 = 0xd; } } // Podcast Protos message PublishTime { optional sint32 year = 0x1; optional sint32 month = 0x2; optional sint32 day = 0x3; // These seem to be differently encoded optional sint32 minute = 0x5; optional sint32 hour = 0x4; } message Show { optional bytes gid = 0x1; optional string name = 0x2; repeated Episode episode = 0x46; // Educated guesses optional string description = 0x40; optional string publisher = 0x42; optional string language = 0x43; optional bool explicit = 0x44; optional ImageGroup covers = 0x45; repeated Restriction restriction = 0x48; optional MediaType media_type = 0x4A; optional ConsumptionOrder consumption_order = 0x4B; optional bool interpret_restriction_using_geoip = 0x4C; optional string country_of_origin = 0x4F; repeated Category categories = 0x50; optional PassthroughEnum passthrough = 0x51; } enum ConsumptionOrder { SEQUENTIAL = 1; EPISODIC = 2; RECENT = 3; } enum MediaType { MIXED = 0; AUDIO = 1; VIDEO = 2; } enum PassthroughEnum { UNKNOWN = 0; NONE = 1; } message Episode { optional bytes gid = 0x1; optional string name = 0x2; optional sint32 duration = 0x7; optional sint32 popularity = 0x8; repeated AudioFile file = 0xc; // Educated guesses optional string description = 0x40; optional Date publish_time = 0x42; optional ImageGroup covers = 0x44; optional string language = 0x45; optional bool explicit = 0x46; optional Show show = 0x47; repeated AudioFile preview = 0x4A; repeated Restriction restriction = 0x4B; // Order of these flags might be wrong! optional bool suppress_monetization = 0x4E; optional bool allow_background_playback = 0x4F; optional bool interpret_restriction_using_geoip = 0x51; 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; }