{"action":"created","issue":{"url":"https://api.github.com/repos/librespot-org/librespot/issues/308","repository_url":"https://api.github.com/repos/librespot-org/librespot","labels_url":"https://api.github.com/repos/librespot-org/librespot/issues/308/labels{/name}","comments_url":"https://api.github.com/repos/librespot-org/librespot/issues/308/comments","events_url":"https://api.github.com/repos/librespot-org/librespot/issues/308/events","html_url":"https://github.com/librespot-org/librespot/issues/308","id":421564157,"node_id":"MDU6SXNzdWU0MjE1NjQxNTc=","number":308,"title":"Update metadata endpoint","user":{"login":"ashthespy","id":16233271,"node_id":"MDQ6VXNlcjE2MjMzMjcx","avatar_url":"https://avatars2.githubusercontent.com/u/16233271?v=4","gravatar_id":"","url":"https://api.github.com/users/ashthespy","html_url":"https://github.com/ashthespy","followers_url":"https://api.github.com/users/ashthespy/followers","following_url":"https://api.github.com/users/ashthespy/following{/other_user}","gists_url":"https://api.github.com/users/ashthespy/gists{/gist_id}","starred_url":"https://api.github.com/users/ashthespy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ashthespy/subscriptions","organizations_url":"https://api.github.com/users/ashthespy/orgs","repos_url":"https://api.github.com/users/ashthespy/repos","events_url":"https://api.github.com/users/ashthespy/events{/privacy}","received_events_url":"https://api.github.com/users/ashthespy/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":4,"created_at":"2019-03-15T15:05:11Z","updated_at":"2019-07-02T12:50:26Z","closed_at":null,"author_association":"MEMBER","body":"Opening up this issue so it's easier to track than gitter ;-)\r\nCurrently we still use the `hm://metadata/3/xx` endpoints,  whereas the official clients use `4`. \r\nUpdating to the v4 endpoint will be a prerequisite for podcast support. \r\nI have extracted the following definitions from the official client.\r\n<details>\r\n  <summary>metadata.proto</summary>\r\n\r\n```protobuf\r\nsyntax = \"proto2\";\r\n\r\npackage spotify.metadata.proto;\r\nmessage Artist {\r\n    optional bytes gid = 1;\r\n    optional string name = 2;\r\n    optional sint32 popularity = 3;\r\n    repeated TopTracks top_track = 4;\r\n    repeated AlbumGroup album_group = 5;\r\n    repeated AlbumGroup single_group = 6;\r\n    repeated AlbumGroup compilation_group = 7;\r\n    repeated AlbumGroup appears_on_group = 8;\r\n    repeated string genre = 9;\r\n    repeated ExternalId external_id = 10;\r\n    repeated Image portrait = 11;\r\n    repeated Biography biography = 12;\r\n    repeated ActivityPeriod activity_period = 13;\r\n    repeated Restriction restriction = 14;\r\n    repeated Artist related = 15;\r\n    optional bool is_portrait_album_cover = 16;\r\n    optional ImageGroup portrait_group = 17;\r\n    repeated SalePeriod sale_period = 18;\r\n    repeated Availability availability = 20;\r\n}\r\n\r\nmessage Album {\r\n    optional bytes gid = 1;\r\n    optional string name = 2;\r\n    repeated Artist artist = 3;\r\n    \r\n    optional Type type = 4;\r\n    enum Type {\r\n        ALBUM = 1;\r\n        SINGLE = 2;\r\n        COMPILATION = 3;\r\n        EP = 4;\r\n        AUDIOBOOK = 5;\r\n        PODCAST = 6;\r\n    }\r\n    \r\n    optional string label = 5;\r\n    optional Date date = 6;\r\n    optional sint32 popularity = 7;\r\n    repeated string genre = 8;\r\n    repeated Image cover = 9;\r\n    repeated ExternalId external_id = 10;\r\n    repeated Disc disc = 11;\r\n    repeated string review = 12;\r\n    repeated Copyright copyright = 13;\r\n    repeated Restriction restriction = 14;\r\n    repeated Album related = 15;\r\n    repeated SalePeriod sale_period = 16;\r\n    optional ImageGroup cover_group = 17;\r\n    optional string original_title = 18;\r\n    optional string version_title = 19;\r\n    optional string type_str = 20;\r\n    repeated Availability availability = 23;\r\n}\r\n\r\nmessage Track {\r\n    optional bytes gid = 1;\r\n    optional string name = 2;\r\n    optional Album album = 3;\r\n    repeated Artist artist = 4;\r\n    optional sint32 number = 5;\r\n    optional sint32 disc_number = 6;\r\n    optional sint32 duration = 7;\r\n    optional sint32 popularity = 8;\r\n    optional bool explicit = 9;\r\n    repeated ExternalId external_id = 10;\r\n    repeated Restriction restriction = 11;\r\n    repeated AudioFile file = 12;\r\n    repeated Track alternative = 13;\r\n    repeated SalePeriod sale_period = 14;\r\n    repeated AudioFile preview = 15;\r\n    repeated string tags = 16;\r\n    optional int64 earliest_live_timestamp = 17;\r\n    optional bool has_lyrics = 18;\r\n    repeated Availability availability = 19;\r\n    optional Licensor licensor = 21;\r\n}\r\n\r\nmessage Show {\r\n    optional bytes gid = 1;\r\n    optional string name = 2;\r\n    optional string description = 64;\r\n    optional sint32 deprecated_popularity = 65 [deprecated = true];\r\n    optional string publisher = 66;\r\n    optional string language = 67;\r\n    optional bool explicit = 68;\r\n    optional ImageGroup cover_image = 69;\r\n    repeated Episode episode = 70;\r\n    repeated Copyright copyright = 71;\r\n    repeated Restriction restriction = 72;\r\n    repeated string keyword = 73;\r\n    \r\n    optional MediaType media_type = 74;\r\n    enum MediaType {\r\n        MIXED = 0;\r\n        AUDIO = 1;\r\n        VIDEO = 2;\r\n    }\r\n    \r\n    optional ConsumptionOrder consumption_order = 75;\r\n    enum ConsumptionOrder {\r\n        SEQUENTIAL = 1;\r\n        EPISODIC = 2;\r\n        RECENT = 3;\r\n    }\r\n    \r\n    repeated Availability availability = 78;\r\n}\r\n\r\nmessage Episode {\r\n    optional bytes gid = 1;\r\n    optional string name = 2;\r\n    optional sint32 duration = 7;\r\n    repeated AudioFile audio = 12;\r\n    optional string description = 64;\r\n    optional sint32 number = 65;\r\n    optional Date publish_time = 66;\r\n    optional sint32 deprecated_popularity = 67 [deprecated = true];\r\n    optional ImageGroup cover_image = 68;\r\n    optional string language = 69;\r\n    optional bool explicit = 70;\r\n    optional Show show = 71;\r\n    repeated VideoFile video = 72;\r\n    repeated VideoFile video_preview = 73;\r\n    repeated AudioFile audio_preview = 74;\r\n    repeated Restriction restriction = 75;\r\n    optional ImageGroup freeze_frame = 76;\r\n    repeated string keyword = 77;\r\n    optional bool allow_background_playback = 81;\r\n    repeated Availability availability = 82;\r\n    optional string external_url = 83;\r\n}\r\n\r\nmessage Licensor {\r\n    optional bytes uuid = 1;\r\n}\r\n\r\nmessage TopTracks {\r\n    optional string country = 1;\r\n    repeated Track track = 2;\r\n}\r\n\r\nmessage ActivityPeriod {\r\n    optional sint32 start_year = 1;\r\n    optional sint32 end_year = 2;\r\n    optional sint32 decade = 3;\r\n}\r\n\r\nmessage AlbumGroup {\r\n    repeated Album album = 1;\r\n}\r\n\r\nmessage Date {\r\n    optional sint32 year = 1;\r\n    optional sint32 month = 2;\r\n    optional sint32 day = 3;\r\n    optional sint32 hour = 4;\r\n    optional sint32 minute = 5;\r\n}\r\n\r\nmessage Image {\r\n    optional bytes file_id = 1;\r\n    \r\n    optional Size size = 2;\r\n    enum Size {\r\n        DEFAULT = 0;\r\n        SMALL = 1;\r\n        LARGE = 2;\r\n        XLARGE = 3;\r\n    }\r\n    \r\n    optional sint32 width = 3;\r\n    optional sint32 height = 4;\r\n}\r\n\r\nmessage ImageGroup {\r\n    repeated Image image = 1;\r\n}\r\n\r\nmessage Biography {\r\n    optional string text = 1;\r\n    repeated Image portrait = 2;\r\n    repeated ImageGroup portrait_group = 3;\r\n}\r\n\r\nmessage Disc {\r\n    optional sint32 number = 1;\r\n    optional string name = 2;\r\n    repeated Track track = 3;\r\n}\r\n\r\nmessage Copyright {\r\n    optional Type type = 1;\r\n    enum Type {\r\n        P = 0;\r\n        C = 1;\r\n    }\r\n    \r\n    optional string text = 2;\r\n}\r\n\r\nmessage Restriction {\r\n    repeated Catalogue catalogue = 1;\r\n    enum Catalogue {\r\n        AD = 0;\r\n        SUBSCRIPTION = 1;\r\n        CATALOGUE_ALL = 2;\r\n        SHUFFLE = 3;\r\n        COMMERCIAL = 4;\r\n    }\r\n    \r\n    optional Type type = 4;\r\n    enum Type {\r\n        STREAMING = 0;\r\n    }\r\n    \r\n    repeated string catalogue_str = 5;\r\n    \r\n    oneof country_restriction {\r\n        string countries_allowed = 2;\r\n        string countries_forbidden = 3;\r\n    }\r\n}\r\n\r\nmessage Availability {\r\n    repeated string catalogue_str = 1;\r\n    optional Date start = 2;\r\n}\r\n\r\nmessage SalePeriod {\r\n    repeated Restriction restriction = 1;\r\n    optional Date start = 2;\r\n    optional Date end = 3;\r\n}\r\n\r\nmessage ExternalId {\r\n    optional string type = 1;\r\n    optional string id = 2;\r\n}\r\n\r\nmessage AudioFile {\r\n    optional bytes file_id = 1;\r\n    \r\n    optional Format format = 2;\r\n    enum Format {\r\n        OGG_VORBIS_96 = 0;\r\n        OGG_VORBIS_160 = 1;\r\n        OGG_VORBIS_320 = 2;\r\n        MP3_256 = 3;\r\n        MP3_320 = 4;\r\n        MP3_160 = 5;\r\n        MP3_96 = 6;\r\n        MP3_160_ENC = 7;\r\n        AAC_24 = 8;\r\n        AAC_48 = 9;\r\n    }\r\n}\r\n\r\nmessage VideoFile {\r\n    optional bytes file_id = 1;\r\n}\r\n\r\n```\r\n</details>\r\n"},"comment":{"url":"https://api.github.com/repos/librespot-org/librespot/issues/comments/507662499","html_url":"https://github.com/librespot-org/librespot/issues/308#issuecomment-507662499","issue_url":"https://api.github.com/repos/librespot-org/librespot/issues/308","id":507662499,"node_id":"MDEyOklzc3VlQ29tbWVudDUwNzY2MjQ5OQ==","user":{"login":"devgianlu","id":14827249,"node_id":"MDQ6VXNlcjE0ODI3MjQ5","avatar_url":"https://avatars0.githubusercontent.com/u/14827249?v=4","gravatar_id":"","url":"https://api.github.com/users/devgianlu","html_url":"https://github.com/devgianlu","followers_url":"https://api.github.com/users/devgianlu/followers","following_url":"https://api.github.com/users/devgianlu/following{/other_user}","gists_url":"https://api.github.com/users/devgianlu/gists{/gist_id}","starred_url":"https://api.github.com/users/devgianlu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/devgianlu/subscriptions","organizations_url":"https://api.github.com/users/devgianlu/orgs","repos_url":"https://api.github.com/users/devgianlu/repos","events_url":"https://api.github.com/users/devgianlu/events{/privacy}","received_events_url":"https://api.github.com/users/devgianlu/received_events","type":"User","site_admin":false},"created_at":"2019-07-02T12:50:26Z","updated_at":"2019-07-02T12:50:26Z","author_association":"MEMBER","body":"We dump them from the executables."}}
{"actor":{"display_login":"devgianlu"}}