[spotify] librespot-c update (protobuf automake + metadata proto update)

New metadata probably necessary to support lossless
This commit is contained in:
ejurgensen 2025-09-28 16:47:58 +02:00
parent 336200727d
commit 365694d863
13 changed files with 3629 additions and 3099 deletions

View File

@ -3,44 +3,63 @@ SUBDIRS = tests
noinst_LIBRARIES = librespot-c.a noinst_LIBRARIES = librespot-c.a
SHANNON_SRC = \ SHANNON_SRC = \
src/shannon/ShannonFast.c src/shannon/Shannon.h src/shannon/ShannonInternal.h src/shannon/ShannonFast.c \
src/shannon/Shannon.h \
src/shannon/ShannonInternal.h
PROTO_FILES = \
src/proto/keyexchange.proto \
src/proto/authentication.proto \
src/proto/mercury.proto \
src/proto/metadata.proto \
src/proto/connectivity.proto \
src/proto/clienttoken.proto \
src/proto/login5_user_info.proto \
src/proto/login5.proto \
src/proto/login5_identifiers.proto \
src/proto/login5_credentials.proto \
src/proto/login5_client_info.proto \
src/proto/login5_challenges_hashcash.proto \
src/proto/login5_challenges_code.proto \
src/proto/google_duration.proto \
src/proto/storage_resolve.proto \
src/proto/extended_metadata.proto \
src/proto/extension_kind.proto \
src/proto/entity_extension_data.proto \
src/proto/google_any.proto
PROTO_SRC = \ PROTO_SRC = \
src/proto/keyexchange.pb-c.c src/proto/keyexchange.pb-c.h \ $(PROTO_FILES:.proto=.pb-c.c) $(PROTO_FILES:.proto=.pb-c.h)
src/proto/authentication.pb-c.c src/proto/authentication.pb-c.h \
src/proto/mercury.pb-c.c src/proto/mercury.pb-c.h \
src/proto/metadata.pb-c.c src/proto/metadata.pb-c.h
HTTP_PROTO_SRC = \
src/proto/connectivity.pb-c.c src/proto/connectivity.pb-c.h \
src/proto/clienttoken.pb-c.c src/proto/clienttoken.pb-c.h \
src/proto/login5_user_info.pb-c.h src/proto/login5_user_info.pb-c.c \
src/proto/login5.pb-c.h src/proto/login5.pb-c.c \
src/proto/login5_identifiers.pb-c.h src/proto/login5_identifiers.pb-c.c \
src/proto/login5_credentials.pb-c.h src/proto/login5_credentials.pb-c.c \
src/proto/login5_client_info.pb-c.h src/proto/login5_client_info.pb-c.c \
src/proto/login5_challenges_hashcash.pb-c.h src/proto/login5_challenges_hashcash.pb-c.c \
src/proto/login5_challenges_code.pb-c.h src/proto/login5_challenges_code.pb-c.c \
src/proto/google_duration.pb-c.h src/proto/google_duration.pb-c.c \
src/proto/storage_resolve.pb-c.h src/proto/storage_resolve.pb-c.c \
src/proto/extended_metadata.pb-c.h src/proto/extended_metadata.pb-c.c \
src/proto/extension_kind.pb-c.h src/proto/extension_kind.pb-c.c \
src/proto/entity_extension_data.pb-c.h src/proto/entity_extension_data.pb-c.c \
src/proto/google_any.pb-c.h src/proto/google_any.pb-c.c
CORE_SRC = \ CORE_SRC = \
src/librespot-c.c src/connection.c src/channel.c src/crypto.c src/commands.c \ src/librespot-c.c \
src/connection.c \
src/channel.c \
src/crypto.c \
src/commands.c \
src/http.c src/http.c
BUILT_SOURCES = \
$(PROTO_SRC)
librespot_c_a_SOURCES = \ librespot_c_a_SOURCES = \
$(CORE_SRC) \ $(CORE_SRC) \
$(SHANNON_SRC) \ $(SHANNON_SRC) \
$(PROTO_SRC) \ $(PROTO_SRC)
$(HTTP_PROTO_SRC)
noinst_HEADERS = \ noinst_HEADERS = \
librespot-c.h src/librespot-c-internal.h src/connection.h \ librespot-c.h \
src/channel.h src/crypto.h src/commands.h src/http.h src/librespot-c-internal.h \
src/connection.h \
src/channel.h \
src/crypto.h \
src/commands.h \
src/http.h
EXTRA_DIST = README.md LICENSE EXTRA_DIST = \
README.md \
LICENSE \
$(PROTO_FILES)
%.pb-c.c %.pb-c.h: %.proto
$(AM_V_GEN)$(PROTOC) --proto_path=src/proto --c_out=src/proto $<

View File

@ -1,4 +1,4 @@
AC_INIT([librespot-c], [0.6]) AC_INIT([librespot-c], [0.7])
AC_CONFIG_AUX_DIR([.]) AC_CONFIG_AUX_DIR([.])
AM_INIT_AUTOMAKE([foreign subdir-objects]) AM_INIT_AUTOMAKE([foreign subdir-objects])
AM_SILENT_RULES([yes]) AM_SILENT_RULES([yes])
@ -10,6 +10,8 @@ AC_PROG_CC
AM_PROG_AR AM_PROG_AR
AC_PROG_RANLIB AC_PROG_RANLIB
AC_PATH_PROG([PROTOC], [protoc-c])
AM_CPPFLAGS="-Wall" AM_CPPFLAGS="-Wall"
AC_SUBST([AM_CPPFLAGS]) AC_SUBST([AM_CPPFLAGS])

View File

@ -169,11 +169,11 @@ system_info_from_uname(SystemInfo *system_info)
// Returns true if format of a is preferred over b (and is valid). According to // Returns true if format of a is preferred over b (and is valid). According to
// librespot comment most podcasts are 96 kbit. // librespot comment most podcasts are 96 kbit.
static bool static bool
format_is_preferred(AudioFile *a, AudioFile *b, enum sp_bitrates bitrate_preferred) format_is_preferred(Spotify__Metadata__AudioFile *a, Spotify__Metadata__AudioFile *b, enum sp_bitrates bitrate_preferred)
{ {
if (a->format != AUDIO_FILE__FORMAT__OGG_VORBIS_96 && if (a->format != SPOTIFY__METADATA__AUDIO_FILE__FORMAT__OGG_VORBIS_96 &&
a->format != AUDIO_FILE__FORMAT__OGG_VORBIS_160 && a->format != SPOTIFY__METADATA__AUDIO_FILE__FORMAT__OGG_VORBIS_160 &&
a->format != AUDIO_FILE__FORMAT__OGG_VORBIS_320) a->format != SPOTIFY__METADATA__AUDIO_FILE__FORMAT__OGG_VORBIS_320)
return false; return false;
if (!b) if (!b)
@ -184,9 +184,9 @@ format_is_preferred(AudioFile *a, AudioFile *b, enum sp_bitrates bitrate_preferr
case SP_BITRATE_96: case SP_BITRATE_96:
return (a->format < b->format); // Prefer lowest return (a->format < b->format); // Prefer lowest
case SP_BITRATE_160: case SP_BITRATE_160:
if (b->format == AUDIO_FILE__FORMAT__OGG_VORBIS_160) if (b->format == SPOTIFY__METADATA__AUDIO_FILE__FORMAT__OGG_VORBIS_160)
return false; return false;
else if (a->format == AUDIO_FILE__FORMAT__OGG_VORBIS_160) else if (a->format == SPOTIFY__METADATA__AUDIO_FILE__FORMAT__OGG_VORBIS_160)
return true; return true;
else else
return (a->format < b->format); // Prefer lowest return (a->format < b->format); // Prefer lowest
@ -200,10 +200,10 @@ format_is_preferred(AudioFile *a, AudioFile *b, enum sp_bitrates bitrate_preferr
} }
int int
file_select(uint8_t *out, size_t out_len, Track *track, enum sp_bitrates bitrate_preferred) file_select(uint8_t *out, size_t out_len, Spotify__Metadata__Track *track, enum sp_bitrates bitrate_preferred)
{ {
AudioFile *selected = NULL; Spotify__Metadata__AudioFile *selected = NULL;
AudioFile *file; Spotify__Metadata__AudioFile *file;
int i; int i;
for (i = 0; i < track->n_file; i++) for (i = 0; i < track->n_file; i++)
@ -461,7 +461,7 @@ mercury_free(struct sp_mercury *mercury, int content_only)
free(mercury->parts[i].data); free(mercury->parts[i].data);
if (mercury->parts[i].track) if (mercury->parts[i].track)
track__free_unpacked(mercury->parts[i].track, NULL); spotify__metadata__track__free_unpacked(mercury->parts[i].track, NULL);
} }
if (content_only) if (content_only)
@ -546,7 +546,7 @@ mercury_parse(struct sp_mercury *mercury, uint8_t *payload, size_t payload_len)
memcpy(mercury->parts[i].data, ptr, mercury->parts[i].len); memcpy(mercury->parts[i].data, ptr, mercury->parts[i].len);
ptr += mercury->parts[i].len; // 5: length += mercury->parts[i].len ptr += mercury->parts[i].len; // 5: length += mercury->parts[i].len
mercury->parts[i].track = track__unpack(NULL, mercury->parts[i].len, mercury->parts[i].data); mercury->parts[i].track = spotify__metadata__track__unpack(NULL, mercury->parts[i].len, mercury->parts[i].data);
} }
header__free_unpacked(header, NULL); header__free_unpacked(header, NULL);
@ -1056,14 +1056,14 @@ handle_metadata_get(struct sp_message *msg, struct sp_session *session)
{ {
struct http_response *hres = &msg->payload.hres; struct http_response *hres = &msg->payload.hres;
struct sp_channel *channel = session->now_streaming_channel; struct sp_channel *channel = session->now_streaming_channel;
Track *response = NULL; Spotify__Metadata__Track *response = NULL;
int ret; int ret;
if (hres->code != HTTP_OK) if (hres->code != HTTP_OK)
goto fallback; goto fallback;
// Also works for Episode response // Also works for Episode response
response = track__unpack(NULL, hres->body_len, hres->body); response = spotify__metadata__track__unpack(NULL, hres->body_len, hres->body);
if (!response) if (!response)
goto fallback; goto fallback;
@ -1071,13 +1071,13 @@ handle_metadata_get(struct sp_message *msg, struct sp_session *session)
if (ret < 0) if (ret < 0)
goto fallback; goto fallback;
track__free_unpacked(response, NULL); spotify__metadata__track__free_unpacked(response, NULL);
return SP_OK_DONE; return SP_OK_DONE;
fallback: fallback:
sp_cb.logmsg("Couldn't find file id in metadata response, will request extended metadata\n"); sp_cb.logmsg("Couldn't find file id in metadata response, will request extended metadata\n");
track__free_unpacked(response, NULL); spotify__metadata__track__free_unpacked(response, NULL);
return SP_OK_DONE; return SP_OK_DONE;
} }
@ -1093,7 +1093,7 @@ handle_extended_metadata_get(struct sp_message *msg, struct sp_session *session)
struct sp_channel *channel = session->now_streaming_channel; struct sp_channel *channel = session->now_streaming_channel;
Spotify__Extendedmetadata__BatchedExtensionResponse *response = NULL; Spotify__Extendedmetadata__BatchedExtensionResponse *response = NULL;
Spotify__Extendedmetadata__EntityExtensionData *entity_extension_data = NULL; Spotify__Extendedmetadata__EntityExtensionData *entity_extension_data = NULL;
Track *track = NULL; Spotify__Metadata__Track *track = NULL;
int i, j; int i, j;
int ret; int ret;
@ -1128,7 +1128,7 @@ handle_extended_metadata_get(struct sp_message *msg, struct sp_session *session)
// .Episode. If we get something else we will fail later anyway. // .Episode. If we get something else we will fail later anyway.
// This also works for episodes // This also works for episodes
track = track__unpack(NULL, entity_extension_data->extension_data->value.len, entity_extension_data->extension_data->value.data); track = spotify__metadata__track__unpack(NULL, entity_extension_data->extension_data->value.len, entity_extension_data->extension_data->value.data);
if (!track) if (!track)
RETURN_ERROR(SP_ERR_INVALID, "Could not parse track data in extended metadata response"); RETURN_ERROR(SP_ERR_INVALID, "Could not parse track data in extended metadata response");
@ -1137,12 +1137,12 @@ handle_extended_metadata_get(struct sp_message *msg, struct sp_session *session)
RETURN_ERROR(SP_ERR_INVALID, "Could not find track data in extended metadata response"); RETURN_ERROR(SP_ERR_INVALID, "Could not find track data in extended metadata response");
spotify__extendedmetadata__batched_extension_response__free_unpacked(response, NULL); spotify__extendedmetadata__batched_extension_response__free_unpacked(response, NULL);
track__free_unpacked(track, NULL); spotify__metadata__track__free_unpacked(track, NULL);
return SP_OK_DONE; return SP_OK_DONE;
error: error:
spotify__extendedmetadata__batched_extension_response__free_unpacked(response, NULL); spotify__extendedmetadata__batched_extension_response__free_unpacked(response, NULL);
track__free_unpacked(track, NULL); spotify__metadata__track__free_unpacked(track, NULL);
return ret; return ret;
} }

View File

@ -296,7 +296,7 @@ struct sp_mercury
uint8_t *data; uint8_t *data;
size_t len; size_t len;
Track *track; Spotify__Metadata__Track *track;
} parts[SP_MERCURY_MAX_PARTS]; } parts[SP_MERCURY_MAX_PARTS];
}; };

View File

@ -1,5 +1,5 @@
/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Generated by the protocol buffer compiler. DO NOT EDIT! */
/* Generated from: proto/authentication.proto */ /* Generated from: authentication.proto */
/* Do not generate deprecated warnings for self */ /* Do not generate deprecated warnings for self */
#ifndef PROTOBUF_C__NO_DEPRECATED #ifndef PROTOBUF_C__NO_DEPRECATED

View File

@ -1,8 +1,8 @@
/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Generated by the protocol buffer compiler. DO NOT EDIT! */
/* Generated from: proto/authentication.proto */ /* Generated from: authentication.proto */
#ifndef PROTOBUF_C_proto_2fauthentication_2eproto__INCLUDED #ifndef PROTOBUF_C_authentication_2eproto__INCLUDED
#define PROTOBUF_C_proto_2fauthentication_2eproto__INCLUDED #define PROTOBUF_C_authentication_2eproto__INCLUDED
#include <protobuf-c/protobuf-c.h> #include <protobuf-c/protobuf-c.h>
@ -10,27 +10,27 @@ PROTOBUF_C__BEGIN_DECLS
#if PROTOBUF_C_VERSION_NUMBER < 1000000 #if PROTOBUF_C_VERSION_NUMBER < 1000000
# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. # error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers.
#elif 1003003 < PROTOBUF_C_MIN_COMPILER_VERSION #elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION
# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. # error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c.
#endif #endif
typedef struct _ClientResponseEncrypted ClientResponseEncrypted; typedef struct ClientResponseEncrypted ClientResponseEncrypted;
typedef struct _LoginCredentials LoginCredentials; typedef struct LoginCredentials LoginCredentials;
typedef struct _FingerprintResponseUnion FingerprintResponseUnion; typedef struct FingerprintResponseUnion FingerprintResponseUnion;
typedef struct _FingerprintGrainResponse FingerprintGrainResponse; typedef struct FingerprintGrainResponse FingerprintGrainResponse;
typedef struct _FingerprintHmacRipemdResponse FingerprintHmacRipemdResponse; typedef struct FingerprintHmacRipemdResponse FingerprintHmacRipemdResponse;
typedef struct _PeerTicketUnion PeerTicketUnion; typedef struct PeerTicketUnion PeerTicketUnion;
typedef struct _PeerTicketPublicKey PeerTicketPublicKey; typedef struct PeerTicketPublicKey PeerTicketPublicKey;
typedef struct _PeerTicketOld PeerTicketOld; typedef struct PeerTicketOld PeerTicketOld;
typedef struct _SystemInfo SystemInfo; typedef struct SystemInfo SystemInfo;
typedef struct _LibspotifyAppKey LibspotifyAppKey; typedef struct LibspotifyAppKey LibspotifyAppKey;
typedef struct _ClientInfo ClientInfo; typedef struct ClientInfo ClientInfo;
typedef struct _ClientInfoFacebook ClientInfoFacebook; typedef struct ClientInfoFacebook ClientInfoFacebook;
typedef struct _APWelcome APWelcome; typedef struct APWelcome APWelcome;
typedef struct _AccountInfo AccountInfo; typedef struct AccountInfo AccountInfo;
typedef struct _AccountInfoSpotify AccountInfoSpotify; typedef struct AccountInfoSpotify AccountInfoSpotify;
typedef struct _AccountInfoFacebook AccountInfoFacebook; typedef struct AccountInfoFacebook AccountInfoFacebook;
/* --- enums --- */ /* --- enums --- */
@ -102,7 +102,7 @@ typedef enum _AccountType {
/* --- messages --- */ /* --- messages --- */
struct _ClientResponseEncrypted struct ClientResponseEncrypted
{ {
ProtobufCMessage base; ProtobufCMessage base;
LoginCredentials *login_credentials; LoginCredentials *login_credentials;
@ -121,7 +121,7 @@ struct _ClientResponseEncrypted
, NULL, 0, ACCOUNT_CREATION__ACCOUNT_CREATION_ALWAYS_PROMPT, NULL, NULL, NULL, NULL, NULL, NULL, NULL } , NULL, 0, ACCOUNT_CREATION__ACCOUNT_CREATION_ALWAYS_PROMPT, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
struct _LoginCredentials struct LoginCredentials
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *username; char *username;
@ -134,7 +134,7 @@ struct _LoginCredentials
, NULL, AUTHENTICATION_TYPE__AUTHENTICATION_USER_PASS, 0, {0,NULL} } , NULL, AUTHENTICATION_TYPE__AUTHENTICATION_USER_PASS, 0, {0,NULL} }
struct _FingerprintResponseUnion struct FingerprintResponseUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
FingerprintGrainResponse *grain; FingerprintGrainResponse *grain;
@ -145,7 +145,7 @@ struct _FingerprintResponseUnion
, NULL, NULL } , NULL, NULL }
struct _FingerprintGrainResponse struct FingerprintGrainResponse
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData encrypted_key; ProtobufCBinaryData encrypted_key;
@ -155,7 +155,7 @@ struct _FingerprintGrainResponse
, {0,NULL} } , {0,NULL} }
struct _FingerprintHmacRipemdResponse struct FingerprintHmacRipemdResponse
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData hmac; ProtobufCBinaryData hmac;
@ -165,7 +165,7 @@ struct _FingerprintHmacRipemdResponse
, {0,NULL} } , {0,NULL} }
struct _PeerTicketUnion struct PeerTicketUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
PeerTicketPublicKey *public_key; PeerTicketPublicKey *public_key;
@ -176,7 +176,7 @@ struct _PeerTicketUnion
, NULL, NULL } , NULL, NULL }
struct _PeerTicketPublicKey struct PeerTicketPublicKey
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData public_key; ProtobufCBinaryData public_key;
@ -186,7 +186,7 @@ struct _PeerTicketPublicKey
, {0,NULL} } , {0,NULL} }
struct _PeerTicketOld struct PeerTicketOld
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData peer_ticket; ProtobufCBinaryData peer_ticket;
@ -197,7 +197,7 @@ struct _PeerTicketOld
, {0,NULL}, {0,NULL} } , {0,NULL}, {0,NULL} }
struct _SystemInfo struct SystemInfo
{ {
ProtobufCMessage base; ProtobufCMessage base;
CpuFamily cpu_family; CpuFamily cpu_family;
@ -222,7 +222,7 @@ struct _SystemInfo
, CPU_FAMILY__CPU_UNKNOWN, 0, 0, 0, 0, 0, BRAND__BRAND_UNBRANDED, 0, 0, OS__OS_UNKNOWN, 0, 0, 0, 0, NULL, NULL } , CPU_FAMILY__CPU_UNKNOWN, 0, 0, 0, 0, 0, BRAND__BRAND_UNBRANDED, 0, 0, OS__OS_UNKNOWN, 0, 0, 0, 0, NULL, NULL }
struct _LibspotifyAppKey struct LibspotifyAppKey
{ {
ProtobufCMessage base; ProtobufCMessage base;
uint32_t version; uint32_t version;
@ -236,7 +236,7 @@ struct _LibspotifyAppKey
, 0, {0,NULL}, {0,NULL}, NULL, {0,NULL} } , 0, {0,NULL}, {0,NULL}, NULL, {0,NULL} }
struct _ClientInfo struct ClientInfo
{ {
ProtobufCMessage base; ProtobufCMessage base;
protobuf_c_boolean has_limited; protobuf_c_boolean has_limited;
@ -249,7 +249,7 @@ struct _ClientInfo
, 0, 0, NULL, NULL } , 0, 0, NULL, NULL }
struct _ClientInfoFacebook struct ClientInfoFacebook
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *machine_id; char *machine_id;
@ -259,7 +259,7 @@ struct _ClientInfoFacebook
, NULL } , NULL }
struct _APWelcome struct APWelcome
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *canonical_username; char *canonical_username;
@ -277,7 +277,7 @@ struct _APWelcome
, NULL, ACCOUNT_TYPE__Spotify, ACCOUNT_TYPE__Spotify, AUTHENTICATION_TYPE__AUTHENTICATION_USER_PASS, {0,NULL}, 0, {0,NULL}, NULL, NULL } , NULL, ACCOUNT_TYPE__Spotify, ACCOUNT_TYPE__Spotify, AUTHENTICATION_TYPE__AUTHENTICATION_USER_PASS, {0,NULL}, 0, {0,NULL}, NULL, NULL }
struct _AccountInfo struct AccountInfo
{ {
ProtobufCMessage base; ProtobufCMessage base;
AccountInfoSpotify *spotify; AccountInfoSpotify *spotify;
@ -288,7 +288,7 @@ struct _AccountInfo
, NULL, NULL } , NULL, NULL }
struct _AccountInfoSpotify struct AccountInfoSpotify
{ {
ProtobufCMessage base; ProtobufCMessage base;
}; };
@ -297,7 +297,7 @@ struct _AccountInfoSpotify
} }
struct _AccountInfoFacebook struct AccountInfoFacebook
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *access_token; char *access_token;
@ -694,4 +694,4 @@ extern const ProtobufCMessageDescriptor account_info_facebook__descriptor;
PROTOBUF_C__END_DECLS PROTOBUF_C__END_DECLS
#endif /* PROTOBUF_C_proto_2fauthentication_2eproto__INCLUDED */ #endif /* PROTOBUF_C_authentication_2eproto__INCLUDED */

View File

@ -1,5 +1,5 @@
/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Generated by the protocol buffer compiler. DO NOT EDIT! */
/* Generated from: proto/keyexchange.proto */ /* Generated from: keyexchange.proto */
/* Do not generate deprecated warnings for self */ /* Do not generate deprecated warnings for self */
#ifndef PROTOBUF_C__NO_DEPRECATED #ifndef PROTOBUF_C__NO_DEPRECATED

View File

@ -1,8 +1,8 @@
/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Generated by the protocol buffer compiler. DO NOT EDIT! */
/* Generated from: proto/keyexchange.proto */ /* Generated from: keyexchange.proto */
#ifndef PROTOBUF_C_proto_2fkeyexchange_2eproto__INCLUDED #ifndef PROTOBUF_C_keyexchange_2eproto__INCLUDED
#define PROTOBUF_C_proto_2fkeyexchange_2eproto__INCLUDED #define PROTOBUF_C_keyexchange_2eproto__INCLUDED
#include <protobuf-c/protobuf-c.h> #include <protobuf-c/protobuf-c.h>
@ -10,38 +10,38 @@ PROTOBUF_C__BEGIN_DECLS
#if PROTOBUF_C_VERSION_NUMBER < 1000000 #if PROTOBUF_C_VERSION_NUMBER < 1000000
# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. # error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers.
#elif 1003003 < PROTOBUF_C_MIN_COMPILER_VERSION #elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION
# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. # error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c.
#endif #endif
typedef struct _ClientHello ClientHello; typedef struct ClientHello ClientHello;
typedef struct _BuildInfo BuildInfo; typedef struct BuildInfo BuildInfo;
typedef struct _LoginCryptoHelloUnion LoginCryptoHelloUnion; typedef struct LoginCryptoHelloUnion LoginCryptoHelloUnion;
typedef struct _LoginCryptoDiffieHellmanHello LoginCryptoDiffieHellmanHello; typedef struct LoginCryptoDiffieHellmanHello LoginCryptoDiffieHellmanHello;
typedef struct _FeatureSet FeatureSet; typedef struct FeatureSet FeatureSet;
typedef struct _APResponseMessage APResponseMessage; typedef struct APResponseMessage APResponseMessage;
typedef struct _APChallenge APChallenge; typedef struct APChallenge APChallenge;
typedef struct _LoginCryptoChallengeUnion LoginCryptoChallengeUnion; typedef struct LoginCryptoChallengeUnion LoginCryptoChallengeUnion;
typedef struct _LoginCryptoDiffieHellmanChallenge LoginCryptoDiffieHellmanChallenge; typedef struct LoginCryptoDiffieHellmanChallenge LoginCryptoDiffieHellmanChallenge;
typedef struct _FingerprintChallengeUnion FingerprintChallengeUnion; typedef struct FingerprintChallengeUnion FingerprintChallengeUnion;
typedef struct _FingerprintGrainChallenge FingerprintGrainChallenge; typedef struct FingerprintGrainChallenge FingerprintGrainChallenge;
typedef struct _FingerprintHmacRipemdChallenge FingerprintHmacRipemdChallenge; typedef struct FingerprintHmacRipemdChallenge FingerprintHmacRipemdChallenge;
typedef struct _PoWChallengeUnion PoWChallengeUnion; typedef struct PoWChallengeUnion PoWChallengeUnion;
typedef struct _PoWHashCashChallenge PoWHashCashChallenge; typedef struct PoWHashCashChallenge PoWHashCashChallenge;
typedef struct _CryptoChallengeUnion CryptoChallengeUnion; typedef struct CryptoChallengeUnion CryptoChallengeUnion;
typedef struct _CryptoShannonChallenge CryptoShannonChallenge; typedef struct CryptoShannonChallenge CryptoShannonChallenge;
typedef struct _CryptoRc4Sha1HmacChallenge CryptoRc4Sha1HmacChallenge; typedef struct CryptoRc4Sha1HmacChallenge CryptoRc4Sha1HmacChallenge;
typedef struct _UpgradeRequiredMessage UpgradeRequiredMessage; typedef struct UpgradeRequiredMessage UpgradeRequiredMessage;
typedef struct _APLoginFailed APLoginFailed; typedef struct APLoginFailed APLoginFailed;
typedef struct _ClientResponsePlaintext ClientResponsePlaintext; typedef struct ClientResponsePlaintext ClientResponsePlaintext;
typedef struct _LoginCryptoResponseUnion LoginCryptoResponseUnion; typedef struct LoginCryptoResponseUnion LoginCryptoResponseUnion;
typedef struct _LoginCryptoDiffieHellmanResponse LoginCryptoDiffieHellmanResponse; typedef struct LoginCryptoDiffieHellmanResponse LoginCryptoDiffieHellmanResponse;
typedef struct _PoWResponseUnion PoWResponseUnion; typedef struct PoWResponseUnion PoWResponseUnion;
typedef struct _PoWHashCashResponse PoWHashCashResponse; typedef struct PoWHashCashResponse PoWHashCashResponse;
typedef struct _CryptoResponseUnion CryptoResponseUnion; typedef struct CryptoResponseUnion CryptoResponseUnion;
typedef struct _CryptoShannonResponse CryptoShannonResponse; typedef struct CryptoShannonResponse CryptoShannonResponse;
typedef struct _CryptoRc4Sha1HmacResponse CryptoRc4Sha1HmacResponse; typedef struct CryptoRc4Sha1HmacResponse CryptoRc4Sha1HmacResponse;
/* --- enums --- */ /* --- enums --- */
@ -117,7 +117,7 @@ typedef enum _ErrorCode {
/* --- messages --- */ /* --- messages --- */
struct _ClientHello struct ClientHello
{ {
ProtobufCMessage base; ProtobufCMessage base;
BuildInfo *build_info; BuildInfo *build_info;
@ -138,7 +138,7 @@ struct _ClientHello
, NULL, 0,NULL, 0,NULL, 0,NULL, NULL, {0,NULL}, 0, {0,NULL}, NULL } , NULL, 0,NULL, 0,NULL, 0,NULL, NULL, {0,NULL}, 0, {0,NULL}, NULL }
struct _BuildInfo struct BuildInfo
{ {
ProtobufCMessage base; ProtobufCMessage base;
Product product; Product product;
@ -152,7 +152,7 @@ struct _BuildInfo
, PRODUCT__PRODUCT_CLIENT, 0,NULL, PLATFORM__PLATFORM_WIN32_X86, 0 } , PRODUCT__PRODUCT_CLIENT, 0,NULL, PLATFORM__PLATFORM_WIN32_X86, 0 }
struct _LoginCryptoHelloUnion struct LoginCryptoHelloUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
LoginCryptoDiffieHellmanHello *diffie_hellman; LoginCryptoDiffieHellmanHello *diffie_hellman;
@ -162,7 +162,7 @@ struct _LoginCryptoHelloUnion
, NULL } , NULL }
struct _LoginCryptoDiffieHellmanHello struct LoginCryptoDiffieHellmanHello
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData gc; ProtobufCBinaryData gc;
@ -173,7 +173,7 @@ struct _LoginCryptoDiffieHellmanHello
, {0,NULL}, 0 } , {0,NULL}, 0 }
struct _FeatureSet struct FeatureSet
{ {
ProtobufCMessage base; ProtobufCMessage base;
protobuf_c_boolean has_autoupdate2; protobuf_c_boolean has_autoupdate2;
@ -186,7 +186,7 @@ struct _FeatureSet
, 0, 0, 0, 0 } , 0, 0, 0, 0 }
struct _APResponseMessage struct APResponseMessage
{ {
ProtobufCMessage base; ProtobufCMessage base;
APChallenge *challenge; APChallenge *challenge;
@ -198,7 +198,7 @@ struct _APResponseMessage
, NULL, NULL, NULL } , NULL, NULL, NULL }
struct _APChallenge struct APChallenge
{ {
ProtobufCMessage base; ProtobufCMessage base;
LoginCryptoChallengeUnion *login_crypto_challenge; LoginCryptoChallengeUnion *login_crypto_challenge;
@ -214,7 +214,7 @@ struct _APChallenge
, NULL, NULL, NULL, NULL, {0,NULL}, 0, {0,NULL} } , NULL, NULL, NULL, NULL, {0,NULL}, 0, {0,NULL} }
struct _LoginCryptoChallengeUnion struct LoginCryptoChallengeUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
LoginCryptoDiffieHellmanChallenge *diffie_hellman; LoginCryptoDiffieHellmanChallenge *diffie_hellman;
@ -224,7 +224,7 @@ struct _LoginCryptoChallengeUnion
, NULL } , NULL }
struct _LoginCryptoDiffieHellmanChallenge struct LoginCryptoDiffieHellmanChallenge
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData gs; ProtobufCBinaryData gs;
@ -236,7 +236,7 @@ struct _LoginCryptoDiffieHellmanChallenge
, {0,NULL}, 0, {0,NULL} } , {0,NULL}, 0, {0,NULL} }
struct _FingerprintChallengeUnion struct FingerprintChallengeUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
FingerprintGrainChallenge *grain; FingerprintGrainChallenge *grain;
@ -247,7 +247,7 @@ struct _FingerprintChallengeUnion
, NULL, NULL } , NULL, NULL }
struct _FingerprintGrainChallenge struct FingerprintGrainChallenge
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData kek; ProtobufCBinaryData kek;
@ -257,7 +257,7 @@ struct _FingerprintGrainChallenge
, {0,NULL} } , {0,NULL} }
struct _FingerprintHmacRipemdChallenge struct FingerprintHmacRipemdChallenge
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData challenge; ProtobufCBinaryData challenge;
@ -267,7 +267,7 @@ struct _FingerprintHmacRipemdChallenge
, {0,NULL} } , {0,NULL} }
struct _PoWChallengeUnion struct PoWChallengeUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
PoWHashCashChallenge *hash_cash; PoWHashCashChallenge *hash_cash;
@ -277,7 +277,7 @@ struct _PoWChallengeUnion
, NULL } , NULL }
struct _PoWHashCashChallenge struct PoWHashCashChallenge
{ {
ProtobufCMessage base; ProtobufCMessage base;
protobuf_c_boolean has_prefix; protobuf_c_boolean has_prefix;
@ -292,7 +292,7 @@ struct _PoWHashCashChallenge
, 0, {0,NULL}, 0, 0, 0, 0 } , 0, {0,NULL}, 0, 0, 0, 0 }
struct _CryptoChallengeUnion struct CryptoChallengeUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
CryptoShannonChallenge *shannon; CryptoShannonChallenge *shannon;
@ -303,7 +303,7 @@ struct _CryptoChallengeUnion
, NULL, NULL } , NULL, NULL }
struct _CryptoShannonChallenge struct CryptoShannonChallenge
{ {
ProtobufCMessage base; ProtobufCMessage base;
}; };
@ -312,7 +312,7 @@ struct _CryptoShannonChallenge
} }
struct _CryptoRc4Sha1HmacChallenge struct CryptoRc4Sha1HmacChallenge
{ {
ProtobufCMessage base; ProtobufCMessage base;
}; };
@ -321,7 +321,7 @@ struct _CryptoRc4Sha1HmacChallenge
} }
struct _UpgradeRequiredMessage struct UpgradeRequiredMessage
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData upgrade_signed_part; ProtobufCBinaryData upgrade_signed_part;
@ -333,7 +333,7 @@ struct _UpgradeRequiredMessage
, {0,NULL}, {0,NULL}, NULL } , {0,NULL}, {0,NULL}, NULL }
struct _APLoginFailed struct APLoginFailed
{ {
ProtobufCMessage base; ProtobufCMessage base;
ErrorCode error_code; ErrorCode error_code;
@ -348,7 +348,7 @@ struct _APLoginFailed
, ERROR_CODE__ProtocolError, 0, 0, 0, 0, NULL } , ERROR_CODE__ProtocolError, 0, 0, 0, 0, NULL }
struct _ClientResponsePlaintext struct ClientResponsePlaintext
{ {
ProtobufCMessage base; ProtobufCMessage base;
LoginCryptoResponseUnion *login_crypto_response; LoginCryptoResponseUnion *login_crypto_response;
@ -360,7 +360,7 @@ struct _ClientResponsePlaintext
, NULL, NULL, NULL } , NULL, NULL, NULL }
struct _LoginCryptoResponseUnion struct LoginCryptoResponseUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
LoginCryptoDiffieHellmanResponse *diffie_hellman; LoginCryptoDiffieHellmanResponse *diffie_hellman;
@ -370,7 +370,7 @@ struct _LoginCryptoResponseUnion
, NULL } , NULL }
struct _LoginCryptoDiffieHellmanResponse struct LoginCryptoDiffieHellmanResponse
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData hmac; ProtobufCBinaryData hmac;
@ -380,7 +380,7 @@ struct _LoginCryptoDiffieHellmanResponse
, {0,NULL} } , {0,NULL} }
struct _PoWResponseUnion struct PoWResponseUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
PoWHashCashResponse *hash_cash; PoWHashCashResponse *hash_cash;
@ -390,7 +390,7 @@ struct _PoWResponseUnion
, NULL } , NULL }
struct _PoWHashCashResponse struct PoWHashCashResponse
{ {
ProtobufCMessage base; ProtobufCMessage base;
ProtobufCBinaryData hash_suffix; ProtobufCBinaryData hash_suffix;
@ -400,7 +400,7 @@ struct _PoWHashCashResponse
, {0,NULL} } , {0,NULL} }
struct _CryptoResponseUnion struct CryptoResponseUnion
{ {
ProtobufCMessage base; ProtobufCMessage base;
CryptoShannonResponse *shannon; CryptoShannonResponse *shannon;
@ -411,7 +411,7 @@ struct _CryptoResponseUnion
, NULL, NULL } , NULL, NULL }
struct _CryptoShannonResponse struct CryptoShannonResponse
{ {
ProtobufCMessage base; ProtobufCMessage base;
protobuf_c_boolean has_dummy; protobuf_c_boolean has_dummy;
@ -422,7 +422,7 @@ struct _CryptoShannonResponse
, 0, 0 } , 0, 0 }
struct _CryptoRc4Sha1HmacResponse struct CryptoRc4Sha1HmacResponse
{ {
ProtobufCMessage base; ProtobufCMessage base;
protobuf_c_boolean has_dummy; protobuf_c_boolean has_dummy;
@ -1073,4 +1073,4 @@ extern const ProtobufCMessageDescriptor crypto_rc4_sha1_hmac_response__descripto
PROTOBUF_C__END_DECLS PROTOBUF_C__END_DECLS
#endif /* PROTOBUF_C_proto_2fkeyexchange_2eproto__INCLUDED */ #endif /* PROTOBUF_C_keyexchange_2eproto__INCLUDED */

View File

@ -1,5 +1,5 @@
/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Generated by the protocol buffer compiler. DO NOT EDIT! */
/* Generated from: proto/mercury.proto */ /* Generated from: mercury.proto */
/* Do not generate deprecated warnings for self */ /* Do not generate deprecated warnings for self */
#ifndef PROTOBUF_C__NO_DEPRECATED #ifndef PROTOBUF_C__NO_DEPRECATED

View File

@ -1,8 +1,8 @@
/* Generated by the protocol buffer compiler. DO NOT EDIT! */ /* Generated by the protocol buffer compiler. DO NOT EDIT! */
/* Generated from: proto/mercury.proto */ /* Generated from: mercury.proto */
#ifndef PROTOBUF_C_proto_2fmercury_2eproto__INCLUDED #ifndef PROTOBUF_C_mercury_2eproto__INCLUDED
#define PROTOBUF_C_proto_2fmercury_2eproto__INCLUDED #define PROTOBUF_C_mercury_2eproto__INCLUDED
#include <protobuf-c/protobuf-c.h> #include <protobuf-c/protobuf-c.h>
@ -10,17 +10,17 @@ PROTOBUF_C__BEGIN_DECLS
#if PROTOBUF_C_VERSION_NUMBER < 1000000 #if PROTOBUF_C_VERSION_NUMBER < 1000000
# error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers. # error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers.
#elif 1003003 < PROTOBUF_C_MIN_COMPILER_VERSION #elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION
# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c. # error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c.
#endif #endif
typedef struct _MercuryMultiGetRequest MercuryMultiGetRequest; typedef struct MercuryMultiGetRequest MercuryMultiGetRequest;
typedef struct _MercuryMultiGetReply MercuryMultiGetReply; typedef struct MercuryMultiGetReply MercuryMultiGetReply;
typedef struct _MercuryRequest MercuryRequest; typedef struct MercuryRequest MercuryRequest;
typedef struct _MercuryReply MercuryReply; typedef struct MercuryReply MercuryReply;
typedef struct _Header Header; typedef struct Header Header;
typedef struct _UserField UserField; typedef struct UserField UserField;
/* --- enums --- */ /* --- enums --- */
@ -34,7 +34,7 @@ typedef enum _MercuryReply__CachePolicy {
/* --- messages --- */ /* --- messages --- */
struct _MercuryMultiGetRequest struct MercuryMultiGetRequest
{ {
ProtobufCMessage base; ProtobufCMessage base;
size_t n_request; size_t n_request;
@ -45,7 +45,7 @@ struct _MercuryMultiGetRequest
, 0,NULL } , 0,NULL }
struct _MercuryMultiGetReply struct MercuryMultiGetReply
{ {
ProtobufCMessage base; ProtobufCMessage base;
size_t n_reply; size_t n_reply;
@ -56,7 +56,7 @@ struct _MercuryMultiGetReply
, 0,NULL } , 0,NULL }
struct _MercuryRequest struct MercuryRequest
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *uri; char *uri;
@ -71,7 +71,7 @@ struct _MercuryRequest
, NULL, NULL, 0, {0,NULL}, 0, {0,NULL} } , NULL, NULL, 0, {0,NULL}, 0, {0,NULL} }
struct _MercuryReply struct MercuryReply
{ {
ProtobufCMessage base; ProtobufCMessage base;
protobuf_c_boolean has_status_code; protobuf_c_boolean has_status_code;
@ -92,7 +92,7 @@ struct _MercuryReply
, 0, 0, NULL, 0, MERCURY_REPLY__CACHE_POLICY__CACHE_NO, 0, 0, 0, {0,NULL}, NULL, 0, {0,NULL} } , 0, 0, NULL, 0, MERCURY_REPLY__CACHE_POLICY__CACHE_NO, 0, 0, 0, {0,NULL}, NULL, 0, {0,NULL} }
struct _Header struct Header
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *uri; char *uri;
@ -108,7 +108,7 @@ struct _Header
, NULL, NULL, NULL, 0, 0, 0,NULL } , NULL, NULL, NULL, 0, 0, 0,NULL }
struct _UserField struct UserField
{ {
ProtobufCMessage base; ProtobufCMessage base;
char *key; char *key;
@ -271,4 +271,4 @@ extern const ProtobufCMessageDescriptor user_field__descriptor;
PROTOBUF_C__END_DECLS PROTOBUF_C__END_DECLS
#endif /* PROTOBUF_C_proto_2fmercury_2eproto__INCLUDED */ #endif /* PROTOBUF_C_mercury_2eproto__INCLUDED */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,266 +1,318 @@
syntax = "proto2"; syntax = "proto2";
message TopTracks { package spotify.metadata;
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 { message Artist {
optional bytes gid = 0x1; optional bytes gid = 1;
optional string name = 0x2; optional string name = 2;
optional sint32 popularity = 0x3; optional sint32 popularity = 3;
repeated TopTracks top_track = 0x4; repeated TopTracks top_track = 4;
repeated AlbumGroup album_group = 0x5; repeated AlbumGroup album_group = 5;
repeated AlbumGroup single_group = 0x6; repeated AlbumGroup single_group = 6;
repeated AlbumGroup compilation_group = 0x7; repeated AlbumGroup compilation_group = 7;
repeated AlbumGroup appears_on_group = 0x8; repeated AlbumGroup appears_on_group = 8;
repeated string genre = 0x9; repeated string genre = 9;
repeated ExternalId external_id = 0xa; repeated ExternalId external_id = 10;
repeated Image portrait = 0xb; repeated Image portrait = 11;
repeated Biography biography = 0xc; repeated Biography biography = 12;
repeated ActivityPeriod activity_period = 0xd; repeated ActivityPeriod activity_period = 13;
repeated Restriction restriction = 0xe; repeated Restriction restriction = 14;
repeated Artist related = 0xf; repeated Artist related = 15;
optional bool is_portrait_album_cover = 0x10; optional bool is_portrait_album_cover = 16;
optional ImageGroup portrait_group = 0x11; optional ImageGroup portrait_group = 17;
} repeated SalePeriod sale_period = 18;
repeated Availability availability = 20;
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 { message Album {
optional bytes gid = 0x1; optional bytes gid = 1;
optional string name = 0x2; optional string name = 2;
repeated Artist artist = 0x3; repeated Artist artist = 3;
optional Type typ = 0x4;
enum Type { optional Type type = 4;
ALBUM = 0x1; enum Type {
SINGLE = 0x2; ALBUM = 1;
COMPILATION = 0x3; SINGLE = 2;
EP = 0x4; COMPILATION = 3;
} EP = 4;
optional string label = 0x5; AUDIOBOOK = 5;
optional Date date = 0x6; PODCAST = 6;
optional sint32 popularity = 0x7; }
repeated string genre = 0x8;
repeated Image cover = 0x9; optional string label = 5;
repeated ExternalId external_id = 0xa; optional Date date = 6;
repeated Disc disc = 0xb; optional sint32 popularity = 7;
repeated string review = 0xc; repeated string genre = 8;
repeated Copyright copyright = 0xd; repeated Image cover = 9;
repeated Restriction restriction = 0xe; repeated ExternalId external_id = 10;
repeated Album related = 0xf; repeated Disc disc = 11;
repeated SalePeriod sale_period = 0x10; repeated string review = 12;
optional ImageGroup cover_group = 0x11; repeated Copyright copyright = 13;
repeated Restriction restriction = 14;
repeated Album related = 15;
repeated SalePeriod sale_period = 16;
optional ImageGroup cover_group = 17;
optional string original_title = 18;
optional string version_title = 19;
optional string type_str = 20;
repeated Availability availability = 23;
} }
message Track { message Track {
optional bytes gid = 0x1; optional bytes gid = 1;
optional string name = 0x2; optional string name = 2;
optional Album album = 0x3; optional Album album = 3;
repeated Artist artist = 0x4; repeated Artist artist = 4;
optional sint32 number = 0x5; optional sint32 number = 5;
optional sint32 disc_number = 0x6; optional sint32 disc_number = 6;
optional sint32 duration = 0x7; optional sint32 duration = 7;
optional sint32 popularity = 0x8; optional sint32 popularity = 8;
optional bool explicit = 0x9; optional bool explicit = 9;
repeated ExternalId external_id = 0xa; repeated ExternalId external_id = 10;
repeated Restriction restriction = 0xb; repeated Restriction restriction = 11;
repeated AudioFile file = 0xc; repeated AudioFile file = 12;
repeated Track alternative = 0xd; repeated Track alternative = 13;
repeated SalePeriod sale_period = 0xe; repeated SalePeriod sale_period = 14;
repeated AudioFile preview = 0xf; repeated AudioFile preview = 15;
repeated string tags = 16;
optional int64 earliest_live_timestamp = 17;
optional bool has_lyrics = 18;
repeated Availability availability = 19;
optional Licensor licensor = 21;
repeated string language_of_performance = 22;
repeated ContentRating content_rating = 25;
optional string original_title = 27;
optional string version_title = 28;
repeated ArtistWithRole artist_with_role = 32;
} }
message Image { message ArtistWithRole {
optional bytes file_id = 0x1; optional bytes artist_gid = 1;
optional Size size = 0x2; optional string artist_name = 2;
enum Size {
DEFAULT = 0x0; optional ArtistRole role = 3;
SMALL = 0x1; enum ArtistRole {
LARGE = 0x2; ARTIST_ROLE_UNKNOWN = 0;
XLARGE = 0x3; ARTIST_ROLE_MAIN_ARTIST = 1;
} ARTIST_ROLE_FEATURED_ARTIST = 2;
optional sint32 width = 0x3; ARTIST_ROLE_REMIXER = 3;
optional sint32 height = 0x4; ARTIST_ROLE_ACTOR = 4;
ARTIST_ROLE_COMPOSER = 5;
ARTIST_ROLE_CONDUCTOR = 6;
ARTIST_ROLE_ORCHESTRA = 7;
}
} }
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 { message Show {
optional bytes gid = 1;
optional string name = 2;
optional string description = 64;
optional sint32 deprecated_popularity = 65;
optional string publisher = 66;
optional string language = 67;
optional bool explicit = 68;
optional ImageGroup cover_image = 69;
repeated Episode episode = 70;
repeated Copyright copyright = 71;
repeated Restriction restriction = 72;
repeated string keyword = 73;
optional MediaType media_type = 74;
enum MediaType { enum MediaType {
MIXED = 0; MIXED = 0;
AUDIO = 1; AUDIO = 1;
VIDEO = 2; VIDEO = 2;
} }
optional ConsumptionOrder consumption_order = 75;
enum ConsumptionOrder { enum ConsumptionOrder {
SEQUENTIAL = 1; SEQUENTIAL = 1;
EPISODIC = 2; EPISODIC = 2;
RECENT = 3; RECENT = 3;
}
enum PassthroughEnum {
UNKNOWN = 0;
NONE = 1;
ALLOWED = 2;
} }
optional bytes gid = 0x1;
optional string name = 0x2; repeated Availability availability = 78;
optional string description = 0x40; optional string trailer_uri = 83;
optional sint32 deprecated_popularity = 0x41; optional bool music_and_talk = 85;
optional string publisher = 0x42; optional bool is_audiobook = 89;
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 { message Episode {
optional bytes gid = 0x1; optional bytes gid = 1;
optional string name = 0x2; optional string name = 2;
optional sint32 duration = 0x7; optional sint32 duration = 7;
optional sint32 popularity = 0x8; repeated AudioFile audio = 12;
repeated AudioFile file = 0xc; optional string description = 64;
optional string description = 0x40; optional sint32 number = 65;
optional sint32 number = 0x41; optional Date publish_time = 66;
optional Date publish_time = 0x42; optional sint32 deprecated_popularity = 67;
optional sint32 deprecated_popularity = 0x43; optional ImageGroup cover_image = 68;
optional ImageGroup covers = 0x44; optional string language = 69;
optional string language = 0x45; optional bool explicit = 70;
optional bool explicit = 0x46; optional Show show = 71;
optional Show show = 0x47; repeated VideoFile video = 72;
repeated VideoFile video = 0x48; repeated VideoFile video_preview = 73;
repeated VideoFile video_preview = 0x49; repeated AudioFile audio_preview = 74;
repeated AudioFile audio_preview = 0x4A; repeated Restriction restriction = 75;
repeated Restriction restriction = 0x4B; optional ImageGroup freeze_frame = 76;
optional ImageGroup freeze_frame = 0x4C; repeated string keyword = 77;
repeated string keyword = 0x4D; optional bool allow_background_playback = 81;
// Order of these two flags might be wrong! repeated Availability availability = 82;
optional bool suppress_monetization = 0x4E; optional string external_url = 83;
optional bool interpret_restriction_using_geoip = 0x4F;
optional EpisodeType type = 87;
optional bool allow_background_playback = 0x51; enum EpisodeType {
repeated Availability availability = 0x52; FULL = 0;
optional string external_url = 0x53; TRAILER = 1;
optional OriginalAudio original_audio = 0x54; BONUS = 2;
}
optional bool music_and_talk = 91;
repeated ContentRating content_rating = 95;
optional bool is_audiobook_chapter = 96;
} }
message Category { message Licensor {
optional string name = 0x1; optional bytes uuid = 1;
repeated Category subcategories = 0x2;
} }
message OriginalAudio { message TopTracks {
optional bytes uuid = 0x1; optional string country = 1;
repeated Track track = 2;
}
message ActivityPeriod {
optional sint32 start_year = 1;
optional sint32 end_year = 2;
optional sint32 decade = 3;
}
message AlbumGroup {
repeated Album album = 1;
}
message Date {
optional sint32 year = 1;
optional sint32 month = 2;
optional sint32 day = 3;
optional sint32 hour = 4;
optional sint32 minute = 5;
}
message Image {
optional bytes file_id = 1;
optional Size size = 2;
enum Size {
DEFAULT = 0;
SMALL = 1;
LARGE = 2;
XLARGE = 3;
}
optional sint32 width = 3;
optional sint32 height = 4;
}
message ImageGroup {
repeated Image image = 1;
}
message Biography {
optional string text = 1;
repeated Image portrait = 2;
repeated ImageGroup portrait_group = 3;
}
message Disc {
optional sint32 number = 1;
optional string name = 2;
repeated Track track = 3;
}
message Copyright {
optional Type type = 1;
enum Type {
P = 0;
C = 1;
}
optional string text = 2;
}
message Restriction {
repeated Catalogue catalogue = 1;
enum Catalogue {
AD = 0;
SUBSCRIPTION = 1;
CATALOGUE_ALL = 2;
SHUFFLE = 3;
COMMERCIAL = 4;
}
optional Type type = 4;
enum Type {
STREAMING = 0;
}
repeated string catalogue_str = 5;
oneof country_restriction {
string countries_allowed = 2;
string countries_forbidden = 3;
}
}
message Availability {
repeated string catalogue_str = 1;
optional Date start = 2;
}
message SalePeriod {
repeated Restriction restriction = 1;
optional Date start = 2;
optional Date end = 3;
}
message ExternalId {
optional string type = 1;
optional string id = 2;
}
message AudioFile {
optional bytes file_id = 1;
optional Format format = 2;
enum Format {
OGG_VORBIS_96 = 0;
OGG_VORBIS_160 = 1;
OGG_VORBIS_320 = 2;
MP3_256 = 3;
MP3_320 = 4;
MP3_160 = 5;
MP3_96 = 6;
MP3_160_ENC = 7;
AAC_24 = 8;
AAC_48 = 9;
MP4_128 = 10;
MP4_128_DUAL = 11;
MP4_128_CBCS = 12;
MP4_256 = 13;
MP4_256_DUAL = 14;
MP4_256_CBCS = 15;
FLAC_FLAC = 16;
XHE_AAC_24 = 18;
XHE_AAC_16 = 19;
XHE_AAC_12 = 20;
FLAC_FLAC_24BIT = 22;
}
}
message VideoFile {
optional bytes file_id = 1;
}
message ContentRating {
optional string country = 1;
repeated string tag = 2;
} }