├── .devcontainer ├── Dockerfile ├── Dockerfile.alpine └── devcontainer.json ├── .dockerignore ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── dependabot.yml └── workflows │ └── test.yml ├── .gitignore ├── CHANGELOG.md ├── COMPILING.md ├── CONTRIBUTING.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── PUBLISHING.md ├── README.md ├── SECURITY.md ├── audio ├── Cargo.toml └── src │ ├── decrypt.rs │ ├── fetch │ ├── mod.rs │ └── receive.rs │ ├── lib.rs │ └── range_set.rs ├── cache └── .gitignore ├── connect ├── Cargo.toml ├── README.md └── src │ ├── context_resolver.rs │ ├── lib.rs │ ├── model.rs │ ├── shuffle_vec.rs │ ├── spirc.rs │ ├── state.rs │ └── state │ ├── context.rs │ ├── handle.rs │ ├── metadata.rs │ ├── options.rs │ ├── provider.rs │ ├── restrictions.rs │ ├── tracks.rs │ └── transfer.rs ├── contrib ├── Dockerfile ├── Dockerfile.Rpi ├── cross-compile-armv6hf │ ├── Dockerfile │ └── docker-build.sh ├── docker-build.sh ├── event_handler_example.py ├── librespot.service └── librespot.user.service ├── core ├── Cargo.toml ├── build.rs ├── src │ ├── apresolve.rs │ ├── audio_key.rs │ ├── authentication.rs │ ├── cache.rs │ ├── cdn_url.rs │ ├── channel.rs │ ├── component.rs │ ├── config.rs │ ├── connection │ │ ├── codec.rs │ │ ├── handshake.rs │ │ └── mod.rs │ ├── date.rs │ ├── dealer │ │ ├── manager.rs │ │ ├── maps.rs │ │ ├── mod.rs │ │ ├── protocol.rs │ │ └── protocol │ │ │ └── request.rs │ ├── deserialize_with.rs │ ├── diffie_hellman.rs │ ├── error.rs │ ├── file_id.rs │ ├── http_client.rs │ ├── lib.rs │ ├── login5.rs │ ├── mercury │ │ ├── mod.rs │ │ ├── sender.rs │ │ └── types.rs │ ├── packet.rs │ ├── proxytunnel.rs │ ├── session.rs │ ├── socket.rs │ ├── spclient.rs │ ├── spotify_id.rs │ ├── token.rs │ ├── util.rs │ └── version.rs └── tests │ └── connect.rs ├── discovery ├── Cargo.toml ├── examples │ ├── discovery.rs │ └── discovery_group.rs └── src │ ├── avahi.rs │ ├── lib.rs │ └── server.rs ├── docs ├── authentication.md ├── connection.md └── dealer.md ├── examples ├── get_token.rs ├── play.rs ├── play_connect.rs └── playlist_tracks.rs ├── metadata ├── Cargo.toml └── src │ ├── album.rs │ ├── artist.rs │ ├── audio │ ├── file.rs │ ├── item.rs │ └── mod.rs │ ├── availability.rs │ ├── content_rating.rs │ ├── copyright.rs │ ├── episode.rs │ ├── error.rs │ ├── external_id.rs │ ├── image.rs │ ├── lib.rs │ ├── lyrics.rs │ ├── playlist │ ├── annotation.rs │ ├── attribute.rs │ ├── diff.rs │ ├── item.rs │ ├── list.rs │ ├── mod.rs │ ├── operation.rs │ └── permission.rs │ ├── request.rs │ ├── restriction.rs │ ├── sale_period.rs │ ├── show.rs │ ├── track.rs │ ├── util.rs │ └── video.rs ├── oauth ├── Cargo.toml ├── examples │ ├── oauth_async.rs │ └── oauth_sync.rs └── src │ └── lib.rs ├── playback ├── Cargo.toml └── src │ ├── audio_backend │ ├── alsa.rs │ ├── gstreamer.rs │ ├── jackaudio.rs │ ├── mod.rs │ ├── pipe.rs │ ├── portaudio.rs │ ├── pulseaudio.rs │ ├── rodio.rs │ ├── sdl.rs │ └── subprocess.rs │ ├── config.rs │ ├── convert.rs │ ├── decoder │ ├── mod.rs │ ├── passthrough_decoder.rs │ └── symphonia_decoder.rs │ ├── dither.rs │ ├── lib.rs │ ├── mixer │ ├── alsamixer.rs │ ├── mappings.rs │ ├── mod.rs │ └── softmixer.rs │ └── player.rs ├── protocol ├── Cargo.toml ├── build.rs ├── proto │ ├── AdContext.proto │ ├── AdDecisionEvent.proto │ ├── AdError.proto │ ├── AdEvent.proto │ ├── AdRequestEvent.proto │ ├── AdSlotEvent.proto │ ├── AmazonWakeUpTime.proto │ ├── AudioDriverError.proto │ ├── AudioDriverInfo.proto │ ├── AudioFileSelection.proto │ ├── AudioOffliningSettingsReport.proto │ ├── AudioRateLimit.proto │ ├── AudioSessionEvent.proto │ ├── AudioSettingsReport.proto │ ├── AudioStreamingSettingsReport.proto │ ├── BoomboxPlaybackInstrumentation.proto │ ├── BrokenObject.proto │ ├── CacheError.proto │ ├── CachePruningReport.proto │ ├── CacheRealmPruningReport.proto │ ├── CacheRealmReport.proto │ ├── CacheReport.proto │ ├── ClientLocale.proto │ ├── ColdStartupSequence.proto │ ├── CollectionLevelDbInfo.proto │ ├── CollectionOfflineControllerEmptyTrackList.proto │ ├── ConfigurationApplied.proto │ ├── ConfigurationFetched.proto │ ├── ConfigurationFetchedNonAuth.proto │ ├── ConnectCredentialsRequest.proto │ ├── ConnectDeviceDiscovered.proto │ ├── ConnectDialError.proto │ ├── ConnectMdnsPacketParseError.proto │ ├── ConnectPullFailure.proto │ ├── ConnectTransferResult.proto │ ├── ConnectionError.proto │ ├── ConnectionInfo.proto │ ├── ConnectionStateChange.proto │ ├── DefaultConfigurationApplied.proto │ ├── DesktopAuthenticationFailureNonAuth.proto │ ├── DesktopAuthenticationSuccess.proto │ ├── DesktopDeviceInformation.proto │ ├── DesktopGPUAccelerationInfo.proto │ ├── DesktopHighMemoryUsage.proto │ ├── DesktopPerformanceIssue.proto │ ├── DesktopUpdateDownloadComplete.proto │ ├── DesktopUpdateDownloadError.proto │ ├── DesktopUpdateMessageAction.proto │ ├── DesktopUpdateMessageProcessed.proto │ ├── DesktopUpdateResponse.proto │ ├── Download.proto │ ├── DrmRequestFailure.proto │ ├── EndAd.proto │ ├── EventSenderInternalErrorNonAuth.proto │ ├── EventSenderStats.proto │ ├── EventSenderStats2NonAuth.proto │ ├── ExternalDeviceInfo.proto │ ├── GetInfoFailures.proto │ ├── HeadFileDownload.proto │ ├── LegacyEndSong.proto │ ├── LocalFileSyncError.proto │ ├── LocalFilesError.proto │ ├── LocalFilesImport.proto │ ├── LocalFilesReport.proto │ ├── LocalFilesSourceReport.proto │ ├── MdnsLoginFailures.proto │ ├── MetadataExtensionClientStatistic.proto │ ├── Offline2ClientError.proto │ ├── Offline2ClientEvent.proto │ ├── OfflineError.proto │ ├── OfflineEvent.proto │ ├── OfflineReport.proto │ ├── PlaybackError.proto │ ├── PlaybackRetry.proto │ ├── PlaybackSegments.proto │ ├── PlayerStateRestore.proto │ ├── PlaylistSyncEvent.proto │ ├── PodcastAdSegmentReceived.proto │ ├── Prefetch.proto │ ├── PrefetchError.proto │ ├── ProductStateUcsVerification.proto │ ├── PubSubCountPerIdent.proto │ ├── RawCoreStream.proto │ ├── ReachabilityChanged.proto │ ├── RejectedClientEventNonAuth.proto │ ├── RemainingSkips.proto │ ├── RequestAccounting.proto │ ├── RequestTime.proto │ ├── StartTrack.proto │ ├── Stutter.proto │ ├── TierFeatureFlags.proto │ ├── TrackNotPlayed.proto │ ├── TrackStuck.proto │ ├── WindowSize.proto │ ├── apiv1.proto │ ├── app_state.proto │ ├── audio_files_extension.proto │ ├── audio_format.proto │ ├── authentication.proto │ ├── autodownload_backend_service.proto │ ├── autodownload_config_common.proto │ ├── autodownload_config_get_request.proto │ ├── autodownload_config_set_request.proto │ ├── automix_mode.proto │ ├── autoplay_context_request.proto │ ├── autoplay_node.proto │ ├── canvas.proto │ ├── canvas_storage.proto │ ├── canvaz-meta.proto │ ├── canvaz.proto │ ├── capping_data.proto │ ├── claas.proto │ ├── client-tts.proto │ ├── client_config.proto │ ├── client_update.proto │ ├── clips_cover.proto │ ├── collection │ │ ├── album_collection_state.proto │ │ ├── artist_collection_state.proto │ │ ├── episode_collection_state.proto │ │ ├── show_collection_state.proto │ │ └── track_collection_state.proto │ ├── collection2v2.proto │ ├── collection_add_remove_items_request.proto │ ├── collection_ban_request.proto │ ├── collection_decoration_policy.proto │ ├── collection_get_bans_request.proto │ ├── collection_index.proto │ ├── collection_item.proto │ ├── collection_platform_items.proto │ ├── collection_platform_requests.proto │ ├── collection_platform_responses.proto │ ├── concat_cosmos.proto │ ├── connect.proto │ ├── connectivity.proto │ ├── contains_request.proto │ ├── content_access_token_cosmos.proto │ ├── context.proto │ ├── context_application_desktop.proto │ ├── context_client_id.proto │ ├── context_device_desktop.proto │ ├── context_index.proto │ ├── context_installation_id.proto │ ├── context_monotonic_clock.proto │ ├── context_node.proto │ ├── context_page.proto │ ├── context_player_options.proto │ ├── context_processor.proto │ ├── context_sdk.proto │ ├── context_time.proto │ ├── context_track.proto │ ├── context_view.proto │ ├── context_view_cyclic_list.proto │ ├── context_view_entry.proto │ ├── context_view_entry_key.proto │ ├── cosmos_changes_request.proto │ ├── cosmos_decorate_request.proto │ ├── cosmos_get_album_list_request.proto │ ├── cosmos_get_artist_list_request.proto │ ├── cosmos_get_episode_list_request.proto │ ├── cosmos_get_show_list_request.proto │ ├── cosmos_get_tags_info_request.proto │ ├── cosmos_get_track_list_metadata_request.proto │ ├── cosmos_get_track_list_request.proto │ ├── cosmos_get_unplayed_episodes_request.proto │ ├── cuepoints.proto │ ├── decorate_request.proto │ ├── devices.proto │ ├── display_segments.proto │ ├── display_segments_extension.proto │ ├── entity_extension_data.proto │ ├── es_add_to_queue_request.proto │ ├── es_command_options.proto │ ├── es_context.proto │ ├── es_context_page.proto │ ├── es_context_player_error.proto │ ├── es_context_player_options.proto │ ├── es_context_player_state.proto │ ├── es_context_track.proto │ ├── es_delete_session.proto │ ├── es_get_error_request.proto │ ├── es_get_play_history.proto │ ├── es_get_position_state.proto │ ├── es_get_queue_request.proto │ ├── es_get_state_request.proto │ ├── es_ident.proto │ ├── es_ident_filter.proto │ ├── es_logging_params.proto │ ├── es_optional.proto │ ├── es_pause.proto │ ├── es_pauseresume_origin.proto │ ├── es_play.proto │ ├── es_play_options.proto │ ├── es_play_origin.proto │ ├── es_prefs.proto │ ├── es_prepare_play.proto │ ├── es_prepare_play_options.proto │ ├── es_provided_track.proto │ ├── es_pushed_message.proto │ ├── es_queue.proto │ ├── es_remote_config.proto │ ├── es_request_info.proto │ ├── es_response_with_reasons.proto │ ├── es_restrictions.proto │ ├── es_resume.proto │ ├── es_seek_to.proto │ ├── es_session_response.proto │ ├── es_set_options.proto │ ├── es_set_queue_request.proto │ ├── es_set_repeating_context.proto │ ├── es_set_repeating_track.proto │ ├── es_set_shuffling_context.proto │ ├── es_skip_next.proto │ ├── es_skip_prev.proto │ ├── es_skip_to_track.proto │ ├── es_stop.proto │ ├── es_storage.proto │ ├── es_update.proto │ ├── esperanto_options.proto │ ├── event_entity.proto │ ├── explicit_content_pubsub.proto │ ├── extended_metadata.proto │ ├── extension_descriptor_type.proto │ ├── extension_kind.proto │ ├── extracted_colors.proto │ ├── follow_request.proto │ ├── followed_users_request.proto │ ├── frecency.proto │ ├── frecency_storage.proto │ ├── gabito.proto │ ├── global_node.proto │ ├── google │ │ └── protobuf │ │ │ ├── any.proto │ │ │ ├── descriptor.proto │ │ │ ├── duration.proto │ │ │ ├── empty.proto │ │ │ ├── field_mask.proto │ │ │ ├── source_context.proto │ │ │ ├── timestamp.proto │ │ │ ├── type.proto │ │ │ └── wrappers.proto │ ├── greenroom_extension.proto │ ├── identity.proto │ ├── image-resolve.proto │ ├── installation_data.proto │ ├── instrumentation_params.proto │ ├── keyexchange.proto │ ├── lens-model.proto │ ├── lfs_secret_provider.proto │ ├── liked_songs_tags_sync_state.proto │ ├── listen_later_cosmos_response.proto │ ├── local_bans_storage.proto │ ├── local_sync_cosmos.proto │ ├── local_sync_state.proto │ ├── logging_params.proto │ ├── mdata.proto │ ├── mdata_cosmos.proto │ ├── mdata_storage.proto │ ├── media.proto │ ├── media_format.proto │ ├── media_manifest.proto │ ├── media_type.proto │ ├── media_type_node.proto │ ├── members_request.proto │ ├── members_response.proto │ ├── mercury.proto │ ├── messages │ │ └── discovery │ │ │ ├── force_discover.proto │ │ │ └── start_discovery.proto │ ├── metadata.proto │ ├── metadata │ │ ├── album_metadata.proto │ │ ├── artist_metadata.proto │ │ ├── episode_metadata.proto │ │ ├── extension.proto │ │ ├── image_group.proto │ │ ├── show_metadata.proto │ │ └── track_metadata.proto │ ├── metadata_cosmos.proto │ ├── metadata_esperanto.proto │ ├── mod.rs │ ├── modification_request.proto │ ├── net-fortune.proto │ ├── offline.proto │ ├── offline_playlists_containing.proto │ ├── on_demand_in_free_reason.proto │ ├── on_demand_set_cosmos_request.proto │ ├── on_demand_set_cosmos_response.proto │ ├── on_demand_set_response.proto │ ├── pause_resume_origin.proto │ ├── pending_event_entity.proto │ ├── perf_metrics_service.proto │ ├── pin_request.proto │ ├── play_history.proto │ ├── play_origin.proto │ ├── play_queue_node.proto │ ├── play_reason.proto │ ├── playback.proto │ ├── playback_cosmos.proto │ ├── playback_esperanto.proto │ ├── playback_platform.proto │ ├── playback_segments.proto │ ├── playback_stack.proto │ ├── playback_stack_v2.proto │ ├── playback_state.proto │ ├── played_state.proto │ ├── played_state │ │ ├── episode_played_state.proto │ │ ├── playability_restriction.proto │ │ ├── show_played_state.proto │ │ └── track_played_state.proto │ ├── playedstate.proto │ ├── player.proto │ ├── player_license.proto │ ├── player_model.proto │ ├── playlist4_external.proto │ ├── playlist_annotate3.proto │ ├── playlist_contains_request.proto │ ├── playlist_folder_state.proto │ ├── playlist_get_request.proto │ ├── playlist_members_request.proto │ ├── playlist_modification_request.proto │ ├── playlist_offline_request.proto │ ├── playlist_permission.proto │ ├── playlist_play_request.proto │ ├── playlist_playback_request.proto │ ├── playlist_playlist_state.proto │ ├── playlist_query.proto │ ├── playlist_request.proto │ ├── playlist_set_base_permission_request.proto │ ├── playlist_set_member_permission_request.proto │ ├── playlist_set_permission_request.proto │ ├── playlist_track_state.proto │ ├── playlist_user_state.proto │ ├── plugin.proto │ ├── podcast_ad_segments.proto │ ├── podcast_cta_cards.proto │ ├── podcast_paywalls_cosmos.proto │ ├── podcast_poll.proto │ ├── podcast_qna.proto │ ├── podcast_ratings.proto │ ├── podcast_segments.proto │ ├── podcast_segments_cosmos_request.proto │ ├── podcast_segments_cosmos_response.proto │ ├── podcast_subscription.proto │ ├── podcast_virality.proto │ ├── podcastextensions.proto │ ├── policy │ │ ├── album_decoration_policy.proto │ │ ├── artist_decoration_policy.proto │ │ ├── episode_decoration_policy.proto │ │ ├── folder_decoration_policy.proto │ │ ├── playlist_album_decoration_policy.proto │ │ ├── playlist_decoration_policy.proto │ │ ├── playlist_episode_decoration_policy.proto │ │ ├── playlist_request_decoration_policy.proto │ │ ├── playlist_track_decoration_policy.proto │ │ ├── rootlist_folder_decoration_policy.proto │ │ ├── rootlist_playlist_decoration_policy.proto │ │ ├── rootlist_request_decoration_policy.proto │ │ ├── show_decoration_policy.proto │ │ ├── supported_link_types_in_playlists.proto │ │ ├── track_decoration_policy.proto │ │ └── user_decoration_policy.proto │ ├── popcount2_external.proto │ ├── prepare_play_options.proto │ ├── profile_cosmos.proto │ ├── profile_service.proto │ ├── property_definition.proto │ ├── protobuf_delta.proto │ ├── pubsub.proto │ ├── queue.proto │ ├── rate_limited_events.proto │ ├── rcs.proto │ ├── recently_played.proto │ ├── recently_played_backend.proto │ ├── record_id.proto │ ├── remote.proto │ ├── repeating_track_node.proto │ ├── request_failure.proto │ ├── resolve.proto │ ├── resource_type.proto │ ├── response_status.proto │ ├── restrictions.proto │ ├── resume_points_node.proto │ ├── rootlist_request.proto │ ├── seek_to_position.proto │ ├── sequence_number_entity.proto │ ├── session.proto │ ├── set_member_permission_request.proto │ ├── show_access.proto │ ├── show_episode_state.proto │ ├── show_offline_state.proto │ ├── show_request.proto │ ├── show_show_state.proto │ ├── signal-model.proto │ ├── skip_to_track.proto │ ├── social_connect_v2.proto │ ├── social_service.proto │ ├── socialgraph_response_status.proto │ ├── socialgraphv2.proto │ ├── spirc.proto │ ├── spotify │ │ ├── audiobookcashier │ │ │ └── v1 │ │ │ │ └── audiobook_price.proto │ │ ├── clienttoken │ │ │ └── v0 │ │ │ │ └── clienttoken_http.proto │ │ └── login5 │ │ │ └── v3 │ │ │ ├── challenges │ │ │ ├── code.proto │ │ │ └── hashcash.proto │ │ │ ├── client_info.proto │ │ │ ├── credentials │ │ │ └── credentials.proto │ │ │ ├── identifiers │ │ │ └── identifiers.proto │ │ │ ├── login5.proto │ │ │ └── user_info.proto │ ├── state_restore │ │ ├── ads_rules_inject_tracks.proto │ │ ├── automix_rules.proto │ │ ├── automix_talk_rules.proto │ │ ├── behavior_metadata_rules.proto │ │ ├── circuit_breaker_rules.proto │ │ ├── context_loader.proto │ │ ├── context_player_restorable.proto │ │ ├── context_player_rules.proto │ │ ├── context_player_rules_base.proto │ │ ├── context_player_state.proto │ │ ├── explicit_content_rules.proto │ │ ├── explicit_request_rules.proto │ │ ├── kitteh_box_rules.proto │ │ ├── mft_context_history.proto │ │ ├── mft_context_switch_rules.proto │ │ ├── mft_fallback_page_history.proto │ │ ├── mft_rules.proto │ │ ├── mft_rules_core.proto │ │ ├── mft_rules_inject_filler_tracks.proto │ │ ├── mft_state.proto │ │ ├── mod_interruption_state.proto │ │ ├── mod_rules_interruptions.proto │ │ ├── music_injection_rules.proto │ │ ├── playback_state.proto │ │ ├── player_model.proto │ │ ├── player_session.proto │ │ ├── player_session_fake.proto │ │ ├── player_session_queue.proto │ │ ├── provided_track.proto │ │ ├── random_source.proto │ │ ├── remove_banned_tracks_rules.proto │ │ ├── resume_points_rules.proto │ │ └── track_error_rules.proto │ ├── status.proto │ ├── status_code.proto │ ├── status_response.proto │ ├── storage-resolve.proto │ ├── storage_cosmos.proto │ ├── storylines.proto │ ├── stream_end_request.proto │ ├── stream_handle.proto │ ├── stream_progress_request.proto │ ├── stream_seek_request.proto │ ├── stream_start_request.proto │ ├── stream_start_response.proto │ ├── streaming_rule.proto │ ├── suppressions.proto │ ├── sync │ │ ├── album_sync_state.proto │ │ ├── artist_sync_state.proto │ │ ├── episode_sync_state.proto │ │ └── track_sync_state.proto │ ├── sync_request.proto │ ├── techu_core_exercise_cosmos.proto │ ├── track_instance.proto │ ├── track_instantiator.proto │ ├── transcripts.proto │ ├── transfer_node.proto │ ├── transfer_state.proto │ ├── tts-resolve.proto │ ├── ucs.proto │ ├── unfinished_episodes_request.proto │ ├── user_attributes.proto │ ├── useraccount.proto │ ├── your_library_config.proto │ ├── your_library_contains_request.proto │ ├── your_library_contains_response.proto │ ├── your_library_decorate_request.proto │ ├── your_library_decorate_response.proto │ ├── your_library_decorated_entity.proto │ ├── your_library_entity.proto │ ├── your_library_index.proto │ ├── your_library_pseudo_playlist_config.proto │ ├── your_library_request.proto │ └── your_library_response.proto └── src │ ├── impl_trait.rs │ ├── impl_trait │ ├── context.rs │ └── player.rs │ └── lib.rs ├── publish.sh ├── rustfmt.toml ├── src ├── lib.rs ├── main.rs └── player_event_handler.rs └── test.sh /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Librespot Devcontainer", 3 | "dockerFile": "Dockerfile.alpine", 4 | // Use 'postCreateCommand' to run commands after the container is created. 5 | //"postCreateCommand": "", 6 | "customizations": { 7 | // Configure properties specific to VS Code. 8 | "vscode": { 9 | "settings": { 10 | "dev.containers.copyGitConfig": true 11 | }, 12 | "extensions": [ 13 | "eamodio.gitlens", 14 | "github.vscode-github-actions", 15 | "rust-lang.rust-analyzer" 16 | ] 17 | } 18 | }, 19 | "containerEnv": { 20 | "GIT_EDITOR": "nano" 21 | } 22 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 23 | // "remoteUser": "root" 24 | } 25 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | cache 3 | protocol/target 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | day: saturday 8 | time: "10:00" 9 | open-pull-requests-limit: 10 10 | target-branch: dev 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .cargo 3 | spotify_appkey.key 4 | .vagrant/ 5 | .project 6 | .history 7 | .cache 8 | *.save 9 | *.*~ 10 | -------------------------------------------------------------------------------- /audio/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "librespot-audio" 3 | version = "0.6.0-dev" 4 | rust-version.workspace = true 5 | authors = ["Paul Lietar "] 6 | description = "The audio fetching logic for librespot" 7 | license = "MIT" 8 | repository = "https://github.com/librespot-org/librespot" 9 | edition = "2021" 10 | 11 | [dependencies.librespot-core] 12 | path = "../core" 13 | version = "0.6.0-dev" 14 | 15 | [dependencies] 16 | aes = "0.8" 17 | bytes = "1" 18 | ctr = "0.9" 19 | futures-util = "0.3" 20 | hyper = { version = "1.3", features = [] } 21 | hyper-util = { version = "0.1", features = ["client"] } 22 | http-body-util = "0.1.1" 23 | log = "0.4" 24 | parking_lot = { version = "0.12", features = ["deadlock_detection"] } 25 | tempfile = "3" 26 | thiserror = "2.0" 27 | tokio = { version = "1", features = ["macros", "parking_lot", "sync"] } 28 | -------------------------------------------------------------------------------- /audio/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate log; 3 | 4 | mod decrypt; 5 | mod fetch; 6 | 7 | mod range_set; 8 | 9 | pub use decrypt::AudioDecrypt; 10 | pub use fetch::{AudioFetchParams, AudioFile, AudioFileError, StreamLoaderController}; 11 | -------------------------------------------------------------------------------- /cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /connect/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![warn(missing_docs)] 2 | #![doc=include_str!("../README.md")] 3 | 4 | #[macro_use] 5 | extern crate log; 6 | 7 | use librespot_core as core; 8 | use librespot_playback as playback; 9 | use librespot_protocol as protocol; 10 | 11 | mod context_resolver; 12 | mod model; 13 | mod shuffle_vec; 14 | mod spirc; 15 | mod state; 16 | 17 | pub use model::*; 18 | pub use spirc::*; 19 | pub use state::*; 20 | -------------------------------------------------------------------------------- /contrib/cross-compile-armv6hf/docker-build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eux 3 | 4 | cargo install --force --locked bindgen-cli 5 | 6 | PI1_TOOLS_DIR=/pi/tools/arm-bcm2708/arm-linux-gnueabihf 7 | PI1_TOOLS_SYSROOT_DIR=$PI1_TOOLS_DIR/arm-linux-gnueabihf/sysroot 8 | 9 | PI1_LIB_DIRS=( 10 | "$PI1_TOOLS_SYSROOT_DIR/lib" 11 | "$PI1_TOOLS_SYSROOT_DIR/usr/lib" 12 | "/sysroot/usr/lib/arm-linux-gnueabihf" 13 | ) 14 | export RUSTFLAGS="-C linker=$PI1_TOOLS_DIR/bin/arm-linux-gnueabihf-gcc ${PI1_LIB_DIRS[*]/#/-L}" 15 | export BINDGEN_EXTRA_CLANG_ARGS=--sysroot=$PI1_TOOLS_SYSROOT_DIR 16 | 17 | cargo build --release --target arm-unknown-linux-gnueabihf --no-default-features --features "alsa-backend with-libmdns" 18 | -------------------------------------------------------------------------------- /contrib/docker-build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eux 3 | 4 | cargo build --release --no-default-features --features "alsa-backend with-libmdns" 5 | cargo build --release --target aarch64-unknown-linux-gnu --no-default-features --features "alsa-backend with-libmdns" 6 | cargo build --release --target arm-unknown-linux-gnueabihf --no-default-features --features "alsa-backend with-libmdns" 7 | cargo build --release --target arm-unknown-linux-gnueabi --no-default-features --features "alsa-backend with-libmdns" 8 | -------------------------------------------------------------------------------- /contrib/librespot.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Librespot (an open source Spotify client) 3 | Documentation=https://github.com/librespot-org/librespot 4 | Documentation=https://github.com/librespot-org/librespot/wiki/Options 5 | Wants=network.target sound.target 6 | After=network.target sound.target 7 | 8 | [Service] 9 | DynamicUser=yes 10 | SupplementaryGroups=audio 11 | Restart=always 12 | RestartSec=10 13 | ExecStart=/usr/bin/librespot --name "%p@%H" 14 | 15 | [Install] 16 | WantedBy=multi-user.target 17 | -------------------------------------------------------------------------------- /contrib/librespot.user.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Librespot (an open source Spotify client) 3 | Documentation=https://github.com/librespot-org/librespot 4 | Documentation=https://github.com/librespot-org/librespot/wiki/Options 5 | Wants=network.target sound.target 6 | After=network.target sound.target 7 | 8 | [Service] 9 | Restart=always 10 | RestartSec=10 11 | ExecStart=/usr/bin/librespot --name "%u@%H" 12 | 13 | [Install] 14 | WantedBy=default.target 15 | -------------------------------------------------------------------------------- /core/tests/connect.rs: -------------------------------------------------------------------------------- 1 | use std::time::Duration; 2 | 3 | use tokio::time::timeout; 4 | 5 | use librespot_core::{authentication::Credentials, config::SessionConfig, session::Session}; 6 | 7 | #[tokio::test] 8 | async fn test_connection() { 9 | timeout(Duration::from_secs(30), async { 10 | let result = Session::new(SessionConfig::default(), None) 11 | .connect(Credentials::with_password("test", "test"), false) 12 | .await; 13 | 14 | match result { 15 | Ok(_) => panic!("Authentication succeeded despite of bad credentials."), 16 | Err(e) => assert!(!e.to_string().is_empty()), // there should be some error message 17 | } 18 | }) 19 | .await 20 | .unwrap(); 21 | } 22 | -------------------------------------------------------------------------------- /discovery/examples/discovery.rs: -------------------------------------------------------------------------------- 1 | use futures::StreamExt; 2 | use librespot_core::SessionConfig; 3 | use librespot_discovery::DeviceType; 4 | use sha1::{Digest, Sha1}; 5 | 6 | #[tokio::main(flavor = "current_thread")] 7 | async fn main() { 8 | let name = "Librespot"; 9 | let device_id = hex::encode(Sha1::digest(name.as_bytes())); 10 | 11 | let mut server = 12 | librespot_discovery::Discovery::builder(device_id, SessionConfig::default().client_id) 13 | .name(name) 14 | .device_type(DeviceType::Computer) 15 | .launch() 16 | .unwrap(); 17 | 18 | while let Some(x) = server.next().await { 19 | println!("Received {:?}", x); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /discovery/examples/discovery_group.rs: -------------------------------------------------------------------------------- 1 | use futures::StreamExt; 2 | use librespot_core::SessionConfig; 3 | use librespot_discovery::DeviceType; 4 | use sha1::{Digest, Sha1}; 5 | 6 | #[tokio::main(flavor = "current_thread")] 7 | async fn main() { 8 | let name = "Librespot Group"; 9 | let device_id = hex::encode(Sha1::digest(name.as_bytes())); 10 | 11 | let mut server = 12 | librespot_discovery::Discovery::builder(device_id, SessionConfig::default().client_id) 13 | .name(name) 14 | .device_type(DeviceType::Speaker) 15 | .is_group(true) 16 | .launch() 17 | .unwrap(); 18 | 19 | while let Some(x) = server.next().await { 20 | println!("Received {:?}", x); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /metadata/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "librespot-metadata" 3 | version = "0.6.0-dev" 4 | rust-version.workspace = true 5 | authors = ["Paul Lietar "] 6 | description = "The metadata logic for librespot" 7 | license = "MIT" 8 | repository = "https://github.com/librespot-org/librespot" 9 | edition = "2021" 10 | 11 | [dependencies] 12 | async-trait = "0.1" 13 | bytes = "1" 14 | log = "0.4" 15 | protobuf = "3.5" 16 | thiserror = "2.0" 17 | uuid = { version = "1", default-features = false } 18 | serde = { version = "1.0", features = ["derive"] } 19 | serde_json = "1.0" 20 | 21 | [dependencies.librespot-core] 22 | path = "../core" 23 | version = "0.6.0-dev" 24 | 25 | [dependencies.librespot-protocol] 26 | path = "../protocol" 27 | version = "0.6.0-dev" 28 | -------------------------------------------------------------------------------- /metadata/src/audio/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod file; 2 | pub mod item; 3 | 4 | pub use file::{AudioFileFormat, AudioFiles}; 5 | pub use item::{AudioItem, UniqueFields}; 6 | -------------------------------------------------------------------------------- /metadata/src/error.rs: -------------------------------------------------------------------------------- 1 | use std::fmt::Debug; 2 | use thiserror::Error; 3 | 4 | #[derive(Debug, Error)] 5 | pub enum MetadataError { 6 | #[error("empty response")] 7 | Empty, 8 | #[error("audio item is non-playable when it should be")] 9 | NonPlayable, 10 | #[error("audio item duration can not be: {0}")] 11 | InvalidDuration(i32), 12 | #[error("track is marked as explicit, which client setting forbids")] 13 | ExplicitContentFiltered, 14 | } 15 | -------------------------------------------------------------------------------- /metadata/src/playlist/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod annotation; 2 | pub mod attribute; 3 | pub mod diff; 4 | pub mod item; 5 | pub mod list; 6 | pub mod operation; 7 | pub mod permission; 8 | 9 | pub use annotation::PlaylistAnnotation; 10 | pub use list::Playlist; 11 | -------------------------------------------------------------------------------- /metadata/src/video.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | fmt::Debug, 3 | ops::{Deref, DerefMut}, 4 | }; 5 | 6 | use crate::util::{impl_deref_wrapped, impl_from_repeated}; 7 | 8 | use librespot_core::FileId; 9 | 10 | use librespot_protocol as protocol; 11 | use protocol::metadata::VideoFile as VideoFileMessage; 12 | 13 | #[derive(Debug, Clone, Default)] 14 | pub struct VideoFiles(pub Vec); 15 | 16 | impl_deref_wrapped!(VideoFiles, Vec); 17 | 18 | impl_from_repeated!(VideoFileMessage, VideoFiles); 19 | -------------------------------------------------------------------------------- /oauth/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "librespot-oauth" 3 | version = "0.6.0-dev" 4 | rust-version.workspace = true 5 | authors = ["Nick Steel "] 6 | description = "OAuth authorization code flow with PKCE for obtaining a Spotify access token" 7 | license = "MIT" 8 | repository = "https://github.com/librespot-org/librespot" 9 | edition = "2021" 10 | 11 | [dependencies] 12 | log = "0.4" 13 | oauth2 = "4.4" 14 | open = "5.3" 15 | thiserror = "2.0" 16 | url = "2.2" 17 | 18 | [dev-dependencies] 19 | env_logger = { version = "0.11.2", default-features = false, features = ["color", "humantime", "auto-color"] } 20 | tokio = { version = "1.43.0", features = ["rt-multi-thread", "macros"] } 21 | -------------------------------------------------------------------------------- /playback/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate log; 3 | 4 | use librespot_audio as audio; 5 | use librespot_core as core; 6 | use librespot_metadata as metadata; 7 | 8 | pub mod audio_backend; 9 | pub mod config; 10 | pub mod convert; 11 | pub mod decoder; 12 | pub mod dither; 13 | pub mod mixer; 14 | pub mod player; 15 | 16 | pub const SAMPLE_RATE: u32 = 44100; 17 | pub const NUM_CHANNELS: u8 = 2; 18 | pub const SAMPLES_PER_SECOND: u32 = SAMPLE_RATE * NUM_CHANNELS as u32; 19 | pub const PAGES_PER_MS: f64 = SAMPLE_RATE as f64 / 1000.0; 20 | pub const MS_PER_PAGE: f64 = 1000.0 / SAMPLE_RATE as f64; 21 | -------------------------------------------------------------------------------- /protocol/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "librespot-protocol" 3 | version = "0.6.0-dev" 4 | rust-version.workspace = true 5 | authors = ["Paul Liétar "] 6 | build = "build.rs" 7 | description = "The protobuf logic for communicating with Spotify servers" 8 | license = "MIT" 9 | repository = "https://github.com/librespot-org/librespot" 10 | edition = "2021" 11 | 12 | [dependencies] 13 | protobuf = "3.5" 14 | 15 | [build-dependencies] 16 | protobuf-codegen = "3" 17 | -------------------------------------------------------------------------------- /protocol/proto/AdContext.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AdContext { 10 | optional string preceding_content_uri = 1; 11 | optional string preceding_playback_id = 2; 12 | optional int32 preceding_end_position = 3; 13 | repeated string ad_ids = 4; 14 | optional string ad_request_id = 5; 15 | optional string succeeding_content_uri = 6; 16 | optional string succeeding_playback_id = 7; 17 | optional int32 succeeding_start_position = 8; 18 | optional int32 preceding_duration = 9; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/AdDecisionEvent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AdDecisionEvent { 10 | optional string request_id = 1; 11 | optional string decision_request_id = 2; 12 | optional string decision_type = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/AdError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AdError { 10 | optional string request_type = 1; 11 | optional string error_message = 2; 12 | optional int64 http_error_code = 3; 13 | optional string request_url = 4; 14 | optional string tracking_event = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/AdRequestEvent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AdRequestEvent { 10 | optional string feature_identifier = 1; 11 | optional string requested_ad_type = 2; 12 | optional int64 latency_ms = 3; 13 | repeated string requested_ad_types = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/AdSlotEvent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AdSlotEvent { 10 | optional string event = 1; 11 | optional string ad_id = 2; 12 | optional string lineitem_id = 3; 13 | optional string creative_id = 4; 14 | optional string slot = 5; 15 | optional string format = 6; 16 | optional bool in_focus = 7; 17 | optional string app_startup_id = 8; 18 | optional string request_id = 9; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/AmazonWakeUpTime.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AmazonWakeUpTime { 10 | optional int64 delay_to_online = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/AudioDriverError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AudioDriverError { 10 | optional int64 error_code = 1; 11 | optional string location = 2; 12 | optional string driver_name = 3; 13 | optional string additional_data = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/AudioDriverInfo.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AudioDriverInfo { 10 | optional string driver_name = 1; 11 | optional string output_device_name = 2; 12 | optional string output_device_category = 3; 13 | optional string reason = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/AudioFileSelection.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AudioFileSelection { 10 | optional bytes playback_id = 1; 11 | optional string strategy_name = 2; 12 | optional int64 bitrate = 3; 13 | optional bytes predict_id = 4; 14 | optional string file_origin = 5; 15 | optional int32 target_bitrate = 6; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/AudioOffliningSettingsReport.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AudioOffliningSettingsReport { 10 | optional string default_sync_bitrate_product_state = 1; 11 | optional int64 user_selected_sync_bitrate = 2; 12 | optional int64 sync_bitrate = 3; 13 | optional bool sync_over_cellular = 4; 14 | optional string primary_resource_type = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/AudioRateLimit.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AudioRateLimit { 10 | optional string driver_name = 1; 11 | optional string output_device_name = 2; 12 | optional string output_device_category = 3; 13 | optional int64 max_size = 4; 14 | optional int64 refill_per_milliseconds = 5; 15 | optional int64 frames_requested = 6; 16 | optional int64 frames_acquired = 7; 17 | optional bytes playback_id = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/AudioSessionEvent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AudioSessionEvent { 10 | optional string event = 1; 11 | optional string context = 2; 12 | optional string json_data = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/AudioStreamingSettingsReport.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AudioStreamingSettingsReport { 10 | optional string default_play_bitrate_product_state = 1; 11 | optional int64 user_selected_play_bitrate_cellular = 2; 12 | optional int64 user_selected_play_bitrate_wifi = 3; 13 | optional int64 play_bitrate_cellular = 4; 14 | optional int64 play_bitrate_wifi = 5; 15 | optional bool allow_downgrade = 6; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/BoomboxPlaybackInstrumentation.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message BoomboxPlaybackInstrumentation { 10 | optional bytes playback_id = 1; 11 | optional bool was_playback_paused = 2; 12 | repeated string dimensions = 3; 13 | map total_buffer_size = 4; 14 | map number_of_calls = 5; 15 | map total_duration = 6; 16 | map first_call_time = 7; 17 | map last_call_time = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/BrokenObject.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message BrokenObject { 10 | optional string type = 1; 11 | optional string id = 2; 12 | optional int64 error_code = 3; 13 | optional bytes playback_id = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/CacheError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message CacheError { 10 | optional int64 error_code = 1; 11 | optional int64 os_error_code = 2; 12 | optional string realm = 3; 13 | optional bytes file_id = 4; 14 | optional int64 num_errors = 5; 15 | optional string cache_path = 6; 16 | optional int64 size = 7; 17 | optional int64 range_start = 8; 18 | optional int64 range_end = 9; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/CacheRealmReport.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message CacheRealmReport { 10 | optional bytes cache_id = 1; 11 | optional int64 realm_id = 2; 12 | optional int64 num_entries = 3; 13 | optional int64 num_locked_entries = 4; 14 | optional int64 num_locked_entries_current_user = 5; 15 | optional int64 num_full_entries = 6; 16 | optional int64 size_kb = 7; 17 | optional int64 locked_size_kb = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/ClientLocale.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ClientLocale { 10 | optional string client_default_locale = 1; 11 | optional string user_specified_locale = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/ColdStartupSequence.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ColdStartupSequence { 10 | optional string terminal_state = 1; 11 | map steps = 2; 12 | map metadata = 3; 13 | optional string connection_type = 4; 14 | optional string initial_application_state = 5; 15 | optional string terminal_application_state = 6; 16 | optional string view_load_sequence_id = 7; 17 | optional int32 device_year_class = 8; 18 | map subdurations = 9; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/CollectionLevelDbInfo.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message CollectionLevelDbInfo { 10 | optional string bucket = 1; 11 | optional bool use_leveldb = 2; 12 | optional bool migration_from_file_ok = 3; 13 | optional bool index_check_ok = 4; 14 | optional bool leveldb_works = 5; 15 | optional bool already_migrated = 6; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/CollectionOfflineControllerEmptyTrackList.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message CollectionOfflineControllerEmptyTrackList { 10 | optional string link_type = 1; 11 | optional bool consistent_with_collection = 2; 12 | optional int64 collection_size = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/ConfigurationApplied.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConfigurationApplied { 10 | optional int64 last_rcs_fetch_time = 1; 11 | optional string installation_id = 2; 12 | repeated int32 policy_group_ids = 3; 13 | optional string configuration_assignment_id = 4; 14 | optional string rc_client_id = 5; 15 | optional string rc_client_version = 6; 16 | optional string platform = 7; 17 | optional string fetch_type = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/ConnectCredentialsRequest.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConnectCredentialsRequest { 10 | optional string token_type = 1; 11 | optional string client_id = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/ConnectDialError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConnectDialError { 10 | optional string type = 1; 11 | optional string request = 2; 12 | optional string response = 3; 13 | optional int64 error = 4; 14 | optional string context = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/ConnectMdnsPacketParseError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConnectMdnsPacketParseError { 10 | optional string type = 1; 11 | optional string buffer = 2; 12 | optional string ttl = 3; 13 | optional string txt = 4; 14 | optional string host = 5; 15 | optional string discovery_name = 6; 16 | optional string context = 7; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/ConnectPullFailure.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConnectPullFailure { 10 | optional bytes transfer_data = 1; 11 | optional int64 error_code = 2; 12 | map reasons = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/ConnectionError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConnectionError { 10 | optional int64 error_code = 1; 11 | optional string ap = 2; 12 | optional string proxy = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/ConnectionInfo.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConnectionInfo { 10 | optional string ap = 1; 11 | optional string proxy = 2; 12 | optional bool user_initated_login = 3; 13 | optional string reachability_type = 4; 14 | optional string web_installer_unique_id = 5; 15 | optional string ap_resolve_source = 6; 16 | optional string address_type = 7; 17 | optional bool ipv6_failed = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/ConnectionStateChange.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConnectionStateChange { 10 | optional string type = 1; 11 | optional string old = 2; 12 | optional string new = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/DefaultConfigurationApplied.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DefaultConfigurationApplied { 10 | optional string installation_id = 1; 11 | optional string configuration_assignment_id = 2; 12 | optional string rc_client_id = 3; 13 | optional string rc_client_version = 4; 14 | optional string platform = 5; 15 | optional string fetch_type = 6; 16 | optional string reason = 7; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/DesktopAuthenticationFailureNonAuth.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopAuthenticationFailureNonAuth { 10 | optional string action_hash = 1; 11 | optional string error_category = 2; 12 | optional int32 error_code = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/DesktopAuthenticationSuccess.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopAuthenticationSuccess { 10 | optional string action_hash = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/DesktopGPUAccelerationInfo.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopGPUAccelerationInfo { 10 | optional bool is_enabled = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/DesktopHighMemoryUsage.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopHighMemoryUsage { 10 | optional bool is_continuation_event = 1; 11 | optional double sample_time_interval_seconds = 2; 12 | optional int64 win_committed_bytes = 3; 13 | optional int64 win_peak_committed_bytes = 4; 14 | optional int64 win_working_set_bytes = 5; 15 | optional int64 win_peak_working_set_bytes = 6; 16 | optional int64 mac_virtual_size_bytes = 7; 17 | optional int64 mac_resident_size_bytes = 8; 18 | optional int64 mac_footprint_bytes = 9; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/DesktopUpdateDownloadComplete.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopUpdateDownloadComplete { 10 | optional int64 revision = 1; 11 | optional bool is_critical = 2; 12 | optional string source = 3; 13 | optional bool is_successful = 4; 14 | optional bool is_employee = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/DesktopUpdateDownloadError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopUpdateDownloadError { 10 | optional int64 revision = 1; 11 | optional bool is_critical = 2; 12 | optional string error_message = 3; 13 | optional string source = 4; 14 | optional bool is_employee = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/DesktopUpdateMessageAction.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopUpdateMessageAction { 10 | optional bool will_download = 1; 11 | optional int64 this_message_from_revision = 2; 12 | optional int64 this_message_to_revision = 3; 13 | optional bool is_critical = 4; 14 | optional int64 already_downloaded_from_revision = 5; 15 | optional int64 already_downloaded_to_revision = 6; 16 | optional string source = 7; 17 | optional bool is_employee = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/DesktopUpdateMessageProcessed.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopUpdateMessageProcessed { 10 | optional bool success = 1; 11 | optional string source = 2; 12 | optional int64 revision = 3; 13 | optional bool is_critical = 4; 14 | optional string binary_hash = 5; 15 | optional bool is_employee = 6; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/DesktopUpdateResponse.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DesktopUpdateResponse { 10 | optional int64 status_code = 1; 11 | optional int64 request_time_ms = 2; 12 | optional int64 payload_size = 3; 13 | optional bool is_employee = 4; 14 | optional string error_message = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/DrmRequestFailure.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DrmRequestFailure { 10 | optional string reason = 1; 11 | optional int64 error_code = 2; 12 | optional bool fatal = 3; 13 | optional bytes playback_id = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/EventSenderInternalErrorNonAuth.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message EventSenderInternalErrorNonAuth { 10 | optional string error_message = 1; 11 | optional string error_type = 2; 12 | optional string error_context = 3; 13 | optional int32 error_code = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/EventSenderStats.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message EventSenderStats { 10 | map storage_size = 1; 11 | map sequence_number_min = 2; 12 | map sequence_number_next = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/ExternalDeviceInfo.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ExternalDeviceInfo { 10 | optional string type = 1; 11 | optional string subtype = 2; 12 | optional string reason = 3; 13 | optional bool taken_over = 4; 14 | optional int64 num_tracks = 5; 15 | optional int64 num_purchased_tracks = 6; 16 | optional int64 num_playlists = 7; 17 | optional string error = 8; 18 | optional bool full = 9; 19 | optional bool sync_all = 10; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/GetInfoFailures.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message GetInfoFailures { 10 | optional string device_id = 1; 11 | optional int64 error_code = 2; 12 | optional string request = 3; 13 | optional string response_body = 4; 14 | optional string context = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/LocalFileSyncError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message LocalFileSyncError { 10 | optional string error = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/LocalFilesError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message LocalFilesError { 10 | optional int64 error_code = 1; 11 | optional string context = 2; 12 | optional string info = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/LocalFilesImport.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message LocalFilesImport { 10 | optional int64 tracks = 1; 11 | optional int64 duplicate_tracks = 2; 12 | optional int64 failed_tracks = 3; 13 | optional int64 matched_tracks = 4; 14 | optional string source = 5; 15 | optional int64 invalid_tracks = 6; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/LocalFilesReport.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message LocalFilesReport { 10 | optional int64 total_tracks = 1; 11 | optional int64 total_size = 2; 12 | optional int64 owned_tracks = 3; 13 | optional int64 owned_size = 4; 14 | optional int64 tracks_not_found = 5; 15 | optional int64 tracks_bad_format = 6; 16 | optional int64 tracks_drm_protected = 7; 17 | optional int64 tracks_unknown_pruned = 8; 18 | optional int64 tracks_reallocated_repaired = 9; 19 | optional int64 enabled_sources = 10; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/LocalFilesSourceReport.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message LocalFilesSourceReport { 10 | optional string id = 1; 11 | optional int64 tracks = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/MdnsLoginFailures.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message MdnsLoginFailures { 10 | optional string device_id = 1; 11 | optional int64 error_code = 2; 12 | optional string response_body = 3; 13 | optional string request = 4; 14 | optional int64 esdk_internal_error_code = 5; 15 | optional string context = 6; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/MetadataExtensionClientStatistic.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message MetadataExtensionClientStatistic { 10 | optional bytes task_id = 1; 11 | optional string feature_id = 2; 12 | optional bool is_online_param = 3; 13 | optional int32 num_extensions_with_etags = 4; 14 | optional int32 num_extensions_requested = 5; 15 | optional int32 num_extensions_needed = 6; 16 | optional int32 num_uris_requested = 7; 17 | optional int32 num_uris_needed = 8; 18 | optional int32 num_prepared_requests = 9; 19 | optional int32 num_sent_requests = 10; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/Offline2ClientError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Offline2ClientError { 10 | optional string error = 1; 11 | optional string device_id = 2; 12 | optional string cache_id = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/Offline2ClientEvent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Offline2ClientEvent { 10 | optional string event = 1; 11 | optional string device_id = 2; 12 | optional string cache_id = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/OfflineError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message OfflineError { 10 | optional int64 error_code = 1; 11 | optional string track = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/OfflineEvent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message OfflineEvent { 10 | optional string event = 1; 11 | optional string data = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/PlaybackError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlaybackError { 10 | optional bytes file_id = 1; 11 | optional bytes playback_id = 2; 12 | optional string track_id = 3; 13 | optional int64 bitrate = 4; 14 | optional int64 error_code = 5; 15 | optional bool fatal = 6; 16 | optional string audiocodec = 7; 17 | optional bool external_track = 8; 18 | optional int64 position_ms = 9; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/PlaybackRetry.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlaybackRetry { 10 | optional string track = 1; 11 | optional bytes playback_id = 2; 12 | optional string method = 3; 13 | optional string status = 4; 14 | optional string reason = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/PlaybackSegments.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlaybackSegments { 10 | optional bytes playback_id = 1; 11 | optional string track_uri = 2; 12 | optional bool overflow = 3; 13 | optional string segments = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/PlayerStateRestore.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlayerStateRestore { 10 | optional string error = 1; 11 | optional int64 size = 2; 12 | optional string context_uri = 3; 13 | optional string state = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/PlaylistSyncEvent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlaylistSyncEvent { 10 | optional string playlist_id = 1; 11 | optional bool is_playlist = 2; 12 | optional int64 timestamp_ms = 3; 13 | optional int32 error_code = 4; 14 | optional string event_description = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/PodcastAdSegmentReceived.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PodcastAdSegmentReceived { 10 | optional string episode_uri = 1; 11 | optional string playback_id = 2; 12 | optional string slots = 3; 13 | optional bool is_audio = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/Prefetch.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Prefetch { 10 | optional int64 strategies = 1; 11 | optional int64 strategy = 2; 12 | optional bytes file_id = 3; 13 | optional string track = 4; 14 | optional int64 prefetch_index = 5; 15 | optional int64 current_window_size = 6; 16 | optional int64 max_window_size = 7; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/PrefetchError.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PrefetchError { 10 | optional int64 strategy = 1; 11 | optional string description = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/ProductStateUcsVerification.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ProductStateUcsVerification { 10 | map additional_entries = 1; 11 | map missing_entries = 2; 12 | optional string fetch_type = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/PubSubCountPerIdent.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PubSubCountPerIdent { 10 | optional string ident_filter = 1; 11 | optional int32 no_of_messages_received = 2; 12 | optional int32 no_of_failed_conversions = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/ReachabilityChanged.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ReachabilityChanged { 10 | optional string type = 1; 11 | optional string info = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/RejectedClientEventNonAuth.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RejectedClientEventNonAuth { 10 | optional string reject_reason = 1; 11 | optional string event_name = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/RemainingSkips.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RemainingSkips { 10 | optional string interaction_id = 1; 11 | optional int32 remaining_skips_before_skip = 2; 12 | optional int32 remaining_skips_after_skip = 3; 13 | repeated string interaction_ids = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/RequestAccounting.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RequestAccounting { 10 | optional string request = 1; 11 | optional int64 downloaded = 2; 12 | optional int64 uploaded = 3; 13 | optional int64 num_requests = 4; 14 | optional string connection = 5; 15 | optional string source_identifier = 6; 16 | optional string reason = 7; 17 | optional int64 duration_ms = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/RequestTime.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RequestTime { 10 | optional string type = 1; 11 | optional int64 first_byte = 2; 12 | optional int64 last_byte = 3; 13 | optional int64 size = 4; 14 | optional int64 size_sent = 5; 15 | optional bool error = 6; 16 | optional string url = 7; 17 | optional string verb = 8; 18 | optional int64 payload_size_sent = 9; 19 | optional int32 connection_reuse = 10; 20 | optional double sampling_probability = 11; 21 | optional bool cached = 12; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/StartTrack.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message StartTrack { 10 | optional bytes playback_id = 1; 11 | optional string context_player_session_id = 2; 12 | optional int64 timestamp = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/Stutter.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Stutter { 10 | optional bytes file_id = 1; 11 | optional bytes playback_id = 2; 12 | optional string track = 3; 13 | optional int64 buffer_size = 4; 14 | optional int64 max_buffer_size = 5; 15 | optional int64 file_byte_offset = 6; 16 | optional int64 file_byte_total = 7; 17 | optional int64 target_buffer = 8; 18 | optional string audio_driver = 9; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/TierFeatureFlags.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message TierFeatureFlags { 10 | optional bool ads = 1; 11 | optional bool high_quality = 2; 12 | optional bool offline = 3; 13 | optional bool on_demand = 4; 14 | optional string max_album_plays_consecutive = 5; 15 | optional string max_album_plays_per_hour = 6; 16 | optional string max_skips_per_hour = 7; 17 | optional string max_track_plays_per_hour = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/TrackNotPlayed.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message TrackNotPlayed { 10 | optional bytes playback_id = 1; 11 | optional string source_start = 2; 12 | optional string reason_start = 3; 13 | optional string source_end = 4; 14 | optional string reason_end = 5; 15 | optional string play_context = 6; 16 | optional string play_track = 7; 17 | optional string display_track = 8; 18 | optional string provider = 9; 19 | optional string referer = 10; 20 | optional string referrer_version = 11; 21 | optional string referrer_vendor = 12; 22 | optional string gaia_dev_id = 13; 23 | optional string reason_not_played = 14; 24 | } 25 | -------------------------------------------------------------------------------- /protocol/proto/TrackStuck.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message TrackStuck { 10 | optional string track = 1; 11 | optional bytes playback_id = 2; 12 | optional string source_start = 3; 13 | optional string reason_start = 4; 14 | optional bool offline = 5; 15 | optional int64 position = 6; 16 | optional int64 count = 7; 17 | optional string audio_driver = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/WindowSize.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message WindowSize { 10 | optional int64 width = 1; 11 | optional int64 height = 2; 12 | optional int64 mode = 3; 13 | optional int64 duration = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/app_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.offline.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AppStateRequest { 10 | AppState state = 1; 11 | } 12 | 13 | enum AppState { 14 | UNKNOWN = 0; 15 | BACKGROUND = 1; 16 | FOREGROUND = 2; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/audio_files_extension.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.extendedmetadata.audiofiles; 6 | 7 | import "metadata.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.audiophile.proto"; 11 | 12 | message NormalizationParams { 13 | float loudness_db = 1; 14 | float true_peak_db = 2; 15 | } 16 | 17 | message ExtendedAudioFile { 18 | reserved 2; 19 | reserved 3; 20 | metadata.AudioFile file = 1; 21 | int32 average_bitrate = 4; 22 | } 23 | 24 | message AudioFilesExtensionResponse { 25 | repeated ExtendedAudioFile files = 1; 26 | NormalizationParams default_file_normalization_params = 2; 27 | NormalizationParams default_album_normalization_params = 3; 28 | bytes audio_id = 4; 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/autodownload_config_common.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.autodownload_esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "spotify.autodownload.esperanto.proto"; 11 | 12 | message AutoDownloadGlobalConfig { 13 | uint32 number_of_episodes = 1; 14 | } 15 | 16 | message AutoDownloadShowConfig { 17 | string uri = 1; 18 | bool active = 2; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/autodownload_config_get_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.autodownload_esperanto.proto; 6 | 7 | import "autodownload_config_common.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "spotify.autodownload.esperanto.proto"; 13 | 14 | message AutoDownloadGetRequest { 15 | repeated string uri = 1; 16 | } 17 | 18 | message AutoDownloadGetResponse { 19 | AutoDownloadGlobalConfig global = 1; 20 | repeated AutoDownloadShowConfig show = 2; 21 | string error = 99; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/autodownload_config_set_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.autodownload_esperanto.proto; 6 | 7 | import "autodownload_config_common.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "spotify.autodownload.esperanto.proto"; 13 | 14 | message AutoDownloadSetRequest { 15 | oneof config { 16 | AutoDownloadGlobalConfig global = 1; 17 | AutoDownloadShowConfig show = 2; 18 | } 19 | } 20 | 21 | message AutoDownloadSetResponse { 22 | string error = 99; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/autoplay_context_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AutoplayContextRequest { 10 | required string context_uri = 1; 11 | repeated string recent_track_uri = 2; 12 | optional bool is_video = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/autoplay_node.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "logging_params.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message AutoplayNode { 12 | map filler_node = 1; 13 | required bool is_playing_filler = 2; 14 | required LoggingParams logging_params = 3; 15 | optional bool called_play_on_filler = 4; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/canvas.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.context_track_exts.canvas; 6 | 7 | message Artist { 8 | string uri = 1; 9 | string name = 2; 10 | string avatar = 3; 11 | } 12 | 13 | message CanvasRecord { 14 | string id = 1; 15 | string url = 2; 16 | string file_id = 3; 17 | Type type = 4; 18 | string entity_uri = 5; 19 | Artist artist = 6; 20 | bool explicit = 7; 21 | string uploaded_by = 8; 22 | string etag = 9; 23 | string canvas_uri = 11; 24 | string storylines_id = 12; 25 | } 26 | 27 | enum Type { 28 | IMAGE = 0; 29 | VIDEO = 1; 30 | VIDEO_LOOPING = 2; 31 | VIDEO_LOOPING_RANDOM = 3; 32 | GIF = 4; 33 | } 34 | -------------------------------------------------------------------------------- /protocol/proto/canvas_storage.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.canvas.proto.storage; 6 | 7 | import "canvaz.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message CanvasCacheEntry { 12 | string entity_uri = 1; 13 | uint64 expires_on_seconds = 2; 14 | canvaz.cache.EntityCanvazResponse.Canvaz canvas = 3; 15 | } 16 | 17 | message CanvasCacheFile { 18 | repeated CanvasCacheEntry entries = 1; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/canvaz-meta.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.canvaz; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.canvaz.proto"; 10 | 11 | enum Type { 12 | IMAGE = 0; 13 | VIDEO = 1; 14 | VIDEO_LOOPING = 2; 15 | VIDEO_LOOPING_RANDOM = 3; 16 | GIF = 4; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/capping_data.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.capper3; 6 | 7 | option java_multiple_files = true; 8 | option java_package = "com.spotify.capper3.proto"; 9 | 10 | message ConsumeTokensRequest { 11 | uint32 tokens = 1; 12 | } 13 | 14 | message CappingData { 15 | uint32 remaining_tokens = 1; 16 | uint32 capacity = 2; 17 | uint32 seconds_until_next_refill = 3; 18 | uint32 refill_amount = 4; 19 | } 20 | 21 | message ConsumeTokensResponse { 22 | uint32 seconds_until_next_update = 1; 23 | PlayCappingType capping_type = 2; 24 | CappingData capping_data = 3; 25 | } 26 | 27 | enum PlayCappingType { 28 | NONE = 0; 29 | LINEAR = 1; 30 | } 31 | -------------------------------------------------------------------------------- /protocol/proto/claas.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.claas.v1; 6 | 7 | option optimize_for = CODE_SIZE; 8 | option java_package = "com.spotify.claas.v1"; 9 | 10 | service ClaasService { 11 | rpc PostLogs(PostLogsRequest) returns (PostLogsResponse); 12 | rpc Watch(WatchRequest) returns (stream WatchResponse); 13 | } 14 | 15 | message WatchRequest { 16 | string user_id = 1; 17 | } 18 | 19 | message WatchResponse { 20 | repeated string logs = 1; 21 | } 22 | 23 | message PostLogsRequest { 24 | repeated string logs = 1; 25 | } 26 | 27 | message PostLogsResponse { 28 | 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/client-tts.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.narration.proto; 6 | 7 | import "tts-resolve.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | service ClientTtsService { 12 | rpc GetTtsUrl(TtsRequest) returns (TtsResponse); 13 | } 14 | 15 | message TtsRequest { 16 | ResolveRequest.AudioFormat audio_format = 3; 17 | string language = 4; 18 | ResolveRequest.TtsVoice tts_voice = 5; 19 | ResolveRequest.TtsProvider tts_provider = 6; 20 | int32 sample_rate_hz = 7; 21 | oneof prompt { 22 | string text = 1; 23 | string ssml = 2; 24 | } 25 | } 26 | 27 | message TtsResponse { 28 | string url = 1; 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/client_config.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.extendedmetadata.config.v1; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ClientConfig { 10 | uint32 log_sampling_rate = 1; 11 | uint32 avg_log_messages_per_minute = 2; 12 | uint32 log_messages_burst_size = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/clips_cover.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.clips; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_outer_classname = "ClipsCoverProto"; 11 | option java_package = "com.spotify.clips.proto"; 12 | 13 | message ClipsCover { 14 | string image_url = 1; 15 | string video_source_id = 2; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/collection/album_collection_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message AlbumCollectionState { 12 | optional string collection_link = 1; 13 | optional uint32 num_tracks_in_collection = 2; 14 | optional bool complete = 3; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/collection/artist_collection_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message ArtistCollectionState { 12 | optional string collection_link = 1; 13 | optional bool followed = 2; 14 | optional uint32 num_tracks_in_collection = 3; 15 | optional uint32 num_albums_in_collection = 4; 16 | optional bool is_banned = 5; 17 | optional bool can_ban = 6; 18 | optional uint32 num_explicitly_liked_tracks = 7; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/collection/episode_collection_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option objc_class_prefix = "SPTCosmosUtil"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.cosmos.util.proto"; 11 | 12 | message EpisodeCollectionState { 13 | optional bool is_following_show = 1; 14 | optional bool is_new = 2; 15 | optional bool is_in_listen_later = 3; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/collection/show_collection_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message ShowCollectionState { 12 | optional bool is_in_collection = 1; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/collection/track_collection_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message TrackCollectionState { 12 | optional bool is_in_collection = 1; 13 | optional bool can_add_to_collection = 2; 14 | optional bool is_banned = 3; 15 | optional bool can_ban = 4; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/collection_add_remove_items_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.collection_cosmos.proto; 6 | 7 | import "status.proto"; 8 | 9 | option java_package = "spotify.collection.esperanto.proto"; 10 | option java_multiple_files = true; 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | 14 | message CollectionAddRemoveItemsRequest { 15 | repeated string uri = 1; 16 | } 17 | 18 | message CollectionAddRemoveItemsResponse { 19 | Status status = 1; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/collection_ban_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.collection_cosmos.proto; 6 | 7 | import "status.proto"; 8 | 9 | option java_package = "spotify.collection.esperanto.proto"; 10 | option java_multiple_files = true; 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | 14 | message CollectionBanRequest { 15 | string context_source = 1; 16 | repeated string uri = 2; 17 | } 18 | 19 | message CollectionBanResponse { 20 | Status status = 1; 21 | repeated bool success = 2; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/collection_platform_items.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.collection_platform.proto; 4 | 5 | option java_package = "com.spotify.collection_platform.esperanto.proto"; 6 | option java_multiple_files = true; 7 | option objc_class_prefix = "ESP"; 8 | 9 | message CollectionPlatformItem { 10 | string uri = 1; 11 | int64 add_time = 2; 12 | } 13 | 14 | message CollectionPlatformContextItem { 15 | string uri = 1; 16 | int64 add_time = 2; 17 | string context_uri = 3; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /protocol/proto/concat_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.concat_cosmos.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ConcatRequest { 10 | string a = 1; 11 | string b = 2; 12 | } 13 | 14 | message ConcatWithSeparatorRequest { 15 | string a = 1; 16 | string b = 2; 17 | string separator = 3; 18 | } 19 | 20 | message ConcatResponse { 21 | string concatenated = 1; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/contains_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.playlist.proto"; 10 | 11 | message ContainsRequest { 12 | repeated string items = 1; 13 | } 14 | 15 | message ContainsResponse { 16 | repeated bool found = 1; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/context.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "context_page.proto"; 8 | import "restrictions.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message Context { 13 | optional string uri = 1; 14 | optional string url = 2; 15 | map metadata = 3; 16 | optional Restrictions restrictions = 4; 17 | repeated ContextPage pages = 5; 18 | optional bool loading = 6; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/context_application_desktop.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ApplicationDesktop { 10 | string version_string = 1; 11 | int64 version_code = 2; 12 | bytes session_id = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/context_client_id.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ClientId { 10 | bytes value = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/context_device_desktop.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message DeviceDesktop { 10 | string platform_type = 1; 11 | string device_manufacturer = 2; 12 | string device_model = 3; 13 | string device_id = 4; 14 | string os_version = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/context_index.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ContextIndex { 10 | optional uint32 page = 1; 11 | optional uint32 track = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/context_installation_id.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message InstallationId { 10 | bytes value = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/context_monotonic_clock.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message MonotonicClock { 10 | int64 id = 1; 11 | int64 value = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/context_page.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "context_track.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message ContextPage { 12 | optional string page_url = 1; 13 | optional string next_page_url = 2; 14 | map metadata = 3; 15 | repeated ContextTrack tracks = 4; 16 | optional bool loading = 5; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/context_player_options.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ContextPlayerOptions { 10 | optional bool shuffling_context = 1; 11 | optional bool repeating_context = 2; 12 | optional bool repeating_track = 3; 13 | optional float playback_speed = 4; 14 | map modes = 5; 15 | } 16 | 17 | message ContextPlayerOptionOverrides { 18 | optional bool shuffling_context = 1; 19 | optional bool repeating_context = 2; 20 | optional bool repeating_track = 3; 21 | optional float playback_speed = 4; 22 | map modes = 5; 23 | } 24 | 25 | -------------------------------------------------------------------------------- /protocol/proto/context_processor.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "context.proto"; 8 | import "context_view.proto"; 9 | import "skip_to_track.proto"; 10 | 11 | option optimize_for = CODE_SIZE; 12 | 13 | message ContextProcessor { 14 | optional Context context = 1; 15 | optional context_view.proto.ContextView context_view = 2; 16 | optional SkipToTrack pending_skip_to = 3; 17 | optional string shuffle_seed = 4; 18 | optional int32 index = 5; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/context_sdk.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Sdk { 10 | string version_name = 1; 11 | string type = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/context_time.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Time { 10 | int64 value = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/context_track.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ContextTrack { 10 | optional string uri = 1; 11 | optional string uid = 2; 12 | optional bytes gid = 3; 13 | map metadata = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/context_view.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.context_view.proto; 6 | 7 | import "context_track.proto"; 8 | import "context_view_cyclic_list.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message ContextView { 13 | map patch_map = 1; 14 | optional uint32 iteration_size = 2; 15 | optional cyclic_list.proto.CyclicEntryKeyList cyclic_list = 3; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /protocol/proto/context_view_cyclic_list.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.context_view.cyclic_list.proto; 6 | 7 | import "context_view_entry_key.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message Instance { 12 | optional context_view.proto.EntryKey item = 1; 13 | optional int32 iteration = 2; 14 | } 15 | 16 | message Patch { 17 | optional int32 start = 1; 18 | optional int32 end = 2; 19 | repeated Instance instances = 3; 20 | } 21 | 22 | message CyclicEntryKeyList { 23 | optional context_view.proto.EntryKey delimiter = 1; 24 | repeated context_view.proto.EntryKey items = 2; 25 | optional Patch patch = 3; 26 | } 27 | -------------------------------------------------------------------------------- /protocol/proto/context_view_entry.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.context_view.proto; 6 | 7 | import "context_index.proto"; 8 | import "context_track.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message Entry { 13 | enum Type { 14 | TRACK = 0; 15 | DELIMITER = 1; 16 | PAGE_PLACEHOLDER = 2; 17 | CONTEXT_PLACEHOLDER = 3; 18 | } 19 | 20 | optional Type type = 1; 21 | optional player.proto.ContextTrack track = 2; 22 | optional player.proto.ContextIndex index = 3; 23 | optional int32 page_index = 4; 24 | optional int32 absolute_index = 5; 25 | } 26 | -------------------------------------------------------------------------------- /protocol/proto/context_view_entry_key.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.context_view.proto; 6 | 7 | import "context_view_entry.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message EntryKey { 12 | optional Entry.Type type = 1; 13 | optional string data = 2; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/cosmos_changes_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.collection_cosmos.changes_request.proto; 6 | 7 | option objc_class_prefix = "SPTCollectionCosmosChanges"; 8 | option optimize_for = CODE_SIZE; 9 | 10 | message Response { 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/cosmos_get_tags_info_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.collection_cosmos.tags_info_request.proto; 6 | 7 | option objc_class_prefix = "SPTCollectionCosmosTagsInfo"; 8 | option optimize_for = CODE_SIZE; 9 | 10 | message Request { 11 | } 12 | 13 | message Response { 14 | bool is_synced = 1; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/cosmos_get_track_list_metadata_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.collection_cosmos.proto; 6 | 7 | option objc_class_prefix = "SPTCollectionCosmos"; 8 | option optimize_for = CODE_SIZE; 9 | 10 | message TrackListMetadata { 11 | optional uint32 unfiltered_length = 1; 12 | optional uint32 length = 2; 13 | optional string offline = 3; 14 | optional uint32 sync_progress = 4; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/cuepoints.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.automix.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Cuepoint { 10 | int64 position_ms = 1; 11 | float tempo_bpm = 2; 12 | Origin origin = 3; 13 | } 14 | 15 | message Cuepoints { 16 | Cuepoint fade_in_cuepoint = 1; 17 | Cuepoint fade_out_cuepoint = 2; 18 | } 19 | 20 | enum Origin { 21 | HUMAN = 0; 22 | ML = 1; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/devices.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.connectstate.devices; 6 | 7 | option java_package = "com.spotify.common.proto"; 8 | 9 | message DeviceAlias { 10 | uint32 id = 1; 11 | string display_name = 2; 12 | bool is_group = 3; 13 | } 14 | 15 | enum DeviceType { 16 | UNKNOWN = 0; 17 | COMPUTER = 1; 18 | TABLET = 2; 19 | SMARTPHONE = 3; 20 | SPEAKER = 4; 21 | TV = 5; 22 | AVR = 6; 23 | STB = 7; 24 | AUDIO_DONGLE = 8; 25 | GAME_CONSOLE = 9; 26 | CAST_VIDEO = 10; 27 | CAST_AUDIO = 11; 28 | AUTOMOBILE = 12; 29 | SMARTWATCH = 13; 30 | CHROMEBOOK = 14; 31 | UNKNOWN_SPOTIFY = 100; 32 | CAR_THING = 101; 33 | OBSERVER = 102; 34 | HOME_THING = 103; 35 | } 36 | -------------------------------------------------------------------------------- /protocol/proto/es_add_to_queue_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_context_track.proto"; 9 | import "es_logging_params.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "com.spotify.player.esperanto.proto"; 14 | 15 | message AddToQueueRequest { 16 | ContextTrack track = 1; 17 | CommandOptions options = 2; 18 | LoggingParams logging_params = 3; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/es_command_options.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message CommandOptions { 12 | bool override_restrictions = 1; 13 | bool only_for_local_device = 2; 14 | bool system_initiated = 3; 15 | bytes only_for_playback_id = 4; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/es_context.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_context_page.proto"; 8 | import "es_restrictions.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.player.esperanto.proto"; 13 | 14 | message Context { 15 | repeated ContextPage pages = 1; 16 | map metadata = 2; 17 | string uri = 3; 18 | string url = 4; 19 | bool is_loading = 5; 20 | Restrictions restrictions = 6; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/es_context_page.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_context_track.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message ContextPage { 14 | repeated ContextTrack tracks = 1; 15 | map metadata = 2; 16 | string page_url = 3; 17 | string next_page_url = 4; 18 | bool is_loading = 5; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/es_context_player_options.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_optional.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message ContextPlayerOptions { 14 | bool shuffling_context = 1; 15 | bool repeating_context = 2; 16 | bool repeating_track = 3; 17 | map modes = 5; 18 | optional float playback_speed = 4; 19 | } 20 | 21 | message ContextPlayerOptionOverrides { 22 | OptionalBoolean shuffling_context = 1; 23 | OptionalBoolean repeating_context = 2; 24 | OptionalBoolean repeating_track = 3; 25 | map modes = 5; 26 | optional float playback_speed = 4; 27 | } 28 | -------------------------------------------------------------------------------- /protocol/proto/es_context_track.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message ContextTrack { 12 | string uri = 1; 13 | string uid = 2; 14 | map metadata = 3; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/es_delete_session.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message DeleteSessionRequest { 12 | string session_id = 1; 13 | } 14 | 15 | message DeleteSessionResponse { 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/es_get_error_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message GetErrorRequest { 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/es_get_play_history.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_context_track.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message GetPlayHistoryRequest { 14 | } 15 | 16 | message GetPlayHistoryResponse { 17 | repeated ContextTrack tracks = 1; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/es_get_position_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message GetPositionStateRequest { 12 | } 13 | 14 | message GetPositionStateResponse { 15 | enum Error { 16 | OK = 0; 17 | NOT_FOUND = 1; 18 | } 19 | 20 | Error error = 1; 21 | uint64 timestamp = 2; 22 | uint64 position = 3; 23 | double playback_speed = 4; 24 | } 25 | -------------------------------------------------------------------------------- /protocol/proto/es_get_queue_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message GetQueueRequest { 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/es_get_state_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_optional.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message GetStateRequest { 14 | OptionalInt64 prev_tracks_cap = 1; 15 | OptionalInt64 next_tracks_cap = 2; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/es_ident.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.connectivity.pubsub.esperanto.proto; 6 | 7 | option java_package = "com.spotify.connectivity.pubsub.esperanto.proto"; 8 | 9 | message Ident { 10 | string Ident = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/es_ident_filter.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.connectivity.pubsub.esperanto.proto; 6 | 7 | option java_package = "com.spotify.connectivity.pubsub.esperanto.proto"; 8 | 9 | message IdentFilter { 10 | string Prefix = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/es_logging_params.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_optional.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message LoggingParams { 14 | OptionalInt64 command_initiated_time = 1; 15 | OptionalInt64 command_received_time = 2; 16 | repeated string page_instance_ids = 3; 17 | repeated string interaction_ids = 4; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/es_optional.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message OptionalInt64 { 12 | int64 value = 1; 13 | } 14 | 15 | message OptionalDouble { 16 | double value = 1; 17 | } 18 | 19 | message OptionalBoolean { 20 | bool value = 1; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/es_pause.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | import "es_pauseresume_origin.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "com.spotify.player.esperanto.proto"; 14 | 15 | message PauseRequest { 16 | CommandOptions options = 1; 17 | LoggingParams logging_params = 2; 18 | PauseResumeOrigin pause_origin = 3; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/es_pauseresume_origin.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.player.esperanto.proto; 4 | 5 | option java_package = "com.spotify.player.esperanto.proto"; 6 | option objc_class_prefix = "ESP"; 7 | 8 | message PauseResumeOrigin { 9 | string feature_identifier = 1; 10 | } 11 | 12 | -------------------------------------------------------------------------------- /protocol/proto/es_play.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | import "es_play_options.proto"; 10 | import "es_prepare_play.proto"; 11 | 12 | option objc_class_prefix = "ESP"; 13 | option optimize_for = CODE_SIZE; 14 | option java_package = "com.spotify.player.esperanto.proto"; 15 | 16 | message PlayRequest { 17 | PreparePlayRequest prepare_play_request = 1; 18 | PlayOptions play_options = 2; 19 | CommandOptions options = 3; 20 | LoggingParams logging_params = 4; 21 | } 22 | 23 | message PlayPreparedRequest { 24 | string session_id = 1; 25 | PlayOptions play_options = 2; 26 | CommandOptions options = 3; 27 | LoggingParams logging_params = 4; 28 | } 29 | -------------------------------------------------------------------------------- /protocol/proto/es_play_options.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message PlayOptions { 12 | Reason reason = 1; 13 | enum Reason { 14 | INTERACTIVE = 0; 15 | REMOTE_TRANSFER = 1; 16 | LICENSE_CHANGE = 2; 17 | } 18 | 19 | Operation operation = 2; 20 | enum Operation { 21 | REPLACE = 0; 22 | ENQUEUE = 1; 23 | PUSH = 2; 24 | } 25 | 26 | Trigger trigger = 3; 27 | enum Trigger { 28 | IMMEDIATELY = 0; 29 | ADVANCED_PAST_TRACK = 1; 30 | ADVANCED_PAST_CONTEXT = 2; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /protocol/proto/es_play_origin.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message PlayOrigin { 12 | string feature_identifier = 1; 13 | string feature_version = 2; 14 | string view_uri = 3; 15 | string external_referrer = 4; 16 | string referrer_identifier = 5; 17 | string device_identifier = 6; 18 | repeated string feature_classes = 7; 19 | string restriction_identifier = 8; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/es_prepare_play.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_context.proto"; 8 | import "es_play_origin.proto"; 9 | import "es_prepare_play_options.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "com.spotify.player.esperanto.proto"; 14 | 15 | message PreparePlayRequest { 16 | Context context = 1; 17 | PreparePlayOptions options = 2; 18 | PlayOrigin play_origin = 3; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/es_provided_track.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_context_track.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message ProvidedTrack { 14 | ContextTrack context_track = 1; 15 | repeated string removed = 2; 16 | repeated string blocked = 3; 17 | string provider = 4; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/es_pushed_message.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.connectivity.pubsub.esperanto.proto; 6 | 7 | import "es_ident.proto"; 8 | 9 | option java_package = "com.spotify.connectivity.pubsub.esperanto.proto"; 10 | 11 | message PushedMessage { 12 | Ident Ident = 1; 13 | repeated string Payloads = 2; 14 | map Attributes = 3; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/es_queue.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_provided_track.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message Queue { 14 | uint64 queue_revision = 1; 15 | ProvidedTrack track = 2; 16 | repeated ProvidedTrack next_tracks = 3; 17 | repeated ProvidedTrack prev_tracks = 4; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/es_response_with_reasons.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message ResponseWithReasons { 12 | enum Error { 13 | OK = 0; 14 | FORBIDDEN = 1; 15 | NOT_FOUND = 2; 16 | CONFLICT = 3; 17 | } 18 | 19 | Error error = 1; 20 | string reasons = 2; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/es_resume.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | import "es_command_options.proto"; 12 | import "es_logging_params.proto"; 13 | import "es_pauseresume_origin.proto"; 14 | 15 | message ResumeRequest { 16 | CommandOptions options = 1; 17 | LoggingParams logging_params = 2; 18 | PauseResumeOrigin resume_origin = 3; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/es_seek_to.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.player.esperanto.proto"; 13 | 14 | message SeekToRequest { 15 | enum Relative { 16 | BEGINNING = 0; 17 | END = 1; 18 | CURRENT = 2; 19 | } 20 | 21 | CommandOptions options = 1; 22 | LoggingParams logging_params = 2; 23 | int64 position = 3; 24 | Relative relative = 4; 25 | } 26 | 27 | -------------------------------------------------------------------------------- /protocol/proto/es_session_response.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.player.esperanto.proto"; 10 | 11 | message SessionResponse { 12 | string session_id = 1; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/es_set_options.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | import "es_optional.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "com.spotify.player.esperanto.proto"; 14 | 15 | message SetOptionsRequest { 16 | OptionalBoolean repeating_track = 1; 17 | OptionalBoolean repeating_context = 2; 18 | OptionalBoolean shuffling_context = 3; 19 | CommandOptions options = 4; 20 | LoggingParams logging_params = 5; 21 | map modes = 7; 22 | optional float playback_speed = 6; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/es_set_queue_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_provided_track.proto"; 9 | import "es_logging_params.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "com.spotify.player.esperanto.proto"; 14 | 15 | message SetQueueRequest { 16 | repeated ProvidedTrack next_tracks = 1; 17 | repeated ProvidedTrack prev_tracks = 2; 18 | uint64 queue_revision = 3; 19 | CommandOptions options = 4; 20 | LoggingParams logging_params = 5; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/es_set_repeating_context.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.player.esperanto.proto"; 13 | 14 | message SetRepeatingContextRequest { 15 | bool repeating_context = 1; 16 | CommandOptions options = 2; 17 | LoggingParams logging_params = 3; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/es_set_repeating_track.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.player.esperanto.proto"; 13 | 14 | message SetRepeatingTrackRequest { 15 | bool repeating_track = 1; 16 | CommandOptions options = 2; 17 | LoggingParams logging_params = 3; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/es_set_shuffling_context.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.player.esperanto.proto"; 13 | 14 | message SetShufflingContextRequest { 15 | bool shuffling_context = 1; 16 | CommandOptions options = 2; 17 | LoggingParams logging_params = 3; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/es_skip_next.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | import "es_context_track.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "com.spotify.player.esperanto.proto"; 14 | 15 | message SkipNextRequest { 16 | CommandOptions options = 1; 17 | LoggingParams logging_params = 2; 18 | ContextTrack track = 3; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/es_skip_prev.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | import "es_context_track.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "com.spotify.player.esperanto.proto"; 14 | 15 | message SkipPrevRequest { 16 | CommandOptions options = 1; 17 | bool allow_seeking = 2; 18 | LoggingParams logging_params = 3; 19 | ContextTrack track = 4; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/es_skip_to_track.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_optional.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.player.esperanto.proto"; 12 | 13 | message SkipToTrack { 14 | string page_url = 1; 15 | OptionalInt64 page_index = 2; 16 | string track_uid = 3; 17 | string track_uri = 4; 18 | OptionalInt64 track_index = 5; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/es_stop.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.player.esperanto.proto; 6 | 7 | import "es_command_options.proto"; 8 | import "es_logging_params.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.player.esperanto.proto"; 13 | 14 | message StopRequest { 15 | CommandOptions options = 1; 16 | 17 | StopRequest.Reason reason = 2; 18 | enum Reason { 19 | INTERACTIVE = 0; 20 | REMOTE_TRANSFER = 1; 21 | SHUTDOWN = 2; 22 | } 23 | 24 | LoggingParams logging_params = 3; 25 | } 26 | -------------------------------------------------------------------------------- /protocol/proto/esperanto_options.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.esperanto; 4 | 5 | import "google/protobuf/descriptor.proto"; 6 | 7 | -------------------------------------------------------------------------------- /protocol/proto/event_entity.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message EventEntity { 10 | uint32 file_format_version = 1; 11 | string event_name = 2; 12 | bytes sequence_id = 3; 13 | uint64 sequence_number = 4; 14 | bytes payload = 5; 15 | string owner = 6; 16 | bool authenticated = 7; 17 | uint64 record_id = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/explicit_content_pubsub.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.explicit_content.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message UserAttributesUpdate { 10 | map pairs = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/extension_descriptor_type.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.descriptorextension; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.descriptorextension.proto"; 10 | 11 | message ExtensionDescriptor { 12 | string text = 1; 13 | float weight = 2; 14 | repeated ExtensionDescriptorType types = 3; 15 | } 16 | 17 | message ExtensionDescriptorData { 18 | repeated ExtensionDescriptor descriptors = 1; 19 | } 20 | 21 | enum ExtensionDescriptorType { 22 | UNKNOWN = 0; 23 | GENRE = 1; 24 | MOOD = 2; 25 | ACTIVITY = 3; 26 | INSTRUMENT = 4; 27 | TIME = 5; 28 | ERA = 6; 29 | AESTHETIC = 7; 30 | } 31 | -------------------------------------------------------------------------------- /protocol/proto/extracted_colors.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.context_track_color; 6 | 7 | message ColorResult { 8 | Color color_raw = 1; 9 | Color color_light = 2; 10 | Color color_dark = 3; 11 | Status status = 5; 12 | } 13 | 14 | message Color { 15 | int32 rgb = 1; 16 | bool is_fallback = 2; 17 | } 18 | 19 | enum Status { 20 | OK = 0; 21 | IN_PROGRESS = 1; 22 | INVALID_URL = 2; 23 | INTERNAL = 3; 24 | } 25 | -------------------------------------------------------------------------------- /protocol/proto/follow_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.socialgraph_esperanto.proto; 6 | 7 | import "socialgraph_response_status.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "spotify.socialgraph.esperanto.proto"; 13 | 14 | message FollowRequest { 15 | repeated string username = 1; 16 | bool follow = 2; 17 | } 18 | 19 | message FollowRequestV4 { 20 | string username = 1; 21 | bool follow = 2; 22 | } 23 | 24 | message FollowResponse { 25 | ResponseStatus status = 1; 26 | } 27 | -------------------------------------------------------------------------------- /protocol/proto/followed_users_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.socialgraph_esperanto.proto; 6 | 7 | import "socialgraph_response_status.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "spotify.socialgraph.esperanto.proto"; 13 | 14 | message FollowedUsersRequest { 15 | bool force_reload = 1; 16 | } 17 | 18 | message FollowedUsersResponse { 19 | ResponseStatus status = 1; 20 | repeated string users = 2; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/frecency.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.frecency.v1; 6 | 7 | import "google/protobuf/timestamp.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_outer_classname = "FrecencyProto"; 12 | option java_package = "com.spotify.frecency.v1"; 13 | 14 | message FrecencyResponse { 15 | repeated PlayContext play_contexts = 1; 16 | } 17 | 18 | message PlayContext { 19 | string uri = 1; 20 | Frecency frecency = 2; 21 | } 22 | 23 | message Frecency { 24 | double ln_frecency = 1; 25 | int32 event_count = 2; 26 | google.protobuf.Timestamp last_event_time = 3; 27 | } 28 | -------------------------------------------------------------------------------- /protocol/proto/frecency_storage.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.frecency.proto.storage; 6 | 7 | option cc_enable_arenas = true; 8 | option optimize_for = CODE_SIZE; 9 | 10 | message Frecency { 11 | optional double ln_frecency = 1; 12 | optional uint64 event_count = 2; 13 | optional uint32 event_kind = 3; 14 | optional uint64 last_event_time = 4; 15 | } 16 | 17 | message ContextFrecencyInfo { 18 | optional string context_uri = 1; 19 | repeated Frecency context_frecencies = 2; 20 | } 21 | 22 | message ContextFrecencyFile { 23 | repeated ContextFrecencyInfo contexts = 1; 24 | optional uint64 frecency_version = 2; 25 | } 26 | -------------------------------------------------------------------------------- /protocol/proto/global_node.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "context_player_options.proto"; 8 | import "pause_resume_origin.proto"; 9 | import "player_license.proto"; 10 | 11 | option optimize_for = CODE_SIZE; 12 | 13 | message GlobalNode { 14 | optional ContextPlayerOptions options = 1; 15 | optional PlayerLicense license = 2; 16 | map configuration = 3; 17 | optional PauseResumeOrigin pause_resume_origin = 4; 18 | optional bool is_paused = 5; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/google/protobuf/any.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package google.protobuf; 6 | 7 | option csharp_namespace = "Google.Protobuf.WellKnownTypes"; 8 | option objc_class_prefix = "GPB"; 9 | option go_package = "google.golang.org/protobuf/types/known/anypb"; 10 | option java_multiple_files = true; 11 | option java_outer_classname = "AnyProto"; 12 | option java_package = "com.google.protobuf"; 13 | 14 | message Any { 15 | string type_url = 1; 16 | bytes value = 2; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/google/protobuf/duration.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package google.protobuf; 6 | 7 | option csharp_namespace = "Google.Protobuf.WellKnownTypes"; 8 | option objc_class_prefix = "GPB"; 9 | option cc_enable_arenas = true; 10 | option go_package = "google.golang.org/protobuf/types/known/durationpb"; 11 | option java_multiple_files = true; 12 | option java_outer_classname = "DurationProto"; 13 | option java_package = "com.google.protobuf"; 14 | 15 | message Duration { 16 | int64 seconds = 1; 17 | int32 nanos = 2; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/google/protobuf/empty.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package google.protobuf; 6 | 7 | option csharp_namespace = "Google.Protobuf.WellKnownTypes"; 8 | option objc_class_prefix = "GPB"; 9 | option cc_enable_arenas = true; 10 | option go_package = "google.golang.org/protobuf/types/known/emptypb"; 11 | option java_multiple_files = true; 12 | option java_outer_classname = "EmptyProto"; 13 | option java_package = "com.google.protobuf"; 14 | 15 | message Empty { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/google/protobuf/field_mask.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package google.protobuf; 6 | 7 | option csharp_namespace = "Google.Protobuf.WellKnownTypes"; 8 | option objc_class_prefix = "GPB"; 9 | option cc_enable_arenas = true; 10 | option go_package = "google.golang.org/protobuf/types/known/fieldmaskpb"; 11 | option java_multiple_files = true; 12 | option java_outer_classname = "FieldMaskProto"; 13 | option java_package = "com.google.protobuf"; 14 | 15 | message FieldMask { 16 | repeated string paths = 1; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/google/protobuf/source_context.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package google.protobuf; 6 | 7 | option csharp_namespace = "Google.Protobuf.WellKnownTypes"; 8 | option objc_class_prefix = "GPB"; 9 | option go_package = "google.golang.org/protobuf/types/known/sourcecontextpb"; 10 | option java_multiple_files = true; 11 | option java_outer_classname = "SourceContextProto"; 12 | option java_package = "com.google.protobuf"; 13 | 14 | message SourceContext { 15 | string file_name = 1; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/google/protobuf/timestamp.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package google.protobuf; 6 | 7 | option csharp_namespace = "Google.Protobuf.WellKnownTypes"; 8 | option objc_class_prefix = "GPB"; 9 | option cc_enable_arenas = true; 10 | option go_package = "google.golang.org/protobuf/types/known/timestamppb"; 11 | option java_multiple_files = true; 12 | option java_outer_classname = "TimestampProto"; 13 | option java_package = "com.google.protobuf"; 14 | 15 | message Timestamp { 16 | int64 seconds = 1; 17 | int32 nanos = 2; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/greenroom_extension.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.greenroom.api.extendedmetadata.v1; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_outer_classname = "GreenroomMetadataProto"; 11 | option java_package = "com.spotify.greenroom.api.extendedmetadata.v1.proto"; 12 | 13 | message GreenroomSection { 14 | repeated GreenroomItem items = 1; 15 | } 16 | 17 | message GreenroomItem { 18 | string title = 1; 19 | string description = 2; 20 | repeated GreenroomHost hosts = 3; 21 | int64 start_timestamp = 4; 22 | string deeplink_url = 5; 23 | bool live = 6; 24 | } 25 | 26 | message GreenroomHost { 27 | string name = 1; 28 | string image_url = 2; 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/installation_data.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message InstallationEntity { 10 | int32 file_format_version = 1; 11 | bytes encrypted_part = 2; 12 | } 13 | 14 | message InstallationData { 15 | bytes installation_id = 1; 16 | bytes last_seen_device_id = 2; 17 | int64 monotonic_clock_id = 3; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/instrumentation_params.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.transfer; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message InstrumentationParams { 10 | repeated string interaction_ids = 6; 11 | repeated string page_instance_ids = 7; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/lens-model.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.lens.model.proto; 6 | 7 | option java_package = "com.spotify.lens.model.proto"; 8 | option java_outer_classname = "LensModelProto"; 9 | option optimize_for = CODE_SIZE; 10 | 11 | message Lens { 12 | string identifier = 1; 13 | } 14 | 15 | message LensState { 16 | string identifier = 1; 17 | bytes revision = 2; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /protocol/proto/lfs_secret_provider.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.lfssecretprovider.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message GetSecretResponse { 10 | bytes secret = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/liked_songs_tags_sync_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.collection.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message TagsSyncState { 10 | string uri = 1; 11 | bool sync_is_complete = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/local_bans_storage.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.collection.proto.storage; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message BanItem { 10 | required string item_uri = 1; 11 | required string context_uri = 2; 12 | required int64 timestamp = 3; 13 | } 14 | 15 | message LocalBansTimestamp { 16 | required int64 timestamp = 1; 17 | } 18 | 19 | message Bans { 20 | repeated BanItem items = 1; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/local_sync_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.local_sync_cosmos.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message GetDevicesResponse { 10 | repeated Device devices = 1; 11 | message Device { 12 | string name = 1; 13 | string id = 2; 14 | string endpoint = 3; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/local_sync_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.local_sync_state.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | option java_package = "com.spotify.local_sync_state.proto"; 9 | 10 | message State { 11 | string safe_secret = 1; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/logging_params.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message LoggingParams { 10 | optional int64 command_initiated_time = 1; 11 | optional int64 command_received_time = 2; 12 | repeated string page_instance_ids = 3; 13 | repeated string interaction_ids = 4; 14 | optional string device_identifier = 5; 15 | optional string command_id = 6; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/mdata_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.mdata_cosmos.proto; 6 | 7 | import "extension_kind.proto"; 8 | 9 | option cc_enable_arenas = true; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.mdata.cosmos.proto"; 13 | 14 | message InvalidateCacheRequest { 15 | extendedmetadata.ExtensionKind extension_kind = 1; 16 | repeated string entity_uri = 2; 17 | } 18 | 19 | message InvalidateCacheResponse { 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/media.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.common.media; 6 | 7 | option java_package = "com.spotify.common.proto"; 8 | option optimize_for = CODE_SIZE; 9 | 10 | enum AudioQuality { 11 | DEFAULT = 0; 12 | LOW = 1; 13 | NORMAL = 2; 14 | HIGH = 3; 15 | VERY_HIGH = 4; 16 | HIFI = 5; 17 | HIFI_24 = 6; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /protocol/proto/media_type.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 9 | 10 | enum MediaType { 11 | AUDIO = 0; 12 | VIDEO = 1; 13 | MEDIA_TYPE_AUDIO = 0; 14 | MEDIA_TYPE_VIDEO = 1; 15 | MEDIA_TYPE_UNKNOWN = 2; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/media_type_node.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message MediaTypeNode { 10 | optional string current_uri = 1; 11 | optional string media_type = 2; 12 | optional string media_manifest_id = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/members_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.playlist.proto"; 10 | 11 | message OptionalLimit { 12 | uint32 value = 1; 13 | } 14 | 15 | message PlaylistMembersRequest { 16 | string uri = 1; 17 | OptionalLimit limit = 2; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/messages/discovery/force_discover.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.connect.esperanto.proto; 6 | 7 | option java_package = "com.spotify.connect.esperanto.proto"; 8 | 9 | message ForceDiscoverRequest { 10 | 11 | } 12 | 13 | message ForceDiscoverResponse { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/messages/discovery/start_discovery.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.connect.esperanto.proto; 6 | 7 | option java_package = "com.spotify.connect.esperanto.proto"; 8 | 9 | message StartDiscoveryRequest { 10 | 11 | } 12 | 13 | message StartDiscoveryResponse { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/metadata/artist_metadata.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | import "metadata/image_group.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.cosmos.util.proto"; 12 | 13 | message ArtistMetadata { 14 | optional string link = 1; 15 | optional string name = 2; 16 | optional bool is_various_artists = 3; 17 | optional ImageGroup portraits = 4; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/metadata/extension.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | import "extension_kind.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.cosmos.util.proto"; 12 | 13 | message Extension { 14 | optional extendedmetadata.ExtensionKind extension_kind = 1; 15 | optional bytes data = 2; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/metadata/image_group.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message ImageGroup { 12 | optional string standard_link = 1; 13 | optional string small_link = 2; 14 | optional string large_link = 3; 15 | optional string xlarge_link = 4; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/metadata_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.metadata_cosmos.proto; 6 | 7 | import "metadata.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | option java_outer_classname = "MetadataCosmos"; 11 | option java_package = "com.spotify.metadata.cosmos.proto"; 12 | 13 | message MetadataItem { 14 | oneof item { 15 | sint32 error = 1; 16 | metadata.Artist artist = 2; 17 | metadata.Album album = 3; 18 | metadata.Track track = 4; 19 | metadata.Show show = 5; 20 | metadata.Episode episode = 6; 21 | } 22 | } 23 | 24 | message MultiResponse { 25 | repeated MetadataItem items = 1; 26 | } 27 | 28 | message MultiRequest { 29 | repeated string uris = 1; 30 | } 31 | -------------------------------------------------------------------------------- /protocol/proto/metadata_esperanto.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.metadata_esperanto.proto; 6 | 7 | import "metadata_cosmos.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.metadata.esperanto.proto"; 12 | 13 | service ClassicMetadataService { 14 | rpc GetEntity(GetEntityRequest) returns (GetEntityResponse); 15 | rpc MultigetEntity(metadata_cosmos.proto.MultiRequest) returns (metadata_cosmos.proto.MultiResponse); 16 | } 17 | 18 | message GetEntityRequest { 19 | string uri = 1; 20 | } 21 | 22 | message GetEntityResponse { 23 | metadata_cosmos.proto.MetadataItem item = 1; 24 | } 25 | -------------------------------------------------------------------------------- /protocol/proto/mod.rs: -------------------------------------------------------------------------------- 1 | // generated protobuf files will be included here. See build.rs for details 2 | include!(env!("PROTO_MOD_RS")); 3 | -------------------------------------------------------------------------------- /protocol/proto/net-fortune.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.netfortune.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message NetFortuneResponse { 10 | int32 advised_audio_bitrate = 1; 11 | } 12 | 13 | message NetFortuneV2Response { 14 | string predict_id = 1; 15 | int32 estimated_max_bitrate = 2; 16 | optional int32 advised_prefetch_bitrate_metered = 3; 17 | optional int32 advised_prefetch_bitrate_non_metered = 4; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/offline_playlists_containing.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option objc_class_prefix = "SPTPlaylist"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.playlist.proto"; 11 | 12 | message OfflinePlaylistContainingItem { 13 | required string playlist_link = 1; 14 | optional string playlist_name = 2; 15 | } 16 | 17 | message OfflinePlaylistsContainingItemResponse { 18 | repeated OfflinePlaylistContainingItem playlists = 1; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/on_demand_in_free_reason.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.on_demand_set.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | enum OnDemandInFreeReason { 10 | UNKNOWN = 0; 11 | NOT_ON_DEMAND = 1; 12 | ON_DEMAND = 2; 13 | ON_DEMAND_EPISODES_ONLY = 3; 14 | ON_DEMAND_NON_MUSIC_ONLY = 4; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/on_demand_set_cosmos_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.on_demand_set_cosmos.proto; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.on_demand_set.proto"; 11 | 12 | message Set { 13 | repeated string uris = 1; 14 | } 15 | 16 | message Temporary { 17 | optional string uri = 1; 18 | optional int64 valid_for_in_seconds = 2; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/on_demand_set_cosmos_response.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.on_demand_set_cosmos.proto; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.on_demand_set.proto"; 11 | 12 | message Response { 13 | optional bool success = 1; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/on_demand_set_response.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.on_demand_set_esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.on_demand_set.proto"; 11 | 12 | message ResponseStatus { 13 | int32 status_code = 1; 14 | string reason = 2; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/pause_resume_origin.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PauseResumeOrigin { 10 | optional string feature_identifier = 1; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /protocol/proto/pending_event_entity.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.pending_events.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PendingEventEntity { 10 | string event_name = 1; 11 | bytes payload = 2; 12 | string username = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/perf_metrics_service.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.perf_metrics.esperanto.proto; 6 | 7 | option java_package = "com.spotify.perf_metrics.esperanto.proto"; 8 | 9 | service PerfMetricsService { 10 | rpc TerminateState(PerfMetricsRequest) returns (PerfMetricsResponse); 11 | } 12 | 13 | message PerfMetricsRequest { 14 | string terminal_state = 1; 15 | bool foreground_startup = 2; 16 | } 17 | 18 | message PerfMetricsResponse { 19 | bool success = 1; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/play_history.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.transfer; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlayHistory { 10 | message Item { 11 | optional string context_id = 1; 12 | optional string uid = 2; 13 | optional bool disliked = 3; 14 | repeated transfer.PlayHistory.Item children = 4; 15 | } 16 | 17 | repeated transfer.PlayHistory.Item backward_items = 1; 18 | repeated transfer.PlayHistory.Item forward_items = 2; 19 | } 20 | 21 | -------------------------------------------------------------------------------- /protocol/proto/play_origin.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlayOrigin { 10 | optional string feature_identifier = 1; 11 | optional string feature_version = 2; 12 | optional string view_uri = 3; 13 | optional string external_referrer = 4; 14 | optional string referrer_identifier = 5; 15 | optional string device_identifier = 6; 16 | repeated string feature_classes = 7; 17 | optional string restriction_identifier = 8; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/play_queue_node.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "context_track.proto"; 8 | import "track_instance.proto"; 9 | import "track_instantiator.proto"; 10 | 11 | option optimize_for = CODE_SIZE; 12 | 13 | message PlayQueueNode { 14 | repeated ContextTrack queue = 1; 15 | optional TrackInstance instance = 2; 16 | optional TrackInstantiator instantiator = 3; 17 | optional uint32 next_uid = 4; 18 | optional sint32 iteration = 5; 19 | optional bool delay_enqueued_tracks = 6; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/playback.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.transfer; 6 | 7 | import "context_track.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message Playback { 12 | optional int64 timestamp = 1; 13 | optional int32 position_as_of_timestamp = 2; 14 | optional double playback_speed = 3; 15 | optional bool is_paused = 4; 16 | optional ContextTrack current_track = 5; 17 | optional ContextTrack associated_current_track = 6; 18 | optional int32 associated_position_as_of_timestamp = 7; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/playback_segments.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.podcast_segments.playback; 6 | 7 | import "podcast_segments.proto"; 8 | 9 | option objc_class_prefix = "SPT"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_outer_classname = "PlaybackSegmentsProto"; 13 | option java_package = "com.spotify.podcastsegments.playback.proto"; 14 | 15 | message PlaybackSegments { 16 | repeated PlaybackSegment playback_segments = 1; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/playback_stack.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.stream_reporting_esperanto.proto; 4 | 5 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 6 | option objc_class_prefix = "ESP"; 7 | 8 | enum PlaybackStack { 9 | BOOMBOX = 0; 10 | BETAMAX = 1; 11 | UNKNOWN = 2; 12 | } 13 | 14 | -------------------------------------------------------------------------------- /protocol/proto/playback_stack_v2.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.stream_reporting_esperanto.proto; 4 | 5 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 6 | option objc_class_prefix = "ESP"; 7 | 8 | enum PlaybackStackV2 { 9 | PLAYBACK_STACK_UNKNOWN = 0; 10 | PLAYBACK_STACK_BOOMBOX = 1; 11 | PLAYBACK_STACK_BETAMAX = 2; 12 | PLAYBACK_STACK_KUBRICK = 3; 13 | } 14 | 15 | -------------------------------------------------------------------------------- /protocol/proto/playback_state.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.stream_reporting_esperanto.proto; 4 | 5 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 6 | option objc_class_prefix = "ESP"; 7 | 8 | enum PlaybackState { 9 | ACTIVE = 0; 10 | PAUSED = 1; 11 | SUSPENDED = 2; 12 | INVALID_PLAYBACK_STATE = 3; 13 | } 14 | 15 | -------------------------------------------------------------------------------- /protocol/proto/played_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.played_state.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlayedStateItem { 10 | optional string show_uri = 1; 11 | optional string episode_uri = 2; 12 | optional int32 resume_point = 3; 13 | optional int32 last_played_at = 4; 14 | optional bool is_latest = 5; 15 | optional bool has_been_fully_played = 6; 16 | optional bool has_been_synced = 7; 17 | optional int32 episode_length = 8; 18 | } 19 | 20 | message PlayedStateItems { 21 | repeated PlayedStateItem item = 1; 22 | optional uint64 last_server_sync_timestamp = 2; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/played_state/episode_played_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | import "played_state/playability_restriction.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.cosmos.util.proto"; 12 | 13 | message EpisodePlayState { 14 | optional uint32 time_left = 1; 15 | optional bool is_playable = 2; 16 | optional bool is_played = 3; 17 | optional uint32 last_played_at = 4; 18 | optional PlayabilityRestriction playability_restriction = 5 [default = UNKNOWN]; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/played_state/playability_restriction.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | enum PlayabilityRestriction { 12 | UNKNOWN = 0; 13 | NO_RESTRICTION = 1; 14 | EXPLICIT_CONTENT = 2; 15 | AGE_RESTRICTED = 3; 16 | NOT_IN_CATALOGUE = 4; 17 | NOT_AVAILABLE_OFFLINE = 5; 18 | PREMIUM_ONLY = 6; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/played_state/track_played_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | import "played_state/playability_restriction.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.cosmos.util.proto"; 12 | 13 | message TrackPlayState { 14 | optional bool is_playable = 1; 15 | optional PlayabilityRestriction playability_restriction = 2 [default = UNKNOWN]; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/player_license.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PlayerLicense { 10 | optional string identifier = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/player_model.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "logging_params.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message PlayerModel { 12 | optional bool is_paused = 1; 13 | optional uint64 hash = 2; 14 | optional LoggingParams logging_params = 3; 15 | 16 | optional StartReason start_reason = 4; 17 | enum StartReason { 18 | REMOTE_TRANSFER = 0; 19 | COMEBACK = 1; 20 | PLAY_CONTEXT = 2; 21 | PLAY_SPECIFIC_TRACK = 3; 22 | TRACK_FINISHED = 4; 23 | SKIP_TO_NEXT_TRACK = 5; 24 | SKIP_TO_PREV_TRACK = 6; 25 | ERROR = 7; 26 | IGNORED = 8; 27 | UNKNOWN = 9; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/playlist_contains_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist_esperanto.proto; 6 | 7 | import "contains_request.proto"; 8 | import "response_status.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option java_multiple_files = true; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "spotify.playlist.esperanto.proto"; 14 | 15 | message PlaylistContainsRequest { 16 | string uri = 1; 17 | playlist.cosmos.proto.ContainsRequest request = 2; 18 | } 19 | 20 | message PlaylistContainsResponse { 21 | ResponseStatus status = 1; 22 | playlist.cosmos.proto.ContainsResponse response = 2; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/playlist_folder_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.playlist.proto"; 10 | 11 | message FolderMetadata { 12 | optional string id = 1; 13 | optional string name = 2; 14 | optional uint32 num_folders = 3; 15 | optional uint32 num_playlists = 4; 16 | optional uint32 num_recursive_folders = 5; 17 | optional uint32 num_recursive_playlists = 6; 18 | optional string link = 7; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/playlist_members_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist_esperanto.proto; 6 | 7 | import "members_request.proto"; 8 | import "members_response.proto"; 9 | import "response_status.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option java_multiple_files = true; 13 | option optimize_for = CODE_SIZE; 14 | option java_package = "spotify.playlist.esperanto.proto"; 15 | 16 | message PlaylistMembersResponse { 17 | ResponseStatus status = 1; 18 | playlist.cosmos.proto.PlaylistMembersResponse response = 2; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/playlist_modification_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist_esperanto.proto; 6 | 7 | import "modification_request.proto"; 8 | import "response_status.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option java_multiple_files = true; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "spotify.playlist.esperanto.proto"; 14 | 15 | message PlaylistModificationRequest { 16 | string uri = 1; 17 | playlist.cosmos.proto.ModificationRequest request = 2; 18 | } 19 | 20 | message PlaylistModificationResponse { 21 | ResponseStatus status = 1; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/playlist_offline_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist_esperanto.proto; 6 | 7 | import "playlist_query.proto"; 8 | import "response_status.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option java_multiple_files = true; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "spotify.playlist.esperanto.proto"; 14 | 15 | message PlaylistOfflineRequest { 16 | string uri = 1; 17 | PlaylistQuery query = 2; 18 | PlaylistOfflineAction action = 3; 19 | } 20 | 21 | message PlaylistOfflineResponse { 22 | ResponseStatus status = 1; 23 | } 24 | 25 | enum PlaylistOfflineAction { 26 | NONE = 0; 27 | SET_AS_AVAILABLE_OFFLINE = 1; 28 | REMOVE_AS_AVAILABLE_OFFLINE = 2; 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/playlist_playback_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.playlist.proto"; 10 | 11 | message PlaybackResponse { 12 | bool success = 1; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/playlist_set_base_permission_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist_esperanto.proto; 6 | 7 | import "playlist_set_permission_request.proto"; 8 | import "response_status.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option java_multiple_files = true; 12 | option optimize_for = CODE_SIZE; 13 | option java_package = "spotify.playlist.esperanto.proto"; 14 | 15 | message PlaylistSetBasePermissionRequest { 16 | string uri = 1; 17 | playlist.cosmos.proto.SetBasePermissionRequest request = 2; 18 | } 19 | 20 | message PlaylistSetBasePermissionResponse { 21 | ResponseStatus status = 1; 22 | playlist.cosmos.proto.SetBasePermissionResponse response = 2; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/playlist_set_member_permission_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist_esperanto.proto; 6 | 7 | import "response_status.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "spotify.playlist.esperanto.proto"; 13 | 14 | message PlaylistSetMemberPermissionResponse { 15 | ResponseStatus status = 1; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/playlist_set_permission_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | import "playlist_permission.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.playlist.proto"; 12 | 13 | message SetBasePermissionRequest { 14 | optional playlist_permission.proto.PermissionLevel permission_level = 1; 15 | optional uint32 timeout_ms = 2; 16 | } 17 | 18 | message SetBasePermissionResponse { 19 | optional playlist_permission.proto.Permission base_permission = 1; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/playlist_track_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option objc_class_prefix = "SPTPlaylist"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.playlist.proto"; 11 | 12 | message TrackCollectionState { 13 | optional bool is_in_collection = 1; 14 | optional bool can_add_to_collection = 2; 15 | optional bool is_banned = 3; 16 | optional bool can_ban = 4; 17 | } 18 | 19 | message TrackOfflineState { 20 | optional string offline = 1; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/playlist_user_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.playlist.proto"; 10 | 11 | message User { 12 | optional string link = 1; 13 | optional string username = 2; 14 | optional string display_name = 3; 15 | optional string image_uri = 4; 16 | optional string thumbnail_uri = 5; 17 | optional int32 color = 6; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/podcast_cta_cards.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.context_mdata.podcastctacards; 6 | 7 | message Card { 8 | bool has_cards = 1; 9 | } 10 | -------------------------------------------------------------------------------- /protocol/proto/podcast_paywalls_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.podcast_paywalls_cosmos.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message PodcastPaywallsShowSubscriptionRequest { 10 | string show_uri = 1; 11 | } 12 | 13 | message PodcastPaywallsShowSubscriptionResponse { 14 | bool is_user_subscribed = 1; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/podcast_qna.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.qanda; 6 | 7 | import "google/protobuf/timestamp.proto"; 8 | 9 | option objc_class_prefix = "SPT"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_outer_classname = "QnAMetadataProto"; 13 | option java_package = "com.spotify.podcastcreatorinteractivity.v1"; 14 | 15 | message PodcastQna { 16 | Prompt prompt = 1; 17 | } 18 | 19 | message Prompt { 20 | int32 id = 1; 21 | google.protobuf.Timestamp opening_date = 2; 22 | google.protobuf.Timestamp closing_date = 3; 23 | string text = 4; 24 | QAndAStatus status = 5; 25 | } 26 | 27 | enum QAndAStatus { 28 | DRAFT = 0; 29 | SCHEDULED = 1; 30 | LIVE = 2; 31 | CLOSED = 3; 32 | DELETED = 4; 33 | } 34 | -------------------------------------------------------------------------------- /protocol/proto/podcast_subscription.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.podcast_paywalls; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_outer_classname = "PodcastSubscriptionProto"; 11 | option java_package = "com.spotify.podcastsubscription.proto"; 12 | 13 | message PodcastSubscription { 14 | bool is_paywalled = 1; 15 | bool is_user_subscribed = 2; 16 | 17 | UserExplanation user_explanation = 3; 18 | enum UserExplanation { 19 | SUBSCRIPTION_DIALOG = 0; 20 | NONE = 1; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/podcast_virality.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.podcastvirality.v1; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_outer_classname = "PodcastViralityProto"; 11 | option java_package = "com.spotify.podcastvirality.proto.v1"; 12 | 13 | message PodcastVirality { 14 | bool is_viral = 1; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/podcastextensions.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.podcast.extensions; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_outer_classname = "PodcastExtensionsProto"; 11 | option java_package = "com.spotify.podcastextensions.proto"; 12 | 13 | message PodcastTopics { 14 | repeated PodcastTopic topics = 1; 15 | } 16 | 17 | message PodcastTopic { 18 | string uri = 1; 19 | string title = 2; 20 | } 21 | 22 | message PodcastHtmlDescription { 23 | Header header = 1; 24 | message Header { 25 | } 26 | 27 | string html_description = 2; 28 | } 29 | -------------------------------------------------------------------------------- /protocol/proto/policy/folder_decoration_policy.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.playlist.policy.proto"; 10 | 11 | message FolderDecorationPolicy { 12 | bool row_id = 1; 13 | bool id = 2; 14 | bool link = 3; 15 | bool name = 4; 16 | bool folders = 5; 17 | bool playlists = 6; 18 | bool recursive_folders = 7; 19 | bool recursive_playlists = 8; 20 | bool rows = 9; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/policy/playlist_album_decoration_policy.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | import "policy/album_decoration_policy.proto"; 8 | import "policy/artist_decoration_policy.proto"; 9 | 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.playlist.policy.proto"; 13 | 14 | message PlaylistAlbumDecorationPolicy { 15 | cosmos_util.proto.AlbumDecorationPolicy album = 1; 16 | cosmos_util.proto.ArtistDecorationPolicy artist = 2; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/policy/rootlist_folder_decoration_policy.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | import "policy/folder_decoration_policy.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.playlist.policy.proto"; 12 | 13 | message RootlistFolderDecorationPolicy { 14 | optional bool add_time = 1; 15 | optional FolderDecorationPolicy folder = 2; 16 | optional bool group_label = 3; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/policy/rootlist_playlist_decoration_policy.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | import "policy/playlist_decoration_policy.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.playlist.policy.proto"; 12 | 13 | message RootlistPlaylistDecorationPolicy { 14 | optional bool add_time = 1; 15 | optional PlaylistDecorationPolicy playlist = 2; 16 | optional bool group_label = 3; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/policy/rootlist_request_decoration_policy.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | import "policy/rootlist_folder_decoration_policy.proto"; 8 | import "policy/rootlist_playlist_decoration_policy.proto"; 9 | 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.playlist.policy.proto"; 13 | 14 | message RootlistRequestDecorationPolicy { 15 | optional bool unfiltered_length = 1; 16 | optional bool unranged_length = 2; 17 | optional bool is_loading_contents = 3; 18 | optional RootlistPlaylistDecorationPolicy playlist = 4; 19 | optional RootlistFolderDecorationPolicy folder = 5; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/policy/supported_link_types_in_playlists.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.playlist.cosmos.proto; 4 | 5 | option java_package = "com.spotify.playlist.policy.proto"; 6 | option java_multiple_files = true; 7 | 8 | enum LinkType { 9 | EMPTY = 0; 10 | ARTIST = 1; 11 | ALBUM = 2; 12 | TRACK = 4; 13 | LOCAL_TRACK = 9; 14 | SHOW = 62; 15 | EPISODE = 63; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /protocol/proto/profile_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.profile_cosmos.proto; 6 | 7 | import "identity.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message GetProfilesRequest { 12 | repeated string usernames = 1; 13 | } 14 | 15 | message GetProfilesResponse { 16 | repeated identity.v3.UserProfile profiles = 1; 17 | } 18 | 19 | message ChangeDisplayNameRequest { 20 | string username = 1; 21 | string display_name = 2; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/protobuf_delta.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.protobuf_deltas.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message Delta { 12 | required Type type = 1; 13 | enum Type { 14 | DELETE = 0; 15 | INSERT = 1; 16 | } 17 | 18 | required uint32 index = 2; 19 | required uint32 length = 3; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/pubsub.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | message Subscription { 4 | optional string uri = 0x1; 5 | optional int32 expiry = 0x2; 6 | optional int32 status_code = 0x3; 7 | } 8 | 9 | -------------------------------------------------------------------------------- /protocol/proto/queue.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.transfer; 6 | 7 | import "context_track.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message Queue { 12 | repeated ContextTrack tracks = 1; 13 | optional bool is_playing_queue = 2; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/rate_limited_events.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RateLimitedEventsEntity { 10 | int32 file_format_version = 1; 11 | map map_field = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/recently_played.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.recently_played.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Item { 10 | string uri = 1; 11 | int64 timestamp = 2; 12 | bool hidden = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/recently_played_backend.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.recently_played_backend.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Context { 10 | optional string uri = 1; 11 | optional int64 lastPlayedTime = 2; 12 | } 13 | 14 | message RecentlyPlayed { 15 | repeated Context contexts = 1; 16 | optional int32 offset = 2; 17 | optional int32 total = 3; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/record_id.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RecordId { 10 | uint64 value = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/remote.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.shuffle.remote; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ServiceRequest { 10 | repeated Track tracks = 1; 11 | message Track { 12 | required string uri = 1; 13 | required string uid = 2; 14 | } 15 | } 16 | 17 | message ServiceResponse { 18 | repeated uint32 order = 1; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/repeating_track_node.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "track_instance.proto"; 8 | import "track_instantiator.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message RepeatingTrackNode { 13 | optional TrackInstance instance = 1; 14 | optional TrackInstantiator instantiator = 2; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/request_failure.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.image.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RequestFailure { 10 | optional string request = 1; 11 | optional string source = 2; 12 | optional string error = 3; 13 | optional int64 result = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/resource_type.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.offline.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | enum ResourceType { 10 | OTHER = 0; 11 | AUDIO = 1; 12 | DRM = 2; 13 | IMAGE = 3; 14 | VIDEO = 4; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/response_status.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist_esperanto.proto; 6 | 7 | option objc_class_prefix = "SPTPlaylistEsperanto"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "spotify.playlist.esperanto.proto"; 11 | 12 | message ResponseStatus { 13 | int32 status_code = 1; 14 | string reason = 2; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/resume_points_node.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify_shows.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ResumePointsNode { 10 | optional int64 resume_point = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/seek_to_position.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message SeekToPosition { 10 | optional uint64 value = 1; 11 | optional uint32 revision = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/sequence_number_entity.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.event_sender.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message SequenceNumberEntity { 10 | uint32 file_format_version = 1; 11 | string event_name = 2; 12 | bytes sequence_id = 3; 13 | uint64 sequence_number_next = 4; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/session.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.transfer; 6 | 7 | import "context.proto"; 8 | import "context_player_options.proto"; 9 | import "play_origin.proto"; 10 | import "suppressions.proto"; 11 | import "instrumentation_params.proto"; 12 | 13 | option optimize_for = CODE_SIZE; 14 | 15 | message Session { 16 | optional PlayOrigin play_origin = 1; 17 | optional Context context = 2; 18 | optional string current_uid = 3; 19 | optional ContextPlayerOptionOverrides option_overrides = 4; 20 | optional Suppressions suppressions = 5; 21 | optional InstrumentationParams instrumentation_params = 6; 22 | optional string shuffle_seed = 7; 23 | optional Context main_context = 8; 24 | optional string original_session_id = 9; 25 | } 26 | -------------------------------------------------------------------------------- /protocol/proto/set_member_permission_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | import "playlist_permission.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "com.spotify.playlist.proto"; 12 | 13 | message SetMemberPermissionRequest { 14 | optional string playlist_uri = 1; 15 | optional string username = 2; 16 | optional playlist_permission.proto.PermissionLevel permission_level = 3; 17 | optional uint32 timeout_ms = 4; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/show_episode_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.show_cosmos.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message EpisodeCollectionState { 10 | optional bool is_following_show = 1; 11 | optional bool is_new = 2; 12 | optional bool is_in_listen_later = 3; 13 | } 14 | 15 | message EpisodeOfflineState { 16 | optional string offline_state = 1; 17 | optional uint32 sync_progress = 2; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/show_offline_state.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package spotify.show_cosmos.proto; 4 | 5 | message ShowOfflineState { 6 | optional string offline_state = 1; 7 | optional uint32 sync_progress = 2; 8 | } 9 | 10 | -------------------------------------------------------------------------------- /protocol/proto/show_show_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.show_cosmos.proto; 6 | 7 | option objc_class_prefix = "SPTShowCosmos"; 8 | option optimize_for = CODE_SIZE; 9 | 10 | message ShowCollectionState { 11 | optional bool is_in_collection = 1; 12 | } 13 | 14 | -------------------------------------------------------------------------------- /protocol/proto/signal-model.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist.signal.proto; 6 | 7 | option java_package = "com.spotify.playlist_signal.model.proto"; 8 | option java_outer_classname = "SignalModelProto"; 9 | option optimize_for = CODE_SIZE; 10 | 11 | message Signal { 12 | string identifier = 1; 13 | bytes data = 2; 14 | bytes client_payload = 3; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /protocol/proto/skip_to_track.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message SkipToTrack { 10 | optional string page_url = 1; 11 | optional uint64 page_index = 2; 12 | optional string track_uid = 3; 13 | optional string track_uri = 4; 14 | optional uint64 track_index = 5; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/socialgraph_response_status.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.socialgraph_esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "spotify.socialgraph.esperanto.proto"; 11 | 12 | message ResponseStatus { 13 | int32 status_code = 1; 14 | string reason = 2; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/spotify/audiobookcashier/v1/audiobook_price.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package spotify.audiobookcashier.v1; 4 | 5 | option java_package = "com.spotify.audiobookcashier.v1"; 6 | option java_multiple_files = true; 7 | 8 | message Price { 9 | double amount = 1; 10 | string currency = 2; 11 | string formatted_price = 3; 12 | } 13 | 14 | message AudiobookPrice { 15 | .spotify.audiobookcashier.v1.Price final_price = 1; 16 | .spotify.audiobookcashier.v1.Price final_list_price = 2; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /protocol/proto/spotify/login5/v3/challenges/code.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.33.569 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.login5.v3.challenges; 6 | 7 | option objc_class_prefix = "SPTLogin5"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.login5.v3.challenges.proto"; 11 | 12 | message CodeChallenge { 13 | Method method = 1; 14 | enum Method { 15 | UNKNOWN = 0; 16 | SMS = 1; 17 | } 18 | 19 | int32 code_length = 2; 20 | int32 expires_in = 3; 21 | string canonical_phone_number = 4; 22 | } 23 | 24 | message CodeSolution { 25 | string code = 1; 26 | } 27 | -------------------------------------------------------------------------------- /protocol/proto/spotify/login5/v3/challenges/hashcash.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.33.569 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.login5.v3.challenges; 6 | 7 | import "google/protobuf/duration.proto"; 8 | 9 | option objc_class_prefix = "SPTLogin5"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | option java_package = "com.spotify.login5.v3.challenges.proto"; 13 | 14 | message HashcashChallenge { 15 | bytes prefix = 1; 16 | int32 length = 2; 17 | } 18 | 19 | message HashcashSolution { 20 | bytes suffix = 1; 21 | google.protobuf.Duration duration = 2; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/spotify/login5/v3/client_info.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.33.569 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.login5.v3; 6 | 7 | option objc_class_prefix = "SPTLogin5"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.login5.v3.proto"; 11 | 12 | message ClientInfo { 13 | string client_id = 1; 14 | string device_id = 2; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/spotify/login5/v3/identifiers/identifiers.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.33.569 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.login5.v3.identifiers; 6 | 7 | option objc_class_prefix = "SPTLogin5"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.login5.v3.identifiers.proto"; 11 | 12 | message PhoneNumber { 13 | string number = 1; 14 | string iso_country_code = 2; 15 | string country_calling_code = 3; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/spotify/login5/v3/user_info.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.33.569 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.login5.v3; 6 | 7 | option objc_class_prefix = "SPTLogin5"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.login5.v3.proto"; 11 | 12 | message UserInfo { 13 | string name = 1; 14 | string email = 2; 15 | bool email_verified = 3; 16 | string birthdate = 4; 17 | 18 | Gender gender = 5; 19 | enum Gender { 20 | UNKNOWN = 0; 21 | MALE = 1; 22 | FEMALE = 2; 23 | NEUTRAL = 3; 24 | } 25 | 26 | string phone_number = 6; 27 | bool phone_number_verified = 7; 28 | bool email_already_registered = 8; 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/ads_rules_inject_tracks.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | import "state_restore/provided_track.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message AdsRulesInjectTracks { 12 | repeated ProvidedTrack ads = 1; 13 | optional bool is_playing_slot = 2; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/automix_rules.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package spotify.player.proto.state_restore; 4 | 5 | message AutomixRules { 6 | required bool automix = 1; 7 | required string current_track_uri = 2; 8 | } 9 | 10 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/automix_talk_rules.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package spotify.player.proto.state_restore; 4 | 5 | import "state_restore/provided_track.proto"; 6 | 7 | message AutomixTalkRules { 8 | optional ProvidedTrack current_track = 1; 9 | optional int64 narration_duration = 2; 10 | } 11 | 12 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/behavior_metadata_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message BehaviorMetadataRules { 10 | repeated string page_instance_ids = 1; 11 | repeated string interaction_ids = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/circuit_breaker_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message CircuitBreakerRules { 10 | repeated string discarded_track_uids = 1; 11 | required int32 num_errored_tracks = 2; 12 | required bool context_track_played = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/context_loader.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package spotify.player.proto.state_restore; 4 | 5 | import "context.proto"; 6 | 7 | message ContextLoader { 8 | required Context context = 1; 9 | } 10 | 11 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/explicit_content_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ExplicitContentRules { 10 | required bool filter_explicit_content = 1; 11 | required bool filter_age_restricted_content = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/explicit_request_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ExplicitRequestRules { 10 | required bool always_play_something = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/kitteh_box_rules.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package spotify.player.proto.state_restore; 4 | 5 | message KittehBoxRules { 6 | message NodeAspectsEntry { 7 | optional string key = 1; 8 | optional bytes value = 2; 9 | } 10 | 11 | enum Transition { 12 | ADVANCE = 0; 13 | SKIP_NEXT = 1; 14 | SKIP_PREV = 2; 15 | } 16 | 17 | enum Position { 18 | BETWEEN_TRACKS = 0; 19 | ON_DELIMITER = 1; 20 | ON_NODE_TRACK = 2; 21 | } 22 | 23 | repeated KittehBoxRules.NodeAspectsEntry node_aspects = 1; 24 | required KittehBoxRules.Position pos = 2; 25 | required KittehBoxRules.Transition last_transition = 3; 26 | required int32 context_iteration = 4; 27 | required bool pending_skip_to = 5; 28 | optional int64 page_index = 6; 29 | } 30 | 31 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/mft_context_history.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | import "context_track.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message MftContextHistoryEntry { 12 | required ContextTrack track = 1; 13 | required int64 timestamp = 2; 14 | optional int64 position = 3; 15 | } 16 | 17 | message MftContextHistory { 18 | map lookup = 1; 19 | } 20 | 21 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/mft_context_switch_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message MftContextSwitchRules { 10 | required bool has_played_track = 1; 11 | required bool enabled = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/mft_fallback_page_history.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ContextAndPage { 10 | required string context_uri = 1; 11 | required string fallback_page_url = 2; 12 | } 13 | 14 | message MftFallbackPageHistory { 15 | repeated ContextAndPage context_to_fallback_page = 1; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/mft_rules_core.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | import "state_restore/mft_context_switch_rules.proto"; 8 | import "state_restore/mft_rules_inject_filler_tracks.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message MftRulesCore { 13 | required MftRulesInjectFillerTracks inject_filler_tracks = 1; 14 | required MftContextSwitchRules context_switch_rules = 2; 15 | repeated string feature_classes = 3; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/mft_rules_inject_filler_tracks.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | import "context_track.proto"; 8 | import "state_restore/random_source.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message MftRandomTrackInjection { 13 | required RandomSource random_source = 1; 14 | required int32 offset = 2; 15 | } 16 | 17 | message MftRulesInjectFillerTracks { 18 | repeated ContextTrack fallback_tracks = 1; 19 | required MftRandomTrackInjection padding_track_injection = 2; 20 | required RandomSource random_source = 3; 21 | required bool filter_explicit_content = 4; 22 | repeated string feature_classes = 5; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/mft_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message EventList { 10 | repeated uint64 event_times = 1; 11 | } 12 | 13 | message LastEvent { 14 | required string uri = 1; 15 | required uint64 when = 2; 16 | } 17 | 18 | message History { 19 | map when = 1; 20 | required LastEvent last = 2; 21 | } 22 | 23 | message MftState { 24 | required History track = 1; 25 | required History social_track = 2; 26 | required History album = 3; 27 | required History artist = 4; 28 | optional EventList skip = 5; 29 | required uint64 time = 6; 30 | required bool did_skip = 7; 31 | } 32 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/mod_interruption_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | import "context_track.proto"; 8 | import "state_restore/provided_track.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message StoredInterruption { 13 | required ContextTrack context_track = 1; 14 | required int64 fetched_at = 2; 15 | } 16 | 17 | message ModInterruptionState { 18 | optional string context_uri = 1; 19 | optional ProvidedTrack last_track = 2; 20 | map active_play_count = 3; 21 | repeated StoredInterruption active_play_interruptions = 4; 22 | repeated StoredInterruption repeat_play_interruptions = 5; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/music_injection_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message InjectionSegment { 10 | required string track_uri = 1; 11 | optional int64 start = 2; 12 | optional int64 stop = 3; 13 | required int64 duration = 4; 14 | } 15 | 16 | message InjectionModel { 17 | optional string episode_uri = 1; 18 | optional int64 total_duration = 2; 19 | repeated InjectionSegment segments = 3; 20 | } 21 | 22 | message MusicInjectionRules { 23 | optional InjectionModel injection_model = 1; 24 | optional bytes playback_id = 2; 25 | } 26 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/playback_state.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package spotify.player.proto.state_restore; 4 | 5 | import "state_restore/playback_quality.proto"; 6 | 7 | message PlaybackState { 8 | optional int64 timestamp = 1; 9 | optional int32 position_as_of_timestamp = 2; 10 | optional int32 duration = 3; 11 | optional bool is_buffering = 4; 12 | optional PlaybackQuality playback_quality = 5; 13 | optional double playback_speed = 6; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/player_session_fake.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto2"; 2 | 3 | package spotify.player.proto.state_restore; 4 | 5 | import "context.proto"; 6 | import "state_restore/context_player_state.proto"; 7 | 8 | message PlayerSessionFake { 9 | required ContextPlayerState player_state = 1; 10 | required Context player_context = 2; 11 | required bool is_finished = 3; 12 | } 13 | 14 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/player_session_queue.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | import "state_restore/player_session.proto"; 6 | 7 | package spotify.player.proto.state_restore; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message QueuedSession { 12 | enum Trigger { 13 | DID_GO_PAST_TRACK = 1; 14 | DID_GO_PAST_CONTEXT = 2; 15 | } 16 | 17 | optional QueuedSession.Trigger trigger = 1; 18 | optional PlayerSession session = 2; 19 | } 20 | 21 | message PlayerSessionQueue { 22 | optional PlayerSession active = 1; 23 | repeated PlayerSession pushed = 2; 24 | repeated QueuedSession queued = 3; 25 | } 26 | 27 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/provided_track.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | import "restrictions.proto"; 8 | 9 | option optimize_for = CODE_SIZE; 10 | 11 | message ProvidedTrack { 12 | optional string uid = 1; 13 | optional string uri = 2; 14 | map metadata = 3; 15 | optional string provider = 4; 16 | repeated string removed = 5; 17 | repeated string blocked = 6; 18 | map internal_metadata = 7; 19 | optional Restrictions restrictions = 8; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/random_source.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message RandomSource { 10 | required uint64 random_0 = 1; 11 | required uint64 random_1 = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/remove_banned_tracks_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Strings { 10 | repeated string strings = 1; 11 | } 12 | 13 | message RemoveBannedTracksRules { 14 | repeated string banned_tracks = 1; 15 | repeated string banned_albums = 2; 16 | repeated string banned_artists = 3; 17 | map banned_context_tracks = 4; 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/resume_points_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message ResumePoint { 10 | required bool is_fully_played = 1; 11 | required int64 position = 2; 12 | required int64 timestamp = 3; 13 | } 14 | 15 | message ResumePointsRules { 16 | map resume_points = 1; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/state_restore/track_error_rules.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.state_restore; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message TrackErrorRules { 10 | repeated string reasons = 1; 11 | required int32 num_attempted_tracks = 2; 12 | required int32 num_failed_tracks = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/status.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.collection_cosmos.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Status { 10 | int32 code = 1; 11 | string reason = 2; 12 | } 13 | -------------------------------------------------------------------------------- /protocol/proto/status_code.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 9 | 10 | enum StatusCode { 11 | INVALID_STATUS_CODE = 0; 12 | SUCCESS = 1; 13 | EVENT_SENDER_ERROR = 2; 14 | INVALID_STREAM_HANDLE = 3; 15 | PENDING_EVENTS_ERROR = 4; 16 | IGNORED = 5; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/status_response.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | import "status_code.proto"; 8 | 9 | option objc_class_prefix = "ESP"; 10 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 11 | 12 | message StatusResponse { 13 | StatusCode status_code = 1; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/storage-resolve.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.download.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message StorageResolveResponse { 10 | Result result = 1; 11 | enum Result { 12 | CDN = 0; 13 | STORAGE = 1; 14 | RESTRICTED = 3; 15 | } 16 | 17 | repeated string cdnurl = 2; 18 | bytes fileid = 4; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/proto/storage_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.storage_cosmos.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message GetFileCacheRangesResponse { 10 | bool byte_size_known = 1; 11 | uint64 byte_size = 2; 12 | 13 | repeated Range ranges = 3; 14 | message Range { 15 | uint64 from_byte = 1; 16 | uint64 to_byte = 2; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /protocol/proto/storylines.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.storylines.v1; 6 | 7 | option java_multiple_files = true; 8 | option java_outer_classname = "StorylinesProto"; 9 | option java_package = "com.spotify.storylines.v1.extended_metadata"; 10 | 11 | message Artist { 12 | string uri = 1; 13 | string name = 2; 14 | string avatar_cdn_url = 3; 15 | } 16 | 17 | message Card { 18 | string id = 1; 19 | string image_cdn_url = 2; 20 | int32 image_width = 3; 21 | int32 image_height = 4; 22 | } 23 | 24 | message Storyline { 25 | string id = 1; 26 | string entity_uri = 2; 27 | Artist artist = 3; 28 | repeated Card cards = 4; 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/stream_end_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | import "stream_handle.proto"; 8 | import "play_reason.proto"; 9 | import "media_format.proto"; 10 | 11 | option objc_class_prefix = "ESP"; 12 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 13 | 14 | message StreamEndRequest { 15 | StreamHandle stream_handle = 1; 16 | string source_end = 2; 17 | PlayReason reason_end = 3; 18 | google.protobuf.Timestamp client_timestamp = 5; 19 | optional AudioFormat format = 4; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/stream_handle.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 9 | 10 | message StreamHandle { 11 | reserved 1; 12 | uint32 raw_handle = 2; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/stream_seek_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | import "google/protobuf/timestamp.proto"; 8 | import "stream_handle.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 12 | 13 | message StreamSeekRequest { 14 | reserved 2; 15 | StreamHandle stream_handle = 1; 16 | uint64 from_position = 3; 17 | uint64 to_position = 4; 18 | google.protobuf.Timestamp client_timestamp = 5; 19 | optional bool is_system_initiated = 6; 20 | } 21 | -------------------------------------------------------------------------------- /protocol/proto/stream_start_response.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | import "status_response.proto"; 8 | import "stream_handle.proto"; 9 | 10 | option objc_class_prefix = "ESP"; 11 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 12 | 13 | message StreamStartResponse { 14 | StatusResponse status = 1; 15 | StreamHandle stream_handle = 2; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/streaming_rule.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.stream_reporting_esperanto.proto; 6 | 7 | option objc_class_prefix = "ESP"; 8 | option java_package = "com.spotify.stream_reporting_esperanto.proto"; 9 | 10 | enum StreamingRule { 11 | STREAMING_RULE_NONE = 0; 12 | STREAMING_RULE_DMCA_RADIO = 1; 13 | STREAMING_RULE_PREVIEW = 2; 14 | STREAMING_RULE_WIFI = 3; 15 | STREAMING_RULE_SHUFFLE_MODE = 4; 16 | STREAMING_RULE_TABLET_FREE = 5; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/suppressions.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message Suppressions { 10 | repeated string providers = 1; 11 | } 12 | -------------------------------------------------------------------------------- /protocol/proto/sync/album_sync_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message AlbumSyncState { 12 | optional string offline = 1; 13 | optional string inferred_offline = 2; 14 | optional uint32 sync_progress = 3; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/sync/artist_sync_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message ArtistSyncState { 12 | optional string offline = 1; 13 | optional string inferred_offline = 2; 14 | optional uint32 sync_progress = 3; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/sync/episode_sync_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message EpisodeSyncState { 12 | optional string offline_state = 1; 13 | optional uint32 sync_progress = 2; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/sync/track_sync_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.cosmos_util.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "com.spotify.cosmos.util.proto"; 10 | 11 | message TrackSyncState { 12 | optional string offline = 1; 13 | optional uint32 sync_progress = 2; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/sync_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.playlist.cosmos.proto; 6 | 7 | option objc_class_prefix = "SPTPlaylist"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_package = "com.spotify.playlist.proto"; 11 | 12 | message SyncRequest { 13 | repeated string playlist_uris = 1; 14 | } 15 | -------------------------------------------------------------------------------- /protocol/proto/techu_core_exercise_cosmos.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.techu_core_exercise_cosmos.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message TechUCoreExerciseRequest { 10 | string a = 1; 11 | string b = 2; 12 | } 13 | 14 | message TechUCoreExerciseResponse { 15 | string concatenated = 1; 16 | } 17 | -------------------------------------------------------------------------------- /protocol/proto/track_instance.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "context_index.proto"; 8 | import "context_track.proto"; 9 | import "seek_to_position.proto"; 10 | 11 | option optimize_for = CODE_SIZE; 12 | 13 | message TrackInstance { 14 | reserved 3; 15 | optional ContextTrack track = 1; 16 | optional uint64 id = 2; 17 | optional SeekToPosition seek_to_position = 7; 18 | optional bool initially_paused = 4; 19 | optional ContextIndex index = 5; 20 | optional string provider = 6; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/track_instantiator.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message TrackInstantiator { 10 | optional uint64 unique = 1; 11 | optional uint64 count = 2; 12 | optional string provider = 3; 13 | } 14 | -------------------------------------------------------------------------------- /protocol/proto/transcripts.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.corex.transcripts.metadata; 6 | 7 | option objc_class_prefix = "SPT"; 8 | option java_multiple_files = true; 9 | option optimize_for = CODE_SIZE; 10 | option java_outer_classname = "TranscriptMetadataProto"; 11 | option java_package = "com.spotify.corex.transcripts.metadata.proto"; 12 | 13 | message EpisodeTranscript { 14 | string episode_uri = 1; 15 | repeated Transcript transcripts = 2; 16 | } 17 | 18 | message Transcript { 19 | string uri = 1; 20 | string language = 2; 21 | bool curated = 3; 22 | string cdn_url = 4; 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/transfer_node.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.61.583 (Windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto; 6 | 7 | import "track_instance.proto"; 8 | import "track_instantiator.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message TransferNode { 13 | optional TrackInstance instance = 1; 14 | optional TrackInstantiator instantiator = 2; 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/transfer_state.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto2"; 4 | 5 | package spotify.player.proto.transfer; 6 | 7 | import "context_player_options.proto"; 8 | import "playback.proto"; 9 | import "play_history.proto"; 10 | import "session.proto"; 11 | import "queue.proto"; 12 | 13 | option optimize_for = CODE_SIZE; 14 | 15 | message TransferState { 16 | optional ContextPlayerOptions options = 1; 17 | optional Playback playback = 2; 18 | optional Session current_session = 3; 19 | optional Queue queue = 4; 20 | optional PlayHistory play_history = 5; 21 | } 22 | -------------------------------------------------------------------------------- /protocol/proto/user_attributes.proto: -------------------------------------------------------------------------------- 1 | // Custom protobuf crafted from spotify:user:attributes:mutated response: 2 | // 3 | // 1 { 4 | // 1: "filter-explicit-content" 5 | // } 6 | // 2 { 7 | // 1: 1639087299 8 | // 2: 418909000 9 | // } 10 | 11 | syntax = "proto3"; 12 | 13 | package spotify.user_attributes.proto; 14 | 15 | option optimize_for = CODE_SIZE; 16 | 17 | message UserAttributesMutation { 18 | repeated MutatedField fields = 1; 19 | MutationCommand cmd = 2; 20 | } 21 | 22 | message MutatedField { 23 | string name = 1; 24 | } 25 | 26 | message MutationCommand { 27 | int64 timestamp = 1; 28 | int32 unknown = 2; 29 | } 30 | -------------------------------------------------------------------------------- /protocol/proto/useraccount.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.remote_config.ucs.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message AccountAttribute { 10 | oneof value { 11 | bool bool_value = 2; 12 | int64 long_value = 3; 13 | string string_value = 4; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /protocol/proto/your_library_contains_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.your_library.proto; 6 | 7 | import "your_library_config.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "spotify.your_library.esperanto.proto"; 12 | 13 | message YourLibraryContainsRequest { 14 | repeated string requested_uri = 3; 15 | YourLibraryPseudoPlaylistConfig pseudo_playlist_config = 4; 16 | int32 update_throttling = 5; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/your_library_contains_response.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.your_library.proto; 6 | 7 | option java_multiple_files = true; 8 | option optimize_for = CODE_SIZE; 9 | option java_package = "spotify.your_library.esperanto.proto"; 10 | 11 | message YourLibraryContainsResponseHeader { 12 | bool is_loading = 2; 13 | } 14 | 15 | message YourLibraryContainsResponseEntity { 16 | string uri = 1; 17 | bool is_in_library = 2; 18 | } 19 | 20 | message YourLibraryContainsResponse { 21 | YourLibraryContainsResponseHeader header = 1; 22 | repeated YourLibraryContainsResponseEntity entity = 2; 23 | uint32 status_code = 98; 24 | string error = 99; 25 | } 26 | -------------------------------------------------------------------------------- /protocol/proto/your_library_decorate_request.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.your_library.proto; 6 | 7 | import "your_library_config.proto"; 8 | 9 | option java_package = "spotify.your_library.esperanto.proto"; 10 | option java_multiple_files = true; 11 | option optimize_for = CODE_SIZE; 12 | 13 | message YourLibraryDecorateRequest { 14 | repeated string requested_uri = 3; 15 | YourLibraryPseudoPlaylistConfig pseudo_playlist_config = 6; 16 | int32 update_throttling = 7; 17 | } 18 | -------------------------------------------------------------------------------- /protocol/proto/your_library_decorate_response.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.your_library.proto; 6 | 7 | import "your_library_decorated_entity.proto"; 8 | 9 | option java_multiple_files = true; 10 | option optimize_for = CODE_SIZE; 11 | option java_package = "spotify.your_library.esperanto.proto"; 12 | 13 | message YourLibraryDecorateResponseHeader { 14 | bool is_loading = 2; 15 | } 16 | 17 | message YourLibraryDecorateResponse { 18 | YourLibraryDecorateResponseHeader header = 1; 19 | repeated YourLibraryDecoratedEntity entity = 2; 20 | uint32 status_code = 98; 21 | string error = 99; 22 | } 23 | -------------------------------------------------------------------------------- /protocol/proto/your_library_entity.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.2.52.442 (windows) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.your_library.proto; 6 | 7 | import "your_library_index.proto"; 8 | import "collection_index.proto"; 9 | 10 | option optimize_for = CODE_SIZE; 11 | 12 | message YourLibraryEntity { 13 | oneof entity { 14 | collection.proto.CollectionAlbumEntry album = 1; 15 | collection.proto.CollectionArtistEntry artist = 2; 16 | YourLibraryRootlistEntity rootlist_entity = 3; 17 | collection.proto.CollectionShowEntry show = 4; 18 | collection.proto.CollectionBookEntry book = 5; 19 | YourLibraryPreReleaseEntity prerelease = 6; 20 | YourLibraryEventEntity event = 7; 21 | collection.proto.CollectionAuthorEntry author = 9; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /protocol/proto/your_library_pseudo_playlist_config.proto: -------------------------------------------------------------------------------- 1 | // Extracted from: Spotify 1.1.73.517 (macOS) 2 | 3 | syntax = "proto3"; 4 | 5 | package spotify.your_library.proto; 6 | 7 | option optimize_for = CODE_SIZE; 8 | 9 | message YourLibraryLabelAndImage { 10 | string label = 1; 11 | string image = 2; 12 | } 13 | 14 | message YourLibraryPseudoPlaylistConfig { 15 | YourLibraryLabelAndImage liked_songs = 1; 16 | YourLibraryLabelAndImage your_episodes = 2; 17 | YourLibraryLabelAndImage new_episodes = 3; 18 | YourLibraryLabelAndImage local_files = 4; 19 | } 20 | -------------------------------------------------------------------------------- /protocol/src/impl_trait.rs: -------------------------------------------------------------------------------- 1 | mod context; 2 | mod player; 3 | -------------------------------------------------------------------------------- /protocol/src/lib.rs: -------------------------------------------------------------------------------- 1 | // This file is parsed by build.rs 2 | // Each included module will be compiled from the matching .proto definition. 3 | 4 | mod impl_trait; 5 | 6 | include!(concat!(env!("OUT_DIR"), "/mod.rs")); 7 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | edition = "2021" 2 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![crate_name = "librespot"] 2 | 3 | pub use librespot_audio as audio; 4 | pub use librespot_connect as connect; 5 | pub use librespot_core as core; 6 | pub use librespot_discovery as discovery; 7 | pub use librespot_metadata as metadata; 8 | pub use librespot_oauth as oauth; 9 | pub use librespot_playback as playback; 10 | pub use librespot_protocol as protocol; 11 | --------------------------------------------------------------------------------