first commit

This commit is contained in:
cool.gitter.not.me.again.duh
2025-05-30 21:28:21 -06:00
commit 92a7a5d84e
95 changed files with 30188 additions and 0 deletions

168
proto/authentication.proto Normal file
View File

@@ -0,0 +1,168 @@
syntax = "proto2";
package spotify;
option java_package = "com.spotify";
message ClientResponseEncrypted {
required LoginCredentials login_credentials = 0xa;
optional AccountCreation account_creation = 0x14;
optional FingerprintResponseUnion fingerprint_response = 0x1e;
optional PeerTicketUnion peer_ticket = 0x28;
required SystemInfo system_info = 0x32;
optional string platform_model = 0x3c;
optional string version_string = 0x46;
optional LibspotifyAppKey appkey = 0x50;
optional ClientInfo client_info = 0x5a;
}
message LoginCredentials {
optional string username = 0xa;
required AuthenticationType typ = 0x14;
optional bytes auth_data = 0x1e;
}
enum AuthenticationType {
AUTHENTICATION_USER_PASS = 0x0;
AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS = 0x1;
AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS = 0x2;
AUTHENTICATION_SPOTIFY_TOKEN = 0x3;
AUTHENTICATION_FACEBOOK_TOKEN = 0x4;
}
enum AccountCreation {
ACCOUNT_CREATION_ALWAYS_PROMPT = 0x1;
ACCOUNT_CREATION_ALWAYS_CREATE = 0x3;
}
message FingerprintResponseUnion {
optional FingerprintGrainResponse grain = 0xa;
optional FingerprintHmacRipemdResponse hmac_ripemd = 0x14;
}
message FingerprintGrainResponse {
required bytes encrypted_key = 0xa;
}
message FingerprintHmacRipemdResponse {
required bytes hmac = 0xa;
}
message PeerTicketUnion {
optional PeerTicketPublicKey public_key = 0xa;
optional PeerTicketOld old_ticket = 0x14;
}
message PeerTicketPublicKey {
required bytes public_key = 0xa;
}
message PeerTicketOld {
required bytes peer_ticket = 0xa;
required bytes peer_ticket_signature = 0x14;
}
message SystemInfo {
required CpuFamily cpu_family = 0xa;
optional uint32 cpu_subtype = 0x14;
optional uint32 cpu_ext = 0x1e;
optional Brand brand = 0x28;
optional uint32 brand_flags = 0x32;
required Os os = 0x3c;
optional uint32 os_version = 0x46;
optional uint32 os_ext = 0x50;
optional string system_information_string = 0x5a;
optional string device_id = 0x64;
}
enum CpuFamily {
CPU_UNKNOWN = 0x0;
CPU_X86 = 0x1;
CPU_X86_64 = 0x2;
CPU_PPC = 0x3;
CPU_PPC_64 = 0x4;
CPU_ARM = 0x5;
CPU_IA64 = 0x6;
CPU_SH = 0x7;
CPU_MIPS = 0x8;
CPU_BLACKFIN = 0x9;
}
enum Brand {
BRAND_UNBRANDED = 0x0;
BRAND_INQ = 0x1;
BRAND_HTC = 0x2;
BRAND_NOKIA = 0x3;
}
enum Os {
OS_UNKNOWN = 0x0;
OS_WINDOWS = 0x1;
OS_OSX = 0x2;
OS_IPHONE = 0x3;
OS_S60 = 0x4;
OS_LINUX = 0x5;
OS_WINDOWS_CE = 0x6;
OS_ANDROID = 0x7;
OS_PALM = 0x8;
OS_FREEBSD = 0x9;
OS_BLACKBERRY = 0xa;
OS_SONOS = 0xb;
OS_LOGITECH = 0xc;
OS_WP7 = 0xd;
OS_ONKYO = 0xe;
OS_PHILIPS = 0xf;
OS_WD = 0x10;
OS_VOLVO = 0x11;
OS_TIVO = 0x12;
OS_AWOX = 0x13;
OS_MEEGO = 0x14;
OS_QNXNTO = 0x15;
OS_BCO = 0x16;
}
message LibspotifyAppKey {
required uint32 version = 0x1;
required bytes devkey = 0x2;
required bytes signature = 0x3;
required string useragent = 0x4;
required bytes callback_hash = 0x5;
}
message ClientInfo {
optional bool limited = 0x1;
optional ClientInfoFacebook fb = 0x2;
optional string language = 0x3;
}
message ClientInfoFacebook {
optional string machine_id = 0x1;
}
message APWelcome {
required string canonical_username = 0xa;
required AccountType account_type_logged_in = 0x14;
required AccountType credentials_type_logged_in = 0x19;
required AuthenticationType reusable_auth_credentials_type = 0x1e;
required bytes reusable_auth_credentials = 0x28;
optional bytes lfs_secret = 0x32;
optional AccountInfo account_info = 0x3c;
optional AccountInfoFacebook fb = 0x46;
}
enum AccountType {
Spotify = 0x0;
Facebook = 0x1;
}
message AccountInfo {
optional AccountInfoSpotify spotify = 0x1;
optional AccountInfoFacebook facebook = 0x2;
}
message AccountInfoSpotify {
}
message AccountInfoFacebook {
optional string access_token = 0x1;
optional string machine_id = 0x2;
}

14
proto/canvaz-meta.proto Normal file
View File

@@ -0,0 +1,14 @@
syntax = "proto3";
package com.spotify.canvaz;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.canvaz";
enum Type {
IMAGE = 0;
VIDEO = 1;
VIDEO_LOOPING = 2;
VIDEO_LOOPING_RANDOM = 3;
GIF = 4;
}

40
proto/canvaz.proto Normal file
View File

@@ -0,0 +1,40 @@
syntax = "proto3";
package com.spotify.canvazcache;
import "canvaz-meta.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.canvaz";
message Artist {
string uri = 1;
string name = 2;
string avatar = 3;
}
message EntityCanvazResponse {
repeated Canvaz canvases = 1;
message Canvaz {
string id = 1;
string url = 2;
string file_id = 3;
canvaz.Type type = 4;
string entity_uri = 5;
Artist artist = 6;
bool explicit = 7;
string uploaded_by = 8;
string etag = 9;
string canvas_uri = 11;
}
int64 ttl_in_seconds = 2;
}
message EntityCanvazRequest {
repeated Entity entities = 1;
message Entity {
string entity_uri = 1;
string etag = 2;
}
}

125
proto/client_token.proto Normal file
View File

@@ -0,0 +1,125 @@
syntax = "proto3";
package spotify.clienttoken.http.v0;
import "connectivity.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.clienttoken.http.v0";
message ClientTokenRequest {
ClientTokenRequestType request_type = 1;
oneof request {
ClientDataRequest client_data = 2;
ChallengeAnswersRequest challenge_answers = 3;
}
}
message ClientDataRequest {
string client_version = 1;
string client_id = 2;
oneof data {
data.v0.ConnectivitySdkData connectivity_sdk_data = 3;
}
}
message ChallengeAnswersRequest {
string state = 1;
repeated ChallengeAnswer answers = 2;
}
message ClientTokenResponse {
ClientTokenResponseType response_type = 1;
oneof response {
GrantedTokenResponse granted_token = 2;
ChallengesResponse challenges = 3;
}
}
message TokenDomain {
string domain = 1;
}
message GrantedTokenResponse {
string token = 1;
int32 expires_after_seconds = 2;
int32 refresh_after_seconds = 3;
repeated TokenDomain domains = 4;
}
message ChallengesResponse {
string state = 1;
repeated Challenge challenges = 2;
}
message ClientSecretParameters {
string salt = 1;
}
message EvaluateJSParameters {
string code = 1;
repeated string libraries = 2;
}
message HashCashParameters {
int32 length = 1;
string prefix = 2;
}
message Challenge {
ChallengeType type = 1;
oneof parameters {
ClientSecretParameters client_secret_parameters = 2;
EvaluateJSParameters evaluate_js_parameters = 3;
HashCashParameters evaluate_hashcash_parameters = 4;
}
}
message ClientSecretHMACAnswer {
string hmac = 1;
}
message EvaluateJSAnswer {
string result = 1;
}
message HashCashAnswer {
string suffix = 1;
}
message ChallengeAnswer {
ChallengeType ChallengeType = 1;
oneof answer {
ClientSecretHMACAnswer client_secret = 2;
EvaluateJSAnswer evaluate_js = 3;
HashCashAnswer hash_cash = 4;
}
}
message ClientTokenBadRequest {
string message = 1;
}
enum ClientTokenRequestType {
REQUEST_UNKNOWN = 0;
REQUEST_CLIENT_DATA_REQUEST = 1;
REQUEST_CHALLENGE_ANSWERS_REQUEST = 2;
}
enum ClientTokenResponseType {
RESPONSE_UNKNOWN = 0;
RESPONSE_GRANTED_TOKEN_RESPONSE = 1;
RESPONSE_CHALLENGES_RESPONSE = 2;
}
enum ChallengeType {
CHALLENGE_UNKNOWN = 0;
CHALLENGE_CLIENT_SECRET_HMAC = 1;
CHALLENGE_EVALUATE_JS = 2;
CHALLENGE_HASH_CASH = 3;
}

173
proto/connect.proto Normal file
View File

@@ -0,0 +1,173 @@
syntax = "proto3";
package connectstate;
import "player.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.connectstate";
message ClusterUpdate {
Cluster cluster = 1;
ClusterUpdateReason update_reason = 2;
string ack_id = 3;
repeated string devices_that_changed = 4;
}
message Device {
DeviceInfo device_info = 1;
PlayerState player_state = 2;
PrivateDeviceInfo private_device_info = 3;
}
message Cluster {
int64 timestamp = 1;
string active_device_id = 2;
PlayerState player_state = 3;
map<string, DeviceInfo> device = 4;
bytes transfer_data = 5;
}
message PutStateRequest {
string callback_url = 1;
Device device = 2;
MemberType member_type = 3;
bool is_active = 4;
PutStateReason put_state_reason = 5;
uint32 message_id = 6;
string last_command_sent_by_device_id = 7;
uint32 last_command_message_id = 8;
uint64 started_playing_at = 9;
uint64 has_been_playing_for_ms = 11;
uint64 client_side_timestamp = 12;
bool only_write_player_state = 13;
}
message PrivateDeviceInfo {
string platform = 1;
}
message SubscribeRequest {
string callback_url = 1;
}
message DeviceInfo {
bool can_play = 1;
uint32 volume = 2;
string name = 3;
Capabilities capabilities = 4;
string device_software_version = 6;
DeviceType device_type = 7;
string spirc_version = 9;
string device_id = 10;
bool is_private_session = 11;
bool is_social_connect = 12;
string client_id = 13;
string brand = 14;
string model = 15;
map<string, string> metadata_map = 16;
}
message Capabilities {
bool can_be_player = 2;
bool restrict_to_local = 3;
bool gaia_eq_connect_id = 5;
bool supports_logout = 6;
bool is_observable = 7;
int32 volume_steps = 8;
repeated string supported_types = 9;
bool command_acks = 10;
bool supports_rename = 11;
bool hidden = 12;
bool disable_volume = 13;
bool connect_disabled = 14;
bool supports_playlist_v2 = 15;
bool is_controllable = 16;
bool supports_external_episodes = 17;
bool supports_set_backend_metadata = 18;
bool supports_transfer_command = 19;
bool supports_command_request = 20;
bool is_voice_enabled = 21;
bool needs_full_player_state = 22;
bool supports_gzip_pushes = 23;
// reserved 1, "supported_contexts";
}
message ConnectCommandOptions {
int32 message_id = 1;
}
message LogoutCommand {
ConnectCommandOptions command_options = 1;
}
message SetVolumeCommand {
int32 volume = 1;
ConnectCommandOptions command_options = 2;
}
message RenameCommand {
string rename_to = 1;
ConnectCommandOptions command_options = 2;
}
message SetBackendMetadataCommand {
map<string, string> metadata = 1;
}
enum SendCommandResult {
UNKNOWN_SEND_COMMAND_RESULT = 0;
SUCCESS = 1;
DEVICE_NOT_FOUND = 2;
CONTEXT_PLAYER_ERROR = 3;
DEVICE_DISAPPEARED = 4;
UPSTREAM_ERROR = 5;
DEVICE_DOES_NOT_SUPPORT_COMMAND = 6;
RATE_LIMITED = 7;
}
enum PutStateReason {
UNKNOWN_PUT_STATE_REASON = 0;
SPIRC_HELLO = 1;
SPIRC_NOTIFY = 2;
NEW_DEVICE = 3;
PLAYER_STATE_CHANGED = 4;
VOLUME_CHANGED = 5;
PICKER_OPENED = 6;
BECAME_INACTIVE = 7;
}
enum MemberType {
SPIRC_V2 = 0;
SPIRC_V3 = 1;
CONNECT_STATE = 2;
}
enum ClusterUpdateReason {
UNKNOWN_CLUSTER_UPDATE_REASON = 0;
DEVICES_DISAPPEARED = 1;
DEVICE_STATE_CHANGED = 2;
NEW_DEVICE_APPEARED = 3;
}
enum DeviceType {
UNKNOWN = 0;
COMPUTER = 1;
TABLET = 2;
SMARTPHONE = 3;
SPEAKER = 4;
TV = 5;
AVR = 6;
STB = 7;
AUDIO_DONGLE = 8;
GAME_CONSOLE = 9;
CAST_VIDEO = 10;
CAST_AUDIO = 11;
AUTOMOBILE = 12;
SMARTWATCH = 13;
CHROMEBOOK = 14;
UNKNOWN_SPOTIFY = 100;
CAR_THING = 101;
OBSERVER = 102;
HOME_THING = 103;
}

51
proto/connectivity.proto Normal file
View File

@@ -0,0 +1,51 @@
syntax = "proto3";
package spotify.clienttoken.data.v0;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.clienttoken.data.v0";
message ConnectivitySdkData {
PlatformSpecificData platform_specific_data = 1;
string device_id = 2;
}
message PlatformSpecificData {
oneof data {
NativeAndroidData android = 1;
NativeIOSData ios = 2;
NativeWindowsData windows = 4;
}
}
message NativeAndroidData {
int32 major_sdk_version = 1;
int32 minor_sdk_version = 2;
int32 patch_sdk_version = 3;
uint32 api_version = 4;
Screen screen_dimensions = 5;
}
message NativeIOSData {
int32 user_interface_idiom = 1;
bool target_iphone_simulator = 2;
string hw_machine = 3;
string system_version = 4;
string simulator_model_identifier = 5;
}
message NativeWindowsData {
int32 something1 = 1;
int32 something3 = 3;
int32 something4 = 4;
int32 something6 = 6;
int32 something7 = 7;
int32 something8 = 8;
bool something10 = 10;
}
message Screen {
int32 width = 1;
int32 height = 2;
int32 density = 3;
}

18
proto/context.proto Normal file
View File

@@ -0,0 +1,18 @@
syntax = "proto2";
package spotify.player.proto;
import "context_page.proto";
import "restrictions.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.context";
message Context {
optional string uri = 1;
optional string url = 2;
map<string, string> metadata = 3;
optional Restrictions restrictions = 4;
repeated ContextPage pages = 5;
optional bool loading = 6;
}

16
proto/context_page.proto Normal file
View File

@@ -0,0 +1,16 @@
syntax = "proto2";
package spotify.player.proto;
import "context_track.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.context";
message ContextPage {
optional string page_url = 1;
optional string next_page_url = 2;
map<string, string> metadata = 3;
repeated ContextTrack tracks = 4;
optional bool loading = 5;
}

View File

@@ -0,0 +1,18 @@
syntax = "proto2";
package spotify.player.proto;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.context";
message ContextPlayerOptions {
optional bool shuffling_context = 1;
optional bool repeating_context = 2;
optional bool repeating_track = 3;
}
message ContextPlayerOptionOverrides {
optional bool shuffling_context = 1;
optional bool repeating_context = 2;
optional bool repeating_track = 3;
}

13
proto/context_track.proto Normal file
View File

@@ -0,0 +1,13 @@
syntax = "proto2";
package spotify.player.proto;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.context";
message ContextTrack {
optional string uri = 1;
optional string uid = 2;
optional bytes gid = 3;
map<string, string> metadata = 4;
}

View File

@@ -0,0 +1,15 @@
syntax = "proto2";
package spotify.explicit_content.proto;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.explicit";
message KeyValuePair {
required string key = 1;
required string value = 2;
}
message UserAttributesUpdate {
repeated KeyValuePair pairs = 1;
}

231
proto/keyexchange.proto Normal file
View File

@@ -0,0 +1,231 @@
syntax = "proto2";
package spotify;
option java_package = "com.spotify";
message ClientHello {
required BuildInfo build_info = 0xa;
repeated Fingerprint fingerprints_supported = 0x14;
repeated Cryptosuite cryptosuites_supported = 0x1e;
repeated Powscheme powschemes_supported = 0x28;
required LoginCryptoHelloUnion login_crypto_hello = 0x32;
required bytes client_nonce = 0x3c;
optional bytes padding = 0x46;
optional FeatureSet feature_set = 0x50;
}
message BuildInfo {
required Product product = 0xa;
repeated ProductFlags product_flags = 0x14;
required Platform platform = 0x1e;
required uint64 version = 0x28;
}
enum Product {
PRODUCT_CLIENT = 0x0;
PRODUCT_LIBSPOTIFY = 0x1;
PRODUCT_MOBILE = 0x2;
PRODUCT_PARTNER = 0x3;
PRODUCT_LIBSPOTIFY_EMBEDDED = 0x5;
}
enum ProductFlags {
PRODUCT_FLAG_NONE = 0x0;
PRODUCT_FLAG_DEV_BUILD = 0x1;
}
enum Platform {
PLATFORM_WIN32_X86 = 0x0;
PLATFORM_OSX_X86 = 0x1;
PLATFORM_LINUX_X86 = 0x2;
PLATFORM_IPHONE_ARM = 0x3;
PLATFORM_S60_ARM = 0x4;
PLATFORM_OSX_PPC = 0x5;
PLATFORM_ANDROID_ARM = 0x6;
PLATFORM_WINDOWS_CE_ARM = 0x7;
PLATFORM_LINUX_X86_64 = 0x8;
PLATFORM_OSX_X86_64 = 0x9;
PLATFORM_PALM_ARM = 0xa;
PLATFORM_LINUX_SH = 0xb;
PLATFORM_FREEBSD_X86 = 0xc;
PLATFORM_FREEBSD_X86_64 = 0xd;
PLATFORM_BLACKBERRY_ARM = 0xe;
PLATFORM_SONOS = 0xf;
PLATFORM_LINUX_MIPS = 0x10;
PLATFORM_LINUX_ARM = 0x11;
PLATFORM_LOGITECH_ARM = 0x12;
PLATFORM_LINUX_BLACKFIN = 0x13;
PLATFORM_WP7_ARM = 0x14;
PLATFORM_ONKYO_ARM = 0x15;
PLATFORM_QNXNTO_ARM = 0x16;
PLATFORM_BCO_ARM = 0x17;
}
enum Fingerprint {
FINGERPRINT_GRAIN = 0x0;
FINGERPRINT_HMAC_RIPEMD = 0x1;
}
enum Cryptosuite {
CRYPTO_SUITE_SHANNON = 0x0;
CRYPTO_SUITE_RC4_SHA1_HMAC = 0x1;
}
enum Powscheme {
POW_HASH_CASH = 0x0;
}
message LoginCryptoHelloUnion {
optional LoginCryptoDiffieHellmanHello diffie_hellman = 0xa;
}
message LoginCryptoDiffieHellmanHello {
required bytes gc = 0xa;
required uint32 server_keys_known = 0x14;
}
message FeatureSet {
optional bool autoupdate2 = 0x1;
optional bool current_location = 0x2;
}
message APResponseMessage {
optional APChallenge challenge = 0xa;
optional UpgradeRequiredMessage upgrade = 0x14;
optional APLoginFailed login_failed = 0x1e;
}
message APChallenge {
required LoginCryptoChallengeUnion login_crypto_challenge = 0xa;
required FingerprintChallengeUnion fingerprint_challenge = 0x14;
required PoWChallengeUnion pow_challenge = 0x1e;
required CryptoChallengeUnion crypto_challenge = 0x28;
required bytes server_nonce = 0x32;
optional bytes padding = 0x3c;
}
message LoginCryptoChallengeUnion {
optional LoginCryptoDiffieHellmanChallenge diffie_hellman = 0xa;
}
message LoginCryptoDiffieHellmanChallenge {
required bytes gs = 0xa;
required int32 server_signature_key = 0x14;
required bytes gs_signature = 0x1e;
}
message FingerprintChallengeUnion {
optional FingerprintGrainChallenge grain = 0xa;
optional FingerprintHmacRipemdChallenge hmac_ripemd = 0x14;
}
message FingerprintGrainChallenge {
required bytes kek = 0xa;
}
message FingerprintHmacRipemdChallenge {
required bytes challenge = 0xa;
}
message PoWChallengeUnion {
optional PoWHashCashChallenge hash_cash = 0xa;
}
message PoWHashCashChallenge {
optional bytes prefix = 0xa;
optional int32 length = 0x14;
optional int32 target = 0x1e;
}
message CryptoChallengeUnion {
optional CryptoShannonChallenge shannon = 0xa;
optional CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 0x14;
}
message CryptoShannonChallenge {
}
message CryptoRc4Sha1HmacChallenge {
}
message UpgradeRequiredMessage {
required bytes upgrade_signed_part = 0xa;
required bytes signature = 0x14;
optional string http_suffix = 0x1e;
}
message APLoginFailed {
required ErrorCode error_code = 0xa;
optional int32 retry_delay = 0x14;
optional int32 expiry = 0x1e;
optional string error_description = 0x28;
}
enum ErrorCode {
ProtocolError = 0x0;
TryAnotherAP = 0x2;
BadConnectionId = 0x5;
TravelRestriction = 0x9;
PremiumAccountRequired = 0xb;
BadCredentials = 0xc;
CouldNotValidateCredentials = 0xd;
AccountExists = 0xe;
ExtraVerificationRequired = 0xf;
InvalidAppKey = 0x10;
ApplicationBanned = 0x11;
}
message ClientResponsePlaintext {
required LoginCryptoResponseUnion login_crypto_response = 0xa;
required PoWResponseUnion pow_response = 0x14;
required CryptoResponseUnion crypto_response = 0x1e;
}
message LoginCryptoResponseUnion {
optional LoginCryptoDiffieHellmanResponse diffie_hellman = 0xa;
}
message LoginCryptoDiffieHellmanResponse {
required bytes hmac = 0xa;
}
message PoWResponseUnion {
optional PoWHashCashResponse hash_cash = 0xa;
}
message PoWHashCashResponse {
required bytes hash_suffix = 0xa;
}
message CryptoResponseUnion {
optional CryptoShannonResponse shannon = 0xa;
optional CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 0x14;
}
message CryptoShannonResponse {
optional int32 dummy = 0x1;
}
message CryptoRc4Sha1HmacResponse {
optional int32 dummy = 0x1;
}

49
proto/mercury.proto Normal file
View File

@@ -0,0 +1,49 @@
syntax = "proto2";
package spotify;
option java_package = "com.spotify";
message MercuryMultiGetRequest {
repeated MercuryRequest request = 0x1;
}
message MercuryMultiGetReply {
repeated MercuryReply reply = 0x1;
}
message MercuryRequest {
optional string uri = 0x1;
optional string content_type = 0x2;
optional bytes body = 0x3;
optional bytes etag = 0x4;
}
message MercuryReply {
optional sint32 status_code = 0x1;
optional string status_message = 0x2;
optional CachePolicy cache_policy = 0x3;
enum CachePolicy {
CACHE_NO = 0x1;
CACHE_PRIVATE = 0x2;
CACHE_PUBLIC = 0x3;
}
optional sint32 ttl = 0x4;
optional bytes etag = 0x5;
optional string content_type = 0x6;
optional bytes body = 0x7;
}
message Header {
optional string uri = 0x01;
optional string content_type = 0x02;
optional string method = 0x03;
optional sint32 status_code = 0x04;
repeated UserField user_fields = 0x06;
}
message UserField {
optional string key = 0x01;
optional bytes value = 0x02;
}

279
proto/metadata.proto Normal file
View File

@@ -0,0 +1,279 @@
syntax = "proto2";
package spotify.metadata.proto;
option optimize_for = CODE_SIZE;
option java_outer_classname = "Metadata";
option java_package = "com.spotify.metadata";
message Artist {
optional bytes gid = 1;
optional string name = 2;
optional sint32 popularity = 3;
repeated TopTracks top_track = 4;
repeated AlbumGroup album_group = 5;
repeated AlbumGroup single_group = 6;
repeated AlbumGroup compilation_group = 7;
repeated AlbumGroup appears_on_group = 8;
repeated string genre = 9;
repeated ExternalId external_id = 10;
repeated Image portrait = 11;
repeated Biography biography = 12;
repeated ActivityPeriod activity_period = 13;
repeated Restriction restriction = 14;
repeated Artist related = 15;
optional bool is_portrait_album_cover = 16;
optional ImageGroup portrait_group = 17;
repeated SalePeriod sale_period = 18;
repeated Availability availability = 20;
}
message Album {
optional bytes gid = 1;
optional string name = 2;
repeated Artist artist = 3;
optional Type type = 4;
enum Type {
ALBUM = 1;
SINGLE = 2;
COMPILATION = 3;
EP = 4;
AUDIOBOOK = 5;
PODCAST = 6;
}
optional string label = 5;
optional Date date = 6;
optional sint32 popularity = 7;
repeated string genre = 8;
repeated Image cover = 9;
repeated ExternalId external_id = 10;
repeated Disc disc = 11;
repeated string review = 12;
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 {
optional bytes gid = 1;
optional string name = 2;
optional Album album = 3;
repeated Artist artist = 4;
optional sint32 number = 5;
optional sint32 disc_number = 6;
optional sint32 duration = 7;
optional sint32 popularity = 8;
optional bool explicit = 9;
repeated ExternalId external_id = 10;
repeated Restriction restriction = 11;
repeated AudioFile file = 12;
repeated Track alternative = 13;
repeated SalePeriod sale_period = 14;
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;
}
message Show {
optional bytes gid = 1;
optional string name = 2;
optional string description = 64;
optional sint32 deprecated_popularity = 65 [deprecated = true];
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 {
MIXED = 0;
AUDIO = 1;
VIDEO = 2;
}
optional ConsumptionOrder consumption_order = 75;
enum ConsumptionOrder {
SEQUENTIAL = 1;
EPISODIC = 2;
RECENT = 3;
}
repeated Availability availability = 78;
optional string trailer_uri = 83;
}
message Episode {
optional bytes gid = 1;
optional string name = 2;
optional sint32 duration = 7;
repeated AudioFile audio = 12;
optional string description = 64;
optional sint32 number = 65;
optional Date publish_time = 66;
optional sint32 deprecated_popularity = 67 [deprecated = true];
optional ImageGroup cover_image = 68;
optional string language = 69;
optional bool explicit = 70;
optional Show show = 71;
repeated VideoFile video = 72;
repeated VideoFile video_preview = 73;
repeated AudioFile audio_preview = 74;
repeated Restriction restriction = 75;
optional ImageGroup freeze_frame = 76;
repeated string keyword = 77;
optional bool allow_background_playback = 81;
repeated Availability availability = 82;
optional string external_url = 83;
optional .spotify.metadata.proto.Episode.EpisodeType type = 87;
enum EpisodeType {
FULL = 0;
TRAILER = 1;
BONUS = 2;
}
}
message Licensor {
optional bytes uuid = 1;
}
message TopTracks {
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;
AAC_24_NORM = 16;
}
}
message VideoFile {
optional bytes file_id = 1;
}

16
proto/play_origin.proto Normal file
View File

@@ -0,0 +1,16 @@
syntax = "proto2";
package spotify.player.proto;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.context";
message PlayOrigin {
optional string feature_identifier = 1;
optional string feature_version = 2;
optional string view_uri = 3;
optional string external_referrer = 4;
optional string referrer_identifier = 5;
optional string device_identifier = 6;
repeated string feature_classes = 7;
}

16
proto/playback.proto Normal file
View File

@@ -0,0 +1,16 @@
syntax = "proto2";
package spotify.player.proto.transfer;
import "context_track.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.transfer";
message Playback {
optional int64 timestamp = 1;
optional int32 position_as_of_timestamp = 2;
optional double playback_speed = 3;
optional bool is_paused = 4;
optional ContextTrack current_track = 5;
}

102
proto/player.proto Normal file
View File

@@ -0,0 +1,102 @@
syntax = "proto3";
package connectstate;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.connectstate";
message PlayerState {
int64 timestamp = 1;
string context_uri = 2;
string context_url = 3;
Restrictions context_restrictions = 4;
PlayOrigin play_origin = 5;
ContextIndex index = 6;
ProvidedTrack track = 7;
string playback_id = 8;
double playback_speed = 9;
int64 position_as_of_timestamp = 10;
int64 duration = 11;
bool is_playing = 12;
bool is_paused = 13;
bool is_buffering = 14;
bool is_system_initiated = 15;
ContextPlayerOptions options = 16;
Restrictions restrictions = 17;
Suppressions suppressions = 18;
repeated ProvidedTrack prev_tracks = 19;
repeated ProvidedTrack next_tracks = 20;
map<string, string> context_metadata = 21;
map<string, string> page_metadata = 22;
string session_id = 23;
string queue_revision = 24;
int64 position = 25;
string entity_uri = 26;
repeated ProvidedTrack reverse = 27;
repeated ProvidedTrack future = 28;
}
message ProvidedTrack {
string uri = 1;
string uid = 2;
map<string, string> metadata = 3;
repeated string removed = 4;
repeated string blocked = 5;
string provider = 6;
Restrictions restrictions = 7;
string album_uri = 8;
repeated string disallow_reasons = 9;
string artist_uri = 10;
repeated string disallow_undecided = 11;
}
message ContextIndex {
uint32 page = 1;
uint32 track = 2;
}
message Restrictions {
repeated string disallow_pausing_reasons = 1;
repeated string disallow_resuming_reasons = 2;
repeated string disallow_seeking_reasons = 3;
repeated string disallow_peeking_prev_reasons = 4;
repeated string disallow_peeking_next_reasons = 5;
repeated string disallow_skipping_prev_reasons = 6;
repeated string disallow_skipping_next_reasons = 7;
repeated string disallow_toggling_repeat_context_reasons = 8;
repeated string disallow_toggling_repeat_track_reasons = 9;
repeated string disallow_toggling_shuffle_reasons = 10;
repeated string disallow_set_queue_reasons = 11;
repeated string disallow_interrupting_playback_reasons = 12;
repeated string disallow_transferring_playback_reasons = 13;
repeated string disallow_remote_control_reasons = 14;
repeated string disallow_inserting_into_next_tracks_reasons = 15;
repeated string disallow_inserting_into_context_tracks_reasons = 16;
repeated string disallow_reordering_in_next_tracks_reasons = 17;
repeated string disallow_reordering_in_context_tracks_reasons = 18;
repeated string disallow_removing_from_next_tracks_reasons = 19;
repeated string disallow_removing_from_context_tracks_reasons = 20;
repeated string disallow_updating_context_reasons = 21;
repeated string disallow_playing_reasons = 22;
repeated string disallow_stopping_reasons = 23;
}
message PlayOrigin {
string feature_identifier = 1;
string feature_version = 2;
string view_uri = 3;
string external_referrer = 4;
string referrer_identifier = 5;
string device_identifier = 6;
repeated string feature_classes = 7;
}
message ContextPlayerOptions {
bool shuffling_context = 1;
bool repeating_context = 2;
bool repeating_track = 3;
}
message Suppressions {
repeated string providers = 1;
}

View File

@@ -0,0 +1,229 @@
syntax = "proto2";
package spotify.playlist4.proto;
option optimize_for = CODE_SIZE;
option java_outer_classname = "Playlist4ApiProto";
option java_package = "com.spotify.playlist4";
message Item {
required string uri = 1;
optional ItemAttributes attributes = 2;
}
message MetaItem {
optional bytes revision = 1;
optional ListAttributes attributes = 2;
optional int32 length = 3;
optional int64 timestamp = 4;
optional string owner_username = 5;
}
message ListItems {
required int32 pos = 1;
required bool truncated = 2;
repeated Item items = 3;
repeated MetaItem meta_items = 4;
}
message FormatListAttribute {
optional string key = 1;
optional string value = 2;
}
message ListAttributes {
optional string name = 1;
optional string description = 2;
optional bytes picture = 3;
optional bool collaborative = 4;
optional string pl3_version = 5;
optional bool deleted_by_owner = 6;
optional string client_id = 10;
optional string format = 11;
repeated FormatListAttribute format_attributes = 12;
}
message ItemAttributes {
optional string added_by = 1;
optional int64 timestamp = 2;
optional int64 seen_at = 9;
optional bool public = 10;
repeated FormatListAttribute format_attributes = 11;
optional bytes item_id = 12;
}
message Add {
optional int32 from_index = 1;
repeated Item items = 2;
optional bool add_last = 4;
optional bool add_first = 5;
}
message Rem {
optional int32 from_index = 1;
optional int32 length = 2;
repeated Item items = 3;
optional bool items_as_key = 7;
}
message Mov {
required int32 from_index = 1;
required int32 length = 2;
required int32 to_index = 3;
}
message ItemAttributesPartialState {
required ItemAttributes values = 1;
repeated ItemAttributeKind no_value = 2;
}
message ListAttributesPartialState {
required ListAttributes values = 1;
repeated ListAttributeKind no_value = 2;
}
message UpdateItemAttributes {
required int32 index = 1;
required ItemAttributesPartialState new_attributes = 2;
optional ItemAttributesPartialState old_attributes = 3;
}
message UpdateListAttributes {
required ListAttributesPartialState new_attributes = 1;
optional ListAttributesPartialState old_attributes = 2;
}
message Op {
required Kind kind = 1;
enum Kind {
KIND_UNKNOWN = 0;
ADD = 2;
REM = 3;
MOV = 4;
UPDATE_ITEM_ATTRIBUTES = 5;
UPDATE_LIST_ATTRIBUTES = 6;
}
optional Add add = 2;
optional Rem rem = 3;
optional Mov mov = 4;
optional UpdateItemAttributes update_item_attributes = 5;
optional UpdateListAttributes update_list_attributes = 6;
}
message OpList {
repeated Op ops = 1;
}
message ChangeInfo {
optional string user = 1;
optional int64 timestamp = 2;
optional bool admin = 3;
optional bool undo = 4;
optional bool redo = 5;
optional bool merge = 6;
optional bool compressed = 7;
optional bool migration = 8;
optional int32 split_id = 9;
optional SourceInfo source = 10;
}
message SourceInfo {
optional Client client = 1;
enum Client {
CLIENT_UNKNOWN = 0;
NATIVE_HERMES = 1;
CLIENT = 2;
PYTHON = 3;
JAVA = 4;
WEBPLAYER = 5;
LIBSPOTIFY = 6;
}
optional string app = 3;
optional string source = 4;
optional string version = 5;
}
message Delta {
optional bytes base_version = 1;
repeated Op ops = 2;
optional ChangeInfo info = 4;
}
message Diff {
required bytes from_revision = 1;
repeated Op ops = 2;
required bytes to_revision = 3;
}
message ListChanges {
optional bytes base_revision = 1;
repeated Delta deltas = 2;
optional bool want_resulting_revisions = 3;
optional bool want_sync_result = 4;
repeated int64 nonces = 6;
}
message SelectedListContent {
optional bytes revision = 1;
optional int32 length = 2;
optional ListAttributes attributes = 3;
optional ListItems contents = 5;
optional Diff diff = 6;
optional Diff sync_result = 7;
repeated bytes resulting_revisions = 8;
optional bool multiple_heads = 9;
optional bool up_to_date = 10;
repeated int64 nonces = 14;
optional int64 timestamp = 15;
optional string owner_username = 16;
}
message CreateListReply {
required bytes uri = 1;
optional bytes revision = 2;
}
message ModifyReply {
required bytes uri = 1;
optional bytes revision = 2;
}
message SubscribeRequest {
repeated bytes uris = 1;
}
message UnsubscribeRequest {
repeated bytes uris = 1;
}
message PlaylistModificationInfo {
optional bytes uri = 1;
optional bytes new_revision = 2;
optional bytes parent_revision = 3;
repeated Op ops = 4;
}
enum ListAttributeKind {
LIST_UNKNOWN = 0;
LIST_NAME = 1;
LIST_DESCRIPTION = 2;
LIST_PICTURE = 3;
LIST_COLLABORATIVE = 4;
LIST_PL3_VERSION = 5;
LIST_DELETED_BY_OWNER = 6;
LIST_CLIENT_ID = 10;
LIST_FORMAT = 11;
LIST_FORMAT_ATTRIBUTES = 12;
}
enum ItemAttributeKind {
ITEM_UNKNOWN = 0;
ITEM_ADDED_BY = 1;
ITEM_TIMESTAMP = 2;
ITEM_SEEN_AT = 9;
ITEM_PUBLIC = 10;
ITEM_FORMAT_ATTRIBUTES = 11;
ITEM_ID = 12;
}

View File

@@ -0,0 +1,39 @@
syntax = "proto2";
package spotify_playlist_annotate3.proto;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.playlist_annotate3";
message TakedownRequest {
optional AbuseReportState abuse_report_state = 1;
}
message AnnotateRequest {
optional string description = 1;
optional string image_uri = 2;
}
message TranscodedPicture {
optional string target_name = 1;
optional string uri = 2;
}
message PlaylistAnnotation {
optional string description = 1;
optional string picture = 2;
optional RenderFeatures deprecated_render_features = 3 [default = NORMAL_FEATURES, deprecated = true];
repeated TranscodedPicture transcoded_picture = 4;
optional bool is_abuse_reporting_enabled = 6 [default = true];
optional AbuseReportState abuse_report_state = 7 [default = OK];
}
enum RenderFeatures {
NORMAL_FEATURES = 1;
EXTENDED_FEATURES = 2;
}
enum AbuseReportState {
OK = 0;
TAKEN_DOWN = 1;
}

11
proto/pubsub.proto Normal file
View File

@@ -0,0 +1,11 @@
syntax = "proto2";
package spotify;
option java_package = "com.spotify";
message Subscription {
optional string uri = 0x1;
optional int32 expiry = 0x2;
optional int32 status_code = 0x3;
}

13
proto/queue.proto Normal file
View File

@@ -0,0 +1,13 @@
syntax = "proto2";
package spotify.player.proto.transfer;
import "context_track.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.transfer";
message Queue {
repeated ContextTrack tracks = 1;
optional bool is_playing_queue = 2;
}

30
proto/restrictions.proto Normal file
View File

@@ -0,0 +1,30 @@
syntax = "proto2";
package spotify.player.proto;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.context";
message Restrictions {
repeated string disallow_pausing_reasons = 1;
repeated string disallow_resuming_reasons = 2;
repeated string disallow_seeking_reasons = 3;
repeated string disallow_peeking_prev_reasons = 4;
repeated string disallow_peeking_next_reasons = 5;
repeated string disallow_skipping_prev_reasons = 6;
repeated string disallow_skipping_next_reasons = 7;
repeated string disallow_toggling_repeat_context_reasons = 8;
repeated string disallow_toggling_repeat_track_reasons = 9;
repeated string disallow_toggling_shuffle_reasons = 10;
repeated string disallow_set_queue_reasons = 11;
repeated string disallow_interrupting_playback_reasons = 12;
repeated string disallow_transferring_playback_reasons = 13;
repeated string disallow_remote_control_reasons = 14;
repeated string disallow_inserting_into_next_tracks_reasons = 15;
repeated string disallow_inserting_into_context_tracks_reasons = 16;
repeated string disallow_reordering_in_next_tracks_reasons = 17;
repeated string disallow_reordering_in_context_tracks_reasons = 18;
repeated string disallow_removing_from_next_tracks_reasons = 19;
repeated string disallow_removing_from_context_tracks_reasons = 20;
repeated string disallow_updating_context_reasons = 21;
}

17
proto/session.proto Normal file
View File

@@ -0,0 +1,17 @@
syntax = "proto2";
package spotify.player.proto.transfer;
import "context.proto";
import "context_player_options.proto";
import "play_origin.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.transfer";
message Session {
optional PlayOrigin play_origin = 1;
optional Context context = 2;
optional string current_uid = 3;
optional ContextPlayerOptionOverrides option_overrides = 4;
}

View File

@@ -0,0 +1,19 @@
syntax = "proto3";
package spotify.login5.v3.challenges;
option java_package = "com.spotify.login5v3";
message CodeChallenge {
enum Method {
UNKNOWN = 0;
SMS = 1;
}
.spotify.login5.v3.challenges.CodeChallenge.Method method = 1;
int32 code_length = 2;
int32 expires_in = 3;
string canonical_phone_number = 4;
}
message CodeSolution {
string code = 1;
}

View File

@@ -0,0 +1,16 @@
syntax = "proto3";
package spotify.login5.v3.challenges;
option java_package = "com.spotify.login5v3";
import "google/protobuf/duration.proto";
message HashcashChallenge {
bytes prefix = 1;
int32 length = 2;
}
message HashcashSolution {
bytes suffix = 1;
.google.protobuf.Duration duration = 2;
}

View File

@@ -0,0 +1,9 @@
syntax = "proto3";
package spotify.login5.v3;
option java_package = "com.spotify.login5v3";
message ClientInfo {
string client_id = 1;
string device_id = 2;
}

View File

@@ -0,0 +1,35 @@
syntax = "proto3";
package spotify.login5.v3.credentials;
option java_package = "com.spotify.login5v3";
message StoredCredential {
string username = 1;
bytes data = 2;
}
message Password {
string id = 1;
string password = 2;
bytes padding = 3;
}
message FacebookAccessToken {
string fb_uid = 1;
string access_token = 2;
}
message OneTimeToken {
string token = 1;
}
message ParentChildCredential {
string child_id = 1;
.spotify.login5.v3.credentials.StoredCredential parent_stored_credential = 2;
}
message AppleSignInCredential {
string auth_code = 1;
string redirect_uri = 2;
string bundle_id = 3;
}

View File

@@ -0,0 +1,10 @@
syntax = "proto3";
package spotify.login5.v3.identifiers;
option java_package = "com.spotify.login5v3";
message PhoneNumber {
string number = 1;
string iso_country_code = 2;
string country_calling_code = 3;
}

View File

@@ -0,0 +1,75 @@
syntax = "proto3";
package spotify.login5.v3;
option java_package = "com.spotify.login5v3";
import "spotify/login5/v3/client_info.proto";
import "spotify/login5/v3/user_info.proto";
import "spotify/login5/v3/challenges/code.proto";
import "spotify/login5/v3/challenges/hashcash.proto";
import "spotify/login5/v3/credentials/credentials.proto";
import "spotify/login5/v3/identifiers/identifiers.proto";
enum LoginError {
UNKNOWN_ERROR = 0;
INVALID_CREDENTIALS = 1;
BAD_REQUEST = 2;
UNSUPPORTED_LOGIN_PROTOCOL = 3;
TIMEOUT = 4;
UNKNOWN_IDENTIFIER = 5;
TOO_MANY_ATTEMPTS = 6;
INVALID_PHONENUMBER = 7;
TRY_AGAIN_LATER = 8;
}
message Challenges {
repeated .spotify.login5.v3.Challenge challenges = 1;
}
message Challenge {
.spotify.login5.v3.challenges.HashcashChallenge hashcash = 1;
.spotify.login5.v3.challenges.CodeChallenge code = 2;
}
message ChallengeSolutions {
repeated .spotify.login5.v3.ChallengeSolution solutions = 1;
}
message ChallengeSolution {
.spotify.login5.v3.challenges.HashcashSolution hashcash = 1;
.spotify.login5.v3.challenges.CodeSolution code = 2;
}
message LoginRequest {
.spotify.login5.v3.ClientInfo client_info = 1;
bytes login_context = 2;
.spotify.login5.v3.ChallengeSolutions challenge_solutions = 3;
.spotify.login5.v3.credentials.StoredCredential stored_credential = 100;
.spotify.login5.v3.credentials.Password password = 101;
.spotify.login5.v3.credentials.FacebookAccessToken facebook_access_token = 102;
.spotify.login5.v3.identifiers.PhoneNumber phone_number = 103;
.spotify.login5.v3.credentials.OneTimeToken one_time_token = 104;
.spotify.login5.v3.credentials.ParentChildCredential parent_child_credential = 105;
.spotify.login5.v3.credentials.AppleSignInCredential apple_sign_in_credential = 106;
}
message LoginOk {
string username = 1;
string access_token = 2;
bytes stored_credential = 3;
int32 access_token_expires_in = 4;
}
message LoginResponse {
enum Warnings {
UNKNOWN_WARNING = 0;
DEPRECATED_PROTOCOL_VERSION = 1;
}
.spotify.login5.v3.LoginOk ok = 1;
.spotify.login5.v3.LoginError error = 2;
.spotify.login5.v3.Challenges challenges = 3;
repeated .spotify.login5.v3.LoginResponse.Warnings warnings = 4;
bytes login_context = 5;
string identifier_token = 6;
.spotify.login5.v3.UserInfo user_info = 7;
}

View File

@@ -0,0 +1,21 @@
syntax = "proto3";
package spotify.login5.v3;
option java_package = "com.spotify.login5v3";
message UserInfo {
enum Gender {
UNKNOWN = 0;
MALE = 1;
FEMALE = 2;
NEUTRAL = 3;
}
string name = 1;
string email = 2;
bool email_verified = 3;
string birthdate = 4;
.spotify.login5.v3.UserInfo.Gender gender = 5;
string phone_number = 6;
bool phone_number_verified = 7;
bool email_already_registered = 8;
}

View File

@@ -0,0 +1,18 @@
syntax = "proto3";
package spotify.download.proto;
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.storage";
message StorageResolveResponse {
Result result = 1;
enum Result {
CDN = 0;
STORAGE = 1;
RESTRICTED = 3;
}
repeated string cdnurl = 2;
bytes fileid = 4;
}

View File

@@ -0,0 +1,19 @@
syntax = "proto2";
package spotify.player.proto.transfer;
import "context_player_options.proto";
import "playback.proto";
import "session.proto";
import "queue.proto";
option optimize_for = CODE_SIZE;
option java_package = "com.spotify.transfer";
message TransferState {
optional ContextPlayerOptions options = 1;
optional Playback playback = 2;
optional Session current_session = 3;
optional Queue queue = 4;
optional int64 creation_timestamp = 5;
}