From 66c522421f387f3ca2e2a6dab7bffaa47d687a4a Mon Sep 17 00:00:00 2001 From: a Date: Wed, 11 Jan 2023 11:08:26 -0600 Subject: [PATCH] pb --- go.mod | 16 + go.sum | 20 + lib/jukebox/jukebox.go | 7 + lib/source/spotify/source.go | 4 + lib/spot/proto.go | 50 + lib/spot/proto/AdContext.proto | 19 + lib/spot/proto/AdDecisionEvent.proto | 13 + lib/spot/proto/AdError.proto | 15 + lib/spot/proto/AdEvent.proto | 28 + lib/spot/proto/AdRequestEvent.proto | 14 + lib/spot/proto/AdSlotEvent.proto | 19 + lib/spot/proto/AmazonWakeUpTime.proto | 11 + lib/spot/proto/AudioDriverError.proto | 14 + lib/spot/proto/AudioDriverInfo.proto | 14 + lib/spot/proto/AudioFileSelection.proto | 16 + .../proto/AudioOffliningSettingsReport.proto | 15 + lib/spot/proto/AudioRateLimit.proto | 18 + lib/spot/proto/AudioSessionEvent.proto | 13 + lib/spot/proto/AudioSettingsReport.proto | 30 + .../proto/AudioStreamingSettingsReport.proto | 16 + .../BoomboxPlaybackInstrumentation.proto | 18 + lib/spot/proto/BrokenObject.proto | 14 + lib/spot/proto/CacheError.proto | 19 + lib/spot/proto/CachePruningReport.proto | 25 + lib/spot/proto/CacheRealmPruningReport.proto | 23 + lib/spot/proto/CacheRealmReport.proto | 18 + lib/spot/proto/CacheReport.proto | 32 + lib/spot/proto/ClientLocale.proto | 12 + lib/spot/proto/ColdStartupSequence.proto | 19 + lib/spot/proto/CollectionLevelDbInfo.proto | 16 + ...ctionOfflineControllerEmptyTrackList.proto | 13 + lib/spot/proto/ConfigurationApplied.proto | 18 + lib/spot/proto/ConfigurationFetched.proto | 31 + .../proto/ConfigurationFetchedNonAuth.proto | 31 + .../proto/ConnectCredentialsRequest.proto | 12 + lib/spot/proto/ConnectDeviceDiscovered.proto | 22 + lib/spot/proto/ConnectDialError.proto | 15 + .../proto/ConnectMdnsPacketParseError.proto | 17 + lib/spot/proto/ConnectPullFailure.proto | 13 + lib/spot/proto/ConnectTransferResult.proto | 29 + lib/spot/proto/ConnectionError.proto | 13 + lib/spot/proto/ConnectionInfo.proto | 18 + lib/spot/proto/ConnectionStateChange.proto | 13 + .../proto/DefaultConfigurationApplied.proto | 17 + .../DesktopAuthenticationFailureNonAuth.proto | 13 + .../proto/DesktopAuthenticationSuccess.proto | 11 + lib/spot/proto/DesktopDeviceInformation.proto | 106 + .../proto/DesktopGPUAccelerationInfo.proto | 11 + lib/spot/proto/DesktopHighMemoryUsage.proto | 19 + lib/spot/proto/DesktopPerformanceIssue.proto | 88 + .../proto/DesktopUpdateDownloadComplete.proto | 15 + .../proto/DesktopUpdateDownloadError.proto | 15 + .../proto/DesktopUpdateMessageAction.proto | 18 + .../proto/DesktopUpdateMessageProcessed.proto | 16 + lib/spot/proto/DesktopUpdateResponse.proto | 15 + lib/spot/proto/Download.proto | 55 + lib/spot/proto/DrmRequestFailure.proto | 14 + lib/spot/proto/EndAd.proto | 34 + .../EventSenderInternalErrorNonAuth.proto | 14 + lib/spot/proto/EventSenderStats.proto | 13 + lib/spot/proto/EventSenderStats2NonAuth.proto | 23 + lib/spot/proto/ExternalDeviceInfo.proto | 20 + lib/spot/proto/GetInfoFailures.proto | 15 + lib/spot/proto/HeadFileDownload.proto | 27 + lib/spot/proto/LegacyEndSong.proto | 62 + lib/spot/proto/LocalFileSyncError.proto | 11 + lib/spot/proto/LocalFilesError.proto | 13 + lib/spot/proto/LocalFilesImport.proto | 16 + lib/spot/proto/LocalFilesReport.proto | 20 + lib/spot/proto/LocalFilesSourceReport.proto | 12 + lib/spot/proto/MdnsLoginFailures.proto | 16 + .../MetadataExtensionClientStatistic.proto | 20 + lib/spot/proto/Offline2ClientError.proto | 13 + lib/spot/proto/Offline2ClientEvent.proto | 13 + lib/spot/proto/OfflineError.proto | 12 + lib/spot/proto/OfflineEvent.proto | 12 + lib/spot/proto/OfflineReport.proto | 26 + lib/spot/proto/PlaybackError.proto | 19 + lib/spot/proto/PlaybackRetry.proto | 15 + lib/spot/proto/PlaybackSegments.proto | 14 + lib/spot/proto/PlayerStateRestore.proto | 14 + lib/spot/proto/PlaylistSyncEvent.proto | 15 + lib/spot/proto/PodcastAdSegmentReceived.proto | 14 + lib/spot/proto/Prefetch.proto | 17 + lib/spot/proto/PrefetchError.proto | 12 + .../proto/ProductStateUcsVerification.proto | 13 + lib/spot/proto/PubSubCountPerIdent.proto | 13 + lib/spot/proto/RawCoreStream.proto | 52 + lib/spot/proto/ReachabilityChanged.proto | 12 + .../proto/RejectedClientEventNonAuth.proto | 12 + lib/spot/proto/RemainingSkips.proto | 14 + lib/spot/proto/RequestAccounting.proto | 18 + lib/spot/proto/RequestTime.proto | 22 + lib/spot/proto/StartTrack.proto | 13 + lib/spot/proto/Stutter.proto | 19 + lib/spot/proto/TierFeatureFlags.proto | 18 + lib/spot/proto/TrackNotPlayed.proto | 24 + lib/spot/proto/TrackStuck.proto | 18 + lib/spot/proto/WindowSize.proto | 14 + lib/spot/proto/apiv1.proto | 108 + lib/spot/proto/app_state.proto | 17 + lib/spot/proto/audio_files_extension.proto | 27 + lib/spot/proto/authentication.pb.go | 2011 +++++++++ lib/spot/proto/authentication.proto | 167 + .../proto/autodownload_backend_service.proto | 53 + .../proto/autodownload_config_common.proto | 19 + .../autodownload_config_get_request.proto | 22 + .../autodownload_config_set_request.proto | 23 + lib/spot/proto/automix_mode.proto | 41 + lib/spot/proto/autoplay_context_request.proto | 12 + lib/spot/proto/autoplay_node.proto | 15 + lib/spot/proto/canvas.proto | 33 + lib/spot/proto/canvas_storage.proto | 19 + lib/spot/proto/canvaz-meta.proto | 17 + lib/spot/proto/canvaz.proto | 44 + lib/spot/proto/capping_data.proto | 30 + lib/spot/proto/claas.proto | 29 + lib/spot/proto/client-tts.proto | 30 + lib/spot/proto/client_config.proto | 13 + lib/spot/proto/client_update.proto | 39 + lib/spot/proto/clips_cover.proto | 16 + .../collection/album_collection_state.proto | 15 + .../collection/artist_collection_state.proto | 18 + .../collection/episode_collection_state.proto | 16 + .../collection/show_collection_state.proto | 13 + .../collection/track_collection_state.proto | 16 + lib/spot/proto/collection2v2.proto | 62 + .../collection_add_remove_items_request.proto | 17 + lib/spot/proto/collection_ban_request.proto | 19 + .../proto/collection_decoration_policy.proto | 38 + .../proto/collection_get_bans_request.proto | 33 + lib/spot/proto/collection_index.proto | 38 + lib/spot/proto/collection_item.proto | 48 + .../proto/collection_platform_requests.proto | 21 + .../proto/collection_platform_responses.proto | 24 + lib/spot/proto/concat_cosmos.proto | 22 + lib/spot/proto/connect.pb.go | 2863 +++++++++++++ lib/spot/proto/connect.proto | 240 ++ lib/spot/proto/connectivity.pb.go | 1006 +++++ lib/spot/proto/connectivity.proto | 79 + lib/spot/proto/contains_request.proto | 17 + .../proto/content_access_token_cosmos.proto | 36 + lib/spot/proto/context.proto | 19 + .../proto/context_application_desktop.proto | 12 + lib/spot/proto/context_client_id.proto | 11 + lib/spot/proto/context_device_desktop.proto | 15 + lib/spot/proto/context_index.proto | 12 + lib/spot/proto/context_installation_id.proto | 11 + lib/spot/proto/context_monotonic_clock.proto | 12 + lib/spot/proto/context_node.proto | 24 + lib/spot/proto/context_page.proto | 17 + lib/spot/proto/context_player_options.proto | 19 + lib/spot/proto/context_processor.proto | 19 + lib/spot/proto/context_sdk.proto | 12 + lib/spot/proto/context_time.proto | 11 + lib/spot/proto/context_track.proto | 14 + lib/spot/proto/context_view.proto | 18 + lib/spot/proto/context_view_cyclic_list.proto | 26 + lib/spot/proto/context_view_entry.proto | 25 + lib/spot/proto/context_view_entry_key.proto | 14 + lib/spot/proto/cosmos_changes_request.proto | 12 + lib/spot/proto/cosmos_decorate_request.proto | 71 + .../proto/cosmos_get_album_list_request.proto | 38 + .../cosmos_get_artist_list_request.proto | 38 + .../cosmos_get_episode_list_request.proto | 28 + .../proto/cosmos_get_show_list_request.proto | 31 + .../proto/cosmos_get_tags_info_request.proto | 12 + ...smos_get_track_list_metadata_request.proto | 15 + .../proto/cosmos_get_track_list_request.proto | 40 + ...cosmos_get_unplayed_episodes_request.proto | 28 + lib/spot/proto/cuepoints.proto | 23 + lib/spot/proto/decorate_request.proto | 54 + lib/spot/proto/devices.pb.go | 286 ++ lib/spot/proto/devices.proto | 36 + lib/spot/proto/display_segments.proto | 40 + .../proto/display_segments_extension.proto | 54 + lib/spot/proto/entity_extension_data.pb.go | 480 +++ lib/spot/proto/entity_extension_data.proto | 40 + lib/spot/proto/es_add_to_queue_request.proto | 19 + lib/spot/proto/es_command_options.proto | 16 + lib/spot/proto/es_context.proto | 21 + lib/spot/proto/es_context_page.proto | 19 + lib/spot/proto/es_context_player_error.proto | 55 + .../proto/es_context_player_options.proto | 23 + lib/spot/proto/es_context_player_state.proto | 82 + lib/spot/proto/es_context_track.proto | 15 + lib/spot/proto/es_delete_session.proto | 17 + lib/spot/proto/es_get_error_request.proto | 13 + lib/spot/proto/es_get_play_history.proto | 19 + lib/spot/proto/es_get_position_state.proto | 25 + lib/spot/proto/es_get_queue_request.proto | 13 + lib/spot/proto/es_get_state_request.proto | 16 + lib/spot/proto/es_ident.proto | 11 + lib/spot/proto/es_ident_filter.proto | 11 + lib/spot/proto/es_logging_params.proto | 18 + lib/spot/proto/es_optional.proto | 21 + lib/spot/proto/es_pause.proto | 17 + lib/spot/proto/es_play.proto | 28 + lib/spot/proto/es_play_options.proto | 32 + lib/spot/proto/es_play_origin.proto | 19 + lib/spot/proto/es_prefs.proto | 53 + lib/spot/proto/es_prepare_play.proto | 19 + lib/spot/proto/es_prepare_play_options.proto | 40 + lib/spot/proto/es_provided_track.proto | 18 + lib/spot/proto/es_pushed_message.proto | 15 + lib/spot/proto/es_queue.proto | 18 + lib/spot/proto/es_remote_config.proto | 21 + lib/spot/proto/es_request_info.proto | 27 + lib/spot/proto/es_response_with_reasons.proto | 21 + lib/spot/proto/es_restrictions.proto | 33 + lib/spot/proto/es_resume.proto | 17 + lib/spot/proto/es_seek_to.proto | 25 + lib/spot/proto/es_session_response.proto | 13 + lib/spot/proto/es_set_options.proto | 21 + lib/spot/proto/es_set_queue_request.proto | 21 + lib/spot/proto/es_set_repeating_context.proto | 18 + lib/spot/proto/es_set_repeating_track.proto | 18 + lib/spot/proto/es_set_shuffling_context.proto | 18 + lib/spot/proto/es_skip_next.proto | 19 + lib/spot/proto/es_skip_prev.proto | 20 + lib/spot/proto/es_skip_to_track.proto | 19 + lib/spot/proto/es_stop.proto | 25 + lib/spot/proto/es_storage.proto | 88 + lib/spot/proto/es_update.proto | 38 + lib/spot/proto/event_entity.proto | 18 + lib/spot/proto/explicit_content_pubsub.proto | 16 + lib/spot/proto/extended_metadata.pb.go | 801 ++++ lib/spot/proto/extended_metadata.proto | 63 + .../proto/extension_descriptor_type.proto | 30 + lib/spot/proto/extension_kind.pb.go | 298 ++ lib/spot/proto/extension_kind.proto | 55 + lib/spot/proto/extracted_colors.proto | 24 + lib/spot/proto/follow_request.proto | 21 + lib/spot/proto/followed_users_request.proto | 21 + lib/spot/proto/frecency.proto | 27 + lib/spot/proto/frecency_storage.proto | 25 + lib/spot/proto/gabito.proto | 36 + lib/spot/proto/generate.go | 16 + lib/spot/proto/global_node.proto | 16 + lib/spot/proto/google/protobuf/any.proto | 17 + .../proto/google/protobuf/descriptor.proto | 301 ++ lib/spot/proto/google/protobuf/duration.proto | 18 + lib/spot/proto/google/protobuf/empty.proto | 17 + .../proto/google/protobuf/field_mask.proto | 17 + .../google/protobuf/source_context.proto | 16 + .../proto/google/protobuf/timestamp.proto | 18 + lib/spot/proto/google/protobuf/type.proto | 91 + lib/spot/proto/google/protobuf/wrappers.proto | 49 + lib/spot/proto/greenroom_extension.proto | 29 + lib/spot/proto/identity.proto | 37 + lib/spot/proto/image-resolve.proto | 33 + lib/spot/proto/installation_data.proto | 18 + lib/spot/proto/instrumentation_params.proto | 12 + lib/spot/proto/keyexchange.proto | 245 ++ lib/spot/proto/lfs_secret_provider.proto | 11 + .../proto/liked_songs_tags_sync_state.proto | 12 + .../proto/listen_later_cosmos_response.proto | 28 + lib/spot/proto/local_bans_storage.proto | 17 + lib/spot/proto/local_sync_cosmos.proto | 16 + lib/spot/proto/local_sync_state.proto | 12 + lib/spot/proto/logging_params.proto | 14 + lib/spot/proto/mdata.proto | 43 + lib/spot/proto/mdata_cosmos.proto | 21 + lib/spot/proto/mdata_storage.proto | 38 + lib/spot/proto/media_format.proto | 32 + lib/spot/proto/media_manifest.proto | 58 + lib/spot/proto/media_type.proto | 13 + lib/spot/proto/media_type_node.proto | 13 + lib/spot/proto/members_request.proto | 18 + lib/spot/proto/members_response.proto | 35 + lib/spot/proto/mercury.proto | 46 + .../messages/discovery/force_discover.proto | 15 + .../messages/discovery/start_discovery.proto | 15 + lib/spot/proto/metadata.pb.go | 3749 ++++++++++++++++ lib/spot/proto/metadata.proto | 315 ++ lib/spot/proto/metadata/album_metadata.proto | 29 + lib/spot/proto/metadata/artist_metadata.proto | 18 + .../proto/metadata/episode_metadata.proto | 63 + lib/spot/proto/metadata/extension.proto | 16 + lib/spot/proto/metadata/image_group.proto | 16 + lib/spot/proto/metadata/show_metadata.proto | 31 + lib/spot/proto/metadata/track_metadata.proto | 55 + lib/spot/proto/metadata_cosmos.proto | 30 + lib/spot/proto/metadata_esperanto.proto | 24 + lib/spot/proto/modification_request.proto | 37 + lib/spot/proto/net-fortune.proto | 16 + lib/spot/proto/offline.proto | 83 + .../proto/offline_playlists_containing.proto | 19 + lib/spot/proto/on_demand_in_free_reason.proto | 14 + .../proto/on_demand_set_cosmos_request.proto | 19 + .../proto/on_demand_set_cosmos_response.proto | 14 + lib/spot/proto/on_demand_set_response.proto | 15 + lib/spot/proto/pending_event_entity.proto | 13 + lib/spot/proto/perf_metrics_service.proto | 20 + lib/spot/proto/pin_request.proto | 34 + lib/spot/proto/play_origin.proto | 17 + lib/spot/proto/play_queue_node.proto | 19 + lib/spot/proto/play_reason.proto | 32 + lib/spot/proto/playback.proto | 17 + lib/spot/proto/playback_cosmos.proto | 106 + lib/spot/proto/playback_esperanto.proto | 122 + lib/spot/proto/playback_platform.proto | 90 + lib/spot/proto/playback_segments.proto | 17 + lib/spot/proto/played_state.proto | 23 + .../played_state/episode_played_state.proto | 19 + .../playability_restriction.proto | 18 + .../played_state/show_played_state.proto | 14 + .../played_state/track_played_state.proto | 16 + lib/spot/proto/playedstate.proto | 40 + lib/spot/proto/player.pb.go | 2723 ++++++++++++ lib/spot/proto/player.proto | 212 + lib/spot/proto/player_license.proto | 11 + lib/spot/proto/player_model.proto | 29 + lib/spot/proto/playlist4_external.pb.go | 3762 +++++++++++++++++ lib/spot/proto/playlist4_external.proto | 293 ++ lib/spot/proto/playlist_annotate3.pb.go | 566 +++ lib/spot/proto/playlist_annotate3.proto | 42 + .../proto/playlist_contains_request.proto | 23 + lib/spot/proto/playlist_folder_state.proto | 19 + lib/spot/proto/playlist_get_request.proto | 26 + lib/spot/proto/playlist_members_request.proto | 19 + .../proto/playlist_modification_request.proto | 22 + lib/spot/proto/playlist_offline_request.proto | 29 + lib/spot/proto/playlist_permission.pb.go | 1466 +++++++ lib/spot/proto/playlist_permission.proto | 101 + lib/spot/proto/playlist_play_request.proto | 31 + .../proto/playlist_playback_request.proto | 13 + lib/spot/proto/playlist_playlist_state.proto | 52 + lib/spot/proto/playlist_query.proto | 63 + lib/spot/proto/playlist_request.proto | 91 + ...playlist_set_base_permission_request.proto | 23 + ...aylist_set_member_permission_request.proto | 16 + .../playlist_set_permission_request.proto | 20 + lib/spot/proto/playlist_track_state.proto | 21 + lib/spot/proto/playlist_user_state.proto | 18 + lib/spot/proto/plugin.proto | 141 + lib/spot/proto/podcast_ad_segments.proto | 34 + lib/spot/proto/podcast_cta_cards.proto | 9 + lib/spot/proto/podcast_paywalls_cosmos.proto | 15 + lib/spot/proto/podcast_poll.proto | 48 + lib/spot/proto/podcast_qna.proto | 33 + lib/spot/proto/podcast_ratings.proto | 32 + lib/spot/proto/podcast_segments.proto | 47 + .../podcast_segments_cosmos_request.proto | 37 + .../podcast_segments_cosmos_response.proto | 39 + lib/spot/proto/podcast_subscription.proto | 22 + lib/spot/proto/podcast_virality.proto | 15 + lib/spot/proto/podcastextensions.proto | 29 + .../policy/album_decoration_policy.proto | 33 + .../policy/artist_decoration_policy.proto | 31 + .../policy/episode_decoration_policy.proto | 64 + .../policy/folder_decoration_policy.proto | 21 + .../playlist_album_decoration_policy.proto | 17 + .../policy/playlist_decoration_policy.proto | 63 + .../playlist_episode_decoration_policy.proto | 25 + .../playlist_request_decoration_policy.proto | 19 + .../playlist_track_decoration_policy.proto | 31 + .../rootlist_folder_decoration_policy.proto | 17 + .../rootlist_playlist_decoration_policy.proto | 17 + .../rootlist_request_decoration_policy.proto | 20 + .../proto/policy/show_decoration_policy.proto | 35 + .../policy/track_decoration_policy.proto | 48 + .../proto/policy/user_decoration_policy.proto | 32 + lib/spot/proto/popcount2_external.proto | 30 + lib/spot/proto/prepare_play_options.proto | 37 + lib/spot/proto/profile_cosmos.proto | 22 + lib/spot/proto/profile_service.proto | 33 + lib/spot/proto/property_definition.proto | 44 + lib/spot/proto/protobuf_delta.proto | 20 + lib/spot/proto/pubsub.proto | 8 + lib/spot/proto/queue.proto | 14 + lib/spot/proto/rate_limited_events.proto | 12 + lib/spot/proto/rcs.proto | 107 + lib/spot/proto/recently_played.proto | 13 + lib/spot/proto/recently_played_backend.proto | 18 + lib/spot/proto/record_id.proto | 11 + lib/spot/proto/remote.proto | 19 + lib/spot/proto/repeating_track_node.proto | 15 + lib/spot/proto/request_failure.proto | 14 + lib/spot/proto/resolve.proto | 116 + lib/spot/proto/resource_type.proto | 15 + lib/spot/proto/response_status.proto | 15 + lib/spot/proto/restrictions.proto | 31 + lib/spot/proto/resume_points_node.proto | 11 + lib/spot/proto/rootlist_request.proto | 46 + lib/spot/proto/seek_to_position.proto | 12 + lib/spot/proto/sequence_number_entity.proto | 14 + lib/spot/proto/session.proto | 22 + .../proto/set_member_permission_request.proto | 18 + lib/spot/proto/show_access.proto | 50 + lib/spot/proto/show_episode_state.proto | 18 + lib/spot/proto/show_request.proto | 79 + lib/spot/proto/show_show_state.proto | 16 + lib/spot/proto/skip_to_track.proto | 15 + lib/spot/proto/social_connect_v2.proto | 77 + lib/spot/proto/social_service.proto | 52 + .../proto/socialgraph_response_status.proto | 15 + lib/spot/proto/socialgraphv2.proto | 45 + lib/spot/proto/spirc.proto | 133 + .../clienttoken/v0/clienttoken_http.pb.go | 1711 ++++++++ .../clienttoken/v0/clienttoken_http.proto | 127 + .../spotify/login5/v3/challenges/code.proto | 26 + .../login5/v3/challenges/hashcash.proto | 22 + .../proto/spotify/login5/v3/client_info.proto | 15 + .../login5/v3/credentials/credentials.proto | 53 + .../login5/v3/identifiers/identifiers.proto | 16 + lib/spot/proto/spotify/login5/v3/login5.proto | 94 + .../proto/spotify/login5/v3/user_info.proto | 29 + .../ads_rules_inject_tracks.proto | 14 + .../behavior_metadata_rules.proto | 12 + .../state_restore/circuit_breaker_rules.proto | 13 + .../state_restore/context_player_rules.proto | 16 + .../context_player_rules_base.proto | 33 + .../explicit_content_rules.proto | 12 + .../explicit_request_rules.proto | 11 + .../state_restore/mft_context_history.proto | 19 + .../mft_context_switch_rules.proto | 10 + .../mft_fallback_page_history.proto | 16 + lib/spot/proto/state_restore/mft_rules.proto | 38 + .../proto/state_restore/mft_rules_core.proto | 16 + .../mft_rules_inject_filler_tracks.proto | 23 + lib/spot/proto/state_restore/mft_state.proto | 31 + .../mod_interruption_state.proto | 23 + .../mod_rules_interruptions.proto | 27 + .../state_restore/music_injection_rules.proto | 25 + .../state_restore/player_session_queue.proto | 27 + .../proto/state_restore/provided_track.proto | 20 + .../proto/state_restore/random_source.proto | 12 + .../remove_banned_tracks_rules.proto | 18 + .../state_restore/resume_points_rules.proto | 17 + .../state_restore/track_error_rules.proto | 13 + lib/spot/proto/status.proto | 12 + lib/spot/proto/status_code.proto | 14 + lib/spot/proto/status_response.proto | 15 + lib/spot/proto/storage-resolve.pb.go | 226 + lib/spot/proto/storage-resolve.proto | 20 + lib/spot/proto/storage_cosmos.proto | 18 + lib/spot/proto/storylines.proto | 29 + lib/spot/proto/stream_end_request.proto | 19 + lib/spot/proto/stream_handle.proto | 12 + lib/spot/proto/stream_progress_request.proto | 22 + lib/spot/proto/stream_seek_request.proto | 16 + lib/spot/proto/stream_start_request.proto | 44 + lib/spot/proto/stream_start_response.proto | 16 + lib/spot/proto/streaming_rule.proto | 16 + lib/spot/proto/suppressions.proto | 11 + lib/spot/proto/sync/album_sync_state.proto | 15 + lib/spot/proto/sync/artist_sync_state.proto | 15 + lib/spot/proto/sync/episode_sync_state.proto | 14 + lib/spot/proto/sync/track_sync_state.proto | 14 + lib/spot/proto/sync_request.proto | 14 + .../proto/techu_core_exercise_cosmos.proto | 16 + lib/spot/proto/track_instance.proto | 22 + lib/spot/proto/track_instantiator.proto | 13 + lib/spot/proto/transcripts.proto | 23 + lib/spot/proto/transfer_node.proto | 15 + lib/spot/proto/transfer_state.proto | 19 + lib/spot/proto/tts-resolve.proto | 53 + lib/spot/proto/ucs.proto | 56 + .../proto/unfinished_episodes_request.proto | 26 + lib/spot/proto/user_attributes.pb.go | 308 ++ lib/spot/proto/user_attributes.proto | 30 + lib/spot/proto/useraccount.proto | 15 + .../proto/your_library_contains_request.proto | 14 + .../your_library_contains_response.proto | 22 + .../proto/your_library_decorate_request.proto | 14 + .../your_library_decorate_response.proto | 19 + .../proto/your_library_decorated_entity.proto | 105 + lib/spot/proto/your_library_entity.proto | 32 + lib/spot/proto/your_library_index.proto | 43 + .../your_library_pseudo_playlist_config.proto | 19 + lib/spot/proto/your_library_request.proto | 18 + lib/spot/proto/your_library_response.proto | 23 + 473 files changed, 36068 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 lib/jukebox/jukebox.go create mode 100644 lib/source/spotify/source.go create mode 100644 lib/spot/proto.go create mode 100644 lib/spot/proto/AdContext.proto create mode 100644 lib/spot/proto/AdDecisionEvent.proto create mode 100644 lib/spot/proto/AdError.proto create mode 100644 lib/spot/proto/AdEvent.proto create mode 100644 lib/spot/proto/AdRequestEvent.proto create mode 100644 lib/spot/proto/AdSlotEvent.proto create mode 100644 lib/spot/proto/AmazonWakeUpTime.proto create mode 100644 lib/spot/proto/AudioDriverError.proto create mode 100644 lib/spot/proto/AudioDriverInfo.proto create mode 100644 lib/spot/proto/AudioFileSelection.proto create mode 100644 lib/spot/proto/AudioOffliningSettingsReport.proto create mode 100644 lib/spot/proto/AudioRateLimit.proto create mode 100644 lib/spot/proto/AudioSessionEvent.proto create mode 100644 lib/spot/proto/AudioSettingsReport.proto create mode 100644 lib/spot/proto/AudioStreamingSettingsReport.proto create mode 100644 lib/spot/proto/BoomboxPlaybackInstrumentation.proto create mode 100644 lib/spot/proto/BrokenObject.proto create mode 100644 lib/spot/proto/CacheError.proto create mode 100644 lib/spot/proto/CachePruningReport.proto create mode 100644 lib/spot/proto/CacheRealmPruningReport.proto create mode 100644 lib/spot/proto/CacheRealmReport.proto create mode 100644 lib/spot/proto/CacheReport.proto create mode 100644 lib/spot/proto/ClientLocale.proto create mode 100644 lib/spot/proto/ColdStartupSequence.proto create mode 100644 lib/spot/proto/CollectionLevelDbInfo.proto create mode 100644 lib/spot/proto/CollectionOfflineControllerEmptyTrackList.proto create mode 100644 lib/spot/proto/ConfigurationApplied.proto create mode 100644 lib/spot/proto/ConfigurationFetched.proto create mode 100644 lib/spot/proto/ConfigurationFetchedNonAuth.proto create mode 100644 lib/spot/proto/ConnectCredentialsRequest.proto create mode 100644 lib/spot/proto/ConnectDeviceDiscovered.proto create mode 100644 lib/spot/proto/ConnectDialError.proto create mode 100644 lib/spot/proto/ConnectMdnsPacketParseError.proto create mode 100644 lib/spot/proto/ConnectPullFailure.proto create mode 100644 lib/spot/proto/ConnectTransferResult.proto create mode 100644 lib/spot/proto/ConnectionError.proto create mode 100644 lib/spot/proto/ConnectionInfo.proto create mode 100644 lib/spot/proto/ConnectionStateChange.proto create mode 100644 lib/spot/proto/DefaultConfigurationApplied.proto create mode 100644 lib/spot/proto/DesktopAuthenticationFailureNonAuth.proto create mode 100644 lib/spot/proto/DesktopAuthenticationSuccess.proto create mode 100644 lib/spot/proto/DesktopDeviceInformation.proto create mode 100644 lib/spot/proto/DesktopGPUAccelerationInfo.proto create mode 100644 lib/spot/proto/DesktopHighMemoryUsage.proto create mode 100644 lib/spot/proto/DesktopPerformanceIssue.proto create mode 100644 lib/spot/proto/DesktopUpdateDownloadComplete.proto create mode 100644 lib/spot/proto/DesktopUpdateDownloadError.proto create mode 100644 lib/spot/proto/DesktopUpdateMessageAction.proto create mode 100644 lib/spot/proto/DesktopUpdateMessageProcessed.proto create mode 100644 lib/spot/proto/DesktopUpdateResponse.proto create mode 100644 lib/spot/proto/Download.proto create mode 100644 lib/spot/proto/DrmRequestFailure.proto create mode 100644 lib/spot/proto/EndAd.proto create mode 100644 lib/spot/proto/EventSenderInternalErrorNonAuth.proto create mode 100644 lib/spot/proto/EventSenderStats.proto create mode 100644 lib/spot/proto/EventSenderStats2NonAuth.proto create mode 100644 lib/spot/proto/ExternalDeviceInfo.proto create mode 100644 lib/spot/proto/GetInfoFailures.proto create mode 100644 lib/spot/proto/HeadFileDownload.proto create mode 100644 lib/spot/proto/LegacyEndSong.proto create mode 100644 lib/spot/proto/LocalFileSyncError.proto create mode 100644 lib/spot/proto/LocalFilesError.proto create mode 100644 lib/spot/proto/LocalFilesImport.proto create mode 100644 lib/spot/proto/LocalFilesReport.proto create mode 100644 lib/spot/proto/LocalFilesSourceReport.proto create mode 100644 lib/spot/proto/MdnsLoginFailures.proto create mode 100644 lib/spot/proto/MetadataExtensionClientStatistic.proto create mode 100644 lib/spot/proto/Offline2ClientError.proto create mode 100644 lib/spot/proto/Offline2ClientEvent.proto create mode 100644 lib/spot/proto/OfflineError.proto create mode 100644 lib/spot/proto/OfflineEvent.proto create mode 100644 lib/spot/proto/OfflineReport.proto create mode 100644 lib/spot/proto/PlaybackError.proto create mode 100644 lib/spot/proto/PlaybackRetry.proto create mode 100644 lib/spot/proto/PlaybackSegments.proto create mode 100644 lib/spot/proto/PlayerStateRestore.proto create mode 100644 lib/spot/proto/PlaylistSyncEvent.proto create mode 100644 lib/spot/proto/PodcastAdSegmentReceived.proto create mode 100644 lib/spot/proto/Prefetch.proto create mode 100644 lib/spot/proto/PrefetchError.proto create mode 100644 lib/spot/proto/ProductStateUcsVerification.proto create mode 100644 lib/spot/proto/PubSubCountPerIdent.proto create mode 100644 lib/spot/proto/RawCoreStream.proto create mode 100644 lib/spot/proto/ReachabilityChanged.proto create mode 100644 lib/spot/proto/RejectedClientEventNonAuth.proto create mode 100644 lib/spot/proto/RemainingSkips.proto create mode 100644 lib/spot/proto/RequestAccounting.proto create mode 100644 lib/spot/proto/RequestTime.proto create mode 100644 lib/spot/proto/StartTrack.proto create mode 100644 lib/spot/proto/Stutter.proto create mode 100644 lib/spot/proto/TierFeatureFlags.proto create mode 100644 lib/spot/proto/TrackNotPlayed.proto create mode 100644 lib/spot/proto/TrackStuck.proto create mode 100644 lib/spot/proto/WindowSize.proto create mode 100644 lib/spot/proto/apiv1.proto create mode 100644 lib/spot/proto/app_state.proto create mode 100644 lib/spot/proto/audio_files_extension.proto create mode 100644 lib/spot/proto/authentication.pb.go create mode 100644 lib/spot/proto/authentication.proto create mode 100644 lib/spot/proto/autodownload_backend_service.proto create mode 100644 lib/spot/proto/autodownload_config_common.proto create mode 100644 lib/spot/proto/autodownload_config_get_request.proto create mode 100644 lib/spot/proto/autodownload_config_set_request.proto create mode 100644 lib/spot/proto/automix_mode.proto create mode 100644 lib/spot/proto/autoplay_context_request.proto create mode 100644 lib/spot/proto/autoplay_node.proto create mode 100644 lib/spot/proto/canvas.proto create mode 100644 lib/spot/proto/canvas_storage.proto create mode 100644 lib/spot/proto/canvaz-meta.proto create mode 100644 lib/spot/proto/canvaz.proto create mode 100644 lib/spot/proto/capping_data.proto create mode 100644 lib/spot/proto/claas.proto create mode 100644 lib/spot/proto/client-tts.proto create mode 100644 lib/spot/proto/client_config.proto create mode 100644 lib/spot/proto/client_update.proto create mode 100644 lib/spot/proto/clips_cover.proto create mode 100644 lib/spot/proto/collection/album_collection_state.proto create mode 100644 lib/spot/proto/collection/artist_collection_state.proto create mode 100644 lib/spot/proto/collection/episode_collection_state.proto create mode 100644 lib/spot/proto/collection/show_collection_state.proto create mode 100644 lib/spot/proto/collection/track_collection_state.proto create mode 100644 lib/spot/proto/collection2v2.proto create mode 100644 lib/spot/proto/collection_add_remove_items_request.proto create mode 100644 lib/spot/proto/collection_ban_request.proto create mode 100644 lib/spot/proto/collection_decoration_policy.proto create mode 100644 lib/spot/proto/collection_get_bans_request.proto create mode 100644 lib/spot/proto/collection_index.proto create mode 100644 lib/spot/proto/collection_item.proto create mode 100644 lib/spot/proto/collection_platform_requests.proto create mode 100644 lib/spot/proto/collection_platform_responses.proto create mode 100644 lib/spot/proto/concat_cosmos.proto create mode 100644 lib/spot/proto/connect.pb.go create mode 100644 lib/spot/proto/connect.proto create mode 100644 lib/spot/proto/connectivity.pb.go create mode 100644 lib/spot/proto/connectivity.proto create mode 100644 lib/spot/proto/contains_request.proto create mode 100644 lib/spot/proto/content_access_token_cosmos.proto create mode 100644 lib/spot/proto/context.proto create mode 100644 lib/spot/proto/context_application_desktop.proto create mode 100644 lib/spot/proto/context_client_id.proto create mode 100644 lib/spot/proto/context_device_desktop.proto create mode 100644 lib/spot/proto/context_index.proto create mode 100644 lib/spot/proto/context_installation_id.proto create mode 100644 lib/spot/proto/context_monotonic_clock.proto create mode 100644 lib/spot/proto/context_node.proto create mode 100644 lib/spot/proto/context_page.proto create mode 100644 lib/spot/proto/context_player_options.proto create mode 100644 lib/spot/proto/context_processor.proto create mode 100644 lib/spot/proto/context_sdk.proto create mode 100644 lib/spot/proto/context_time.proto create mode 100644 lib/spot/proto/context_track.proto create mode 100644 lib/spot/proto/context_view.proto create mode 100644 lib/spot/proto/context_view_cyclic_list.proto create mode 100644 lib/spot/proto/context_view_entry.proto create mode 100644 lib/spot/proto/context_view_entry_key.proto create mode 100644 lib/spot/proto/cosmos_changes_request.proto create mode 100644 lib/spot/proto/cosmos_decorate_request.proto create mode 100644 lib/spot/proto/cosmos_get_album_list_request.proto create mode 100644 lib/spot/proto/cosmos_get_artist_list_request.proto create mode 100644 lib/spot/proto/cosmos_get_episode_list_request.proto create mode 100644 lib/spot/proto/cosmos_get_show_list_request.proto create mode 100644 lib/spot/proto/cosmos_get_tags_info_request.proto create mode 100644 lib/spot/proto/cosmos_get_track_list_metadata_request.proto create mode 100644 lib/spot/proto/cosmos_get_track_list_request.proto create mode 100644 lib/spot/proto/cosmos_get_unplayed_episodes_request.proto create mode 100644 lib/spot/proto/cuepoints.proto create mode 100644 lib/spot/proto/decorate_request.proto create mode 100644 lib/spot/proto/devices.pb.go create mode 100644 lib/spot/proto/devices.proto create mode 100644 lib/spot/proto/display_segments.proto create mode 100644 lib/spot/proto/display_segments_extension.proto create mode 100644 lib/spot/proto/entity_extension_data.pb.go create mode 100644 lib/spot/proto/entity_extension_data.proto create mode 100644 lib/spot/proto/es_add_to_queue_request.proto create mode 100644 lib/spot/proto/es_command_options.proto create mode 100644 lib/spot/proto/es_context.proto create mode 100644 lib/spot/proto/es_context_page.proto create mode 100644 lib/spot/proto/es_context_player_error.proto create mode 100644 lib/spot/proto/es_context_player_options.proto create mode 100644 lib/spot/proto/es_context_player_state.proto create mode 100644 lib/spot/proto/es_context_track.proto create mode 100644 lib/spot/proto/es_delete_session.proto create mode 100644 lib/spot/proto/es_get_error_request.proto create mode 100644 lib/spot/proto/es_get_play_history.proto create mode 100644 lib/spot/proto/es_get_position_state.proto create mode 100644 lib/spot/proto/es_get_queue_request.proto create mode 100644 lib/spot/proto/es_get_state_request.proto create mode 100644 lib/spot/proto/es_ident.proto create mode 100644 lib/spot/proto/es_ident_filter.proto create mode 100644 lib/spot/proto/es_logging_params.proto create mode 100644 lib/spot/proto/es_optional.proto create mode 100644 lib/spot/proto/es_pause.proto create mode 100644 lib/spot/proto/es_play.proto create mode 100644 lib/spot/proto/es_play_options.proto create mode 100644 lib/spot/proto/es_play_origin.proto create mode 100644 lib/spot/proto/es_prefs.proto create mode 100644 lib/spot/proto/es_prepare_play.proto create mode 100644 lib/spot/proto/es_prepare_play_options.proto create mode 100644 lib/spot/proto/es_provided_track.proto create mode 100644 lib/spot/proto/es_pushed_message.proto create mode 100644 lib/spot/proto/es_queue.proto create mode 100644 lib/spot/proto/es_remote_config.proto create mode 100644 lib/spot/proto/es_request_info.proto create mode 100644 lib/spot/proto/es_response_with_reasons.proto create mode 100644 lib/spot/proto/es_restrictions.proto create mode 100644 lib/spot/proto/es_resume.proto create mode 100644 lib/spot/proto/es_seek_to.proto create mode 100644 lib/spot/proto/es_session_response.proto create mode 100644 lib/spot/proto/es_set_options.proto create mode 100644 lib/spot/proto/es_set_queue_request.proto create mode 100644 lib/spot/proto/es_set_repeating_context.proto create mode 100644 lib/spot/proto/es_set_repeating_track.proto create mode 100644 lib/spot/proto/es_set_shuffling_context.proto create mode 100644 lib/spot/proto/es_skip_next.proto create mode 100644 lib/spot/proto/es_skip_prev.proto create mode 100644 lib/spot/proto/es_skip_to_track.proto create mode 100644 lib/spot/proto/es_stop.proto create mode 100644 lib/spot/proto/es_storage.proto create mode 100644 lib/spot/proto/es_update.proto create mode 100644 lib/spot/proto/event_entity.proto create mode 100644 lib/spot/proto/explicit_content_pubsub.proto create mode 100644 lib/spot/proto/extended_metadata.pb.go create mode 100644 lib/spot/proto/extended_metadata.proto create mode 100644 lib/spot/proto/extension_descriptor_type.proto create mode 100644 lib/spot/proto/extension_kind.pb.go create mode 100644 lib/spot/proto/extension_kind.proto create mode 100644 lib/spot/proto/extracted_colors.proto create mode 100644 lib/spot/proto/follow_request.proto create mode 100644 lib/spot/proto/followed_users_request.proto create mode 100644 lib/spot/proto/frecency.proto create mode 100644 lib/spot/proto/frecency_storage.proto create mode 100644 lib/spot/proto/gabito.proto create mode 100644 lib/spot/proto/generate.go create mode 100644 lib/spot/proto/global_node.proto create mode 100644 lib/spot/proto/google/protobuf/any.proto create mode 100644 lib/spot/proto/google/protobuf/descriptor.proto create mode 100644 lib/spot/proto/google/protobuf/duration.proto create mode 100644 lib/spot/proto/google/protobuf/empty.proto create mode 100644 lib/spot/proto/google/protobuf/field_mask.proto create mode 100644 lib/spot/proto/google/protobuf/source_context.proto create mode 100644 lib/spot/proto/google/protobuf/timestamp.proto create mode 100644 lib/spot/proto/google/protobuf/type.proto create mode 100644 lib/spot/proto/google/protobuf/wrappers.proto create mode 100644 lib/spot/proto/greenroom_extension.proto create mode 100644 lib/spot/proto/identity.proto create mode 100644 lib/spot/proto/image-resolve.proto create mode 100644 lib/spot/proto/installation_data.proto create mode 100644 lib/spot/proto/instrumentation_params.proto create mode 100644 lib/spot/proto/keyexchange.proto create mode 100644 lib/spot/proto/lfs_secret_provider.proto create mode 100644 lib/spot/proto/liked_songs_tags_sync_state.proto create mode 100644 lib/spot/proto/listen_later_cosmos_response.proto create mode 100644 lib/spot/proto/local_bans_storage.proto create mode 100644 lib/spot/proto/local_sync_cosmos.proto create mode 100644 lib/spot/proto/local_sync_state.proto create mode 100644 lib/spot/proto/logging_params.proto create mode 100644 lib/spot/proto/mdata.proto create mode 100644 lib/spot/proto/mdata_cosmos.proto create mode 100644 lib/spot/proto/mdata_storage.proto create mode 100644 lib/spot/proto/media_format.proto create mode 100644 lib/spot/proto/media_manifest.proto create mode 100644 lib/spot/proto/media_type.proto create mode 100644 lib/spot/proto/media_type_node.proto create mode 100644 lib/spot/proto/members_request.proto create mode 100644 lib/spot/proto/members_response.proto create mode 100644 lib/spot/proto/mercury.proto create mode 100644 lib/spot/proto/messages/discovery/force_discover.proto create mode 100644 lib/spot/proto/messages/discovery/start_discovery.proto create mode 100644 lib/spot/proto/metadata.pb.go create mode 100644 lib/spot/proto/metadata.proto create mode 100644 lib/spot/proto/metadata/album_metadata.proto create mode 100644 lib/spot/proto/metadata/artist_metadata.proto create mode 100644 lib/spot/proto/metadata/episode_metadata.proto create mode 100644 lib/spot/proto/metadata/extension.proto create mode 100644 lib/spot/proto/metadata/image_group.proto create mode 100644 lib/spot/proto/metadata/show_metadata.proto create mode 100644 lib/spot/proto/metadata/track_metadata.proto create mode 100644 lib/spot/proto/metadata_cosmos.proto create mode 100644 lib/spot/proto/metadata_esperanto.proto create mode 100644 lib/spot/proto/modification_request.proto create mode 100644 lib/spot/proto/net-fortune.proto create mode 100644 lib/spot/proto/offline.proto create mode 100644 lib/spot/proto/offline_playlists_containing.proto create mode 100644 lib/spot/proto/on_demand_in_free_reason.proto create mode 100644 lib/spot/proto/on_demand_set_cosmos_request.proto create mode 100644 lib/spot/proto/on_demand_set_cosmos_response.proto create mode 100644 lib/spot/proto/on_demand_set_response.proto create mode 100644 lib/spot/proto/pending_event_entity.proto create mode 100644 lib/spot/proto/perf_metrics_service.proto create mode 100644 lib/spot/proto/pin_request.proto create mode 100644 lib/spot/proto/play_origin.proto create mode 100644 lib/spot/proto/play_queue_node.proto create mode 100644 lib/spot/proto/play_reason.proto create mode 100644 lib/spot/proto/playback.proto create mode 100644 lib/spot/proto/playback_cosmos.proto create mode 100644 lib/spot/proto/playback_esperanto.proto create mode 100644 lib/spot/proto/playback_platform.proto create mode 100644 lib/spot/proto/playback_segments.proto create mode 100644 lib/spot/proto/played_state.proto create mode 100644 lib/spot/proto/played_state/episode_played_state.proto create mode 100644 lib/spot/proto/played_state/playability_restriction.proto create mode 100644 lib/spot/proto/played_state/show_played_state.proto create mode 100644 lib/spot/proto/played_state/track_played_state.proto create mode 100644 lib/spot/proto/playedstate.proto create mode 100644 lib/spot/proto/player.pb.go create mode 100644 lib/spot/proto/player.proto create mode 100644 lib/spot/proto/player_license.proto create mode 100644 lib/spot/proto/player_model.proto create mode 100644 lib/spot/proto/playlist4_external.pb.go create mode 100644 lib/spot/proto/playlist4_external.proto create mode 100644 lib/spot/proto/playlist_annotate3.pb.go create mode 100644 lib/spot/proto/playlist_annotate3.proto create mode 100644 lib/spot/proto/playlist_contains_request.proto create mode 100644 lib/spot/proto/playlist_folder_state.proto create mode 100644 lib/spot/proto/playlist_get_request.proto create mode 100644 lib/spot/proto/playlist_members_request.proto create mode 100644 lib/spot/proto/playlist_modification_request.proto create mode 100644 lib/spot/proto/playlist_offline_request.proto create mode 100644 lib/spot/proto/playlist_permission.pb.go create mode 100644 lib/spot/proto/playlist_permission.proto create mode 100644 lib/spot/proto/playlist_play_request.proto create mode 100644 lib/spot/proto/playlist_playback_request.proto create mode 100644 lib/spot/proto/playlist_playlist_state.proto create mode 100644 lib/spot/proto/playlist_query.proto create mode 100644 lib/spot/proto/playlist_request.proto create mode 100644 lib/spot/proto/playlist_set_base_permission_request.proto create mode 100644 lib/spot/proto/playlist_set_member_permission_request.proto create mode 100644 lib/spot/proto/playlist_set_permission_request.proto create mode 100644 lib/spot/proto/playlist_track_state.proto create mode 100644 lib/spot/proto/playlist_user_state.proto create mode 100644 lib/spot/proto/plugin.proto create mode 100644 lib/spot/proto/podcast_ad_segments.proto create mode 100644 lib/spot/proto/podcast_cta_cards.proto create mode 100644 lib/spot/proto/podcast_paywalls_cosmos.proto create mode 100644 lib/spot/proto/podcast_poll.proto create mode 100644 lib/spot/proto/podcast_qna.proto create mode 100644 lib/spot/proto/podcast_ratings.proto create mode 100644 lib/spot/proto/podcast_segments.proto create mode 100644 lib/spot/proto/podcast_segments_cosmos_request.proto create mode 100644 lib/spot/proto/podcast_segments_cosmos_response.proto create mode 100644 lib/spot/proto/podcast_subscription.proto create mode 100644 lib/spot/proto/podcast_virality.proto create mode 100644 lib/spot/proto/podcastextensions.proto create mode 100644 lib/spot/proto/policy/album_decoration_policy.proto create mode 100644 lib/spot/proto/policy/artist_decoration_policy.proto create mode 100644 lib/spot/proto/policy/episode_decoration_policy.proto create mode 100644 lib/spot/proto/policy/folder_decoration_policy.proto create mode 100644 lib/spot/proto/policy/playlist_album_decoration_policy.proto create mode 100644 lib/spot/proto/policy/playlist_decoration_policy.proto create mode 100644 lib/spot/proto/policy/playlist_episode_decoration_policy.proto create mode 100644 lib/spot/proto/policy/playlist_request_decoration_policy.proto create mode 100644 lib/spot/proto/policy/playlist_track_decoration_policy.proto create mode 100644 lib/spot/proto/policy/rootlist_folder_decoration_policy.proto create mode 100644 lib/spot/proto/policy/rootlist_playlist_decoration_policy.proto create mode 100644 lib/spot/proto/policy/rootlist_request_decoration_policy.proto create mode 100644 lib/spot/proto/policy/show_decoration_policy.proto create mode 100644 lib/spot/proto/policy/track_decoration_policy.proto create mode 100644 lib/spot/proto/policy/user_decoration_policy.proto create mode 100644 lib/spot/proto/popcount2_external.proto create mode 100644 lib/spot/proto/prepare_play_options.proto create mode 100644 lib/spot/proto/profile_cosmos.proto create mode 100644 lib/spot/proto/profile_service.proto create mode 100644 lib/spot/proto/property_definition.proto create mode 100644 lib/spot/proto/protobuf_delta.proto create mode 100644 lib/spot/proto/pubsub.proto create mode 100644 lib/spot/proto/queue.proto create mode 100644 lib/spot/proto/rate_limited_events.proto create mode 100644 lib/spot/proto/rcs.proto create mode 100644 lib/spot/proto/recently_played.proto create mode 100644 lib/spot/proto/recently_played_backend.proto create mode 100644 lib/spot/proto/record_id.proto create mode 100644 lib/spot/proto/remote.proto create mode 100644 lib/spot/proto/repeating_track_node.proto create mode 100644 lib/spot/proto/request_failure.proto create mode 100644 lib/spot/proto/resolve.proto create mode 100644 lib/spot/proto/resource_type.proto create mode 100644 lib/spot/proto/response_status.proto create mode 100644 lib/spot/proto/restrictions.proto create mode 100644 lib/spot/proto/resume_points_node.proto create mode 100644 lib/spot/proto/rootlist_request.proto create mode 100644 lib/spot/proto/seek_to_position.proto create mode 100644 lib/spot/proto/sequence_number_entity.proto create mode 100644 lib/spot/proto/session.proto create mode 100644 lib/spot/proto/set_member_permission_request.proto create mode 100644 lib/spot/proto/show_access.proto create mode 100644 lib/spot/proto/show_episode_state.proto create mode 100644 lib/spot/proto/show_request.proto create mode 100644 lib/spot/proto/show_show_state.proto create mode 100644 lib/spot/proto/skip_to_track.proto create mode 100644 lib/spot/proto/social_connect_v2.proto create mode 100644 lib/spot/proto/social_service.proto create mode 100644 lib/spot/proto/socialgraph_response_status.proto create mode 100644 lib/spot/proto/socialgraphv2.proto create mode 100644 lib/spot/proto/spirc.proto create mode 100644 lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.pb.go create mode 100644 lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.proto create mode 100644 lib/spot/proto/spotify/login5/v3/challenges/code.proto create mode 100644 lib/spot/proto/spotify/login5/v3/challenges/hashcash.proto create mode 100644 lib/spot/proto/spotify/login5/v3/client_info.proto create mode 100644 lib/spot/proto/spotify/login5/v3/credentials/credentials.proto create mode 100644 lib/spot/proto/spotify/login5/v3/identifiers/identifiers.proto create mode 100644 lib/spot/proto/spotify/login5/v3/login5.proto create mode 100644 lib/spot/proto/spotify/login5/v3/user_info.proto create mode 100644 lib/spot/proto/state_restore/ads_rules_inject_tracks.proto create mode 100644 lib/spot/proto/state_restore/behavior_metadata_rules.proto create mode 100644 lib/spot/proto/state_restore/circuit_breaker_rules.proto create mode 100644 lib/spot/proto/state_restore/context_player_rules.proto create mode 100644 lib/spot/proto/state_restore/context_player_rules_base.proto create mode 100644 lib/spot/proto/state_restore/explicit_content_rules.proto create mode 100644 lib/spot/proto/state_restore/explicit_request_rules.proto create mode 100644 lib/spot/proto/state_restore/mft_context_history.proto create mode 100644 lib/spot/proto/state_restore/mft_context_switch_rules.proto create mode 100644 lib/spot/proto/state_restore/mft_fallback_page_history.proto create mode 100644 lib/spot/proto/state_restore/mft_rules.proto create mode 100644 lib/spot/proto/state_restore/mft_rules_core.proto create mode 100644 lib/spot/proto/state_restore/mft_rules_inject_filler_tracks.proto create mode 100644 lib/spot/proto/state_restore/mft_state.proto create mode 100644 lib/spot/proto/state_restore/mod_interruption_state.proto create mode 100644 lib/spot/proto/state_restore/mod_rules_interruptions.proto create mode 100644 lib/spot/proto/state_restore/music_injection_rules.proto create mode 100644 lib/spot/proto/state_restore/player_session_queue.proto create mode 100644 lib/spot/proto/state_restore/provided_track.proto create mode 100644 lib/spot/proto/state_restore/random_source.proto create mode 100644 lib/spot/proto/state_restore/remove_banned_tracks_rules.proto create mode 100644 lib/spot/proto/state_restore/resume_points_rules.proto create mode 100644 lib/spot/proto/state_restore/track_error_rules.proto create mode 100644 lib/spot/proto/status.proto create mode 100644 lib/spot/proto/status_code.proto create mode 100644 lib/spot/proto/status_response.proto create mode 100644 lib/spot/proto/storage-resolve.pb.go create mode 100644 lib/spot/proto/storage-resolve.proto create mode 100644 lib/spot/proto/storage_cosmos.proto create mode 100644 lib/spot/proto/storylines.proto create mode 100644 lib/spot/proto/stream_end_request.proto create mode 100644 lib/spot/proto/stream_handle.proto create mode 100644 lib/spot/proto/stream_progress_request.proto create mode 100644 lib/spot/proto/stream_seek_request.proto create mode 100644 lib/spot/proto/stream_start_request.proto create mode 100644 lib/spot/proto/stream_start_response.proto create mode 100644 lib/spot/proto/streaming_rule.proto create mode 100644 lib/spot/proto/suppressions.proto create mode 100644 lib/spot/proto/sync/album_sync_state.proto create mode 100644 lib/spot/proto/sync/artist_sync_state.proto create mode 100644 lib/spot/proto/sync/episode_sync_state.proto create mode 100644 lib/spot/proto/sync/track_sync_state.proto create mode 100644 lib/spot/proto/sync_request.proto create mode 100644 lib/spot/proto/techu_core_exercise_cosmos.proto create mode 100644 lib/spot/proto/track_instance.proto create mode 100644 lib/spot/proto/track_instantiator.proto create mode 100644 lib/spot/proto/transcripts.proto create mode 100644 lib/spot/proto/transfer_node.proto create mode 100644 lib/spot/proto/transfer_state.proto create mode 100644 lib/spot/proto/tts-resolve.proto create mode 100644 lib/spot/proto/ucs.proto create mode 100644 lib/spot/proto/unfinished_episodes_request.proto create mode 100644 lib/spot/proto/user_attributes.pb.go create mode 100644 lib/spot/proto/user_attributes.proto create mode 100644 lib/spot/proto/useraccount.proto create mode 100644 lib/spot/proto/your_library_contains_request.proto create mode 100644 lib/spot/proto/your_library_contains_response.proto create mode 100644 lib/spot/proto/your_library_decorate_request.proto create mode 100644 lib/spot/proto/your_library_decorate_response.proto create mode 100644 lib/spot/proto/your_library_decorated_entity.proto create mode 100644 lib/spot/proto/your_library_entity.proto create mode 100644 lib/spot/proto/your_library_index.proto create mode 100644 lib/spot/proto/your_library_pseudo_playlist_config.proto create mode 100644 lib/spot/proto/your_library_request.proto create mode 100644 lib/spot/proto/your_library_response.proto diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b9ce135 --- /dev/null +++ b/go.mod @@ -0,0 +1,16 @@ +module tuxpa.in/a/goplayd + +go 1.19 + +require ( + google.golang.org/grpc v1.52.0 + google.golang.org/protobuf v1.28.1 +) + +require ( + github.com/golang/protobuf v1.5.2 // indirect + golang.org/x/net v0.4.0 // indirect + golang.org/x/sys v0.3.0 // indirect + golang.org/x/text v0.5.0 // indirect + google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..719ace9 --- /dev/null +++ b/go.sum @@ -0,0 +1,20 @@ +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 h1:a2S6M0+660BgMNl++4JPlcAO/CjkqYItDEZwkoDQK7c= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= diff --git a/lib/jukebox/jukebox.go b/lib/jukebox/jukebox.go new file mode 100644 index 0000000..c535c73 --- /dev/null +++ b/lib/jukebox/jukebox.go @@ -0,0 +1,7 @@ +package jukebox + +type Jukebox struct { +} + +type Track struct { +} diff --git a/lib/source/spotify/source.go b/lib/source/spotify/source.go new file mode 100644 index 0000000..4eedbf7 --- /dev/null +++ b/lib/source/spotify/source.go @@ -0,0 +1,4 @@ +package spotify + +type Source struct { +} diff --git a/lib/spot/proto.go b/lib/spot/proto.go new file mode 100644 index 0000000..120342f --- /dev/null +++ b/lib/spot/proto.go @@ -0,0 +1,50 @@ +package spot + +import ( + "context" + "encoding/json" + "net/http" + + "google.golang.org/grpc" +) + +var defaultResolvers = []string{ + "http://apresolve.spotify.com", +} + +type Client struct { + Resolver string + Endpoints ApResolve + + grpc *grpc.ClientConn +} + +type ApResolve struct { + ApList []string `json:"ap_list"` +} + +func NewClient(resolver string) (*Client, error) { + c := &Client{Resolver: resolver} + err := c.discover() + if err != nil { + return nil, err + } + return c, nil +} + +func (c *Client) Connect(ctx context.Context) error { + conn, err := grpc.DialContext(ctx, c.Endpoints.ApList[0]) + if err != nil { + return err + } + c.grpc = conn + return nil +} +func (c *Client) discover() error { + resp, err := http.Get(c.Resolver) + if err != nil { + return err + } + defer resp.Body.Close() + return json.NewDecoder(resp.Body).Decode(&c.Endpoints) +} diff --git a/lib/spot/proto/AdContext.proto b/lib/spot/proto/AdContext.proto new file mode 100644 index 0000000..ba56bd0 --- /dev/null +++ b/lib/spot/proto/AdContext.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AdContext { + optional string preceding_content_uri = 1; + optional string preceding_playback_id = 2; + optional int32 preceding_end_position = 3; + repeated string ad_ids = 4; + optional string ad_request_id = 5; + optional string succeeding_content_uri = 6; + optional string succeeding_playback_id = 7; + optional int32 succeeding_start_position = 8; + optional int32 preceding_duration = 9; +} diff --git a/lib/spot/proto/AdDecisionEvent.proto b/lib/spot/proto/AdDecisionEvent.proto new file mode 100644 index 0000000..07a0a94 --- /dev/null +++ b/lib/spot/proto/AdDecisionEvent.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AdDecisionEvent { + optional string request_id = 1; + optional string decision_request_id = 2; + optional string decision_type = 3; +} diff --git a/lib/spot/proto/AdError.proto b/lib/spot/proto/AdError.proto new file mode 100644 index 0000000..1a69e78 --- /dev/null +++ b/lib/spot/proto/AdError.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AdError { + optional string request_type = 1; + optional string error_message = 2; + optional int64 http_error_code = 3; + optional string request_url = 4; + optional string tracking_event = 5; +} diff --git a/lib/spot/proto/AdEvent.proto b/lib/spot/proto/AdEvent.proto new file mode 100644 index 0000000..69cf82b --- /dev/null +++ b/lib/spot/proto/AdEvent.proto @@ -0,0 +1,28 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AdEvent { + optional string request_id = 1; + optional string app_startup_id = 2; + optional string ad_id = 3; + optional string lineitem_id = 4; + optional string creative_id = 5; + optional string slot = 6; + optional string format = 7; + optional string type = 8; + optional bool skippable = 9; + optional string event = 10; + optional string event_source = 11; + optional string event_reason = 12; + optional int32 event_sequence_num = 13; + optional int32 position = 14; + optional int32 duration = 15; + optional bool in_focus = 16; + optional float volume = 17; + optional string product_name = 18; +} diff --git a/lib/spot/proto/AdRequestEvent.proto b/lib/spot/proto/AdRequestEvent.proto new file mode 100644 index 0000000..3ffdf86 --- /dev/null +++ b/lib/spot/proto/AdRequestEvent.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AdRequestEvent { + optional string feature_identifier = 1; + optional string requested_ad_type = 2; + optional int64 latency_ms = 3; + repeated string requested_ad_types = 4; +} diff --git a/lib/spot/proto/AdSlotEvent.proto b/lib/spot/proto/AdSlotEvent.proto new file mode 100644 index 0000000..1f345b6 --- /dev/null +++ b/lib/spot/proto/AdSlotEvent.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AdSlotEvent { + optional string event = 1; + optional string ad_id = 2; + optional string lineitem_id = 3; + optional string creative_id = 4; + optional string slot = 5; + optional string format = 6; + optional bool in_focus = 7; + optional string app_startup_id = 8; + optional string request_id = 9; +} diff --git a/lib/spot/proto/AmazonWakeUpTime.proto b/lib/spot/proto/AmazonWakeUpTime.proto new file mode 100644 index 0000000..25d64c4 --- /dev/null +++ b/lib/spot/proto/AmazonWakeUpTime.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AmazonWakeUpTime { + optional int64 delay_to_online = 1; +} diff --git a/lib/spot/proto/AudioDriverError.proto b/lib/spot/proto/AudioDriverError.proto new file mode 100644 index 0000000..3c97b46 --- /dev/null +++ b/lib/spot/proto/AudioDriverError.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioDriverError { + optional int64 error_code = 1; + optional string location = 2; + optional string driver_name = 3; + optional string additional_data = 4; +} diff --git a/lib/spot/proto/AudioDriverInfo.proto b/lib/spot/proto/AudioDriverInfo.proto new file mode 100644 index 0000000..23bae0a --- /dev/null +++ b/lib/spot/proto/AudioDriverInfo.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioDriverInfo { + optional string driver_name = 1; + optional string output_device_name = 2; + optional string output_device_category = 3; + optional string reason = 4; +} diff --git a/lib/spot/proto/AudioFileSelection.proto b/lib/spot/proto/AudioFileSelection.proto new file mode 100644 index 0000000..d99b36f --- /dev/null +++ b/lib/spot/proto/AudioFileSelection.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioFileSelection { + optional bytes playback_id = 1; + optional string strategy_name = 2; + optional int64 bitrate = 3; + optional bytes predict_id = 4; + optional string file_origin = 5; + optional int32 target_bitrate = 6; +} diff --git a/lib/spot/proto/AudioOffliningSettingsReport.proto b/lib/spot/proto/AudioOffliningSettingsReport.proto new file mode 100644 index 0000000..71d87f1 --- /dev/null +++ b/lib/spot/proto/AudioOffliningSettingsReport.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioOffliningSettingsReport { + optional string default_sync_bitrate_product_state = 1; + optional int64 user_selected_sync_bitrate = 2; + optional int64 sync_bitrate = 3; + optional bool sync_over_cellular = 4; + optional string primary_resource_type = 5; +} diff --git a/lib/spot/proto/AudioRateLimit.proto b/lib/spot/proto/AudioRateLimit.proto new file mode 100644 index 0000000..0ead830 --- /dev/null +++ b/lib/spot/proto/AudioRateLimit.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioRateLimit { + optional string driver_name = 1; + optional string output_device_name = 2; + optional string output_device_category = 3; + optional int64 max_size = 4; + optional int64 refill_per_milliseconds = 5; + optional int64 frames_requested = 6; + optional int64 frames_acquired = 7; + optional bytes playback_id = 8; +} diff --git a/lib/spot/proto/AudioSessionEvent.proto b/lib/spot/proto/AudioSessionEvent.proto new file mode 100644 index 0000000..c9b1a53 --- /dev/null +++ b/lib/spot/proto/AudioSessionEvent.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioSessionEvent { + optional string event = 1; + optional string context = 2; + optional string json_data = 3; +} diff --git a/lib/spot/proto/AudioSettingsReport.proto b/lib/spot/proto/AudioSettingsReport.proto new file mode 100644 index 0000000..e99ea8e --- /dev/null +++ b/lib/spot/proto/AudioSettingsReport.proto @@ -0,0 +1,30 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioSettingsReport { + optional bool offline_mode = 1; + optional string default_play_bitrate_product_state = 2; + optional int64 user_selected_bitrate = 3; + optional int64 play_bitrate = 4; + optional bool low_bitrate_on_cellular = 5; + optional string default_sync_bitrate_product_state = 6; + optional int64 user_selected_sync_bitrate = 7; + optional int64 sync_bitrate = 8; + optional bool sync_over_cellular = 9; + optional string enable_gapless_product_state = 10; + optional bool enable_gapless = 11; + optional string enable_crossfade_product_state = 12; + optional bool enable_crossfade = 13; + optional int64 crossfade_time = 14; + optional bool enable_normalization = 15; + optional int64 playback_speed = 16; + optional string audio_loudness_level = 17; + optional bool enable_automix = 18; + optional bool enable_silence_trimmer = 19; + optional bool enable_mono_downmixer = 20; +} diff --git a/lib/spot/proto/AudioStreamingSettingsReport.proto b/lib/spot/proto/AudioStreamingSettingsReport.proto new file mode 100644 index 0000000..ef6e473 --- /dev/null +++ b/lib/spot/proto/AudioStreamingSettingsReport.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message AudioStreamingSettingsReport { + optional string default_play_bitrate_product_state = 1; + optional int64 user_selected_play_bitrate_cellular = 2; + optional int64 user_selected_play_bitrate_wifi = 3; + optional int64 play_bitrate_cellular = 4; + optional int64 play_bitrate_wifi = 5; + optional bool allow_downgrade = 6; +} diff --git a/lib/spot/proto/BoomboxPlaybackInstrumentation.proto b/lib/spot/proto/BoomboxPlaybackInstrumentation.proto new file mode 100644 index 0000000..01e3f2c --- /dev/null +++ b/lib/spot/proto/BoomboxPlaybackInstrumentation.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message BoomboxPlaybackInstrumentation { + optional bytes playback_id = 1; + optional bool was_playback_paused = 2; + repeated string dimensions = 3; + map total_buffer_size = 4; + map number_of_calls = 5; + map total_duration = 6; + map first_call_time = 7; + map last_call_time = 8; +} diff --git a/lib/spot/proto/BrokenObject.proto b/lib/spot/proto/BrokenObject.proto new file mode 100644 index 0000000..3bdb667 --- /dev/null +++ b/lib/spot/proto/BrokenObject.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message BrokenObject { + optional string type = 1; + optional string id = 2; + optional int64 error_code = 3; + optional bytes playback_id = 4; +} diff --git a/lib/spot/proto/CacheError.proto b/lib/spot/proto/CacheError.proto new file mode 100644 index 0000000..ad85c34 --- /dev/null +++ b/lib/spot/proto/CacheError.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message CacheError { + optional int64 error_code = 1; + optional int64 os_error_code = 2; + optional string realm = 3; + optional bytes file_id = 4; + optional int64 num_errors = 5; + optional string cache_path = 6; + optional int64 size = 7; + optional int64 range_start = 8; + optional int64 range_end = 9; +} diff --git a/lib/spot/proto/CachePruningReport.proto b/lib/spot/proto/CachePruningReport.proto new file mode 100644 index 0000000..3225f1d --- /dev/null +++ b/lib/spot/proto/CachePruningReport.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message CachePruningReport { + optional bytes cache_id = 1; + optional int64 time_spent_pruning_ms = 2; + optional int64 size_before_prune_kb = 3; + optional int64 size_after_prune_kb = 4; + optional int64 num_entries_pruned = 5; + optional int64 num_entries_pruned_expired = 6; + optional int64 size_entries_pruned_expired_kb = 7; + optional int64 num_entries_pruned_limit = 8; + optional int64 size_pruned_limit_kb = 9; + optional int64 num_entries_pruned_never_used = 10; + optional int64 size_pruned_never_used_kb = 11; + optional int64 num_entries_pruned_max_realm_size = 12; + optional int64 size_pruned_max_realm_size_kb = 13; + optional int64 num_entries_pruned_min_free_space = 14; + optional int64 size_pruned_min_free_space_kb = 15; +} diff --git a/lib/spot/proto/CacheRealmPruningReport.proto b/lib/spot/proto/CacheRealmPruningReport.proto new file mode 100644 index 0000000..479a26a --- /dev/null +++ b/lib/spot/proto/CacheRealmPruningReport.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message CacheRealmPruningReport { + optional bytes cache_id = 1; + optional int64 realm_id = 2; + optional int64 num_entries_pruned = 3; + optional int64 num_entries_pruned_expired = 4; + optional int64 size_entries_pruned_expired_kb = 5; + optional int64 num_entries_pruned_limit = 6; + optional int64 size_pruned_limit_kb = 7; + optional int64 num_entries_pruned_never_used = 8; + optional int64 size_pruned_never_used_kb = 9; + optional int64 num_entries_pruned_max_realm_size = 10; + optional int64 size_pruned_max_realm_size_kb = 11; + optional int64 num_entries_pruned_min_free_space = 12; + optional int64 size_pruned_min_free_space_kb = 13; +} diff --git a/lib/spot/proto/CacheRealmReport.proto b/lib/spot/proto/CacheRealmReport.proto new file mode 100644 index 0000000..4d3c8a5 --- /dev/null +++ b/lib/spot/proto/CacheRealmReport.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message CacheRealmReport { + optional bytes cache_id = 1; + optional int64 realm_id = 2; + optional int64 num_entries = 3; + optional int64 num_locked_entries = 4; + optional int64 num_locked_entries_current_user = 5; + optional int64 num_full_entries = 6; + optional int64 size_kb = 7; + optional int64 locked_size_kb = 8; +} diff --git a/lib/spot/proto/CacheReport.proto b/lib/spot/proto/CacheReport.proto new file mode 100644 index 0000000..ac03405 --- /dev/null +++ b/lib/spot/proto/CacheReport.proto @@ -0,0 +1,32 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message CacheReport { + optional bytes cache_id = 1; + optional string cache_path = 21; + optional string volatile_path = 22; + optional int64 max_cache_size = 2; + optional int64 free_space = 3; + optional int64 total_space = 4; + optional int64 cache_age = 5; + optional int64 num_users_with_locked_entries = 6; + optional int64 permanent_files = 7; + optional int64 permanent_size_kb = 8; + optional int64 unknown_permanent_files = 9; + optional int64 unknown_permanent_size_kb = 10; + optional int64 volatile_files = 11; + optional int64 volatile_size_kb = 12; + optional int64 unknown_volatile_files = 13; + optional int64 unknown_volatile_size_kb = 14; + optional int64 num_entries = 15; + optional int64 num_locked_entries = 16; + optional int64 num_locked_entries_current_user = 17; + optional int64 num_full_entries = 18; + optional int64 size_kb = 19; + optional int64 locked_size_kb = 20; +} diff --git a/lib/spot/proto/ClientLocale.proto b/lib/spot/proto/ClientLocale.proto new file mode 100644 index 0000000..a8e330b --- /dev/null +++ b/lib/spot/proto/ClientLocale.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ClientLocale { + optional string client_default_locale = 1; + optional string user_specified_locale = 2; +} diff --git a/lib/spot/proto/ColdStartupSequence.proto b/lib/spot/proto/ColdStartupSequence.proto new file mode 100644 index 0000000..cfeedee --- /dev/null +++ b/lib/spot/proto/ColdStartupSequence.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ColdStartupSequence { + optional string terminal_state = 1; + map steps = 2; + map metadata = 3; + optional string connection_type = 4; + optional string initial_application_state = 5; + optional string terminal_application_state = 6; + optional string view_load_sequence_id = 7; + optional int32 device_year_class = 8; + map subdurations = 9; +} diff --git a/lib/spot/proto/CollectionLevelDbInfo.proto b/lib/spot/proto/CollectionLevelDbInfo.proto new file mode 100644 index 0000000..4f22248 --- /dev/null +++ b/lib/spot/proto/CollectionLevelDbInfo.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message CollectionLevelDbInfo { + optional string bucket = 1; + optional bool use_leveldb = 2; + optional bool migration_from_file_ok = 3; + optional bool index_check_ok = 4; + optional bool leveldb_works = 5; + optional bool already_migrated = 6; +} diff --git a/lib/spot/proto/CollectionOfflineControllerEmptyTrackList.proto b/lib/spot/proto/CollectionOfflineControllerEmptyTrackList.proto new file mode 100644 index 0000000..ee83043 --- /dev/null +++ b/lib/spot/proto/CollectionOfflineControllerEmptyTrackList.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message CollectionOfflineControllerEmptyTrackList { + optional string link_type = 1; + optional bool consistent_with_collection = 2; + optional int64 collection_size = 3; +} diff --git a/lib/spot/proto/ConfigurationApplied.proto b/lib/spot/proto/ConfigurationApplied.proto new file mode 100644 index 0000000..40aad33 --- /dev/null +++ b/lib/spot/proto/ConfigurationApplied.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConfigurationApplied { + optional int64 last_rcs_fetch_time = 1; + optional string installation_id = 2; + repeated int32 policy_group_ids = 3; + optional string configuration_assignment_id = 4; + optional string rc_client_id = 5; + optional string rc_client_version = 6; + optional string platform = 7; + optional string fetch_type = 8; +} diff --git a/lib/spot/proto/ConfigurationFetched.proto b/lib/spot/proto/ConfigurationFetched.proto new file mode 100644 index 0000000..bb61a2e --- /dev/null +++ b/lib/spot/proto/ConfigurationFetched.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConfigurationFetched { + optional int64 last_rcs_fetch_time = 1; + optional string installation_id = 2; + optional string configuration_assignment_id = 3; + optional string property_set_id = 4; + optional string attributes_set_id = 5; + optional string rc_client_id = 6; + optional string rc_client_version = 7; + optional string rc_sdk_version = 8; + optional string platform = 9; + optional string fetch_type = 10; + optional int64 latency = 11; + optional int64 payload_size = 12; + optional int32 status_code = 13; + optional string error_reason = 14; + optional string error_message = 15; + optional string error_reason_configuration_resolve = 16; + optional string error_message_configuration_resolve = 17; + optional string error_reason_account_attributes = 18; + optional string error_message_account_attributes = 19; + optional int32 error_code_account_attributes = 20; + optional int32 error_code_configuration_resolve = 21; +} diff --git a/lib/spot/proto/ConfigurationFetchedNonAuth.proto b/lib/spot/proto/ConfigurationFetchedNonAuth.proto new file mode 100644 index 0000000..e28d1d3 --- /dev/null +++ b/lib/spot/proto/ConfigurationFetchedNonAuth.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConfigurationFetchedNonAuth { + optional int64 last_rcs_fetch_time = 1; + optional string installation_id = 2; + optional string configuration_assignment_id = 3; + optional string property_set_id = 4; + optional string attributes_set_id = 5; + optional string rc_client_id = 6; + optional string rc_client_version = 7; + optional string rc_sdk_version = 8; + optional string platform = 9; + optional string fetch_type = 10; + optional int64 latency = 11; + optional int64 payload_size = 12; + optional int32 status_code = 13; + optional string error_reason = 14; + optional string error_message = 15; + optional string error_reason_configuration_resolve = 16; + optional string error_message_configuration_resolve = 17; + optional string error_reason_account_attributes = 18; + optional string error_message_account_attributes = 19; + optional int32 error_code_account_attributes = 20; + optional int32 error_code_configuration_resolve = 21; +} diff --git a/lib/spot/proto/ConnectCredentialsRequest.proto b/lib/spot/proto/ConnectCredentialsRequest.proto new file mode 100644 index 0000000..d3e91cf --- /dev/null +++ b/lib/spot/proto/ConnectCredentialsRequest.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectCredentialsRequest { + optional string token_type = 1; + optional string client_id = 2; +} diff --git a/lib/spot/proto/ConnectDeviceDiscovered.proto b/lib/spot/proto/ConnectDeviceDiscovered.proto new file mode 100644 index 0000000..bb156ff --- /dev/null +++ b/lib/spot/proto/ConnectDeviceDiscovered.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectDeviceDiscovered { + optional string device_id = 1; + optional string discover_method = 2; + optional string discovered_device_id = 3; + optional string discovered_device_type = 4; + optional string discovered_library_version = 5; + optional string discovered_brand_display_name = 6; + optional string discovered_model_display_name = 7; + optional string discovered_client_id = 8; + optional string discovered_product_id = 9; + optional string discovered_device_availablilty = 10; + optional string discovered_device_public_key = 11; + optional bool capabilities_resolved = 12; +} diff --git a/lib/spot/proto/ConnectDialError.proto b/lib/spot/proto/ConnectDialError.proto new file mode 100644 index 0000000..90a8f36 --- /dev/null +++ b/lib/spot/proto/ConnectDialError.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectDialError { + optional string type = 1; + optional string request = 2; + optional string response = 3; + optional int64 error = 4; + optional string context = 5; +} diff --git a/lib/spot/proto/ConnectMdnsPacketParseError.proto b/lib/spot/proto/ConnectMdnsPacketParseError.proto new file mode 100644 index 0000000..e768582 --- /dev/null +++ b/lib/spot/proto/ConnectMdnsPacketParseError.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectMdnsPacketParseError { + optional string type = 1; + optional string buffer = 2; + optional string ttl = 3; + optional string txt = 4; + optional string host = 5; + optional string discovery_name = 6; + optional string context = 7; +} diff --git a/lib/spot/proto/ConnectPullFailure.proto b/lib/spot/proto/ConnectPullFailure.proto new file mode 100644 index 0000000..fc1f981 --- /dev/null +++ b/lib/spot/proto/ConnectPullFailure.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectPullFailure { + optional bytes transfer_data = 1; + optional int64 error_code = 2; + map reasons = 3; +} diff --git a/lib/spot/proto/ConnectTransferResult.proto b/lib/spot/proto/ConnectTransferResult.proto new file mode 100644 index 0000000..9239e84 --- /dev/null +++ b/lib/spot/proto/ConnectTransferResult.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectTransferResult { + optional string result = 1; + optional string device_type = 2; + optional string discovery_class = 3; + optional string device_model = 4; + optional string device_brand = 5; + optional string device_software_version = 6; + optional int64 duration = 7; + optional string device_client_id = 8; + optional string transfer_intent_id = 9; + optional string transfer_debug_log = 10; + optional string error_code = 11; + optional int32 http_response_code = 12; + optional string initial_device_state = 13; + optional int32 retry_count = 14; + optional int32 login_retry_count = 15; + optional int64 login_duration = 16; + optional string target_device_id = 17; + optional bool target_device_is_local = 18; + optional string final_device_state = 19; +} diff --git a/lib/spot/proto/ConnectionError.proto b/lib/spot/proto/ConnectionError.proto new file mode 100644 index 0000000..8c1c35b --- /dev/null +++ b/lib/spot/proto/ConnectionError.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectionError { + optional int64 error_code = 1; + optional string ap = 2; + optional string proxy = 3; +} diff --git a/lib/spot/proto/ConnectionInfo.proto b/lib/spot/proto/ConnectionInfo.proto new file mode 100644 index 0000000..2c830ed --- /dev/null +++ b/lib/spot/proto/ConnectionInfo.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectionInfo { + optional string ap = 1; + optional string proxy = 2; + optional bool user_initated_login = 3; + optional string reachability_type = 4; + optional string web_installer_unique_id = 5; + optional string ap_resolve_source = 6; + optional string address_type = 7; + optional bool ipv6_failed = 8; +} diff --git a/lib/spot/proto/ConnectionStateChange.proto b/lib/spot/proto/ConnectionStateChange.proto new file mode 100644 index 0000000..28e517c --- /dev/null +++ b/lib/spot/proto/ConnectionStateChange.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ConnectionStateChange { + optional string type = 1; + optional string old = 2; + optional string new = 3; +} diff --git a/lib/spot/proto/DefaultConfigurationApplied.proto b/lib/spot/proto/DefaultConfigurationApplied.proto new file mode 100644 index 0000000..9236ecb --- /dev/null +++ b/lib/spot/proto/DefaultConfigurationApplied.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DefaultConfigurationApplied { + optional string installation_id = 1; + optional string configuration_assignment_id = 2; + optional string rc_client_id = 3; + optional string rc_client_version = 4; + optional string platform = 5; + optional string fetch_type = 6; + optional string reason = 7; +} diff --git a/lib/spot/proto/DesktopAuthenticationFailureNonAuth.proto b/lib/spot/proto/DesktopAuthenticationFailureNonAuth.proto new file mode 100644 index 0000000..e3b495e --- /dev/null +++ b/lib/spot/proto/DesktopAuthenticationFailureNonAuth.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopAuthenticationFailureNonAuth { + optional string action_hash = 1; + optional string error_category = 2; + optional int32 error_code = 3; +} diff --git a/lib/spot/proto/DesktopAuthenticationSuccess.proto b/lib/spot/proto/DesktopAuthenticationSuccess.proto new file mode 100644 index 0000000..8814df7 --- /dev/null +++ b/lib/spot/proto/DesktopAuthenticationSuccess.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopAuthenticationSuccess { + optional string action_hash = 1; +} diff --git a/lib/spot/proto/DesktopDeviceInformation.proto b/lib/spot/proto/DesktopDeviceInformation.proto new file mode 100644 index 0000000..be50317 --- /dev/null +++ b/lib/spot/proto/DesktopDeviceInformation.proto @@ -0,0 +1,106 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopDeviceInformation { + optional string os_platform = 1; + optional string os_version = 2; + optional string computer_manufacturer = 3; + optional string mac_computer_model = 4; + optional string mac_computer_model_family = 5; + optional bool computer_has_internal_battery = 6; + optional bool computer_is_currently_running_on_battery_power = 7; + optional string mac_cpu_product_name = 8; + optional int64 mac_cpu_family_code = 9; + optional int64 cpu_num_physical_cores = 10; + optional int64 cpu_num_logical_cores = 11; + optional int64 cpu_clock_frequency_herz = 12; + optional int64 cpu_level_1_cache_size_bytes = 13; + optional int64 cpu_level_2_cache_size_bytes = 14; + optional int64 cpu_level_3_cache_size_bytes = 15; + optional bool cpu_is_64_bit_capable = 16; + optional int64 computer_ram_size_bytes = 17; + optional int64 computer_ram_speed_herz = 18; + optional int64 num_graphics_cards = 19; + optional int64 num_connected_screens = 20; + optional string app_screen_model_name = 21; + optional double app_screen_width_logical_points = 22; + optional double app_screen_height_logical_points = 23; + optional double mac_app_screen_scale_factor = 24; + optional double app_screen_physical_size_inches = 25; + optional int64 app_screen_bits_per_pixel = 26; + optional bool app_screen_supports_dci_p3_color_gamut = 27; + optional bool app_screen_is_built_in = 28; + optional string app_screen_graphics_card_model = 29; + optional int64 app_screen_graphics_card_vram_size_bytes = 30; + optional bool mac_app_screen_currently_contains_the_dock = 31; + optional bool mac_app_screen_currently_contains_active_menu_bar = 32; + optional bool boot_disk_is_known_ssd = 33; + optional string mac_boot_disk_connection_type = 34; + optional int64 boot_disk_capacity_bytes = 35; + optional int64 boot_disk_free_space_bytes = 36; + optional bool application_disk_is_same_as_boot_disk = 37; + optional bool application_disk_is_known_ssd = 38; + optional string mac_application_disk_connection_type = 39; + optional int64 application_disk_capacity_bytes = 40; + optional int64 application_disk_free_space_bytes = 41; + optional bool application_cache_disk_is_same_as_boot_disk = 42; + optional bool application_cache_disk_is_known_ssd = 43; + optional string mac_application_cache_disk_connection_type = 44; + optional int64 application_cache_disk_capacity_bytes = 45; + optional int64 application_cache_disk_free_space_bytes = 46; + optional bool has_pointing_device = 47; + optional bool has_builtin_pointing_device = 48; + optional bool has_touchpad = 49; + optional bool has_keyboard = 50; + optional bool has_builtin_keyboard = 51; + optional bool mac_has_touch_bar = 52; + optional bool has_touch_screen = 53; + optional bool has_pen_input = 54; + optional bool has_game_controller = 55; + optional bool has_bluetooth_support = 56; + optional int64 bluetooth_link_manager_version = 57; + optional string bluetooth_version_string = 58; + optional int64 num_audio_output_devices = 59; + optional string default_audio_output_device_name = 60; + optional string default_audio_output_device_manufacturer = 61; + optional double default_audio_output_device_current_sample_rate = 62; + optional int64 default_audio_output_device_current_bit_depth = 63; + optional int64 default_audio_output_device_current_buffer_size = 64; + optional int64 default_audio_output_device_current_num_channels = 65; + optional double default_audio_output_device_maximum_sample_rate = 66; + optional int64 default_audio_output_device_maximum_bit_depth = 67; + optional int64 default_audio_output_device_maximum_num_channels = 68; + optional bool default_audio_output_device_is_builtin = 69; + optional bool default_audio_output_device_is_virtual = 70; + optional string mac_default_audio_output_device_transport_type = 71; + optional string mac_default_audio_output_device_terminal_type = 72; + optional int64 num_video_capture_devices = 73; + optional string default_video_capture_device_manufacturer = 74; + optional string default_video_capture_device_model = 75; + optional string default_video_capture_device_name = 76; + optional int64 default_video_capture_device_image_width = 77; + optional int64 default_video_capture_device_image_height = 78; + optional string mac_default_video_capture_device_transport_type = 79; + optional bool default_video_capture_device_is_builtin = 80; + optional int64 num_active_network_interfaces = 81; + optional string mac_main_network_interface_name = 82; + optional string mac_main_network_interface_type = 83; + optional bool main_network_interface_supports_ipv4 = 84; + optional bool main_network_interface_supports_ipv6 = 85; + optional string main_network_interface_hardware_vendor = 86; + optional string main_network_interface_hardware_model = 87; + optional int64 main_network_interface_medium_speed_bps = 88; + optional int64 main_network_interface_link_speed_bps = 89; + optional double system_up_time_including_sleep_seconds = 90; + optional double system_up_time_awake_seconds = 91; + optional double app_up_time_including_sleep_seconds = 92; + optional string system_user_preferred_language_code = 93; + optional string system_user_preferred_locale = 94; + optional string mac_app_system_localization_language = 95; + optional string app_localization_language = 96; +} diff --git a/lib/spot/proto/DesktopGPUAccelerationInfo.proto b/lib/spot/proto/DesktopGPUAccelerationInfo.proto new file mode 100644 index 0000000..2fbaed0 --- /dev/null +++ b/lib/spot/proto/DesktopGPUAccelerationInfo.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopGPUAccelerationInfo { + optional bool is_enabled = 1; +} diff --git a/lib/spot/proto/DesktopHighMemoryUsage.proto b/lib/spot/proto/DesktopHighMemoryUsage.proto new file mode 100644 index 0000000..e55106e --- /dev/null +++ b/lib/spot/proto/DesktopHighMemoryUsage.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopHighMemoryUsage { + optional bool is_continuation_event = 1; + optional double sample_time_interval_seconds = 2; + optional int64 win_committed_bytes = 3; + optional int64 win_peak_committed_bytes = 4; + optional int64 win_working_set_bytes = 5; + optional int64 win_peak_working_set_bytes = 6; + optional int64 mac_virtual_size_bytes = 7; + optional int64 mac_resident_size_bytes = 8; + optional int64 mac_footprint_bytes = 9; +} diff --git a/lib/spot/proto/DesktopPerformanceIssue.proto b/lib/spot/proto/DesktopPerformanceIssue.proto new file mode 100644 index 0000000..4e70b43 --- /dev/null +++ b/lib/spot/proto/DesktopPerformanceIssue.proto @@ -0,0 +1,88 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopPerformanceIssue { + optional string event_type = 1; + optional bool is_continuation_event = 2; + optional double sample_time_interval_seconds = 3; + optional string computer_platform = 4; + optional double last_seen_main_thread_latency_seconds = 5; + optional double last_seen_core_thread_latency_seconds = 6; + optional double total_spotify_processes_cpu_load_percent = 7; + optional double main_process_cpu_load_percent = 8; + optional int64 mac_main_process_vm_size_bytes = 9; + optional int64 mac_main_process_resident_size_bytes = 10; + optional double mac_main_process_num_page_faults_per_second = 11; + optional double mac_main_process_num_pageins_per_second = 12; + optional double mac_main_process_num_cow_faults_per_second = 13; + optional double mac_main_process_num_context_switches_per_second = 14; + optional int64 main_process_num_total_threads = 15; + optional int64 main_process_num_running_threads = 16; + optional double renderer_process_cpu_load_percent = 17; + optional int64 mac_renderer_process_vm_size_bytes = 18; + optional int64 mac_renderer_process_resident_size_bytes = 19; + optional double mac_renderer_process_num_page_faults_per_second = 20; + optional double mac_renderer_process_num_pageins_per_second = 21; + optional double mac_renderer_process_num_cow_faults_per_second = 22; + optional double mac_renderer_process_num_context_switches_per_second = 23; + optional int64 renderer_process_num_total_threads = 24; + optional int64 renderer_process_num_running_threads = 25; + optional double system_total_cpu_load_percent = 26; + optional int64 mac_system_total_free_memory_size_bytes = 27; + optional int64 mac_system_total_active_memory_size_bytes = 28; + optional int64 mac_system_total_inactive_memory_size_bytes = 29; + optional int64 mac_system_total_wired_memory_size_bytes = 30; + optional int64 mac_system_total_compressed_memory_size_bytes = 31; + optional double mac_system_current_num_pageins_per_second = 32; + optional double mac_system_current_num_pageouts_per_second = 33; + optional double mac_system_current_num_page_faults_per_second = 34; + optional double mac_system_current_num_cow_faults_per_second = 35; + optional int64 system_current_num_total_processes = 36; + optional int64 system_current_num_total_threads = 37; + optional int64 computer_boot_disk_free_space_bytes = 38; + optional int64 application_disk_free_space_bytes = 39; + optional int64 application_cache_disk_free_space_bytes = 40; + optional bool computer_is_currently_running_on_battery_power = 41; + optional double computer_remaining_battery_capacity_percent = 42; + optional double computer_estimated_remaining_battery_time_seconds = 43; + optional int64 mac_computer_num_available_logical_cpu_cores_due_to_power_management = 44; + optional double mac_computer_current_processor_speed_percent_due_to_power_management = 45; + optional double mac_computer_current_cpu_time_limit_percent_due_to_power_management = 46; + optional double app_screen_width_points = 47; + optional double app_screen_height_points = 48; + optional double mac_app_screen_scale_factor = 49; + optional int64 app_screen_bits_per_pixel = 50; + optional bool app_screen_supports_dci_p3_color_gamut = 51; + optional bool app_screen_is_built_in = 52; + optional string app_screen_graphics_card_model = 53; + optional int64 app_screen_graphics_card_vram_size_bytes = 54; + optional double app_window_width_points = 55; + optional double app_window_height_points = 56; + optional double app_window_percentage_on_screen = 57; + optional double app_window_percentage_non_obscured = 58; + optional double system_up_time_including_sleep_seconds = 59; + optional double system_up_time_awake_seconds = 60; + optional double app_up_time_including_sleep_seconds = 61; + optional double computer_time_since_last_sleep_start_seconds = 62; + optional double computer_time_since_last_sleep_end_seconds = 63; + optional bool mac_system_user_session_is_currently_active = 64; + optional double mac_system_time_since_last_user_session_deactivation_seconds = 65; + optional double mac_system_time_since_last_user_session_reactivation_seconds = 66; + optional bool application_is_currently_active = 67; + optional bool application_window_is_currently_visible = 68; + optional bool mac_application_window_is_currently_minimized = 69; + optional bool application_window_is_currently_fullscreen = 70; + optional bool mac_application_is_currently_hidden = 71; + optional bool application_user_is_currently_logged_in = 72; + optional double application_time_since_last_user_log_in = 73; + optional double application_time_since_last_user_log_out = 74; + optional bool application_is_playing_now = 75; + optional string application_currently_playing_type = 76; + optional string application_currently_playing_uri = 77; + optional string application_currently_playing_ad_id = 78; +} diff --git a/lib/spot/proto/DesktopUpdateDownloadComplete.proto b/lib/spot/proto/DesktopUpdateDownloadComplete.proto new file mode 100644 index 0000000..bf1fe4d --- /dev/null +++ b/lib/spot/proto/DesktopUpdateDownloadComplete.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopUpdateDownloadComplete { + optional int64 revision = 1; + optional bool is_critical = 2; + optional string source = 3; + optional bool is_successful = 4; + optional bool is_employee = 5; +} diff --git a/lib/spot/proto/DesktopUpdateDownloadError.proto b/lib/spot/proto/DesktopUpdateDownloadError.proto new file mode 100644 index 0000000..8385d4a --- /dev/null +++ b/lib/spot/proto/DesktopUpdateDownloadError.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopUpdateDownloadError { + optional int64 revision = 1; + optional bool is_critical = 2; + optional string error_message = 3; + optional string source = 4; + optional bool is_employee = 5; +} diff --git a/lib/spot/proto/DesktopUpdateMessageAction.proto b/lib/spot/proto/DesktopUpdateMessageAction.proto new file mode 100644 index 0000000..3ff5efe --- /dev/null +++ b/lib/spot/proto/DesktopUpdateMessageAction.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopUpdateMessageAction { + optional bool will_download = 1; + optional int64 this_message_from_revision = 2; + optional int64 this_message_to_revision = 3; + optional bool is_critical = 4; + optional int64 already_downloaded_from_revision = 5; + optional int64 already_downloaded_to_revision = 6; + optional string source = 7; + optional bool is_employee = 8; +} diff --git a/lib/spot/proto/DesktopUpdateMessageProcessed.proto b/lib/spot/proto/DesktopUpdateMessageProcessed.proto new file mode 100644 index 0000000..71b2e76 --- /dev/null +++ b/lib/spot/proto/DesktopUpdateMessageProcessed.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopUpdateMessageProcessed { + optional bool success = 1; + optional string source = 2; + optional int64 revision = 3; + optional bool is_critical = 4; + optional string binary_hash = 5; + optional bool is_employee = 6; +} diff --git a/lib/spot/proto/DesktopUpdateResponse.proto b/lib/spot/proto/DesktopUpdateResponse.proto new file mode 100644 index 0000000..683672f --- /dev/null +++ b/lib/spot/proto/DesktopUpdateResponse.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DesktopUpdateResponse { + optional int64 status_code = 1; + optional int64 request_time_ms = 2; + optional int64 payload_size = 3; + optional bool is_employee = 4; + optional string error_message = 5; +} diff --git a/lib/spot/proto/Download.proto b/lib/spot/proto/Download.proto new file mode 100644 index 0000000..0b3faee --- /dev/null +++ b/lib/spot/proto/Download.proto @@ -0,0 +1,55 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message Download { + optional bytes file_id = 1; + optional bytes playback_id = 2; + optional int64 bytes_from_ap = 3; + optional int64 waste_from_ap = 4; + optional int64 reqs_from_ap = 5; + optional int64 error_from_ap = 6; + optional int64 bytes_from_cdn = 7; + optional int64 waste_from_cdn = 8; + optional int64 bytes_from_cache = 9; + optional int64 content_size = 10; + optional string content_type = 11; + optional int64 ap_initial_latency = 12; + optional int64 ap_max_latency = 13; + optional int64 ap_min_latency = 14; + optional double ap_avg_latency = 15; + optional int64 ap_median_latency = 16; + optional double ap_avg_bw = 17; + optional int64 cdn_initial_latency = 18; + optional int64 cdn_max_latency = 19; + optional int64 cdn_min_latency = 20; + optional double cdn_avg_latency = 21; + optional int64 cdn_median_latency = 22; + optional int64 cdn_64k_initial_latency = 23; + optional int64 cdn_64k_max_latency = 24; + optional int64 cdn_64k_min_latency = 25; + optional double cdn_64k_avg_latency = 26; + optional int64 cdn_64k_median_latency = 27; + optional double cdn_avg_bw = 28; + optional double cdn_initial_bw_estimate = 29; + optional string cdn_uri_scheme = 30; + optional string cdn_domain = 31; + optional string cdn_socket_reuse = 32; + optional int64 num_cache_error = 33; + optional int64 bytes_from_carrier = 34; + optional int64 bytes_from_unknown = 35; + optional int64 bytes_from_wifi = 36; + optional int64 bytes_from_ethernet = 37; + optional string request_type = 38; + optional int64 total_time = 39; + optional int64 bitrate = 40; + optional int64 reqs_from_cdn = 41; + optional int64 error_from_cdn = 42; + optional string file_origin = 43; + optional string initial_disk_state = 44; + optional bool locked = 45; +} diff --git a/lib/spot/proto/DrmRequestFailure.proto b/lib/spot/proto/DrmRequestFailure.proto new file mode 100644 index 0000000..8f7df23 --- /dev/null +++ b/lib/spot/proto/DrmRequestFailure.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DrmRequestFailure { + optional string reason = 1; + optional int64 error_code = 2; + optional bool fatal = 3; + optional bytes playback_id = 4; +} diff --git a/lib/spot/proto/EndAd.proto b/lib/spot/proto/EndAd.proto new file mode 100644 index 0000000..cff0b7b --- /dev/null +++ b/lib/spot/proto/EndAd.proto @@ -0,0 +1,34 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message EndAd { + optional bytes file_id = 1; + optional bytes playback_id = 2; + optional bytes song_id = 3; + optional string source_start = 4; + optional string reason_start = 5; + optional string source_end = 6; + optional string reason_end = 7; + optional int64 bytes_played = 8; + optional int64 bytes_in_song = 9; + optional int64 ms_played = 10; + optional int64 ms_total_est = 11; + optional int64 ms_rcv_latency = 12; + optional int64 n_seekback = 13; + optional int64 ms_seekback = 14; + optional int64 n_seekfwd = 15; + optional int64 ms_seekfwd = 16; + optional int64 ms_latency = 17; + optional int64 n_stutter = 18; + optional int64 p_lowbuffer = 19; + optional bool skipped = 20; + optional bool ad_clicked = 21; + optional string token = 22; + optional int64 client_ad_count = 23; + optional int64 client_campaign_count = 24; +} diff --git a/lib/spot/proto/EventSenderInternalErrorNonAuth.proto b/lib/spot/proto/EventSenderInternalErrorNonAuth.proto new file mode 100644 index 0000000..e6fe182 --- /dev/null +++ b/lib/spot/proto/EventSenderInternalErrorNonAuth.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message EventSenderInternalErrorNonAuth { + optional string error_message = 1; + optional string error_type = 2; + optional string error_context = 3; + optional int32 error_code = 4; +} diff --git a/lib/spot/proto/EventSenderStats.proto b/lib/spot/proto/EventSenderStats.proto new file mode 100644 index 0000000..88be6fe --- /dev/null +++ b/lib/spot/proto/EventSenderStats.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message EventSenderStats { + map storage_size = 1; + map sequence_number_min = 2; + map sequence_number_next = 3; +} diff --git a/lib/spot/proto/EventSenderStats2NonAuth.proto b/lib/spot/proto/EventSenderStats2NonAuth.proto new file mode 100644 index 0000000..e55eaa6 --- /dev/null +++ b/lib/spot/proto/EventSenderStats2NonAuth.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message EventSenderStats2NonAuth { + repeated bytes sequence_ids = 1; + repeated string event_names = 2; + repeated int32 loss_stats_num_entries_per_sequence_id = 3; + repeated int32 loss_stats_event_name_index = 4; + repeated int64 loss_stats_storage_sizes = 5; + repeated int64 loss_stats_sequence_number_mins = 6; + repeated int64 loss_stats_sequence_number_nexts = 7; + repeated int32 ratelimiter_stats_event_name_index = 8; + repeated int64 ratelimiter_stats_drop_count = 9; + repeated int32 drop_list_num_entries_per_sequence_id = 10; + repeated int32 drop_list_event_name_index = 11; + repeated int64 drop_list_counts_total = 12; + repeated int64 drop_list_counts_unreported = 13; +} diff --git a/lib/spot/proto/ExternalDeviceInfo.proto b/lib/spot/proto/ExternalDeviceInfo.proto new file mode 100644 index 0000000..f590df2 --- /dev/null +++ b/lib/spot/proto/ExternalDeviceInfo.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ExternalDeviceInfo { + optional string type = 1; + optional string subtype = 2; + optional string reason = 3; + optional bool taken_over = 4; + optional int64 num_tracks = 5; + optional int64 num_purchased_tracks = 6; + optional int64 num_playlists = 7; + optional string error = 8; + optional bool full = 9; + optional bool sync_all = 10; +} diff --git a/lib/spot/proto/GetInfoFailures.proto b/lib/spot/proto/GetInfoFailures.proto new file mode 100644 index 0000000..868ae5b --- /dev/null +++ b/lib/spot/proto/GetInfoFailures.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message GetInfoFailures { + optional string device_id = 1; + optional int64 error_code = 2; + optional string request = 3; + optional string response_body = 4; + optional string context = 5; +} diff --git a/lib/spot/proto/HeadFileDownload.proto b/lib/spot/proto/HeadFileDownload.proto new file mode 100644 index 0000000..b0d7279 --- /dev/null +++ b/lib/spot/proto/HeadFileDownload.proto @@ -0,0 +1,27 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message HeadFileDownload { + optional bytes file_id = 1; + optional bytes playback_id = 2; + optional string cdn_uri_scheme = 3; + optional string cdn_domain = 4; + optional int64 head_file_size = 5; + optional int64 bytes_downloaded = 6; + optional int64 bytes_wasted = 7; + optional int64 http_latency = 8; + optional int64 http_64k_latency = 9; + optional int64 total_time = 10; + optional int64 http_result = 11; + optional int64 error_code = 12; + optional int64 cached_bytes = 13; + optional int64 bytes_from_cache = 14; + optional string socket_reuse = 15; + optional string request_type = 16; + optional string initial_disk_state = 17; +} diff --git a/lib/spot/proto/LegacyEndSong.proto b/lib/spot/proto/LegacyEndSong.proto new file mode 100644 index 0000000..9366f18 --- /dev/null +++ b/lib/spot/proto/LegacyEndSong.proto @@ -0,0 +1,62 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message LegacyEndSong { + optional int64 sequence_number = 1; + optional string sequence_id = 2; + optional bytes playback_id = 3; + optional bytes parent_playback_id = 4; + optional string source_start = 5; + optional string reason_start = 6; + optional string source_end = 7; + optional string reason_end = 8; + optional int64 bytes_played = 9; + optional int64 bytes_in_song = 10; + optional int64 ms_played = 11; + optional int64 ms_nominal_played = 12; + optional int64 ms_total_est = 13; + optional int64 ms_rcv_latency = 14; + optional int64 ms_overlapping = 15; + optional int64 n_seekback = 16; + optional int64 ms_seekback = 17; + optional int64 n_seekfwd = 18; + optional int64 ms_seekfwd = 19; + optional int64 ms_latency = 20; + optional int64 ui_latency = 21; + optional string player_id = 22; + optional int64 ms_key_latency = 23; + optional bool offline_key = 24; + optional bool cached_key = 25; + optional int64 n_stutter = 26; + optional int64 p_lowbuffer = 27; + optional bool shuffle = 28; + optional int64 max_continous = 29; + optional int64 union_played = 30; + optional int64 artificial_delay = 31; + optional int64 bitrate = 32; + optional string play_context = 33; + optional string audiocodec = 34; + optional string play_track = 35; + optional string display_track = 36; + optional bool offline = 37; + optional int64 offline_timestamp = 38; + optional bool incognito_mode = 39; + optional string provider = 40; + optional string referer = 41; + optional string referrer_version = 42; + optional string referrer_vendor = 43; + optional string transition = 44; + optional string streaming_rule = 45; + optional string gaia_dev_id = 46; + optional string accepted_tc = 47; + optional string promotion_type = 48; + optional string page_instance_id = 49; + optional string interaction_id = 50; + optional string parent_play_track = 51; + optional int64 core_version = 52; +} diff --git a/lib/spot/proto/LocalFileSyncError.proto b/lib/spot/proto/LocalFileSyncError.proto new file mode 100644 index 0000000..0403dba --- /dev/null +++ b/lib/spot/proto/LocalFileSyncError.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message LocalFileSyncError { + optional string error = 1; +} diff --git a/lib/spot/proto/LocalFilesError.proto b/lib/spot/proto/LocalFilesError.proto new file mode 100644 index 0000000..f49d805 --- /dev/null +++ b/lib/spot/proto/LocalFilesError.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message LocalFilesError { + optional int64 error_code = 1; + optional string context = 2; + optional string info = 3; +} diff --git a/lib/spot/proto/LocalFilesImport.proto b/lib/spot/proto/LocalFilesImport.proto new file mode 100644 index 0000000..4674e72 --- /dev/null +++ b/lib/spot/proto/LocalFilesImport.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message LocalFilesImport { + optional int64 tracks = 1; + optional int64 duplicate_tracks = 2; + optional int64 failed_tracks = 3; + optional int64 matched_tracks = 4; + optional string source = 5; + optional int64 invalid_tracks = 6; +} diff --git a/lib/spot/proto/LocalFilesReport.proto b/lib/spot/proto/LocalFilesReport.proto new file mode 100644 index 0000000..cd5c99d --- /dev/null +++ b/lib/spot/proto/LocalFilesReport.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message LocalFilesReport { + optional int64 total_tracks = 1; + optional int64 total_size = 2; + optional int64 owned_tracks = 3; + optional int64 owned_size = 4; + optional int64 tracks_not_found = 5; + optional int64 tracks_bad_format = 6; + optional int64 tracks_drm_protected = 7; + optional int64 tracks_unknown_pruned = 8; + optional int64 tracks_reallocated_repaired = 9; + optional int64 enabled_sources = 10; +} diff --git a/lib/spot/proto/LocalFilesSourceReport.proto b/lib/spot/proto/LocalFilesSourceReport.proto new file mode 100644 index 0000000..9dbd4bd --- /dev/null +++ b/lib/spot/proto/LocalFilesSourceReport.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message LocalFilesSourceReport { + optional string id = 1; + optional int64 tracks = 2; +} diff --git a/lib/spot/proto/MdnsLoginFailures.proto b/lib/spot/proto/MdnsLoginFailures.proto new file mode 100644 index 0000000..cd03656 --- /dev/null +++ b/lib/spot/proto/MdnsLoginFailures.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message MdnsLoginFailures { + optional string device_id = 1; + optional int64 error_code = 2; + optional string response_body = 3; + optional string request = 4; + optional int64 esdk_internal_error_code = 5; + optional string context = 6; +} diff --git a/lib/spot/proto/MetadataExtensionClientStatistic.proto b/lib/spot/proto/MetadataExtensionClientStatistic.proto new file mode 100644 index 0000000..253e0e1 --- /dev/null +++ b/lib/spot/proto/MetadataExtensionClientStatistic.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message MetadataExtensionClientStatistic { + optional bytes task_id = 1; + optional string feature_id = 2; + optional bool is_online_param = 3; + optional int32 num_extensions_with_etags = 4; + optional int32 num_extensions_requested = 5; + optional int32 num_extensions_needed = 6; + optional int32 num_uris_requested = 7; + optional int32 num_uris_needed = 8; + optional int32 num_prepared_requests = 9; + optional int32 num_sent_requests = 10; +} diff --git a/lib/spot/proto/Offline2ClientError.proto b/lib/spot/proto/Offline2ClientError.proto new file mode 100644 index 0000000..55c9ca2 --- /dev/null +++ b/lib/spot/proto/Offline2ClientError.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message Offline2ClientError { + optional string error = 1; + optional string device_id = 2; + optional string cache_id = 3; +} diff --git a/lib/spot/proto/Offline2ClientEvent.proto b/lib/spot/proto/Offline2ClientEvent.proto new file mode 100644 index 0000000..b45bfd5 --- /dev/null +++ b/lib/spot/proto/Offline2ClientEvent.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message Offline2ClientEvent { + optional string event = 1; + optional string device_id = 2; + optional string cache_id = 3; +} diff --git a/lib/spot/proto/OfflineError.proto b/lib/spot/proto/OfflineError.proto new file mode 100644 index 0000000..e669ce4 --- /dev/null +++ b/lib/spot/proto/OfflineError.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message OfflineError { + optional int64 error_code = 1; + optional string track = 2; +} diff --git a/lib/spot/proto/OfflineEvent.proto b/lib/spot/proto/OfflineEvent.proto new file mode 100644 index 0000000..e924f09 --- /dev/null +++ b/lib/spot/proto/OfflineEvent.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message OfflineEvent { + optional string event = 1; + optional string data = 2; +} diff --git a/lib/spot/proto/OfflineReport.proto b/lib/spot/proto/OfflineReport.proto new file mode 100644 index 0000000..2835f77 --- /dev/null +++ b/lib/spot/proto/OfflineReport.proto @@ -0,0 +1,26 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message OfflineReport { + optional int64 total_num_tracks = 1; + optional int64 num_downloaded_tracks = 2; + optional int64 num_downloaded_tracks_keyless = 3; + optional int64 total_num_links = 4; + optional int64 total_num_links_keyless = 5; + map context_num_links_map = 6; + map linktype_num_tracks_map = 7; + optional int64 track_limit = 8; + optional int64 expiry = 9; + optional string change_reason = 10; + optional int64 offline_keys = 11; + optional int64 cached_keys = 12; + optional int64 total_num_episodes = 13; + optional int64 num_downloaded_episodes = 14; + optional int64 episode_limit = 15; + optional int64 episode_expiry = 16; +} diff --git a/lib/spot/proto/PlaybackError.proto b/lib/spot/proto/PlaybackError.proto new file mode 100644 index 0000000..6897490 --- /dev/null +++ b/lib/spot/proto/PlaybackError.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PlaybackError { + optional bytes file_id = 1; + optional bytes playback_id = 2; + optional string track_id = 3; + optional int64 bitrate = 4; + optional int64 error_code = 5; + optional bool fatal = 6; + optional string audiocodec = 7; + optional bool external_track = 8; + optional int64 position_ms = 9; +} diff --git a/lib/spot/proto/PlaybackRetry.proto b/lib/spot/proto/PlaybackRetry.proto new file mode 100644 index 0000000..82b9e9b --- /dev/null +++ b/lib/spot/proto/PlaybackRetry.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PlaybackRetry { + optional string track = 1; + optional bytes playback_id = 2; + optional string method = 3; + optional string status = 4; + optional string reason = 5; +} diff --git a/lib/spot/proto/PlaybackSegments.proto b/lib/spot/proto/PlaybackSegments.proto new file mode 100644 index 0000000..bd5026c --- /dev/null +++ b/lib/spot/proto/PlaybackSegments.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PlaybackSegments { + optional bytes playback_id = 1; + optional string track_uri = 2; + optional bool overflow = 3; + optional string segments = 4; +} diff --git a/lib/spot/proto/PlayerStateRestore.proto b/lib/spot/proto/PlayerStateRestore.proto new file mode 100644 index 0000000..f9778a7 --- /dev/null +++ b/lib/spot/proto/PlayerStateRestore.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PlayerStateRestore { + optional string error = 1; + optional int64 size = 2; + optional string context_uri = 3; + optional string state = 4; +} diff --git a/lib/spot/proto/PlaylistSyncEvent.proto b/lib/spot/proto/PlaylistSyncEvent.proto new file mode 100644 index 0000000..6f2a23e --- /dev/null +++ b/lib/spot/proto/PlaylistSyncEvent.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PlaylistSyncEvent { + optional string playlist_id = 1; + optional bool is_playlist = 2; + optional int64 timestamp_ms = 3; + optional int32 error_code = 4; + optional string event_description = 5; +} diff --git a/lib/spot/proto/PodcastAdSegmentReceived.proto b/lib/spot/proto/PodcastAdSegmentReceived.proto new file mode 100644 index 0000000..036fb6d --- /dev/null +++ b/lib/spot/proto/PodcastAdSegmentReceived.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PodcastAdSegmentReceived { + optional string episode_uri = 1; + optional string playback_id = 2; + optional string slots = 3; + optional bool is_audio = 4; +} diff --git a/lib/spot/proto/Prefetch.proto b/lib/spot/proto/Prefetch.proto new file mode 100644 index 0000000..c388668 --- /dev/null +++ b/lib/spot/proto/Prefetch.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message Prefetch { + optional int64 strategies = 1; + optional int64 strategy = 2; + optional bytes file_id = 3; + optional string track = 4; + optional int64 prefetch_index = 5; + optional int64 current_window_size = 6; + optional int64 max_window_size = 7; +} diff --git a/lib/spot/proto/PrefetchError.proto b/lib/spot/proto/PrefetchError.proto new file mode 100644 index 0000000..6a1e56b --- /dev/null +++ b/lib/spot/proto/PrefetchError.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PrefetchError { + optional int64 strategy = 1; + optional string description = 2; +} diff --git a/lib/spot/proto/ProductStateUcsVerification.proto b/lib/spot/proto/ProductStateUcsVerification.proto new file mode 100644 index 0000000..9525753 --- /dev/null +++ b/lib/spot/proto/ProductStateUcsVerification.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ProductStateUcsVerification { + map additional_entries = 1; + map missing_entries = 2; + optional string fetch_type = 3; +} diff --git a/lib/spot/proto/PubSubCountPerIdent.proto b/lib/spot/proto/PubSubCountPerIdent.proto new file mode 100644 index 0000000..a2d1e09 --- /dev/null +++ b/lib/spot/proto/PubSubCountPerIdent.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message PubSubCountPerIdent { + optional string ident_filter = 1; + optional int32 no_of_messages_received = 2; + optional int32 no_of_failed_conversions = 3; +} diff --git a/lib/spot/proto/RawCoreStream.proto b/lib/spot/proto/RawCoreStream.proto new file mode 100644 index 0000000..848b945 --- /dev/null +++ b/lib/spot/proto/RawCoreStream.proto @@ -0,0 +1,52 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message RawCoreStream { + optional bytes playback_id = 1; + optional bytes parent_playback_id = 2; + optional string video_session_id = 3; + optional bytes media_id = 4; + optional string media_type = 5; + optional string feature_identifier = 6; + optional string feature_version = 7; + optional string view_uri = 8; + optional string source_start = 9; + optional string reason_start = 10; + optional string source_end = 11; + optional string reason_end = 12; + optional int64 playback_start_time = 13; + optional int32 ms_played = 14; + optional int32 ms_played_nominal = 15; + optional int32 ms_played_overlapping = 16; + optional int32 ms_played_video = 17; + optional int32 ms_played_background = 18; + optional int32 ms_played_fullscreen = 19; + optional bool live = 20; + optional bool shuffle = 21; + optional string audio_format = 22; + optional string play_context = 23; + optional string content_uri = 24; + optional string displayed_content_uri = 25; + optional bool content_is_downloaded = 26; + optional bool incognito_mode = 27; + optional string provider = 28; + optional string referrer = 29; + optional string referrer_version = 30; + optional string referrer_vendor = 31; + optional string streaming_rule = 32; + optional string connect_controller_device_id = 33; + optional string page_instance_id = 34; + optional string interaction_id = 35; + optional string parent_content_uri = 36; + optional int64 core_version = 37; + optional string core_bundle = 38; + optional bool is_assumed_premium = 39; + optional int32 ms_played_external = 40; + optional string local_content_uri = 41; + optional bool client_offline_at_stream_start = 42; +} diff --git a/lib/spot/proto/ReachabilityChanged.proto b/lib/spot/proto/ReachabilityChanged.proto new file mode 100644 index 0000000..d8e3bc1 --- /dev/null +++ b/lib/spot/proto/ReachabilityChanged.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ReachabilityChanged { + optional string type = 1; + optional string info = 2; +} diff --git a/lib/spot/proto/RejectedClientEventNonAuth.proto b/lib/spot/proto/RejectedClientEventNonAuth.proto new file mode 100644 index 0000000..d592809 --- /dev/null +++ b/lib/spot/proto/RejectedClientEventNonAuth.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message RejectedClientEventNonAuth { + optional string reject_reason = 1; + optional string event_name = 2; +} diff --git a/lib/spot/proto/RemainingSkips.proto b/lib/spot/proto/RemainingSkips.proto new file mode 100644 index 0000000..d6ceebc --- /dev/null +++ b/lib/spot/proto/RemainingSkips.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message RemainingSkips { + optional string interaction_id = 1; + optional int32 remaining_skips_before_skip = 2; + optional int32 remaining_skips_after_skip = 3; + repeated string interaction_ids = 4; +} diff --git a/lib/spot/proto/RequestAccounting.proto b/lib/spot/proto/RequestAccounting.proto new file mode 100644 index 0000000..897cffb --- /dev/null +++ b/lib/spot/proto/RequestAccounting.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message RequestAccounting { + optional string request = 1; + optional int64 downloaded = 2; + optional int64 uploaded = 3; + optional int64 num_requests = 4; + optional string connection = 5; + optional string source_identifier = 6; + optional string reason = 7; + optional int64 duration_ms = 8; +} diff --git a/lib/spot/proto/RequestTime.proto b/lib/spot/proto/RequestTime.proto new file mode 100644 index 0000000..f0b7134 --- /dev/null +++ b/lib/spot/proto/RequestTime.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message RequestTime { + optional string type = 1; + optional int64 first_byte = 2; + optional int64 last_byte = 3; + optional int64 size = 4; + optional int64 size_sent = 5; + optional bool error = 6; + optional string url = 7; + optional string verb = 8; + optional int64 payload_size_sent = 9; + optional int32 connection_reuse = 10; + optional double sampling_probability = 11; + optional bool cached = 12; +} diff --git a/lib/spot/proto/StartTrack.proto b/lib/spot/proto/StartTrack.proto new file mode 100644 index 0000000..5bbf527 --- /dev/null +++ b/lib/spot/proto/StartTrack.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message StartTrack { + optional bytes playback_id = 1; + optional string context_player_session_id = 2; + optional int64 timestamp = 3; +} diff --git a/lib/spot/proto/Stutter.proto b/lib/spot/proto/Stutter.proto new file mode 100644 index 0000000..bd0b298 --- /dev/null +++ b/lib/spot/proto/Stutter.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message Stutter { + optional bytes file_id = 1; + optional bytes playback_id = 2; + optional string track = 3; + optional int64 buffer_size = 4; + optional int64 max_buffer_size = 5; + optional int64 file_byte_offset = 6; + optional int64 file_byte_total = 7; + optional int64 target_buffer = 8; + optional string audio_driver = 9; +} diff --git a/lib/spot/proto/TierFeatureFlags.proto b/lib/spot/proto/TierFeatureFlags.proto new file mode 100644 index 0000000..01f4311 --- /dev/null +++ b/lib/spot/proto/TierFeatureFlags.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message TierFeatureFlags { + optional bool ads = 1; + optional bool high_quality = 2; + optional bool offline = 3; + optional bool on_demand = 4; + optional string max_album_plays_consecutive = 5; + optional string max_album_plays_per_hour = 6; + optional string max_skips_per_hour = 7; + optional string max_track_plays_per_hour = 8; +} diff --git a/lib/spot/proto/TrackNotPlayed.proto b/lib/spot/proto/TrackNotPlayed.proto new file mode 100644 index 0000000..58c3ead --- /dev/null +++ b/lib/spot/proto/TrackNotPlayed.proto @@ -0,0 +1,24 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message TrackNotPlayed { + optional bytes playback_id = 1; + optional string source_start = 2; + optional string reason_start = 3; + optional string source_end = 4; + optional string reason_end = 5; + optional string play_context = 6; + optional string play_track = 7; + optional string display_track = 8; + optional string provider = 9; + optional string referer = 10; + optional string referrer_version = 11; + optional string referrer_vendor = 12; + optional string gaia_dev_id = 13; + optional string reason_not_played = 14; +} diff --git a/lib/spot/proto/TrackStuck.proto b/lib/spot/proto/TrackStuck.proto new file mode 100644 index 0000000..566d649 --- /dev/null +++ b/lib/spot/proto/TrackStuck.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message TrackStuck { + optional string track = 1; + optional bytes playback_id = 2; + optional string source_start = 3; + optional string reason_start = 4; + optional bool offline = 5; + optional int64 position = 6; + optional int64 count = 7; + optional string audio_driver = 8; +} diff --git a/lib/spot/proto/WindowSize.proto b/lib/spot/proto/WindowSize.proto new file mode 100644 index 0000000..7860b1e --- /dev/null +++ b/lib/spot/proto/WindowSize.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message WindowSize { + optional int64 width = 1; + optional int64 height = 2; + optional int64 mode = 3; + optional int64 duration = 4; +} diff --git a/lib/spot/proto/apiv1.proto b/lib/spot/proto/apiv1.proto new file mode 100644 index 0000000..2d8b9c2 --- /dev/null +++ b/lib/spot/proto/apiv1.proto @@ -0,0 +1,108 @@ +// No longer present in Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.offline.proto; + +import "google/protobuf/timestamp.proto"; +import "offline.proto"; + +option optimize_for = CODE_SIZE; + +message ListDevicesRequest { + string user_id = 1; +} + +message ListDevicesResponse { + repeated Device devices = 1; +} + +message PutDeviceRequest { + string user_id = 1; + + Body body = 2; + message Body { + Device device = 1; + } +} + +message BasicDeviceRequest { + DeviceKey key = 1; +} + +message GetDeviceResponse { + Device device = 1; +} + +message RemoveDeviceRequest { + DeviceKey key = 1; + bool is_force_remove = 2; +} + +message OfflineEnableDeviceResponse { + Restrictions restrictions = 1; +} + +message ListResourcesResponse { + repeated Resource resources = 1; + google.protobuf.Timestamp server_time = 2; +} + +message WriteResourcesRequest { + DeviceKey key = 1; + + Body body = 2; + message Body { + repeated ResourceOperation operations = 1; + string source_device_id = 2; + string source_cache_id = 3; + } +} + +message ResourcesUpdate { + string source_device_id = 1; + string source_cache_id = 2; +} + +message DeltaResourcesRequest { + DeviceKey key = 1; + + Body body = 2; + message Body { + google.protobuf.Timestamp last_known_server_time = 1; + } +} + +message DeltaResourcesResponse { + bool delta_update_possible = 1; + repeated ResourceOperation operations = 2; + google.protobuf.Timestamp server_time = 3; +} + +message GetResourceRequest { + DeviceKey key = 1; + string uri = 2; +} + +message GetResourceResponse { + Resource resource = 1; +} + +message WriteResourcesDetailsRequest { + DeviceKey key = 1; + + Body body = 2; + message Body { + repeated Resource resources = 1; + } +} + +message GetResourceForDevicesRequest { + string user_id = 1; + string uri = 2; +} + +message GetResourceForDevicesResponse { + repeated Device devices = 1; + repeated ResourceForDevice resources = 2; +} diff --git a/lib/spot/proto/app_state.proto b/lib/spot/proto/app_state.proto new file mode 100644 index 0000000..fb4b07a --- /dev/null +++ b/lib/spot/proto/app_state.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.offline.proto; + +option optimize_for = CODE_SIZE; + +message AppStateRequest { + AppState state = 1; +} + +enum AppState { + UNKNOWN = 0; + BACKGROUND = 1; + FOREGROUND = 2; +} diff --git a/lib/spot/proto/audio_files_extension.proto b/lib/spot/proto/audio_files_extension.proto new file mode 100644 index 0000000..32efd99 --- /dev/null +++ b/lib/spot/proto/audio_files_extension.proto @@ -0,0 +1,27 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.extendedmetadata.audiofiles; + +import "metadata.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.audiophile.proto"; + +message NormalizationParams { + float loudness_db = 1; + float true_peak_db = 2; +} + +message ExtendedAudioFile { + metadata.AudioFile file = 1; + NormalizationParams file_normalization_params = 2; + NormalizationParams album_normalization_params = 3; +} + +message AudioFilesExtensionResponse { + repeated ExtendedAudioFile files = 1; + NormalizationParams default_file_normalization_params = 2; + NormalizationParams default_album_normalization_params = 3; +} diff --git a/lib/spot/proto/authentication.pb.go b/lib/spot/proto/authentication.pb.go new file mode 100644 index 0000000..dd705d8 --- /dev/null +++ b/lib/spot/proto/authentication.pb.go @@ -0,0 +1,2011 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: proto/authentication.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type AuthenticationType int32 + +const ( + AuthenticationType_AUTHENTICATION_USER_PASS AuthenticationType = 0 + AuthenticationType_AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS AuthenticationType = 1 + AuthenticationType_AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS AuthenticationType = 2 + AuthenticationType_AUTHENTICATION_SPOTIFY_TOKEN AuthenticationType = 3 + AuthenticationType_AUTHENTICATION_FACEBOOK_TOKEN AuthenticationType = 4 +) + +// Enum value maps for AuthenticationType. +var ( + AuthenticationType_name = map[int32]string{ + 0: "AUTHENTICATION_USER_PASS", + 1: "AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS", + 2: "AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS", + 3: "AUTHENTICATION_SPOTIFY_TOKEN", + 4: "AUTHENTICATION_FACEBOOK_TOKEN", + } + AuthenticationType_value = map[string]int32{ + "AUTHENTICATION_USER_PASS": 0, + "AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS": 1, + "AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS": 2, + "AUTHENTICATION_SPOTIFY_TOKEN": 3, + "AUTHENTICATION_FACEBOOK_TOKEN": 4, + } +) + +func (x AuthenticationType) Enum() *AuthenticationType { + p := new(AuthenticationType) + *p = x + return p +} + +func (x AuthenticationType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AuthenticationType) Descriptor() protoreflect.EnumDescriptor { + return file_proto_authentication_proto_enumTypes[0].Descriptor() +} + +func (AuthenticationType) Type() protoreflect.EnumType { + return &file_proto_authentication_proto_enumTypes[0] +} + +func (x AuthenticationType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *AuthenticationType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = AuthenticationType(num) + return nil +} + +// Deprecated: Use AuthenticationType.Descriptor instead. +func (AuthenticationType) EnumDescriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{0} +} + +type AccountCreation int32 + +const ( + AccountCreation_ACCOUNT_CREATION_ALWAYS_PROMPT AccountCreation = 1 + AccountCreation_ACCOUNT_CREATION_ALWAYS_CREATE AccountCreation = 3 +) + +// Enum value maps for AccountCreation. +var ( + AccountCreation_name = map[int32]string{ + 1: "ACCOUNT_CREATION_ALWAYS_PROMPT", + 3: "ACCOUNT_CREATION_ALWAYS_CREATE", + } + AccountCreation_value = map[string]int32{ + "ACCOUNT_CREATION_ALWAYS_PROMPT": 1, + "ACCOUNT_CREATION_ALWAYS_CREATE": 3, + } +) + +func (x AccountCreation) Enum() *AccountCreation { + p := new(AccountCreation) + *p = x + return p +} + +func (x AccountCreation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AccountCreation) Descriptor() protoreflect.EnumDescriptor { + return file_proto_authentication_proto_enumTypes[1].Descriptor() +} + +func (AccountCreation) Type() protoreflect.EnumType { + return &file_proto_authentication_proto_enumTypes[1] +} + +func (x AccountCreation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *AccountCreation) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = AccountCreation(num) + return nil +} + +// Deprecated: Use AccountCreation.Descriptor instead. +func (AccountCreation) EnumDescriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{1} +} + +type CpuFamily int32 + +const ( + CpuFamily_CPU_UNKNOWN CpuFamily = 0 + CpuFamily_CPU_X86 CpuFamily = 1 + CpuFamily_CPU_X86_64 CpuFamily = 2 + CpuFamily_CPU_PPC CpuFamily = 3 + CpuFamily_CPU_PPC_64 CpuFamily = 4 + CpuFamily_CPU_ARM CpuFamily = 5 + CpuFamily_CPU_IA64 CpuFamily = 6 + CpuFamily_CPU_SH CpuFamily = 7 + CpuFamily_CPU_MIPS CpuFamily = 8 + CpuFamily_CPU_BLACKFIN CpuFamily = 9 +) + +// Enum value maps for CpuFamily. +var ( + CpuFamily_name = map[int32]string{ + 0: "CPU_UNKNOWN", + 1: "CPU_X86", + 2: "CPU_X86_64", + 3: "CPU_PPC", + 4: "CPU_PPC_64", + 5: "CPU_ARM", + 6: "CPU_IA64", + 7: "CPU_SH", + 8: "CPU_MIPS", + 9: "CPU_BLACKFIN", + } + CpuFamily_value = map[string]int32{ + "CPU_UNKNOWN": 0, + "CPU_X86": 1, + "CPU_X86_64": 2, + "CPU_PPC": 3, + "CPU_PPC_64": 4, + "CPU_ARM": 5, + "CPU_IA64": 6, + "CPU_SH": 7, + "CPU_MIPS": 8, + "CPU_BLACKFIN": 9, + } +) + +func (x CpuFamily) Enum() *CpuFamily { + p := new(CpuFamily) + *p = x + return p +} + +func (x CpuFamily) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CpuFamily) Descriptor() protoreflect.EnumDescriptor { + return file_proto_authentication_proto_enumTypes[2].Descriptor() +} + +func (CpuFamily) Type() protoreflect.EnumType { + return &file_proto_authentication_proto_enumTypes[2] +} + +func (x CpuFamily) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *CpuFamily) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = CpuFamily(num) + return nil +} + +// Deprecated: Use CpuFamily.Descriptor instead. +func (CpuFamily) EnumDescriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{2} +} + +type Brand int32 + +const ( + Brand_BRAND_UNBRANDED Brand = 0 + Brand_BRAND_INQ Brand = 1 + Brand_BRAND_HTC Brand = 2 + Brand_BRAND_NOKIA Brand = 3 +) + +// Enum value maps for Brand. +var ( + Brand_name = map[int32]string{ + 0: "BRAND_UNBRANDED", + 1: "BRAND_INQ", + 2: "BRAND_HTC", + 3: "BRAND_NOKIA", + } + Brand_value = map[string]int32{ + "BRAND_UNBRANDED": 0, + "BRAND_INQ": 1, + "BRAND_HTC": 2, + "BRAND_NOKIA": 3, + } +) + +func (x Brand) Enum() *Brand { + p := new(Brand) + *p = x + return p +} + +func (x Brand) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Brand) Descriptor() protoreflect.EnumDescriptor { + return file_proto_authentication_proto_enumTypes[3].Descriptor() +} + +func (Brand) Type() protoreflect.EnumType { + return &file_proto_authentication_proto_enumTypes[3] +} + +func (x Brand) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Brand) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Brand(num) + return nil +} + +// Deprecated: Use Brand.Descriptor instead. +func (Brand) EnumDescriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{3} +} + +type Os int32 + +const ( + Os_OS_UNKNOWN Os = 0 + Os_OS_WINDOWS Os = 1 + Os_OS_OSX Os = 2 + Os_OS_IPHONE Os = 3 + Os_OS_S60 Os = 4 + Os_OS_LINUX Os = 5 + Os_OS_WINDOWS_CE Os = 6 + Os_OS_ANDROID Os = 7 + Os_OS_PALM Os = 8 + Os_OS_FREEBSD Os = 9 + Os_OS_BLACKBERRY Os = 10 + Os_OS_SONOS Os = 11 + Os_OS_LOGITECH Os = 12 + Os_OS_WP7 Os = 13 + Os_OS_ONKYO Os = 14 + Os_OS_PHILIPS Os = 15 + Os_OS_WD Os = 16 + Os_OS_VOLVO Os = 17 + Os_OS_TIVO Os = 18 + Os_OS_AWOX Os = 19 + Os_OS_MEEGO Os = 20 + Os_OS_QNXNTO Os = 21 + Os_OS_BCO Os = 22 +) + +// Enum value maps for Os. +var ( + Os_name = map[int32]string{ + 0: "OS_UNKNOWN", + 1: "OS_WINDOWS", + 2: "OS_OSX", + 3: "OS_IPHONE", + 4: "OS_S60", + 5: "OS_LINUX", + 6: "OS_WINDOWS_CE", + 7: "OS_ANDROID", + 8: "OS_PALM", + 9: "OS_FREEBSD", + 10: "OS_BLACKBERRY", + 11: "OS_SONOS", + 12: "OS_LOGITECH", + 13: "OS_WP7", + 14: "OS_ONKYO", + 15: "OS_PHILIPS", + 16: "OS_WD", + 17: "OS_VOLVO", + 18: "OS_TIVO", + 19: "OS_AWOX", + 20: "OS_MEEGO", + 21: "OS_QNXNTO", + 22: "OS_BCO", + } + Os_value = map[string]int32{ + "OS_UNKNOWN": 0, + "OS_WINDOWS": 1, + "OS_OSX": 2, + "OS_IPHONE": 3, + "OS_S60": 4, + "OS_LINUX": 5, + "OS_WINDOWS_CE": 6, + "OS_ANDROID": 7, + "OS_PALM": 8, + "OS_FREEBSD": 9, + "OS_BLACKBERRY": 10, + "OS_SONOS": 11, + "OS_LOGITECH": 12, + "OS_WP7": 13, + "OS_ONKYO": 14, + "OS_PHILIPS": 15, + "OS_WD": 16, + "OS_VOLVO": 17, + "OS_TIVO": 18, + "OS_AWOX": 19, + "OS_MEEGO": 20, + "OS_QNXNTO": 21, + "OS_BCO": 22, + } +) + +func (x Os) Enum() *Os { + p := new(Os) + *p = x + return p +} + +func (x Os) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Os) Descriptor() protoreflect.EnumDescriptor { + return file_proto_authentication_proto_enumTypes[4].Descriptor() +} + +func (Os) Type() protoreflect.EnumType { + return &file_proto_authentication_proto_enumTypes[4] +} + +func (x Os) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Os) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Os(num) + return nil +} + +// Deprecated: Use Os.Descriptor instead. +func (Os) EnumDescriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{4} +} + +type AccountType int32 + +const ( + AccountType_Spotify AccountType = 0 + AccountType_Facebook AccountType = 1 +) + +// Enum value maps for AccountType. +var ( + AccountType_name = map[int32]string{ + 0: "Spotify", + 1: "Facebook", + } + AccountType_value = map[string]int32{ + "Spotify": 0, + "Facebook": 1, + } +) + +func (x AccountType) Enum() *AccountType { + p := new(AccountType) + *p = x + return p +} + +func (x AccountType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AccountType) Descriptor() protoreflect.EnumDescriptor { + return file_proto_authentication_proto_enumTypes[5].Descriptor() +} + +func (AccountType) Type() protoreflect.EnumType { + return &file_proto_authentication_proto_enumTypes[5] +} + +func (x AccountType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *AccountType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = AccountType(num) + return nil +} + +// Deprecated: Use AccountType.Descriptor instead. +func (AccountType) EnumDescriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{5} +} + +type ClientResponseEncrypted struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LoginCredentials *LoginCredentials `protobuf:"bytes,10,req,name=login_credentials,json=loginCredentials" json:"login_credentials,omitempty"` + AccountCreation *AccountCreation `protobuf:"varint,20,opt,name=account_creation,json=accountCreation,enum=AccountCreation" json:"account_creation,omitempty"` + FingerprintResponse *FingerprintResponseUnion `protobuf:"bytes,30,opt,name=fingerprint_response,json=fingerprintResponse" json:"fingerprint_response,omitempty"` + PeerTicket *PeerTicketUnion `protobuf:"bytes,40,opt,name=peer_ticket,json=peerTicket" json:"peer_ticket,omitempty"` + SystemInfo *SystemInfo `protobuf:"bytes,50,req,name=system_info,json=systemInfo" json:"system_info,omitempty"` + PlatformModel *string `protobuf:"bytes,60,opt,name=platform_model,json=platformModel" json:"platform_model,omitempty"` + VersionString *string `protobuf:"bytes,70,opt,name=version_string,json=versionString" json:"version_string,omitempty"` + Appkey *LibspotifyAppKey `protobuf:"bytes,80,opt,name=appkey" json:"appkey,omitempty"` + ClientInfo *ClientInfo `protobuf:"bytes,90,opt,name=client_info,json=clientInfo" json:"client_info,omitempty"` +} + +func (x *ClientResponseEncrypted) Reset() { + *x = ClientResponseEncrypted{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientResponseEncrypted) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientResponseEncrypted) ProtoMessage() {} + +func (x *ClientResponseEncrypted) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientResponseEncrypted.ProtoReflect.Descriptor instead. +func (*ClientResponseEncrypted) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{0} +} + +func (x *ClientResponseEncrypted) GetLoginCredentials() *LoginCredentials { + if x != nil { + return x.LoginCredentials + } + return nil +} + +func (x *ClientResponseEncrypted) GetAccountCreation() AccountCreation { + if x != nil && x.AccountCreation != nil { + return *x.AccountCreation + } + return AccountCreation_ACCOUNT_CREATION_ALWAYS_PROMPT +} + +func (x *ClientResponseEncrypted) GetFingerprintResponse() *FingerprintResponseUnion { + if x != nil { + return x.FingerprintResponse + } + return nil +} + +func (x *ClientResponseEncrypted) GetPeerTicket() *PeerTicketUnion { + if x != nil { + return x.PeerTicket + } + return nil +} + +func (x *ClientResponseEncrypted) GetSystemInfo() *SystemInfo { + if x != nil { + return x.SystemInfo + } + return nil +} + +func (x *ClientResponseEncrypted) GetPlatformModel() string { + if x != nil && x.PlatformModel != nil { + return *x.PlatformModel + } + return "" +} + +func (x *ClientResponseEncrypted) GetVersionString() string { + if x != nil && x.VersionString != nil { + return *x.VersionString + } + return "" +} + +func (x *ClientResponseEncrypted) GetAppkey() *LibspotifyAppKey { + if x != nil { + return x.Appkey + } + return nil +} + +func (x *ClientResponseEncrypted) GetClientInfo() *ClientInfo { + if x != nil { + return x.ClientInfo + } + return nil +} + +type LoginCredentials struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username *string `protobuf:"bytes,10,opt,name=username" json:"username,omitempty"` + Typ *AuthenticationType `protobuf:"varint,20,req,name=typ,enum=AuthenticationType" json:"typ,omitempty"` + AuthData []byte `protobuf:"bytes,30,opt,name=auth_data,json=authData" json:"auth_data,omitempty"` +} + +func (x *LoginCredentials) Reset() { + *x = LoginCredentials{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LoginCredentials) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginCredentials) ProtoMessage() {} + +func (x *LoginCredentials) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginCredentials.ProtoReflect.Descriptor instead. +func (*LoginCredentials) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{1} +} + +func (x *LoginCredentials) GetUsername() string { + if x != nil && x.Username != nil { + return *x.Username + } + return "" +} + +func (x *LoginCredentials) GetTyp() AuthenticationType { + if x != nil && x.Typ != nil { + return *x.Typ + } + return AuthenticationType_AUTHENTICATION_USER_PASS +} + +func (x *LoginCredentials) GetAuthData() []byte { + if x != nil { + return x.AuthData + } + return nil +} + +type FingerprintResponseUnion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Grain *FingerprintGrainResponse `protobuf:"bytes,10,opt,name=grain" json:"grain,omitempty"` + HmacRipemd *FingerprintHmacRipemdResponse `protobuf:"bytes,20,opt,name=hmac_ripemd,json=hmacRipemd" json:"hmac_ripemd,omitempty"` +} + +func (x *FingerprintResponseUnion) Reset() { + *x = FingerprintResponseUnion{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FingerprintResponseUnion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FingerprintResponseUnion) ProtoMessage() {} + +func (x *FingerprintResponseUnion) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FingerprintResponseUnion.ProtoReflect.Descriptor instead. +func (*FingerprintResponseUnion) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{2} +} + +func (x *FingerprintResponseUnion) GetGrain() *FingerprintGrainResponse { + if x != nil { + return x.Grain + } + return nil +} + +func (x *FingerprintResponseUnion) GetHmacRipemd() *FingerprintHmacRipemdResponse { + if x != nil { + return x.HmacRipemd + } + return nil +} + +type FingerprintGrainResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EncryptedKey []byte `protobuf:"bytes,10,req,name=encrypted_key,json=encryptedKey" json:"encrypted_key,omitempty"` +} + +func (x *FingerprintGrainResponse) Reset() { + *x = FingerprintGrainResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FingerprintGrainResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FingerprintGrainResponse) ProtoMessage() {} + +func (x *FingerprintGrainResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FingerprintGrainResponse.ProtoReflect.Descriptor instead. +func (*FingerprintGrainResponse) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{3} +} + +func (x *FingerprintGrainResponse) GetEncryptedKey() []byte { + if x != nil { + return x.EncryptedKey + } + return nil +} + +type FingerprintHmacRipemdResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hmac []byte `protobuf:"bytes,10,req,name=hmac" json:"hmac,omitempty"` +} + +func (x *FingerprintHmacRipemdResponse) Reset() { + *x = FingerprintHmacRipemdResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FingerprintHmacRipemdResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FingerprintHmacRipemdResponse) ProtoMessage() {} + +func (x *FingerprintHmacRipemdResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FingerprintHmacRipemdResponse.ProtoReflect.Descriptor instead. +func (*FingerprintHmacRipemdResponse) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{4} +} + +func (x *FingerprintHmacRipemdResponse) GetHmac() []byte { + if x != nil { + return x.Hmac + } + return nil +} + +type PeerTicketUnion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKey *PeerTicketPublicKey `protobuf:"bytes,10,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` + OldTicket *PeerTicketOld `protobuf:"bytes,20,opt,name=old_ticket,json=oldTicket" json:"old_ticket,omitempty"` +} + +func (x *PeerTicketUnion) Reset() { + *x = PeerTicketUnion{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PeerTicketUnion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PeerTicketUnion) ProtoMessage() {} + +func (x *PeerTicketUnion) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PeerTicketUnion.ProtoReflect.Descriptor instead. +func (*PeerTicketUnion) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{5} +} + +func (x *PeerTicketUnion) GetPublicKey() *PeerTicketPublicKey { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *PeerTicketUnion) GetOldTicket() *PeerTicketOld { + if x != nil { + return x.OldTicket + } + return nil +} + +type PeerTicketPublicKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicKey []byte `protobuf:"bytes,10,req,name=public_key,json=publicKey" json:"public_key,omitempty"` +} + +func (x *PeerTicketPublicKey) Reset() { + *x = PeerTicketPublicKey{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PeerTicketPublicKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PeerTicketPublicKey) ProtoMessage() {} + +func (x *PeerTicketPublicKey) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PeerTicketPublicKey.ProtoReflect.Descriptor instead. +func (*PeerTicketPublicKey) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{6} +} + +func (x *PeerTicketPublicKey) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +type PeerTicketOld struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PeerTicket []byte `protobuf:"bytes,10,req,name=peer_ticket,json=peerTicket" json:"peer_ticket,omitempty"` + PeerTicketSignature []byte `protobuf:"bytes,20,req,name=peer_ticket_signature,json=peerTicketSignature" json:"peer_ticket_signature,omitempty"` +} + +func (x *PeerTicketOld) Reset() { + *x = PeerTicketOld{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PeerTicketOld) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PeerTicketOld) ProtoMessage() {} + +func (x *PeerTicketOld) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PeerTicketOld.ProtoReflect.Descriptor instead. +func (*PeerTicketOld) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{7} +} + +func (x *PeerTicketOld) GetPeerTicket() []byte { + if x != nil { + return x.PeerTicket + } + return nil +} + +func (x *PeerTicketOld) GetPeerTicketSignature() []byte { + if x != nil { + return x.PeerTicketSignature + } + return nil +} + +type SystemInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuFamily *CpuFamily `protobuf:"varint,10,req,name=cpu_family,json=cpuFamily,enum=CpuFamily" json:"cpu_family,omitempty"` + CpuSubtype *uint32 `protobuf:"varint,20,opt,name=cpu_subtype,json=cpuSubtype" json:"cpu_subtype,omitempty"` + CpuExt *uint32 `protobuf:"varint,30,opt,name=cpu_ext,json=cpuExt" json:"cpu_ext,omitempty"` + Brand *Brand `protobuf:"varint,40,opt,name=brand,enum=Brand" json:"brand,omitempty"` + BrandFlags *uint32 `protobuf:"varint,50,opt,name=brand_flags,json=brandFlags" json:"brand_flags,omitempty"` + Os *Os `protobuf:"varint,60,req,name=os,enum=Os" json:"os,omitempty"` + OsVersion *uint32 `protobuf:"varint,70,opt,name=os_version,json=osVersion" json:"os_version,omitempty"` + OsExt *uint32 `protobuf:"varint,80,opt,name=os_ext,json=osExt" json:"os_ext,omitempty"` + SystemInformationString *string `protobuf:"bytes,90,opt,name=system_information_string,json=systemInformationString" json:"system_information_string,omitempty"` + DeviceId *string `protobuf:"bytes,100,opt,name=device_id,json=deviceId" json:"device_id,omitempty"` +} + +func (x *SystemInfo) Reset() { + *x = SystemInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SystemInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SystemInfo) ProtoMessage() {} + +func (x *SystemInfo) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SystemInfo.ProtoReflect.Descriptor instead. +func (*SystemInfo) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{8} +} + +func (x *SystemInfo) GetCpuFamily() CpuFamily { + if x != nil && x.CpuFamily != nil { + return *x.CpuFamily + } + return CpuFamily_CPU_UNKNOWN +} + +func (x *SystemInfo) GetCpuSubtype() uint32 { + if x != nil && x.CpuSubtype != nil { + return *x.CpuSubtype + } + return 0 +} + +func (x *SystemInfo) GetCpuExt() uint32 { + if x != nil && x.CpuExt != nil { + return *x.CpuExt + } + return 0 +} + +func (x *SystemInfo) GetBrand() Brand { + if x != nil && x.Brand != nil { + return *x.Brand + } + return Brand_BRAND_UNBRANDED +} + +func (x *SystemInfo) GetBrandFlags() uint32 { + if x != nil && x.BrandFlags != nil { + return *x.BrandFlags + } + return 0 +} + +func (x *SystemInfo) GetOs() Os { + if x != nil && x.Os != nil { + return *x.Os + } + return Os_OS_UNKNOWN +} + +func (x *SystemInfo) GetOsVersion() uint32 { + if x != nil && x.OsVersion != nil { + return *x.OsVersion + } + return 0 +} + +func (x *SystemInfo) GetOsExt() uint32 { + if x != nil && x.OsExt != nil { + return *x.OsExt + } + return 0 +} + +func (x *SystemInfo) GetSystemInformationString() string { + if x != nil && x.SystemInformationString != nil { + return *x.SystemInformationString + } + return "" +} + +func (x *SystemInfo) GetDeviceId() string { + if x != nil && x.DeviceId != nil { + return *x.DeviceId + } + return "" +} + +type LibspotifyAppKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version *uint32 `protobuf:"varint,1,req,name=version" json:"version,omitempty"` + Devkey []byte `protobuf:"bytes,2,req,name=devkey" json:"devkey,omitempty"` + Signature []byte `protobuf:"bytes,3,req,name=signature" json:"signature,omitempty"` + Useragent *string `protobuf:"bytes,4,req,name=useragent" json:"useragent,omitempty"` + CallbackHash []byte `protobuf:"bytes,5,req,name=callback_hash,json=callbackHash" json:"callback_hash,omitempty"` +} + +func (x *LibspotifyAppKey) Reset() { + *x = LibspotifyAppKey{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LibspotifyAppKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LibspotifyAppKey) ProtoMessage() {} + +func (x *LibspotifyAppKey) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LibspotifyAppKey.ProtoReflect.Descriptor instead. +func (*LibspotifyAppKey) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{9} +} + +func (x *LibspotifyAppKey) GetVersion() uint32 { + if x != nil && x.Version != nil { + return *x.Version + } + return 0 +} + +func (x *LibspotifyAppKey) GetDevkey() []byte { + if x != nil { + return x.Devkey + } + return nil +} + +func (x *LibspotifyAppKey) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *LibspotifyAppKey) GetUseragent() string { + if x != nil && x.Useragent != nil { + return *x.Useragent + } + return "" +} + +func (x *LibspotifyAppKey) GetCallbackHash() []byte { + if x != nil { + return x.CallbackHash + } + return nil +} + +type ClientInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Limited *bool `protobuf:"varint,1,opt,name=limited" json:"limited,omitempty"` + Fb *ClientInfoFacebook `protobuf:"bytes,2,opt,name=fb" json:"fb,omitempty"` + Language *string `protobuf:"bytes,3,opt,name=language" json:"language,omitempty"` +} + +func (x *ClientInfo) Reset() { + *x = ClientInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientInfo) ProtoMessage() {} + +func (x *ClientInfo) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientInfo.ProtoReflect.Descriptor instead. +func (*ClientInfo) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{10} +} + +func (x *ClientInfo) GetLimited() bool { + if x != nil && x.Limited != nil { + return *x.Limited + } + return false +} + +func (x *ClientInfo) GetFb() *ClientInfoFacebook { + if x != nil { + return x.Fb + } + return nil +} + +func (x *ClientInfo) GetLanguage() string { + if x != nil && x.Language != nil { + return *x.Language + } + return "" +} + +type ClientInfoFacebook struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MachineId *string `protobuf:"bytes,1,opt,name=machine_id,json=machineId" json:"machine_id,omitempty"` +} + +func (x *ClientInfoFacebook) Reset() { + *x = ClientInfoFacebook{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientInfoFacebook) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientInfoFacebook) ProtoMessage() {} + +func (x *ClientInfoFacebook) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientInfoFacebook.ProtoReflect.Descriptor instead. +func (*ClientInfoFacebook) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{11} +} + +func (x *ClientInfoFacebook) GetMachineId() string { + if x != nil && x.MachineId != nil { + return *x.MachineId + } + return "" +} + +type APWelcome struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CanonicalUsername *string `protobuf:"bytes,10,req,name=canonical_username,json=canonicalUsername" json:"canonical_username,omitempty"` + AccountTypeLoggedIn *AccountType `protobuf:"varint,20,req,name=account_type_logged_in,json=accountTypeLoggedIn,enum=AccountType" json:"account_type_logged_in,omitempty"` + CredentialsTypeLoggedIn *AccountType `protobuf:"varint,25,req,name=credentials_type_logged_in,json=credentialsTypeLoggedIn,enum=AccountType" json:"credentials_type_logged_in,omitempty"` + ReusableAuthCredentialsType *AuthenticationType `protobuf:"varint,30,req,name=reusable_auth_credentials_type,json=reusableAuthCredentialsType,enum=AuthenticationType" json:"reusable_auth_credentials_type,omitempty"` + ReusableAuthCredentials []byte `protobuf:"bytes,40,req,name=reusable_auth_credentials,json=reusableAuthCredentials" json:"reusable_auth_credentials,omitempty"` + LfsSecret []byte `protobuf:"bytes,50,opt,name=lfs_secret,json=lfsSecret" json:"lfs_secret,omitempty"` + AccountInfo *AccountInfo `protobuf:"bytes,60,opt,name=account_info,json=accountInfo" json:"account_info,omitempty"` + Fb *AccountInfoFacebook `protobuf:"bytes,70,opt,name=fb" json:"fb,omitempty"` +} + +func (x *APWelcome) Reset() { + *x = APWelcome{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *APWelcome) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*APWelcome) ProtoMessage() {} + +func (x *APWelcome) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use APWelcome.ProtoReflect.Descriptor instead. +func (*APWelcome) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{12} +} + +func (x *APWelcome) GetCanonicalUsername() string { + if x != nil && x.CanonicalUsername != nil { + return *x.CanonicalUsername + } + return "" +} + +func (x *APWelcome) GetAccountTypeLoggedIn() AccountType { + if x != nil && x.AccountTypeLoggedIn != nil { + return *x.AccountTypeLoggedIn + } + return AccountType_Spotify +} + +func (x *APWelcome) GetCredentialsTypeLoggedIn() AccountType { + if x != nil && x.CredentialsTypeLoggedIn != nil { + return *x.CredentialsTypeLoggedIn + } + return AccountType_Spotify +} + +func (x *APWelcome) GetReusableAuthCredentialsType() AuthenticationType { + if x != nil && x.ReusableAuthCredentialsType != nil { + return *x.ReusableAuthCredentialsType + } + return AuthenticationType_AUTHENTICATION_USER_PASS +} + +func (x *APWelcome) GetReusableAuthCredentials() []byte { + if x != nil { + return x.ReusableAuthCredentials + } + return nil +} + +func (x *APWelcome) GetLfsSecret() []byte { + if x != nil { + return x.LfsSecret + } + return nil +} + +func (x *APWelcome) GetAccountInfo() *AccountInfo { + if x != nil { + return x.AccountInfo + } + return nil +} + +func (x *APWelcome) GetFb() *AccountInfoFacebook { + if x != nil { + return x.Fb + } + return nil +} + +type AccountInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Spotify *AccountInfoSpotify `protobuf:"bytes,1,opt,name=spotify" json:"spotify,omitempty"` + Facebook *AccountInfoFacebook `protobuf:"bytes,2,opt,name=facebook" json:"facebook,omitempty"` +} + +func (x *AccountInfo) Reset() { + *x = AccountInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccountInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccountInfo) ProtoMessage() {} + +func (x *AccountInfo) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccountInfo.ProtoReflect.Descriptor instead. +func (*AccountInfo) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{13} +} + +func (x *AccountInfo) GetSpotify() *AccountInfoSpotify { + if x != nil { + return x.Spotify + } + return nil +} + +func (x *AccountInfo) GetFacebook() *AccountInfoFacebook { + if x != nil { + return x.Facebook + } + return nil +} + +type AccountInfoSpotify struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AccountInfoSpotify) Reset() { + *x = AccountInfoSpotify{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccountInfoSpotify) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccountInfoSpotify) ProtoMessage() {} + +func (x *AccountInfoSpotify) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccountInfoSpotify.ProtoReflect.Descriptor instead. +func (*AccountInfoSpotify) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{14} +} + +type AccountInfoFacebook struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccessToken *string `protobuf:"bytes,1,opt,name=access_token,json=accessToken" json:"access_token,omitempty"` + MachineId *string `protobuf:"bytes,2,opt,name=machine_id,json=machineId" json:"machine_id,omitempty"` +} + +func (x *AccountInfoFacebook) Reset() { + *x = AccountInfoFacebook{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_authentication_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AccountInfoFacebook) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccountInfoFacebook) ProtoMessage() {} + +func (x *AccountInfoFacebook) ProtoReflect() protoreflect.Message { + mi := &file_proto_authentication_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccountInfoFacebook.ProtoReflect.Descriptor instead. +func (*AccountInfoFacebook) Descriptor() ([]byte, []int) { + return file_proto_authentication_proto_rawDescGZIP(), []int{15} +} + +func (x *AccountInfoFacebook) GetAccessToken() string { + if x != nil && x.AccessToken != nil { + return *x.AccessToken + } + return "" +} + +func (x *AccountInfoFacebook) GetMachineId() string { + if x != nil && x.MachineId != nil { + return *x.MachineId + } + return "" +} + +var File_proto_authentication_proto protoreflect.FileDescriptor + +var file_proto_authentication_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xec, 0x03, 0x0a, + 0x17, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x11, 0x6c, 0x6f, 0x67, 0x69, + 0x6e, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x0a, 0x20, + 0x02, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x52, 0x10, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x3b, 0x0a, 0x10, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x14, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0b, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x63, 0x6b, + 0x65, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x54, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x65, 0x65, 0x72, + 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2c, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x32, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x46, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x6b, 0x65, 0x79, 0x18, 0x50, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4c, 0x69, 0x62, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x41, + 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x61, 0x70, 0x70, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, + 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x5a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x72, 0x0a, 0x10, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x03, 0x74, + 0x79, 0x70, 0x18, 0x14, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x03, 0x74, + 0x79, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44, 0x61, 0x74, 0x61, 0x22, + 0x8c, 0x01, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, + 0x67, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x46, 0x69, + 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x69, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x67, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x3f, 0x0a, + 0x0b, 0x68, 0x6d, 0x61, 0x63, 0x5f, 0x72, 0x69, 0x70, 0x65, 0x6d, 0x64, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x48, 0x6d, 0x61, 0x63, 0x52, 0x69, 0x70, 0x65, 0x6d, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0a, 0x68, 0x6d, 0x61, 0x63, 0x52, 0x69, 0x70, 0x65, 0x6d, 0x64, 0x22, 0x3f, + 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x61, + 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x02, 0x28, + 0x0c, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, + 0x33, 0x0a, 0x1d, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x48, 0x6d, + 0x61, 0x63, 0x52, 0x69, 0x70, 0x65, 0x6d, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6d, 0x61, 0x63, 0x18, 0x0a, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x6d, 0x61, 0x63, 0x22, 0x75, 0x0a, 0x0f, 0x50, 0x65, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, + 0x65, 0x74, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x0a, + 0x6f, 0x6c, 0x64, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x6c, 0x64, + 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x34, 0x0a, 0x13, 0x50, + 0x65, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x0a, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x22, 0x64, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x4f, + 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, + 0x74, 0x18, 0x0a, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x0a, 0x70, 0x65, 0x65, 0x72, 0x54, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x63, 0x6b, + 0x65, 0x74, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x14, 0x20, 0x02, + 0x28, 0x0c, 0x52, 0x13, 0x70, 0x65, 0x65, 0x72, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xd4, 0x02, 0x0a, 0x0a, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x0a, 0x0a, 0x63, 0x70, 0x75, 0x5f, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x0a, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x43, 0x70, 0x75, + 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x52, 0x09, 0x63, 0x70, 0x75, 0x46, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x53, 0x75, 0x62, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x70, 0x75, 0x5f, 0x65, 0x78, 0x74, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, 0x70, 0x75, 0x45, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x05, 0x62, + 0x72, 0x61, 0x6e, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x06, 0x2e, 0x42, 0x72, 0x61, + 0x6e, 0x64, 0x52, 0x05, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x72, 0x61, + 0x6e, 0x64, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x62, 0x72, 0x61, 0x6e, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x13, 0x0a, 0x02, 0x6f, 0x73, + 0x18, 0x3c, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x03, 0x2e, 0x4f, 0x73, 0x52, 0x02, 0x6f, 0x73, 0x12, + 0x1d, 0x0a, 0x0a, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x46, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, + 0x0a, 0x06, 0x6f, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x6f, 0x73, 0x45, 0x78, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xa5, + 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x62, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x41, 0x70, 0x70, + 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x02, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x65, 0x76, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x06, 0x64, + 0x65, 0x76, 0x6b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x02, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x22, 0x67, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x12, 0x23, + 0x0a, 0x02, 0x66, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, + 0x02, 0x66, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, + 0x33, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x46, 0x61, 0x63, + 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x49, 0x64, 0x22, 0xd4, 0x03, 0x0a, 0x09, 0x41, 0x50, 0x57, 0x65, 0x6c, 0x63, 0x6f, + 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x02, 0x28, 0x09, 0x52, 0x11, + 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x41, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x18, 0x14, 0x20, 0x02, 0x28, + 0x0e, 0x32, 0x0c, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x13, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x6f, 0x67, 0x67, + 0x65, 0x64, 0x49, 0x6e, 0x12, 0x49, 0x0a, 0x1a, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x5f, + 0x69, 0x6e, 0x18, 0x19, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x12, + 0x58, 0x0a, 0x1e, 0x72, 0x65, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x1e, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x1b, 0x72, 0x65, + 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x75, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x28, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x17, 0x72, 0x65, + 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x66, 0x73, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6c, 0x66, 0x73, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x2f, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, 0x02, 0x66, 0x62, 0x18, 0x46, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x46, + 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x52, 0x02, 0x66, 0x62, 0x22, 0x6e, 0x0a, 0x0b, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x52, 0x07, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x12, 0x30, 0x0a, 0x08, 0x66, 0x61, 0x63, + 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x52, 0x08, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x22, 0x14, 0x0a, 0x12, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x22, 0x57, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x2a, 0xd6, 0x01, 0x0a, 0x12, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x10, 0x00, 0x12, + 0x2d, 0x0a, 0x29, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x44, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x49, 0x46, 0x59, + 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x12, 0x2e, + 0x0a, 0x2a, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x44, 0x5f, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, 0x4f, 0x4b, + 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x10, 0x02, 0x12, 0x20, + 0x0a, 0x1c, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x03, + 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x5f, 0x54, 0x4f, 0x4b, 0x45, + 0x4e, 0x10, 0x04, 0x2a, 0x59, 0x0a, 0x0f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x57, 0x41, 0x59, + 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x4d, 0x50, 0x54, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x43, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, + 0x4c, 0x57, 0x41, 0x59, 0x53, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x03, 0x2a, 0x9d, + 0x01, 0x0a, 0x09, 0x43, 0x70, 0x75, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x0f, 0x0a, 0x0b, + 0x43, 0x50, 0x55, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x43, 0x50, 0x55, 0x5f, 0x58, 0x38, 0x36, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x50, + 0x55, 0x5f, 0x58, 0x38, 0x36, 0x5f, 0x36, 0x34, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x50, + 0x55, 0x5f, 0x50, 0x50, 0x43, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x50, 0x55, 0x5f, 0x50, + 0x50, 0x43, 0x5f, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x50, 0x55, 0x5f, 0x41, + 0x52, 0x4d, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x50, 0x55, 0x5f, 0x49, 0x41, 0x36, 0x34, + 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x50, 0x55, 0x5f, 0x53, 0x48, 0x10, 0x07, 0x12, 0x0c, + 0x0a, 0x08, 0x43, 0x50, 0x55, 0x5f, 0x4d, 0x49, 0x50, 0x53, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, + 0x43, 0x50, 0x55, 0x5f, 0x42, 0x4c, 0x41, 0x43, 0x4b, 0x46, 0x49, 0x4e, 0x10, 0x09, 0x2a, 0x4b, + 0x0a, 0x05, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x52, 0x41, 0x4e, 0x44, + 0x5f, 0x55, 0x4e, 0x42, 0x52, 0x41, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x42, 0x52, 0x41, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x51, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x42, + 0x52, 0x41, 0x4e, 0x44, 0x5f, 0x48, 0x54, 0x43, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x52, + 0x41, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x4b, 0x49, 0x41, 0x10, 0x03, 0x2a, 0xd1, 0x02, 0x0a, 0x02, + 0x4f, 0x73, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x53, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x53, 0x5f, 0x4f, 0x53, 0x58, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x4f, 0x53, 0x5f, 0x49, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, + 0x06, 0x4f, 0x53, 0x5f, 0x53, 0x36, 0x30, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x53, 0x5f, + 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x53, 0x5f, 0x57, 0x49, + 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x43, 0x45, 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x53, + 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x53, + 0x5f, 0x50, 0x41, 0x4c, 0x4d, 0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x53, 0x5f, 0x46, 0x52, + 0x45, 0x45, 0x42, 0x53, 0x44, 0x10, 0x09, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x53, 0x5f, 0x42, 0x4c, + 0x41, 0x43, 0x4b, 0x42, 0x45, 0x52, 0x52, 0x59, 0x10, 0x0a, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x53, + 0x5f, 0x53, 0x4f, 0x4e, 0x4f, 0x53, 0x10, 0x0b, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x53, 0x5f, 0x4c, + 0x4f, 0x47, 0x49, 0x54, 0x45, 0x43, 0x48, 0x10, 0x0c, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x53, 0x5f, + 0x57, 0x50, 0x37, 0x10, 0x0d, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x53, 0x5f, 0x4f, 0x4e, 0x4b, 0x59, + 0x4f, 0x10, 0x0e, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x53, 0x5f, 0x50, 0x48, 0x49, 0x4c, 0x49, 0x50, + 0x53, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x53, 0x5f, 0x57, 0x44, 0x10, 0x10, 0x12, 0x0c, + 0x0a, 0x08, 0x4f, 0x53, 0x5f, 0x56, 0x4f, 0x4c, 0x56, 0x4f, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, + 0x4f, 0x53, 0x5f, 0x54, 0x49, 0x56, 0x4f, 0x10, 0x12, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x53, 0x5f, + 0x41, 0x57, 0x4f, 0x58, 0x10, 0x13, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x53, 0x5f, 0x4d, 0x45, 0x45, + 0x47, 0x4f, 0x10, 0x14, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x53, 0x5f, 0x51, 0x4e, 0x58, 0x4e, 0x54, + 0x4f, 0x10, 0x15, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x53, 0x5f, 0x42, 0x43, 0x4f, 0x10, 0x16, 0x2a, + 0x28, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, + 0x0a, 0x07, 0x53, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x46, + 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x10, 0x01, 0x42, 0x23, 0x5a, 0x21, 0x74, 0x75, 0x78, + 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, + 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, +} + +var ( + file_proto_authentication_proto_rawDescOnce sync.Once + file_proto_authentication_proto_rawDescData = file_proto_authentication_proto_rawDesc +) + +func file_proto_authentication_proto_rawDescGZIP() []byte { + file_proto_authentication_proto_rawDescOnce.Do(func() { + file_proto_authentication_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_authentication_proto_rawDescData) + }) + return file_proto_authentication_proto_rawDescData +} + +var file_proto_authentication_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_proto_authentication_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_proto_authentication_proto_goTypes = []interface{}{ + (AuthenticationType)(0), // 0: AuthenticationType + (AccountCreation)(0), // 1: AccountCreation + (CpuFamily)(0), // 2: CpuFamily + (Brand)(0), // 3: Brand + (Os)(0), // 4: Os + (AccountType)(0), // 5: AccountType + (*ClientResponseEncrypted)(nil), // 6: ClientResponseEncrypted + (*LoginCredentials)(nil), // 7: LoginCredentials + (*FingerprintResponseUnion)(nil), // 8: FingerprintResponseUnion + (*FingerprintGrainResponse)(nil), // 9: FingerprintGrainResponse + (*FingerprintHmacRipemdResponse)(nil), // 10: FingerprintHmacRipemdResponse + (*PeerTicketUnion)(nil), // 11: PeerTicketUnion + (*PeerTicketPublicKey)(nil), // 12: PeerTicketPublicKey + (*PeerTicketOld)(nil), // 13: PeerTicketOld + (*SystemInfo)(nil), // 14: SystemInfo + (*LibspotifyAppKey)(nil), // 15: LibspotifyAppKey + (*ClientInfo)(nil), // 16: ClientInfo + (*ClientInfoFacebook)(nil), // 17: ClientInfoFacebook + (*APWelcome)(nil), // 18: APWelcome + (*AccountInfo)(nil), // 19: AccountInfo + (*AccountInfoSpotify)(nil), // 20: AccountInfoSpotify + (*AccountInfoFacebook)(nil), // 21: AccountInfoFacebook +} +var file_proto_authentication_proto_depIdxs = []int32{ + 7, // 0: ClientResponseEncrypted.login_credentials:type_name -> LoginCredentials + 1, // 1: ClientResponseEncrypted.account_creation:type_name -> AccountCreation + 8, // 2: ClientResponseEncrypted.fingerprint_response:type_name -> FingerprintResponseUnion + 11, // 3: ClientResponseEncrypted.peer_ticket:type_name -> PeerTicketUnion + 14, // 4: ClientResponseEncrypted.system_info:type_name -> SystemInfo + 15, // 5: ClientResponseEncrypted.appkey:type_name -> LibspotifyAppKey + 16, // 6: ClientResponseEncrypted.client_info:type_name -> ClientInfo + 0, // 7: LoginCredentials.typ:type_name -> AuthenticationType + 9, // 8: FingerprintResponseUnion.grain:type_name -> FingerprintGrainResponse + 10, // 9: FingerprintResponseUnion.hmac_ripemd:type_name -> FingerprintHmacRipemdResponse + 12, // 10: PeerTicketUnion.public_key:type_name -> PeerTicketPublicKey + 13, // 11: PeerTicketUnion.old_ticket:type_name -> PeerTicketOld + 2, // 12: SystemInfo.cpu_family:type_name -> CpuFamily + 3, // 13: SystemInfo.brand:type_name -> Brand + 4, // 14: SystemInfo.os:type_name -> Os + 17, // 15: ClientInfo.fb:type_name -> ClientInfoFacebook + 5, // 16: APWelcome.account_type_logged_in:type_name -> AccountType + 5, // 17: APWelcome.credentials_type_logged_in:type_name -> AccountType + 0, // 18: APWelcome.reusable_auth_credentials_type:type_name -> AuthenticationType + 19, // 19: APWelcome.account_info:type_name -> AccountInfo + 21, // 20: APWelcome.fb:type_name -> AccountInfoFacebook + 20, // 21: AccountInfo.spotify:type_name -> AccountInfoSpotify + 21, // 22: AccountInfo.facebook:type_name -> AccountInfoFacebook + 23, // [23:23] is the sub-list for method output_type + 23, // [23:23] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name +} + +func init() { file_proto_authentication_proto_init() } +func file_proto_authentication_proto_init() { + if File_proto_authentication_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_proto_authentication_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientResponseEncrypted); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LoginCredentials); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FingerprintResponseUnion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FingerprintGrainResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FingerprintHmacRipemdResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PeerTicketUnion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PeerTicketPublicKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PeerTicketOld); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SystemInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LibspotifyAppKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientInfoFacebook); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*APWelcome); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountInfoSpotify); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_authentication_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccountInfoFacebook); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_proto_authentication_proto_rawDesc, + NumEnums: 6, + NumMessages: 16, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_proto_authentication_proto_goTypes, + DependencyIndexes: file_proto_authentication_proto_depIdxs, + EnumInfos: file_proto_authentication_proto_enumTypes, + MessageInfos: file_proto_authentication_proto_msgTypes, + }.Build() + File_proto_authentication_proto = out.File + file_proto_authentication_proto_rawDesc = nil + file_proto_authentication_proto_goTypes = nil + file_proto_authentication_proto_depIdxs = nil +} diff --git a/lib/spot/proto/authentication.proto b/lib/spot/proto/authentication.proto new file mode 100644 index 0000000..f187782 --- /dev/null +++ b/lib/spot/proto/authentication.proto @@ -0,0 +1,167 @@ +syntax = "proto2"; + +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message ClientResponseEncrypted { + required LoginCredentials login_credentials = 0xa; + optional AccountCreation account_creation = 0x14; + optional FingerprintResponseUnion fingerprint_response = 0x1e; + optional PeerTicketUnion peer_ticket = 0x28; + required SystemInfo system_info = 0x32; + optional string platform_model = 0x3c; + optional string version_string = 0x46; + optional LibspotifyAppKey appkey = 0x50; + optional ClientInfo client_info = 0x5a; +} + +message LoginCredentials { + optional string username = 0xa; + required AuthenticationType typ = 0x14; + optional bytes auth_data = 0x1e; +} + +enum AuthenticationType { + AUTHENTICATION_USER_PASS = 0x0; + AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS = 0x1; + AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS = 0x2; + AUTHENTICATION_SPOTIFY_TOKEN = 0x3; + AUTHENTICATION_FACEBOOK_TOKEN = 0x4; +} + +enum AccountCreation { + ACCOUNT_CREATION_ALWAYS_PROMPT = 0x1; + ACCOUNT_CREATION_ALWAYS_CREATE = 0x3; +} + +message FingerprintResponseUnion { + optional FingerprintGrainResponse grain = 0xa; + optional FingerprintHmacRipemdResponse hmac_ripemd = 0x14; +} + +message FingerprintGrainResponse { + required bytes encrypted_key = 0xa; +} + +message FingerprintHmacRipemdResponse { + required bytes hmac = 0xa; +} + +message PeerTicketUnion { + optional PeerTicketPublicKey public_key = 0xa; + optional PeerTicketOld old_ticket = 0x14; +} + +message PeerTicketPublicKey { + required bytes public_key = 0xa; +} + +message PeerTicketOld { + required bytes peer_ticket = 0xa; + required bytes peer_ticket_signature = 0x14; +} + +message SystemInfo { + required CpuFamily cpu_family = 0xa; + optional uint32 cpu_subtype = 0x14; + optional uint32 cpu_ext = 0x1e; + optional Brand brand = 0x28; + optional uint32 brand_flags = 0x32; + required Os os = 0x3c; + optional uint32 os_version = 0x46; + optional uint32 os_ext = 0x50; + optional string system_information_string = 0x5a; + optional string device_id = 0x64; +} + +enum CpuFamily { + CPU_UNKNOWN = 0x0; + CPU_X86 = 0x1; + CPU_X86_64 = 0x2; + CPU_PPC = 0x3; + CPU_PPC_64 = 0x4; + CPU_ARM = 0x5; + CPU_IA64 = 0x6; + CPU_SH = 0x7; + CPU_MIPS = 0x8; + CPU_BLACKFIN = 0x9; +} + +enum Brand { + BRAND_UNBRANDED = 0x0; + BRAND_INQ = 0x1; + BRAND_HTC = 0x2; + BRAND_NOKIA = 0x3; +} + +enum Os { + OS_UNKNOWN = 0x0; + OS_WINDOWS = 0x1; + OS_OSX = 0x2; + OS_IPHONE = 0x3; + OS_S60 = 0x4; + OS_LINUX = 0x5; + OS_WINDOWS_CE = 0x6; + OS_ANDROID = 0x7; + OS_PALM = 0x8; + OS_FREEBSD = 0x9; + OS_BLACKBERRY = 0xa; + OS_SONOS = 0xb; + OS_LOGITECH = 0xc; + OS_WP7 = 0xd; + OS_ONKYO = 0xe; + OS_PHILIPS = 0xf; + OS_WD = 0x10; + OS_VOLVO = 0x11; + OS_TIVO = 0x12; + OS_AWOX = 0x13; + OS_MEEGO = 0x14; + OS_QNXNTO = 0x15; + OS_BCO = 0x16; +} + +message LibspotifyAppKey { + required uint32 version = 0x1; + required bytes devkey = 0x2; + required bytes signature = 0x3; + required string useragent = 0x4; + required bytes callback_hash = 0x5; +} + +message ClientInfo { + optional bool limited = 0x1; + optional ClientInfoFacebook fb = 0x2; + optional string language = 0x3; +} + +message ClientInfoFacebook { + optional string machine_id = 0x1; +} + +message APWelcome { + required string canonical_username = 0xa; + required AccountType account_type_logged_in = 0x14; + required AccountType credentials_type_logged_in = 0x19; + required AuthenticationType reusable_auth_credentials_type = 0x1e; + required bytes reusable_auth_credentials = 0x28; + optional bytes lfs_secret = 0x32; + optional AccountInfo account_info = 0x3c; + optional AccountInfoFacebook fb = 0x46; +} + +enum AccountType { + Spotify = 0x0; + Facebook = 0x1; +} + +message AccountInfo { + optional AccountInfoSpotify spotify = 0x1; + optional AccountInfoFacebook facebook = 0x2; +} + +message AccountInfoSpotify { +} + +message AccountInfoFacebook { + optional string access_token = 0x1; + optional string machine_id = 0x2; +} diff --git a/lib/spot/proto/autodownload_backend_service.proto b/lib/spot/proto/autodownload_backend_service.proto new file mode 100644 index 0000000..fa088fe --- /dev/null +++ b/lib/spot/proto/autodownload_backend_service.proto @@ -0,0 +1,53 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.autodownloadservice.v1.proto; + +import "google/protobuf/timestamp.proto"; + +message Identifiers { + string device_id = 1; + string cache_id = 2; +} + +message Settings { + oneof episode_download { + bool most_recent_no_limit = 1; + int32 most_recent_count = 2; + } +} + +message SetSettingsRequest { + Identifiers identifiers = 1; + Settings settings = 2; + google.protobuf.Timestamp client_timestamp = 3; +} + +message GetSettingsRequest { + Identifiers identifiers = 1; +} + +message GetSettingsResponse { + Settings settings = 1; +} + +message ShowRequest { + Identifiers identifiers = 1; + string show_uri = 2; + google.protobuf.Timestamp client_timestamp = 3; +} + +message ReplaceIdentifiersRequest { + Identifiers old_identifiers = 1; + Identifiers new_identifiers = 2; +} + +message PendingItem { + google.protobuf.Timestamp client_timestamp = 1; + + oneof pending { + bool is_removed = 2; + Settings settings = 3; + } +} diff --git a/lib/spot/proto/autodownload_config_common.proto b/lib/spot/proto/autodownload_config_common.proto new file mode 100644 index 0000000..9d923f0 --- /dev/null +++ b/lib/spot/proto/autodownload_config_common.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.autodownload_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.autodownload.esperanto.proto"; + +message AutoDownloadGlobalConfig { + uint32 number_of_episodes = 1; +} + +message AutoDownloadShowConfig { + string uri = 1; + bool active = 2; +} diff --git a/lib/spot/proto/autodownload_config_get_request.proto b/lib/spot/proto/autodownload_config_get_request.proto new file mode 100644 index 0000000..be4681b --- /dev/null +++ b/lib/spot/proto/autodownload_config_get_request.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.autodownload_esperanto.proto; + +import "autodownload_config_common.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.autodownload.esperanto.proto"; + +message AutoDownloadGetRequest { + repeated string uri = 1; +} + +message AutoDownloadGetResponse { + AutoDownloadGlobalConfig global = 1; + repeated AutoDownloadShowConfig show = 2; + string error = 99; +} diff --git a/lib/spot/proto/autodownload_config_set_request.proto b/lib/spot/proto/autodownload_config_set_request.proto new file mode 100644 index 0000000..2adcbea --- /dev/null +++ b/lib/spot/proto/autodownload_config_set_request.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.autodownload_esperanto.proto; + +import "autodownload_config_common.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.autodownload.esperanto.proto"; + +message AutoDownloadSetRequest { + oneof config { + AutoDownloadGlobalConfig global = 1; + AutoDownloadShowConfig show = 2; + } +} + +message AutoDownloadSetResponse { + string error = 99; +} diff --git a/lib/spot/proto/automix_mode.proto b/lib/spot/proto/automix_mode.proto new file mode 100644 index 0000000..d0d7f93 --- /dev/null +++ b/lib/spot/proto/automix_mode.proto @@ -0,0 +1,41 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.automix.proto; + +option optimize_for = CODE_SIZE; + +message AutomixConfig { + TransitionType transition_type = 1; + string fade_out_curves = 2; + string fade_in_curves = 3; + int32 beats_min = 4; + int32 beats_max = 5; + int32 fade_duration_max_ms = 6; +} + +message AutomixMode { + AutomixStyle style = 1; + AutomixConfig config = 2; + AutomixConfig ml_config = 3; + AutomixConfig shuffle_config = 4; + AutomixConfig shuffle_ml_config = 5; +} + +enum AutomixStyle { + NONE = 0; + DEFAULT = 1; + REGULAR = 2; + AIRBAG = 3; + RADIO_AIRBAG = 4; + SLEEP = 5; + MIXED = 6; + CUSTOM = 7; +} + +enum TransitionType { + CUEPOINTS = 0; + CROSSFADE = 1; + GAPLESS = 2; +} diff --git a/lib/spot/proto/autoplay_context_request.proto b/lib/spot/proto/autoplay_context_request.proto new file mode 100644 index 0000000..4fa4b0b --- /dev/null +++ b/lib/spot/proto/autoplay_context_request.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message AutoplayContextRequest { + required string context_uri = 1; + repeated string recent_track_uri = 2; +} diff --git a/lib/spot/proto/autoplay_node.proto b/lib/spot/proto/autoplay_node.proto new file mode 100644 index 0000000..18709f1 --- /dev/null +++ b/lib/spot/proto/autoplay_node.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "logging_params.proto"; + +option optimize_for = CODE_SIZE; + +message AutoplayNode { + map filler_node = 1; + required bool is_playing_filler = 2; + required LoggingParams logging_params = 3; +} diff --git a/lib/spot/proto/canvas.proto b/lib/spot/proto/canvas.proto new file mode 100644 index 0000000..e008618 --- /dev/null +++ b/lib/spot/proto/canvas.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.context_track_exts.canvas; + +message Artist { + string uri = 1; + string name = 2; + string avatar = 3; +} + +message CanvasRecord { + string id = 1; + string url = 2; + string file_id = 3; + Type type = 4; + string entity_uri = 5; + Artist artist = 6; + bool explicit = 7; + string uploaded_by = 8; + string etag = 9; + string canvas_uri = 11; + string storylines_id = 12; +} + +enum Type { + IMAGE = 0; + VIDEO = 1; + VIDEO_LOOPING = 2; + VIDEO_LOOPING_RANDOM = 3; + GIF = 4; +} diff --git a/lib/spot/proto/canvas_storage.proto b/lib/spot/proto/canvas_storage.proto new file mode 100644 index 0000000..e2f652c --- /dev/null +++ b/lib/spot/proto/canvas_storage.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.canvas.proto.storage; + +import "canvaz.proto"; + +option optimize_for = CODE_SIZE; + +message CanvasCacheEntry { + string entity_uri = 1; + uint64 expires_on_seconds = 2; + canvaz.cache.EntityCanvazResponse.Canvaz canvas = 3; +} + +message CanvasCacheFile { + repeated CanvasCacheEntry entries = 1; +} diff --git a/lib/spot/proto/canvaz-meta.proto b/lib/spot/proto/canvaz-meta.proto new file mode 100644 index 0000000..b3b5553 --- /dev/null +++ b/lib/spot/proto/canvaz-meta.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.canvaz; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.canvaz.proto"; + +enum Type { + IMAGE = 0; + VIDEO = 1; + VIDEO_LOOPING = 2; + VIDEO_LOOPING_RANDOM = 3; + GIF = 4; +} diff --git a/lib/spot/proto/canvaz.proto b/lib/spot/proto/canvaz.proto new file mode 100644 index 0000000..2493da9 --- /dev/null +++ b/lib/spot/proto/canvaz.proto @@ -0,0 +1,44 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.canvaz.cache; + +import "canvaz-meta.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.canvazcache.proto"; + +message Artist { + string uri = 1; + string name = 2; + string avatar = 3; +} + +message EntityCanvazResponse { + repeated Canvaz canvases = 1; + message Canvaz { + string id = 1; + string url = 2; + string file_id = 3; + spotify.canvaz.Type type = 4; + string entity_uri = 5; + Artist artist = 6; + bool explicit = 7; + string uploaded_by = 8; + string etag = 9; + string canvas_uri = 11; + string storylines_id = 12; + } + + int64 ttl_in_seconds = 2; +} + +message EntityCanvazRequest { + repeated Entity entities = 1; + message Entity { + string entity_uri = 1; + string etag = 2; + } +} diff --git a/lib/spot/proto/capping_data.proto b/lib/spot/proto/capping_data.proto new file mode 100644 index 0000000..dca6353 --- /dev/null +++ b/lib/spot/proto/capping_data.proto @@ -0,0 +1,30 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.capper3; + +option java_multiple_files = true; +option java_package = "com.spotify.capper3.proto"; + +message ConsumeTokensRequest { + uint32 tokens = 1; +} + +message CappingData { + uint32 remaining_tokens = 1; + uint32 capacity = 2; + uint32 seconds_until_next_refill = 3; + uint32 refill_amount = 4; +} + +message ConsumeTokensResponse { + uint32 seconds_until_next_update = 1; + PlayCappingType capping_type = 2; + CappingData capping_data = 3; +} + +enum PlayCappingType { + NONE = 0; + LINEAR = 1; +} diff --git a/lib/spot/proto/claas.proto b/lib/spot/proto/claas.proto new file mode 100644 index 0000000..6006c17 --- /dev/null +++ b/lib/spot/proto/claas.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.claas.v1; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.claas.v1"; + +service ClaasService { + rpc PostLogs(PostLogsRequest) returns (PostLogsResponse); + rpc Watch(WatchRequest) returns (stream WatchResponse); +} + +message WatchRequest { + string user_id = 1; +} + +message WatchResponse { + repeated string logs = 1; +} + +message PostLogsRequest { + repeated string logs = 1; +} + +message PostLogsResponse { + +} diff --git a/lib/spot/proto/client-tts.proto b/lib/spot/proto/client-tts.proto new file mode 100644 index 0000000..0968f51 --- /dev/null +++ b/lib/spot/proto/client-tts.proto @@ -0,0 +1,30 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.narration_injection.proto; + +import "tts-resolve.proto"; + +option optimize_for = CODE_SIZE; + +service ClientTtsService { + rpc GetTtsUrl(TtsRequest) returns (TtsResponse); +} + +message TtsRequest { + ResolveRequest.AudioFormat audio_format = 3; + string language = 4; + ResolveRequest.TtsVoice tts_voice = 5; + ResolveRequest.TtsProvider tts_provider = 6; + int32 sample_rate_hz = 7; + + oneof prompt { + string text = 1; + string ssml = 2; + } +} + +message TtsResponse { + string url = 1; +} diff --git a/lib/spot/proto/client_config.proto b/lib/spot/proto/client_config.proto new file mode 100644 index 0000000..b838873 --- /dev/null +++ b/lib/spot/proto/client_config.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.extendedmetadata.config.v1; + +option optimize_for = CODE_SIZE; + +message ClientConfig { + uint32 log_sampling_rate = 1; + uint32 avg_log_messages_per_minute = 2; + uint32 log_messages_burst_size = 3; +} diff --git a/lib/spot/proto/client_update.proto b/lib/spot/proto/client_update.proto new file mode 100644 index 0000000..fb93c9b --- /dev/null +++ b/lib/spot/proto/client_update.proto @@ -0,0 +1,39 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.desktopupdate.proto; + +option java_multiple_files = true; +option java_outer_classname = "ClientUpdateProto"; +option java_package = "com.spotify.desktopupdate.proto"; + +message UpgradeSignedPart { + uint32 platform = 1; + uint64 version_from_from = 2; + uint64 version_from_to = 3; + uint64 target_version = 4; + string http_prefix = 5; + bytes binary_hash = 6; + ClientUpgradeType type = 7; + bytes file_id = 8; + uint32 delay = 9; + uint32 flags = 10; +} + +message UpgradeRequiredMessage { + bytes upgrade_signed_part = 10; + bytes signature = 20; + string http_suffix = 30; +} + +message UpdateQueryResponse { + UpgradeRequiredMessage upgrade_message_payload = 1; + uint32 poll_interval = 2; +} + +enum ClientUpgradeType { + INVALID = 0; + LOGIN_CRITICAL = 1; + NORMAL = 2; +} diff --git a/lib/spot/proto/clips_cover.proto b/lib/spot/proto/clips_cover.proto new file mode 100644 index 0000000..b129fb4 --- /dev/null +++ b/lib/spot/proto/clips_cover.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.clips; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "ClipsCoverProto"; +option java_package = "com.spotify.clips.proto"; + +message ClipsCover { + string image_url = 1; + string video_source_id = 2; +} diff --git a/lib/spot/proto/collection/album_collection_state.proto b/lib/spot/proto/collection/album_collection_state.proto new file mode 100644 index 0000000..1258961 --- /dev/null +++ b/lib/spot/proto/collection/album_collection_state.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message AlbumCollectionState { + optional string collection_link = 1; + optional uint32 num_tracks_in_collection = 2; + optional bool complete = 3; +} diff --git a/lib/spot/proto/collection/artist_collection_state.proto b/lib/spot/proto/collection/artist_collection_state.proto new file mode 100644 index 0000000..33ade56 --- /dev/null +++ b/lib/spot/proto/collection/artist_collection_state.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message ArtistCollectionState { + optional string collection_link = 1; + optional bool followed = 2; + optional uint32 num_tracks_in_collection = 3; + optional uint32 num_albums_in_collection = 4; + optional bool is_banned = 5; + optional bool can_ban = 6; +} diff --git a/lib/spot/proto/collection/episode_collection_state.proto b/lib/spot/proto/collection/episode_collection_state.proto new file mode 100644 index 0000000..56fcc53 --- /dev/null +++ b/lib/spot/proto/collection/episode_collection_state.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option objc_class_prefix = "SPTCosmosUtil"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message EpisodeCollectionState { + optional bool is_following_show = 1; + optional bool is_new = 2; + optional bool is_in_listen_later = 3; +} diff --git a/lib/spot/proto/collection/show_collection_state.proto b/lib/spot/proto/collection/show_collection_state.proto new file mode 100644 index 0000000..d3904b5 --- /dev/null +++ b/lib/spot/proto/collection/show_collection_state.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message ShowCollectionState { + optional bool is_in_collection = 1; +} diff --git a/lib/spot/proto/collection/track_collection_state.proto b/lib/spot/proto/collection/track_collection_state.proto new file mode 100644 index 0000000..68e42ed --- /dev/null +++ b/lib/spot/proto/collection/track_collection_state.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message TrackCollectionState { + optional bool is_in_collection = 1; + optional bool can_add_to_collection = 2; + optional bool is_banned = 3; + optional bool can_ban = 4; +} diff --git a/lib/spot/proto/collection2v2.proto b/lib/spot/proto/collection2v2.proto new file mode 100644 index 0000000..19530fe --- /dev/null +++ b/lib/spot/proto/collection2v2.proto @@ -0,0 +1,62 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.collection.proto.v2; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.collection2.v2.proto"; + +message PageRequest { + string username = 1; + string set = 2; + string pagination_token = 3; + int32 limit = 4; +} + +message CollectionItem { + string uri = 1; + int32 added_at = 2; + bool is_removed = 3; +} + +message PageResponse { + repeated CollectionItem items = 1; + string next_page_token = 2; + string sync_token = 3; +} + +message DeltaRequest { + string username = 1; + string set = 2; + string last_sync_token = 3; +} + +message DeltaResponse { + bool delta_update_possible = 1; + repeated CollectionItem items = 2; + string sync_token = 3; +} + +message WriteRequest { + string username = 1; + string set = 2; + repeated CollectionItem items = 3; + string client_update_id = 4; +} + +message PubSubUpdate { + string username = 1; + string set = 2; + repeated CollectionItem items = 3; + string client_update_id = 4; +} + +message InitializedRequest { + string username = 1; + string set = 2; +} + +message InitializedResponse { + bool initialized = 1; +} diff --git a/lib/spot/proto/collection_add_remove_items_request.proto b/lib/spot/proto/collection_add_remove_items_request.proto new file mode 100644 index 0000000..4dac680 --- /dev/null +++ b/lib/spot/proto/collection_add_remove_items_request.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_cosmos.proto; + +import "status.proto"; + +option optimize_for = CODE_SIZE; + +message CollectionAddRemoveItemsRequest { + repeated string item = 1; +} + +message CollectionAddRemoveItemsResponse { + Status status = 1; +} diff --git a/lib/spot/proto/collection_ban_request.proto b/lib/spot/proto/collection_ban_request.proto new file mode 100644 index 0000000..e64220d --- /dev/null +++ b/lib/spot/proto/collection_ban_request.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_cosmos.proto; + +import "status.proto"; + +option optimize_for = CODE_SIZE; + +message CollectionBanRequest { + string context_source = 1; + repeated string uri = 2; +} + +message CollectionBanResponse { + Status status = 1; + repeated bool success = 2; +} diff --git a/lib/spot/proto/collection_decoration_policy.proto b/lib/spot/proto/collection_decoration_policy.proto new file mode 100644 index 0000000..79b4b8c --- /dev/null +++ b/lib/spot/proto/collection_decoration_policy.proto @@ -0,0 +1,38 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_cosmos.proto; + +import "policy/artist_decoration_policy.proto"; +import "policy/album_decoration_policy.proto"; +import "policy/track_decoration_policy.proto"; + +option optimize_for = CODE_SIZE; + +message CollectionArtistDecorationPolicy { + cosmos_util.proto.ArtistCollectionDecorationPolicy collection_policy = 1; + cosmos_util.proto.ArtistSyncDecorationPolicy sync_policy = 2; + cosmos_util.proto.ArtistDecorationPolicy artist_policy = 3; + bool decorated = 4; +} + +message CollectionAlbumDecorationPolicy { + bool decorated = 1; + bool album_type = 2; + CollectionArtistDecorationPolicy artist_policy = 3; + CollectionArtistDecorationPolicy artists_policy = 4; + cosmos_util.proto.AlbumCollectionDecorationPolicy collection_policy = 5; + cosmos_util.proto.AlbumSyncDecorationPolicy sync_policy = 6; + cosmos_util.proto.AlbumDecorationPolicy album_policy = 7; +} + +message CollectionTrackDecorationPolicy { + cosmos_util.proto.TrackCollectionDecorationPolicy collection_policy = 1; + cosmos_util.proto.TrackSyncDecorationPolicy sync_policy = 2; + cosmos_util.proto.TrackDecorationPolicy track_policy = 3; + cosmos_util.proto.TrackPlayedStateDecorationPolicy played_state_policy = 4; + CollectionAlbumDecorationPolicy album_policy = 5; + cosmos_util.proto.ArtistDecorationPolicy artist_policy = 6; + bool decorated = 7; +} diff --git a/lib/spot/proto/collection_get_bans_request.proto b/lib/spot/proto/collection_get_bans_request.proto new file mode 100644 index 0000000..a67574a --- /dev/null +++ b/lib/spot/proto/collection_get_bans_request.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_cosmos.proto; + +import "policy/track_decoration_policy.proto"; +import "policy/artist_decoration_policy.proto"; +import "metadata/track_metadata.proto"; +import "metadata/artist_metadata.proto"; +import "status.proto"; + +option objc_class_prefix = "SPTCollectionCosmos"; +option optimize_for = CODE_SIZE; + +message CollectionGetBansRequest { + cosmos_util.proto.TrackDecorationPolicy track_policy = 1; + cosmos_util.proto.ArtistDecorationPolicy artist_policy = 2; + string sort = 3; + bool timestamp = 4; + uint32 update_throttling = 5; +} + +message Item { + uint32 add_time = 1; + cosmos_util.proto.TrackMetadata track_metadata = 2; + cosmos_util.proto.ArtistMetadata artist_metadata = 3; +} + +message CollectionGetBansResponse { + Status status = 1; + repeated Item item = 2; +} diff --git a/lib/spot/proto/collection_index.proto b/lib/spot/proto/collection_index.proto new file mode 100644 index 0000000..ee6b3ef --- /dev/null +++ b/lib/spot/proto/collection_index.proto @@ -0,0 +1,38 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection.proto; + +option optimize_for = CODE_SIZE; + +message IndexRepairerState { + bytes last_checked_uri = 1; + int64 last_full_check_finished_at = 2; +} + +message CollectionTrackEntry { + string uri = 1; + string track_name = 2; + string album_uri = 3; + string album_name = 4; + int32 disc_number = 5; + int32 track_number = 6; + string artist_uri = 7; + repeated string artist_name = 8; + int64 add_time = 9; +} + +message CollectionAlbumLikeEntry { + string uri = 1; + string album_name = 2; + string creator_uri = 4; + string creator_name = 5; + int64 add_time = 6; +} + +message CollectionArtistEntry { + string uri = 1; + string artist_name = 2; + int64 add_time = 4; +} diff --git a/lib/spot/proto/collection_item.proto b/lib/spot/proto/collection_item.proto new file mode 100644 index 0000000..4a98e9d --- /dev/null +++ b/lib/spot/proto/collection_item.proto @@ -0,0 +1,48 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_cosmos.proto; + +import "metadata/album_metadata.proto"; +import "metadata/artist_metadata.proto"; +import "metadata/track_metadata.proto"; +import "collection/artist_collection_state.proto"; +import "collection/album_collection_state.proto"; +import "collection/track_collection_state.proto"; +import "sync/artist_sync_state.proto"; +import "sync/album_sync_state.proto"; +import "sync/track_sync_state.proto"; +import "played_state/track_played_state.proto"; + +option optimize_for = CODE_SIZE; + +message CollectionTrack { + uint32 index = 1; + uint32 add_time = 2; + cosmos_util.proto.TrackMetadata track_metadata = 3; + cosmos_util.proto.TrackCollectionState track_collection_state = 4; + cosmos_util.proto.TrackPlayState track_play_state = 5; + cosmos_util.proto.TrackSyncState track_sync_state = 6; + bool decorated = 7; + CollectionAlbum album = 8; + string cover = 9; +} + +message CollectionAlbum { + uint32 add_time = 1; + cosmos_util.proto.AlbumMetadata album_metadata = 2; + cosmos_util.proto.AlbumCollectionState album_collection_state = 3; + cosmos_util.proto.AlbumSyncState album_sync_state = 4; + bool decorated = 5; + string album_type = 6; + repeated CollectionTrack track = 7; +} + +message CollectionArtist { + cosmos_util.proto.ArtistMetadata artist_metadata = 1; + cosmos_util.proto.ArtistCollectionState artist_collection_state = 2; + cosmos_util.proto.ArtistSyncState artist_sync_state = 3; + bool decorated = 4; + repeated CollectionAlbum album = 5; +} diff --git a/lib/spot/proto/collection_platform_requests.proto b/lib/spot/proto/collection_platform_requests.proto new file mode 100644 index 0000000..a855c21 --- /dev/null +++ b/lib/spot/proto/collection_platform_requests.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_platform.proto; + +option optimize_for = CODE_SIZE; + +message CollectionPlatformItemsRequest { + CollectionSet set = 1; + repeated string items = 2; +} + +enum CollectionSet { + UNKNOWN = 0; + SHOW = 1; + BAN = 2; + LISTENLATER = 3; + IGNOREINRECS = 4; + ENHANCED = 5; +} diff --git a/lib/spot/proto/collection_platform_responses.proto b/lib/spot/proto/collection_platform_responses.proto new file mode 100644 index 0000000..6b7716d --- /dev/null +++ b/lib/spot/proto/collection_platform_responses.proto @@ -0,0 +1,24 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_platform.proto; + +option optimize_for = CODE_SIZE; + +message CollectionPlatformSimpleResponse { + string error_msg = 1; +} + +message CollectionPlatformItem { + string uri = 1; + int64 add_time = 2; +} + +message CollectionPlatformItemsResponse { + repeated CollectionPlatformItem items = 1; +} + +message CollectionPlatformContainsResponse { + repeated bool found = 1; +} diff --git a/lib/spot/proto/concat_cosmos.proto b/lib/spot/proto/concat_cosmos.proto new file mode 100644 index 0000000..7fe045a --- /dev/null +++ b/lib/spot/proto/concat_cosmos.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.concat_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message ConcatRequest { + string a = 1; + string b = 2; +} + +message ConcatWithSeparatorRequest { + string a = 1; + string b = 2; + string separator = 3; +} + +message ConcatResponse { + string concatenated = 1; +} diff --git a/lib/spot/proto/connect.pb.go b/lib/spot/proto/connect.pb.go new file mode 100644 index 0000000..84ee985 --- /dev/null +++ b/lib/spot/proto/connect.pb.go @@ -0,0 +1,2863 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: connect.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type AudioOutputDeviceType int32 + +const ( + AudioOutputDeviceType_UNKNOWN_AUDIO_OUTPUT_DEVICE_TYPE AudioOutputDeviceType = 0 + AudioOutputDeviceType_BUILT_IN_SPEAKER AudioOutputDeviceType = 1 + AudioOutputDeviceType_LINE_OUT AudioOutputDeviceType = 2 + AudioOutputDeviceType_BLUETOOTH AudioOutputDeviceType = 3 + AudioOutputDeviceType_AIRPLAY AudioOutputDeviceType = 4 +) + +// Enum value maps for AudioOutputDeviceType. +var ( + AudioOutputDeviceType_name = map[int32]string{ + 0: "UNKNOWN_AUDIO_OUTPUT_DEVICE_TYPE", + 1: "BUILT_IN_SPEAKER", + 2: "LINE_OUT", + 3: "BLUETOOTH", + 4: "AIRPLAY", + } + AudioOutputDeviceType_value = map[string]int32{ + "UNKNOWN_AUDIO_OUTPUT_DEVICE_TYPE": 0, + "BUILT_IN_SPEAKER": 1, + "LINE_OUT": 2, + "BLUETOOTH": 3, + "AIRPLAY": 4, + } +) + +func (x AudioOutputDeviceType) Enum() *AudioOutputDeviceType { + p := new(AudioOutputDeviceType) + *p = x + return p +} + +func (x AudioOutputDeviceType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AudioOutputDeviceType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_proto_enumTypes[0].Descriptor() +} + +func (AudioOutputDeviceType) Type() protoreflect.EnumType { + return &file_connect_proto_enumTypes[0] +} + +func (x AudioOutputDeviceType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AudioOutputDeviceType.Descriptor instead. +func (AudioOutputDeviceType) EnumDescriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{0} +} + +type PutStateReason int32 + +const ( + PutStateReason_UNKNOWN_PUT_STATE_REASON PutStateReason = 0 + PutStateReason_SPIRC_HELLO PutStateReason = 1 + PutStateReason_SPIRC_NOTIFY PutStateReason = 2 + PutStateReason_NEW_DEVICE PutStateReason = 3 + PutStateReason_PLAYER_STATE_CHANGED PutStateReason = 4 + PutStateReason_VOLUME_CHANGED PutStateReason = 5 + PutStateReason_PICKER_OPENED PutStateReason = 6 + PutStateReason_BECAME_INACTIVE PutStateReason = 7 + PutStateReason_ALIAS_CHANGED PutStateReason = 8 +) + +// Enum value maps for PutStateReason. +var ( + PutStateReason_name = map[int32]string{ + 0: "UNKNOWN_PUT_STATE_REASON", + 1: "SPIRC_HELLO", + 2: "SPIRC_NOTIFY", + 3: "NEW_DEVICE", + 4: "PLAYER_STATE_CHANGED", + 5: "VOLUME_CHANGED", + 6: "PICKER_OPENED", + 7: "BECAME_INACTIVE", + 8: "ALIAS_CHANGED", + } + PutStateReason_value = map[string]int32{ + "UNKNOWN_PUT_STATE_REASON": 0, + "SPIRC_HELLO": 1, + "SPIRC_NOTIFY": 2, + "NEW_DEVICE": 3, + "PLAYER_STATE_CHANGED": 4, + "VOLUME_CHANGED": 5, + "PICKER_OPENED": 6, + "BECAME_INACTIVE": 7, + "ALIAS_CHANGED": 8, + } +) + +func (x PutStateReason) Enum() *PutStateReason { + p := new(PutStateReason) + *p = x + return p +} + +func (x PutStateReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PutStateReason) Descriptor() protoreflect.EnumDescriptor { + return file_connect_proto_enumTypes[1].Descriptor() +} + +func (PutStateReason) Type() protoreflect.EnumType { + return &file_connect_proto_enumTypes[1] +} + +func (x PutStateReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PutStateReason.Descriptor instead. +func (PutStateReason) EnumDescriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{1} +} + +type MemberType int32 + +const ( + MemberType_SPIRC_V2 MemberType = 0 + MemberType_SPIRC_V3 MemberType = 1 + MemberType_CONNECT_STATE MemberType = 2 + MemberType_CONNECT_STATE_EXTENDED MemberType = 5 + MemberType_ACTIVE_DEVICE_TRACKER MemberType = 6 + MemberType_PLAY_TOKEN MemberType = 7 +) + +// Enum value maps for MemberType. +var ( + MemberType_name = map[int32]string{ + 0: "SPIRC_V2", + 1: "SPIRC_V3", + 2: "CONNECT_STATE", + 5: "CONNECT_STATE_EXTENDED", + 6: "ACTIVE_DEVICE_TRACKER", + 7: "PLAY_TOKEN", + } + MemberType_value = map[string]int32{ + "SPIRC_V2": 0, + "SPIRC_V3": 1, + "CONNECT_STATE": 2, + "CONNECT_STATE_EXTENDED": 5, + "ACTIVE_DEVICE_TRACKER": 6, + "PLAY_TOKEN": 7, + } +) + +func (x MemberType) Enum() *MemberType { + p := new(MemberType) + *p = x + return p +} + +func (x MemberType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MemberType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_proto_enumTypes[2].Descriptor() +} + +func (MemberType) Type() protoreflect.EnumType { + return &file_connect_proto_enumTypes[2] +} + +func (x MemberType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MemberType.Descriptor instead. +func (MemberType) EnumDescriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{2} +} + +type ClusterUpdateReason int32 + +const ( + ClusterUpdateReason_UNKNOWN_CLUSTER_UPDATE_REASON ClusterUpdateReason = 0 + ClusterUpdateReason_DEVICES_DISAPPEARED ClusterUpdateReason = 1 + ClusterUpdateReason_DEVICE_STATE_CHANGED ClusterUpdateReason = 2 + ClusterUpdateReason_NEW_DEVICE_APPEARED ClusterUpdateReason = 3 + ClusterUpdateReason_DEVICE_VOLUME_CHANGED ClusterUpdateReason = 4 + ClusterUpdateReason_DEVICE_ALIAS_CHANGED ClusterUpdateReason = 5 +) + +// Enum value maps for ClusterUpdateReason. +var ( + ClusterUpdateReason_name = map[int32]string{ + 0: "UNKNOWN_CLUSTER_UPDATE_REASON", + 1: "DEVICES_DISAPPEARED", + 2: "DEVICE_STATE_CHANGED", + 3: "NEW_DEVICE_APPEARED", + 4: "DEVICE_VOLUME_CHANGED", + 5: "DEVICE_ALIAS_CHANGED", + } + ClusterUpdateReason_value = map[string]int32{ + "UNKNOWN_CLUSTER_UPDATE_REASON": 0, + "DEVICES_DISAPPEARED": 1, + "DEVICE_STATE_CHANGED": 2, + "NEW_DEVICE_APPEARED": 3, + "DEVICE_VOLUME_CHANGED": 4, + "DEVICE_ALIAS_CHANGED": 5, + } +) + +func (x ClusterUpdateReason) Enum() *ClusterUpdateReason { + p := new(ClusterUpdateReason) + *p = x + return p +} + +func (x ClusterUpdateReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClusterUpdateReason) Descriptor() protoreflect.EnumDescriptor { + return file_connect_proto_enumTypes[3].Descriptor() +} + +func (ClusterUpdateReason) Type() protoreflect.EnumType { + return &file_connect_proto_enumTypes[3] +} + +func (x ClusterUpdateReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ClusterUpdateReason.Descriptor instead. +func (ClusterUpdateReason) EnumDescriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{3} +} + +type SendCommandResult int32 + +const ( + SendCommandResult_UNKNOWN_SEND_COMMAND_RESULT SendCommandResult = 0 + SendCommandResult_SUCCESS SendCommandResult = 1 + SendCommandResult_DEVICE_NOT_FOUND SendCommandResult = 2 + SendCommandResult_CONTEXT_PLAYER_ERROR SendCommandResult = 3 + SendCommandResult_DEVICE_DISAPPEARED SendCommandResult = 4 + SendCommandResult_UPSTREAM_ERROR SendCommandResult = 5 + SendCommandResult_DEVICE_DOES_NOT_SUPPORT_COMMAND SendCommandResult = 6 + SendCommandResult_RATE_LIMITED SendCommandResult = 7 +) + +// Enum value maps for SendCommandResult. +var ( + SendCommandResult_name = map[int32]string{ + 0: "UNKNOWN_SEND_COMMAND_RESULT", + 1: "SUCCESS", + 2: "DEVICE_NOT_FOUND", + 3: "CONTEXT_PLAYER_ERROR", + 4: "DEVICE_DISAPPEARED", + 5: "UPSTREAM_ERROR", + 6: "DEVICE_DOES_NOT_SUPPORT_COMMAND", + 7: "RATE_LIMITED", + } + SendCommandResult_value = map[string]int32{ + "UNKNOWN_SEND_COMMAND_RESULT": 0, + "SUCCESS": 1, + "DEVICE_NOT_FOUND": 2, + "CONTEXT_PLAYER_ERROR": 3, + "DEVICE_DISAPPEARED": 4, + "UPSTREAM_ERROR": 5, + "DEVICE_DOES_NOT_SUPPORT_COMMAND": 6, + "RATE_LIMITED": 7, + } +) + +func (x SendCommandResult) Enum() *SendCommandResult { + p := new(SendCommandResult) + *p = x + return p +} + +func (x SendCommandResult) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SendCommandResult) Descriptor() protoreflect.EnumDescriptor { + return file_connect_proto_enumTypes[4].Descriptor() +} + +func (SendCommandResult) Type() protoreflect.EnumType { + return &file_connect_proto_enumTypes[4] +} + +func (x SendCommandResult) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SendCommandResult.Descriptor instead. +func (SendCommandResult) EnumDescriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{4} +} + +type ClusterUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` + UpdateReason ClusterUpdateReason `protobuf:"varint,2,opt,name=update_reason,json=updateReason,proto3,enum=spotify.connectstate.ClusterUpdateReason" json:"update_reason,omitempty"` + AckId string `protobuf:"bytes,3,opt,name=ack_id,json=ackId,proto3" json:"ack_id,omitempty"` + DevicesThatChanged []string `protobuf:"bytes,4,rep,name=devices_that_changed,json=devicesThatChanged,proto3" json:"devices_that_changed,omitempty"` +} + +func (x *ClusterUpdate) Reset() { + *x = ClusterUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterUpdate) ProtoMessage() {} + +func (x *ClusterUpdate) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterUpdate.ProtoReflect.Descriptor instead. +func (*ClusterUpdate) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{0} +} + +func (x *ClusterUpdate) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +func (x *ClusterUpdate) GetUpdateReason() ClusterUpdateReason { + if x != nil { + return x.UpdateReason + } + return ClusterUpdateReason_UNKNOWN_CLUSTER_UPDATE_REASON +} + +func (x *ClusterUpdate) GetAckId() string { + if x != nil { + return x.AckId + } + return "" +} + +func (x *ClusterUpdate) GetDevicesThatChanged() []string { + if x != nil { + return x.DevicesThatChanged + } + return nil +} + +type PostCommandResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AckId string `protobuf:"bytes,1,opt,name=ack_id,json=ackId,proto3" json:"ack_id,omitempty"` +} + +func (x *PostCommandResponse) Reset() { + *x = PostCommandResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PostCommandResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PostCommandResponse) ProtoMessage() {} + +func (x *PostCommandResponse) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PostCommandResponse.ProtoReflect.Descriptor instead. +func (*PostCommandResponse) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{1} +} + +func (x *PostCommandResponse) GetAckId() string { + if x != nil { + return x.AckId + } + return "" +} + +type Device struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceInfo *DeviceInfo `protobuf:"bytes,1,opt,name=device_info,json=deviceInfo,proto3" json:"device_info,omitempty"` + PlayerState *PlayerState `protobuf:"bytes,2,opt,name=player_state,json=playerState,proto3" json:"player_state,omitempty"` + PrivateDeviceInfo *PrivateDeviceInfo `protobuf:"bytes,3,opt,name=private_device_info,json=privateDeviceInfo,proto3" json:"private_device_info,omitempty"` + TransferData []byte `protobuf:"bytes,4,opt,name=transfer_data,json=transferData,proto3" json:"transfer_data,omitempty"` +} + +func (x *Device) Reset() { + *x = Device{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Device) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Device) ProtoMessage() {} + +func (x *Device) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Device.ProtoReflect.Descriptor instead. +func (*Device) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{2} +} + +func (x *Device) GetDeviceInfo() *DeviceInfo { + if x != nil { + return x.DeviceInfo + } + return nil +} + +func (x *Device) GetPlayerState() *PlayerState { + if x != nil { + return x.PlayerState + } + return nil +} + +func (x *Device) GetPrivateDeviceInfo() *PrivateDeviceInfo { + if x != nil { + return x.PrivateDeviceInfo + } + return nil +} + +func (x *Device) GetTransferData() []byte { + if x != nil { + return x.TransferData + } + return nil +} + +type Cluster struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChangedTimestampMs int64 `protobuf:"varint,1,opt,name=changed_timestamp_ms,json=changedTimestampMs,proto3" json:"changed_timestamp_ms,omitempty"` + ActiveDeviceId string `protobuf:"bytes,2,opt,name=active_device_id,json=activeDeviceId,proto3" json:"active_device_id,omitempty"` + PlayerState *PlayerState `protobuf:"bytes,3,opt,name=player_state,json=playerState,proto3" json:"player_state,omitempty"` + Device map[string]*DeviceInfo `protobuf:"bytes,4,rep,name=device,proto3" json:"device,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + TransferData []byte `protobuf:"bytes,5,opt,name=transfer_data,json=transferData,proto3" json:"transfer_data,omitempty"` + TransferDataTimestamp uint64 `protobuf:"varint,6,opt,name=transfer_data_timestamp,json=transferDataTimestamp,proto3" json:"transfer_data_timestamp,omitempty"` + NotPlayingSinceTimestamp int64 `protobuf:"varint,7,opt,name=not_playing_since_timestamp,json=notPlayingSinceTimestamp,proto3" json:"not_playing_since_timestamp,omitempty"` + NeedFullPlayerState bool `protobuf:"varint,8,opt,name=need_full_player_state,json=needFullPlayerState,proto3" json:"need_full_player_state,omitempty"` + ServerTimestampMs int64 `protobuf:"varint,9,opt,name=server_timestamp_ms,json=serverTimestampMs,proto3" json:"server_timestamp_ms,omitempty"` +} + +func (x *Cluster) Reset() { + *x = Cluster{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Cluster) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Cluster) ProtoMessage() {} + +func (x *Cluster) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Cluster.ProtoReflect.Descriptor instead. +func (*Cluster) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{3} +} + +func (x *Cluster) GetChangedTimestampMs() int64 { + if x != nil { + return x.ChangedTimestampMs + } + return 0 +} + +func (x *Cluster) GetActiveDeviceId() string { + if x != nil { + return x.ActiveDeviceId + } + return "" +} + +func (x *Cluster) GetPlayerState() *PlayerState { + if x != nil { + return x.PlayerState + } + return nil +} + +func (x *Cluster) GetDevice() map[string]*DeviceInfo { + if x != nil { + return x.Device + } + return nil +} + +func (x *Cluster) GetTransferData() []byte { + if x != nil { + return x.TransferData + } + return nil +} + +func (x *Cluster) GetTransferDataTimestamp() uint64 { + if x != nil { + return x.TransferDataTimestamp + } + return 0 +} + +func (x *Cluster) GetNotPlayingSinceTimestamp() int64 { + if x != nil { + return x.NotPlayingSinceTimestamp + } + return 0 +} + +func (x *Cluster) GetNeedFullPlayerState() bool { + if x != nil { + return x.NeedFullPlayerState + } + return false +} + +func (x *Cluster) GetServerTimestampMs() int64 { + if x != nil { + return x.ServerTimestampMs + } + return 0 +} + +type PutStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CallbackUrl string `protobuf:"bytes,1,opt,name=callback_url,json=callbackUrl,proto3" json:"callback_url,omitempty"` + Device *Device `protobuf:"bytes,2,opt,name=device,proto3" json:"device,omitempty"` + MemberType MemberType `protobuf:"varint,3,opt,name=member_type,json=memberType,proto3,enum=spotify.connectstate.MemberType" json:"member_type,omitempty"` + IsActive bool `protobuf:"varint,4,opt,name=is_active,json=isActive,proto3" json:"is_active,omitempty"` + PutStateReason PutStateReason `protobuf:"varint,5,opt,name=put_state_reason,json=putStateReason,proto3,enum=spotify.connectstate.PutStateReason" json:"put_state_reason,omitempty"` + MessageId uint32 `protobuf:"varint,6,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` + LastCommandSentByDeviceId string `protobuf:"bytes,7,opt,name=last_command_sent_by_device_id,json=lastCommandSentByDeviceId,proto3" json:"last_command_sent_by_device_id,omitempty"` + LastCommandMessageId uint32 `protobuf:"varint,8,opt,name=last_command_message_id,json=lastCommandMessageId,proto3" json:"last_command_message_id,omitempty"` + StartedPlayingAt uint64 `protobuf:"varint,9,opt,name=started_playing_at,json=startedPlayingAt,proto3" json:"started_playing_at,omitempty"` + HasBeenPlayingForMs uint64 `protobuf:"varint,11,opt,name=has_been_playing_for_ms,json=hasBeenPlayingForMs,proto3" json:"has_been_playing_for_ms,omitempty"` + ClientSideTimestamp uint64 `protobuf:"varint,12,opt,name=client_side_timestamp,json=clientSideTimestamp,proto3" json:"client_side_timestamp,omitempty"` + OnlyWritePlayerState bool `protobuf:"varint,13,opt,name=only_write_player_state,json=onlyWritePlayerState,proto3" json:"only_write_player_state,omitempty"` +} + +func (x *PutStateRequest) Reset() { + *x = PutStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PutStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PutStateRequest) ProtoMessage() {} + +func (x *PutStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PutStateRequest.ProtoReflect.Descriptor instead. +func (*PutStateRequest) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{4} +} + +func (x *PutStateRequest) GetCallbackUrl() string { + if x != nil { + return x.CallbackUrl + } + return "" +} + +func (x *PutStateRequest) GetDevice() *Device { + if x != nil { + return x.Device + } + return nil +} + +func (x *PutStateRequest) GetMemberType() MemberType { + if x != nil { + return x.MemberType + } + return MemberType_SPIRC_V2 +} + +func (x *PutStateRequest) GetIsActive() bool { + if x != nil { + return x.IsActive + } + return false +} + +func (x *PutStateRequest) GetPutStateReason() PutStateReason { + if x != nil { + return x.PutStateReason + } + return PutStateReason_UNKNOWN_PUT_STATE_REASON +} + +func (x *PutStateRequest) GetMessageId() uint32 { + if x != nil { + return x.MessageId + } + return 0 +} + +func (x *PutStateRequest) GetLastCommandSentByDeviceId() string { + if x != nil { + return x.LastCommandSentByDeviceId + } + return "" +} + +func (x *PutStateRequest) GetLastCommandMessageId() uint32 { + if x != nil { + return x.LastCommandMessageId + } + return 0 +} + +func (x *PutStateRequest) GetStartedPlayingAt() uint64 { + if x != nil { + return x.StartedPlayingAt + } + return 0 +} + +func (x *PutStateRequest) GetHasBeenPlayingForMs() uint64 { + if x != nil { + return x.HasBeenPlayingForMs + } + return 0 +} + +func (x *PutStateRequest) GetClientSideTimestamp() uint64 { + if x != nil { + return x.ClientSideTimestamp + } + return 0 +} + +func (x *PutStateRequest) GetOnlyWritePlayerState() bool { + if x != nil { + return x.OnlyWritePlayerState + } + return false +} + +type PrivateDeviceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"` +} + +func (x *PrivateDeviceInfo) Reset() { + *x = PrivateDeviceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrivateDeviceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrivateDeviceInfo) ProtoMessage() {} + +func (x *PrivateDeviceInfo) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrivateDeviceInfo.ProtoReflect.Descriptor instead. +func (*PrivateDeviceInfo) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{5} +} + +func (x *PrivateDeviceInfo) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +type SubscribeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CallbackUrl string `protobuf:"bytes,1,opt,name=callback_url,json=callbackUrl,proto3" json:"callback_url,omitempty"` +} + +func (x *SubscribeRequest) Reset() { + *x = SubscribeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeRequest) ProtoMessage() {} + +func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. +func (*SubscribeRequest) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{6} +} + +func (x *SubscribeRequest) GetCallbackUrl() string { + if x != nil { + return x.CallbackUrl + } + return "" +} + +type DeviceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CanPlay bool `protobuf:"varint,1,opt,name=can_play,json=canPlay,proto3" json:"can_play,omitempty"` + Volume uint32 `protobuf:"varint,2,opt,name=volume,proto3" json:"volume,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Capabilities *Capabilities `protobuf:"bytes,4,opt,name=capabilities,proto3" json:"capabilities,omitempty"` + Metadata []*DeviceMetadata `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty"` + DeviceSoftwareVersion string `protobuf:"bytes,6,opt,name=device_software_version,json=deviceSoftwareVersion,proto3" json:"device_software_version,omitempty"` + DeviceType DeviceType `protobuf:"varint,7,opt,name=device_type,json=deviceType,proto3,enum=spotify.connectstate.devices.DeviceType" json:"device_type,omitempty"` + SpircVersion string `protobuf:"bytes,9,opt,name=spirc_version,json=spircVersion,proto3" json:"spirc_version,omitempty"` + DeviceId string `protobuf:"bytes,10,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + IsPrivateSession bool `protobuf:"varint,11,opt,name=is_private_session,json=isPrivateSession,proto3" json:"is_private_session,omitempty"` + IsSocialConnect bool `protobuf:"varint,12,opt,name=is_social_connect,json=isSocialConnect,proto3" json:"is_social_connect,omitempty"` + ClientId string `protobuf:"bytes,13,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + Brand string `protobuf:"bytes,14,opt,name=brand,proto3" json:"brand,omitempty"` + Model string `protobuf:"bytes,15,opt,name=model,proto3" json:"model,omitempty"` + MetadataMap map[string]string `protobuf:"bytes,16,rep,name=metadata_map,json=metadataMap,proto3" json:"metadata_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ProductId string `protobuf:"bytes,17,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"` + DeduplicationId string `protobuf:"bytes,18,opt,name=deduplication_id,json=deduplicationId,proto3" json:"deduplication_id,omitempty"` + SelectedAliasId uint32 `protobuf:"varint,19,opt,name=selected_alias_id,json=selectedAliasId,proto3" json:"selected_alias_id,omitempty"` + DeviceAliases map[uint32]*DeviceAlias `protobuf:"bytes,20,rep,name=device_aliases,json=deviceAliases,proto3" json:"device_aliases,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + IsOffline bool `protobuf:"varint,21,opt,name=is_offline,json=isOffline,proto3" json:"is_offline,omitempty"` + PublicIp string `protobuf:"bytes,22,opt,name=public_ip,json=publicIp,proto3" json:"public_ip,omitempty"` + License string `protobuf:"bytes,23,opt,name=license,proto3" json:"license,omitempty"` + IsGroup bool `protobuf:"varint,25,opt,name=is_group,json=isGroup,proto3" json:"is_group,omitempty"` + IsDynamicDevice bool `protobuf:"varint,26,opt,name=is_dynamic_device,json=isDynamicDevice,proto3" json:"is_dynamic_device,omitempty"` + DisallowPlaybackReasons []string `protobuf:"bytes,27,rep,name=disallow_playback_reasons,json=disallowPlaybackReasons,proto3" json:"disallow_playback_reasons,omitempty"` + DisallowTransferReasons []string `protobuf:"bytes,28,rep,name=disallow_transfer_reasons,json=disallowTransferReasons,proto3" json:"disallow_transfer_reasons,omitempty"` + // Types that are assignable to XAudioOutputDeviceInfo: + // + // *DeviceInfo_AudioOutputDeviceInfo + XAudioOutputDeviceInfo isDeviceInfo_XAudioOutputDeviceInfo `protobuf_oneof:"_audio_output_device_info"` +} + +func (x *DeviceInfo) Reset() { + *x = DeviceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeviceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeviceInfo) ProtoMessage() {} + +func (x *DeviceInfo) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeviceInfo.ProtoReflect.Descriptor instead. +func (*DeviceInfo) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{7} +} + +func (x *DeviceInfo) GetCanPlay() bool { + if x != nil { + return x.CanPlay + } + return false +} + +func (x *DeviceInfo) GetVolume() uint32 { + if x != nil { + return x.Volume + } + return 0 +} + +func (x *DeviceInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeviceInfo) GetCapabilities() *Capabilities { + if x != nil { + return x.Capabilities + } + return nil +} + +func (x *DeviceInfo) GetMetadata() []*DeviceMetadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *DeviceInfo) GetDeviceSoftwareVersion() string { + if x != nil { + return x.DeviceSoftwareVersion + } + return "" +} + +func (x *DeviceInfo) GetDeviceType() DeviceType { + if x != nil { + return x.DeviceType + } + return DeviceType_UNKNOWN +} + +func (x *DeviceInfo) GetSpircVersion() string { + if x != nil { + return x.SpircVersion + } + return "" +} + +func (x *DeviceInfo) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *DeviceInfo) GetIsPrivateSession() bool { + if x != nil { + return x.IsPrivateSession + } + return false +} + +func (x *DeviceInfo) GetIsSocialConnect() bool { + if x != nil { + return x.IsSocialConnect + } + return false +} + +func (x *DeviceInfo) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + +func (x *DeviceInfo) GetBrand() string { + if x != nil { + return x.Brand + } + return "" +} + +func (x *DeviceInfo) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *DeviceInfo) GetMetadataMap() map[string]string { + if x != nil { + return x.MetadataMap + } + return nil +} + +func (x *DeviceInfo) GetProductId() string { + if x != nil { + return x.ProductId + } + return "" +} + +func (x *DeviceInfo) GetDeduplicationId() string { + if x != nil { + return x.DeduplicationId + } + return "" +} + +func (x *DeviceInfo) GetSelectedAliasId() uint32 { + if x != nil { + return x.SelectedAliasId + } + return 0 +} + +func (x *DeviceInfo) GetDeviceAliases() map[uint32]*DeviceAlias { + if x != nil { + return x.DeviceAliases + } + return nil +} + +func (x *DeviceInfo) GetIsOffline() bool { + if x != nil { + return x.IsOffline + } + return false +} + +func (x *DeviceInfo) GetPublicIp() string { + if x != nil { + return x.PublicIp + } + return "" +} + +func (x *DeviceInfo) GetLicense() string { + if x != nil { + return x.License + } + return "" +} + +func (x *DeviceInfo) GetIsGroup() bool { + if x != nil { + return x.IsGroup + } + return false +} + +func (x *DeviceInfo) GetIsDynamicDevice() bool { + if x != nil { + return x.IsDynamicDevice + } + return false +} + +func (x *DeviceInfo) GetDisallowPlaybackReasons() []string { + if x != nil { + return x.DisallowPlaybackReasons + } + return nil +} + +func (x *DeviceInfo) GetDisallowTransferReasons() []string { + if x != nil { + return x.DisallowTransferReasons + } + return nil +} + +func (m *DeviceInfo) GetXAudioOutputDeviceInfo() isDeviceInfo_XAudioOutputDeviceInfo { + if m != nil { + return m.XAudioOutputDeviceInfo + } + return nil +} + +func (x *DeviceInfo) GetAudioOutputDeviceInfo() *AudioOutputDeviceInfo { + if x, ok := x.GetXAudioOutputDeviceInfo().(*DeviceInfo_AudioOutputDeviceInfo); ok { + return x.AudioOutputDeviceInfo + } + return nil +} + +type isDeviceInfo_XAudioOutputDeviceInfo interface { + isDeviceInfo_XAudioOutputDeviceInfo() +} + +type DeviceInfo_AudioOutputDeviceInfo struct { + AudioOutputDeviceInfo *AudioOutputDeviceInfo `protobuf:"bytes,24,opt,name=audio_output_device_info,json=audioOutputDeviceInfo,proto3,oneof"` +} + +func (*DeviceInfo_AudioOutputDeviceInfo) isDeviceInfo_XAudioOutputDeviceInfo() {} + +type AudioOutputDeviceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to XAudioOutputDeviceType: + // + // *AudioOutputDeviceInfo_AudioOutputDeviceType + XAudioOutputDeviceType isAudioOutputDeviceInfo_XAudioOutputDeviceType `protobuf_oneof:"_audio_output_device_type"` + // Types that are assignable to XDeviceName: + // + // *AudioOutputDeviceInfo_DeviceName + XDeviceName isAudioOutputDeviceInfo_XDeviceName `protobuf_oneof:"_device_name"` +} + +func (x *AudioOutputDeviceInfo) Reset() { + *x = AudioOutputDeviceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AudioOutputDeviceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AudioOutputDeviceInfo) ProtoMessage() {} + +func (x *AudioOutputDeviceInfo) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AudioOutputDeviceInfo.ProtoReflect.Descriptor instead. +func (*AudioOutputDeviceInfo) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{8} +} + +func (m *AudioOutputDeviceInfo) GetXAudioOutputDeviceType() isAudioOutputDeviceInfo_XAudioOutputDeviceType { + if m != nil { + return m.XAudioOutputDeviceType + } + return nil +} + +func (x *AudioOutputDeviceInfo) GetAudioOutputDeviceType() AudioOutputDeviceType { + if x, ok := x.GetXAudioOutputDeviceType().(*AudioOutputDeviceInfo_AudioOutputDeviceType); ok { + return x.AudioOutputDeviceType + } + return AudioOutputDeviceType_UNKNOWN_AUDIO_OUTPUT_DEVICE_TYPE +} + +func (m *AudioOutputDeviceInfo) GetXDeviceName() isAudioOutputDeviceInfo_XDeviceName { + if m != nil { + return m.XDeviceName + } + return nil +} + +func (x *AudioOutputDeviceInfo) GetDeviceName() string { + if x, ok := x.GetXDeviceName().(*AudioOutputDeviceInfo_DeviceName); ok { + return x.DeviceName + } + return "" +} + +type isAudioOutputDeviceInfo_XAudioOutputDeviceType interface { + isAudioOutputDeviceInfo_XAudioOutputDeviceType() +} + +type AudioOutputDeviceInfo_AudioOutputDeviceType struct { + AudioOutputDeviceType AudioOutputDeviceType `protobuf:"varint,1,opt,name=audio_output_device_type,json=audioOutputDeviceType,proto3,enum=spotify.connectstate.AudioOutputDeviceType,oneof"` +} + +func (*AudioOutputDeviceInfo_AudioOutputDeviceType) isAudioOutputDeviceInfo_XAudioOutputDeviceType() { +} + +type isAudioOutputDeviceInfo_XDeviceName interface { + isAudioOutputDeviceInfo_XDeviceName() +} + +type AudioOutputDeviceInfo_DeviceName struct { + DeviceName string `protobuf:"bytes,2,opt,name=device_name,json=deviceName,proto3,oneof"` +} + +func (*AudioOutputDeviceInfo_DeviceName) isAudioOutputDeviceInfo_XDeviceName() {} + +// Deprecated: Do not use. +type DeviceMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Metadata string `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` +} + +func (x *DeviceMetadata) Reset() { + *x = DeviceMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeviceMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeviceMetadata) ProtoMessage() {} + +func (x *DeviceMetadata) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeviceMetadata.ProtoReflect.Descriptor instead. +func (*DeviceMetadata) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{9} +} + +func (x *DeviceMetadata) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *DeviceMetadata) GetMetadata() string { + if x != nil { + return x.Metadata + } + return "" +} + +type Capabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CanBePlayer bool `protobuf:"varint,2,opt,name=can_be_player,json=canBePlayer,proto3" json:"can_be_player,omitempty"` + RestrictToLocal bool `protobuf:"varint,3,opt,name=restrict_to_local,json=restrictToLocal,proto3" json:"restrict_to_local,omitempty"` + GaiaEqConnectId bool `protobuf:"varint,5,opt,name=gaia_eq_connect_id,json=gaiaEqConnectId,proto3" json:"gaia_eq_connect_id,omitempty"` + SupportsLogout bool `protobuf:"varint,6,opt,name=supports_logout,json=supportsLogout,proto3" json:"supports_logout,omitempty"` + IsObservable bool `protobuf:"varint,7,opt,name=is_observable,json=isObservable,proto3" json:"is_observable,omitempty"` + VolumeSteps int32 `protobuf:"varint,8,opt,name=volume_steps,json=volumeSteps,proto3" json:"volume_steps,omitempty"` + SupportedTypes []string `protobuf:"bytes,9,rep,name=supported_types,json=supportedTypes,proto3" json:"supported_types,omitempty"` + CommandAcks bool `protobuf:"varint,10,opt,name=command_acks,json=commandAcks,proto3" json:"command_acks,omitempty"` + SupportsRename bool `protobuf:"varint,11,opt,name=supports_rename,json=supportsRename,proto3" json:"supports_rename,omitempty"` + Hidden bool `protobuf:"varint,12,opt,name=hidden,proto3" json:"hidden,omitempty"` + DisableVolume bool `protobuf:"varint,13,opt,name=disable_volume,json=disableVolume,proto3" json:"disable_volume,omitempty"` + ConnectDisabled bool `protobuf:"varint,14,opt,name=connect_disabled,json=connectDisabled,proto3" json:"connect_disabled,omitempty"` + SupportsPlaylistV2 bool `protobuf:"varint,15,opt,name=supports_playlist_v2,json=supportsPlaylistV2,proto3" json:"supports_playlist_v2,omitempty"` + IsControllable bool `protobuf:"varint,16,opt,name=is_controllable,json=isControllable,proto3" json:"is_controllable,omitempty"` + SupportsExternalEpisodes bool `protobuf:"varint,17,opt,name=supports_external_episodes,json=supportsExternalEpisodes,proto3" json:"supports_external_episodes,omitempty"` + SupportsSetBackendMetadata bool `protobuf:"varint,18,opt,name=supports_set_backend_metadata,json=supportsSetBackendMetadata,proto3" json:"supports_set_backend_metadata,omitempty"` + SupportsTransferCommand bool `protobuf:"varint,19,opt,name=supports_transfer_command,json=supportsTransferCommand,proto3" json:"supports_transfer_command,omitempty"` + SupportsCommandRequest bool `protobuf:"varint,20,opt,name=supports_command_request,json=supportsCommandRequest,proto3" json:"supports_command_request,omitempty"` + IsVoiceEnabled bool `protobuf:"varint,21,opt,name=is_voice_enabled,json=isVoiceEnabled,proto3" json:"is_voice_enabled,omitempty"` + NeedsFullPlayerState bool `protobuf:"varint,22,opt,name=needs_full_player_state,json=needsFullPlayerState,proto3" json:"needs_full_player_state,omitempty"` + SupportsGzipPushes bool `protobuf:"varint,23,opt,name=supports_gzip_pushes,json=supportsGzipPushes,proto3" json:"supports_gzip_pushes,omitempty"` + SupportsSetOptionsCommand bool `protobuf:"varint,25,opt,name=supports_set_options_command,json=supportsSetOptionsCommand,proto3" json:"supports_set_options_command,omitempty"` + SupportsHifi *CapabilitySupportDetails `protobuf:"bytes,26,opt,name=supports_hifi,json=supportsHifi,proto3" json:"supports_hifi,omitempty"` + ConnectCapabilities string `protobuf:"bytes,27,opt,name=connect_capabilities,json=connectCapabilities,proto3" json:"connect_capabilities,omitempty"` +} + +func (x *Capabilities) Reset() { + *x = Capabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Capabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Capabilities) ProtoMessage() {} + +func (x *Capabilities) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Capabilities.ProtoReflect.Descriptor instead. +func (*Capabilities) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{10} +} + +func (x *Capabilities) GetCanBePlayer() bool { + if x != nil { + return x.CanBePlayer + } + return false +} + +func (x *Capabilities) GetRestrictToLocal() bool { + if x != nil { + return x.RestrictToLocal + } + return false +} + +func (x *Capabilities) GetGaiaEqConnectId() bool { + if x != nil { + return x.GaiaEqConnectId + } + return false +} + +func (x *Capabilities) GetSupportsLogout() bool { + if x != nil { + return x.SupportsLogout + } + return false +} + +func (x *Capabilities) GetIsObservable() bool { + if x != nil { + return x.IsObservable + } + return false +} + +func (x *Capabilities) GetVolumeSteps() int32 { + if x != nil { + return x.VolumeSteps + } + return 0 +} + +func (x *Capabilities) GetSupportedTypes() []string { + if x != nil { + return x.SupportedTypes + } + return nil +} + +func (x *Capabilities) GetCommandAcks() bool { + if x != nil { + return x.CommandAcks + } + return false +} + +func (x *Capabilities) GetSupportsRename() bool { + if x != nil { + return x.SupportsRename + } + return false +} + +func (x *Capabilities) GetHidden() bool { + if x != nil { + return x.Hidden + } + return false +} + +func (x *Capabilities) GetDisableVolume() bool { + if x != nil { + return x.DisableVolume + } + return false +} + +func (x *Capabilities) GetConnectDisabled() bool { + if x != nil { + return x.ConnectDisabled + } + return false +} + +func (x *Capabilities) GetSupportsPlaylistV2() bool { + if x != nil { + return x.SupportsPlaylistV2 + } + return false +} + +func (x *Capabilities) GetIsControllable() bool { + if x != nil { + return x.IsControllable + } + return false +} + +func (x *Capabilities) GetSupportsExternalEpisodes() bool { + if x != nil { + return x.SupportsExternalEpisodes + } + return false +} + +func (x *Capabilities) GetSupportsSetBackendMetadata() bool { + if x != nil { + return x.SupportsSetBackendMetadata + } + return false +} + +func (x *Capabilities) GetSupportsTransferCommand() bool { + if x != nil { + return x.SupportsTransferCommand + } + return false +} + +func (x *Capabilities) GetSupportsCommandRequest() bool { + if x != nil { + return x.SupportsCommandRequest + } + return false +} + +func (x *Capabilities) GetIsVoiceEnabled() bool { + if x != nil { + return x.IsVoiceEnabled + } + return false +} + +func (x *Capabilities) GetNeedsFullPlayerState() bool { + if x != nil { + return x.NeedsFullPlayerState + } + return false +} + +func (x *Capabilities) GetSupportsGzipPushes() bool { + if x != nil { + return x.SupportsGzipPushes + } + return false +} + +func (x *Capabilities) GetSupportsSetOptionsCommand() bool { + if x != nil { + return x.SupportsSetOptionsCommand + } + return false +} + +func (x *Capabilities) GetSupportsHifi() *CapabilitySupportDetails { + if x != nil { + return x.SupportsHifi + } + return nil +} + +func (x *Capabilities) GetConnectCapabilities() string { + if x != nil { + return x.ConnectCapabilities + } + return "" +} + +type CapabilitySupportDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FullySupported bool `protobuf:"varint,1,opt,name=fully_supported,json=fullySupported,proto3" json:"fully_supported,omitempty"` + UserEligible bool `protobuf:"varint,2,opt,name=user_eligible,json=userEligible,proto3" json:"user_eligible,omitempty"` + DeviceSupported bool `protobuf:"varint,3,opt,name=device_supported,json=deviceSupported,proto3" json:"device_supported,omitempty"` +} + +func (x *CapabilitySupportDetails) Reset() { + *x = CapabilitySupportDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CapabilitySupportDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CapabilitySupportDetails) ProtoMessage() {} + +func (x *CapabilitySupportDetails) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CapabilitySupportDetails.ProtoReflect.Descriptor instead. +func (*CapabilitySupportDetails) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{11} +} + +func (x *CapabilitySupportDetails) GetFullySupported() bool { + if x != nil { + return x.FullySupported + } + return false +} + +func (x *CapabilitySupportDetails) GetUserEligible() bool { + if x != nil { + return x.UserEligible + } + return false +} + +func (x *CapabilitySupportDetails) GetDeviceSupported() bool { + if x != nil { + return x.DeviceSupported + } + return false +} + +type ConnectCommandOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageId int32 `protobuf:"varint,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` + TargetAliasId uint32 `protobuf:"varint,3,opt,name=target_alias_id,json=targetAliasId,proto3" json:"target_alias_id,omitempty"` +} + +func (x *ConnectCommandOptions) Reset() { + *x = ConnectCommandOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConnectCommandOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConnectCommandOptions) ProtoMessage() {} + +func (x *ConnectCommandOptions) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConnectCommandOptions.ProtoReflect.Descriptor instead. +func (*ConnectCommandOptions) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{12} +} + +func (x *ConnectCommandOptions) GetMessageId() int32 { + if x != nil { + return x.MessageId + } + return 0 +} + +func (x *ConnectCommandOptions) GetTargetAliasId() uint32 { + if x != nil { + return x.TargetAliasId + } + return 0 +} + +type LogoutCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CommandOptions *ConnectCommandOptions `protobuf:"bytes,1,opt,name=command_options,json=commandOptions,proto3" json:"command_options,omitempty"` +} + +func (x *LogoutCommand) Reset() { + *x = LogoutCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogoutCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogoutCommand) ProtoMessage() {} + +func (x *LogoutCommand) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogoutCommand.ProtoReflect.Descriptor instead. +func (*LogoutCommand) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{13} +} + +func (x *LogoutCommand) GetCommandOptions() *ConnectCommandOptions { + if x != nil { + return x.CommandOptions + } + return nil +} + +type SetVolumeCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Volume int32 `protobuf:"varint,1,opt,name=volume,proto3" json:"volume,omitempty"` + CommandOptions *ConnectCommandOptions `protobuf:"bytes,2,opt,name=command_options,json=commandOptions,proto3" json:"command_options,omitempty"` +} + +func (x *SetVolumeCommand) Reset() { + *x = SetVolumeCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetVolumeCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetVolumeCommand) ProtoMessage() {} + +func (x *SetVolumeCommand) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetVolumeCommand.ProtoReflect.Descriptor instead. +func (*SetVolumeCommand) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{14} +} + +func (x *SetVolumeCommand) GetVolume() int32 { + if x != nil { + return x.Volume + } + return 0 +} + +func (x *SetVolumeCommand) GetCommandOptions() *ConnectCommandOptions { + if x != nil { + return x.CommandOptions + } + return nil +} + +type RenameCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RenameTo string `protobuf:"bytes,1,opt,name=rename_to,json=renameTo,proto3" json:"rename_to,omitempty"` + CommandOptions *ConnectCommandOptions `protobuf:"bytes,2,opt,name=command_options,json=commandOptions,proto3" json:"command_options,omitempty"` +} + +func (x *RenameCommand) Reset() { + *x = RenameCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RenameCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RenameCommand) ProtoMessage() {} + +func (x *RenameCommand) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RenameCommand.ProtoReflect.Descriptor instead. +func (*RenameCommand) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{15} +} + +func (x *RenameCommand) GetRenameTo() string { + if x != nil { + return x.RenameTo + } + return "" +} + +func (x *RenameCommand) GetCommandOptions() *ConnectCommandOptions { + if x != nil { + return x.CommandOptions + } + return nil +} + +type ConnectPlayerCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PlayerCommandJson string `protobuf:"bytes,1,opt,name=player_command_json,json=playerCommandJson,proto3" json:"player_command_json,omitempty"` + CommandOptions *ConnectCommandOptions `protobuf:"bytes,2,opt,name=command_options,json=commandOptions,proto3" json:"command_options,omitempty"` +} + +func (x *ConnectPlayerCommand) Reset() { + *x = ConnectPlayerCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConnectPlayerCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConnectPlayerCommand) ProtoMessage() {} + +func (x *ConnectPlayerCommand) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConnectPlayerCommand.ProtoReflect.Descriptor instead. +func (*ConnectPlayerCommand) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{16} +} + +func (x *ConnectPlayerCommand) GetPlayerCommandJson() string { + if x != nil { + return x.PlayerCommandJson + } + return "" +} + +func (x *ConnectPlayerCommand) GetCommandOptions() *ConnectCommandOptions { + if x != nil { + return x.CommandOptions + } + return nil +} + +type SetBackendMetadataCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata map[string]string `protobuf:"bytes,1,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *SetBackendMetadataCommand) Reset() { + *x = SetBackendMetadataCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetBackendMetadataCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetBackendMetadataCommand) ProtoMessage() {} + +func (x *SetBackendMetadataCommand) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetBackendMetadataCommand.ProtoReflect.Descriptor instead. +func (*SetBackendMetadataCommand) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{17} +} + +func (x *SetBackendMetadataCommand) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +type CommandAndSourceDevice struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` + SourceDeviceInfo *DeviceInfo `protobuf:"bytes,2,opt,name=source_device_info,json=sourceDeviceInfo,proto3" json:"source_device_info,omitempty"` +} + +func (x *CommandAndSourceDevice) Reset() { + *x = CommandAndSourceDevice{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommandAndSourceDevice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommandAndSourceDevice) ProtoMessage() {} + +func (x *CommandAndSourceDevice) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CommandAndSourceDevice.ProtoReflect.Descriptor instead. +func (*CommandAndSourceDevice) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{18} +} + +func (x *CommandAndSourceDevice) GetCommand() string { + if x != nil { + return x.Command + } + return "" +} + +func (x *CommandAndSourceDevice) GetSourceDeviceInfo() *DeviceInfo { + if x != nil { + return x.SourceDeviceInfo + } + return nil +} + +type ActiveDeviceUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` +} + +func (x *ActiveDeviceUpdate) Reset() { + *x = ActiveDeviceUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActiveDeviceUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActiveDeviceUpdate) ProtoMessage() {} + +func (x *ActiveDeviceUpdate) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActiveDeviceUpdate.ProtoReflect.Descriptor instead. +func (*ActiveDeviceUpdate) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{19} +} + +func (x *ActiveDeviceUpdate) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +type StartedPlayingEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserInfoHeader []byte `protobuf:"bytes,1,opt,name=user_info_header,json=userInfoHeader,proto3" json:"user_info_header,omitempty"` + DeviceId string `protobuf:"bytes,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` +} + +func (x *StartedPlayingEvent) Reset() { + *x = StartedPlayingEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartedPlayingEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartedPlayingEvent) ProtoMessage() {} + +func (x *StartedPlayingEvent) ProtoReflect() protoreflect.Message { + mi := &file_connect_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartedPlayingEvent.ProtoReflect.Descriptor instead. +func (*StartedPlayingEvent) Descriptor() ([]byte, []int) { + return file_connect_proto_rawDescGZIP(), []int{20} +} + +func (x *StartedPlayingEvent) GetUserInfoHeader() []byte { + if x != nil { + return x.UserInfoHeader + } + return nil +} + +func (x *StartedPlayingEvent) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +var File_connect_proto protoreflect.FileDescriptor + +var file_connect_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x14, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x0c, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xe1, 0x01, 0x0a, 0x0d, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x4e, 0x0a, + 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, + 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x15, 0x0a, + 0x06, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, + 0x63, 0x6b, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5f, + 0x74, 0x68, 0x61, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x68, 0x61, 0x74, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x2c, 0x0a, 0x13, 0x50, 0x6f, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, + 0x06, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, + 0x63, 0x6b, 0x49, 0x64, 0x22, 0x8f, 0x02, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x41, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x0c, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x70, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x13, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xcc, 0x04, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x4d, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x44, + 0x0a, 0x0c, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x17, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3d, 0x0a, 0x1b, 0x6e, 0x6f, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x79, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, 0x6f, 0x74, 0x50, 0x6c, + 0x61, 0x79, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x65, 0x64, 0x5f, 0x66, 0x75, 0x6c, 0x6c, + 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x6e, 0x65, 0x65, 0x64, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x1a, 0x5b, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x82, 0x05, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x34, 0x0a, 0x06, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, + 0x64, 0x12, 0x41, 0x0a, 0x1e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x61, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x17, 0x68, 0x61, 0x73, + 0x5f, 0x62, 0x65, 0x65, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x6f, + 0x72, 0x5f, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x68, 0x61, 0x73, 0x42, + 0x65, 0x65, 0x6e, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x46, 0x6f, 0x72, 0x4d, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x35, 0x0a, 0x17, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6f, 0x6e, 0x6c, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x50, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x35, 0x0a, 0x10, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, + 0x72, 0x6c, 0x22, 0xb4, 0x0b, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x61, 0x6e, 0x50, 0x6c, 0x61, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x66, + 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x0b, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x28, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x70, 0x69, 0x72, 0x63, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x70, + 0x69, 0x72, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x69, 0x73, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, + 0x72, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x54, 0x0a, 0x0c, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, + 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, + 0x29, 0x0a, 0x10, 0x64, 0x65, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x64, 0x75, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x12, 0x18, + 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x69, 0x73, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x3a, 0x0a, 0x19, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x6c, 0x61, 0x79, + 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x1b, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x6c, 0x61, 0x79, + 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, + 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x66, 0x0a, 0x18, 0x61, 0x75, 0x64, 0x69, 0x6f, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x15, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, + 0x3e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x6b, 0x0a, 0x12, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1b, 0x0a, 0x19, + 0x5f, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0xcf, 0x01, 0x0a, 0x15, 0x41, 0x75, + 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x66, 0x0a, 0x18, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x75, 0x64, + 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x48, 0x00, 0x52, 0x15, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x1b, + 0x0a, 0x19, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x44, 0x0a, 0x0e, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x02, 0x18, + 0x01, 0x22, 0x89, 0x09, 0x0a, 0x0c, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x61, 0x6e, 0x5f, 0x62, 0x65, 0x5f, 0x70, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x61, 0x6e, 0x42, 0x65, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x12, 0x2b, 0x0a, 0x12, 0x67, 0x61, 0x69, 0x61, 0x5f, 0x65, 0x71, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x67, 0x61, 0x69, 0x61, 0x45, 0x71, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, + 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, + 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x69, 0x73, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x63, 0x6b, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x52, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, 0x25, 0x0a, + 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x30, 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x56, + 0x32, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x73, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x45, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x1a, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x19, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x73, 0x5f, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x73, 0x56, + 0x6f, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x6e, + 0x65, 0x65, 0x64, 0x73, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x65, + 0x65, 0x64, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x67, + 0x7a, 0x69, 0x70, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x12, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x47, 0x7a, 0x69, 0x70, 0x50, 0x75, + 0x73, 0x68, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x53, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x5f, 0x68, 0x69, 0x66, 0x69, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0c, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x48, 0x69, 0x66, 0x69, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x93, 0x01, + 0x0a, 0x18, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x53, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x75, + 0x6c, 0x6c, 0x79, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6c, 0x69, 0x67, + 0x69, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, + 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x22, 0x5e, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x54, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x53, + 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x82, 0x01, + 0x0a, 0x0d, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x12, 0x54, 0x0a, 0x0f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x70, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6a, 0x73, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x59, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x82, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x41, 0x6e, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x4e, 0x0a, 0x12, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x31, 0x0a, 0x12, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, + 0x5c, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, + 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x2a, 0x7d, 0x0a, + 0x15, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x5f, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, + 0x42, 0x55, 0x49, 0x4c, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x50, 0x45, 0x41, 0x4b, 0x45, 0x52, + 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x4c, 0x55, 0x45, 0x54, 0x4f, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x12, + 0x0b, 0x0a, 0x07, 0x41, 0x49, 0x52, 0x50, 0x4c, 0x41, 0x59, 0x10, 0x04, 0x2a, 0xca, 0x01, 0x0a, + 0x0e, 0x50, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x18, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x50, 0x55, 0x54, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x53, 0x50, 0x49, 0x52, 0x43, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x53, 0x50, 0x49, 0x52, 0x43, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x10, 0x02, + 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x57, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, + 0x12, 0x18, 0x0a, 0x14, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x56, 0x4f, + 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x05, 0x12, 0x11, + 0x0a, 0x0d, 0x50, 0x49, 0x43, 0x4b, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x45, 0x44, 0x10, + 0x06, 0x12, 0x13, 0x0a, 0x0f, 0x42, 0x45, 0x43, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x45, 0x10, 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x5f, + 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x08, 0x2a, 0x82, 0x01, 0x0a, 0x0a, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x50, 0x49, 0x52, + 0x43, 0x5f, 0x56, 0x32, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x50, 0x49, 0x52, 0x43, 0x5f, + 0x56, 0x33, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x44, 0x45, + 0x44, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x44, 0x45, + 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x45, 0x52, 0x10, 0x06, 0x12, 0x0e, + 0x0a, 0x0a, 0x50, 0x4c, 0x41, 0x59, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x07, 0x2a, 0xb9, + 0x01, 0x0a, 0x13, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x45, 0x56, + 0x49, 0x43, 0x45, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x50, 0x50, 0x45, 0x41, 0x52, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, + 0x4e, 0x45, 0x57, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x45, 0x41, + 0x52, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x04, + 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x4c, 0x49, 0x41, 0x53, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x05, 0x2a, 0xd4, 0x01, 0x0a, 0x11, 0x53, + 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x45, 0x4e, 0x44, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x14, + 0x0a, 0x10, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, + 0x4e, 0x44, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x5f, + 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x16, + 0x0a, 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x50, 0x50, 0x45, + 0x41, 0x52, 0x45, 0x44, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x50, 0x53, 0x54, 0x52, 0x45, + 0x41, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x45, + 0x56, 0x49, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x55, + 0x50, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x10, 0x06, 0x12, + 0x10, 0x0a, 0x0c, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, + 0x07, 0x42, 0x45, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x48, 0x02, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, + 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, + 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_connect_proto_rawDescOnce sync.Once + file_connect_proto_rawDescData = file_connect_proto_rawDesc +) + +func file_connect_proto_rawDescGZIP() []byte { + file_connect_proto_rawDescOnce.Do(func() { + file_connect_proto_rawDescData = protoimpl.X.CompressGZIP(file_connect_proto_rawDescData) + }) + return file_connect_proto_rawDescData +} + +var file_connect_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_connect_proto_msgTypes = make([]protoimpl.MessageInfo, 25) +var file_connect_proto_goTypes = []interface{}{ + (AudioOutputDeviceType)(0), // 0: spotify.connectstate.AudioOutputDeviceType + (PutStateReason)(0), // 1: spotify.connectstate.PutStateReason + (MemberType)(0), // 2: spotify.connectstate.MemberType + (ClusterUpdateReason)(0), // 3: spotify.connectstate.ClusterUpdateReason + (SendCommandResult)(0), // 4: spotify.connectstate.SendCommandResult + (*ClusterUpdate)(nil), // 5: spotify.connectstate.ClusterUpdate + (*PostCommandResponse)(nil), // 6: spotify.connectstate.PostCommandResponse + (*Device)(nil), // 7: spotify.connectstate.Device + (*Cluster)(nil), // 8: spotify.connectstate.Cluster + (*PutStateRequest)(nil), // 9: spotify.connectstate.PutStateRequest + (*PrivateDeviceInfo)(nil), // 10: spotify.connectstate.PrivateDeviceInfo + (*SubscribeRequest)(nil), // 11: spotify.connectstate.SubscribeRequest + (*DeviceInfo)(nil), // 12: spotify.connectstate.DeviceInfo + (*AudioOutputDeviceInfo)(nil), // 13: spotify.connectstate.AudioOutputDeviceInfo + (*DeviceMetadata)(nil), // 14: spotify.connectstate.DeviceMetadata + (*Capabilities)(nil), // 15: spotify.connectstate.Capabilities + (*CapabilitySupportDetails)(nil), // 16: spotify.connectstate.CapabilitySupportDetails + (*ConnectCommandOptions)(nil), // 17: spotify.connectstate.ConnectCommandOptions + (*LogoutCommand)(nil), // 18: spotify.connectstate.LogoutCommand + (*SetVolumeCommand)(nil), // 19: spotify.connectstate.SetVolumeCommand + (*RenameCommand)(nil), // 20: spotify.connectstate.RenameCommand + (*ConnectPlayerCommand)(nil), // 21: spotify.connectstate.ConnectPlayerCommand + (*SetBackendMetadataCommand)(nil), // 22: spotify.connectstate.SetBackendMetadataCommand + (*CommandAndSourceDevice)(nil), // 23: spotify.connectstate.CommandAndSourceDevice + (*ActiveDeviceUpdate)(nil), // 24: spotify.connectstate.ActiveDeviceUpdate + (*StartedPlayingEvent)(nil), // 25: spotify.connectstate.StartedPlayingEvent + nil, // 26: spotify.connectstate.Cluster.DeviceEntry + nil, // 27: spotify.connectstate.DeviceInfo.MetadataMapEntry + nil, // 28: spotify.connectstate.DeviceInfo.DeviceAliasesEntry + nil, // 29: spotify.connectstate.SetBackendMetadataCommand.MetadataEntry + (*PlayerState)(nil), // 30: spotify.connectstate.PlayerState + (DeviceType)(0), // 31: spotify.connectstate.devices.DeviceType + (*DeviceAlias)(nil), // 32: spotify.connectstate.devices.DeviceAlias +} +var file_connect_proto_depIdxs = []int32{ + 8, // 0: spotify.connectstate.ClusterUpdate.cluster:type_name -> spotify.connectstate.Cluster + 3, // 1: spotify.connectstate.ClusterUpdate.update_reason:type_name -> spotify.connectstate.ClusterUpdateReason + 12, // 2: spotify.connectstate.Device.device_info:type_name -> spotify.connectstate.DeviceInfo + 30, // 3: spotify.connectstate.Device.player_state:type_name -> spotify.connectstate.PlayerState + 10, // 4: spotify.connectstate.Device.private_device_info:type_name -> spotify.connectstate.PrivateDeviceInfo + 30, // 5: spotify.connectstate.Cluster.player_state:type_name -> spotify.connectstate.PlayerState + 26, // 6: spotify.connectstate.Cluster.device:type_name -> spotify.connectstate.Cluster.DeviceEntry + 7, // 7: spotify.connectstate.PutStateRequest.device:type_name -> spotify.connectstate.Device + 2, // 8: spotify.connectstate.PutStateRequest.member_type:type_name -> spotify.connectstate.MemberType + 1, // 9: spotify.connectstate.PutStateRequest.put_state_reason:type_name -> spotify.connectstate.PutStateReason + 15, // 10: spotify.connectstate.DeviceInfo.capabilities:type_name -> spotify.connectstate.Capabilities + 14, // 11: spotify.connectstate.DeviceInfo.metadata:type_name -> spotify.connectstate.DeviceMetadata + 31, // 12: spotify.connectstate.DeviceInfo.device_type:type_name -> spotify.connectstate.devices.DeviceType + 27, // 13: spotify.connectstate.DeviceInfo.metadata_map:type_name -> spotify.connectstate.DeviceInfo.MetadataMapEntry + 28, // 14: spotify.connectstate.DeviceInfo.device_aliases:type_name -> spotify.connectstate.DeviceInfo.DeviceAliasesEntry + 13, // 15: spotify.connectstate.DeviceInfo.audio_output_device_info:type_name -> spotify.connectstate.AudioOutputDeviceInfo + 0, // 16: spotify.connectstate.AudioOutputDeviceInfo.audio_output_device_type:type_name -> spotify.connectstate.AudioOutputDeviceType + 16, // 17: spotify.connectstate.Capabilities.supports_hifi:type_name -> spotify.connectstate.CapabilitySupportDetails + 17, // 18: spotify.connectstate.LogoutCommand.command_options:type_name -> spotify.connectstate.ConnectCommandOptions + 17, // 19: spotify.connectstate.SetVolumeCommand.command_options:type_name -> spotify.connectstate.ConnectCommandOptions + 17, // 20: spotify.connectstate.RenameCommand.command_options:type_name -> spotify.connectstate.ConnectCommandOptions + 17, // 21: spotify.connectstate.ConnectPlayerCommand.command_options:type_name -> spotify.connectstate.ConnectCommandOptions + 29, // 22: spotify.connectstate.SetBackendMetadataCommand.metadata:type_name -> spotify.connectstate.SetBackendMetadataCommand.MetadataEntry + 12, // 23: spotify.connectstate.CommandAndSourceDevice.source_device_info:type_name -> spotify.connectstate.DeviceInfo + 12, // 24: spotify.connectstate.Cluster.DeviceEntry.value:type_name -> spotify.connectstate.DeviceInfo + 32, // 25: spotify.connectstate.DeviceInfo.DeviceAliasesEntry.value:type_name -> spotify.connectstate.devices.DeviceAlias + 26, // [26:26] is the sub-list for method output_type + 26, // [26:26] is the sub-list for method input_type + 26, // [26:26] is the sub-list for extension type_name + 26, // [26:26] is the sub-list for extension extendee + 0, // [0:26] is the sub-list for field type_name +} + +func init() { file_connect_proto_init() } +func file_connect_proto_init() { + if File_connect_proto != nil { + return + } + file_player_proto_init() + file_devices_proto_init() + if !protoimpl.UnsafeEnabled { + file_connect_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PostCommandResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Device); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Cluster); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PutStateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrivateDeviceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AudioOutputDeviceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Capabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapabilitySupportDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConnectCommandOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogoutCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetVolumeCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RenameCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConnectPlayerCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetBackendMetadataCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandAndSourceDevice); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActiveDeviceUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartedPlayingEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_connect_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*DeviceInfo_AudioOutputDeviceInfo)(nil), + } + file_connect_proto_msgTypes[8].OneofWrappers = []interface{}{ + (*AudioOutputDeviceInfo_AudioOutputDeviceType)(nil), + (*AudioOutputDeviceInfo_DeviceName)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_connect_proto_rawDesc, + NumEnums: 5, + NumMessages: 25, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_connect_proto_goTypes, + DependencyIndexes: file_connect_proto_depIdxs, + EnumInfos: file_connect_proto_enumTypes, + MessageInfos: file_connect_proto_msgTypes, + }.Build() + File_connect_proto = out.File + file_connect_proto_rawDesc = nil + file_connect_proto_goTypes = nil + file_connect_proto_depIdxs = nil +} diff --git a/lib/spot/proto/connect.proto b/lib/spot/proto/connect.proto new file mode 100644 index 0000000..56b1e88 --- /dev/null +++ b/lib/spot/proto/connect.proto @@ -0,0 +1,240 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.connectstate; + +import "player.proto"; +import "devices.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.connectstate.model"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message ClusterUpdate { + Cluster cluster = 1; + ClusterUpdateReason update_reason = 2; + string ack_id = 3; + repeated string devices_that_changed = 4; +} + +message PostCommandResponse { + string ack_id = 1; +} + +message Device { + DeviceInfo device_info = 1; + PlayerState player_state = 2; + PrivateDeviceInfo private_device_info = 3; + bytes transfer_data = 4; +} + +message Cluster { + int64 changed_timestamp_ms = 1; + string active_device_id = 2; + PlayerState player_state = 3; + map device = 4; + bytes transfer_data = 5; + uint64 transfer_data_timestamp = 6; + int64 not_playing_since_timestamp = 7; + bool need_full_player_state = 8; + int64 server_timestamp_ms = 9; +} + +message PutStateRequest { + string callback_url = 1; + Device device = 2; + MemberType member_type = 3; + bool is_active = 4; + PutStateReason put_state_reason = 5; + uint32 message_id = 6; + string last_command_sent_by_device_id = 7; + uint32 last_command_message_id = 8; + uint64 started_playing_at = 9; + uint64 has_been_playing_for_ms = 11; + uint64 client_side_timestamp = 12; + bool only_write_player_state = 13; +} + +message PrivateDeviceInfo { + string platform = 1; +} + +message SubscribeRequest { + string callback_url = 1; +} + +message DeviceInfo { + bool can_play = 1; + uint32 volume = 2; + string name = 3; + Capabilities capabilities = 4; + repeated DeviceMetadata metadata = 5; + string device_software_version = 6; + spotify.connectstate.devices.DeviceType device_type = 7; + string spirc_version = 9; + string device_id = 10; + bool is_private_session = 11; + bool is_social_connect = 12; + string client_id = 13; + string brand = 14; + string model = 15; + map metadata_map = 16; + string product_id = 17; + string deduplication_id = 18; + uint32 selected_alias_id = 19; + map device_aliases = 20; + bool is_offline = 21; + string public_ip = 22; + string license = 23; + bool is_group = 25; + bool is_dynamic_device = 26; + repeated string disallow_playback_reasons = 27; + repeated string disallow_transfer_reasons = 28; + + oneof _audio_output_device_info { + AudioOutputDeviceInfo audio_output_device_info = 24; + } +} + +message AudioOutputDeviceInfo { + oneof _audio_output_device_type { + AudioOutputDeviceType audio_output_device_type = 1; + } + + oneof _device_name { + string device_name = 2; + } +} + +message DeviceMetadata { + option deprecated = true; + string type = 1; + string metadata = 2; +} + +message Capabilities { + bool can_be_player = 2; + bool restrict_to_local = 3; + bool gaia_eq_connect_id = 5; + bool supports_logout = 6; + bool is_observable = 7; + int32 volume_steps = 8; + repeated string supported_types = 9; + bool command_acks = 10; + bool supports_rename = 11; + bool hidden = 12; + bool disable_volume = 13; + bool connect_disabled = 14; + bool supports_playlist_v2 = 15; + bool is_controllable = 16; + bool supports_external_episodes = 17; + bool supports_set_backend_metadata = 18; + bool supports_transfer_command = 19; + bool supports_command_request = 20; + bool is_voice_enabled = 21; + bool needs_full_player_state = 22; + bool supports_gzip_pushes = 23; + bool supports_set_options_command = 25; + CapabilitySupportDetails supports_hifi = 26; + string connect_capabilities = 27; + + //reserved 1, 4, 24, "supported_contexts", "supports_lossless_audio"; +} + +message CapabilitySupportDetails { + bool fully_supported = 1; + bool user_eligible = 2; + bool device_supported = 3; +} + +message ConnectCommandOptions { + int32 message_id = 1; + uint32 target_alias_id = 3; +} + +message LogoutCommand { + ConnectCommandOptions command_options = 1; +} + +message SetVolumeCommand { + int32 volume = 1; + ConnectCommandOptions command_options = 2; +} + +message RenameCommand { + string rename_to = 1; + ConnectCommandOptions command_options = 2; +} + +message ConnectPlayerCommand { + string player_command_json = 1; + ConnectCommandOptions command_options = 2; +} + +message SetBackendMetadataCommand { + map metadata = 1; +} + +message CommandAndSourceDevice { + string command = 1; + DeviceInfo source_device_info = 2; +} + +message ActiveDeviceUpdate { + string device_id = 1; +} + +message StartedPlayingEvent { + bytes user_info_header = 1; + string device_id = 2; +} + +enum AudioOutputDeviceType { + UNKNOWN_AUDIO_OUTPUT_DEVICE_TYPE = 0; + BUILT_IN_SPEAKER = 1; + LINE_OUT = 2; + BLUETOOTH = 3; + AIRPLAY = 4; +} + +enum PutStateReason { + UNKNOWN_PUT_STATE_REASON = 0; + SPIRC_HELLO = 1; + SPIRC_NOTIFY = 2; + NEW_DEVICE = 3; + PLAYER_STATE_CHANGED = 4; + VOLUME_CHANGED = 5; + PICKER_OPENED = 6; + BECAME_INACTIVE = 7; + ALIAS_CHANGED = 8; +} + +enum MemberType { + SPIRC_V2 = 0; + SPIRC_V3 = 1; + CONNECT_STATE = 2; + CONNECT_STATE_EXTENDED = 5; + ACTIVE_DEVICE_TRACKER = 6; + PLAY_TOKEN = 7; +} + +enum ClusterUpdateReason { + UNKNOWN_CLUSTER_UPDATE_REASON = 0; + DEVICES_DISAPPEARED = 1; + DEVICE_STATE_CHANGED = 2; + NEW_DEVICE_APPEARED = 3; + DEVICE_VOLUME_CHANGED = 4; + DEVICE_ALIAS_CHANGED = 5; +} + +enum SendCommandResult { + UNKNOWN_SEND_COMMAND_RESULT = 0; + SUCCESS = 1; + DEVICE_NOT_FOUND = 2; + CONTEXT_PLAYER_ERROR = 3; + DEVICE_DISAPPEARED = 4; + UPSTREAM_ERROR = 5; + DEVICE_DOES_NOT_SUPPORT_COMMAND = 6; + RATE_LIMITED = 7; +} diff --git a/lib/spot/proto/connectivity.pb.go b/lib/spot/proto/connectivity.pb.go new file mode 100644 index 0000000..d81438c --- /dev/null +++ b/lib/spot/proto/connectivity.pb.go @@ -0,0 +1,1006 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: connectivity.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ConnectivitySdkData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PlatformSpecificData *PlatformSpecificData `protobuf:"bytes,1,opt,name=platform_specific_data,json=platformSpecificData,proto3" json:"platform_specific_data,omitempty"` + DeviceId string `protobuf:"bytes,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` +} + +func (x *ConnectivitySdkData) Reset() { + *x = ConnectivitySdkData{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConnectivitySdkData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConnectivitySdkData) ProtoMessage() {} + +func (x *ConnectivitySdkData) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConnectivitySdkData.ProtoReflect.Descriptor instead. +func (*ConnectivitySdkData) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{0} +} + +func (x *ConnectivitySdkData) GetPlatformSpecificData() *PlatformSpecificData { + if x != nil { + return x.PlatformSpecificData + } + return nil +} + +func (x *ConnectivitySdkData) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +type PlatformSpecificData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Data: + // + // *PlatformSpecificData_Android + // *PlatformSpecificData_Ios + // *PlatformSpecificData_DesktopMacos + // *PlatformSpecificData_DesktopWindows + // *PlatformSpecificData_DesktopLinux + Data isPlatformSpecificData_Data `protobuf_oneof:"data"` +} + +func (x *PlatformSpecificData) Reset() { + *x = PlatformSpecificData{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlatformSpecificData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlatformSpecificData) ProtoMessage() {} + +func (x *PlatformSpecificData) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlatformSpecificData.ProtoReflect.Descriptor instead. +func (*PlatformSpecificData) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{1} +} + +func (m *PlatformSpecificData) GetData() isPlatformSpecificData_Data { + if m != nil { + return m.Data + } + return nil +} + +func (x *PlatformSpecificData) GetAndroid() *NativeAndroidData { + if x, ok := x.GetData().(*PlatformSpecificData_Android); ok { + return x.Android + } + return nil +} + +func (x *PlatformSpecificData) GetIos() *NativeIOSData { + if x, ok := x.GetData().(*PlatformSpecificData_Ios); ok { + return x.Ios + } + return nil +} + +func (x *PlatformSpecificData) GetDesktopMacos() *NativeDesktopMacOSData { + if x, ok := x.GetData().(*PlatformSpecificData_DesktopMacos); ok { + return x.DesktopMacos + } + return nil +} + +func (x *PlatformSpecificData) GetDesktopWindows() *NativeDesktopWindowsData { + if x, ok := x.GetData().(*PlatformSpecificData_DesktopWindows); ok { + return x.DesktopWindows + } + return nil +} + +func (x *PlatformSpecificData) GetDesktopLinux() *NativeDesktopLinuxData { + if x, ok := x.GetData().(*PlatformSpecificData_DesktopLinux); ok { + return x.DesktopLinux + } + return nil +} + +type isPlatformSpecificData_Data interface { + isPlatformSpecificData_Data() +} + +type PlatformSpecificData_Android struct { + Android *NativeAndroidData `protobuf:"bytes,1,opt,name=android,proto3,oneof"` +} + +type PlatformSpecificData_Ios struct { + Ios *NativeIOSData `protobuf:"bytes,2,opt,name=ios,proto3,oneof"` +} + +type PlatformSpecificData_DesktopMacos struct { + DesktopMacos *NativeDesktopMacOSData `protobuf:"bytes,3,opt,name=desktop_macos,json=desktopMacos,proto3,oneof"` +} + +type PlatformSpecificData_DesktopWindows struct { + DesktopWindows *NativeDesktopWindowsData `protobuf:"bytes,4,opt,name=desktop_windows,json=desktopWindows,proto3,oneof"` +} + +type PlatformSpecificData_DesktopLinux struct { + DesktopLinux *NativeDesktopLinuxData `protobuf:"bytes,5,opt,name=desktop_linux,json=desktopLinux,proto3,oneof"` +} + +func (*PlatformSpecificData_Android) isPlatformSpecificData_Data() {} + +func (*PlatformSpecificData_Ios) isPlatformSpecificData_Data() {} + +func (*PlatformSpecificData_DesktopMacos) isPlatformSpecificData_Data() {} + +func (*PlatformSpecificData_DesktopWindows) isPlatformSpecificData_Data() {} + +func (*PlatformSpecificData_DesktopLinux) isPlatformSpecificData_Data() {} + +type NativeAndroidData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ScreenDimensions *Screen `protobuf:"bytes,1,opt,name=screen_dimensions,json=screenDimensions,proto3" json:"screen_dimensions,omitempty"` + AndroidVersion string `protobuf:"bytes,2,opt,name=android_version,json=androidVersion,proto3" json:"android_version,omitempty"` + ApiVersion int32 `protobuf:"varint,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` + DeviceName string `protobuf:"bytes,4,opt,name=device_name,json=deviceName,proto3" json:"device_name,omitempty"` + ModelStr string `protobuf:"bytes,5,opt,name=model_str,json=modelStr,proto3" json:"model_str,omitempty"` + Vendor string `protobuf:"bytes,6,opt,name=vendor,proto3" json:"vendor,omitempty"` + Vendor_2 string `protobuf:"bytes,7,opt,name=vendor_2,json=vendor2,proto3" json:"vendor_2,omitempty"` + UnknownValue_8 int32 `protobuf:"varint,8,opt,name=unknown_value_8,json=unknownValue8,proto3" json:"unknown_value_8,omitempty"` +} + +func (x *NativeAndroidData) Reset() { + *x = NativeAndroidData{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NativeAndroidData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NativeAndroidData) ProtoMessage() {} + +func (x *NativeAndroidData) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NativeAndroidData.ProtoReflect.Descriptor instead. +func (*NativeAndroidData) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{2} +} + +func (x *NativeAndroidData) GetScreenDimensions() *Screen { + if x != nil { + return x.ScreenDimensions + } + return nil +} + +func (x *NativeAndroidData) GetAndroidVersion() string { + if x != nil { + return x.AndroidVersion + } + return "" +} + +func (x *NativeAndroidData) GetApiVersion() int32 { + if x != nil { + return x.ApiVersion + } + return 0 +} + +func (x *NativeAndroidData) GetDeviceName() string { + if x != nil { + return x.DeviceName + } + return "" +} + +func (x *NativeAndroidData) GetModelStr() string { + if x != nil { + return x.ModelStr + } + return "" +} + +func (x *NativeAndroidData) GetVendor() string { + if x != nil { + return x.Vendor + } + return "" +} + +func (x *NativeAndroidData) GetVendor_2() string { + if x != nil { + return x.Vendor_2 + } + return "" +} + +func (x *NativeAndroidData) GetUnknownValue_8() int32 { + if x != nil { + return x.UnknownValue_8 + } + return 0 +} + +type NativeIOSData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom + UserInterfaceIdiom int32 `protobuf:"varint,1,opt,name=user_interface_idiom,json=userInterfaceIdiom,proto3" json:"user_interface_idiom,omitempty"` + TargetIphoneSimulator bool `protobuf:"varint,2,opt,name=target_iphone_simulator,json=targetIphoneSimulator,proto3" json:"target_iphone_simulator,omitempty"` + HwMachine string `protobuf:"bytes,3,opt,name=hw_machine,json=hwMachine,proto3" json:"hw_machine,omitempty"` + SystemVersion string `protobuf:"bytes,4,opt,name=system_version,json=systemVersion,proto3" json:"system_version,omitempty"` + SimulatorModelIdentifier string `protobuf:"bytes,5,opt,name=simulator_model_identifier,json=simulatorModelIdentifier,proto3" json:"simulator_model_identifier,omitempty"` +} + +func (x *NativeIOSData) Reset() { + *x = NativeIOSData{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NativeIOSData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NativeIOSData) ProtoMessage() {} + +func (x *NativeIOSData) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NativeIOSData.ProtoReflect.Descriptor instead. +func (*NativeIOSData) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{3} +} + +func (x *NativeIOSData) GetUserInterfaceIdiom() int32 { + if x != nil { + return x.UserInterfaceIdiom + } + return 0 +} + +func (x *NativeIOSData) GetTargetIphoneSimulator() bool { + if x != nil { + return x.TargetIphoneSimulator + } + return false +} + +func (x *NativeIOSData) GetHwMachine() string { + if x != nil { + return x.HwMachine + } + return "" +} + +func (x *NativeIOSData) GetSystemVersion() string { + if x != nil { + return x.SystemVersion + } + return "" +} + +func (x *NativeIOSData) GetSimulatorModelIdentifier() string { + if x != nil { + return x.SimulatorModelIdentifier + } + return "" +} + +type NativeDesktopWindowsData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OsVersion int32 `protobuf:"varint,1,opt,name=os_version,json=osVersion,proto3" json:"os_version,omitempty"` + OsBuild int32 `protobuf:"varint,3,opt,name=os_build,json=osBuild,proto3" json:"os_build,omitempty"` + // https://docs.microsoft.com/en-us/dotnet/api/system.platformid?view=net-6.0 + PlatformId int32 `protobuf:"varint,4,opt,name=platform_id,json=platformId,proto3" json:"platform_id,omitempty"` + UnknownValue_5 int32 `protobuf:"varint,5,opt,name=unknown_value_5,json=unknownValue5,proto3" json:"unknown_value_5,omitempty"` + UnknownValue_6 int32 `protobuf:"varint,6,opt,name=unknown_value_6,json=unknownValue6,proto3" json:"unknown_value_6,omitempty"` + // https://docs.microsoft.com/en-us/dotnet/api/system.reflection.imagefilemachine?view=net-6.0 + ImageFileMachine int32 `protobuf:"varint,7,opt,name=image_file_machine,json=imageFileMachine,proto3" json:"image_file_machine,omitempty"` + // https://docs.microsoft.com/en-us/dotnet/api/system.reflection.portableexecutable.machine?view=net-6.0 + PeMachine int32 `protobuf:"varint,8,opt,name=pe_machine,json=peMachine,proto3" json:"pe_machine,omitempty"` + UnknownValue_10 bool `protobuf:"varint,10,opt,name=unknown_value_10,json=unknownValue10,proto3" json:"unknown_value_10,omitempty"` +} + +func (x *NativeDesktopWindowsData) Reset() { + *x = NativeDesktopWindowsData{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NativeDesktopWindowsData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NativeDesktopWindowsData) ProtoMessage() {} + +func (x *NativeDesktopWindowsData) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NativeDesktopWindowsData.ProtoReflect.Descriptor instead. +func (*NativeDesktopWindowsData) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{4} +} + +func (x *NativeDesktopWindowsData) GetOsVersion() int32 { + if x != nil { + return x.OsVersion + } + return 0 +} + +func (x *NativeDesktopWindowsData) GetOsBuild() int32 { + if x != nil { + return x.OsBuild + } + return 0 +} + +func (x *NativeDesktopWindowsData) GetPlatformId() int32 { + if x != nil { + return x.PlatformId + } + return 0 +} + +func (x *NativeDesktopWindowsData) GetUnknownValue_5() int32 { + if x != nil { + return x.UnknownValue_5 + } + return 0 +} + +func (x *NativeDesktopWindowsData) GetUnknownValue_6() int32 { + if x != nil { + return x.UnknownValue_6 + } + return 0 +} + +func (x *NativeDesktopWindowsData) GetImageFileMachine() int32 { + if x != nil { + return x.ImageFileMachine + } + return 0 +} + +func (x *NativeDesktopWindowsData) GetPeMachine() int32 { + if x != nil { + return x.PeMachine + } + return 0 +} + +func (x *NativeDesktopWindowsData) GetUnknownValue_10() bool { + if x != nil { + return x.UnknownValue_10 + } + return false +} + +type NativeDesktopLinuxData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SystemName string `protobuf:"bytes,1,opt,name=system_name,json=systemName,proto3" json:"system_name,omitempty"` // uname -s + SystemRelease string `protobuf:"bytes,2,opt,name=system_release,json=systemRelease,proto3" json:"system_release,omitempty"` // -r + SystemVersion string `protobuf:"bytes,3,opt,name=system_version,json=systemVersion,proto3" json:"system_version,omitempty"` // -v + Hardware string `protobuf:"bytes,4,opt,name=hardware,proto3" json:"hardware,omitempty"` // -i +} + +func (x *NativeDesktopLinuxData) Reset() { + *x = NativeDesktopLinuxData{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NativeDesktopLinuxData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NativeDesktopLinuxData) ProtoMessage() {} + +func (x *NativeDesktopLinuxData) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NativeDesktopLinuxData.ProtoReflect.Descriptor instead. +func (*NativeDesktopLinuxData) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{5} +} + +func (x *NativeDesktopLinuxData) GetSystemName() string { + if x != nil { + return x.SystemName + } + return "" +} + +func (x *NativeDesktopLinuxData) GetSystemRelease() string { + if x != nil { + return x.SystemRelease + } + return "" +} + +func (x *NativeDesktopLinuxData) GetSystemVersion() string { + if x != nil { + return x.SystemVersion + } + return "" +} + +func (x *NativeDesktopLinuxData) GetHardware() string { + if x != nil { + return x.Hardware + } + return "" +} + +type NativeDesktopMacOSData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SystemVersion string `protobuf:"bytes,1,opt,name=system_version,json=systemVersion,proto3" json:"system_version,omitempty"` + HwModel string `protobuf:"bytes,2,opt,name=hw_model,json=hwModel,proto3" json:"hw_model,omitempty"` + CompiledCpuType string `protobuf:"bytes,3,opt,name=compiled_cpu_type,json=compiledCpuType,proto3" json:"compiled_cpu_type,omitempty"` +} + +func (x *NativeDesktopMacOSData) Reset() { + *x = NativeDesktopMacOSData{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NativeDesktopMacOSData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NativeDesktopMacOSData) ProtoMessage() {} + +func (x *NativeDesktopMacOSData) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NativeDesktopMacOSData.ProtoReflect.Descriptor instead. +func (*NativeDesktopMacOSData) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{6} +} + +func (x *NativeDesktopMacOSData) GetSystemVersion() string { + if x != nil { + return x.SystemVersion + } + return "" +} + +func (x *NativeDesktopMacOSData) GetHwModel() string { + if x != nil { + return x.HwModel + } + return "" +} + +func (x *NativeDesktopMacOSData) GetCompiledCpuType() string { + if x != nil { + return x.CompiledCpuType + } + return "" +} + +type Screen struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Width int32 `protobuf:"varint,1,opt,name=width,proto3" json:"width,omitempty"` + Height int32 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` + Density int32 `protobuf:"varint,3,opt,name=density,proto3" json:"density,omitempty"` + UnknownValue_4 int32 `protobuf:"varint,4,opt,name=unknown_value_4,json=unknownValue4,proto3" json:"unknown_value_4,omitempty"` + UnknownValue_5 int32 `protobuf:"varint,5,opt,name=unknown_value_5,json=unknownValue5,proto3" json:"unknown_value_5,omitempty"` +} + +func (x *Screen) Reset() { + *x = Screen{} + if protoimpl.UnsafeEnabled { + mi := &file_connectivity_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Screen) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Screen) ProtoMessage() {} + +func (x *Screen) ProtoReflect() protoreflect.Message { + mi := &file_connectivity_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Screen.ProtoReflect.Descriptor instead. +func (*Screen) Descriptor() ([]byte, []int) { + return file_connectivity_proto_rawDescGZIP(), []int{7} +} + +func (x *Screen) GetWidth() int32 { + if x != nil { + return x.Width + } + return 0 +} + +func (x *Screen) GetHeight() int32 { + if x != nil { + return x.Height + } + return 0 +} + +func (x *Screen) GetDensity() int32 { + if x != nil { + return x.Density + } + return 0 +} + +func (x *Screen) GetUnknownValue_4() int32 { + if x != nil { + return x.UnknownValue_4 + } + return 0 +} + +func (x *Screen) GetUnknownValue_5() int32 { + if x != nil { + return x.UnknownValue_5 + } + return 0 +} + +var File_connectivity_proto protoreflect.FileDescriptor + +var file_connectivity_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1b, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x30, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x53, 0x64, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x67, 0x0a, 0x16, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x52, 0x14, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, + 0xc4, 0x03, 0x0a, 0x14, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4a, 0x0a, 0x07, 0x61, 0x6e, 0x64, 0x72, + 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x6e, + 0x64, 0x72, 0x6f, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x07, 0x61, 0x6e, 0x64, + 0x72, 0x6f, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x03, 0x69, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, + 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x4f, 0x53, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, + 0x03, 0x69, 0x6f, 0x73, 0x12, 0x5a, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, + 0x6d, 0x61, 0x63, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x4d, 0x61, 0x63, 0x4f, 0x53, 0x44, 0x61, 0x74, 0x61, + 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x4d, 0x61, 0x63, 0x6f, 0x73, + 0x12, 0x60, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x61, 0x74, 0x61, + 0x48, 0x00, 0x52, 0x0e, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x12, 0x5a, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x69, + 0x6e, 0x75, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, + 0x52, 0x0c, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x42, 0x06, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc8, 0x02, 0x0a, 0x11, 0x4e, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x11, + 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x5f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x52, 0x10, 0x73, 0x63, + 0x72, 0x65, 0x65, 0x6e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, + 0x0a, 0x0f, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x61, 0x70, + 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x19, + 0x0a, 0x08, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x32, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x32, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x38, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x38, 0x22, 0xfd, 0x01, 0x0a, 0x0d, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x4f, 0x53, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x69, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x49, 0x64, 0x69, 0x6f, 0x6d, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x69, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, + 0x0a, 0x68, 0x77, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x68, 0x77, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x22, 0xbc, 0x02, 0x0a, 0x18, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x73, 0x6b, + 0x74, 0x6f, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, + 0x0a, 0x0a, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, + 0x08, 0x6f, 0x73, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x6f, 0x73, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x35, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x35, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x75, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x36, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x65, 0x5f, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x65, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x31, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x31, 0x30, + 0x22, 0xa3, 0x01, 0x0a, 0x16, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x61, + 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x61, + 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x16, 0x4e, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x4d, 0x61, 0x63, 0x4f, 0x53, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x77, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x77, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, + 0x63, 0x70, 0x75, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x70, 0x75, 0x54, 0x79, 0x70, 0x65, 0x22, + 0xa0, 0x01, 0x0a, 0x06, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x64, 0x65, 0x6e, 0x73, 0x69, + 0x74, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x75, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x34, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x35, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x35, 0x42, 0x44, 0x0a, 0x1b, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x30, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, + 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, + 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_connectivity_proto_rawDescOnce sync.Once + file_connectivity_proto_rawDescData = file_connectivity_proto_rawDesc +) + +func file_connectivity_proto_rawDescGZIP() []byte { + file_connectivity_proto_rawDescOnce.Do(func() { + file_connectivity_proto_rawDescData = protoimpl.X.CompressGZIP(file_connectivity_proto_rawDescData) + }) + return file_connectivity_proto_rawDescData +} + +var file_connectivity_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_connectivity_proto_goTypes = []interface{}{ + (*ConnectivitySdkData)(nil), // 0: spotify.clienttoken.data.v0.ConnectivitySdkData + (*PlatformSpecificData)(nil), // 1: spotify.clienttoken.data.v0.PlatformSpecificData + (*NativeAndroidData)(nil), // 2: spotify.clienttoken.data.v0.NativeAndroidData + (*NativeIOSData)(nil), // 3: spotify.clienttoken.data.v0.NativeIOSData + (*NativeDesktopWindowsData)(nil), // 4: spotify.clienttoken.data.v0.NativeDesktopWindowsData + (*NativeDesktopLinuxData)(nil), // 5: spotify.clienttoken.data.v0.NativeDesktopLinuxData + (*NativeDesktopMacOSData)(nil), // 6: spotify.clienttoken.data.v0.NativeDesktopMacOSData + (*Screen)(nil), // 7: spotify.clienttoken.data.v0.Screen +} +var file_connectivity_proto_depIdxs = []int32{ + 1, // 0: spotify.clienttoken.data.v0.ConnectivitySdkData.platform_specific_data:type_name -> spotify.clienttoken.data.v0.PlatformSpecificData + 2, // 1: spotify.clienttoken.data.v0.PlatformSpecificData.android:type_name -> spotify.clienttoken.data.v0.NativeAndroidData + 3, // 2: spotify.clienttoken.data.v0.PlatformSpecificData.ios:type_name -> spotify.clienttoken.data.v0.NativeIOSData + 6, // 3: spotify.clienttoken.data.v0.PlatformSpecificData.desktop_macos:type_name -> spotify.clienttoken.data.v0.NativeDesktopMacOSData + 4, // 4: spotify.clienttoken.data.v0.PlatformSpecificData.desktop_windows:type_name -> spotify.clienttoken.data.v0.NativeDesktopWindowsData + 5, // 5: spotify.clienttoken.data.v0.PlatformSpecificData.desktop_linux:type_name -> spotify.clienttoken.data.v0.NativeDesktopLinuxData + 7, // 6: spotify.clienttoken.data.v0.NativeAndroidData.screen_dimensions:type_name -> spotify.clienttoken.data.v0.Screen + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_connectivity_proto_init() } +func file_connectivity_proto_init() { + if File_connectivity_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_connectivity_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConnectivitySdkData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connectivity_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlatformSpecificData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connectivity_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NativeAndroidData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connectivity_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NativeIOSData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connectivity_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NativeDesktopWindowsData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connectivity_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NativeDesktopLinuxData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connectivity_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NativeDesktopMacOSData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connectivity_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Screen); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_connectivity_proto_msgTypes[1].OneofWrappers = []interface{}{ + (*PlatformSpecificData_Android)(nil), + (*PlatformSpecificData_Ios)(nil), + (*PlatformSpecificData_DesktopMacos)(nil), + (*PlatformSpecificData_DesktopWindows)(nil), + (*PlatformSpecificData_DesktopLinux)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_connectivity_proto_rawDesc, + NumEnums: 0, + NumMessages: 8, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_connectivity_proto_goTypes, + DependencyIndexes: file_connectivity_proto_depIdxs, + MessageInfos: file_connectivity_proto_msgTypes, + }.Build() + File_connectivity_proto = out.File + file_connectivity_proto_rawDesc = nil + file_connectivity_proto_goTypes = nil + file_connectivity_proto_depIdxs = nil +} diff --git a/lib/spot/proto/connectivity.proto b/lib/spot/proto/connectivity.proto new file mode 100644 index 0000000..03463ae --- /dev/null +++ b/lib/spot/proto/connectivity.proto @@ -0,0 +1,79 @@ +syntax = "proto3"; + +package spotify.clienttoken.data.v0; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.clienttoken.data.v0"; + +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message ConnectivitySdkData { + PlatformSpecificData platform_specific_data = 1; + string device_id = 2; +} + +message PlatformSpecificData { + oneof data { + NativeAndroidData android = 1; + NativeIOSData ios = 2; + NativeDesktopMacOSData desktop_macos = 3; + NativeDesktopWindowsData desktop_windows = 4; + NativeDesktopLinuxData desktop_linux = 5; + } +} + +message NativeAndroidData { + Screen screen_dimensions = 1; + string android_version = 2; + int32 api_version = 3; + string device_name = 4; + string model_str = 5; + string vendor = 6; + string vendor_2 = 7; + int32 unknown_value_8 = 8; +} + +message NativeIOSData { + // https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom + int32 user_interface_idiom = 1; + bool target_iphone_simulator = 2; + string hw_machine = 3; + string system_version = 4; + string simulator_model_identifier = 5; +} + +message NativeDesktopWindowsData { + int32 os_version = 1; + int32 os_build = 3; + // https://docs.microsoft.com/en-us/dotnet/api/system.platformid?view=net-6.0 + int32 platform_id = 4; + int32 unknown_value_5 = 5; + int32 unknown_value_6 = 6; + // https://docs.microsoft.com/en-us/dotnet/api/system.reflection.imagefilemachine?view=net-6.0 + int32 image_file_machine = 7; + // https://docs.microsoft.com/en-us/dotnet/api/system.reflection.portableexecutable.machine?view=net-6.0 + int32 pe_machine = 8; + bool unknown_value_10 = 10; +} + +message NativeDesktopLinuxData { + string system_name = 1; // uname -s + string system_release = 2; // -r + string system_version = 3; // -v + string hardware = 4; // -i +} + +message NativeDesktopMacOSData { + string system_version = 1; + string hw_model = 2; + string compiled_cpu_type = 3; +} + +message Screen { + int32 width = 1; + int32 height = 2; + int32 density = 3; + int32 unknown_value_4 = 4; + int32 unknown_value_5 = 5; +} diff --git a/lib/spot/proto/contains_request.proto b/lib/spot/proto/contains_request.proto new file mode 100644 index 0000000..cf59c5f --- /dev/null +++ b/lib/spot/proto/contains_request.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message ContainsRequest { + repeated string items = 1; +} + +message ContainsResponse { + repeated bool found = 1; +} diff --git a/lib/spot/proto/content_access_token_cosmos.proto b/lib/spot/proto/content_access_token_cosmos.proto new file mode 100644 index 0000000..2c98125 --- /dev/null +++ b/lib/spot/proto/content_access_token_cosmos.proto @@ -0,0 +1,36 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.contentaccesstoken.proto; + +import "google/protobuf/timestamp.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.contentaccesstoken.proto"; + +message ContentAccessTokenResponse { + Error error = 1; + ContentAccessToken content_access_token = 2; +} + +message ContentAccessToken { + string token = 1; + google.protobuf.Timestamp expires_at = 2; + google.protobuf.Timestamp refresh_at = 3; + repeated string domains = 4; +} + +message ContentAccessRefreshToken { + string token = 1; +} + +message IsEnabledResponse { + bool is_enabled = 1; +} + +message Error { + int32 error_code = 1; + string error_description = 2; +} diff --git a/lib/spot/proto/context.proto b/lib/spot/proto/context.proto new file mode 100644 index 0000000..eb02241 --- /dev/null +++ b/lib/spot/proto/context.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context_page.proto"; +import "restrictions.proto"; + +option optimize_for = CODE_SIZE; + +message Context { + optional string uri = 1; + optional string url = 2; + map metadata = 3; + optional Restrictions restrictions = 4; + repeated ContextPage pages = 5; + optional bool loading = 6; +} diff --git a/lib/spot/proto/context_application_desktop.proto b/lib/spot/proto/context_application_desktop.proto new file mode 100644 index 0000000..04f443b --- /dev/null +++ b/lib/spot/proto/context_application_desktop.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ApplicationDesktop { + string version_string = 1; + int64 version_code = 2; +} diff --git a/lib/spot/proto/context_client_id.proto b/lib/spot/proto/context_client_id.proto new file mode 100644 index 0000000..bab3b6b --- /dev/null +++ b/lib/spot/proto/context_client_id.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message ClientId { + bytes value = 1; +} diff --git a/lib/spot/proto/context_device_desktop.proto b/lib/spot/proto/context_device_desktop.proto new file mode 100644 index 0000000..a6b3837 --- /dev/null +++ b/lib/spot/proto/context_device_desktop.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message DeviceDesktop { + string platform_type = 1; + string device_manufacturer = 2; + string device_model = 3; + string device_id = 4; + string os_version = 5; +} diff --git a/lib/spot/proto/context_index.proto b/lib/spot/proto/context_index.proto new file mode 100644 index 0000000..c7049ea --- /dev/null +++ b/lib/spot/proto/context_index.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message ContextIndex { + optional uint32 page = 1; + optional uint32 track = 2; +} diff --git a/lib/spot/proto/context_installation_id.proto b/lib/spot/proto/context_installation_id.proto new file mode 100644 index 0000000..08fe258 --- /dev/null +++ b/lib/spot/proto/context_installation_id.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message InstallationId { + bytes value = 1; +} diff --git a/lib/spot/proto/context_monotonic_clock.proto b/lib/spot/proto/context_monotonic_clock.proto new file mode 100644 index 0000000..3ec525f --- /dev/null +++ b/lib/spot/proto/context_monotonic_clock.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message MonotonicClock { + int64 id = 1; + int64 value = 2; +} diff --git a/lib/spot/proto/context_node.proto b/lib/spot/proto/context_node.proto new file mode 100644 index 0000000..82dd9d6 --- /dev/null +++ b/lib/spot/proto/context_node.proto @@ -0,0 +1,24 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context_processor.proto"; +import "play_origin.proto"; +import "prepare_play_options.proto"; +import "track_instance.proto"; +import "track_instantiator.proto"; + +option optimize_for = CODE_SIZE; + +message ContextNode { + optional TrackInstance current_track = 2; + optional TrackInstantiator instantiate = 3; + optional PreparePlayOptions prepare_options = 4; + optional PlayOrigin play_origin = 5; + optional ContextProcessor context_processor = 6; + optional string session_id = 7; + optional sint32 iteration = 8; + optional bool pending_pause = 9; +} diff --git a/lib/spot/proto/context_page.proto b/lib/spot/proto/context_page.proto new file mode 100644 index 0000000..b6e8ecd --- /dev/null +++ b/lib/spot/proto/context_page.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context_track.proto"; + +option optimize_for = CODE_SIZE; + +message ContextPage { + optional string page_url = 1; + optional string next_page_url = 2; + map metadata = 3; + repeated ContextTrack tracks = 4; + optional bool loading = 5; +} diff --git a/lib/spot/proto/context_player_options.proto b/lib/spot/proto/context_player_options.proto new file mode 100644 index 0000000..57e069b --- /dev/null +++ b/lib/spot/proto/context_player_options.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message ContextPlayerOptions { + optional bool shuffling_context = 1; + optional bool repeating_context = 2; + optional bool repeating_track = 3; +} + +message ContextPlayerOptionOverrides { + optional bool shuffling_context = 1; + optional bool repeating_context = 2; + optional bool repeating_track = 3; +} diff --git a/lib/spot/proto/context_processor.proto b/lib/spot/proto/context_processor.proto new file mode 100644 index 0000000..2d931b0 --- /dev/null +++ b/lib/spot/proto/context_processor.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context.proto"; +import "context_view.proto"; +import "skip_to_track.proto"; + +option optimize_for = CODE_SIZE; + +message ContextProcessor { + optional Context context = 1; + optional context_view.proto.ContextView context_view = 2; + optional SkipToTrack pending_skip_to = 3; + optional string shuffle_seed = 4; + optional int32 index = 5; +} diff --git a/lib/spot/proto/context_sdk.proto b/lib/spot/proto/context_sdk.proto new file mode 100644 index 0000000..419f7aa --- /dev/null +++ b/lib/spot/proto/context_sdk.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message Sdk { + string version_name = 1; + string type = 2; +} diff --git a/lib/spot/proto/context_time.proto b/lib/spot/proto/context_time.proto new file mode 100644 index 0000000..93749b4 --- /dev/null +++ b/lib/spot/proto/context_time.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message Time { + int64 value = 1; +} diff --git a/lib/spot/proto/context_track.proto b/lib/spot/proto/context_track.proto new file mode 100644 index 0000000..e9d06f2 --- /dev/null +++ b/lib/spot/proto/context_track.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message ContextTrack { + optional string uri = 1; + optional string uid = 2; + optional bytes gid = 3; + map metadata = 4; +} diff --git a/lib/spot/proto/context_view.proto b/lib/spot/proto/context_view.proto new file mode 100644 index 0000000..0b78991 --- /dev/null +++ b/lib/spot/proto/context_view.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.context_view.proto; + +import "context_track.proto"; +import "context_view_cyclic_list.proto"; + +option optimize_for = CODE_SIZE; + +message ContextView { + map patch_map = 1; + optional uint32 iteration_size = 2; + optional cyclic_list.proto.CyclicEntryKeyList cyclic_list = 3; + + reserved 4; +} diff --git a/lib/spot/proto/context_view_cyclic_list.proto b/lib/spot/proto/context_view_cyclic_list.proto new file mode 100644 index 0000000..76cde3e --- /dev/null +++ b/lib/spot/proto/context_view_cyclic_list.proto @@ -0,0 +1,26 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.context_view.cyclic_list.proto; + +import "context_view_entry_key.proto"; + +option optimize_for = CODE_SIZE; + +message Instance { + optional context_view.proto.EntryKey item = 1; + optional int32 iteration = 2; +} + +message Patch { + optional int32 start = 1; + optional int32 end = 2; + repeated Instance instances = 3; +} + +message CyclicEntryKeyList { + optional context_view.proto.EntryKey delimiter = 1; + repeated context_view.proto.EntryKey items = 2; + optional Patch patch = 3; +} diff --git a/lib/spot/proto/context_view_entry.proto b/lib/spot/proto/context_view_entry.proto new file mode 100644 index 0000000..8451f48 --- /dev/null +++ b/lib/spot/proto/context_view_entry.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.context_view.proto; + +import "context_index.proto"; +import "context_track.proto"; + +option optimize_for = CODE_SIZE; + +message Entry { + optional Type type = 1; + enum Type { + TRACK = 0; + DELIMITER = 1; + PAGE_PLACEHOLDER = 2; + CONTEXT_PLACEHOLDER = 3; + } + + optional player.proto.ContextTrack track = 2; + optional player.proto.ContextIndex index = 3; + optional int32 page_index = 4; + optional int32 absolute_index = 5; +} diff --git a/lib/spot/proto/context_view_entry_key.proto b/lib/spot/proto/context_view_entry_key.proto new file mode 100644 index 0000000..6c8a019 --- /dev/null +++ b/lib/spot/proto/context_view_entry_key.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.context_view.proto; + +import "context_view_entry.proto"; + +option optimize_for = CODE_SIZE; + +message EntryKey { + optional Entry.Type type = 1; + optional string data = 2; +} diff --git a/lib/spot/proto/cosmos_changes_request.proto b/lib/spot/proto/cosmos_changes_request.proto new file mode 100644 index 0000000..2e4b704 --- /dev/null +++ b/lib/spot/proto/cosmos_changes_request.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.changes_request.proto; + +option objc_class_prefix = "SPTCollectionCosmosChanges"; +option optimize_for = CODE_SIZE; + +message Response { + +} diff --git a/lib/spot/proto/cosmos_decorate_request.proto b/lib/spot/proto/cosmos_decorate_request.proto new file mode 100644 index 0000000..9e58602 --- /dev/null +++ b/lib/spot/proto/cosmos_decorate_request.proto @@ -0,0 +1,71 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.decorate_request.proto; + +import "collection/album_collection_state.proto"; +import "collection/artist_collection_state.proto"; +import "collection/episode_collection_state.proto"; +import "collection/show_collection_state.proto"; +import "collection/track_collection_state.proto"; +import "played_state/episode_played_state.proto"; +import "played_state/show_played_state.proto"; +import "played_state/track_played_state.proto"; +import "sync/album_sync_state.proto"; +import "sync/artist_sync_state.proto"; +import "sync/episode_sync_state.proto"; +import "sync/track_sync_state.proto"; +import "metadata/album_metadata.proto"; +import "metadata/artist_metadata.proto"; +import "metadata/episode_metadata.proto"; +import "metadata/show_metadata.proto"; +import "metadata/track_metadata.proto"; + +option objc_class_prefix = "SPTCollectionCosmosDecorate"; +option optimize_for = CODE_SIZE; + +message Album { + optional cosmos_util.proto.AlbumMetadata album_metadata = 1; + optional cosmos_util.proto.AlbumCollectionState album_collection_state = 2; + optional cosmos_util.proto.AlbumSyncState album_offline_state = 3; + optional string link = 4; +} + +message Artist { + optional cosmos_util.proto.ArtistMetadata artist_metadata = 1; + optional cosmos_util.proto.ArtistCollectionState artist_collection_state = 2; + optional cosmos_util.proto.ArtistSyncState artist_offline_state = 3; + optional string link = 4; +} + +message Episode { + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 1; + optional cosmos_util.proto.EpisodeCollectionState episode_collection_state = 2; + optional cosmos_util.proto.EpisodeSyncState episode_offline_state = 3; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 4; + optional string link = 5; +} + +message Show { + optional cosmos_util.proto.ShowMetadata show_metadata = 1; + optional cosmos_util.proto.ShowCollectionState show_collection_state = 2; + optional cosmos_util.proto.ShowPlayState show_play_state = 3; + optional string link = 4; +} + +message Track { + optional cosmos_util.proto.TrackMetadata track_metadata = 1; + optional cosmos_util.proto.TrackSyncState track_offline_state = 2; + optional cosmos_util.proto.TrackPlayState track_play_state = 3; + optional cosmos_util.proto.TrackCollectionState track_collection_state = 4; + optional string link = 5; +} + +message Response { + repeated Show show = 1; + repeated Episode episode = 2; + repeated Album album = 3; + repeated Artist artist = 4; + repeated Track track = 5; +} diff --git a/lib/spot/proto/cosmos_get_album_list_request.proto b/lib/spot/proto/cosmos_get_album_list_request.proto new file mode 100644 index 0000000..448dcd4 --- /dev/null +++ b/lib/spot/proto/cosmos_get_album_list_request.proto @@ -0,0 +1,38 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.album_list_request.proto; + +import "collection/album_collection_state.proto"; +import "sync/album_sync_state.proto"; +import "metadata/album_metadata.proto"; + +option objc_class_prefix = "SPTCollectionCosmosAlbumList"; +option optimize_for = CODE_SIZE; + +message Item { + optional string header_field = 1; + optional uint32 index = 2; + optional uint32 add_time = 3; + optional cosmos_util.proto.AlbumMetadata album_metadata = 4; + optional cosmos_util.proto.AlbumCollectionState album_collection_state = 5; + optional cosmos_util.proto.AlbumSyncState album_offline_state = 6; + optional string group_label = 7; +} + +message GroupHeader { + optional string header_field = 1; + optional uint32 index = 2; + optional uint32 length = 3; +} + +message Response { + repeated Item item = 1; + optional uint32 unfiltered_length = 2; + optional uint32 unranged_length = 3; + optional bool loading_contents = 4; + optional string offline = 5; + optional uint32 sync_progress = 6; + repeated GroupHeader group_index = 7; +} diff --git a/lib/spot/proto/cosmos_get_artist_list_request.proto b/lib/spot/proto/cosmos_get_artist_list_request.proto new file mode 100644 index 0000000..1dfeedb --- /dev/null +++ b/lib/spot/proto/cosmos_get_artist_list_request.proto @@ -0,0 +1,38 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.artist_list_request.proto; + +import "collection/artist_collection_state.proto"; +import "sync/artist_sync_state.proto"; +import "metadata/artist_metadata.proto"; + +option objc_class_prefix = "SPTCollectionCosmosArtistList"; +option optimize_for = CODE_SIZE; + +message Item { + optional string header_field = 1; + optional uint32 index = 2; + optional uint32 add_time = 3; + optional cosmos_util.proto.ArtistMetadata artist_metadata = 4; + optional cosmos_util.proto.ArtistCollectionState artist_collection_state = 5; + optional cosmos_util.proto.ArtistSyncState artist_offline_state = 6; + optional string group_label = 7; +} + +message GroupHeader { + optional string header_field = 1; + optional uint32 index = 2; + optional uint32 length = 3; +} + +message Response { + repeated Item item = 1; + optional uint32 unfiltered_length = 2; + optional uint32 unranged_length = 3; + optional bool loading_contents = 4; + optional string offline = 5; + optional uint32 sync_progress = 6; + repeated GroupHeader group_index = 7; +} diff --git a/lib/spot/proto/cosmos_get_episode_list_request.proto b/lib/spot/proto/cosmos_get_episode_list_request.proto new file mode 100644 index 0000000..437a621 --- /dev/null +++ b/lib/spot/proto/cosmos_get_episode_list_request.proto @@ -0,0 +1,28 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.episode_list_request.proto; + +import "collection/episode_collection_state.proto"; +import "played_state/episode_played_state.proto"; +import "sync/episode_sync_state.proto"; +import "metadata/episode_metadata.proto"; + +option objc_class_prefix = "SPTCollectionCosmosEpisodeList"; +option optimize_for = CODE_SIZE; + +message Item { + optional string header = 1; + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 2; + optional cosmos_util.proto.EpisodeCollectionState episode_collection_state = 3; + optional cosmos_util.proto.EpisodeSyncState episode_offline_state = 4; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 5; +} + +message Response { + repeated Item item = 1; + optional uint32 unfiltered_length = 2; + optional uint32 unranged_length = 3; + optional bool loading_contents = 4; +} diff --git a/lib/spot/proto/cosmos_get_show_list_request.proto b/lib/spot/proto/cosmos_get_show_list_request.proto new file mode 100644 index 0000000..e2b8a57 --- /dev/null +++ b/lib/spot/proto/cosmos_get_show_list_request.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.show_list_request.proto; + +import "collection/show_collection_state.proto"; +import "played_state/show_played_state.proto"; +import "metadata/show_metadata.proto"; + +option objc_class_prefix = "SPTCollectionCosmosShowList"; +option optimize_for = CODE_SIZE; + +message Item { + optional string header_field = 1; + optional cosmos_util.proto.ShowMetadata show_metadata = 2; + optional cosmos_util.proto.ShowCollectionState show_collection_state = 3; + optional cosmos_util.proto.ShowPlayState show_play_state = 4; + optional uint32 headerless_index = 5; + optional uint32 add_time = 6; + optional bool has_new_episodes = 7; + optional uint64 latest_published_episode_date = 8; +} + +message Response { + repeated Item item = 1; + optional uint32 num_offlined_episodes = 2; + optional uint32 unfiltered_length = 3; + optional uint32 unranged_length = 4; + optional bool loading_contents = 5; +} diff --git a/lib/spot/proto/cosmos_get_tags_info_request.proto b/lib/spot/proto/cosmos_get_tags_info_request.proto new file mode 100644 index 0000000..5480c7b --- /dev/null +++ b/lib/spot/proto/cosmos_get_tags_info_request.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_cosmos.tags_info_request.proto; + +option objc_class_prefix = "SPTCollectionCosmosTagsInfo"; +option optimize_for = CODE_SIZE; + +message Response { + bool is_synced = 1; +} diff --git a/lib/spot/proto/cosmos_get_track_list_metadata_request.proto b/lib/spot/proto/cosmos_get_track_list_metadata_request.proto new file mode 100644 index 0000000..a458624 --- /dev/null +++ b/lib/spot/proto/cosmos_get_track_list_metadata_request.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.proto; + +option objc_class_prefix = "SPTCollectionCosmos"; +option optimize_for = CODE_SIZE; + +message TrackListMetadata { + optional uint32 unfiltered_length = 1; + optional uint32 length = 2; + optional string offline = 3; + optional uint32 sync_progress = 4; +} diff --git a/lib/spot/proto/cosmos_get_track_list_request.proto b/lib/spot/proto/cosmos_get_track_list_request.proto new file mode 100644 index 0000000..95c8341 --- /dev/null +++ b/lib/spot/proto/cosmos_get_track_list_request.proto @@ -0,0 +1,40 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.track_list_request.proto; + +import "collection/track_collection_state.proto"; +import "played_state/track_played_state.proto"; +import "sync/track_sync_state.proto"; +import "metadata/track_metadata.proto"; + +option objc_class_prefix = "SPTCollectionCosmosTrackList"; +option optimize_for = CODE_SIZE; + +message Item { + optional string header_field = 1; + optional uint32 index = 2; + optional uint32 add_time = 3; + optional cosmos_util.proto.TrackMetadata track_metadata = 4; + optional cosmos_util.proto.TrackSyncState track_offline_state = 5; + optional cosmos_util.proto.TrackPlayState track_play_state = 6; + optional cosmos_util.proto.TrackCollectionState track_collection_state = 7; + optional string group_label = 8; +} + +message GroupHeader { + optional string header_field = 1; + optional uint32 index = 2; + optional uint32 length = 3; +} + +message Response { + repeated Item item = 1; + optional uint32 unfiltered_length = 2; + optional uint32 unranged_length = 3; + optional bool loading_contents = 4; + optional string offline = 5; + optional uint32 sync_progress = 6; + repeated GroupHeader group_index = 7; +} diff --git a/lib/spot/proto/cosmos_get_unplayed_episodes_request.proto b/lib/spot/proto/cosmos_get_unplayed_episodes_request.proto new file mode 100644 index 0000000..09339c7 --- /dev/null +++ b/lib/spot/proto/cosmos_get_unplayed_episodes_request.proto @@ -0,0 +1,28 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.collection_cosmos.unplayed_request.proto; + +import "collection/episode_collection_state.proto"; +import "played_state/episode_played_state.proto"; +import "sync/episode_sync_state.proto"; +import "metadata/episode_metadata.proto"; + +option objc_class_prefix = "SPTCollectionCosmosUnplayedEpisodes"; +option optimize_for = CODE_SIZE; + +message Item { + optional string header = 1; + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 2; + optional cosmos_util.proto.EpisodeCollectionState episode_collection_state = 3; + optional cosmos_util.proto.EpisodeSyncState episode_offline_state = 4; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 5; +} + +message Response { + repeated Item item = 1; + optional uint32 unfiltered_length = 2; + optional uint32 unranged_length = 3; + optional bool loading_contents = 4; +} diff --git a/lib/spot/proto/cuepoints.proto b/lib/spot/proto/cuepoints.proto new file mode 100644 index 0000000..16bfd6a --- /dev/null +++ b/lib/spot/proto/cuepoints.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.automix.proto; + +option optimize_for = CODE_SIZE; + +message Cuepoint { + int64 position_ms = 1; + float tempo_bpm = 2; + Origin origin = 3; +} + +message Cuepoints { + Cuepoint fade_in_cuepoint = 1; + Cuepoint fade_out_cuepoint = 2; +} + +enum Origin { + HUMAN = 0; + ML = 1; +} diff --git a/lib/spot/proto/decorate_request.proto b/lib/spot/proto/decorate_request.proto new file mode 100644 index 0000000..ff1fa0e --- /dev/null +++ b/lib/spot/proto/decorate_request.proto @@ -0,0 +1,54 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.show_cosmos.decorate_request.proto; + +import "metadata/episode_metadata.proto"; +import "metadata/show_metadata.proto"; +import "played_state/episode_played_state.proto"; +import "show_access.proto"; +import "show_episode_state.proto"; +import "show_show_state.proto"; +import "podcast_segments.proto"; +import "podcast_virality.proto"; +import "podcastextensions.proto"; +import "podcast_poll.proto"; +import "podcast_qna.proto"; +import "podcast_ratings.proto"; +import "transcripts.proto"; +import "clips_cover.proto"; + +option objc_class_prefix = "SPTShowCosmosDecorate"; +option optimize_for = CODE_SIZE; + +message Show { + optional cosmos_util.proto.ShowMetadata show_metadata = 1; + optional show_cosmos.proto.ShowCollectionState show_collection_state = 2; + optional show_cosmos.proto.ShowPlayState show_play_state = 3; + optional string link = 4; + optional podcast_paywalls.ShowAccess access_info = 5; + optional ratings.PodcastRating podcast_rating = 6; +} + +message Episode { + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 1; + optional show_cosmos.proto.EpisodeCollectionState episode_collection_state = 2; + optional show_cosmos.proto.EpisodeOfflineState episode_offline_state = 3; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 4; + optional string link = 5; + optional podcast_segments.PodcastSegments segments = 6; + optional podcast.extensions.PodcastHtmlDescription html_description = 7; + optional corex.transcripts.metadata.EpisodeTranscript transcripts = 9; + optional podcastvirality.v1.PodcastVirality virality = 10; + optional polls.PodcastPoll podcast_poll = 11; + optional qanda.PodcastQna podcast_qna = 12; + optional clips.ClipsCover clips = 13; + + reserved 8; +} + +message Response { + repeated Show show = 1; + repeated Episode episode = 2; +} diff --git a/lib/spot/proto/devices.pb.go b/lib/spot/proto/devices.pb.go new file mode 100644 index 0000000..3d28b62 --- /dev/null +++ b/lib/spot/proto/devices.pb.go @@ -0,0 +1,286 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: devices.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type DeviceType int32 + +const ( + DeviceType_UNKNOWN DeviceType = 0 + DeviceType_COMPUTER DeviceType = 1 + DeviceType_TABLET DeviceType = 2 + DeviceType_SMARTPHONE DeviceType = 3 + DeviceType_SPEAKER DeviceType = 4 + DeviceType_TV DeviceType = 5 + DeviceType_AVR DeviceType = 6 + DeviceType_STB DeviceType = 7 + DeviceType_AUDIO_DONGLE DeviceType = 8 + DeviceType_GAME_CONSOLE DeviceType = 9 + DeviceType_CAST_VIDEO DeviceType = 10 + DeviceType_CAST_AUDIO DeviceType = 11 + DeviceType_AUTOMOBILE DeviceType = 12 + DeviceType_SMARTWATCH DeviceType = 13 + DeviceType_CHROMEBOOK DeviceType = 14 + DeviceType_UNKNOWN_SPOTIFY DeviceType = 100 + DeviceType_CAR_THING DeviceType = 101 + DeviceType_OBSERVER DeviceType = 102 + DeviceType_HOME_THING DeviceType = 103 +) + +// Enum value maps for DeviceType. +var ( + DeviceType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "COMPUTER", + 2: "TABLET", + 3: "SMARTPHONE", + 4: "SPEAKER", + 5: "TV", + 6: "AVR", + 7: "STB", + 8: "AUDIO_DONGLE", + 9: "GAME_CONSOLE", + 10: "CAST_VIDEO", + 11: "CAST_AUDIO", + 12: "AUTOMOBILE", + 13: "SMARTWATCH", + 14: "CHROMEBOOK", + 100: "UNKNOWN_SPOTIFY", + 101: "CAR_THING", + 102: "OBSERVER", + 103: "HOME_THING", + } + DeviceType_value = map[string]int32{ + "UNKNOWN": 0, + "COMPUTER": 1, + "TABLET": 2, + "SMARTPHONE": 3, + "SPEAKER": 4, + "TV": 5, + "AVR": 6, + "STB": 7, + "AUDIO_DONGLE": 8, + "GAME_CONSOLE": 9, + "CAST_VIDEO": 10, + "CAST_AUDIO": 11, + "AUTOMOBILE": 12, + "SMARTWATCH": 13, + "CHROMEBOOK": 14, + "UNKNOWN_SPOTIFY": 100, + "CAR_THING": 101, + "OBSERVER": 102, + "HOME_THING": 103, + } +) + +func (x DeviceType) Enum() *DeviceType { + p := new(DeviceType) + *p = x + return p +} + +func (x DeviceType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeviceType) Descriptor() protoreflect.EnumDescriptor { + return file_devices_proto_enumTypes[0].Descriptor() +} + +func (DeviceType) Type() protoreflect.EnumType { + return &file_devices_proto_enumTypes[0] +} + +func (x DeviceType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DeviceType.Descriptor instead. +func (DeviceType) EnumDescriptor() ([]byte, []int) { + return file_devices_proto_rawDescGZIP(), []int{0} +} + +type DeviceAlias struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + IsGroup bool `protobuf:"varint,3,opt,name=is_group,json=isGroup,proto3" json:"is_group,omitempty"` +} + +func (x *DeviceAlias) Reset() { + *x = DeviceAlias{} + if protoimpl.UnsafeEnabled { + mi := &file_devices_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeviceAlias) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeviceAlias) ProtoMessage() {} + +func (x *DeviceAlias) ProtoReflect() protoreflect.Message { + mi := &file_devices_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeviceAlias.ProtoReflect.Descriptor instead. +func (*DeviceAlias) Descriptor() ([]byte, []int) { + return file_devices_proto_rawDescGZIP(), []int{0} +} + +func (x *DeviceAlias) GetId() uint32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *DeviceAlias) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *DeviceAlias) GetIsGroup() bool { + if x != nil { + return x.IsGroup + } + return false +} + +var File_devices_proto protoreflect.FileDescriptor + +var file_devices_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x1c, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x5b, 0x0a, + 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x69, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2a, 0xa0, 0x02, 0x0a, 0x0a, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, + 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x54, 0x10, 0x02, + 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x4d, 0x41, 0x52, 0x54, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0x03, + 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x50, 0x45, 0x41, 0x4b, 0x45, 0x52, 0x10, 0x04, 0x12, 0x06, 0x0a, + 0x02, 0x54, 0x56, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x56, 0x52, 0x10, 0x06, 0x12, 0x07, + 0x0a, 0x03, 0x53, 0x54, 0x42, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x55, 0x44, 0x49, 0x4f, + 0x5f, 0x44, 0x4f, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x41, 0x4d, + 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x45, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x43, + 0x41, 0x53, 0x54, 0x5f, 0x56, 0x49, 0x44, 0x45, 0x4f, 0x10, 0x0a, 0x12, 0x0e, 0x0a, 0x0a, 0x43, + 0x41, 0x53, 0x54, 0x5f, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x41, + 0x55, 0x54, 0x4f, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0e, 0x0a, 0x0a, 0x53, + 0x4d, 0x41, 0x52, 0x54, 0x57, 0x41, 0x54, 0x43, 0x48, 0x10, 0x0d, 0x12, 0x0e, 0x0a, 0x0a, 0x43, + 0x48, 0x52, 0x4f, 0x4d, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x10, 0x0e, 0x12, 0x13, 0x0a, 0x0f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x10, 0x64, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x52, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x65, 0x12, + 0x0c, 0x0a, 0x08, 0x4f, 0x42, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x66, 0x12, 0x0e, 0x0a, + 0x0a, 0x48, 0x4f, 0x4d, 0x45, 0x5f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x67, 0x42, 0x3d, 0x0a, + 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, + 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, + 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_devices_proto_rawDescOnce sync.Once + file_devices_proto_rawDescData = file_devices_proto_rawDesc +) + +func file_devices_proto_rawDescGZIP() []byte { + file_devices_proto_rawDescOnce.Do(func() { + file_devices_proto_rawDescData = protoimpl.X.CompressGZIP(file_devices_proto_rawDescData) + }) + return file_devices_proto_rawDescData +} + +var file_devices_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_devices_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_devices_proto_goTypes = []interface{}{ + (DeviceType)(0), // 0: spotify.connectstate.devices.DeviceType + (*DeviceAlias)(nil), // 1: spotify.connectstate.devices.DeviceAlias +} +var file_devices_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_devices_proto_init() } +func file_devices_proto_init() { + if File_devices_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_devices_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceAlias); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_devices_proto_rawDesc, + NumEnums: 1, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_devices_proto_goTypes, + DependencyIndexes: file_devices_proto_depIdxs, + EnumInfos: file_devices_proto_enumTypes, + MessageInfos: file_devices_proto_msgTypes, + }.Build() + File_devices_proto = out.File + file_devices_proto_rawDesc = nil + file_devices_proto_goTypes = nil + file_devices_proto_depIdxs = nil +} diff --git a/lib/spot/proto/devices.proto b/lib/spot/proto/devices.proto new file mode 100644 index 0000000..c327594 --- /dev/null +++ b/lib/spot/proto/devices.proto @@ -0,0 +1,36 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.connectstate.devices; + +option java_package = "com.spotify.common.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message DeviceAlias { + uint32 id = 1; + string display_name = 2; + bool is_group = 3; +} + +enum DeviceType { + UNKNOWN = 0; + COMPUTER = 1; + TABLET = 2; + SMARTPHONE = 3; + SPEAKER = 4; + TV = 5; + AVR = 6; + STB = 7; + AUDIO_DONGLE = 8; + GAME_CONSOLE = 9; + CAST_VIDEO = 10; + CAST_AUDIO = 11; + AUTOMOBILE = 12; + SMARTWATCH = 13; + CHROMEBOOK = 14; + UNKNOWN_SPOTIFY = 100; + CAR_THING = 101; + OBSERVER = 102; + HOME_THING = 103; +} diff --git a/lib/spot/proto/display_segments.proto b/lib/spot/proto/display_segments.proto new file mode 100644 index 0000000..eb3e02b --- /dev/null +++ b/lib/spot/proto/display_segments.proto @@ -0,0 +1,40 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast_segments.display; + +import "podcast_segments.proto"; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "DisplaySegmentsProto"; +option java_package = "com.spotify.podcastsegments.display.proto"; + +message DisplaySegments { + repeated DisplaySegment display_segments = 1; + bool can_upsell = 2; + string album_mosaic_uri = 3; + repeated string artists = 4; + int32 duration_ms = 5; +} + +message DisplaySegment { + string uri = 1; + int32 absolute_start_ms = 2; + int32 absolute_stop_ms = 3; + + Source source = 4; + enum Source { + PLAYBACK = 0; + EMBEDDED = 1; + } + + SegmentType type = 5; + string title = 6; + string subtitle = 7; + string image_url = 8; + string action_url = 9; + bool is_abridged = 10; +} diff --git a/lib/spot/proto/display_segments_extension.proto b/lib/spot/proto/display_segments_extension.proto new file mode 100644 index 0000000..0471444 --- /dev/null +++ b/lib/spot/proto/display_segments_extension.proto @@ -0,0 +1,54 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.displaysegments.v1; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "DisplaySegmentsExtensionProto"; +option java_package = "com.spotify.displaysegments.v1.proto"; + +message DisplaySegmentsExtension { + string episode_uri = 1; + repeated DisplaySegment segments = 2; + int32 duration_ms = 3; + + oneof decoration { + MusicAndTalkDecoration music_and_talk_decoration = 4; + } +} + +message DisplaySegment { + string uri = 1; + SegmentType type = 2; + int32 duration_ms = 3; + int32 seek_start_ms = 4; + int32 seek_stop_ms = 5; + + oneof _title { + string title = 6; + } + + oneof _subtitle { + string subtitle = 7; + } + + oneof _image_url { + string image_url = 8; + } + + oneof _is_preview { + bool is_preview = 9; + } +} + +message MusicAndTalkDecoration { + bool can_upsell = 1; +} + +enum SegmentType { + SEGMENT_TYPE_UNSPECIFIED = 0; + SEGMENT_TYPE_TALK = 1; + SEGMENT_TYPE_MUSIC = 2; +} diff --git a/lib/spot/proto/entity_extension_data.pb.go b/lib/spot/proto/entity_extension_data.pb.go new file mode 100644 index 0000000..fe7f59d --- /dev/null +++ b/lib/spot/proto/entity_extension_data.pb.go @@ -0,0 +1,480 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: entity_extension_data.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type EntityExtensionDataHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatusCode int32 `protobuf:"varint,1,opt,name=status_code,json=statusCode,proto3" json:"status_code,omitempty"` + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` + Locale string `protobuf:"bytes,3,opt,name=locale,proto3" json:"locale,omitempty"` + CacheTtlInSeconds int64 `protobuf:"varint,4,opt,name=cache_ttl_in_seconds,json=cacheTtlInSeconds,proto3" json:"cache_ttl_in_seconds,omitempty"` + OfflineTtlInSeconds int64 `protobuf:"varint,5,opt,name=offline_ttl_in_seconds,json=offlineTtlInSeconds,proto3" json:"offline_ttl_in_seconds,omitempty"` +} + +func (x *EntityExtensionDataHeader) Reset() { + *x = EntityExtensionDataHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_entity_extension_data_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EntityExtensionDataHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityExtensionDataHeader) ProtoMessage() {} + +func (x *EntityExtensionDataHeader) ProtoReflect() protoreflect.Message { + mi := &file_entity_extension_data_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityExtensionDataHeader.ProtoReflect.Descriptor instead. +func (*EntityExtensionDataHeader) Descriptor() ([]byte, []int) { + return file_entity_extension_data_proto_rawDescGZIP(), []int{0} +} + +func (x *EntityExtensionDataHeader) GetStatusCode() int32 { + if x != nil { + return x.StatusCode + } + return 0 +} + +func (x *EntityExtensionDataHeader) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *EntityExtensionDataHeader) GetLocale() string { + if x != nil { + return x.Locale + } + return "" +} + +func (x *EntityExtensionDataHeader) GetCacheTtlInSeconds() int64 { + if x != nil { + return x.CacheTtlInSeconds + } + return 0 +} + +func (x *EntityExtensionDataHeader) GetOfflineTtlInSeconds() int64 { + if x != nil { + return x.OfflineTtlInSeconds + } + return 0 +} + +type EntityExtensionData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *EntityExtensionDataHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + EntityUri string `protobuf:"bytes,2,opt,name=entity_uri,json=entityUri,proto3" json:"entity_uri,omitempty"` + ExtensionData *anypb.Any `protobuf:"bytes,3,opt,name=extension_data,json=extensionData,proto3" json:"extension_data,omitempty"` +} + +func (x *EntityExtensionData) Reset() { + *x = EntityExtensionData{} + if protoimpl.UnsafeEnabled { + mi := &file_entity_extension_data_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EntityExtensionData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityExtensionData) ProtoMessage() {} + +func (x *EntityExtensionData) ProtoReflect() protoreflect.Message { + mi := &file_entity_extension_data_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityExtensionData.ProtoReflect.Descriptor instead. +func (*EntityExtensionData) Descriptor() ([]byte, []int) { + return file_entity_extension_data_proto_rawDescGZIP(), []int{1} +} + +func (x *EntityExtensionData) GetHeader() *EntityExtensionDataHeader { + if x != nil { + return x.Header + } + return nil +} + +func (x *EntityExtensionData) GetEntityUri() string { + if x != nil { + return x.EntityUri + } + return "" +} + +func (x *EntityExtensionData) GetExtensionData() *anypb.Any { + if x != nil { + return x.ExtensionData + } + return nil +} + +type PlainListAssoc struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EntityUri []string `protobuf:"bytes,1,rep,name=entity_uri,json=entityUri,proto3" json:"entity_uri,omitempty"` +} + +func (x *PlainListAssoc) Reset() { + *x = PlainListAssoc{} + if protoimpl.UnsafeEnabled { + mi := &file_entity_extension_data_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlainListAssoc) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlainListAssoc) ProtoMessage() {} + +func (x *PlainListAssoc) ProtoReflect() protoreflect.Message { + mi := &file_entity_extension_data_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlainListAssoc.ProtoReflect.Descriptor instead. +func (*PlainListAssoc) Descriptor() ([]byte, []int) { + return file_entity_extension_data_proto_rawDescGZIP(), []int{2} +} + +func (x *PlainListAssoc) GetEntityUri() []string { + if x != nil { + return x.EntityUri + } + return nil +} + +type AssocHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AssocHeader) Reset() { + *x = AssocHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_entity_extension_data_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AssocHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssocHeader) ProtoMessage() {} + +func (x *AssocHeader) ProtoReflect() protoreflect.Message { + mi := &file_entity_extension_data_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AssocHeader.ProtoReflect.Descriptor instead. +func (*AssocHeader) Descriptor() ([]byte, []int) { + return file_entity_extension_data_proto_rawDescGZIP(), []int{3} +} + +type Assoc struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *AssocHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + PlainList *PlainListAssoc `protobuf:"bytes,2,opt,name=plain_list,json=plainList,proto3" json:"plain_list,omitempty"` +} + +func (x *Assoc) Reset() { + *x = Assoc{} + if protoimpl.UnsafeEnabled { + mi := &file_entity_extension_data_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Assoc) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Assoc) ProtoMessage() {} + +func (x *Assoc) ProtoReflect() protoreflect.Message { + mi := &file_entity_extension_data_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Assoc.ProtoReflect.Descriptor instead. +func (*Assoc) Descriptor() ([]byte, []int) { + return file_entity_extension_data_proto_rawDescGZIP(), []int{4} +} + +func (x *Assoc) GetHeader() *AssocHeader { + if x != nil { + return x.Header + } + return nil +} + +func (x *Assoc) GetPlainList() *PlainListAssoc { + if x != nil { + return x.PlainList + } + return nil +} + +var File_entity_extension_data_proto protoreflect.FileDescriptor + +var file_entity_extension_data_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xce, 0x01, 0x0a, 0x19, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2f, 0x0a, + 0x14, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x54, 0x74, 0x6c, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x33, + 0x0a, 0x16, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x69, 0x6e, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, + 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x74, 0x6c, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x22, 0xbe, 0x01, 0x0a, 0x13, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x55, 0x72, 0x69, 0x12, 0x3b, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x22, 0x2f, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x55, 0x72, 0x69, 0x22, 0x0d, 0x0a, 0x0b, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x8f, 0x01, 0x0a, 0x05, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x12, 0x3d, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x47, 0x0a, + 0x0a, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6c, 0x61, + 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x52, 0x09, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x4e, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, + 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, + 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_entity_extension_data_proto_rawDescOnce sync.Once + file_entity_extension_data_proto_rawDescData = file_entity_extension_data_proto_rawDesc +) + +func file_entity_extension_data_proto_rawDescGZIP() []byte { + file_entity_extension_data_proto_rawDescOnce.Do(func() { + file_entity_extension_data_proto_rawDescData = protoimpl.X.CompressGZIP(file_entity_extension_data_proto_rawDescData) + }) + return file_entity_extension_data_proto_rawDescData +} + +var file_entity_extension_data_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_entity_extension_data_proto_goTypes = []interface{}{ + (*EntityExtensionDataHeader)(nil), // 0: spotify.extendedmetadata.EntityExtensionDataHeader + (*EntityExtensionData)(nil), // 1: spotify.extendedmetadata.EntityExtensionData + (*PlainListAssoc)(nil), // 2: spotify.extendedmetadata.PlainListAssoc + (*AssocHeader)(nil), // 3: spotify.extendedmetadata.AssocHeader + (*Assoc)(nil), // 4: spotify.extendedmetadata.Assoc + (*anypb.Any)(nil), // 5: google.protobuf.Any +} +var file_entity_extension_data_proto_depIdxs = []int32{ + 0, // 0: spotify.extendedmetadata.EntityExtensionData.header:type_name -> spotify.extendedmetadata.EntityExtensionDataHeader + 5, // 1: spotify.extendedmetadata.EntityExtensionData.extension_data:type_name -> google.protobuf.Any + 3, // 2: spotify.extendedmetadata.Assoc.header:type_name -> spotify.extendedmetadata.AssocHeader + 2, // 3: spotify.extendedmetadata.Assoc.plain_list:type_name -> spotify.extendedmetadata.PlainListAssoc + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_entity_extension_data_proto_init() } +func file_entity_extension_data_proto_init() { + if File_entity_extension_data_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_entity_extension_data_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EntityExtensionDataHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_entity_extension_data_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EntityExtensionData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_entity_extension_data_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlainListAssoc); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_entity_extension_data_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AssocHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_entity_extension_data_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Assoc); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_entity_extension_data_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_entity_extension_data_proto_goTypes, + DependencyIndexes: file_entity_extension_data_proto_depIdxs, + MessageInfos: file_entity_extension_data_proto_msgTypes, + }.Build() + File_entity_extension_data_proto = out.File + file_entity_extension_data_proto_rawDesc = nil + file_entity_extension_data_proto_goTypes = nil + file_entity_extension_data_proto_depIdxs = nil +} diff --git a/lib/spot/proto/entity_extension_data.proto b/lib/spot/proto/entity_extension_data.proto new file mode 100644 index 0000000..36730aa --- /dev/null +++ b/lib/spot/proto/entity_extension_data.proto @@ -0,0 +1,40 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.extendedmetadata; + +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.extendedmetadata.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message EntityExtensionDataHeader { + int32 status_code = 1; + string etag = 2; + string locale = 3; + int64 cache_ttl_in_seconds = 4; + int64 offline_ttl_in_seconds = 5; +} + +message EntityExtensionData { + EntityExtensionDataHeader header = 1; + string entity_uri = 2; + google.protobuf.Any extension_data = 3; +} + +message PlainListAssoc { + repeated string entity_uri = 1; +} + +message AssocHeader { + +} + +message Assoc { + AssocHeader header = 1; + PlainListAssoc plain_list = 2; +} diff --git a/lib/spot/proto/es_add_to_queue_request.proto b/lib/spot/proto/es_add_to_queue_request.proto new file mode 100644 index 0000000..3499773 --- /dev/null +++ b/lib/spot/proto/es_add_to_queue_request.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_context_track.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message AddToQueueRequest { + ContextTrack track = 1; + CommandOptions options = 2; + LoggingParams logging_params = 3; +} diff --git a/lib/spot/proto/es_command_options.proto b/lib/spot/proto/es_command_options.proto new file mode 100644 index 0000000..0a37e80 --- /dev/null +++ b/lib/spot/proto/es_command_options.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message CommandOptions { + bool override_restrictions = 1; + bool only_for_local_device = 2; + bool system_initiated = 3; + bytes only_for_playback_id = 4; +} diff --git a/lib/spot/proto/es_context.proto b/lib/spot/proto/es_context.proto new file mode 100644 index 0000000..05962fa --- /dev/null +++ b/lib/spot/proto/es_context.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_context_page.proto"; +import "es_restrictions.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message Context { + repeated ContextPage pages = 1; + map metadata = 2; + string uri = 3; + string url = 4; + bool is_loaded = 5; + Restrictions restrictions = 6; +} diff --git a/lib/spot/proto/es_context_page.proto b/lib/spot/proto/es_context_page.proto new file mode 100644 index 0000000..f4cc693 --- /dev/null +++ b/lib/spot/proto/es_context_page.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_context_track.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ContextPage { + repeated ContextTrack tracks = 1; + map metadata = 2; + string page_url = 3; + string next_page_url = 4; + bool is_loaded = 5; +} diff --git a/lib/spot/proto/es_context_player_error.proto b/lib/spot/proto/es_context_player_error.proto new file mode 100644 index 0000000..f332fe8 --- /dev/null +++ b/lib/spot/proto/es_context_player_error.proto @@ -0,0 +1,55 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ContextPlayerError { + ErrorCode code = 1; + enum ErrorCode { + SUCCESS = 0; + PLAYBACK_STUCK = 1; + PLAYBACK_ERROR = 2; + LICENSE_CHANGE = 3; + PLAY_RESTRICTED = 4; + STOP_RESTRICTED = 5; + UPDATE_RESTRICTED = 6; + PAUSE_RESTRICTED = 7; + RESUME_RESTRICTED = 8; + SKIP_TO_PREV_RESTRICTED = 9; + SKIP_TO_NEXT_RESTRICTED = 10; + SKIP_TO_NON_EXISTENT_TRACK = 11; + SEEK_TO_RESTRICTED = 12; + TOGGLE_REPEAT_CONTEXT_RESTRICTED = 13; + TOGGLE_REPEAT_TRACK_RESTRICTED = 14; + SET_OPTIONS_RESTRICTED = 15; + TOGGLE_SHUFFLE_RESTRICTED = 16; + SET_QUEUE_RESTRICTED = 17; + INTERRUPT_PLAYBACK_RESTRICTED = 18; + ONE_TRACK_UNPLAYABLE = 19; + ONE_TRACK_UNPLAYABLE_AUTO_STOPPED = 20; + ALL_TRACKS_UNPLAYABLE_AUTO_STOPPED = 21; + SKIP_TO_NON_EXISTENT_TRACK_AUTO_STOPPED = 22; + QUEUE_REVISION_MISMATCH = 23; + VIDEO_PLAYBACK_ERROR = 24; + VIDEO_GEOGRAPHICALLY_RESTRICTED = 25; + VIDEO_UNSUPPORTED_PLATFORM_VERSION = 26; + VIDEO_UNSUPPORTED_CLIENT_VERSION = 27; + VIDEO_UNSUPPORTED_KEY_SYSTEM = 28; + VIDEO_MANIFEST_DELETED = 29; + VIDEO_COUNTRY_RESTRICTED = 30; + VIDEO_UNAVAILABLE = 31; + VIDEO_CATALOGUE_RESTRICTED = 32; + INVALID = 33; + TIMEOUT = 34; + PLAYBACK_REPORTING_ERROR = 35; + UNKNOWN = 36; + } + + string message = 2; + map data = 3; +} diff --git a/lib/spot/proto/es_context_player_options.proto b/lib/spot/proto/es_context_player_options.proto new file mode 100644 index 0000000..372b53c --- /dev/null +++ b/lib/spot/proto/es_context_player_options.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_optional.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ContextPlayerOptions { + bool shuffling_context = 1; + bool repeating_context = 2; + bool repeating_track = 3; +} + +message ContextPlayerOptionOverrides { + OptionalBoolean shuffling_context = 1; + OptionalBoolean repeating_context = 2; + OptionalBoolean repeating_track = 3; +} diff --git a/lib/spot/proto/es_context_player_state.proto b/lib/spot/proto/es_context_player_state.proto new file mode 100644 index 0000000..f162657 --- /dev/null +++ b/lib/spot/proto/es_context_player_state.proto @@ -0,0 +1,82 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_restrictions.proto"; +import "es_play_origin.proto"; +import "es_optional.proto"; +import "es_provided_track.proto"; +import "es_context_player_options.proto"; +import "es_prepare_play_options.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ContextIndex { + uint64 page = 1; + uint64 track = 2; +} + +message PlaybackQuality { + BitrateLevel bitrate_level = 1; + enum BitrateLevel { + UNKNOWN = 0; + LOW = 1; + NORMAL = 2; + HIGH = 3; + VERY_HIGH = 4; + HIFI = 5; + } + + BitrateStrategy strategy = 2; + enum BitrateStrategy { + UNKNOWN_STRATEGY = 0; + BEST_MATCHING = 1; + BACKEND_ADVISED = 2; + OFFLINED_FILE = 3; + CACHED_FILE = 4; + LOCAL_FILE = 5; + } + + BitrateLevel target_bitrate_level = 3; + bool target_bitrate_available = 4; + + HiFiStatus hifi_status = 5; + enum HiFiStatus { + NONE = 0; + OFF = 1; + ON = 2; + } +} + +message ContextPlayerState { + uint64 timestamp = 1; + string context_uri = 2; + string context_url = 3; + Restrictions context_restrictions = 4; + PlayOrigin play_origin = 5; + ContextIndex index = 6; + ProvidedTrack track = 7; + bytes playback_id = 8; + PlaybackQuality playback_quality = 9; + OptionalDouble playback_speed = 10; + OptionalInt64 position_as_of_timestamp = 11; + OptionalInt64 duration = 12; + bool is_playing = 13; + bool is_paused = 14; + bool is_buffering = 15; + bool is_system_initiated = 16; + ContextPlayerOptions options = 17; + Restrictions restrictions = 18; + repeated string suppressions = 19; + repeated ProvidedTrack prev_tracks = 20; + repeated ProvidedTrack next_tracks = 21; + map context_metadata = 22; + map page_metadata = 23; + string session_id = 24; + uint64 queue_revision = 25; + PreparePlayOptions.AudioStream audio_stream = 26; +} diff --git a/lib/spot/proto/es_context_track.proto b/lib/spot/proto/es_context_track.proto new file mode 100644 index 0000000..cdcbd7c --- /dev/null +++ b/lib/spot/proto/es_context_track.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ContextTrack { + string uri = 1; + string uid = 2; + map metadata = 3; +} diff --git a/lib/spot/proto/es_delete_session.proto b/lib/spot/proto/es_delete_session.proto new file mode 100644 index 0000000..e45893c --- /dev/null +++ b/lib/spot/proto/es_delete_session.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message DeleteSessionRequest { + string session_id = 1; +} + +message DeleteSessionResponse { + +} diff --git a/lib/spot/proto/es_get_error_request.proto b/lib/spot/proto/es_get_error_request.proto new file mode 100644 index 0000000..3119bea --- /dev/null +++ b/lib/spot/proto/es_get_error_request.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message GetErrorRequest { + +} diff --git a/lib/spot/proto/es_get_play_history.proto b/lib/spot/proto/es_get_play_history.proto new file mode 100644 index 0000000..08bb053 --- /dev/null +++ b/lib/spot/proto/es_get_play_history.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_context_track.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message GetPlayHistoryRequest { + +} + +message GetPlayHistoryResponse { + repeated ContextTrack tracks = 1; +} diff --git a/lib/spot/proto/es_get_position_state.proto b/lib/spot/proto/es_get_position_state.proto new file mode 100644 index 0000000..6147f0c --- /dev/null +++ b/lib/spot/proto/es_get_position_state.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message GetPositionStateRequest { + +} + +message GetPositionStateResponse { + Error error = 1; + enum Error { + OK = 0; + NOT_FOUND = 1; + } + + uint64 timestamp = 2; + uint64 position = 3; + double playback_speed = 4; +} diff --git a/lib/spot/proto/es_get_queue_request.proto b/lib/spot/proto/es_get_queue_request.proto new file mode 100644 index 0000000..68b6830 --- /dev/null +++ b/lib/spot/proto/es_get_queue_request.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message GetQueueRequest { + +} diff --git a/lib/spot/proto/es_get_state_request.proto b/lib/spot/proto/es_get_state_request.proto new file mode 100644 index 0000000..d8cd533 --- /dev/null +++ b/lib/spot/proto/es_get_state_request.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_optional.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message GetStateRequest { + OptionalInt64 prev_tracks_cap = 1; + OptionalInt64 next_tracks_cap = 2; +} diff --git a/lib/spot/proto/es_ident.proto b/lib/spot/proto/es_ident.proto new file mode 100644 index 0000000..6c52abc --- /dev/null +++ b/lib/spot/proto/es_ident.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.connectivity.pubsub.esperanto.proto; + +option java_package = "com.spotify.connectivity.pubsub.esperanto.proto"; + +message Ident { + string Ident = 1; +} diff --git a/lib/spot/proto/es_ident_filter.proto b/lib/spot/proto/es_ident_filter.proto new file mode 100644 index 0000000..19ccee4 --- /dev/null +++ b/lib/spot/proto/es_ident_filter.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.connectivity.pubsub.esperanto.proto; + +option java_package = "com.spotify.connectivity.pubsub.esperanto.proto"; + +message IdentFilter { + string Prefix = 1; +} diff --git a/lib/spot/proto/es_logging_params.proto b/lib/spot/proto/es_logging_params.proto new file mode 100644 index 0000000..c508cba --- /dev/null +++ b/lib/spot/proto/es_logging_params.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_optional.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message LoggingParams { + OptionalInt64 command_initiated_time = 1; + OptionalInt64 command_received_time = 2; + repeated string page_instance_ids = 3; + repeated string interaction_ids = 4; +} diff --git a/lib/spot/proto/es_optional.proto b/lib/spot/proto/es_optional.proto new file mode 100644 index 0000000..2ca0b01 --- /dev/null +++ b/lib/spot/proto/es_optional.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message OptionalInt64 { + int64 value = 1; +} + +message OptionalDouble { + double value = 1; +} + +message OptionalBoolean { + bool value = 1; +} diff --git a/lib/spot/proto/es_pause.proto b/lib/spot/proto/es_pause.proto new file mode 100644 index 0000000..56378fb --- /dev/null +++ b/lib/spot/proto/es_pause.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message PauseRequest { + CommandOptions options = 1; + LoggingParams logging_params = 2; +} diff --git a/lib/spot/proto/es_play.proto b/lib/spot/proto/es_play.proto new file mode 100644 index 0000000..34dca48 --- /dev/null +++ b/lib/spot/proto/es_play.proto @@ -0,0 +1,28 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; +import "es_play_options.proto"; +import "es_prepare_play.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message PlayRequest { + PreparePlayRequest prepare_play_request = 1; + PlayOptions play_options = 2; + CommandOptions options = 3; + LoggingParams logging_params = 4; +} + +message PlayPreparedRequest { + string session_id = 1; + PlayOptions play_options = 2; + CommandOptions options = 3; + LoggingParams logging_params = 4; +} diff --git a/lib/spot/proto/es_play_options.proto b/lib/spot/proto/es_play_options.proto new file mode 100644 index 0000000..f068921 --- /dev/null +++ b/lib/spot/proto/es_play_options.proto @@ -0,0 +1,32 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message PlayOptions { + Reason reason = 1; + enum Reason { + INTERACTIVE = 0; + REMOTE_TRANSFER = 1; + LICENSE_CHANGE = 2; + } + + Operation operation = 2; + enum Operation { + REPLACE = 0; + ENQUEUE = 1; + PUSH = 2; + } + + Trigger trigger = 3; + enum Trigger { + IMMEDIATELY = 0; + ADVANCED_PAST_TRACK = 1; + ADVANCED_PAST_CONTEXT = 2; + } +} diff --git a/lib/spot/proto/es_play_origin.proto b/lib/spot/proto/es_play_origin.proto new file mode 100644 index 0000000..62cff8b --- /dev/null +++ b/lib/spot/proto/es_play_origin.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message PlayOrigin { + string feature_identifier = 1; + string feature_version = 2; + string view_uri = 3; + string external_referrer = 4; + string referrer_identifier = 5; + string device_identifier = 6; + repeated string feature_classes = 7; +} diff --git a/lib/spot/proto/es_prefs.proto b/lib/spot/proto/es_prefs.proto new file mode 100644 index 0000000..f81916c --- /dev/null +++ b/lib/spot/proto/es_prefs.proto @@ -0,0 +1,53 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.prefs.esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.prefs.esperanto.proto"; + +service Prefs { + rpc Get(GetParams) returns (PrefValues); + rpc Sub(SubParams) returns (stream PrefValues); + rpc GetAll(GetAllParams) returns (PrefValues); + rpc SubAll(SubAllParams) returns (stream PrefValues); + rpc Set(SetParams) returns (PrefValues); + rpc Create(CreateParams) returns (PrefValues); +} + +message GetParams { + string key = 1; +} + +message SubParams { + string key = 1; +} + +message GetAllParams { + +} + +message SubAllParams { + +} + +message Value { + oneof value { + int64 number = 1; + bool bool = 2; + string string = 3; + } +} + +message SetParams { + map entries = 1; +} + +message CreateParams { + map entries = 1; +} + +message PrefValues { + map entries = 1; +} diff --git a/lib/spot/proto/es_prepare_play.proto b/lib/spot/proto/es_prepare_play.proto new file mode 100644 index 0000000..6662eb6 --- /dev/null +++ b/lib/spot/proto/es_prepare_play.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_context.proto"; +import "es_play_origin.proto"; +import "es_prepare_play_options.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message PreparePlayRequest { + Context context = 1; + PreparePlayOptions options = 2; + PlayOrigin play_origin = 3; +} diff --git a/lib/spot/proto/es_prepare_play_options.proto b/lib/spot/proto/es_prepare_play_options.proto new file mode 100644 index 0000000..b4a4449 --- /dev/null +++ b/lib/spot/proto/es_prepare_play_options.proto @@ -0,0 +1,40 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_context_player_options.proto"; +import "es_optional.proto"; +import "es_skip_to_track.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message PreparePlayOptions { + bytes playback_id = 1; + bool always_play_something = 2; + SkipToTrack skip_to = 3; + OptionalInt64 seek_to = 4; + bool initially_paused = 5; + bool system_initiated = 6; + ContextPlayerOptionOverrides player_options_override = 7; + repeated string suppressions = 8; + + PrefetchLevel prefetch_level = 9; + enum PrefetchLevel { + NONE = 0; + MEDIA = 1; + } + + AudioStream audio_stream = 10; + enum AudioStream { + DEFAULT = 0; + ALARM = 1; + } + + string session_id = 11; + string license = 12; + map configuration_override = 13; +} diff --git a/lib/spot/proto/es_provided_track.proto b/lib/spot/proto/es_provided_track.proto new file mode 100644 index 0000000..6dcffc0 --- /dev/null +++ b/lib/spot/proto/es_provided_track.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_context_track.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ProvidedTrack { + ContextTrack context_track = 1; + repeated string removed = 2; + repeated string blocked = 3; + string provider = 4; +} diff --git a/lib/spot/proto/es_pushed_message.proto b/lib/spot/proto/es_pushed_message.proto new file mode 100644 index 0000000..dd054f5 --- /dev/null +++ b/lib/spot/proto/es_pushed_message.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.connectivity.pubsub.esperanto.proto; + +import "es_ident.proto"; + +option java_package = "com.spotify.connectivity.pubsub.esperanto.proto"; + +message PushedMessage { + Ident Ident = 1; + repeated string Payloads = 2; + map Attributes = 3; +} diff --git a/lib/spot/proto/es_queue.proto b/lib/spot/proto/es_queue.proto new file mode 100644 index 0000000..625b184 --- /dev/null +++ b/lib/spot/proto/es_queue.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_provided_track.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message Queue { + uint64 queue_revision = 1; + ProvidedTrack track = 2; + repeated ProvidedTrack next_tracks = 3; + repeated ProvidedTrack prev_tracks = 4; +} diff --git a/lib/spot/proto/es_remote_config.proto b/lib/spot/proto/es_remote_config.proto new file mode 100644 index 0000000..fca7f0f --- /dev/null +++ b/lib/spot/proto/es_remote_config.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.remote_config.esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.remoteconfig.esperanto.proto"; + +service RemoteConfig { + rpc lookupBool(LookupRequest) returns (BoolResponse); +} + +message LookupRequest { + string component_id = 1; + string key = 2; +} + +message BoolResponse { + bool value = 1; +} diff --git a/lib/spot/proto/es_request_info.proto b/lib/spot/proto/es_request_info.proto new file mode 100644 index 0000000..95b5cb8 --- /dev/null +++ b/lib/spot/proto/es_request_info.proto @@ -0,0 +1,27 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.connectivity.netstat.esperanto.proto; + +option java_package = "com.spotify.connectivity.netstat.esperanto.proto"; + +message RepeatedRequestInfo { + repeated RequestInfo infos = 1; +} + +message RequestInfo { + string uri = 1; + string verb = 2; + string source_identifier = 3; + int32 downloaded = 4; + int32 uploaded = 5; + int32 payload_size = 6; + bool connection_reuse = 7; + int64 event_started = 8; + int64 event_connected = 9; + int64 event_request_sent = 10; + int64 event_first_byte_received = 11; + int64 event_last_byte_received = 12; + int64 event_ended = 13; +} diff --git a/lib/spot/proto/es_response_with_reasons.proto b/lib/spot/proto/es_response_with_reasons.proto new file mode 100644 index 0000000..6570a17 --- /dev/null +++ b/lib/spot/proto/es_response_with_reasons.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ResponseWithReasons { + Error error = 1; + enum Error { + OK = 0; + FORBIDDEN = 1; + NOT_FOUND = 2; + CONFLICT = 3; + } + + string reasons = 2; +} diff --git a/lib/spot/proto/es_restrictions.proto b/lib/spot/proto/es_restrictions.proto new file mode 100644 index 0000000..3a5c3a0 --- /dev/null +++ b/lib/spot/proto/es_restrictions.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message Restrictions { + repeated string disallow_pausing_reasons = 1; + repeated string disallow_resuming_reasons = 2; + repeated string disallow_seeking_reasons = 3; + repeated string disallow_peeking_prev_reasons = 4; + repeated string disallow_peeking_next_reasons = 5; + repeated string disallow_skipping_prev_reasons = 6; + repeated string disallow_skipping_next_reasons = 7; + repeated string disallow_toggling_repeat_context_reasons = 8; + repeated string disallow_toggling_repeat_track_reasons = 9; + repeated string disallow_toggling_shuffle_reasons = 10; + repeated string disallow_set_queue_reasons = 11; + repeated string disallow_interrupting_playback_reasons = 12; + repeated string disallow_transferring_playback_reasons = 13; + repeated string disallow_remote_control_reasons = 14; + repeated string disallow_inserting_into_next_tracks_reasons = 15; + repeated string disallow_inserting_into_context_tracks_reasons = 16; + repeated string disallow_reordering_in_next_tracks_reasons = 17; + repeated string disallow_reordering_in_context_tracks_reasons = 18; + repeated string disallow_removing_from_next_tracks_reasons = 19; + repeated string disallow_removing_from_context_tracks_reasons = 20; + repeated string disallow_updating_context_reasons = 21; +} diff --git a/lib/spot/proto/es_resume.proto b/lib/spot/proto/es_resume.proto new file mode 100644 index 0000000..1af5980 --- /dev/null +++ b/lib/spot/proto/es_resume.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message ResumeRequest { + CommandOptions options = 1; + LoggingParams logging_params = 2; +} diff --git a/lib/spot/proto/es_seek_to.proto b/lib/spot/proto/es_seek_to.proto new file mode 100644 index 0000000..59073cf --- /dev/null +++ b/lib/spot/proto/es_seek_to.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SeekToRequest { + CommandOptions options = 1; + LoggingParams logging_params = 2; + int64 position = 3; + + Relative relative = 4; + enum Relative { + BEGINNING = 0; + END = 1; + CURRENT = 2; + } +} diff --git a/lib/spot/proto/es_session_response.proto b/lib/spot/proto/es_session_response.proto new file mode 100644 index 0000000..692ae30 --- /dev/null +++ b/lib/spot/proto/es_session_response.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SessionResponse { + string session_id = 1; +} diff --git a/lib/spot/proto/es_set_options.proto b/lib/spot/proto/es_set_options.proto new file mode 100644 index 0000000..33faf5f --- /dev/null +++ b/lib/spot/proto/es_set_options.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; +import "es_optional.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SetOptionsRequest { + OptionalBoolean repeating_track = 1; + OptionalBoolean repeating_context = 2; + OptionalBoolean shuffling_context = 3; + CommandOptions options = 4; + LoggingParams logging_params = 5; +} diff --git a/lib/spot/proto/es_set_queue_request.proto b/lib/spot/proto/es_set_queue_request.proto new file mode 100644 index 0000000..8371523 --- /dev/null +++ b/lib/spot/proto/es_set_queue_request.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_provided_track.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SetQueueRequest { + repeated ProvidedTrack next_tracks = 1; + repeated ProvidedTrack prev_tracks = 2; + uint64 queue_revision = 3; + CommandOptions options = 4; + LoggingParams logging_params = 5; +} diff --git a/lib/spot/proto/es_set_repeating_context.proto b/lib/spot/proto/es_set_repeating_context.proto new file mode 100644 index 0000000..25667c8 --- /dev/null +++ b/lib/spot/proto/es_set_repeating_context.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SetRepeatingContextRequest { + bool repeating_context = 1; + CommandOptions options = 2; + LoggingParams logging_params = 3; +} diff --git a/lib/spot/proto/es_set_repeating_track.proto b/lib/spot/proto/es_set_repeating_track.proto new file mode 100644 index 0000000..01ae3b5 --- /dev/null +++ b/lib/spot/proto/es_set_repeating_track.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SetRepeatingTrackRequest { + bool repeating_track = 1; + CommandOptions options = 2; + LoggingParams logging_params = 3; +} diff --git a/lib/spot/proto/es_set_shuffling_context.proto b/lib/spot/proto/es_set_shuffling_context.proto new file mode 100644 index 0000000..6eb779e --- /dev/null +++ b/lib/spot/proto/es_set_shuffling_context.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SetShufflingContextRequest { + bool shuffling_context = 1; + CommandOptions options = 2; + LoggingParams logging_params = 3; +} diff --git a/lib/spot/proto/es_skip_next.proto b/lib/spot/proto/es_skip_next.proto new file mode 100644 index 0000000..d6b0dc8 --- /dev/null +++ b/lib/spot/proto/es_skip_next.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; +import "es_context_track.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SkipNextRequest { + CommandOptions options = 1; + LoggingParams logging_params = 2; + ContextTrack track = 3; +} diff --git a/lib/spot/proto/es_skip_prev.proto b/lib/spot/proto/es_skip_prev.proto new file mode 100644 index 0000000..2a6b9a7 --- /dev/null +++ b/lib/spot/proto/es_skip_prev.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; +import "es_context_track.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SkipPrevRequest { + CommandOptions options = 1; + bool allow_seeking = 2; + LoggingParams logging_params = 3; + ContextTrack track = 4; +} diff --git a/lib/spot/proto/es_skip_to_track.proto b/lib/spot/proto/es_skip_to_track.proto new file mode 100644 index 0000000..ecf0d03 --- /dev/null +++ b/lib/spot/proto/es_skip_to_track.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_optional.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message SkipToTrack { + string page_url = 1; + OptionalInt64 page_index = 2; + string track_uid = 3; + string track_uri = 4; + OptionalInt64 track_index = 5; +} diff --git a/lib/spot/proto/es_stop.proto b/lib/spot/proto/es_stop.proto new file mode 100644 index 0000000..068490e --- /dev/null +++ b/lib/spot/proto/es_stop.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_command_options.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message StopRequest { + CommandOptions options = 1; + + Reason reason = 2; + enum Reason { + INTERACTIVE = 0; + REMOTE_TRANSFER = 1; + SHUTDOWN = 2; + } + + LoggingParams logging_params = 3; +} diff --git a/lib/spot/proto/es_storage.proto b/lib/spot/proto/es_storage.proto new file mode 100644 index 0000000..c20b3be --- /dev/null +++ b/lib/spot/proto/es_storage.proto @@ -0,0 +1,88 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.storage.esperanto.proto; + +import "google/protobuf/empty.proto"; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.storage.esperanto.proto"; + +service Storage { + rpc GetCacheSizeLimit(GetCacheSizeLimitParams) returns (CacheSizeLimit); + rpc SetCacheSizeLimit(SetCacheSizeLimitParams) returns (google.protobuf.Empty); + rpc DeleteExpiredItems(DeleteExpiredItemsParams) returns (google.protobuf.Empty); + rpc DeleteUnlockedItems(DeleteUnlockedItemsParams) returns (google.protobuf.Empty); + rpc GetStats(GetStatsParams) returns (Stats); + rpc GetFileRanges(GetFileRangesParams) returns (FileRanges); +} + +message CacheSizeLimit { + int64 size = 1; +} + +message GetCacheSizeLimitParams { + +} + +message SetCacheSizeLimitParams { + CacheSizeLimit limit = 1; +} + +message DeleteExpiredItemsParams { + +} + +message DeleteUnlockedItemsParams { + +} + +message RealmStats { + Realm realm = 1; + int64 size = 2; + int64 num_entries = 3; + int64 num_complete_entries = 4; +} + +message Stats { + string cache_id = 1; + int64 creation_date_sec = 2; + int64 max_cache_size = 3; + int64 current_size = 4; + int64 current_locked_size = 5; + int64 free_space = 6; + int64 total_space = 7; + int64 current_numfiles = 8; + repeated RealmStats realm_stats = 9; +} + +message GetStatsParams { + +} + +message FileRanges { + bool byte_size_known = 1; + uint64 byte_size = 2; + + repeated Range ranges = 3; + message Range { + uint64 from_byte = 1; + uint64 to_byte = 2; + } +} + +message GetFileRangesParams { + Realm realm = 1; + string file_id = 2; +} + +enum Realm { + STREAM = 0; + COVER_ART = 1; + PLAYLIST = 4; + AUDIO_SHOW = 5; + HEAD_FILES = 7; + EXTERNAL_AUDIO_SHOW = 8; + KARAOKE_MASK = 9; +} diff --git a/lib/spot/proto/es_update.proto b/lib/spot/proto/es_update.proto new file mode 100644 index 0000000..90734b5 --- /dev/null +++ b/lib/spot/proto/es_update.proto @@ -0,0 +1,38 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.player.esperanto.proto; + +import "es_context.proto"; +import "es_context_page.proto"; +import "es_context_track.proto"; +import "es_logging_params.proto"; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.player.esperanto.proto"; + +message UpdateContextRequest { + string session_id = 1; + Context context = 2; + LoggingParams logging_params = 3; +} + +message UpdateContextPageRequest { + string session_id = 1; + ContextPage context_page = 2; + LoggingParams logging_params = 3; +} + +message UpdateContextTrackRequest { + string session_id = 1; + ContextTrack context_track = 2; + LoggingParams logging_params = 3; +} + +message UpdateViewUriRequest { + string session_id = 1; + string view_uri = 2; + LoggingParams logging_params = 3; +} diff --git a/lib/spot/proto/event_entity.proto b/lib/spot/proto/event_entity.proto new file mode 100644 index 0000000..06239d5 --- /dev/null +++ b/lib/spot/proto/event_entity.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message EventEntity { + uint32 file_format_version = 1; + string event_name = 2; + bytes sequence_id = 3; + uint64 sequence_number = 4; + bytes payload = 5; + string owner = 6; + bool authenticated = 7; + uint64 record_id = 8; +} diff --git a/lib/spot/proto/explicit_content_pubsub.proto b/lib/spot/proto/explicit_content_pubsub.proto new file mode 100644 index 0000000..1bb45f9 --- /dev/null +++ b/lib/spot/proto/explicit_content_pubsub.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.explicit_content.proto; + +option optimize_for = CODE_SIZE; + +message KeyValuePair { + required string key = 1; + required string value = 2; +} + +message UserAttributesUpdate { + repeated KeyValuePair pairs = 1; +} diff --git a/lib/spot/proto/extended_metadata.pb.go b/lib/spot/proto/extended_metadata.pb.go new file mode 100644 index 0000000..61d082b --- /dev/null +++ b/lib/spot/proto/extended_metadata.pb.go @@ -0,0 +1,801 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: extended_metadata.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExtensionType int32 + +const ( + ExtensionType_UNKNOWN ExtensionType = 0 + ExtensionType_GENERIC ExtensionType = 1 + ExtensionType_ASSOC ExtensionType = 2 +) + +// Enum value maps for ExtensionType. +var ( + ExtensionType_name = map[int32]string{ + 0: "UNKNOWN", + 1: "GENERIC", + 2: "ASSOC", + } + ExtensionType_value = map[string]int32{ + "UNKNOWN": 0, + "GENERIC": 1, + "ASSOC": 2, + } +) + +func (x ExtensionType) Enum() *ExtensionType { + p := new(ExtensionType) + *p = x + return p +} + +func (x ExtensionType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExtensionType) Descriptor() protoreflect.EnumDescriptor { + return file_extended_metadata_proto_enumTypes[0].Descriptor() +} + +func (ExtensionType) Type() protoreflect.EnumType { + return &file_extended_metadata_proto_enumTypes[0] +} + +func (x ExtensionType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ExtensionType.Descriptor instead. +func (ExtensionType) EnumDescriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{0} +} + +type ExtensionQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExtensionKind ExtensionKind `protobuf:"varint,1,opt,name=extension_kind,json=extensionKind,proto3,enum=spotify.extendedmetadata.ExtensionKind" json:"extension_kind,omitempty"` + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` +} + +func (x *ExtensionQuery) Reset() { + *x = ExtensionQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtensionQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtensionQuery) ProtoMessage() {} + +func (x *ExtensionQuery) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExtensionQuery.ProtoReflect.Descriptor instead. +func (*ExtensionQuery) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{0} +} + +func (x *ExtensionQuery) GetExtensionKind() ExtensionKind { + if x != nil { + return x.ExtensionKind + } + return ExtensionKind_UNKNOWN_EXTENSION +} + +func (x *ExtensionQuery) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +type EntityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EntityUri string `protobuf:"bytes,1,opt,name=entity_uri,json=entityUri,proto3" json:"entity_uri,omitempty"` + Query []*ExtensionQuery `protobuf:"bytes,2,rep,name=query,proto3" json:"query,omitempty"` +} + +func (x *EntityRequest) Reset() { + *x = EntityRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EntityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityRequest) ProtoMessage() {} + +func (x *EntityRequest) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityRequest.ProtoReflect.Descriptor instead. +func (*EntityRequest) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{1} +} + +func (x *EntityRequest) GetEntityUri() string { + if x != nil { + return x.EntityUri + } + return "" +} + +func (x *EntityRequest) GetQuery() []*ExtensionQuery { + if x != nil { + return x.Query + } + return nil +} + +type BatchedEntityRequestHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Country string `protobuf:"bytes,1,opt,name=country,proto3" json:"country,omitempty"` + Catalogue string `protobuf:"bytes,2,opt,name=catalogue,proto3" json:"catalogue,omitempty"` + TaskId []byte `protobuf:"bytes,3,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` +} + +func (x *BatchedEntityRequestHeader) Reset() { + *x = BatchedEntityRequestHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchedEntityRequestHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchedEntityRequestHeader) ProtoMessage() {} + +func (x *BatchedEntityRequestHeader) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchedEntityRequestHeader.ProtoReflect.Descriptor instead. +func (*BatchedEntityRequestHeader) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{2} +} + +func (x *BatchedEntityRequestHeader) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *BatchedEntityRequestHeader) GetCatalogue() string { + if x != nil { + return x.Catalogue + } + return "" +} + +func (x *BatchedEntityRequestHeader) GetTaskId() []byte { + if x != nil { + return x.TaskId + } + return nil +} + +type BatchedEntityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *BatchedEntityRequestHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + EntityRequest []*EntityRequest `protobuf:"bytes,2,rep,name=entity_request,json=entityRequest,proto3" json:"entity_request,omitempty"` +} + +func (x *BatchedEntityRequest) Reset() { + *x = BatchedEntityRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchedEntityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchedEntityRequest) ProtoMessage() {} + +func (x *BatchedEntityRequest) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchedEntityRequest.ProtoReflect.Descriptor instead. +func (*BatchedEntityRequest) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{3} +} + +func (x *BatchedEntityRequest) GetHeader() *BatchedEntityRequestHeader { + if x != nil { + return x.Header + } + return nil +} + +func (x *BatchedEntityRequest) GetEntityRequest() []*EntityRequest { + if x != nil { + return x.EntityRequest + } + return nil +} + +type EntityExtensionDataArrayHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProviderErrorStatus int32 `protobuf:"varint,1,opt,name=provider_error_status,json=providerErrorStatus,proto3" json:"provider_error_status,omitempty"` + CacheTtlInSeconds int64 `protobuf:"varint,2,opt,name=cache_ttl_in_seconds,json=cacheTtlInSeconds,proto3" json:"cache_ttl_in_seconds,omitempty"` + OfflineTtlInSeconds int64 `protobuf:"varint,3,opt,name=offline_ttl_in_seconds,json=offlineTtlInSeconds,proto3" json:"offline_ttl_in_seconds,omitempty"` + ExtensionType ExtensionType `protobuf:"varint,4,opt,name=extension_type,json=extensionType,proto3,enum=spotify.extendedmetadata.ExtensionType" json:"extension_type,omitempty"` +} + +func (x *EntityExtensionDataArrayHeader) Reset() { + *x = EntityExtensionDataArrayHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EntityExtensionDataArrayHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityExtensionDataArrayHeader) ProtoMessage() {} + +func (x *EntityExtensionDataArrayHeader) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityExtensionDataArrayHeader.ProtoReflect.Descriptor instead. +func (*EntityExtensionDataArrayHeader) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{4} +} + +func (x *EntityExtensionDataArrayHeader) GetProviderErrorStatus() int32 { + if x != nil { + return x.ProviderErrorStatus + } + return 0 +} + +func (x *EntityExtensionDataArrayHeader) GetCacheTtlInSeconds() int64 { + if x != nil { + return x.CacheTtlInSeconds + } + return 0 +} + +func (x *EntityExtensionDataArrayHeader) GetOfflineTtlInSeconds() int64 { + if x != nil { + return x.OfflineTtlInSeconds + } + return 0 +} + +func (x *EntityExtensionDataArrayHeader) GetExtensionType() ExtensionType { + if x != nil { + return x.ExtensionType + } + return ExtensionType_UNKNOWN +} + +type EntityExtensionDataArray struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *EntityExtensionDataArrayHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + ExtensionKind ExtensionKind `protobuf:"varint,2,opt,name=extension_kind,json=extensionKind,proto3,enum=spotify.extendedmetadata.ExtensionKind" json:"extension_kind,omitempty"` + ExtensionData []*EntityExtensionData `protobuf:"bytes,3,rep,name=extension_data,json=extensionData,proto3" json:"extension_data,omitempty"` +} + +func (x *EntityExtensionDataArray) Reset() { + *x = EntityExtensionDataArray{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EntityExtensionDataArray) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EntityExtensionDataArray) ProtoMessage() {} + +func (x *EntityExtensionDataArray) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EntityExtensionDataArray.ProtoReflect.Descriptor instead. +func (*EntityExtensionDataArray) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{5} +} + +func (x *EntityExtensionDataArray) GetHeader() *EntityExtensionDataArrayHeader { + if x != nil { + return x.Header + } + return nil +} + +func (x *EntityExtensionDataArray) GetExtensionKind() ExtensionKind { + if x != nil { + return x.ExtensionKind + } + return ExtensionKind_UNKNOWN_EXTENSION +} + +func (x *EntityExtensionDataArray) GetExtensionData() []*EntityExtensionData { + if x != nil { + return x.ExtensionData + } + return nil +} + +type BatchedExtensionResponseHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *BatchedExtensionResponseHeader) Reset() { + *x = BatchedExtensionResponseHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchedExtensionResponseHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchedExtensionResponseHeader) ProtoMessage() {} + +func (x *BatchedExtensionResponseHeader) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchedExtensionResponseHeader.ProtoReflect.Descriptor instead. +func (*BatchedExtensionResponseHeader) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{6} +} + +type BatchedExtensionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *BatchedExtensionResponseHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + ExtendedMetadata []*EntityExtensionDataArray `protobuf:"bytes,2,rep,name=extended_metadata,json=extendedMetadata,proto3" json:"extended_metadata,omitempty"` +} + +func (x *BatchedExtensionResponse) Reset() { + *x = BatchedExtensionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_extended_metadata_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchedExtensionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchedExtensionResponse) ProtoMessage() {} + +func (x *BatchedExtensionResponse) ProtoReflect() protoreflect.Message { + mi := &file_extended_metadata_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchedExtensionResponse.ProtoReflect.Descriptor instead. +func (*BatchedExtensionResponse) Descriptor() ([]byte, []int) { + return file_extended_metadata_proto_rawDescGZIP(), []int{7} +} + +func (x *BatchedExtensionResponse) GetHeader() *BatchedExtensionResponseHeader { + if x != nil { + return x.Header + } + return nil +} + +func (x *BatchedExtensionResponse) GetExtendedMetadata() []*EntityExtensionDataArray { + if x != nil { + return x.ExtendedMetadata + } + return nil +} + +var File_extended_metadata_proto protoreflect.FileDescriptor + +var file_extended_metadata_proto_rawDesc = []byte{ + 0x0a, 0x17, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x1a, 0x14, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, + 0x69, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x4e, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x6e, 0x0a, 0x0d, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x55, 0x72, 0x69, 0x12, 0x3e, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x6d, 0x0a, 0x1a, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, + 0x75, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0xb4, 0x01, 0x0a, 0x14, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x0d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x8a, 0x02, 0x0a, 0x1e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x74, + 0x6c, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6f, 0x66, + 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x74, 0x6c, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6f, 0x66, 0x66, 0x6c, + 0x69, 0x6e, 0x65, 0x54, 0x74, 0x6c, 0x49, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x4e, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, + 0x92, 0x02, 0x0a, 0x18, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x50, 0x0a, 0x06, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x4e, + 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x52, + 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x54, + 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x22, 0x20, 0x0a, 0x1e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xcd, 0x01, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x5f, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x41, + 0x72, 0x72, 0x61, 0x79, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2a, 0x34, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x10, + 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x10, 0x02, 0x42, 0x4e, 0x0a, 0x22, + 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, + 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, + 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_extended_metadata_proto_rawDescOnce sync.Once + file_extended_metadata_proto_rawDescData = file_extended_metadata_proto_rawDesc +) + +func file_extended_metadata_proto_rawDescGZIP() []byte { + file_extended_metadata_proto_rawDescOnce.Do(func() { + file_extended_metadata_proto_rawDescData = protoimpl.X.CompressGZIP(file_extended_metadata_proto_rawDescData) + }) + return file_extended_metadata_proto_rawDescData +} + +var file_extended_metadata_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_extended_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_extended_metadata_proto_goTypes = []interface{}{ + (ExtensionType)(0), // 0: spotify.extendedmetadata.ExtensionType + (*ExtensionQuery)(nil), // 1: spotify.extendedmetadata.ExtensionQuery + (*EntityRequest)(nil), // 2: spotify.extendedmetadata.EntityRequest + (*BatchedEntityRequestHeader)(nil), // 3: spotify.extendedmetadata.BatchedEntityRequestHeader + (*BatchedEntityRequest)(nil), // 4: spotify.extendedmetadata.BatchedEntityRequest + (*EntityExtensionDataArrayHeader)(nil), // 5: spotify.extendedmetadata.EntityExtensionDataArrayHeader + (*EntityExtensionDataArray)(nil), // 6: spotify.extendedmetadata.EntityExtensionDataArray + (*BatchedExtensionResponseHeader)(nil), // 7: spotify.extendedmetadata.BatchedExtensionResponseHeader + (*BatchedExtensionResponse)(nil), // 8: spotify.extendedmetadata.BatchedExtensionResponse + (ExtensionKind)(0), // 9: spotify.extendedmetadata.ExtensionKind + (*EntityExtensionData)(nil), // 10: spotify.extendedmetadata.EntityExtensionData +} +var file_extended_metadata_proto_depIdxs = []int32{ + 9, // 0: spotify.extendedmetadata.ExtensionQuery.extension_kind:type_name -> spotify.extendedmetadata.ExtensionKind + 1, // 1: spotify.extendedmetadata.EntityRequest.query:type_name -> spotify.extendedmetadata.ExtensionQuery + 3, // 2: spotify.extendedmetadata.BatchedEntityRequest.header:type_name -> spotify.extendedmetadata.BatchedEntityRequestHeader + 2, // 3: spotify.extendedmetadata.BatchedEntityRequest.entity_request:type_name -> spotify.extendedmetadata.EntityRequest + 0, // 4: spotify.extendedmetadata.EntityExtensionDataArrayHeader.extension_type:type_name -> spotify.extendedmetadata.ExtensionType + 5, // 5: spotify.extendedmetadata.EntityExtensionDataArray.header:type_name -> spotify.extendedmetadata.EntityExtensionDataArrayHeader + 9, // 6: spotify.extendedmetadata.EntityExtensionDataArray.extension_kind:type_name -> spotify.extendedmetadata.ExtensionKind + 10, // 7: spotify.extendedmetadata.EntityExtensionDataArray.extension_data:type_name -> spotify.extendedmetadata.EntityExtensionData + 7, // 8: spotify.extendedmetadata.BatchedExtensionResponse.header:type_name -> spotify.extendedmetadata.BatchedExtensionResponseHeader + 6, // 9: spotify.extendedmetadata.BatchedExtensionResponse.extended_metadata:type_name -> spotify.extendedmetadata.EntityExtensionDataArray + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_extended_metadata_proto_init() } +func file_extended_metadata_proto_init() { + if File_extended_metadata_proto != nil { + return + } + file_extension_kind_proto_init() + file_entity_extension_data_proto_init() + if !protoimpl.UnsafeEnabled { + file_extended_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExtensionQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extended_metadata_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EntityRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extended_metadata_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchedEntityRequestHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extended_metadata_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchedEntityRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extended_metadata_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EntityExtensionDataArrayHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extended_metadata_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EntityExtensionDataArray); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extended_metadata_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchedExtensionResponseHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_extended_metadata_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchedExtensionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_extended_metadata_proto_rawDesc, + NumEnums: 1, + NumMessages: 8, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_extended_metadata_proto_goTypes, + DependencyIndexes: file_extended_metadata_proto_depIdxs, + EnumInfos: file_extended_metadata_proto_enumTypes, + MessageInfos: file_extended_metadata_proto_msgTypes, + }.Build() + File_extended_metadata_proto = out.File + file_extended_metadata_proto_rawDesc = nil + file_extended_metadata_proto_goTypes = nil + file_extended_metadata_proto_depIdxs = nil +} diff --git a/lib/spot/proto/extended_metadata.proto b/lib/spot/proto/extended_metadata.proto new file mode 100644 index 0000000..208be21 --- /dev/null +++ b/lib/spot/proto/extended_metadata.proto @@ -0,0 +1,63 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.extendedmetadata; + +import "extension_kind.proto"; +import "entity_extension_data.proto"; + +option cc_enable_arenas = true; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.extendedmetadata.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message ExtensionQuery { + ExtensionKind extension_kind = 1; + string etag = 2; +} + +message EntityRequest { + string entity_uri = 1; + repeated ExtensionQuery query = 2; +} + +message BatchedEntityRequestHeader { + string country = 1; + string catalogue = 2; + bytes task_id = 3; +} + +message BatchedEntityRequest { + BatchedEntityRequestHeader header = 1; + repeated EntityRequest entity_request = 2; +} + +message EntityExtensionDataArrayHeader { + int32 provider_error_status = 1; + int64 cache_ttl_in_seconds = 2; + int64 offline_ttl_in_seconds = 3; + ExtensionType extension_type = 4; +} + +message EntityExtensionDataArray { + EntityExtensionDataArrayHeader header = 1; + ExtensionKind extension_kind = 2; + repeated EntityExtensionData extension_data = 3; +} + +message BatchedExtensionResponseHeader { + +} + +message BatchedExtensionResponse { + BatchedExtensionResponseHeader header = 1; + repeated EntityExtensionDataArray extended_metadata = 2; +} + +enum ExtensionType { + UNKNOWN = 0; + GENERIC = 1; + ASSOC = 2; +} diff --git a/lib/spot/proto/extension_descriptor_type.proto b/lib/spot/proto/extension_descriptor_type.proto new file mode 100644 index 0000000..2ca0571 --- /dev/null +++ b/lib/spot/proto/extension_descriptor_type.proto @@ -0,0 +1,30 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.descriptorextension; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.descriptorextension.proto"; + +message ExtensionDescriptor { + string text = 1; + float weight = 2; + repeated ExtensionDescriptorType types = 3; +} + +message ExtensionDescriptorData { + repeated ExtensionDescriptor descriptors = 1; +} + +enum ExtensionDescriptorType { + UNKNOWN = 0; + GENRE = 1; + MOOD = 2; + ACTIVITY = 3; + INSTRUMENT = 4; + TIME = 5; + ERA = 6; + AESTHETIC = 7; +} diff --git a/lib/spot/proto/extension_kind.pb.go b/lib/spot/proto/extension_kind.pb.go new file mode 100644 index 0000000..4b92910 --- /dev/null +++ b/lib/spot/proto/extension_kind.pb.go @@ -0,0 +1,298 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: extension_kind.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExtensionKind int32 + +const ( + ExtensionKind_UNKNOWN_EXTENSION ExtensionKind = 0 + ExtensionKind_CANVAZ ExtensionKind = 1 + ExtensionKind_STORYLINES ExtensionKind = 2 + ExtensionKind_PODCAST_TOPICS ExtensionKind = 3 + ExtensionKind_PODCAST_SEGMENTS ExtensionKind = 4 + ExtensionKind_AUDIO_FILES ExtensionKind = 5 + ExtensionKind_TRACK_DESCRIPTOR ExtensionKind = 6 + ExtensionKind_ARTIST_V4 ExtensionKind = 8 + ExtensionKind_ALBUM_V4 ExtensionKind = 9 + ExtensionKind_TRACK_V4 ExtensionKind = 10 + ExtensionKind_SHOW_V4 ExtensionKind = 11 + ExtensionKind_EPISODE_V4 ExtensionKind = 12 + ExtensionKind_PODCAST_HTML_DESCRIPTION ExtensionKind = 13 + ExtensionKind_PODCAST_QUOTES ExtensionKind = 14 + ExtensionKind_USER_PROFILE ExtensionKind = 15 + ExtensionKind_CANVAS_V1 ExtensionKind = 16 + ExtensionKind_SHOW_V4_BASE ExtensionKind = 17 + ExtensionKind_SHOW_V4_EPISODES_ASSOC ExtensionKind = 18 + ExtensionKind_TRACK_DESCRIPTOR_SIGNATURES ExtensionKind = 19 + ExtensionKind_PODCAST_AD_SEGMENTS ExtensionKind = 20 + ExtensionKind_EPISODE_TRANSCRIPTS ExtensionKind = 21 + ExtensionKind_PODCAST_SUBSCRIPTIONS ExtensionKind = 22 + ExtensionKind_EXTRACTED_COLOR ExtensionKind = 23 + ExtensionKind_PODCAST_VIRALITY ExtensionKind = 24 + ExtensionKind_IMAGE_SPARKLES_HACK ExtensionKind = 25 + ExtensionKind_PODCAST_POPULARITY_HACK ExtensionKind = 26 + ExtensionKind_AUTOMIX_MODE ExtensionKind = 27 + ExtensionKind_CUEPOINTS ExtensionKind = 28 + ExtensionKind_PODCAST_POLL ExtensionKind = 29 + ExtensionKind_EPISODE_ACCESS ExtensionKind = 30 + ExtensionKind_SHOW_ACCESS ExtensionKind = 31 + ExtensionKind_PODCAST_QNA ExtensionKind = 32 + ExtensionKind_CLIPS ExtensionKind = 33 + ExtensionKind_PODCAST_CTA_CARDS ExtensionKind = 36 + ExtensionKind_PODCAST_RATING ExtensionKind = 37 + ExtensionKind_DISPLAY_SEGMENTS ExtensionKind = 38 + ExtensionKind_GREENROOM ExtensionKind = 39 + ExtensionKind_USER_CREATED ExtensionKind = 40 + ExtensionKind_CLIENT_CONFIG ExtensionKind = 48 + ExtensionKind_AUDIOBOOK_SPECIFICS ExtensionKind = 52 +) + +// Enum value maps for ExtensionKind. +var ( + ExtensionKind_name = map[int32]string{ + 0: "UNKNOWN_EXTENSION", + 1: "CANVAZ", + 2: "STORYLINES", + 3: "PODCAST_TOPICS", + 4: "PODCAST_SEGMENTS", + 5: "AUDIO_FILES", + 6: "TRACK_DESCRIPTOR", + 8: "ARTIST_V4", + 9: "ALBUM_V4", + 10: "TRACK_V4", + 11: "SHOW_V4", + 12: "EPISODE_V4", + 13: "PODCAST_HTML_DESCRIPTION", + 14: "PODCAST_QUOTES", + 15: "USER_PROFILE", + 16: "CANVAS_V1", + 17: "SHOW_V4_BASE", + 18: "SHOW_V4_EPISODES_ASSOC", + 19: "TRACK_DESCRIPTOR_SIGNATURES", + 20: "PODCAST_AD_SEGMENTS", + 21: "EPISODE_TRANSCRIPTS", + 22: "PODCAST_SUBSCRIPTIONS", + 23: "EXTRACTED_COLOR", + 24: "PODCAST_VIRALITY", + 25: "IMAGE_SPARKLES_HACK", + 26: "PODCAST_POPULARITY_HACK", + 27: "AUTOMIX_MODE", + 28: "CUEPOINTS", + 29: "PODCAST_POLL", + 30: "EPISODE_ACCESS", + 31: "SHOW_ACCESS", + 32: "PODCAST_QNA", + 33: "CLIPS", + 36: "PODCAST_CTA_CARDS", + 37: "PODCAST_RATING", + 38: "DISPLAY_SEGMENTS", + 39: "GREENROOM", + 40: "USER_CREATED", + 48: "CLIENT_CONFIG", + 52: "AUDIOBOOK_SPECIFICS", + } + ExtensionKind_value = map[string]int32{ + "UNKNOWN_EXTENSION": 0, + "CANVAZ": 1, + "STORYLINES": 2, + "PODCAST_TOPICS": 3, + "PODCAST_SEGMENTS": 4, + "AUDIO_FILES": 5, + "TRACK_DESCRIPTOR": 6, + "ARTIST_V4": 8, + "ALBUM_V4": 9, + "TRACK_V4": 10, + "SHOW_V4": 11, + "EPISODE_V4": 12, + "PODCAST_HTML_DESCRIPTION": 13, + "PODCAST_QUOTES": 14, + "USER_PROFILE": 15, + "CANVAS_V1": 16, + "SHOW_V4_BASE": 17, + "SHOW_V4_EPISODES_ASSOC": 18, + "TRACK_DESCRIPTOR_SIGNATURES": 19, + "PODCAST_AD_SEGMENTS": 20, + "EPISODE_TRANSCRIPTS": 21, + "PODCAST_SUBSCRIPTIONS": 22, + "EXTRACTED_COLOR": 23, + "PODCAST_VIRALITY": 24, + "IMAGE_SPARKLES_HACK": 25, + "PODCAST_POPULARITY_HACK": 26, + "AUTOMIX_MODE": 27, + "CUEPOINTS": 28, + "PODCAST_POLL": 29, + "EPISODE_ACCESS": 30, + "SHOW_ACCESS": 31, + "PODCAST_QNA": 32, + "CLIPS": 33, + "PODCAST_CTA_CARDS": 36, + "PODCAST_RATING": 37, + "DISPLAY_SEGMENTS": 38, + "GREENROOM": 39, + "USER_CREATED": 40, + "CLIENT_CONFIG": 48, + "AUDIOBOOK_SPECIFICS": 52, + } +) + +func (x ExtensionKind) Enum() *ExtensionKind { + p := new(ExtensionKind) + *p = x + return p +} + +func (x ExtensionKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExtensionKind) Descriptor() protoreflect.EnumDescriptor { + return file_extension_kind_proto_enumTypes[0].Descriptor() +} + +func (ExtensionKind) Type() protoreflect.EnumType { + return &file_extension_kind_proto_enumTypes[0] +} + +func (x ExtensionKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ExtensionKind.Descriptor instead. +func (ExtensionKind) EnumDescriptor() ([]byte, []int) { + return file_extension_kind_proto_rawDescGZIP(), []int{0} +} + +var File_extension_kind_proto protoreflect.FileDescriptor + +var file_extension_kind_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2a, 0xad, 0x06, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x15, 0x0a, 0x11, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x58, + 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x41, 0x4e, + 0x56, 0x41, 0x5a, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x4c, 0x49, + 0x4e, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, + 0x5f, 0x54, 0x4f, 0x50, 0x49, 0x43, 0x53, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x4f, 0x44, + 0x43, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x04, 0x12, + 0x0f, 0x0a, 0x0b, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x53, 0x10, 0x05, + 0x12, 0x14, 0x0a, 0x10, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, + 0x50, 0x54, 0x4f, 0x52, 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, + 0x5f, 0x56, 0x34, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x4c, 0x42, 0x55, 0x4d, 0x5f, 0x56, + 0x34, 0x10, 0x09, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x56, 0x34, 0x10, + 0x0a, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x48, 0x4f, 0x57, 0x5f, 0x56, 0x34, 0x10, 0x0b, 0x12, 0x0e, + 0x0a, 0x0a, 0x45, 0x50, 0x49, 0x53, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x34, 0x10, 0x0c, 0x12, 0x1c, + 0x0a, 0x18, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x48, 0x54, 0x4d, 0x4c, 0x5f, 0x44, + 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x12, 0x0a, 0x0e, + 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x51, 0x55, 0x4f, 0x54, 0x45, 0x53, 0x10, 0x0e, + 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, + 0x10, 0x0f, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x56, 0x41, 0x53, 0x5f, 0x56, 0x31, 0x10, + 0x10, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x48, 0x4f, 0x57, 0x5f, 0x56, 0x34, 0x5f, 0x42, 0x41, 0x53, + 0x45, 0x10, 0x11, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x48, 0x4f, 0x57, 0x5f, 0x56, 0x34, 0x5f, 0x45, + 0x50, 0x49, 0x53, 0x4f, 0x44, 0x45, 0x53, 0x5f, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x10, 0x12, 0x12, + 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, + 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x10, 0x13, + 0x12, 0x17, 0x0a, 0x13, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x41, 0x44, 0x5f, 0x53, + 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x14, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x50, 0x49, + 0x53, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x53, + 0x10, 0x15, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x53, 0x55, + 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x16, 0x12, 0x13, 0x0a, + 0x0f, 0x45, 0x58, 0x54, 0x52, 0x41, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4c, 0x4f, 0x52, + 0x10, 0x17, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x56, 0x49, + 0x52, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x18, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x4d, 0x41, 0x47, + 0x45, 0x5f, 0x53, 0x50, 0x41, 0x52, 0x4b, 0x4c, 0x45, 0x53, 0x5f, 0x48, 0x41, 0x43, 0x4b, 0x10, + 0x19, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x4f, 0x50, + 0x55, 0x4c, 0x41, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x41, 0x43, 0x4b, 0x10, 0x1a, 0x12, 0x10, + 0x0a, 0x0c, 0x41, 0x55, 0x54, 0x4f, 0x4d, 0x49, 0x58, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x1b, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x55, 0x45, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x53, 0x10, 0x1c, 0x12, + 0x10, 0x0a, 0x0c, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x10, + 0x1d, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x50, 0x49, 0x53, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x10, 0x1e, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x48, 0x4f, 0x57, 0x5f, 0x41, 0x43, + 0x43, 0x45, 0x53, 0x53, 0x10, 0x1f, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, + 0x54, 0x5f, 0x51, 0x4e, 0x41, 0x10, 0x20, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x49, 0x50, 0x53, + 0x10, 0x21, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x5f, 0x43, 0x54, + 0x41, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x53, 0x10, 0x24, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x44, + 0x43, 0x41, 0x53, 0x54, 0x5f, 0x52, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x25, 0x12, 0x14, 0x0a, + 0x10, 0x44, 0x49, 0x53, 0x50, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x45, 0x47, 0x4d, 0x45, 0x4e, 0x54, + 0x53, 0x10, 0x26, 0x12, 0x0d, 0x0a, 0x09, 0x47, 0x52, 0x45, 0x45, 0x4e, 0x52, 0x4f, 0x4f, 0x4d, + 0x10, 0x27, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, + 0x45, 0x44, 0x10, 0x28, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x30, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x55, 0x44, 0x49, 0x4f, + 0x42, 0x4f, 0x4f, 0x4b, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x43, 0x53, 0x10, 0x34, + 0x42, 0x64, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, + 0x61, 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, + 0x69, 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xf8, 0x01, 0x01, + 0xa2, 0x02, 0x13, 0x53, 0x50, 0x54, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_extension_kind_proto_rawDescOnce sync.Once + file_extension_kind_proto_rawDescData = file_extension_kind_proto_rawDesc +) + +func file_extension_kind_proto_rawDescGZIP() []byte { + file_extension_kind_proto_rawDescOnce.Do(func() { + file_extension_kind_proto_rawDescData = protoimpl.X.CompressGZIP(file_extension_kind_proto_rawDescData) + }) + return file_extension_kind_proto_rawDescData +} + +var file_extension_kind_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_extension_kind_proto_goTypes = []interface{}{ + (ExtensionKind)(0), // 0: spotify.extendedmetadata.ExtensionKind +} +var file_extension_kind_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_extension_kind_proto_init() } +func file_extension_kind_proto_init() { + if File_extension_kind_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_extension_kind_proto_rawDesc, + NumEnums: 1, + NumMessages: 0, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_extension_kind_proto_goTypes, + DependencyIndexes: file_extension_kind_proto_depIdxs, + EnumInfos: file_extension_kind_proto_enumTypes, + }.Build() + File_extension_kind_proto = out.File + file_extension_kind_proto_rawDesc = nil + file_extension_kind_proto_goTypes = nil + file_extension_kind_proto_depIdxs = nil +} diff --git a/lib/spot/proto/extension_kind.proto b/lib/spot/proto/extension_kind.proto new file mode 100644 index 0000000..9d0099a --- /dev/null +++ b/lib/spot/proto/extension_kind.proto @@ -0,0 +1,55 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.extendedmetadata; + +option objc_class_prefix = "SPTExtendedMetadata"; +option cc_enable_arenas = true; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.extendedmetadata.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +enum ExtensionKind { + UNKNOWN_EXTENSION = 0; + CANVAZ = 1; + STORYLINES = 2; + PODCAST_TOPICS = 3; + PODCAST_SEGMENTS = 4; + AUDIO_FILES = 5; + TRACK_DESCRIPTOR = 6; + ARTIST_V4 = 8; + ALBUM_V4 = 9; + TRACK_V4 = 10; + SHOW_V4 = 11; + EPISODE_V4 = 12; + PODCAST_HTML_DESCRIPTION = 13; + PODCAST_QUOTES = 14; + USER_PROFILE = 15; + CANVAS_V1 = 16; + SHOW_V4_BASE = 17; + SHOW_V4_EPISODES_ASSOC = 18; + TRACK_DESCRIPTOR_SIGNATURES = 19; + PODCAST_AD_SEGMENTS = 20; + EPISODE_TRANSCRIPTS = 21; + PODCAST_SUBSCRIPTIONS = 22; + EXTRACTED_COLOR = 23; + PODCAST_VIRALITY = 24; + IMAGE_SPARKLES_HACK = 25; + PODCAST_POPULARITY_HACK = 26; + AUTOMIX_MODE = 27; + CUEPOINTS = 28; + PODCAST_POLL = 29; + EPISODE_ACCESS = 30; + SHOW_ACCESS = 31; + PODCAST_QNA = 32; + CLIPS = 33; + PODCAST_CTA_CARDS = 36; + PODCAST_RATING = 37; + DISPLAY_SEGMENTS = 38; + GREENROOM = 39; + USER_CREATED = 40; + CLIENT_CONFIG = 48; + AUDIOBOOK_SPECIFICS = 52; +} diff --git a/lib/spot/proto/extracted_colors.proto b/lib/spot/proto/extracted_colors.proto new file mode 100644 index 0000000..999a27e --- /dev/null +++ b/lib/spot/proto/extracted_colors.proto @@ -0,0 +1,24 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.context_track_color; + +message ColorResult { + Color color_raw = 1; + Color color_light = 2; + Color color_dark = 3; + Status status = 5; +} + +message Color { + int32 rgb = 1; + bool is_fallback = 2; +} + +enum Status { + OK = 0; + IN_PROGRESS = 1; + INVALID_URL = 2; + INTERNAL = 3; +} diff --git a/lib/spot/proto/follow_request.proto b/lib/spot/proto/follow_request.proto new file mode 100644 index 0000000..5a02689 --- /dev/null +++ b/lib/spot/proto/follow_request.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.socialgraph_esperanto.proto; + +import "socialgraph_response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.socialgraph.esperanto.proto"; + +message FollowRequest { + repeated string username = 1; + bool follow = 2; +} + +message FollowResponse { + ResponseStatus status = 1; +} diff --git a/lib/spot/proto/followed_users_request.proto b/lib/spot/proto/followed_users_request.proto new file mode 100644 index 0000000..afb71f4 --- /dev/null +++ b/lib/spot/proto/followed_users_request.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.socialgraph_esperanto.proto; + +import "socialgraph_response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.socialgraph.esperanto.proto"; + +message FollowedUsersRequest { + bool force_reload = 1; +} + +message FollowedUsersResponse { + ResponseStatus status = 1; + repeated string users = 2; +} diff --git a/lib/spot/proto/frecency.proto b/lib/spot/proto/frecency.proto new file mode 100644 index 0000000..89c6c7f --- /dev/null +++ b/lib/spot/proto/frecency.proto @@ -0,0 +1,27 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.frecency.v1; + +import "google/protobuf/timestamp.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "FrecencyProto"; +option java_package = "com.spotify.frecency.v1"; + +message FrecencyResponse { + repeated PlayContext play_contexts = 1; +} + +message PlayContext { + string uri = 1; + Frecency frecency = 2; +} + +message Frecency { + double ln_frecency = 1; + int32 event_count = 2; + google.protobuf.Timestamp last_event_time = 3; +} diff --git a/lib/spot/proto/frecency_storage.proto b/lib/spot/proto/frecency_storage.proto new file mode 100644 index 0000000..9e32269 --- /dev/null +++ b/lib/spot/proto/frecency_storage.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.frecency.proto.storage; + +option cc_enable_arenas = true; +option optimize_for = CODE_SIZE; + +message Frecency { + optional double ln_frecency = 1; + optional uint64 event_count = 2; + optional uint32 event_kind = 3; + optional uint64 last_event_time = 4; +} + +message ContextFrecencyInfo { + optional string context_uri = 1; + repeated Frecency context_frecencies = 2; +} + +message ContextFrecencyFile { + repeated ContextFrecencyInfo contexts = 1; + optional uint64 frecency_version = 2; +} diff --git a/lib/spot/proto/gabito.proto b/lib/spot/proto/gabito.proto new file mode 100644 index 0000000..b47f4fd --- /dev/null +++ b/lib/spot/proto/gabito.proto @@ -0,0 +1,36 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message EventEnvelope { + string event_name = 2; + + repeated EventFragment event_fragment = 3; + message EventFragment { + string name = 1; + bytes data = 2; + } + + bytes sequence_id = 4; + int64 sequence_number = 5; + + reserved 1; +} + +message PublishEventsRequest { + repeated EventEnvelope event = 1; + bool suppress_persist = 2; +} + +message PublishEventsResponse { + repeated EventError error = 1; + message EventError { + int32 index = 1; + bool transient = 2; + int32 reason = 3; + } +} diff --git a/lib/spot/proto/generate.go b/lib/spot/proto/generate.go new file mode 100644 index 0000000..ffd0ff3 --- /dev/null +++ b/lib/spot/proto/generate.go @@ -0,0 +1,16 @@ +package proto + +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. connect.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. connectivity.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. devices.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. entity_extension_data.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. extended_metadata.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. extension_kind.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. metadata.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. player.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. playlist_annotate3.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. playlist_permission.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. playlist4_external.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. spotify/clienttoken/v0/clienttoken_http.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. storage-resolve.proto +//go:generate protoc --go_opt=paths=source_relative --go_out=. --go-grpc_out=. user_attributes.proto diff --git a/lib/spot/proto/global_node.proto b/lib/spot/proto/global_node.proto new file mode 100644 index 0000000..cd6f1b6 --- /dev/null +++ b/lib/spot/proto/global_node.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context_player_options.proto"; +import "player_license.proto"; + +option optimize_for = CODE_SIZE; + +message GlobalNode { + optional ContextPlayerOptions options = 1; + optional PlayerLicense license = 2; + map configuration = 3; +} diff --git a/lib/spot/proto/google/protobuf/any.proto b/lib/spot/proto/google/protobuf/any.proto new file mode 100644 index 0000000..bb7f136 --- /dev/null +++ b/lib/spot/proto/google/protobuf/any.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option go_package = "google.golang.org/protobuf/types/known/anypb"; +option java_multiple_files = true; +option java_outer_classname = "AnyProto"; +option java_package = "com.google.protobuf"; + +message Any { + string type_url = 1; + bytes value = 2; +} diff --git a/lib/spot/proto/google/protobuf/descriptor.proto b/lib/spot/proto/google/protobuf/descriptor.proto new file mode 100644 index 0000000..884a515 --- /dev/null +++ b/lib/spot/proto/google/protobuf/descriptor.proto @@ -0,0 +1,301 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.Reflection"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/descriptorpb"; +option optimize_for = SPEED; +option java_outer_classname = "DescriptorProtos"; +option java_package = "com.google.protobuf"; + +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +message FileDescriptorProto { + optional string name = 1; + optional string package = 2; + repeated string dependency = 3; + repeated int32 public_dependency = 10; + repeated int32 weak_dependency = 11; + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + optional FileOptions options = 8; + optional SourceCodeInfo source_code_info = 9; + optional string syntax = 12; +} + +message DescriptorProto { + optional string name = 1; + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + repeated ExtensionRange extension_range = 5; + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + optional ExtensionRangeOptions options = 3; + } + + repeated OneofDescriptorProto oneof_decl = 8; + optional MessageOptions options = 7; + + repeated ReservedRange reserved_range = 9; + message ReservedRange { + optional int32 start = 1; + optional int32 end = 2; + } + + repeated string reserved_name = 10; +} + +message ExtensionRangeOptions { + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message FieldDescriptorProto { + optional string name = 1; + optional int32 number = 3; + + optional Label label = 4; + enum Label { + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + } + + optional Type type = 5; + enum Type { + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; + TYPE_SINT64 = 18; + } + + optional string type_name = 6; + optional string extendee = 2; + optional string default_value = 7; + optional int32 oneof_index = 9; + optional string json_name = 10; + optional FieldOptions options = 8; + optional bool proto3_optional = 17; +} + +message OneofDescriptorProto { + optional string name = 1; + optional OneofOptions options = 2; +} + +message EnumDescriptorProto { + optional string name = 1; + repeated EnumValueDescriptorProto value = 2; + optional EnumOptions options = 3; + + repeated EnumReservedRange reserved_range = 4; + message EnumReservedRange { + optional int32 start = 1; + optional int32 end = 2; + } + + repeated string reserved_name = 5; +} + +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + optional EnumValueOptions options = 3; +} + +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + optional ServiceOptions options = 3; +} + +message MethodDescriptorProto { + optional string name = 1; + optional string input_type = 2; + optional string output_type = 3; + optional MethodOptions options = 4; + optional bool client_streaming = 5 [default = false]; + optional bool server_streaming = 6 [default = false]; +} + +message FileOptions { + optional string java_package = 1; + optional string java_outer_classname = 8; + optional bool java_multiple_files = 10 [default = false]; + optional bool java_generate_equals_and_hash = 20 [deprecated = true]; + optional bool java_string_check_utf8 = 27 [default = false]; + + optional OptimizeMode optimize_for = 9 [default = SPEED]; + enum OptimizeMode { + SPEED = 1; + CODE_SIZE = 2; + LITE_RUNTIME = 3; + } + + optional string go_package = 11; + optional bool cc_generic_services = 16 [default = false]; + optional bool java_generic_services = 17 [default = false]; + optional bool py_generic_services = 18 [default = false]; + optional bool php_generic_services = 42 [default = false]; + optional bool deprecated = 23 [default = false]; + optional bool cc_enable_arenas = 31 [default = true]; + optional string objc_class_prefix = 36; + optional string csharp_namespace = 37; + optional string swift_prefix = 39; + optional string php_class_prefix = 40; + optional string php_namespace = 41; + optional string php_metadata_namespace = 44; + optional string ruby_package = 45; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 38; +} + +message MessageOptions { + optional bool message_set_wire_format = 1 [default = false]; + optional bool no_standard_descriptor_accessor = 2 [default = false]; + optional bool deprecated = 3 [default = false]; + optional bool map_entry = 7; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 4, 5, 6, 8, 9; +} + +message FieldOptions { + optional CType ctype = 1 [default = STRING]; + enum CType { + STRING = 0; + CORD = 1; + STRING_PIECE = 2; + } + + optional bool packed = 2; + + optional JSType jstype = 6 [default = JS_NORMAL]; + enum JSType { + JS_NORMAL = 0; + JS_STRING = 1; + JS_NUMBER = 2; + } + + optional bool lazy = 5 [default = false]; + optional bool deprecated = 3 [default = false]; + optional bool weak = 10 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 4; +} + +message OneofOptions { + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message EnumOptions { + optional bool allow_alias = 2; + optional bool deprecated = 3 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; + + reserved 5; +} + +message EnumValueOptions { + optional bool deprecated = 1 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message ServiceOptions { + optional bool deprecated = 33 [default = false]; + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message MethodOptions { + optional bool deprecated = 33 [default = false]; + + optional IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; + enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0; + NO_SIDE_EFFECTS = 1; + IDEMPOTENT = 2; + } + + repeated UninterpretedOption uninterpreted_option = 999; + + extensions 1000 to max; +} + +message UninterpretedOption { + repeated NamePart name = 2; + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +message SourceCodeInfo { + repeated Location location = 1; + message Location { + repeated int32 path = 1 [packed = true]; + repeated int32 span = 2 [packed = true]; + optional string leading_comments = 3; + optional string trailing_comments = 4; + repeated string leading_detached_comments = 6; + } +} + +message GeneratedCodeInfo { + repeated Annotation annotation = 1; + message Annotation { + repeated int32 path = 1 [packed = true]; + optional string source_file = 2; + optional int32 begin = 3; + optional int32 end = 4; + } +} diff --git a/lib/spot/proto/google/protobuf/duration.proto b/lib/spot/proto/google/protobuf/duration.proto new file mode 100644 index 0000000..f7d0130 --- /dev/null +++ b/lib/spot/proto/google/protobuf/duration.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/durationpb"; +option java_multiple_files = true; +option java_outer_classname = "DurationProto"; +option java_package = "com.google.protobuf"; + +message Duration { + int64 seconds = 1; + int32 nanos = 2; +} diff --git a/lib/spot/proto/google/protobuf/empty.proto b/lib/spot/proto/google/protobuf/empty.proto new file mode 100644 index 0000000..28c4d77 --- /dev/null +++ b/lib/spot/proto/google/protobuf/empty.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/emptypb"; +option java_multiple_files = true; +option java_outer_classname = "EmptyProto"; +option java_package = "com.google.protobuf"; + +message Empty { + +} diff --git a/lib/spot/proto/google/protobuf/field_mask.proto b/lib/spot/proto/google/protobuf/field_mask.proto new file mode 100644 index 0000000..3ae4871 --- /dev/null +++ b/lib/spot/proto/google/protobuf/field_mask.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/fieldmaskpb"; +option java_multiple_files = true; +option java_outer_classname = "FieldMaskProto"; +option java_package = "com.google.protobuf"; + +message FieldMask { + repeated string paths = 1; +} diff --git a/lib/spot/proto/google/protobuf/source_context.proto b/lib/spot/proto/google/protobuf/source_context.proto new file mode 100644 index 0000000..8449fd4 --- /dev/null +++ b/lib/spot/proto/google/protobuf/source_context.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option go_package = "google.golang.org/protobuf/types/known/sourcecontextpb"; +option java_multiple_files = true; +option java_outer_classname = "SourceContextProto"; +option java_package = "com.google.protobuf"; + +message SourceContext { + string file_name = 1; +} diff --git a/lib/spot/proto/google/protobuf/timestamp.proto b/lib/spot/proto/google/protobuf/timestamp.proto new file mode 100644 index 0000000..e402c47 --- /dev/null +++ b/lib/spot/proto/google/protobuf/timestamp.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/timestamppb"; +option java_multiple_files = true; +option java_outer_classname = "TimestampProto"; +option java_package = "com.google.protobuf"; + +message Timestamp { + int64 seconds = 1; + int32 nanos = 2; +} diff --git a/lib/spot/proto/google/protobuf/type.proto b/lib/spot/proto/google/protobuf/type.proto new file mode 100644 index 0000000..38d7f2d --- /dev/null +++ b/lib/spot/proto/google/protobuf/type.proto @@ -0,0 +1,91 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package google.protobuf; + +import "google/protobuf/any.proto"; +import "google/protobuf/source_context.proto"; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/typepb"; +option java_multiple_files = true; +option java_outer_classname = "TypeProto"; +option java_package = "com.google.protobuf"; + +message Type { + string name = 1; + repeated Field fields = 2; + repeated string oneofs = 3; + repeated Option options = 4; + SourceContext source_context = 5; + Syntax syntax = 6; +} + +message Field { + Kind kind = 1; + enum Kind { + TYPE_UNKNOWN = 0; + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; + TYPE_SINT64 = 18; + } + + Cardinality cardinality = 2; + enum Cardinality { + CARDINALITY_UNKNOWN = 0; + CARDINALITY_OPTIONAL = 1; + CARDINALITY_REQUIRED = 2; + CARDINALITY_REPEATED = 3; + } + + int32 number = 3; + string name = 4; + string type_url = 6; + int32 oneof_index = 7; + bool packed = 8; + repeated Option options = 9; + string json_name = 10; + string default_value = 11; +} + +message Enum { + string name = 1; + repeated EnumValue enumvalue = 2; + repeated Option options = 3; + SourceContext source_context = 4; + Syntax syntax = 5; +} + +message EnumValue { + string name = 1; + int32 number = 2; + repeated Option options = 3; +} + +message Option { + string name = 1; + Any value = 2; +} + +enum Syntax { + SYNTAX_PROTO2 = 0; + SYNTAX_PROTO3 = 1; +} diff --git a/lib/spot/proto/google/protobuf/wrappers.proto b/lib/spot/proto/google/protobuf/wrappers.proto new file mode 100644 index 0000000..10e94ee --- /dev/null +++ b/lib/spot/proto/google/protobuf/wrappers.proto @@ -0,0 +1,49 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/wrapperspb"; +option java_multiple_files = true; +option java_outer_classname = "WrappersProto"; +option java_package = "com.google.protobuf"; + +message DoubleValue { + double value = 1; +} + +message FloatValue { + float value = 1; +} + +message Int64Value { + int64 value = 1; +} + +message UInt64Value { + uint64 value = 1; +} + +message Int32Value { + int32 value = 1; +} + +message UInt32Value { + uint32 value = 1; +} + +message BoolValue { + bool value = 1; +} + +message StringValue { + string value = 1; +} + +message BytesValue { + bytes value = 1; +} diff --git a/lib/spot/proto/greenroom_extension.proto b/lib/spot/proto/greenroom_extension.proto new file mode 100644 index 0000000..4fc8dbe --- /dev/null +++ b/lib/spot/proto/greenroom_extension.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.greenroom.api.extendedmetadata.v1; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "GreenroomMetadataProto"; +option java_package = "com.spotify.greenroom.api.extendedmetadata.v1.proto"; + +message GreenroomSection { + repeated GreenroomItem items = 1; +} + +message GreenroomItem { + string title = 1; + string description = 2; + repeated GreenroomHost hosts = 3; + int64 start_timestamp = 4; + string deeplink_url = 5; + bool live = 6; +} + +message GreenroomHost { + string name = 1; + string image_url = 2; +} diff --git a/lib/spot/proto/identity.proto b/lib/spot/proto/identity.proto new file mode 100644 index 0000000..efd8b9e --- /dev/null +++ b/lib/spot/proto/identity.proto @@ -0,0 +1,37 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.identity.v3; + +import "google/protobuf/field_mask.proto"; +import "google/protobuf/wrappers.proto"; + +option optimize_for = CODE_SIZE; +option java_outer_classname = "IdentityV3"; +option java_package = "com.spotify.identity.proto.v3"; + +message Image { + int32 max_width = 1; + int32 max_height = 2; + string url = 3; +} + +message UserProfile { + google.protobuf.StringValue username = 1; + google.protobuf.StringValue name = 2; + repeated Image images = 3; + google.protobuf.BoolValue verified = 4; + google.protobuf.BoolValue edit_profile_disabled = 5; + google.protobuf.BoolValue report_abuse_disabled = 6; + google.protobuf.BoolValue abuse_reported_name = 7; + google.protobuf.BoolValue abuse_reported_image = 8; + google.protobuf.BoolValue has_spotify_name = 9; + google.protobuf.BoolValue has_spotify_image = 10; + google.protobuf.Int32Value color = 11; +} + +message UserProfileUpdateRequest { + google.protobuf.FieldMask mask = 1; + UserProfile user_profile = 2; +} diff --git a/lib/spot/proto/image-resolve.proto b/lib/spot/proto/image-resolve.proto new file mode 100644 index 0000000..d8befe9 --- /dev/null +++ b/lib/spot/proto/image-resolve.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.imageresolve.proto; + +option java_multiple_files = true; +option java_outer_classname = "ImageResolveProtos"; +option java_package = "com.spotify.imageresolve.proto"; + +message Collection { + bytes id = 1; + + repeated Projection projections = 2; + message Projection { + bytes id = 2; + int32 metadata_index = 3; + int32 url_template_index = 4; + } +} + +message ProjectionMetadata { + int32 width = 2; + int32 height = 3; + bool fetch_online = 4; + bool download_for_offline = 5; +} + +message ProjectionMap { + repeated string url_templates = 1; + repeated ProjectionMetadata projection_metas = 2; + repeated Collection collections = 3; +} diff --git a/lib/spot/proto/installation_data.proto b/lib/spot/proto/installation_data.proto new file mode 100644 index 0000000..083fe46 --- /dev/null +++ b/lib/spot/proto/installation_data.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message InstallationEntity { + int32 file_format_version = 1; + bytes encrypted_part = 2; +} + +message InstallationData { + string installation_id = 1; + string last_seen_device_id = 2; + int64 monotonic_clock_id = 3; +} diff --git a/lib/spot/proto/instrumentation_params.proto b/lib/spot/proto/instrumentation_params.proto new file mode 100644 index 0000000..b8e44f4 --- /dev/null +++ b/lib/spot/proto/instrumentation_params.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto.transfer; + +option optimize_for = CODE_SIZE; + +message InstrumentationParams { + repeated string interaction_ids = 6; + repeated string page_instance_ids = 7; +} diff --git a/lib/spot/proto/keyexchange.proto b/lib/spot/proto/keyexchange.proto new file mode 100644 index 0000000..840f552 --- /dev/null +++ b/lib/spot/proto/keyexchange.proto @@ -0,0 +1,245 @@ +syntax = "proto2"; + +message ClientHello { + required BuildInfo build_info = 0xa; + repeated Fingerprint fingerprints_supported = 0x14; + repeated Cryptosuite cryptosuites_supported = 0x1e; + repeated Powscheme powschemes_supported = 0x28; + required LoginCryptoHelloUnion login_crypto_hello = 0x32; + required bytes client_nonce = 0x3c; + optional bytes padding = 0x46; + optional FeatureSet feature_set = 0x50; +} + + +message BuildInfo { + required Product product = 0xa; + repeated ProductFlags product_flags = 0x14; + required Platform platform = 0x1e; + required uint64 version = 0x28; +} + +enum Product { + PRODUCT_CLIENT = 0x0; + PRODUCT_LIBSPOTIFY= 0x1; + PRODUCT_MOBILE = 0x2; + PRODUCT_PARTNER = 0x3; + PRODUCT_LIBSPOTIFY_EMBEDDED = 0x5; +} + +enum ProductFlags { + PRODUCT_FLAG_NONE = 0x0; + PRODUCT_FLAG_DEV_BUILD = 0x1; +} + +enum Platform { + PLATFORM_WIN32_X86 = 0x0; + PLATFORM_OSX_X86 = 0x1; + PLATFORM_LINUX_X86 = 0x2; + PLATFORM_IPHONE_ARM = 0x3; + PLATFORM_S60_ARM = 0x4; + PLATFORM_OSX_PPC = 0x5; + PLATFORM_ANDROID_ARM = 0x6; + PLATFORM_WINDOWS_CE_ARM = 0x7; + PLATFORM_LINUX_X86_64 = 0x8; + PLATFORM_OSX_X86_64 = 0x9; + PLATFORM_PALM_ARM = 0xa; + PLATFORM_LINUX_SH = 0xb; + PLATFORM_FREEBSD_X86 = 0xc; + PLATFORM_FREEBSD_X86_64 = 0xd; + PLATFORM_BLACKBERRY_ARM = 0xe; + PLATFORM_SONOS = 0xf; + PLATFORM_LINUX_MIPS = 0x10; + PLATFORM_LINUX_ARM = 0x11; + PLATFORM_LOGITECH_ARM = 0x12; + PLATFORM_LINUX_BLACKFIN = 0x13; + PLATFORM_WP7_ARM = 0x14; + PLATFORM_ONKYO_ARM = 0x15; + PLATFORM_QNXNTO_ARM = 0x16; + PLATFORM_BCO_ARM = 0x17; + PLATFORM_WEBPLAYER = 0x18; + PLATFORM_WP8_ARM = 0x19; + PLATFORM_WP8_X86 = 0x1a; + PLATFORM_WINRT_ARM = 0x1b; + PLATFORM_WINRT_X86 = 0x1c; + PLATFORM_WINRT_X86_64 = 0x1d; + PLATFORM_FRONTIER = 0x1e; + PLATFORM_AMIGA_PPC = 0x1f; + PLATFORM_NANRADIO_NRX901 = 0x20; + PLATFORM_HARMAN_ARM = 0x21; + PLATFORM_SONY_PS3 = 0x22; + PLATFORM_SONY_PS4 = 0x23; + PLATFORM_IPHONE_ARM64 = 0x24; + PLATFORM_RTEMS_PPC = 0x25; + PLATFORM_GENERIC_PARTNER = 0x26; + PLATFORM_WIN32_X86_64 = 0x27; + PLATFORM_WATCHOS = 0x28; +} + +enum Fingerprint { + FINGERPRINT_GRAIN = 0x0; + FINGERPRINT_HMAC_RIPEMD = 0x1; +} + +enum Cryptosuite { + CRYPTO_SUITE_SHANNON = 0x0; + CRYPTO_SUITE_RC4_SHA1_HMAC = 0x1; +} + +enum Powscheme { + POW_HASH_CASH = 0x0; +} + + +message LoginCryptoHelloUnion { + optional LoginCryptoDiffieHellmanHello diffie_hellman = 0xa; +} + + +message LoginCryptoDiffieHellmanHello { + required bytes gc = 0xa; + required uint32 server_keys_known = 0x14; +} + + +message FeatureSet { + optional bool autoupdate2 = 0x1; + optional bool current_location = 0x2; +} + + +message APResponseMessage { + optional APChallenge challenge = 0xa; + optional UpgradeRequiredMessage upgrade = 0x14; + optional APLoginFailed login_failed = 0x1e; +} + +message APChallenge { + required LoginCryptoChallengeUnion login_crypto_challenge = 0xa; + required FingerprintChallengeUnion fingerprint_challenge = 0x14; + required PoWChallengeUnion pow_challenge = 0x1e; + required CryptoChallengeUnion crypto_challenge = 0x28; + required bytes server_nonce = 0x32; + optional bytes padding = 0x3c; +} + +message LoginCryptoChallengeUnion { + optional LoginCryptoDiffieHellmanChallenge diffie_hellman = 0xa; +} + +message LoginCryptoDiffieHellmanChallenge { + required bytes gs = 0xa; + required int32 server_signature_key = 0x14; + required bytes gs_signature = 0x1e; +} + +message FingerprintChallengeUnion { + optional FingerprintGrainChallenge grain = 0xa; + optional FingerprintHmacRipemdChallenge hmac_ripemd = 0x14; +} + + +message FingerprintGrainChallenge { + required bytes kek = 0xa; +} + + +message FingerprintHmacRipemdChallenge { + required bytes challenge = 0xa; +} + + +message PoWChallengeUnion { + optional PoWHashCashChallenge hash_cash = 0xa; +} + +message PoWHashCashChallenge { + optional bytes prefix = 0xa; + optional int32 length = 0x14; + optional int32 target = 0x1e; +} + + +message CryptoChallengeUnion { + optional CryptoShannonChallenge shannon = 0xa; + optional CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 0x14; +} + + +message CryptoShannonChallenge { +} + + +message CryptoRc4Sha1HmacChallenge { +} + + +message UpgradeRequiredMessage { + required bytes upgrade_signed_part = 0xa; + required bytes signature = 0x14; + optional string http_suffix = 0x1e; +} + +message APLoginFailed { + required ErrorCode error_code = 0xa; + optional int32 retry_delay = 0x14; + optional int32 expiry = 0x1e; + optional string error_description = 0x28; +} + +enum ErrorCode { + ProtocolError = 0x0; + TryAnotherAP = 0x2; + BadConnectionId = 0x5; + TravelRestriction = 0x9; + PremiumAccountRequired = 0xb; + BadCredentials = 0xc; + CouldNotValidateCredentials = 0xd; + AccountExists = 0xe; + ExtraVerificationRequired = 0xf; + InvalidAppKey = 0x10; + ApplicationBanned = 0x11; +} + +message ClientResponsePlaintext { + required LoginCryptoResponseUnion login_crypto_response = 0xa; + required PoWResponseUnion pow_response = 0x14; + required CryptoResponseUnion crypto_response = 0x1e; +} + + +message LoginCryptoResponseUnion { + optional LoginCryptoDiffieHellmanResponse diffie_hellman = 0xa; +} + + +message LoginCryptoDiffieHellmanResponse { + required bytes hmac = 0xa; +} + + +message PoWResponseUnion { + optional PoWHashCashResponse hash_cash = 0xa; +} + + +message PoWHashCashResponse { + required bytes hash_suffix = 0xa; +} + + +message CryptoResponseUnion { + optional CryptoShannonResponse shannon = 0xa; + optional CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 0x14; +} + + +message CryptoShannonResponse { + optional int32 dummy = 0x1; +} + + +message CryptoRc4Sha1HmacResponse { + optional int32 dummy = 0x1; +} + diff --git a/lib/spot/proto/lfs_secret_provider.proto b/lib/spot/proto/lfs_secret_provider.proto new file mode 100644 index 0000000..0862181 --- /dev/null +++ b/lib/spot/proto/lfs_secret_provider.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.lfssecretprovider.proto; + +option optimize_for = CODE_SIZE; + +message GetSecretResponse { + bytes secret = 1; +} diff --git a/lib/spot/proto/liked_songs_tags_sync_state.proto b/lib/spot/proto/liked_songs_tags_sync_state.proto new file mode 100644 index 0000000..634f9d0 --- /dev/null +++ b/lib/spot/proto/liked_songs_tags_sync_state.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.collection.proto; + +option optimize_for = CODE_SIZE; + +message TagsSyncState { + string uri = 1; + bool sync_is_complete = 2; +} diff --git a/lib/spot/proto/listen_later_cosmos_response.proto b/lib/spot/proto/listen_later_cosmos_response.proto new file mode 100644 index 0000000..f71c577 --- /dev/null +++ b/lib/spot/proto/listen_later_cosmos_response.proto @@ -0,0 +1,28 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.listen_later_cosmos.proto; + +import "collection/episode_collection_state.proto"; +import "metadata/episode_metadata.proto"; +import "played_state/episode_played_state.proto"; +import "sync/episode_sync_state.proto"; + +option optimize_for = CODE_SIZE; + +message Episode { + optional string header = 1; + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 2; + optional cosmos_util.proto.EpisodeCollectionState episode_collection_state = 3; + optional cosmos_util.proto.EpisodeSyncState episode_offline_state = 4; + optional cosmos_util.proto.EpisodePlayState episode_played_state = 5; +} + +message EpisodesResponse { + optional uint32 unfiltered_length = 1; + optional uint32 unranged_length = 2; + repeated Episode episode = 3; + optional string offline_availability = 5; + optional uint32 offline_progress = 6; +} diff --git a/lib/spot/proto/local_bans_storage.proto b/lib/spot/proto/local_bans_storage.proto new file mode 100644 index 0000000..388f05b --- /dev/null +++ b/lib/spot/proto/local_bans_storage.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.collection.proto.storage; + +option optimize_for = CODE_SIZE; + +message BanItem { + required string item_uri = 1; + required string context_uri = 2; + required int64 timestamp = 3; +} + +message Bans { + repeated BanItem items = 1; +} diff --git a/lib/spot/proto/local_sync_cosmos.proto b/lib/spot/proto/local_sync_cosmos.proto new file mode 100644 index 0000000..cf6187f --- /dev/null +++ b/lib/spot/proto/local_sync_cosmos.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.local_sync_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message GetDevicesResponse { + repeated Device devices = 1; + message Device { + string name = 1; + string id = 2; + string endpoint = 3; + } +} diff --git a/lib/spot/proto/local_sync_state.proto b/lib/spot/proto/local_sync_state.proto new file mode 100644 index 0000000..630f184 --- /dev/null +++ b/lib/spot/proto/local_sync_state.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.local_sync_state.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.local_sync_state.proto"; + +message State { + string safe_secret = 1; +} diff --git a/lib/spot/proto/logging_params.proto b/lib/spot/proto/logging_params.proto new file mode 100644 index 0000000..1f11809 --- /dev/null +++ b/lib/spot/proto/logging_params.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message LoggingParams { + optional int64 command_initiated_time = 1; + optional int64 command_received_time = 2; + repeated string page_instance_ids = 3; + repeated string interaction_ids = 4; +} diff --git a/lib/spot/proto/mdata.proto b/lib/spot/proto/mdata.proto new file mode 100644 index 0000000..29faad9 --- /dev/null +++ b/lib/spot/proto/mdata.proto @@ -0,0 +1,43 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.mdata.proto; + +import "extension_kind.proto"; +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option optimize_for = CODE_SIZE; + +message LocalExtensionQuery { + extendedmetadata.ExtensionKind extension_kind = 1; + repeated string entity_uri = 2; +} + +message LocalBatchedEntityRequest { + repeated LocalExtensionQuery extension_query = 1; +} + +message LocalBatchedExtensionResponse { + repeated Extension extension = 1; + message Extension { + extendedmetadata.ExtensionKind extension_kind = 1; + repeated EntityExtension entity_extension = 2; + } + + message ExtensionHeader { + bool cache_valid = 1; + bool offline_valid = 2; + int32 status_code = 3; + bool is_empty = 4; + int64 cache_expiry_timestamp = 5; + int64 offline_expiry_timestamp = 6; + } + + message EntityExtension { + string entity_uri = 1; + ExtensionHeader header = 2; + google.protobuf.Any extension_data = 3; + } +} diff --git a/lib/spot/proto/mdata_cosmos.proto b/lib/spot/proto/mdata_cosmos.proto new file mode 100644 index 0000000..3c67357 --- /dev/null +++ b/lib/spot/proto/mdata_cosmos.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.mdata_cosmos.proto; + +import "extension_kind.proto"; + +option cc_enable_arenas = true; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.mdata.cosmos.proto"; + +message InvalidateCacheRequest { + extendedmetadata.ExtensionKind extension_kind = 1; + repeated string entity_uri = 2; +} + +message InvalidateCacheResponse { + +} diff --git a/lib/spot/proto/mdata_storage.proto b/lib/spot/proto/mdata_storage.proto new file mode 100644 index 0000000..8703fe5 --- /dev/null +++ b/lib/spot/proto/mdata_storage.proto @@ -0,0 +1,38 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.mdata.proto.storage; + +import "extension_kind.proto"; +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option optimize_for = CODE_SIZE; + +message CacheEntry { + extendedmetadata.ExtensionKind kind = 1; + google.protobuf.Any extension_data = 2; +} + +message CacheInfo { + int32 status_code = 1; + bool is_empty = 2; + uint64 cache_expiry = 3; + uint64 offline_expiry = 4; + string etag = 5; + fixed64 cache_checksum_lo = 6; + fixed64 cache_checksum_hi = 7; +} + +message OfflineLock { + uint64 lock_expiry = 1; +} + +message AudioFiles { + string file_id = 1; +} + +message TrackDescriptor { + int32 track_id = 1; +} diff --git a/lib/spot/proto/media_format.proto b/lib/spot/proto/media_format.proto new file mode 100644 index 0000000..c54f632 --- /dev/null +++ b/lib/spot/proto/media_format.proto @@ -0,0 +1,32 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +enum MediaFormat { + FORMAT_UNKNOWN = 0; + FORMAT_OGG_VORBIS_96 = 1; + FORMAT_OGG_VORBIS_160 = 2; + FORMAT_OGG_VORBIS_320 = 3; + FORMAT_MP3_256 = 4; + FORMAT_MP3_320 = 5; + FORMAT_MP3_160 = 6; + FORMAT_MP3_96 = 7; + FORMAT_MP3_160_ENCRYPTED = 8; + FORMAT_AAC_24 = 9; + FORMAT_AAC_48 = 10; + FORMAT_MP4_128 = 11; + FORMAT_MP4_128_DUAL = 12; + FORMAT_MP4_128_CBCS = 13; + FORMAT_MP4_256 = 14; + FORMAT_MP4_256_DUAL = 15; + FORMAT_MP4_256_CBCS = 16; + FORMAT_FLAC_FLAC = 17; + FORMAT_MP4_FLAC = 18; + FORMAT_MP4_Unknown = 19; + FORMAT_MP3_Unknown = 20; +} diff --git a/lib/spot/proto/media_manifest.proto b/lib/spot/proto/media_manifest.proto new file mode 100644 index 0000000..6e28025 --- /dev/null +++ b/lib/spot/proto/media_manifest.proto @@ -0,0 +1,58 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.media_manifest.proto; + +option optimize_for = CODE_SIZE; + +message AudioFile { + enum Format { + OGG_VORBIS_96 = 0; + OGG_VORBIS_160 = 1; + OGG_VORBIS_320 = 2; + MP3_256 = 3; + MP3_320 = 4; + MP3_160 = 5; + MP3_96 = 6; + MP3_160_ENC = 7; + AAC_24 = 8; + AAC_48 = 9; + FLAC_FLAC = 16; + } +} + +message File { + int32 bitrate = 3; + string mime_type = 4; + + oneof file { + ExternalFile external_file = 1; + FileIdFile file_id_file = 2; + } + + message ExternalFile { + string method = 1; + bytes body = 4; + + oneof endpoint { + string url = 2; + string service = 3; + } + } + + message FileIdFile { + string file_id_hex = 1; + AudioFile.Format download_format = 2; + EncryptionType encryption = 3; + } +} + +message Files { + repeated File files = 1; +} + +enum EncryptionType { + NONE = 0; + AES = 1; +} diff --git a/lib/spot/proto/media_type.proto b/lib/spot/proto/media_type.proto new file mode 100644 index 0000000..2d8def4 --- /dev/null +++ b/lib/spot/proto/media_type.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +enum MediaType { + AUDIO = 0; + VIDEO = 1; +} diff --git a/lib/spot/proto/media_type_node.proto b/lib/spot/proto/media_type_node.proto new file mode 100644 index 0000000..0d0a596 --- /dev/null +++ b/lib/spot/proto/media_type_node.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message MediaTypeNode { + optional string current_uri = 1; + optional string media_type = 2; + optional string media_manifest_id = 3; +} diff --git a/lib/spot/proto/members_request.proto b/lib/spot/proto/members_request.proto new file mode 100644 index 0000000..931f91d --- /dev/null +++ b/lib/spot/proto/members_request.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message OptionalLimit { + uint32 value = 1; +} + +message PlaylistMembersRequest { + string uri = 1; + OptionalLimit limit = 2; +} diff --git a/lib/spot/proto/members_response.proto b/lib/spot/proto/members_response.proto new file mode 100644 index 0000000..f341a8d --- /dev/null +++ b/lib/spot/proto/members_response.proto @@ -0,0 +1,35 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +import "playlist_permission.proto"; +import "playlist_user_state.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message Member { + optional User user = 1; + optional bool is_owner = 2; + optional uint32 num_tracks = 3; + optional uint32 num_episodes = 4; + optional FollowState follow_state = 5; + optional playlist_permission.proto.PermissionLevel permission_level = 6; +} + +message PlaylistMembersResponse { + optional string title = 1; + optional uint32 num_total_members = 2; + optional playlist_permission.proto.Capabilities capabilities = 3; + optional playlist_permission.proto.PermissionLevel base_permission_level = 4; + repeated Member members = 5; +} + +enum FollowState { + NONE = 0; + CAN_BE_FOLLOWED = 1; + CAN_BE_UNFOLLOWED = 2; +} diff --git a/lib/spot/proto/mercury.proto b/lib/spot/proto/mercury.proto new file mode 100644 index 0000000..2abdbcc --- /dev/null +++ b/lib/spot/proto/mercury.proto @@ -0,0 +1,46 @@ +syntax = "proto2"; + +message MercuryMultiGetRequest { + repeated MercuryRequest request = 0x1; +} + +message MercuryMultiGetReply { + repeated MercuryReply reply = 0x1; +} + +message MercuryRequest { + optional string uri = 0x1; + optional string content_type = 0x2; + optional bytes body = 0x3; + optional bytes etag = 0x4; +} + +message MercuryReply { + optional sint32 status_code = 0x1; + optional string status_message = 0x2; + optional CachePolicy cache_policy = 0x3; + enum CachePolicy { + CACHE_NO = 0x1; + CACHE_PRIVATE = 0x2; + CACHE_PUBLIC = 0x3; + } + optional sint32 ttl = 0x4; + optional bytes etag = 0x5; + optional string content_type = 0x6; + optional bytes body = 0x7; +} + + +message Header { + optional string uri = 0x01; + optional string content_type = 0x02; + optional string method = 0x03; + optional sint32 status_code = 0x04; + repeated UserField user_fields = 0x06; +} + +message UserField { + optional string key = 0x01; + optional bytes value = 0x02; +} + diff --git a/lib/spot/proto/messages/discovery/force_discover.proto b/lib/spot/proto/messages/discovery/force_discover.proto new file mode 100644 index 0000000..22bcb06 --- /dev/null +++ b/lib/spot/proto/messages/discovery/force_discover.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.connect.esperanto.proto; + +option java_package = "com.spotify.connect.esperanto.proto"; + +message ForceDiscoverRequest { + +} + +message ForceDiscoverResponse { + +} diff --git a/lib/spot/proto/messages/discovery/start_discovery.proto b/lib/spot/proto/messages/discovery/start_discovery.proto new file mode 100644 index 0000000..d4af933 --- /dev/null +++ b/lib/spot/proto/messages/discovery/start_discovery.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.connect.esperanto.proto; + +option java_package = "com.spotify.connect.esperanto.proto"; + +message StartDiscoveryRequest { + +} + +message StartDiscoveryResponse { + +} diff --git a/lib/spot/proto/metadata.pb.go b/lib/spot/proto/metadata.pb.go new file mode 100644 index 0000000..7d035b8 --- /dev/null +++ b/lib/spot/proto/metadata.pb.go @@ -0,0 +1,3749 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: metadata.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Album_Type int32 + +const ( + Album_ALBUM Album_Type = 1 + Album_SINGLE Album_Type = 2 + Album_COMPILATION Album_Type = 3 + Album_EP Album_Type = 4 + Album_AUDIOBOOK Album_Type = 5 + Album_PODCAST Album_Type = 6 +) + +// Enum value maps for Album_Type. +var ( + Album_Type_name = map[int32]string{ + 1: "ALBUM", + 2: "SINGLE", + 3: "COMPILATION", + 4: "EP", + 5: "AUDIOBOOK", + 6: "PODCAST", + } + Album_Type_value = map[string]int32{ + "ALBUM": 1, + "SINGLE": 2, + "COMPILATION": 3, + "EP": 4, + "AUDIOBOOK": 5, + "PODCAST": 6, + } +) + +func (x Album_Type) Enum() *Album_Type { + p := new(Album_Type) + *p = x + return p +} + +func (x Album_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Album_Type) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[0].Descriptor() +} + +func (Album_Type) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[0] +} + +func (x Album_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Album_Type) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Album_Type(num) + return nil +} + +// Deprecated: Use Album_Type.Descriptor instead. +func (Album_Type) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{1, 0} +} + +type ArtistWithRole_ArtistRole int32 + +const ( + ArtistWithRole_ARTIST_ROLE_UNKNOWN ArtistWithRole_ArtistRole = 0 + ArtistWithRole_ARTIST_ROLE_MAIN_ARTIST ArtistWithRole_ArtistRole = 1 + ArtistWithRole_ARTIST_ROLE_FEATURED_ARTIST ArtistWithRole_ArtistRole = 2 + ArtistWithRole_ARTIST_ROLE_REMIXER ArtistWithRole_ArtistRole = 3 + ArtistWithRole_ARTIST_ROLE_ACTOR ArtistWithRole_ArtistRole = 4 + ArtistWithRole_ARTIST_ROLE_COMPOSER ArtistWithRole_ArtistRole = 5 + ArtistWithRole_ARTIST_ROLE_CONDUCTOR ArtistWithRole_ArtistRole = 6 + ArtistWithRole_ARTIST_ROLE_ORCHESTRA ArtistWithRole_ArtistRole = 7 +) + +// Enum value maps for ArtistWithRole_ArtistRole. +var ( + ArtistWithRole_ArtistRole_name = map[int32]string{ + 0: "ARTIST_ROLE_UNKNOWN", + 1: "ARTIST_ROLE_MAIN_ARTIST", + 2: "ARTIST_ROLE_FEATURED_ARTIST", + 3: "ARTIST_ROLE_REMIXER", + 4: "ARTIST_ROLE_ACTOR", + 5: "ARTIST_ROLE_COMPOSER", + 6: "ARTIST_ROLE_CONDUCTOR", + 7: "ARTIST_ROLE_ORCHESTRA", + } + ArtistWithRole_ArtistRole_value = map[string]int32{ + "ARTIST_ROLE_UNKNOWN": 0, + "ARTIST_ROLE_MAIN_ARTIST": 1, + "ARTIST_ROLE_FEATURED_ARTIST": 2, + "ARTIST_ROLE_REMIXER": 3, + "ARTIST_ROLE_ACTOR": 4, + "ARTIST_ROLE_COMPOSER": 5, + "ARTIST_ROLE_CONDUCTOR": 6, + "ARTIST_ROLE_ORCHESTRA": 7, + } +) + +func (x ArtistWithRole_ArtistRole) Enum() *ArtistWithRole_ArtistRole { + p := new(ArtistWithRole_ArtistRole) + *p = x + return p +} + +func (x ArtistWithRole_ArtistRole) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ArtistWithRole_ArtistRole) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[1].Descriptor() +} + +func (ArtistWithRole_ArtistRole) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[1] +} + +func (x ArtistWithRole_ArtistRole) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ArtistWithRole_ArtistRole) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ArtistWithRole_ArtistRole(num) + return nil +} + +// Deprecated: Use ArtistWithRole_ArtistRole.Descriptor instead. +func (ArtistWithRole_ArtistRole) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{3, 0} +} + +type Show_MediaType int32 + +const ( + Show_MIXED Show_MediaType = 0 + Show_AUDIO Show_MediaType = 1 + Show_VIDEO Show_MediaType = 2 +) + +// Enum value maps for Show_MediaType. +var ( + Show_MediaType_name = map[int32]string{ + 0: "MIXED", + 1: "AUDIO", + 2: "VIDEO", + } + Show_MediaType_value = map[string]int32{ + "MIXED": 0, + "AUDIO": 1, + "VIDEO": 2, + } +) + +func (x Show_MediaType) Enum() *Show_MediaType { + p := new(Show_MediaType) + *p = x + return p +} + +func (x Show_MediaType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Show_MediaType) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[2].Descriptor() +} + +func (Show_MediaType) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[2] +} + +func (x Show_MediaType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Show_MediaType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Show_MediaType(num) + return nil +} + +// Deprecated: Use Show_MediaType.Descriptor instead. +func (Show_MediaType) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{4, 0} +} + +type Show_ConsumptionOrder int32 + +const ( + Show_SEQUENTIAL Show_ConsumptionOrder = 1 + Show_EPISODIC Show_ConsumptionOrder = 2 + Show_RECENT Show_ConsumptionOrder = 3 +) + +// Enum value maps for Show_ConsumptionOrder. +var ( + Show_ConsumptionOrder_name = map[int32]string{ + 1: "SEQUENTIAL", + 2: "EPISODIC", + 3: "RECENT", + } + Show_ConsumptionOrder_value = map[string]int32{ + "SEQUENTIAL": 1, + "EPISODIC": 2, + "RECENT": 3, + } +) + +func (x Show_ConsumptionOrder) Enum() *Show_ConsumptionOrder { + p := new(Show_ConsumptionOrder) + *p = x + return p +} + +func (x Show_ConsumptionOrder) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Show_ConsumptionOrder) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[3].Descriptor() +} + +func (Show_ConsumptionOrder) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[3] +} + +func (x Show_ConsumptionOrder) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Show_ConsumptionOrder) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Show_ConsumptionOrder(num) + return nil +} + +// Deprecated: Use Show_ConsumptionOrder.Descriptor instead. +func (Show_ConsumptionOrder) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{4, 1} +} + +type Episode_EpisodeType int32 + +const ( + Episode_FULL Episode_EpisodeType = 0 + Episode_TRAILER Episode_EpisodeType = 1 + Episode_BONUS Episode_EpisodeType = 2 +) + +// Enum value maps for Episode_EpisodeType. +var ( + Episode_EpisodeType_name = map[int32]string{ + 0: "FULL", + 1: "TRAILER", + 2: "BONUS", + } + Episode_EpisodeType_value = map[string]int32{ + "FULL": 0, + "TRAILER": 1, + "BONUS": 2, + } +) + +func (x Episode_EpisodeType) Enum() *Episode_EpisodeType { + p := new(Episode_EpisodeType) + *p = x + return p +} + +func (x Episode_EpisodeType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Episode_EpisodeType) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[4].Descriptor() +} + +func (Episode_EpisodeType) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[4] +} + +func (x Episode_EpisodeType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Episode_EpisodeType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Episode_EpisodeType(num) + return nil +} + +// Deprecated: Use Episode_EpisodeType.Descriptor instead. +func (Episode_EpisodeType) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{5, 0} +} + +type Image_Size int32 + +const ( + Image_DEFAULT Image_Size = 0 + Image_SMALL Image_Size = 1 + Image_LARGE Image_Size = 2 + Image_XLARGE Image_Size = 3 +) + +// Enum value maps for Image_Size. +var ( + Image_Size_name = map[int32]string{ + 0: "DEFAULT", + 1: "SMALL", + 2: "LARGE", + 3: "XLARGE", + } + Image_Size_value = map[string]int32{ + "DEFAULT": 0, + "SMALL": 1, + "LARGE": 2, + "XLARGE": 3, + } +) + +func (x Image_Size) Enum() *Image_Size { + p := new(Image_Size) + *p = x + return p +} + +func (x Image_Size) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Image_Size) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[5].Descriptor() +} + +func (Image_Size) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[5] +} + +func (x Image_Size) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Image_Size) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Image_Size(num) + return nil +} + +// Deprecated: Use Image_Size.Descriptor instead. +func (Image_Size) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{11, 0} +} + +type Copyright_Type int32 + +const ( + Copyright_P Copyright_Type = 0 + Copyright_C Copyright_Type = 1 +) + +// Enum value maps for Copyright_Type. +var ( + Copyright_Type_name = map[int32]string{ + 0: "P", + 1: "C", + } + Copyright_Type_value = map[string]int32{ + "P": 0, + "C": 1, + } +) + +func (x Copyright_Type) Enum() *Copyright_Type { + p := new(Copyright_Type) + *p = x + return p +} + +func (x Copyright_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Copyright_Type) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[6].Descriptor() +} + +func (Copyright_Type) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[6] +} + +func (x Copyright_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Copyright_Type) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Copyright_Type(num) + return nil +} + +// Deprecated: Use Copyright_Type.Descriptor instead. +func (Copyright_Type) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{15, 0} +} + +type Restriction_Catalogue int32 + +const ( + Restriction_AD Restriction_Catalogue = 0 + Restriction_SUBSCRIPTION Restriction_Catalogue = 1 + Restriction_CATALOGUE_ALL Restriction_Catalogue = 2 + Restriction_SHUFFLE Restriction_Catalogue = 3 + Restriction_COMMERCIAL Restriction_Catalogue = 4 +) + +// Enum value maps for Restriction_Catalogue. +var ( + Restriction_Catalogue_name = map[int32]string{ + 0: "AD", + 1: "SUBSCRIPTION", + 2: "CATALOGUE_ALL", + 3: "SHUFFLE", + 4: "COMMERCIAL", + } + Restriction_Catalogue_value = map[string]int32{ + "AD": 0, + "SUBSCRIPTION": 1, + "CATALOGUE_ALL": 2, + "SHUFFLE": 3, + "COMMERCIAL": 4, + } +) + +func (x Restriction_Catalogue) Enum() *Restriction_Catalogue { + p := new(Restriction_Catalogue) + *p = x + return p +} + +func (x Restriction_Catalogue) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Restriction_Catalogue) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[7].Descriptor() +} + +func (Restriction_Catalogue) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[7] +} + +func (x Restriction_Catalogue) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Restriction_Catalogue) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Restriction_Catalogue(num) + return nil +} + +// Deprecated: Use Restriction_Catalogue.Descriptor instead. +func (Restriction_Catalogue) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{16, 0} +} + +type Restriction_Type int32 + +const ( + Restriction_STREAMING Restriction_Type = 0 +) + +// Enum value maps for Restriction_Type. +var ( + Restriction_Type_name = map[int32]string{ + 0: "STREAMING", + } + Restriction_Type_value = map[string]int32{ + "STREAMING": 0, + } +) + +func (x Restriction_Type) Enum() *Restriction_Type { + p := new(Restriction_Type) + *p = x + return p +} + +func (x Restriction_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Restriction_Type) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[8].Descriptor() +} + +func (Restriction_Type) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[8] +} + +func (x Restriction_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Restriction_Type) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Restriction_Type(num) + return nil +} + +// Deprecated: Use Restriction_Type.Descriptor instead. +func (Restriction_Type) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{16, 1} +} + +type AudioFile_Format int32 + +const ( + AudioFile_OGG_VORBIS_96 AudioFile_Format = 0 + AudioFile_OGG_VORBIS_160 AudioFile_Format = 1 + AudioFile_OGG_VORBIS_320 AudioFile_Format = 2 + AudioFile_MP3_256 AudioFile_Format = 3 + AudioFile_MP3_320 AudioFile_Format = 4 + AudioFile_MP3_160 AudioFile_Format = 5 + AudioFile_MP3_96 AudioFile_Format = 6 + AudioFile_MP3_160_ENC AudioFile_Format = 7 + AudioFile_AAC_24 AudioFile_Format = 8 + AudioFile_AAC_48 AudioFile_Format = 9 + AudioFile_FLAC_FLAC AudioFile_Format = 16 +) + +// Enum value maps for AudioFile_Format. +var ( + AudioFile_Format_name = map[int32]string{ + 0: "OGG_VORBIS_96", + 1: "OGG_VORBIS_160", + 2: "OGG_VORBIS_320", + 3: "MP3_256", + 4: "MP3_320", + 5: "MP3_160", + 6: "MP3_96", + 7: "MP3_160_ENC", + 8: "AAC_24", + 9: "AAC_48", + 16: "FLAC_FLAC", + } + AudioFile_Format_value = map[string]int32{ + "OGG_VORBIS_96": 0, + "OGG_VORBIS_160": 1, + "OGG_VORBIS_320": 2, + "MP3_256": 3, + "MP3_320": 4, + "MP3_160": 5, + "MP3_96": 6, + "MP3_160_ENC": 7, + "AAC_24": 8, + "AAC_48": 9, + "FLAC_FLAC": 16, + } +) + +func (x AudioFile_Format) Enum() *AudioFile_Format { + p := new(AudioFile_Format) + *p = x + return p +} + +func (x AudioFile_Format) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AudioFile_Format) Descriptor() protoreflect.EnumDescriptor { + return file_metadata_proto_enumTypes[9].Descriptor() +} + +func (AudioFile_Format) Type() protoreflect.EnumType { + return &file_metadata_proto_enumTypes[9] +} + +func (x AudioFile_Format) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *AudioFile_Format) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = AudioFile_Format(num) + return nil +} + +// Deprecated: Use AudioFile_Format.Descriptor instead. +func (AudioFile_Format) EnumDescriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{20, 0} +} + +type Artist struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Gid []byte `protobuf:"bytes,1,opt,name=gid" json:"gid,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Popularity *int32 `protobuf:"zigzag32,3,opt,name=popularity" json:"popularity,omitempty"` + TopTrack []*TopTracks `protobuf:"bytes,4,rep,name=top_track,json=topTrack" json:"top_track,omitempty"` + AlbumGroup []*AlbumGroup `protobuf:"bytes,5,rep,name=album_group,json=albumGroup" json:"album_group,omitempty"` + SingleGroup []*AlbumGroup `protobuf:"bytes,6,rep,name=single_group,json=singleGroup" json:"single_group,omitempty"` + CompilationGroup []*AlbumGroup `protobuf:"bytes,7,rep,name=compilation_group,json=compilationGroup" json:"compilation_group,omitempty"` + AppearsOnGroup []*AlbumGroup `protobuf:"bytes,8,rep,name=appears_on_group,json=appearsOnGroup" json:"appears_on_group,omitempty"` + Genre []string `protobuf:"bytes,9,rep,name=genre" json:"genre,omitempty"` + ExternalId []*ExternalId `protobuf:"bytes,10,rep,name=external_id,json=externalId" json:"external_id,omitempty"` + Portrait []*Image `protobuf:"bytes,11,rep,name=portrait" json:"portrait,omitempty"` + Biography []*Biography `protobuf:"bytes,12,rep,name=biography" json:"biography,omitempty"` + ActivityPeriod []*ActivityPeriod `protobuf:"bytes,13,rep,name=activity_period,json=activityPeriod" json:"activity_period,omitempty"` + Restriction []*Restriction `protobuf:"bytes,14,rep,name=restriction" json:"restriction,omitempty"` + Related []*Artist `protobuf:"bytes,15,rep,name=related" json:"related,omitempty"` + IsPortraitAlbumCover *bool `protobuf:"varint,16,opt,name=is_portrait_album_cover,json=isPortraitAlbumCover" json:"is_portrait_album_cover,omitempty"` + PortraitGroup *ImageGroup `protobuf:"bytes,17,opt,name=portrait_group,json=portraitGroup" json:"portrait_group,omitempty"` + SalePeriod []*SalePeriod `protobuf:"bytes,18,rep,name=sale_period,json=salePeriod" json:"sale_period,omitempty"` + Availability []*Availability `protobuf:"bytes,20,rep,name=availability" json:"availability,omitempty"` +} + +func (x *Artist) Reset() { + *x = Artist{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Artist) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Artist) ProtoMessage() {} + +func (x *Artist) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Artist.ProtoReflect.Descriptor instead. +func (*Artist) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{0} +} + +func (x *Artist) GetGid() []byte { + if x != nil { + return x.Gid + } + return nil +} + +func (x *Artist) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *Artist) GetPopularity() int32 { + if x != nil && x.Popularity != nil { + return *x.Popularity + } + return 0 +} + +func (x *Artist) GetTopTrack() []*TopTracks { + if x != nil { + return x.TopTrack + } + return nil +} + +func (x *Artist) GetAlbumGroup() []*AlbumGroup { + if x != nil { + return x.AlbumGroup + } + return nil +} + +func (x *Artist) GetSingleGroup() []*AlbumGroup { + if x != nil { + return x.SingleGroup + } + return nil +} + +func (x *Artist) GetCompilationGroup() []*AlbumGroup { + if x != nil { + return x.CompilationGroup + } + return nil +} + +func (x *Artist) GetAppearsOnGroup() []*AlbumGroup { + if x != nil { + return x.AppearsOnGroup + } + return nil +} + +func (x *Artist) GetGenre() []string { + if x != nil { + return x.Genre + } + return nil +} + +func (x *Artist) GetExternalId() []*ExternalId { + if x != nil { + return x.ExternalId + } + return nil +} + +func (x *Artist) GetPortrait() []*Image { + if x != nil { + return x.Portrait + } + return nil +} + +func (x *Artist) GetBiography() []*Biography { + if x != nil { + return x.Biography + } + return nil +} + +func (x *Artist) GetActivityPeriod() []*ActivityPeriod { + if x != nil { + return x.ActivityPeriod + } + return nil +} + +func (x *Artist) GetRestriction() []*Restriction { + if x != nil { + return x.Restriction + } + return nil +} + +func (x *Artist) GetRelated() []*Artist { + if x != nil { + return x.Related + } + return nil +} + +func (x *Artist) GetIsPortraitAlbumCover() bool { + if x != nil && x.IsPortraitAlbumCover != nil { + return *x.IsPortraitAlbumCover + } + return false +} + +func (x *Artist) GetPortraitGroup() *ImageGroup { + if x != nil { + return x.PortraitGroup + } + return nil +} + +func (x *Artist) GetSalePeriod() []*SalePeriod { + if x != nil { + return x.SalePeriod + } + return nil +} + +func (x *Artist) GetAvailability() []*Availability { + if x != nil { + return x.Availability + } + return nil +} + +type Album struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Gid []byte `protobuf:"bytes,1,opt,name=gid" json:"gid,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Artist []*Artist `protobuf:"bytes,3,rep,name=artist" json:"artist,omitempty"` + Type *Album_Type `protobuf:"varint,4,opt,name=type,enum=spotify.metadata.Album_Type" json:"type,omitempty"` + Label *string `protobuf:"bytes,5,opt,name=label" json:"label,omitempty"` + Date *Date `protobuf:"bytes,6,opt,name=date" json:"date,omitempty"` + Popularity *int32 `protobuf:"zigzag32,7,opt,name=popularity" json:"popularity,omitempty"` + Genre []string `protobuf:"bytes,8,rep,name=genre" json:"genre,omitempty"` + Cover []*Image `protobuf:"bytes,9,rep,name=cover" json:"cover,omitempty"` + ExternalId []*ExternalId `protobuf:"bytes,10,rep,name=external_id,json=externalId" json:"external_id,omitempty"` + Disc []*Disc `protobuf:"bytes,11,rep,name=disc" json:"disc,omitempty"` + Review []string `protobuf:"bytes,12,rep,name=review" json:"review,omitempty"` + Copyright []*Copyright `protobuf:"bytes,13,rep,name=copyright" json:"copyright,omitempty"` + Restriction []*Restriction `protobuf:"bytes,14,rep,name=restriction" json:"restriction,omitempty"` + Related []*Album `protobuf:"bytes,15,rep,name=related" json:"related,omitempty"` + SalePeriod []*SalePeriod `protobuf:"bytes,16,rep,name=sale_period,json=salePeriod" json:"sale_period,omitempty"` + CoverGroup *ImageGroup `protobuf:"bytes,17,opt,name=cover_group,json=coverGroup" json:"cover_group,omitempty"` + OriginalTitle *string `protobuf:"bytes,18,opt,name=original_title,json=originalTitle" json:"original_title,omitempty"` + VersionTitle *string `protobuf:"bytes,19,opt,name=version_title,json=versionTitle" json:"version_title,omitempty"` + TypeStr *string `protobuf:"bytes,20,opt,name=type_str,json=typeStr" json:"type_str,omitempty"` + Availability []*Availability `protobuf:"bytes,23,rep,name=availability" json:"availability,omitempty"` +} + +func (x *Album) Reset() { + *x = Album{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Album) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Album) ProtoMessage() {} + +func (x *Album) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Album.ProtoReflect.Descriptor instead. +func (*Album) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{1} +} + +func (x *Album) GetGid() []byte { + if x != nil { + return x.Gid + } + return nil +} + +func (x *Album) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *Album) GetArtist() []*Artist { + if x != nil { + return x.Artist + } + return nil +} + +func (x *Album) GetType() Album_Type { + if x != nil && x.Type != nil { + return *x.Type + } + return Album_ALBUM +} + +func (x *Album) GetLabel() string { + if x != nil && x.Label != nil { + return *x.Label + } + return "" +} + +func (x *Album) GetDate() *Date { + if x != nil { + return x.Date + } + return nil +} + +func (x *Album) GetPopularity() int32 { + if x != nil && x.Popularity != nil { + return *x.Popularity + } + return 0 +} + +func (x *Album) GetGenre() []string { + if x != nil { + return x.Genre + } + return nil +} + +func (x *Album) GetCover() []*Image { + if x != nil { + return x.Cover + } + return nil +} + +func (x *Album) GetExternalId() []*ExternalId { + if x != nil { + return x.ExternalId + } + return nil +} + +func (x *Album) GetDisc() []*Disc { + if x != nil { + return x.Disc + } + return nil +} + +func (x *Album) GetReview() []string { + if x != nil { + return x.Review + } + return nil +} + +func (x *Album) GetCopyright() []*Copyright { + if x != nil { + return x.Copyright + } + return nil +} + +func (x *Album) GetRestriction() []*Restriction { + if x != nil { + return x.Restriction + } + return nil +} + +func (x *Album) GetRelated() []*Album { + if x != nil { + return x.Related + } + return nil +} + +func (x *Album) GetSalePeriod() []*SalePeriod { + if x != nil { + return x.SalePeriod + } + return nil +} + +func (x *Album) GetCoverGroup() *ImageGroup { + if x != nil { + return x.CoverGroup + } + return nil +} + +func (x *Album) GetOriginalTitle() string { + if x != nil && x.OriginalTitle != nil { + return *x.OriginalTitle + } + return "" +} + +func (x *Album) GetVersionTitle() string { + if x != nil && x.VersionTitle != nil { + return *x.VersionTitle + } + return "" +} + +func (x *Album) GetTypeStr() string { + if x != nil && x.TypeStr != nil { + return *x.TypeStr + } + return "" +} + +func (x *Album) GetAvailability() []*Availability { + if x != nil { + return x.Availability + } + return nil +} + +type Track struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Gid []byte `protobuf:"bytes,1,opt,name=gid" json:"gid,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Album *Album `protobuf:"bytes,3,opt,name=album" json:"album,omitempty"` + Artist []*Artist `protobuf:"bytes,4,rep,name=artist" json:"artist,omitempty"` + Number *int32 `protobuf:"zigzag32,5,opt,name=number" json:"number,omitempty"` + DiscNumber *int32 `protobuf:"zigzag32,6,opt,name=disc_number,json=discNumber" json:"disc_number,omitempty"` + Duration *int32 `protobuf:"zigzag32,7,opt,name=duration" json:"duration,omitempty"` + Popularity *int32 `protobuf:"zigzag32,8,opt,name=popularity" json:"popularity,omitempty"` + Explicit *bool `protobuf:"varint,9,opt,name=explicit" json:"explicit,omitempty"` + ExternalId []*ExternalId `protobuf:"bytes,10,rep,name=external_id,json=externalId" json:"external_id,omitempty"` + Restriction []*Restriction `protobuf:"bytes,11,rep,name=restriction" json:"restriction,omitempty"` + File []*AudioFile `protobuf:"bytes,12,rep,name=file" json:"file,omitempty"` + Alternative []*Track `protobuf:"bytes,13,rep,name=alternative" json:"alternative,omitempty"` + SalePeriod []*SalePeriod `protobuf:"bytes,14,rep,name=sale_period,json=salePeriod" json:"sale_period,omitempty"` + Preview []*AudioFile `protobuf:"bytes,15,rep,name=preview" json:"preview,omitempty"` + Tags []string `protobuf:"bytes,16,rep,name=tags" json:"tags,omitempty"` + EarliestLiveTimestamp *int64 `protobuf:"varint,17,opt,name=earliest_live_timestamp,json=earliestLiveTimestamp" json:"earliest_live_timestamp,omitempty"` + HasLyrics *bool `protobuf:"varint,18,opt,name=has_lyrics,json=hasLyrics" json:"has_lyrics,omitempty"` + Availability []*Availability `protobuf:"bytes,19,rep,name=availability" json:"availability,omitempty"` + Licensor *Licensor `protobuf:"bytes,21,opt,name=licensor" json:"licensor,omitempty"` + LanguageOfPerformance []string `protobuf:"bytes,22,rep,name=language_of_performance,json=languageOfPerformance" json:"language_of_performance,omitempty"` + ContentRating []*ContentRating `protobuf:"bytes,25,rep,name=content_rating,json=contentRating" json:"content_rating,omitempty"` + OriginalTitle *string `protobuf:"bytes,27,opt,name=original_title,json=originalTitle" json:"original_title,omitempty"` + VersionTitle *string `protobuf:"bytes,28,opt,name=version_title,json=versionTitle" json:"version_title,omitempty"` + ArtistWithRole []*ArtistWithRole `protobuf:"bytes,32,rep,name=artist_with_role,json=artistWithRole" json:"artist_with_role,omitempty"` +} + +func (x *Track) Reset() { + *x = Track{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Track) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Track) ProtoMessage() {} + +func (x *Track) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Track.ProtoReflect.Descriptor instead. +func (*Track) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{2} +} + +func (x *Track) GetGid() []byte { + if x != nil { + return x.Gid + } + return nil +} + +func (x *Track) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *Track) GetAlbum() *Album { + if x != nil { + return x.Album + } + return nil +} + +func (x *Track) GetArtist() []*Artist { + if x != nil { + return x.Artist + } + return nil +} + +func (x *Track) GetNumber() int32 { + if x != nil && x.Number != nil { + return *x.Number + } + return 0 +} + +func (x *Track) GetDiscNumber() int32 { + if x != nil && x.DiscNumber != nil { + return *x.DiscNumber + } + return 0 +} + +func (x *Track) GetDuration() int32 { + if x != nil && x.Duration != nil { + return *x.Duration + } + return 0 +} + +func (x *Track) GetPopularity() int32 { + if x != nil && x.Popularity != nil { + return *x.Popularity + } + return 0 +} + +func (x *Track) GetExplicit() bool { + if x != nil && x.Explicit != nil { + return *x.Explicit + } + return false +} + +func (x *Track) GetExternalId() []*ExternalId { + if x != nil { + return x.ExternalId + } + return nil +} + +func (x *Track) GetRestriction() []*Restriction { + if x != nil { + return x.Restriction + } + return nil +} + +func (x *Track) GetFile() []*AudioFile { + if x != nil { + return x.File + } + return nil +} + +func (x *Track) GetAlternative() []*Track { + if x != nil { + return x.Alternative + } + return nil +} + +func (x *Track) GetSalePeriod() []*SalePeriod { + if x != nil { + return x.SalePeriod + } + return nil +} + +func (x *Track) GetPreview() []*AudioFile { + if x != nil { + return x.Preview + } + return nil +} + +func (x *Track) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Track) GetEarliestLiveTimestamp() int64 { + if x != nil && x.EarliestLiveTimestamp != nil { + return *x.EarliestLiveTimestamp + } + return 0 +} + +func (x *Track) GetHasLyrics() bool { + if x != nil && x.HasLyrics != nil { + return *x.HasLyrics + } + return false +} + +func (x *Track) GetAvailability() []*Availability { + if x != nil { + return x.Availability + } + return nil +} + +func (x *Track) GetLicensor() *Licensor { + if x != nil { + return x.Licensor + } + return nil +} + +func (x *Track) GetLanguageOfPerformance() []string { + if x != nil { + return x.LanguageOfPerformance + } + return nil +} + +func (x *Track) GetContentRating() []*ContentRating { + if x != nil { + return x.ContentRating + } + return nil +} + +func (x *Track) GetOriginalTitle() string { + if x != nil && x.OriginalTitle != nil { + return *x.OriginalTitle + } + return "" +} + +func (x *Track) GetVersionTitle() string { + if x != nil && x.VersionTitle != nil { + return *x.VersionTitle + } + return "" +} + +func (x *Track) GetArtistWithRole() []*ArtistWithRole { + if x != nil { + return x.ArtistWithRole + } + return nil +} + +type ArtistWithRole struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ArtistGid []byte `protobuf:"bytes,1,opt,name=artist_gid,json=artistGid" json:"artist_gid,omitempty"` + ArtistName *string `protobuf:"bytes,2,opt,name=artist_name,json=artistName" json:"artist_name,omitempty"` + Role *ArtistWithRole_ArtistRole `protobuf:"varint,3,opt,name=role,enum=spotify.metadata.ArtistWithRole_ArtistRole" json:"role,omitempty"` +} + +func (x *ArtistWithRole) Reset() { + *x = ArtistWithRole{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ArtistWithRole) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ArtistWithRole) ProtoMessage() {} + +func (x *ArtistWithRole) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ArtistWithRole.ProtoReflect.Descriptor instead. +func (*ArtistWithRole) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{3} +} + +func (x *ArtistWithRole) GetArtistGid() []byte { + if x != nil { + return x.ArtistGid + } + return nil +} + +func (x *ArtistWithRole) GetArtistName() string { + if x != nil && x.ArtistName != nil { + return *x.ArtistName + } + return "" +} + +func (x *ArtistWithRole) GetRole() ArtistWithRole_ArtistRole { + if x != nil && x.Role != nil { + return *x.Role + } + return ArtistWithRole_ARTIST_ROLE_UNKNOWN +} + +type Show struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Gid []byte `protobuf:"bytes,1,opt,name=gid" json:"gid,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Description *string `protobuf:"bytes,64,opt,name=description" json:"description,omitempty"` + DeprecatedPopularity *int32 `protobuf:"zigzag32,65,opt,name=deprecated_popularity,json=deprecatedPopularity" json:"deprecated_popularity,omitempty"` + Publisher *string `protobuf:"bytes,66,opt,name=publisher" json:"publisher,omitempty"` + Language *string `protobuf:"bytes,67,opt,name=language" json:"language,omitempty"` + Explicit *bool `protobuf:"varint,68,opt,name=explicit" json:"explicit,omitempty"` + CoverImage *ImageGroup `protobuf:"bytes,69,opt,name=cover_image,json=coverImage" json:"cover_image,omitempty"` + Episode []*Episode `protobuf:"bytes,70,rep,name=episode" json:"episode,omitempty"` + Copyright []*Copyright `protobuf:"bytes,71,rep,name=copyright" json:"copyright,omitempty"` + Restriction []*Restriction `protobuf:"bytes,72,rep,name=restriction" json:"restriction,omitempty"` + Keyword []string `protobuf:"bytes,73,rep,name=keyword" json:"keyword,omitempty"` + MediaType *Show_MediaType `protobuf:"varint,74,opt,name=media_type,json=mediaType,enum=spotify.metadata.Show_MediaType" json:"media_type,omitempty"` + ConsumptionOrder *Show_ConsumptionOrder `protobuf:"varint,75,opt,name=consumption_order,json=consumptionOrder,enum=spotify.metadata.Show_ConsumptionOrder" json:"consumption_order,omitempty"` + Availability []*Availability `protobuf:"bytes,78,rep,name=availability" json:"availability,omitempty"` + TrailerUri *string `protobuf:"bytes,83,opt,name=trailer_uri,json=trailerUri" json:"trailer_uri,omitempty"` + MusicAndTalk *bool `protobuf:"varint,85,opt,name=music_and_talk,json=musicAndTalk" json:"music_and_talk,omitempty"` + IsAudiobook *bool `protobuf:"varint,89,opt,name=is_audiobook,json=isAudiobook" json:"is_audiobook,omitempty"` +} + +func (x *Show) Reset() { + *x = Show{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Show) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Show) ProtoMessage() {} + +func (x *Show) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Show.ProtoReflect.Descriptor instead. +func (*Show) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{4} +} + +func (x *Show) GetGid() []byte { + if x != nil { + return x.Gid + } + return nil +} + +func (x *Show) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *Show) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *Show) GetDeprecatedPopularity() int32 { + if x != nil && x.DeprecatedPopularity != nil { + return *x.DeprecatedPopularity + } + return 0 +} + +func (x *Show) GetPublisher() string { + if x != nil && x.Publisher != nil { + return *x.Publisher + } + return "" +} + +func (x *Show) GetLanguage() string { + if x != nil && x.Language != nil { + return *x.Language + } + return "" +} + +func (x *Show) GetExplicit() bool { + if x != nil && x.Explicit != nil { + return *x.Explicit + } + return false +} + +func (x *Show) GetCoverImage() *ImageGroup { + if x != nil { + return x.CoverImage + } + return nil +} + +func (x *Show) GetEpisode() []*Episode { + if x != nil { + return x.Episode + } + return nil +} + +func (x *Show) GetCopyright() []*Copyright { + if x != nil { + return x.Copyright + } + return nil +} + +func (x *Show) GetRestriction() []*Restriction { + if x != nil { + return x.Restriction + } + return nil +} + +func (x *Show) GetKeyword() []string { + if x != nil { + return x.Keyword + } + return nil +} + +func (x *Show) GetMediaType() Show_MediaType { + if x != nil && x.MediaType != nil { + return *x.MediaType + } + return Show_MIXED +} + +func (x *Show) GetConsumptionOrder() Show_ConsumptionOrder { + if x != nil && x.ConsumptionOrder != nil { + return *x.ConsumptionOrder + } + return Show_SEQUENTIAL +} + +func (x *Show) GetAvailability() []*Availability { + if x != nil { + return x.Availability + } + return nil +} + +func (x *Show) GetTrailerUri() string { + if x != nil && x.TrailerUri != nil { + return *x.TrailerUri + } + return "" +} + +func (x *Show) GetMusicAndTalk() bool { + if x != nil && x.MusicAndTalk != nil { + return *x.MusicAndTalk + } + return false +} + +func (x *Show) GetIsAudiobook() bool { + if x != nil && x.IsAudiobook != nil { + return *x.IsAudiobook + } + return false +} + +type Episode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Gid []byte `protobuf:"bytes,1,opt,name=gid" json:"gid,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Duration *int32 `protobuf:"zigzag32,7,opt,name=duration" json:"duration,omitempty"` + Audio []*AudioFile `protobuf:"bytes,12,rep,name=audio" json:"audio,omitempty"` + Description *string `protobuf:"bytes,64,opt,name=description" json:"description,omitempty"` + Number *int32 `protobuf:"zigzag32,65,opt,name=number" json:"number,omitempty"` + PublishTime *Date `protobuf:"bytes,66,opt,name=publish_time,json=publishTime" json:"publish_time,omitempty"` + DeprecatedPopularity *int32 `protobuf:"zigzag32,67,opt,name=deprecated_popularity,json=deprecatedPopularity" json:"deprecated_popularity,omitempty"` + CoverImage *ImageGroup `protobuf:"bytes,68,opt,name=cover_image,json=coverImage" json:"cover_image,omitempty"` + Language *string `protobuf:"bytes,69,opt,name=language" json:"language,omitempty"` + Explicit *bool `protobuf:"varint,70,opt,name=explicit" json:"explicit,omitempty"` + Show *Show `protobuf:"bytes,71,opt,name=show" json:"show,omitempty"` + Video []*VideoFile `protobuf:"bytes,72,rep,name=video" json:"video,omitempty"` + VideoPreview []*VideoFile `protobuf:"bytes,73,rep,name=video_preview,json=videoPreview" json:"video_preview,omitempty"` + AudioPreview []*AudioFile `protobuf:"bytes,74,rep,name=audio_preview,json=audioPreview" json:"audio_preview,omitempty"` + Restriction []*Restriction `protobuf:"bytes,75,rep,name=restriction" json:"restriction,omitempty"` + FreezeFrame *ImageGroup `protobuf:"bytes,76,opt,name=freeze_frame,json=freezeFrame" json:"freeze_frame,omitempty"` + Keyword []string `protobuf:"bytes,77,rep,name=keyword" json:"keyword,omitempty"` + AllowBackgroundPlayback *bool `protobuf:"varint,81,opt,name=allow_background_playback,json=allowBackgroundPlayback" json:"allow_background_playback,omitempty"` + Availability []*Availability `protobuf:"bytes,82,rep,name=availability" json:"availability,omitempty"` + ExternalUrl *string `protobuf:"bytes,83,opt,name=external_url,json=externalUrl" json:"external_url,omitempty"` + Type *Episode_EpisodeType `protobuf:"varint,87,opt,name=type,enum=spotify.metadata.Episode_EpisodeType" json:"type,omitempty"` + MusicAndTalk *bool `protobuf:"varint,91,opt,name=music_and_talk,json=musicAndTalk" json:"music_and_talk,omitempty"` + ContentRating []*ContentRating `protobuf:"bytes,95,rep,name=content_rating,json=contentRating" json:"content_rating,omitempty"` + IsAudiobookChapter *bool `protobuf:"varint,96,opt,name=is_audiobook_chapter,json=isAudiobookChapter" json:"is_audiobook_chapter,omitempty"` +} + +func (x *Episode) Reset() { + *x = Episode{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Episode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Episode) ProtoMessage() {} + +func (x *Episode) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Episode.ProtoReflect.Descriptor instead. +func (*Episode) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{5} +} + +func (x *Episode) GetGid() []byte { + if x != nil { + return x.Gid + } + return nil +} + +func (x *Episode) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *Episode) GetDuration() int32 { + if x != nil && x.Duration != nil { + return *x.Duration + } + return 0 +} + +func (x *Episode) GetAudio() []*AudioFile { + if x != nil { + return x.Audio + } + return nil +} + +func (x *Episode) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *Episode) GetNumber() int32 { + if x != nil && x.Number != nil { + return *x.Number + } + return 0 +} + +func (x *Episode) GetPublishTime() *Date { + if x != nil { + return x.PublishTime + } + return nil +} + +func (x *Episode) GetDeprecatedPopularity() int32 { + if x != nil && x.DeprecatedPopularity != nil { + return *x.DeprecatedPopularity + } + return 0 +} + +func (x *Episode) GetCoverImage() *ImageGroup { + if x != nil { + return x.CoverImage + } + return nil +} + +func (x *Episode) GetLanguage() string { + if x != nil && x.Language != nil { + return *x.Language + } + return "" +} + +func (x *Episode) GetExplicit() bool { + if x != nil && x.Explicit != nil { + return *x.Explicit + } + return false +} + +func (x *Episode) GetShow() *Show { + if x != nil { + return x.Show + } + return nil +} + +func (x *Episode) GetVideo() []*VideoFile { + if x != nil { + return x.Video + } + return nil +} + +func (x *Episode) GetVideoPreview() []*VideoFile { + if x != nil { + return x.VideoPreview + } + return nil +} + +func (x *Episode) GetAudioPreview() []*AudioFile { + if x != nil { + return x.AudioPreview + } + return nil +} + +func (x *Episode) GetRestriction() []*Restriction { + if x != nil { + return x.Restriction + } + return nil +} + +func (x *Episode) GetFreezeFrame() *ImageGroup { + if x != nil { + return x.FreezeFrame + } + return nil +} + +func (x *Episode) GetKeyword() []string { + if x != nil { + return x.Keyword + } + return nil +} + +func (x *Episode) GetAllowBackgroundPlayback() bool { + if x != nil && x.AllowBackgroundPlayback != nil { + return *x.AllowBackgroundPlayback + } + return false +} + +func (x *Episode) GetAvailability() []*Availability { + if x != nil { + return x.Availability + } + return nil +} + +func (x *Episode) GetExternalUrl() string { + if x != nil && x.ExternalUrl != nil { + return *x.ExternalUrl + } + return "" +} + +func (x *Episode) GetType() Episode_EpisodeType { + if x != nil && x.Type != nil { + return *x.Type + } + return Episode_FULL +} + +func (x *Episode) GetMusicAndTalk() bool { + if x != nil && x.MusicAndTalk != nil { + return *x.MusicAndTalk + } + return false +} + +func (x *Episode) GetContentRating() []*ContentRating { + if x != nil { + return x.ContentRating + } + return nil +} + +func (x *Episode) GetIsAudiobookChapter() bool { + if x != nil && x.IsAudiobookChapter != nil { + return *x.IsAudiobookChapter + } + return false +} + +type Licensor struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uuid []byte `protobuf:"bytes,1,opt,name=uuid" json:"uuid,omitempty"` +} + +func (x *Licensor) Reset() { + *x = Licensor{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Licensor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Licensor) ProtoMessage() {} + +func (x *Licensor) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Licensor.ProtoReflect.Descriptor instead. +func (*Licensor) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{6} +} + +func (x *Licensor) GetUuid() []byte { + if x != nil { + return x.Uuid + } + return nil +} + +type TopTracks struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Country *string `protobuf:"bytes,1,opt,name=country" json:"country,omitempty"` + Track []*Track `protobuf:"bytes,2,rep,name=track" json:"track,omitempty"` +} + +func (x *TopTracks) Reset() { + *x = TopTracks{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TopTracks) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TopTracks) ProtoMessage() {} + +func (x *TopTracks) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TopTracks.ProtoReflect.Descriptor instead. +func (*TopTracks) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{7} +} + +func (x *TopTracks) GetCountry() string { + if x != nil && x.Country != nil { + return *x.Country + } + return "" +} + +func (x *TopTracks) GetTrack() []*Track { + if x != nil { + return x.Track + } + return nil +} + +type ActivityPeriod struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StartYear *int32 `protobuf:"zigzag32,1,opt,name=start_year,json=startYear" json:"start_year,omitempty"` + EndYear *int32 `protobuf:"zigzag32,2,opt,name=end_year,json=endYear" json:"end_year,omitempty"` + Decade *int32 `protobuf:"zigzag32,3,opt,name=decade" json:"decade,omitempty"` +} + +func (x *ActivityPeriod) Reset() { + *x = ActivityPeriod{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActivityPeriod) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActivityPeriod) ProtoMessage() {} + +func (x *ActivityPeriod) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActivityPeriod.ProtoReflect.Descriptor instead. +func (*ActivityPeriod) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{8} +} + +func (x *ActivityPeriod) GetStartYear() int32 { + if x != nil && x.StartYear != nil { + return *x.StartYear + } + return 0 +} + +func (x *ActivityPeriod) GetEndYear() int32 { + if x != nil && x.EndYear != nil { + return *x.EndYear + } + return 0 +} + +func (x *ActivityPeriod) GetDecade() int32 { + if x != nil && x.Decade != nil { + return *x.Decade + } + return 0 +} + +type AlbumGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Album []*Album `protobuf:"bytes,1,rep,name=album" json:"album,omitempty"` +} + +func (x *AlbumGroup) Reset() { + *x = AlbumGroup{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AlbumGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlbumGroup) ProtoMessage() {} + +func (x *AlbumGroup) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AlbumGroup.ProtoReflect.Descriptor instead. +func (*AlbumGroup) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{9} +} + +func (x *AlbumGroup) GetAlbum() []*Album { + if x != nil { + return x.Album + } + return nil +} + +type Date struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Year *int32 `protobuf:"zigzag32,1,opt,name=year" json:"year,omitempty"` + Month *int32 `protobuf:"zigzag32,2,opt,name=month" json:"month,omitempty"` + Day *int32 `protobuf:"zigzag32,3,opt,name=day" json:"day,omitempty"` + Hour *int32 `protobuf:"zigzag32,4,opt,name=hour" json:"hour,omitempty"` + Minute *int32 `protobuf:"zigzag32,5,opt,name=minute" json:"minute,omitempty"` +} + +func (x *Date) Reset() { + *x = Date{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Date) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Date) ProtoMessage() {} + +func (x *Date) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Date.ProtoReflect.Descriptor instead. +func (*Date) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{10} +} + +func (x *Date) GetYear() int32 { + if x != nil && x.Year != nil { + return *x.Year + } + return 0 +} + +func (x *Date) GetMonth() int32 { + if x != nil && x.Month != nil { + return *x.Month + } + return 0 +} + +func (x *Date) GetDay() int32 { + if x != nil && x.Day != nil { + return *x.Day + } + return 0 +} + +func (x *Date) GetHour() int32 { + if x != nil && x.Hour != nil { + return *x.Hour + } + return 0 +} + +func (x *Date) GetMinute() int32 { + if x != nil && x.Minute != nil { + return *x.Minute + } + return 0 +} + +type Image struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileId []byte `protobuf:"bytes,1,opt,name=file_id,json=fileId" json:"file_id,omitempty"` + Size *Image_Size `protobuf:"varint,2,opt,name=size,enum=spotify.metadata.Image_Size" json:"size,omitempty"` + Width *int32 `protobuf:"zigzag32,3,opt,name=width" json:"width,omitempty"` + Height *int32 `protobuf:"zigzag32,4,opt,name=height" json:"height,omitempty"` +} + +func (x *Image) Reset() { + *x = Image{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Image) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Image) ProtoMessage() {} + +func (x *Image) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Image.ProtoReflect.Descriptor instead. +func (*Image) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{11} +} + +func (x *Image) GetFileId() []byte { + if x != nil { + return x.FileId + } + return nil +} + +func (x *Image) GetSize() Image_Size { + if x != nil && x.Size != nil { + return *x.Size + } + return Image_DEFAULT +} + +func (x *Image) GetWidth() int32 { + if x != nil && x.Width != nil { + return *x.Width + } + return 0 +} + +func (x *Image) GetHeight() int32 { + if x != nil && x.Height != nil { + return *x.Height + } + return 0 +} + +type ImageGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Image []*Image `protobuf:"bytes,1,rep,name=image" json:"image,omitempty"` +} + +func (x *ImageGroup) Reset() { + *x = ImageGroup{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImageGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImageGroup) ProtoMessage() {} + +func (x *ImageGroup) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImageGroup.ProtoReflect.Descriptor instead. +func (*ImageGroup) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{12} +} + +func (x *ImageGroup) GetImage() []*Image { + if x != nil { + return x.Image + } + return nil +} + +type Biography struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Text *string `protobuf:"bytes,1,opt,name=text" json:"text,omitempty"` + Portrait []*Image `protobuf:"bytes,2,rep,name=portrait" json:"portrait,omitempty"` + PortraitGroup []*ImageGroup `protobuf:"bytes,3,rep,name=portrait_group,json=portraitGroup" json:"portrait_group,omitempty"` +} + +func (x *Biography) Reset() { + *x = Biography{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Biography) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Biography) ProtoMessage() {} + +func (x *Biography) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Biography.ProtoReflect.Descriptor instead. +func (*Biography) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{13} +} + +func (x *Biography) GetText() string { + if x != nil && x.Text != nil { + return *x.Text + } + return "" +} + +func (x *Biography) GetPortrait() []*Image { + if x != nil { + return x.Portrait + } + return nil +} + +func (x *Biography) GetPortraitGroup() []*ImageGroup { + if x != nil { + return x.PortraitGroup + } + return nil +} + +type Disc struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number *int32 `protobuf:"zigzag32,1,opt,name=number" json:"number,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Track []*Track `protobuf:"bytes,3,rep,name=track" json:"track,omitempty"` +} + +func (x *Disc) Reset() { + *x = Disc{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Disc) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Disc) ProtoMessage() {} + +func (x *Disc) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Disc.ProtoReflect.Descriptor instead. +func (*Disc) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{14} +} + +func (x *Disc) GetNumber() int32 { + if x != nil && x.Number != nil { + return *x.Number + } + return 0 +} + +func (x *Disc) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *Disc) GetTrack() []*Track { + if x != nil { + return x.Track + } + return nil +} + +type Copyright struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *Copyright_Type `protobuf:"varint,1,opt,name=type,enum=spotify.metadata.Copyright_Type" json:"type,omitempty"` + Text *string `protobuf:"bytes,2,opt,name=text" json:"text,omitempty"` +} + +func (x *Copyright) Reset() { + *x = Copyright{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Copyright) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Copyright) ProtoMessage() {} + +func (x *Copyright) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Copyright.ProtoReflect.Descriptor instead. +func (*Copyright) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{15} +} + +func (x *Copyright) GetType() Copyright_Type { + if x != nil && x.Type != nil { + return *x.Type + } + return Copyright_P +} + +func (x *Copyright) GetText() string { + if x != nil && x.Text != nil { + return *x.Text + } + return "" +} + +type Restriction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Catalogue []Restriction_Catalogue `protobuf:"varint,1,rep,name=catalogue,enum=spotify.metadata.Restriction_Catalogue" json:"catalogue,omitempty"` + Type *Restriction_Type `protobuf:"varint,4,opt,name=type,enum=spotify.metadata.Restriction_Type" json:"type,omitempty"` + CatalogueStr []string `protobuf:"bytes,5,rep,name=catalogue_str,json=catalogueStr" json:"catalogue_str,omitempty"` + // Types that are assignable to CountryRestriction: + // + // *Restriction_CountriesAllowed + // *Restriction_CountriesForbidden + CountryRestriction isRestriction_CountryRestriction `protobuf_oneof:"country_restriction"` +} + +func (x *Restriction) Reset() { + *x = Restriction{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Restriction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Restriction) ProtoMessage() {} + +func (x *Restriction) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Restriction.ProtoReflect.Descriptor instead. +func (*Restriction) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{16} +} + +func (x *Restriction) GetCatalogue() []Restriction_Catalogue { + if x != nil { + return x.Catalogue + } + return nil +} + +func (x *Restriction) GetType() Restriction_Type { + if x != nil && x.Type != nil { + return *x.Type + } + return Restriction_STREAMING +} + +func (x *Restriction) GetCatalogueStr() []string { + if x != nil { + return x.CatalogueStr + } + return nil +} + +func (m *Restriction) GetCountryRestriction() isRestriction_CountryRestriction { + if m != nil { + return m.CountryRestriction + } + return nil +} + +func (x *Restriction) GetCountriesAllowed() string { + if x, ok := x.GetCountryRestriction().(*Restriction_CountriesAllowed); ok { + return x.CountriesAllowed + } + return "" +} + +func (x *Restriction) GetCountriesForbidden() string { + if x, ok := x.GetCountryRestriction().(*Restriction_CountriesForbidden); ok { + return x.CountriesForbidden + } + return "" +} + +type isRestriction_CountryRestriction interface { + isRestriction_CountryRestriction() +} + +type Restriction_CountriesAllowed struct { + CountriesAllowed string `protobuf:"bytes,2,opt,name=countries_allowed,json=countriesAllowed,oneof"` +} + +type Restriction_CountriesForbidden struct { + CountriesForbidden string `protobuf:"bytes,3,opt,name=countries_forbidden,json=countriesForbidden,oneof"` +} + +func (*Restriction_CountriesAllowed) isRestriction_CountryRestriction() {} + +func (*Restriction_CountriesForbidden) isRestriction_CountryRestriction() {} + +type Availability struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CatalogueStr []string `protobuf:"bytes,1,rep,name=catalogue_str,json=catalogueStr" json:"catalogue_str,omitempty"` + Start *Date `protobuf:"bytes,2,opt,name=start" json:"start,omitempty"` +} + +func (x *Availability) Reset() { + *x = Availability{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Availability) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Availability) ProtoMessage() {} + +func (x *Availability) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Availability.ProtoReflect.Descriptor instead. +func (*Availability) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{17} +} + +func (x *Availability) GetCatalogueStr() []string { + if x != nil { + return x.CatalogueStr + } + return nil +} + +func (x *Availability) GetStart() *Date { + if x != nil { + return x.Start + } + return nil +} + +type SalePeriod struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Restriction []*Restriction `protobuf:"bytes,1,rep,name=restriction" json:"restriction,omitempty"` + Start *Date `protobuf:"bytes,2,opt,name=start" json:"start,omitempty"` + End *Date `protobuf:"bytes,3,opt,name=end" json:"end,omitempty"` +} + +func (x *SalePeriod) Reset() { + *x = SalePeriod{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SalePeriod) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SalePeriod) ProtoMessage() {} + +func (x *SalePeriod) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SalePeriod.ProtoReflect.Descriptor instead. +func (*SalePeriod) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{18} +} + +func (x *SalePeriod) GetRestriction() []*Restriction { + if x != nil { + return x.Restriction + } + return nil +} + +func (x *SalePeriod) GetStart() *Date { + if x != nil { + return x.Start + } + return nil +} + +func (x *SalePeriod) GetEnd() *Date { + if x != nil { + return x.End + } + return nil +} + +type ExternalId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` + Id *string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"` +} + +func (x *ExternalId) Reset() { + *x = ExternalId{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExternalId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalId) ProtoMessage() {} + +func (x *ExternalId) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExternalId.ProtoReflect.Descriptor instead. +func (*ExternalId) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{19} +} + +func (x *ExternalId) GetType() string { + if x != nil && x.Type != nil { + return *x.Type + } + return "" +} + +func (x *ExternalId) GetId() string { + if x != nil && x.Id != nil { + return *x.Id + } + return "" +} + +type AudioFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileId []byte `protobuf:"bytes,1,opt,name=file_id,json=fileId" json:"file_id,omitempty"` + Format *AudioFile_Format `protobuf:"varint,2,opt,name=format,enum=spotify.metadata.AudioFile_Format" json:"format,omitempty"` +} + +func (x *AudioFile) Reset() { + *x = AudioFile{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AudioFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AudioFile) ProtoMessage() {} + +func (x *AudioFile) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AudioFile.ProtoReflect.Descriptor instead. +func (*AudioFile) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{20} +} + +func (x *AudioFile) GetFileId() []byte { + if x != nil { + return x.FileId + } + return nil +} + +func (x *AudioFile) GetFormat() AudioFile_Format { + if x != nil && x.Format != nil { + return *x.Format + } + return AudioFile_OGG_VORBIS_96 +} + +type VideoFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FileId []byte `protobuf:"bytes,1,opt,name=file_id,json=fileId" json:"file_id,omitempty"` +} + +func (x *VideoFile) Reset() { + *x = VideoFile{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VideoFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VideoFile) ProtoMessage() {} + +func (x *VideoFile) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VideoFile.ProtoReflect.Descriptor instead. +func (*VideoFile) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{21} +} + +func (x *VideoFile) GetFileId() []byte { + if x != nil { + return x.FileId + } + return nil +} + +type ContentRating struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Country *string `protobuf:"bytes,1,opt,name=country" json:"country,omitempty"` + Tag []string `protobuf:"bytes,2,rep,name=tag" json:"tag,omitempty"` +} + +func (x *ContentRating) Reset() { + *x = ContentRating{} + if protoimpl.UnsafeEnabled { + mi := &file_metadata_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContentRating) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContentRating) ProtoMessage() {} + +func (x *ContentRating) ProtoReflect() protoreflect.Message { + mi := &file_metadata_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContentRating.ProtoReflect.Descriptor instead. +func (*ContentRating) Descriptor() ([]byte, []int) { + return file_metadata_proto_rawDescGZIP(), []int{22} +} + +func (x *ContentRating) GetCountry() string { + if x != nil && x.Country != nil { + return *x.Country + } + return "" +} + +func (x *ContentRating) GetTag() []string { + if x != nil { + return x.Tag + } + return nil +} + +var File_metadata_proto protoreflect.FileDescriptor + +var file_metadata_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x10, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x9f, 0x08, 0x0a, 0x06, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0a, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x3d, 0x0a, + 0x0b, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x0a, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x3f, 0x0a, 0x0c, + 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x49, 0x0a, + 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6c, 0x62, 0x75, + 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x46, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x65, + 0x61, 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x0e, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x4f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, + 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x62, 0x69, + 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x42, 0x69, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x52, 0x09, 0x62, 0x69, 0x6f, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x79, 0x12, 0x49, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x3f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x72, 0x61, 0x69, 0x74, 0x5f, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x72, 0x61, + 0x69, 0x74, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0e, + 0x70, 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x0d, 0x70, 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x61, 0x6c, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x61, 0x6c, 0x65, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x52, 0x0a, 0x73, 0x61, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x42, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x22, 0xe7, 0x07, 0x0a, 0x05, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x12, 0x10, + 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x67, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x52, 0x06, + 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x2a, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x44, 0x61, 0x74, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, + 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0a, + 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, + 0x6e, 0x72, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, + 0x12, 0x2d, 0x0a, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, + 0x3d, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x64, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x2a, + 0x0a, 0x04, 0x64, 0x69, 0x73, 0x63, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x44, 0x69, 0x73, 0x63, 0x52, 0x04, 0x64, 0x69, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, + 0x68, 0x74, 0x52, 0x09, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3f, 0x0a, + 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, + 0x0a, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x52, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x61, 0x6c, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x61, 0x6c, 0x65, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x52, 0x0a, 0x73, 0x61, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x3d, 0x0a, 0x0b, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x25, 0x0a, 0x0e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x12, 0x42, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x52, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x42, 0x55, 0x4d, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, + 0x50, 0x49, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x50, + 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x42, 0x4f, 0x4f, 0x4b, 0x10, + 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4f, 0x44, 0x43, 0x41, 0x53, 0x54, 0x10, 0x06, 0x22, 0x80, + 0x09, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, + 0x0a, 0x05, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x52, 0x05, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x12, 0x30, 0x0a, + 0x06, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x52, 0x06, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x63, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0a, 0x64, 0x69, + 0x73, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0a, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, + 0x12, 0x3d, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x64, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, + 0x3f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2f, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, + 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, + 0x0b, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3d, 0x0a, 0x0b, + 0x73, 0x61, 0x6c, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0e, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x61, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, + 0x0a, 0x73, 0x61, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x35, 0x0a, 0x07, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x41, 0x75, 0x64, 0x69, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, + 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, + 0x74, 0x4c, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, + 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x79, 0x72, 0x69, 0x63, 0x73, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x4c, 0x79, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, + 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x36, 0x0a, 0x08, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x52, + 0x08, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x6c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x4f, 0x66, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x69, 0x74, 0x6c, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x4a, 0x0a, 0x10, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x52, 0x6f, 0x6c, + 0x65, 0x52, 0x0e, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x52, 0x6f, 0x6c, + 0x65, 0x22, 0xf7, 0x02, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x5f, 0x67, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, + 0x47, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, + 0x52, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0xe3, 0x01, 0x0a, 0x0a, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1b, 0x0a, + 0x17, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x49, + 0x4e, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x52, + 0x54, 0x49, 0x53, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, + 0x45, 0x44, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x41, + 0x52, 0x54, 0x49, 0x53, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x49, 0x58, + 0x45, 0x52, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x41, + 0x52, 0x54, 0x49, 0x53, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4f, + 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x5f, + 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x55, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x06, + 0x12, 0x19, 0x0a, 0x15, 0x41, 0x52, 0x54, 0x49, 0x53, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, + 0x4f, 0x52, 0x43, 0x48, 0x45, 0x53, 0x54, 0x52, 0x41, 0x10, 0x07, 0x22, 0x94, 0x07, 0x0a, 0x04, + 0x53, 0x68, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x15, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x70, 0x75, 0x6c, + 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x41, 0x20, 0x01, 0x28, 0x11, 0x52, 0x14, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x18, 0x42, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x43, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, + 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, + 0x65, 0x18, 0x46, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x70, 0x69, 0x73, 0x6f, + 0x64, 0x65, 0x52, 0x07, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x63, + 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x52, 0x09, 0x63, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, + 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x49, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x4a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x6f, 0x77, 0x2e, 0x4d, 0x65, + 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x68, 0x6f, 0x77, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x4e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x53, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x55, 0x72, 0x69, 0x12, 0x24, 0x0a, + 0x0e, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x6c, 0x6b, 0x18, + 0x55, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x41, 0x6e, 0x64, 0x54, + 0x61, 0x6c, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x62, + 0x6f, 0x6f, 0x6b, 0x18, 0x59, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x75, 0x64, + 0x69, 0x6f, 0x62, 0x6f, 0x6f, 0x6b, 0x22, 0x2c, 0x0a, 0x09, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x49, 0x58, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x49, 0x44, + 0x45, 0x4f, 0x10, 0x02, 0x22, 0x3c, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x45, 0x51, 0x55, + 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x50, 0x49, 0x53, + 0x4f, 0x44, 0x49, 0x43, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x43, 0x45, 0x4e, 0x54, + 0x10, 0x03, 0x22, 0xcd, 0x09, 0x0a, 0x07, 0x45, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x67, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x31, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x61, 0x75, + 0x64, 0x69, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x41, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x39, 0x0a, + 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x42, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x43, 0x20, 0x01, 0x28, 0x11, 0x52, 0x14, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3d, 0x0a, + 0x0b, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x44, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x45, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x73, 0x68, 0x6f, 0x77, 0x18, 0x47, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x04, 0x73, 0x68, 0x6f, 0x77, + 0x12, 0x31, 0x0a, 0x05, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x69, + 0x64, 0x65, 0x6f, 0x12, 0x40, 0x0a, 0x0d, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x69, + 0x64, 0x65, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x0c, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x40, 0x0a, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x4a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x41, 0x75, 0x64, 0x69, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x64, 0x69, 0x6f, + 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x3f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x4b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0c, 0x66, 0x72, 0x65, 0x65, + 0x7a, 0x65, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0b, 0x66, 0x72, + 0x65, 0x65, 0x7a, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x4d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, + 0x18, 0x51, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x42, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x12, + 0x42, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, + 0x52, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x53, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x39, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x57, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x2e, + 0x45, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x74, + 0x61, 0x6c, 0x6b, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x75, 0x73, 0x69, 0x63, + 0x41, 0x6e, 0x64, 0x54, 0x61, 0x6c, 0x6b, 0x12, 0x46, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x5f, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x30, 0x0a, 0x14, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x62, 0x6f, 0x6f, 0x6b, 0x5f, + 0x63, 0x68, 0x61, 0x70, 0x74, 0x65, 0x72, 0x18, 0x60, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, + 0x73, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x62, 0x6f, 0x6f, 0x6b, 0x43, 0x68, 0x61, 0x70, 0x74, 0x65, + 0x72, 0x22, 0x2f, 0x0a, 0x0b, 0x45, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x52, + 0x41, 0x49, 0x4c, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x4f, 0x4e, 0x55, 0x53, + 0x10, 0x02, 0x22, 0x1e, 0x0a, 0x08, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x22, 0x54, 0x0a, 0x09, 0x54, 0x6f, 0x70, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x22, 0x62, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x59, 0x65, 0x61, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x11, 0x52, 0x07, 0x65, 0x6e, 0x64, + 0x59, 0x65, 0x61, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x63, 0x61, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x64, 0x65, 0x63, 0x61, 0x64, 0x65, 0x22, 0x3b, 0x0a, 0x0a, + 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x6c, + 0x62, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, 0x6c, 0x62, + 0x75, 0x6d, 0x52, 0x05, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x22, 0x6e, 0x0a, 0x04, 0x44, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11, 0x52, + 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x64, + 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x03, 0x64, 0x61, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x11, 0x52, 0x04, 0x68, 0x6f, 0x75, + 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x11, 0x52, 0x06, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x05, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x2e, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x35, 0x0a, 0x04, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, + 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x58, 0x4c, 0x41, 0x52, 0x47, + 0x45, 0x10, 0x03, 0x22, 0x3b, 0x0a, 0x0a, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x2d, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x22, 0x99, 0x01, 0x0a, 0x09, 0x42, 0x69, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x08, 0x70, + 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x0e, 0x70, 0x6f, 0x72, 0x74, 0x72, + 0x61, 0x69, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0d, 0x70, + 0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x61, 0x0a, 0x04, + 0x44, 0x69, 0x73, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x22, + 0x6b, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x12, 0x34, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, + 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x14, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x05, + 0x0a, 0x01, 0x50, 0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x43, 0x10, 0x01, 0x22, 0x98, 0x03, 0x0a, + 0x0b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x09, + 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, + 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x52, 0x09, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, + 0x67, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, + 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x53, 0x74, 0x72, + 0x12, 0x2d, 0x0a, 0x11, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, + 0x31, 0x0a, 0x13, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, + 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x64, + 0x65, 0x6e, 0x22, 0x55, 0x0a, 0x09, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x12, + 0x06, 0x0a, 0x02, 0x41, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x55, 0x42, 0x53, 0x43, + 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x41, 0x54, + 0x41, 0x4c, 0x4f, 0x47, 0x55, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x48, 0x55, 0x46, 0x46, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4d, + 0x4d, 0x45, 0x52, 0x43, 0x49, 0x41, 0x4c, 0x10, 0x04, 0x22, 0x15, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x49, 0x4e, 0x47, 0x10, 0x00, + 0x42, 0x15, 0x0a, 0x13, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x0a, 0x0c, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x74, 0x61, 0x6c, + 0x6f, 0x67, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, + 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x75, 0x65, 0x53, 0x74, 0x72, 0x12, 0x2c, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x0a, 0x53, + 0x61, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x72, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, + 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x03, 0x65, + 0x6e, 0x64, 0x22, 0x30, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x91, 0x02, 0x0a, 0x09, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, + 0x75, 0x64, 0x69, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, + 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0xae, 0x01, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x47, 0x47, 0x5f, 0x56, 0x4f, 0x52, 0x42, 0x49, 0x53, + 0x5f, 0x39, 0x36, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x47, 0x47, 0x5f, 0x56, 0x4f, 0x52, + 0x42, 0x49, 0x53, 0x5f, 0x31, 0x36, 0x30, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4f, 0x47, 0x47, + 0x5f, 0x56, 0x4f, 0x52, 0x42, 0x49, 0x53, 0x5f, 0x33, 0x32, 0x30, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x4d, 0x50, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x50, + 0x33, 0x5f, 0x33, 0x32, 0x30, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x50, 0x33, 0x5f, 0x31, + 0x36, 0x30, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x50, 0x33, 0x5f, 0x39, 0x36, 0x10, 0x06, + 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x50, 0x33, 0x5f, 0x31, 0x36, 0x30, 0x5f, 0x45, 0x4e, 0x43, 0x10, + 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x41, 0x43, 0x5f, 0x32, 0x34, 0x10, 0x08, 0x12, 0x0a, 0x0a, + 0x06, 0x41, 0x41, 0x43, 0x5f, 0x34, 0x38, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4c, 0x41, + 0x43, 0x5f, 0x46, 0x4c, 0x41, 0x43, 0x10, 0x10, 0x22, 0x24, 0x0a, 0x09, 0x56, 0x69, 0x64, 0x65, + 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x3b, + 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x42, 0x4b, 0x0a, 0x1a, 0x63, + 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x48, 0x02, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, + 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, + 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, +} + +var ( + file_metadata_proto_rawDescOnce sync.Once + file_metadata_proto_rawDescData = file_metadata_proto_rawDesc +) + +func file_metadata_proto_rawDescGZIP() []byte { + file_metadata_proto_rawDescOnce.Do(func() { + file_metadata_proto_rawDescData = protoimpl.X.CompressGZIP(file_metadata_proto_rawDescData) + }) + return file_metadata_proto_rawDescData +} + +var file_metadata_proto_enumTypes = make([]protoimpl.EnumInfo, 10) +var file_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_metadata_proto_goTypes = []interface{}{ + (Album_Type)(0), // 0: spotify.metadata.Album.Type + (ArtistWithRole_ArtistRole)(0), // 1: spotify.metadata.ArtistWithRole.ArtistRole + (Show_MediaType)(0), // 2: spotify.metadata.Show.MediaType + (Show_ConsumptionOrder)(0), // 3: spotify.metadata.Show.ConsumptionOrder + (Episode_EpisodeType)(0), // 4: spotify.metadata.Episode.EpisodeType + (Image_Size)(0), // 5: spotify.metadata.Image.Size + (Copyright_Type)(0), // 6: spotify.metadata.Copyright.Type + (Restriction_Catalogue)(0), // 7: spotify.metadata.Restriction.Catalogue + (Restriction_Type)(0), // 8: spotify.metadata.Restriction.Type + (AudioFile_Format)(0), // 9: spotify.metadata.AudioFile.Format + (*Artist)(nil), // 10: spotify.metadata.Artist + (*Album)(nil), // 11: spotify.metadata.Album + (*Track)(nil), // 12: spotify.metadata.Track + (*ArtistWithRole)(nil), // 13: spotify.metadata.ArtistWithRole + (*Show)(nil), // 14: spotify.metadata.Show + (*Episode)(nil), // 15: spotify.metadata.Episode + (*Licensor)(nil), // 16: spotify.metadata.Licensor + (*TopTracks)(nil), // 17: spotify.metadata.TopTracks + (*ActivityPeriod)(nil), // 18: spotify.metadata.ActivityPeriod + (*AlbumGroup)(nil), // 19: spotify.metadata.AlbumGroup + (*Date)(nil), // 20: spotify.metadata.Date + (*Image)(nil), // 21: spotify.metadata.Image + (*ImageGroup)(nil), // 22: spotify.metadata.ImageGroup + (*Biography)(nil), // 23: spotify.metadata.Biography + (*Disc)(nil), // 24: spotify.metadata.Disc + (*Copyright)(nil), // 25: spotify.metadata.Copyright + (*Restriction)(nil), // 26: spotify.metadata.Restriction + (*Availability)(nil), // 27: spotify.metadata.Availability + (*SalePeriod)(nil), // 28: spotify.metadata.SalePeriod + (*ExternalId)(nil), // 29: spotify.metadata.ExternalId + (*AudioFile)(nil), // 30: spotify.metadata.AudioFile + (*VideoFile)(nil), // 31: spotify.metadata.VideoFile + (*ContentRating)(nil), // 32: spotify.metadata.ContentRating +} +var file_metadata_proto_depIdxs = []int32{ + 17, // 0: spotify.metadata.Artist.top_track:type_name -> spotify.metadata.TopTracks + 19, // 1: spotify.metadata.Artist.album_group:type_name -> spotify.metadata.AlbumGroup + 19, // 2: spotify.metadata.Artist.single_group:type_name -> spotify.metadata.AlbumGroup + 19, // 3: spotify.metadata.Artist.compilation_group:type_name -> spotify.metadata.AlbumGroup + 19, // 4: spotify.metadata.Artist.appears_on_group:type_name -> spotify.metadata.AlbumGroup + 29, // 5: spotify.metadata.Artist.external_id:type_name -> spotify.metadata.ExternalId + 21, // 6: spotify.metadata.Artist.portrait:type_name -> spotify.metadata.Image + 23, // 7: spotify.metadata.Artist.biography:type_name -> spotify.metadata.Biography + 18, // 8: spotify.metadata.Artist.activity_period:type_name -> spotify.metadata.ActivityPeriod + 26, // 9: spotify.metadata.Artist.restriction:type_name -> spotify.metadata.Restriction + 10, // 10: spotify.metadata.Artist.related:type_name -> spotify.metadata.Artist + 22, // 11: spotify.metadata.Artist.portrait_group:type_name -> spotify.metadata.ImageGroup + 28, // 12: spotify.metadata.Artist.sale_period:type_name -> spotify.metadata.SalePeriod + 27, // 13: spotify.metadata.Artist.availability:type_name -> spotify.metadata.Availability + 10, // 14: spotify.metadata.Album.artist:type_name -> spotify.metadata.Artist + 0, // 15: spotify.metadata.Album.type:type_name -> spotify.metadata.Album.Type + 20, // 16: spotify.metadata.Album.date:type_name -> spotify.metadata.Date + 21, // 17: spotify.metadata.Album.cover:type_name -> spotify.metadata.Image + 29, // 18: spotify.metadata.Album.external_id:type_name -> spotify.metadata.ExternalId + 24, // 19: spotify.metadata.Album.disc:type_name -> spotify.metadata.Disc + 25, // 20: spotify.metadata.Album.copyright:type_name -> spotify.metadata.Copyright + 26, // 21: spotify.metadata.Album.restriction:type_name -> spotify.metadata.Restriction + 11, // 22: spotify.metadata.Album.related:type_name -> spotify.metadata.Album + 28, // 23: spotify.metadata.Album.sale_period:type_name -> spotify.metadata.SalePeriod + 22, // 24: spotify.metadata.Album.cover_group:type_name -> spotify.metadata.ImageGroup + 27, // 25: spotify.metadata.Album.availability:type_name -> spotify.metadata.Availability + 11, // 26: spotify.metadata.Track.album:type_name -> spotify.metadata.Album + 10, // 27: spotify.metadata.Track.artist:type_name -> spotify.metadata.Artist + 29, // 28: spotify.metadata.Track.external_id:type_name -> spotify.metadata.ExternalId + 26, // 29: spotify.metadata.Track.restriction:type_name -> spotify.metadata.Restriction + 30, // 30: spotify.metadata.Track.file:type_name -> spotify.metadata.AudioFile + 12, // 31: spotify.metadata.Track.alternative:type_name -> spotify.metadata.Track + 28, // 32: spotify.metadata.Track.sale_period:type_name -> spotify.metadata.SalePeriod + 30, // 33: spotify.metadata.Track.preview:type_name -> spotify.metadata.AudioFile + 27, // 34: spotify.metadata.Track.availability:type_name -> spotify.metadata.Availability + 16, // 35: spotify.metadata.Track.licensor:type_name -> spotify.metadata.Licensor + 32, // 36: spotify.metadata.Track.content_rating:type_name -> spotify.metadata.ContentRating + 13, // 37: spotify.metadata.Track.artist_with_role:type_name -> spotify.metadata.ArtistWithRole + 1, // 38: spotify.metadata.ArtistWithRole.role:type_name -> spotify.metadata.ArtistWithRole.ArtistRole + 22, // 39: spotify.metadata.Show.cover_image:type_name -> spotify.metadata.ImageGroup + 15, // 40: spotify.metadata.Show.episode:type_name -> spotify.metadata.Episode + 25, // 41: spotify.metadata.Show.copyright:type_name -> spotify.metadata.Copyright + 26, // 42: spotify.metadata.Show.restriction:type_name -> spotify.metadata.Restriction + 2, // 43: spotify.metadata.Show.media_type:type_name -> spotify.metadata.Show.MediaType + 3, // 44: spotify.metadata.Show.consumption_order:type_name -> spotify.metadata.Show.ConsumptionOrder + 27, // 45: spotify.metadata.Show.availability:type_name -> spotify.metadata.Availability + 30, // 46: spotify.metadata.Episode.audio:type_name -> spotify.metadata.AudioFile + 20, // 47: spotify.metadata.Episode.publish_time:type_name -> spotify.metadata.Date + 22, // 48: spotify.metadata.Episode.cover_image:type_name -> spotify.metadata.ImageGroup + 14, // 49: spotify.metadata.Episode.show:type_name -> spotify.metadata.Show + 31, // 50: spotify.metadata.Episode.video:type_name -> spotify.metadata.VideoFile + 31, // 51: spotify.metadata.Episode.video_preview:type_name -> spotify.metadata.VideoFile + 30, // 52: spotify.metadata.Episode.audio_preview:type_name -> spotify.metadata.AudioFile + 26, // 53: spotify.metadata.Episode.restriction:type_name -> spotify.metadata.Restriction + 22, // 54: spotify.metadata.Episode.freeze_frame:type_name -> spotify.metadata.ImageGroup + 27, // 55: spotify.metadata.Episode.availability:type_name -> spotify.metadata.Availability + 4, // 56: spotify.metadata.Episode.type:type_name -> spotify.metadata.Episode.EpisodeType + 32, // 57: spotify.metadata.Episode.content_rating:type_name -> spotify.metadata.ContentRating + 12, // 58: spotify.metadata.TopTracks.track:type_name -> spotify.metadata.Track + 11, // 59: spotify.metadata.AlbumGroup.album:type_name -> spotify.metadata.Album + 5, // 60: spotify.metadata.Image.size:type_name -> spotify.metadata.Image.Size + 21, // 61: spotify.metadata.ImageGroup.image:type_name -> spotify.metadata.Image + 21, // 62: spotify.metadata.Biography.portrait:type_name -> spotify.metadata.Image + 22, // 63: spotify.metadata.Biography.portrait_group:type_name -> spotify.metadata.ImageGroup + 12, // 64: spotify.metadata.Disc.track:type_name -> spotify.metadata.Track + 6, // 65: spotify.metadata.Copyright.type:type_name -> spotify.metadata.Copyright.Type + 7, // 66: spotify.metadata.Restriction.catalogue:type_name -> spotify.metadata.Restriction.Catalogue + 8, // 67: spotify.metadata.Restriction.type:type_name -> spotify.metadata.Restriction.Type + 20, // 68: spotify.metadata.Availability.start:type_name -> spotify.metadata.Date + 26, // 69: spotify.metadata.SalePeriod.restriction:type_name -> spotify.metadata.Restriction + 20, // 70: spotify.metadata.SalePeriod.start:type_name -> spotify.metadata.Date + 20, // 71: spotify.metadata.SalePeriod.end:type_name -> spotify.metadata.Date + 9, // 72: spotify.metadata.AudioFile.format:type_name -> spotify.metadata.AudioFile.Format + 73, // [73:73] is the sub-list for method output_type + 73, // [73:73] is the sub-list for method input_type + 73, // [73:73] is the sub-list for extension type_name + 73, // [73:73] is the sub-list for extension extendee + 0, // [0:73] is the sub-list for field type_name +} + +func init() { file_metadata_proto_init() } +func file_metadata_proto_init() { + if File_metadata_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Artist); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Album); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Track); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ArtistWithRole); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Show); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Episode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Licensor); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopTracks); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActivityPeriod); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AlbumGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Date); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Image); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImageGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Biography); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Disc); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Copyright); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Restriction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Availability); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SalePeriod); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExternalId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AudioFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VideoFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_metadata_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContentRating); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_metadata_proto_msgTypes[16].OneofWrappers = []interface{}{ + (*Restriction_CountriesAllowed)(nil), + (*Restriction_CountriesForbidden)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_metadata_proto_rawDesc, + NumEnums: 10, + NumMessages: 23, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_metadata_proto_goTypes, + DependencyIndexes: file_metadata_proto_depIdxs, + EnumInfos: file_metadata_proto_enumTypes, + MessageInfos: file_metadata_proto_msgTypes, + }.Build() + File_metadata_proto = out.File + file_metadata_proto_rawDesc = nil + file_metadata_proto_goTypes = nil + file_metadata_proto_depIdxs = nil +} diff --git a/lib/spot/proto/metadata.proto b/lib/spot/proto/metadata.proto new file mode 100644 index 0000000..1dae8d8 --- /dev/null +++ b/lib/spot/proto/metadata.proto @@ -0,0 +1,315 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.metadata; + +option optimize_for = CODE_SIZE; +option java_outer_classname = "Metadata"; +option java_package = "com.spotify.metadata.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message Artist { + optional bytes gid = 1; + optional string name = 2; + optional sint32 popularity = 3; + repeated TopTracks top_track = 4; + repeated AlbumGroup album_group = 5; + repeated AlbumGroup single_group = 6; + repeated AlbumGroup compilation_group = 7; + repeated AlbumGroup appears_on_group = 8; + repeated string genre = 9; + repeated ExternalId external_id = 10; + repeated Image portrait = 11; + repeated Biography biography = 12; + repeated ActivityPeriod activity_period = 13; + repeated Restriction restriction = 14; + repeated Artist related = 15; + optional bool is_portrait_album_cover = 16; + optional ImageGroup portrait_group = 17; + repeated SalePeriod sale_period = 18; + repeated Availability availability = 20; +} + +message Album { + optional bytes gid = 1; + optional string name = 2; + repeated Artist artist = 3; + + optional Type type = 4; + enum Type { + ALBUM = 1; + SINGLE = 2; + COMPILATION = 3; + EP = 4; + AUDIOBOOK = 5; + PODCAST = 6; + } + + optional string label = 5; + optional Date date = 6; + optional sint32 popularity = 7; + repeated string genre = 8; + repeated Image cover = 9; + repeated ExternalId external_id = 10; + repeated Disc disc = 11; + repeated string review = 12; + repeated Copyright copyright = 13; + repeated Restriction restriction = 14; + repeated Album related = 15; + repeated SalePeriod sale_period = 16; + optional ImageGroup cover_group = 17; + optional string original_title = 18; + optional string version_title = 19; + optional string type_str = 20; + repeated Availability availability = 23; +} + +message Track { + optional bytes gid = 1; + optional string name = 2; + optional Album album = 3; + repeated Artist artist = 4; + optional sint32 number = 5; + optional sint32 disc_number = 6; + optional sint32 duration = 7; + optional sint32 popularity = 8; + optional bool explicit = 9; + repeated ExternalId external_id = 10; + repeated Restriction restriction = 11; + repeated AudioFile file = 12; + repeated Track alternative = 13; + repeated SalePeriod sale_period = 14; + repeated AudioFile preview = 15; + repeated string tags = 16; + optional int64 earliest_live_timestamp = 17; + optional bool has_lyrics = 18; + repeated Availability availability = 19; + optional Licensor licensor = 21; + repeated string language_of_performance = 22; + repeated ContentRating content_rating = 25; + optional string original_title = 27; + optional string version_title = 28; + repeated ArtistWithRole artist_with_role = 32; +} + +message ArtistWithRole { + optional bytes artist_gid = 1; + optional string artist_name = 2; + + optional ArtistRole role = 3; + enum ArtistRole { + ARTIST_ROLE_UNKNOWN = 0; + ARTIST_ROLE_MAIN_ARTIST = 1; + ARTIST_ROLE_FEATURED_ARTIST = 2; + ARTIST_ROLE_REMIXER = 3; + ARTIST_ROLE_ACTOR = 4; + ARTIST_ROLE_COMPOSER = 5; + ARTIST_ROLE_CONDUCTOR = 6; + ARTIST_ROLE_ORCHESTRA = 7; + } +} + +message Show { + optional bytes gid = 1; + optional string name = 2; + optional string description = 64; + optional sint32 deprecated_popularity = 65; + optional string publisher = 66; + optional string language = 67; + optional bool explicit = 68; + optional ImageGroup cover_image = 69; + repeated Episode episode = 70; + repeated Copyright copyright = 71; + repeated Restriction restriction = 72; + repeated string keyword = 73; + + optional MediaType media_type = 74; + enum MediaType { + MIXED = 0; + AUDIO = 1; + VIDEO = 2; + } + + optional ConsumptionOrder consumption_order = 75; + enum ConsumptionOrder { + SEQUENTIAL = 1; + EPISODIC = 2; + RECENT = 3; + } + + repeated Availability availability = 78; + optional string trailer_uri = 83; + optional bool music_and_talk = 85; + optional bool is_audiobook = 89; +} + +message Episode { + optional bytes gid = 1; + optional string name = 2; + optional sint32 duration = 7; + repeated AudioFile audio = 12; + optional string description = 64; + optional sint32 number = 65; + optional Date publish_time = 66; + optional sint32 deprecated_popularity = 67; + optional ImageGroup cover_image = 68; + optional string language = 69; + optional bool explicit = 70; + optional Show show = 71; + repeated VideoFile video = 72; + repeated VideoFile video_preview = 73; + repeated AudioFile audio_preview = 74; + repeated Restriction restriction = 75; + optional ImageGroup freeze_frame = 76; + repeated string keyword = 77; + optional bool allow_background_playback = 81; + repeated Availability availability = 82; + optional string external_url = 83; + + optional EpisodeType type = 87; + enum EpisodeType { + FULL = 0; + TRAILER = 1; + BONUS = 2; + } + + optional bool music_and_talk = 91; + repeated ContentRating content_rating = 95; + optional bool is_audiobook_chapter = 96; +} + +message Licensor { + optional bytes uuid = 1; +} + +message TopTracks { + optional string country = 1; + repeated Track track = 2; +} + +message ActivityPeriod { + optional sint32 start_year = 1; + optional sint32 end_year = 2; + optional sint32 decade = 3; +} + +message AlbumGroup { + repeated Album album = 1; +} + +message Date { + optional sint32 year = 1; + optional sint32 month = 2; + optional sint32 day = 3; + optional sint32 hour = 4; + optional sint32 minute = 5; +} + +message Image { + optional bytes file_id = 1; + + optional Size size = 2; + enum Size { + DEFAULT = 0; + SMALL = 1; + LARGE = 2; + XLARGE = 3; + } + + optional sint32 width = 3; + optional sint32 height = 4; +} + +message ImageGroup { + repeated Image image = 1; +} + +message Biography { + optional string text = 1; + repeated Image portrait = 2; + repeated ImageGroup portrait_group = 3; +} + +message Disc { + optional sint32 number = 1; + optional string name = 2; + repeated Track track = 3; +} + +message Copyright { + optional Type type = 1; + enum Type { + P = 0; + C = 1; + } + + optional string text = 2; +} + +message Restriction { + repeated Catalogue catalogue = 1; + enum Catalogue { + AD = 0; + SUBSCRIPTION = 1; + CATALOGUE_ALL = 2; + SHUFFLE = 3; + COMMERCIAL = 4; + } + + optional Type type = 4; + enum Type { + STREAMING = 0; + } + + repeated string catalogue_str = 5; + + oneof country_restriction { + string countries_allowed = 2; + string countries_forbidden = 3; + } +} + +message Availability { + repeated string catalogue_str = 1; + optional Date start = 2; +} + +message SalePeriod { + repeated Restriction restriction = 1; + optional Date start = 2; + optional Date end = 3; +} + +message ExternalId { + optional string type = 1; + optional string id = 2; +} + +message AudioFile { + optional bytes file_id = 1; + + optional Format format = 2; + enum Format { + OGG_VORBIS_96 = 0; + OGG_VORBIS_160 = 1; + OGG_VORBIS_320 = 2; + MP3_256 = 3; + MP3_320 = 4; + MP3_160 = 5; + MP3_96 = 6; + MP3_160_ENC = 7; + AAC_24 = 8; + AAC_48 = 9; + FLAC_FLAC = 16; + } +} + +message VideoFile { + optional bytes file_id = 1; +} + +message ContentRating { + optional string country = 1; + repeated string tag = 2; +} diff --git a/lib/spot/proto/metadata/album_metadata.proto b/lib/spot/proto/metadata/album_metadata.proto new file mode 100644 index 0000000..5a7de5f --- /dev/null +++ b/lib/spot/proto/metadata/album_metadata.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "metadata/image_group.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message AlbumArtistMetadata { + optional string link = 1; + optional string name = 2; +} + +message AlbumMetadata { + repeated AlbumArtistMetadata artists = 1; + optional string link = 2; + optional string name = 3; + repeated string copyright = 4; + optional ImageGroup covers = 5; + optional uint32 year = 6; + optional uint32 num_discs = 7; + optional uint32 num_tracks = 8; + optional bool playability = 9; + optional bool is_premium_only = 10; +} diff --git a/lib/spot/proto/metadata/artist_metadata.proto b/lib/spot/proto/metadata/artist_metadata.proto new file mode 100644 index 0000000..4e5e9bf --- /dev/null +++ b/lib/spot/proto/metadata/artist_metadata.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "metadata/image_group.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message ArtistMetadata { + optional string link = 1; + optional string name = 2; + optional bool is_various_artists = 3; + optional ImageGroup portraits = 4; +} diff --git a/lib/spot/proto/metadata/episode_metadata.proto b/lib/spot/proto/metadata/episode_metadata.proto new file mode 100644 index 0000000..5d4a0b2 --- /dev/null +++ b/lib/spot/proto/metadata/episode_metadata.proto @@ -0,0 +1,63 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "metadata/extension.proto"; +import "metadata/image_group.proto"; +import "podcast_segments.proto"; +import "podcast_subscription.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message EpisodeShowMetadata { + optional string link = 1; + optional string name = 2; + optional string publisher = 3; + optional ImageGroup covers = 4; +} + +message EpisodeMetadata { + optional EpisodeShowMetadata show = 1; + optional string link = 2; + optional string name = 3; + optional uint32 length = 4; + optional ImageGroup covers = 5; + optional string manifest_id = 6; + optional string description = 7; + optional int64 publish_date = 8; + optional ImageGroup freeze_frames = 9; + optional string language = 10; + optional bool available = 11; + + optional MediaType media_type_enum = 12; + enum MediaType { + VODCAST = 0; + AUDIO = 1; + VIDEO = 2; + } + + optional int32 number = 13; + optional bool backgroundable = 14; + optional string preview_manifest_id = 15; + optional bool is_explicit = 16; + optional string preview_id = 17; + + optional EpisodeType episode_type = 18; + enum EpisodeType { + UNKNOWN = 0; + FULL = 1; + TRAILER = 2; + BONUS = 3; + } + + optional bool is_music_and_talk = 19; + optional podcast_segments.PodcastSegments podcast_segments = 20; + optional podcast_paywalls.PodcastSubscription podcast_subscription = 21; + repeated Extension extension = 22; + optional bool is_19_plus_only = 23; + optional bool is_book_chapter = 24; +} diff --git a/lib/spot/proto/metadata/extension.proto b/lib/spot/proto/metadata/extension.proto new file mode 100644 index 0000000..b10a0f0 --- /dev/null +++ b/lib/spot/proto/metadata/extension.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "extension_kind.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message Extension { + optional extendedmetadata.ExtensionKind extension_kind = 1; + optional bytes data = 2; +} diff --git a/lib/spot/proto/metadata/image_group.proto b/lib/spot/proto/metadata/image_group.proto new file mode 100644 index 0000000..310a408 --- /dev/null +++ b/lib/spot/proto/metadata/image_group.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message ImageGroup { + optional string standard_link = 1; + optional string small_link = 2; + optional string large_link = 3; + optional string xlarge_link = 4; +} diff --git a/lib/spot/proto/metadata/show_metadata.proto b/lib/spot/proto/metadata/show_metadata.proto new file mode 100644 index 0000000..9b9891d --- /dev/null +++ b/lib/spot/proto/metadata/show_metadata.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "metadata/extension.proto"; +import "metadata/image_group.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message ShowMetadata { + optional string link = 1; + optional string name = 2; + optional string description = 3; + optional uint32 popularity = 4; + optional string publisher = 5; + optional string language = 6; + optional bool is_explicit = 7; + optional ImageGroup covers = 8; + optional uint32 num_episodes = 9; + optional string consumption_order = 10; + optional int32 media_type_enum = 11; + repeated string copyright = 12; + optional string trailer_uri = 13; + optional bool is_music_and_talk = 14; + repeated Extension extension = 15; + optional bool is_book = 16; +} diff --git a/lib/spot/proto/metadata/track_metadata.proto b/lib/spot/proto/metadata/track_metadata.proto new file mode 100644 index 0000000..08bff40 --- /dev/null +++ b/lib/spot/proto/metadata/track_metadata.proto @@ -0,0 +1,55 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "metadata/image_group.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message TrackAlbumArtistMetadata { + optional string link = 1; + optional string name = 2; +} + +message TrackAlbumMetadata { + optional TrackAlbumArtistMetadata artist = 1; + optional string link = 2; + optional string name = 3; + optional ImageGroup covers = 4; +} + +message TrackArtistMetadata { + optional string link = 1; + optional string name = 2; + optional ImageGroup portraits = 3; +} + +message TrackDescriptor { + optional string name = 1; +} + +message TrackMetadata { + optional TrackAlbumMetadata album = 1; + repeated TrackArtistMetadata artist = 2; + optional string link = 3; + optional string name = 4; + optional uint32 length = 5; + optional bool playable = 6; + optional uint32 disc_number = 7; + optional uint32 track_number = 8; + optional bool is_explicit = 9; + optional string preview_id = 10; + optional bool is_local = 11; + optional bool playable_local_track = 12; + optional bool has_lyrics = 13; + optional bool is_premium_only = 14; + optional bool locally_playable = 15; + optional string playable_track_link = 16; + optional uint32 popularity = 17; + optional bool is_19_plus_only = 18; + repeated TrackDescriptor track_descriptors = 19; +} diff --git a/lib/spot/proto/metadata_cosmos.proto b/lib/spot/proto/metadata_cosmos.proto new file mode 100644 index 0000000..f04e595 --- /dev/null +++ b/lib/spot/proto/metadata_cosmos.proto @@ -0,0 +1,30 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.metadata_cosmos.proto; + +import "metadata.proto"; + +option optimize_for = CODE_SIZE; +option java_outer_classname = "MetadataCosmos"; +option java_package = "com.spotify.metadata.cosmos.proto"; + +message MetadataItem { + oneof item { + sint32 error = 1; + metadata.Artist artist = 2; + metadata.Album album = 3; + metadata.Track track = 4; + metadata.Show show = 5; + metadata.Episode episode = 6; + } +} + +message MultiResponse { + repeated MetadataItem items = 1; +} + +message MultiRequest { + repeated string uris = 1; +} diff --git a/lib/spot/proto/metadata_esperanto.proto b/lib/spot/proto/metadata_esperanto.proto new file mode 100644 index 0000000..601290a --- /dev/null +++ b/lib/spot/proto/metadata_esperanto.proto @@ -0,0 +1,24 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.metadata_esperanto.proto; + +import "metadata_cosmos.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.metadata.esperanto.proto"; + +service ClassicMetadataService { + rpc GetEntity(GetEntityRequest) returns (GetEntityResponse); + rpc MultigetEntity(metadata_cosmos.proto.MultiRequest) returns (metadata_cosmos.proto.MultiResponse); +} + +message GetEntityRequest { + string uri = 1; +} + +message GetEntityResponse { + metadata_cosmos.proto.MetadataItem item = 1; +} diff --git a/lib/spot/proto/modification_request.proto b/lib/spot/proto/modification_request.proto new file mode 100644 index 0000000..d35b613 --- /dev/null +++ b/lib/spot/proto/modification_request.proto @@ -0,0 +1,37 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message ModificationRequest { + optional string operation = 1; + optional string before = 2; + optional string after = 3; + optional string name = 4; + optional bool playlist = 5; + + optional Attributes attributes = 6; + message Attributes { + optional bool published = 1; + optional bool collaborative = 2; + optional string name = 3; + optional string description = 4; + optional string imageUri = 5; + optional string picture = 6; + } + + repeated string uris = 7; + repeated string rows = 8; + optional bool contents = 9; + optional string item_id = 10; +} + +message ModificationResponse { + optional bool success = 1; + optional string uri = 2; +} diff --git a/lib/spot/proto/net-fortune.proto b/lib/spot/proto/net-fortune.proto new file mode 100644 index 0000000..dbf476b --- /dev/null +++ b/lib/spot/proto/net-fortune.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.netfortune.proto; + +option optimize_for = CODE_SIZE; + +message NetFortuneResponse { + int32 advised_audio_bitrate = 1; +} + +message NetFortuneV2Response { + string predict_id = 1; + int32 estimated_max_bitrate = 2; +} diff --git a/lib/spot/proto/offline.proto b/lib/spot/proto/offline.proto new file mode 100644 index 0000000..b3d1249 --- /dev/null +++ b/lib/spot/proto/offline.proto @@ -0,0 +1,83 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.offline.proto; + +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; + +option optimize_for = CODE_SIZE; + +message Capacity { + double total_space = 1; + double free_space = 2; + double offline_space = 3; + uint64 track_count = 4; + uint64 episode_count = 5; +} + +message Device { + string device_id = 1; + string cache_id = 2; + string name = 3; + int32 type = 4; + int32 platform = 5; + bool offline_enabled = 6; + Capacity capacity = 7; + google.protobuf.Timestamp updated_at = 9; + google.protobuf.Timestamp last_seen_at = 10; + bool removal_pending = 11; +} + +message Restrictions { + google.protobuf.Duration allowed_duration_tracks = 1; + uint64 max_tracks = 2; + google.protobuf.Duration allowed_duration_episodes = 3; + uint64 max_episodes = 4; +} + +message Resource { + string uri = 1; + ResourceState state = 2; + int32 progress = 3; + google.protobuf.Timestamp updated_at = 4; + string failure_message = 5; +} + +message DeviceKey { + string user_id = 1; + string device_id = 2; + string cache_id = 3; +} + +message ResourceForDevice { + string device_id = 1; + string cache_id = 2; + Resource resource = 3; +} + +message ResourceOperation { + Operation operation = 2; + enum Operation { + INVALID = 0; + ADD = 1; + REMOVE = 2; + } + + string uri = 3; +} + +message ResourceHistoryItem { + repeated ResourceOperation operations = 1; + google.protobuf.Timestamp server_time = 2; +} + +enum ResourceState { + UNSPECIFIED = 0; + REQUESTED = 1; + PENDING = 2; + DOWNLOADING = 3; + DOWNLOADED = 4; + FAILURE = 5; +} diff --git a/lib/spot/proto/offline_playlists_containing.proto b/lib/spot/proto/offline_playlists_containing.proto new file mode 100644 index 0000000..3d75865 --- /dev/null +++ b/lib/spot/proto/offline_playlists_containing.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +option objc_class_prefix = "SPTPlaylist"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message OfflinePlaylistContainingItem { + required string playlist_link = 1; + optional string playlist_name = 2; +} + +message OfflinePlaylistsContainingItemResponse { + repeated OfflinePlaylistContainingItem playlists = 1; +} diff --git a/lib/spot/proto/on_demand_in_free_reason.proto b/lib/spot/proto/on_demand_in_free_reason.proto new file mode 100644 index 0000000..bf3a820 --- /dev/null +++ b/lib/spot/proto/on_demand_in_free_reason.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.on_demand_set.proto; + +option optimize_for = CODE_SIZE; + +enum OnDemandInFreeReason { + UNKNOWN = 0; + NOT_ON_DEMAND = 1; + ON_DEMAND = 2; + ON_DEMAND_EPISODES_ONLY = 3; +} diff --git a/lib/spot/proto/on_demand_set_cosmos_request.proto b/lib/spot/proto/on_demand_set_cosmos_request.proto new file mode 100644 index 0000000..72d4d3d --- /dev/null +++ b/lib/spot/proto/on_demand_set_cosmos_request.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.on_demand_set_cosmos.proto; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.on_demand_set.proto"; + +message Set { + repeated string uris = 1; +} + +message Temporary { + optional string uri = 1; + optional int64 valid_for_in_seconds = 2; +} diff --git a/lib/spot/proto/on_demand_set_cosmos_response.proto b/lib/spot/proto/on_demand_set_cosmos_response.proto new file mode 100644 index 0000000..8ca68cb --- /dev/null +++ b/lib/spot/proto/on_demand_set_cosmos_response.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.on_demand_set_cosmos.proto; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.on_demand_set.proto"; + +message Response { + optional bool success = 1; +} diff --git a/lib/spot/proto/on_demand_set_response.proto b/lib/spot/proto/on_demand_set_response.proto new file mode 100644 index 0000000..9d914dd --- /dev/null +++ b/lib/spot/proto/on_demand_set_response.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.on_demand_set_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.on_demand_set.proto"; + +message ResponseStatus { + int32 status_code = 1; + string reason = 2; +} diff --git a/lib/spot/proto/pending_event_entity.proto b/lib/spot/proto/pending_event_entity.proto new file mode 100644 index 0000000..0dd5c09 --- /dev/null +++ b/lib/spot/proto/pending_event_entity.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.pending_events.proto; + +option optimize_for = CODE_SIZE; + +message PendingEventEntity { + string event_name = 1; + bytes payload = 2; + string username = 3; +} diff --git a/lib/spot/proto/perf_metrics_service.proto b/lib/spot/proto/perf_metrics_service.proto new file mode 100644 index 0000000..484bd32 --- /dev/null +++ b/lib/spot/proto/perf_metrics_service.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.perf_metrics.esperanto.proto; + +option java_package = "com.spotify.perf_metrics.esperanto.proto"; + +service PerfMetricsService { + rpc TerminateState(PerfMetricsRequest) returns (PerfMetricsResponse); +} + +message PerfMetricsRequest { + string terminal_state = 1; + bool foreground_startup = 2; +} + +message PerfMetricsResponse { + bool success = 1; +} diff --git a/lib/spot/proto/pin_request.proto b/lib/spot/proto/pin_request.proto new file mode 100644 index 0000000..a533732 --- /dev/null +++ b/lib/spot/proto/pin_request.proto @@ -0,0 +1,34 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +option optimize_for = CODE_SIZE; + +message PinRequest { + string uri = 1; +} + +message PinResponse { + PinStatus status = 1; + enum PinStatus { + UNKNOWN = 0; + PINNED = 1; + NOT_PINNED = 2; + } + + bool has_maximum_pinned_items = 2; + int32 maximum_pinned_items = 3; + string error = 99; +} + +message PinItem { + string uri = 1; + bool in_library = 2; +} + +message PinList { + repeated PinItem item = 1; + string error = 99; +} diff --git a/lib/spot/proto/play_origin.proto b/lib/spot/proto/play_origin.proto new file mode 100644 index 0000000..53bb070 --- /dev/null +++ b/lib/spot/proto/play_origin.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message PlayOrigin { + optional string feature_identifier = 1; + optional string feature_version = 2; + optional string view_uri = 3; + optional string external_referrer = 4; + optional string referrer_identifier = 5; + optional string device_identifier = 6; + repeated string feature_classes = 7; +} diff --git a/lib/spot/proto/play_queue_node.proto b/lib/spot/proto/play_queue_node.proto new file mode 100644 index 0000000..d79a982 --- /dev/null +++ b/lib/spot/proto/play_queue_node.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context_track.proto"; +import "track_instance.proto"; +import "track_instantiator.proto"; + +option optimize_for = CODE_SIZE; + +message PlayQueueNode { + repeated ContextTrack queue = 1; + optional TrackInstance instance = 2; + optional TrackInstantiator instantiator = 3; + optional uint32 next_uid = 4; + optional sint32 iteration = 5; +} diff --git a/lib/spot/proto/play_reason.proto b/lib/spot/proto/play_reason.proto new file mode 100644 index 0000000..04bba83 --- /dev/null +++ b/lib/spot/proto/play_reason.proto @@ -0,0 +1,32 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +enum PlayReason { + PLAY_REASON_UNKNOWN = 0; + PLAY_REASON_APP_LOAD = 1; + PLAY_REASON_BACK_BTN = 2; + PLAY_REASON_CLICK_ROW = 3; + PLAY_REASON_CLICK_SIDE = 4; + PLAY_REASON_END_PLAY = 5; + PLAY_REASON_FWD_BTN = 6; + PLAY_REASON_INTERRUPTED = 7; + PLAY_REASON_LOGOUT = 8; + PLAY_REASON_PLAY_BTN = 9; + PLAY_REASON_POPUP = 10; + PLAY_REASON_REMOTE = 11; + PLAY_REASON_SONG_DONE = 12; + PLAY_REASON_TRACK_DONE = 13; + PLAY_REASON_TRACK_ERROR = 14; + PLAY_REASON_PREVIEW = 15; + PLAY_REASON_URI_OPEN = 16; + PLAY_REASON_BACKGROUNDED = 17; + PLAY_REASON_OFFLINE = 18; + PLAY_REASON_UNEXPECTED_EXIT = 19; + PLAY_REASON_UNEXPECTED_EXIT_WHILE_PAUSED = 20; +} diff --git a/lib/spot/proto/playback.proto b/lib/spot/proto/playback.proto new file mode 100644 index 0000000..94d8ae7 --- /dev/null +++ b/lib/spot/proto/playback.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context_track.proto"; + +option optimize_for = CODE_SIZE; + +message Playback { + optional int64 timestamp = 1; + optional int32 position_as_of_timestamp = 2; + optional double playback_speed = 3; + optional bool is_paused = 4; + optional ContextTrack current_track = 5; +} diff --git a/lib/spot/proto/playback_cosmos.proto b/lib/spot/proto/playback_cosmos.proto new file mode 100644 index 0000000..b2ae4f9 --- /dev/null +++ b/lib/spot/proto/playback_cosmos.proto @@ -0,0 +1,106 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playback_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message VolumeRequest { + oneof source_or_system { + VolumeChangeSource source = 1; + bool system_initiated = 4; + } + + oneof action { + double volume = 2; + Step step = 3; + } + + enum Step { + option allow_alias = true; + up = 0; + UP = 0; + down = 1; + DOWN = 1; + } +} + +message VolumeResponse { + double volume = 1; +} + +message VolumeSubResponse { + double volume = 1; + VolumeChangeSource source = 2; + bool system_initiated = 3; +} + +message PositionResponseV1 { + int32 position = 1; +} + +message PositionResponseV2 { + int64 position = 1; +} + +message InfoResponse { + bool has_info = 1; + uint64 length_ms = 2; + uint64 position_ms = 3; + bool playing = 4; + bool buffering = 5; + int32 error = 6; + string file_id = 7; + string file_type = 8; + string resolved_content_url = 9; + int32 file_bitrate = 10; + string codec_name = 11; + double playback_speed = 12; + float gain_adjustment = 13; + bool has_loudness = 14; + float loudness = 15; + string strategy = 17; + int32 target_bitrate = 18; + int32 advised_bitrate = 19; + bool target_file_available = 20; + + reserved 16; +} + +message FormatsResponse { + repeated Format formats = 1; + message Format { + string enum_key = 1; + uint32 enum_value = 2; + bool supported = 3; + uint32 bitrate = 4; + string mime_type = 5; + } +} + +message GetFilesResponse { + repeated File files = 1; + message File { + string file_id = 1; + string format = 2; + uint32 bitrate = 3; + uint32 format_enum = 4; + } +} + +message DuckRequest { + Action action = 2; + enum Action { + START = 0; + STOP = 1; + } + + double volume = 3; + uint32 fade_duration_ms = 4; +} + +enum VolumeChangeSource { + USER = 0; + SYSTEM = 1; +} diff --git a/lib/spot/proto/playback_esperanto.proto b/lib/spot/proto/playback_esperanto.proto new file mode 100644 index 0000000..3c57325 --- /dev/null +++ b/lib/spot/proto/playback_esperanto.proto @@ -0,0 +1,122 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playback_esperanto.proto; + +option objc_class_prefix = "ESP"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playback_esperanto.proto"; + +message GetVolumeResponse { + Status status = 1; + double volume = 2; +} + +message SubVolumeResponse { + Status status = 1; + double volume = 2; + VolumeChangeSource source = 3; +} + +message SetVolumeRequest { + VolumeChangeSource source = 1; + double volume = 2; +} + +message NudgeVolumeRequest { + VolumeChangeSource source = 1; +} + +message PlaybackInfoResponse { + Status status = 1; + uint64 length_ms = 2; + uint64 position_ms = 3; + bool playing = 4; + bool buffering = 5; + int32 error = 6; + string file_id = 7; + string file_type = 8; + string resolved_content_url = 9; + int32 file_bitrate = 10; + string codec_name = 11; + double playback_speed = 12; + float gain_adjustment = 13; + bool has_loudness = 14; + float loudness = 15; + string strategy = 17; + int32 target_bitrate = 18; + int32 advised_bitrate = 19; + bool target_file_available = 20; + + reserved 16; +} + +message GetFormatsResponse { + repeated Format formats = 1; + message Format { + string enum_key = 1; + uint32 enum_value = 2; + bool supported = 3; + uint32 bitrate = 4; + string mime_type = 5; + } +} + +message SubPositionRequest { + uint64 position = 1; +} + +message SubPositionResponse { + Status status = 1; + uint64 position = 2; +} + +message GetFilesRequest { + string uri = 1; +} + +message GetFilesResponse { + GetFilesStatus status = 1; + + repeated File files = 2; + message File { + string file_id = 1; + string format = 2; + uint32 bitrate = 3; + uint32 format_enum = 4; + } +} + +message DuckRequest { + Action action = 2; + enum Action { + START = 0; + STOP = 1; + } + + double volume = 3; + uint32 fade_duration_ms = 4; +} + +message DuckResponse { + Status status = 1; +} + +enum Status { + OK = 0; + NOT_AVAILABLE = 1; +} + +enum GetFilesStatus { + GETFILES_OK = 0; + METADATA_CLIENT_NOT_AVAILABLE = 1; + FILES_NOT_FOUND = 2; + TRACK_NOT_AVAILABLE = 3; + EXTENDED_METADATA_ERROR = 4; +} + +enum VolumeChangeSource { + USER = 0; + SYSTEM = 1; +} diff --git a/lib/spot/proto/playback_platform.proto b/lib/spot/proto/playback_platform.proto new file mode 100644 index 0000000..5f50bd9 --- /dev/null +++ b/lib/spot/proto/playback_platform.proto @@ -0,0 +1,90 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playback_platform.proto; + +import "media_manifest.proto"; + +option optimize_for = CODE_SIZE; + +message Media { + string id = 1; + int32 start_position = 6; + int32 stop_position = 7; + + oneof source { + string audio_id = 2; + string episode_id = 3; + string track_id = 4; + media_manifest.proto.Files files = 5; + } +} + +message Annotation { + map metadata = 2; +} + +message PlaybackControl { + +} + +message Context { + string id = 2; + string type = 3; + + reserved 1; +} + +message Timeline { + repeated MediaTrack media_tracks = 1; + message MediaTrack { + repeated Item items = 1; + message Item { + repeated Annotation annotations = 3; + repeated PlaybackControl controls = 4; + + oneof content { + Context context = 1; + Media media = 2; + } + } + } +} + +message PageId { + Context context = 1; + int32 index = 2; +} + +message PagePath { + repeated PageId segments = 1; +} + +message Page { + Header header = 1; + message Header { + int32 status_code = 1; + int32 num_pages = 2; + } + + PageId page_id = 2; + Timeline timeline = 3; +} + +message PageList { + repeated Page pages = 1; +} + +message PageMultiGetRequest { + repeated PageId page_ids = 1; +} + +message PageMultiGetResponse { + repeated Page pages = 1; +} + +message ContextPagePathState { + PagePath path = 1; + repeated int32 media_track_item_index = 3; +} diff --git a/lib/spot/proto/playback_segments.proto b/lib/spot/proto/playback_segments.proto new file mode 100644 index 0000000..1f6f6ea --- /dev/null +++ b/lib/spot/proto/playback_segments.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast_segments.playback; + +import "podcast_segments.proto"; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "PlaybackSegmentsProto"; +option java_package = "com.spotify.podcastsegments.playback.proto"; + +message PlaybackSegments { + repeated PlaybackSegment playback_segments = 1; +} diff --git a/lib/spot/proto/played_state.proto b/lib/spot/proto/played_state.proto new file mode 100644 index 0000000..5899025 --- /dev/null +++ b/lib/spot/proto/played_state.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.played_state.proto; + +option optimize_for = CODE_SIZE; + +message PlayedStateItem { + optional string show_uri = 1; + optional string episode_uri = 2; + optional int32 resume_point = 3; + optional int32 last_played_at = 4; + optional bool is_latest = 5; + optional bool has_been_fully_played = 6; + optional bool has_been_synced = 7; + optional int32 episode_length = 8; +} + +message PlayedStateItems { + repeated PlayedStateItem item = 1; + optional uint64 last_server_sync_timestamp = 2; +} diff --git a/lib/spot/proto/played_state/episode_played_state.proto b/lib/spot/proto/played_state/episode_played_state.proto new file mode 100644 index 0000000..696b2e7 --- /dev/null +++ b/lib/spot/proto/played_state/episode_played_state.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "played_state/playability_restriction.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message EpisodePlayState { + optional uint32 time_left = 1; + optional bool is_playable = 2; + optional bool is_played = 3; + optional uint32 last_played_at = 4; + optional PlayabilityRestriction playability_restriction = 5 [default = UNKNOWN]; +} diff --git a/lib/spot/proto/played_state/playability_restriction.proto b/lib/spot/proto/played_state/playability_restriction.proto new file mode 100644 index 0000000..d6de6f4 --- /dev/null +++ b/lib/spot/proto/played_state/playability_restriction.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +enum PlayabilityRestriction { + UNKNOWN = 0; + NO_RESTRICTION = 1; + EXPLICIT_CONTENT = 2; + AGE_RESTRICTED = 3; + NOT_IN_CATALOGUE = 4; + NOT_AVAILABLE_OFFLINE = 5; +} diff --git a/lib/spot/proto/played_state/show_played_state.proto b/lib/spot/proto/played_state/show_played_state.proto new file mode 100644 index 0000000..47f13ec --- /dev/null +++ b/lib/spot/proto/played_state/show_played_state.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option objc_class_prefix = "SPTCosmosUtil"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message ShowPlayState { + optional string latest_played_episode_link = 1; +} diff --git a/lib/spot/proto/played_state/track_played_state.proto b/lib/spot/proto/played_state/track_played_state.proto new file mode 100644 index 0000000..3a8e4c8 --- /dev/null +++ b/lib/spot/proto/played_state/track_played_state.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +import "played_state/playability_restriction.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message TrackPlayState { + optional bool is_playable = 1; + optional PlayabilityRestriction playability_restriction = 2 [default = UNKNOWN]; +} diff --git a/lib/spot/proto/playedstate.proto b/lib/spot/proto/playedstate.proto new file mode 100644 index 0000000..fefce00 --- /dev/null +++ b/lib/spot/proto/playedstate.proto @@ -0,0 +1,40 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify_playedstate.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playedstate.proto"; + +message PlayedStateItem { + optional Type type = 1; + optional bytes uri = 2; + optional int64 client_timestamp = 3; + optional int32 play_position = 4; + optional bool played = 5; + optional int32 duration = 6; +} + +message PlayedState { + optional int64 server_timestamp = 1; + optional bool truncated = 2; + repeated PlayedStateItem state = 3; +} + +message PlayedStateItemList { + repeated PlayedStateItem state = 1; +} + +message ContentId { + optional Type type = 1; + optional bytes uri = 2; +} + +message ContentIdList { + repeated ContentId contentIds = 1; +} + +enum Type { + EPISODE = 0; +} diff --git a/lib/spot/proto/player.pb.go b/lib/spot/proto/player.pb.go new file mode 100644 index 0000000..c342c2b --- /dev/null +++ b/lib/spot/proto/player.pb.go @@ -0,0 +1,2723 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: player.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type BitrateLevel int32 + +const ( + BitrateLevel_unknown_bitrate_level BitrateLevel = 0 + BitrateLevel_low BitrateLevel = 1 + BitrateLevel_normal BitrateLevel = 2 + BitrateLevel_high BitrateLevel = 3 + BitrateLevel_very_high BitrateLevel = 4 + BitrateLevel_hifi BitrateLevel = 5 +) + +// Enum value maps for BitrateLevel. +var ( + BitrateLevel_name = map[int32]string{ + 0: "unknown_bitrate_level", + 1: "low", + 2: "normal", + 3: "high", + 4: "very_high", + 5: "hifi", + } + BitrateLevel_value = map[string]int32{ + "unknown_bitrate_level": 0, + "low": 1, + "normal": 2, + "high": 3, + "very_high": 4, + "hifi": 5, + } +) + +func (x BitrateLevel) Enum() *BitrateLevel { + p := new(BitrateLevel) + *p = x + return p +} + +func (x BitrateLevel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BitrateLevel) Descriptor() protoreflect.EnumDescriptor { + return file_player_proto_enumTypes[0].Descriptor() +} + +func (BitrateLevel) Type() protoreflect.EnumType { + return &file_player_proto_enumTypes[0] +} + +func (x BitrateLevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BitrateLevel.Descriptor instead. +func (BitrateLevel) EnumDescriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{0} +} + +type BitrateStrategy int32 + +const ( + BitrateStrategy_unknown_strategy BitrateStrategy = 0 + BitrateStrategy_best_matching BitrateStrategy = 1 + BitrateStrategy_backend_advised BitrateStrategy = 2 + BitrateStrategy_offlined_file BitrateStrategy = 3 + BitrateStrategy_cached_file BitrateStrategy = 4 + BitrateStrategy_local_file BitrateStrategy = 5 +) + +// Enum value maps for BitrateStrategy. +var ( + BitrateStrategy_name = map[int32]string{ + 0: "unknown_strategy", + 1: "best_matching", + 2: "backend_advised", + 3: "offlined_file", + 4: "cached_file", + 5: "local_file", + } + BitrateStrategy_value = map[string]int32{ + "unknown_strategy": 0, + "best_matching": 1, + "backend_advised": 2, + "offlined_file": 3, + "cached_file": 4, + "local_file": 5, + } +) + +func (x BitrateStrategy) Enum() *BitrateStrategy { + p := new(BitrateStrategy) + *p = x + return p +} + +func (x BitrateStrategy) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BitrateStrategy) Descriptor() protoreflect.EnumDescriptor { + return file_player_proto_enumTypes[1].Descriptor() +} + +func (BitrateStrategy) Type() protoreflect.EnumType { + return &file_player_proto_enumTypes[1] +} + +func (x BitrateStrategy) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BitrateStrategy.Descriptor instead. +func (BitrateStrategy) EnumDescriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{1} +} + +type HiFiStatus int32 + +const ( + HiFiStatus_none HiFiStatus = 0 + HiFiStatus_off HiFiStatus = 1 + HiFiStatus_on HiFiStatus = 2 +) + +// Enum value maps for HiFiStatus. +var ( + HiFiStatus_name = map[int32]string{ + 0: "none", + 1: "off", + 2: "on", + } + HiFiStatus_value = map[string]int32{ + "none": 0, + "off": 1, + "on": 2, + } +) + +func (x HiFiStatus) Enum() *HiFiStatus { + p := new(HiFiStatus) + *p = x + return p +} + +func (x HiFiStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (HiFiStatus) Descriptor() protoreflect.EnumDescriptor { + return file_player_proto_enumTypes[2].Descriptor() +} + +func (HiFiStatus) Type() protoreflect.EnumType { + return &file_player_proto_enumTypes[2] +} + +func (x HiFiStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use HiFiStatus.Descriptor instead. +func (HiFiStatus) EnumDescriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{2} +} + +type PlayerState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + ContextUri string `protobuf:"bytes,2,opt,name=context_uri,json=contextUri,proto3" json:"context_uri,omitempty"` + ContextUrl string `protobuf:"bytes,3,opt,name=context_url,json=contextUrl,proto3" json:"context_url,omitempty"` + ContextRestrictions *Restrictions `protobuf:"bytes,4,opt,name=context_restrictions,json=contextRestrictions,proto3" json:"context_restrictions,omitempty"` + PlayOrigin *PlayOrigin `protobuf:"bytes,5,opt,name=play_origin,json=playOrigin,proto3" json:"play_origin,omitempty"` + Index *ContextIndex `protobuf:"bytes,6,opt,name=index,proto3" json:"index,omitempty"` + Track *ProvidedTrack `protobuf:"bytes,7,opt,name=track,proto3" json:"track,omitempty"` + PlaybackId string `protobuf:"bytes,8,opt,name=playback_id,json=playbackId,proto3" json:"playback_id,omitempty"` + PlaybackSpeed float64 `protobuf:"fixed64,9,opt,name=playback_speed,json=playbackSpeed,proto3" json:"playback_speed,omitempty"` + PositionAsOfTimestamp int64 `protobuf:"varint,10,opt,name=position_as_of_timestamp,json=positionAsOfTimestamp,proto3" json:"position_as_of_timestamp,omitempty"` + Duration int64 `protobuf:"varint,11,opt,name=duration,proto3" json:"duration,omitempty"` + IsPlaying bool `protobuf:"varint,12,opt,name=is_playing,json=isPlaying,proto3" json:"is_playing,omitempty"` + IsPaused bool `protobuf:"varint,13,opt,name=is_paused,json=isPaused,proto3" json:"is_paused,omitempty"` + IsBuffering bool `protobuf:"varint,14,opt,name=is_buffering,json=isBuffering,proto3" json:"is_buffering,omitempty"` + IsSystemInitiated bool `protobuf:"varint,15,opt,name=is_system_initiated,json=isSystemInitiated,proto3" json:"is_system_initiated,omitempty"` + Options *ContextPlayerOptions `protobuf:"bytes,16,opt,name=options,proto3" json:"options,omitempty"` + Restrictions *Restrictions `protobuf:"bytes,17,opt,name=restrictions,proto3" json:"restrictions,omitempty"` + Suppressions *Suppressions `protobuf:"bytes,18,opt,name=suppressions,proto3" json:"suppressions,omitempty"` + PrevTracks []*ProvidedTrack `protobuf:"bytes,19,rep,name=prev_tracks,json=prevTracks,proto3" json:"prev_tracks,omitempty"` + NextTracks []*ProvidedTrack `protobuf:"bytes,20,rep,name=next_tracks,json=nextTracks,proto3" json:"next_tracks,omitempty"` + ContextMetadata map[string]string `protobuf:"bytes,21,rep,name=context_metadata,json=contextMetadata,proto3" json:"context_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + PageMetadata map[string]string `protobuf:"bytes,22,rep,name=page_metadata,json=pageMetadata,proto3" json:"page_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + SessionId string `protobuf:"bytes,23,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` + QueueRevision string `protobuf:"bytes,24,opt,name=queue_revision,json=queueRevision,proto3" json:"queue_revision,omitempty"` + Position int64 `protobuf:"varint,25,opt,name=position,proto3" json:"position,omitempty"` + EntityUri string `protobuf:"bytes,26,opt,name=entity_uri,json=entityUri,proto3" json:"entity_uri,omitempty"` + Reverse []*ProvidedTrack `protobuf:"bytes,27,rep,name=reverse,proto3" json:"reverse,omitempty"` + Future []*ProvidedTrack `protobuf:"bytes,28,rep,name=future,proto3" json:"future,omitempty"` + AudioStream string `protobuf:"bytes,29,opt,name=audio_stream,json=audioStream,proto3" json:"audio_stream,omitempty"` + // Deprecated: Do not use. + IsOptional bool `protobuf:"varint,30,opt,name=is_optional,json=isOptional,proto3" json:"is_optional,omitempty"` + // Deprecated: Do not use. + Bitrate int64 `protobuf:"varint,31,opt,name=bitrate,proto3" json:"bitrate,omitempty"` + PlaybackQuality *PlaybackQuality `protobuf:"bytes,32,opt,name=playback_quality,json=playbackQuality,proto3" json:"playback_quality,omitempty"` +} + +func (x *PlayerState) Reset() { + *x = PlayerState{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlayerState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlayerState) ProtoMessage() {} + +func (x *PlayerState) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlayerState.ProtoReflect.Descriptor instead. +func (*PlayerState) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{0} +} + +func (x *PlayerState) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *PlayerState) GetContextUri() string { + if x != nil { + return x.ContextUri + } + return "" +} + +func (x *PlayerState) GetContextUrl() string { + if x != nil { + return x.ContextUrl + } + return "" +} + +func (x *PlayerState) GetContextRestrictions() *Restrictions { + if x != nil { + return x.ContextRestrictions + } + return nil +} + +func (x *PlayerState) GetPlayOrigin() *PlayOrigin { + if x != nil { + return x.PlayOrigin + } + return nil +} + +func (x *PlayerState) GetIndex() *ContextIndex { + if x != nil { + return x.Index + } + return nil +} + +func (x *PlayerState) GetTrack() *ProvidedTrack { + if x != nil { + return x.Track + } + return nil +} + +func (x *PlayerState) GetPlaybackId() string { + if x != nil { + return x.PlaybackId + } + return "" +} + +func (x *PlayerState) GetPlaybackSpeed() float64 { + if x != nil { + return x.PlaybackSpeed + } + return 0 +} + +func (x *PlayerState) GetPositionAsOfTimestamp() int64 { + if x != nil { + return x.PositionAsOfTimestamp + } + return 0 +} + +func (x *PlayerState) GetDuration() int64 { + if x != nil { + return x.Duration + } + return 0 +} + +func (x *PlayerState) GetIsPlaying() bool { + if x != nil { + return x.IsPlaying + } + return false +} + +func (x *PlayerState) GetIsPaused() bool { + if x != nil { + return x.IsPaused + } + return false +} + +func (x *PlayerState) GetIsBuffering() bool { + if x != nil { + return x.IsBuffering + } + return false +} + +func (x *PlayerState) GetIsSystemInitiated() bool { + if x != nil { + return x.IsSystemInitiated + } + return false +} + +func (x *PlayerState) GetOptions() *ContextPlayerOptions { + if x != nil { + return x.Options + } + return nil +} + +func (x *PlayerState) GetRestrictions() *Restrictions { + if x != nil { + return x.Restrictions + } + return nil +} + +func (x *PlayerState) GetSuppressions() *Suppressions { + if x != nil { + return x.Suppressions + } + return nil +} + +func (x *PlayerState) GetPrevTracks() []*ProvidedTrack { + if x != nil { + return x.PrevTracks + } + return nil +} + +func (x *PlayerState) GetNextTracks() []*ProvidedTrack { + if x != nil { + return x.NextTracks + } + return nil +} + +func (x *PlayerState) GetContextMetadata() map[string]string { + if x != nil { + return x.ContextMetadata + } + return nil +} + +func (x *PlayerState) GetPageMetadata() map[string]string { + if x != nil { + return x.PageMetadata + } + return nil +} + +func (x *PlayerState) GetSessionId() string { + if x != nil { + return x.SessionId + } + return "" +} + +func (x *PlayerState) GetQueueRevision() string { + if x != nil { + return x.QueueRevision + } + return "" +} + +func (x *PlayerState) GetPosition() int64 { + if x != nil { + return x.Position + } + return 0 +} + +func (x *PlayerState) GetEntityUri() string { + if x != nil { + return x.EntityUri + } + return "" +} + +func (x *PlayerState) GetReverse() []*ProvidedTrack { + if x != nil { + return x.Reverse + } + return nil +} + +func (x *PlayerState) GetFuture() []*ProvidedTrack { + if x != nil { + return x.Future + } + return nil +} + +func (x *PlayerState) GetAudioStream() string { + if x != nil { + return x.AudioStream + } + return "" +} + +// Deprecated: Do not use. +func (x *PlayerState) GetIsOptional() bool { + if x != nil { + return x.IsOptional + } + return false +} + +// Deprecated: Do not use. +func (x *PlayerState) GetBitrate() int64 { + if x != nil { + return x.Bitrate + } + return 0 +} + +func (x *PlayerState) GetPlaybackQuality() *PlaybackQuality { + if x != nil { + return x.PlaybackQuality + } + return nil +} + +type ProvidedTrack struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` + Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Removed []string `protobuf:"bytes,4,rep,name=removed,proto3" json:"removed,omitempty"` + Blocked []string `protobuf:"bytes,5,rep,name=blocked,proto3" json:"blocked,omitempty"` + Provider string `protobuf:"bytes,6,opt,name=provider,proto3" json:"provider,omitempty"` + Restrictions *Restrictions `protobuf:"bytes,7,opt,name=restrictions,proto3" json:"restrictions,omitempty"` + AlbumUri string `protobuf:"bytes,8,opt,name=album_uri,json=albumUri,proto3" json:"album_uri,omitempty"` + DisallowReasons []string `protobuf:"bytes,9,rep,name=disallow_reasons,json=disallowReasons,proto3" json:"disallow_reasons,omitempty"` + ArtistUri string `protobuf:"bytes,10,opt,name=artist_uri,json=artistUri,proto3" json:"artist_uri,omitempty"` + DisallowUndecided []string `protobuf:"bytes,11,rep,name=disallow_undecided,json=disallowUndecided,proto3" json:"disallow_undecided,omitempty"` +} + +func (x *ProvidedTrack) Reset() { + *x = ProvidedTrack{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvidedTrack) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvidedTrack) ProtoMessage() {} + +func (x *ProvidedTrack) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvidedTrack.ProtoReflect.Descriptor instead. +func (*ProvidedTrack) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{1} +} + +func (x *ProvidedTrack) GetUri() string { + if x != nil { + return x.Uri + } + return "" +} + +func (x *ProvidedTrack) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *ProvidedTrack) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *ProvidedTrack) GetRemoved() []string { + if x != nil { + return x.Removed + } + return nil +} + +func (x *ProvidedTrack) GetBlocked() []string { + if x != nil { + return x.Blocked + } + return nil +} + +func (x *ProvidedTrack) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *ProvidedTrack) GetRestrictions() *Restrictions { + if x != nil { + return x.Restrictions + } + return nil +} + +func (x *ProvidedTrack) GetAlbumUri() string { + if x != nil { + return x.AlbumUri + } + return "" +} + +func (x *ProvidedTrack) GetDisallowReasons() []string { + if x != nil { + return x.DisallowReasons + } + return nil +} + +func (x *ProvidedTrack) GetArtistUri() string { + if x != nil { + return x.ArtistUri + } + return "" +} + +func (x *ProvidedTrack) GetDisallowUndecided() []string { + if x != nil { + return x.DisallowUndecided + } + return nil +} + +type ContextIndex struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Page uint32 `protobuf:"varint,1,opt,name=page,proto3" json:"page,omitempty"` + Track uint32 `protobuf:"varint,2,opt,name=track,proto3" json:"track,omitempty"` +} + +func (x *ContextIndex) Reset() { + *x = ContextIndex{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContextIndex) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContextIndex) ProtoMessage() {} + +func (x *ContextIndex) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContextIndex.ProtoReflect.Descriptor instead. +func (*ContextIndex) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{2} +} + +func (x *ContextIndex) GetPage() uint32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *ContextIndex) GetTrack() uint32 { + if x != nil { + return x.Track + } + return 0 +} + +type Restrictions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DisallowPausingReasons []string `protobuf:"bytes,1,rep,name=disallow_pausing_reasons,json=disallowPausingReasons,proto3" json:"disallow_pausing_reasons,omitempty"` + DisallowResumingReasons []string `protobuf:"bytes,2,rep,name=disallow_resuming_reasons,json=disallowResumingReasons,proto3" json:"disallow_resuming_reasons,omitempty"` + DisallowSeekingReasons []string `protobuf:"bytes,3,rep,name=disallow_seeking_reasons,json=disallowSeekingReasons,proto3" json:"disallow_seeking_reasons,omitempty"` + DisallowPeekingPrevReasons []string `protobuf:"bytes,4,rep,name=disallow_peeking_prev_reasons,json=disallowPeekingPrevReasons,proto3" json:"disallow_peeking_prev_reasons,omitempty"` + DisallowPeekingNextReasons []string `protobuf:"bytes,5,rep,name=disallow_peeking_next_reasons,json=disallowPeekingNextReasons,proto3" json:"disallow_peeking_next_reasons,omitempty"` + DisallowSkippingPrevReasons []string `protobuf:"bytes,6,rep,name=disallow_skipping_prev_reasons,json=disallowSkippingPrevReasons,proto3" json:"disallow_skipping_prev_reasons,omitempty"` + DisallowSkippingNextReasons []string `protobuf:"bytes,7,rep,name=disallow_skipping_next_reasons,json=disallowSkippingNextReasons,proto3" json:"disallow_skipping_next_reasons,omitempty"` + DisallowTogglingRepeatContextReasons []string `protobuf:"bytes,8,rep,name=disallow_toggling_repeat_context_reasons,json=disallowTogglingRepeatContextReasons,proto3" json:"disallow_toggling_repeat_context_reasons,omitempty"` + DisallowTogglingRepeatTrackReasons []string `protobuf:"bytes,9,rep,name=disallow_toggling_repeat_track_reasons,json=disallowTogglingRepeatTrackReasons,proto3" json:"disallow_toggling_repeat_track_reasons,omitempty"` + DisallowTogglingShuffleReasons []string `protobuf:"bytes,10,rep,name=disallow_toggling_shuffle_reasons,json=disallowTogglingShuffleReasons,proto3" json:"disallow_toggling_shuffle_reasons,omitempty"` + DisallowSetQueueReasons []string `protobuf:"bytes,11,rep,name=disallow_set_queue_reasons,json=disallowSetQueueReasons,proto3" json:"disallow_set_queue_reasons,omitempty"` + DisallowInterruptingPlaybackReasons []string `protobuf:"bytes,12,rep,name=disallow_interrupting_playback_reasons,json=disallowInterruptingPlaybackReasons,proto3" json:"disallow_interrupting_playback_reasons,omitempty"` + DisallowTransferringPlaybackReasons []string `protobuf:"bytes,13,rep,name=disallow_transferring_playback_reasons,json=disallowTransferringPlaybackReasons,proto3" json:"disallow_transferring_playback_reasons,omitempty"` + DisallowRemoteControlReasons []string `protobuf:"bytes,14,rep,name=disallow_remote_control_reasons,json=disallowRemoteControlReasons,proto3" json:"disallow_remote_control_reasons,omitempty"` + DisallowInsertingIntoNextTracksReasons []string `protobuf:"bytes,15,rep,name=disallow_inserting_into_next_tracks_reasons,json=disallowInsertingIntoNextTracksReasons,proto3" json:"disallow_inserting_into_next_tracks_reasons,omitempty"` + DisallowInsertingIntoContextTracksReasons []string `protobuf:"bytes,16,rep,name=disallow_inserting_into_context_tracks_reasons,json=disallowInsertingIntoContextTracksReasons,proto3" json:"disallow_inserting_into_context_tracks_reasons,omitempty"` + DisallowReorderingInNextTracksReasons []string `protobuf:"bytes,17,rep,name=disallow_reordering_in_next_tracks_reasons,json=disallowReorderingInNextTracksReasons,proto3" json:"disallow_reordering_in_next_tracks_reasons,omitempty"` + DisallowReorderingInContextTracksReasons []string `protobuf:"bytes,18,rep,name=disallow_reordering_in_context_tracks_reasons,json=disallowReorderingInContextTracksReasons,proto3" json:"disallow_reordering_in_context_tracks_reasons,omitempty"` + DisallowRemovingFromNextTracksReasons []string `protobuf:"bytes,19,rep,name=disallow_removing_from_next_tracks_reasons,json=disallowRemovingFromNextTracksReasons,proto3" json:"disallow_removing_from_next_tracks_reasons,omitempty"` + DisallowRemovingFromContextTracksReasons []string `protobuf:"bytes,20,rep,name=disallow_removing_from_context_tracks_reasons,json=disallowRemovingFromContextTracksReasons,proto3" json:"disallow_removing_from_context_tracks_reasons,omitempty"` + DisallowUpdatingContextReasons []string `protobuf:"bytes,21,rep,name=disallow_updating_context_reasons,json=disallowUpdatingContextReasons,proto3" json:"disallow_updating_context_reasons,omitempty"` + DisallowPlayingReasons []string `protobuf:"bytes,22,rep,name=disallow_playing_reasons,json=disallowPlayingReasons,proto3" json:"disallow_playing_reasons,omitempty"` + DisallowStoppingReasons []string `protobuf:"bytes,23,rep,name=disallow_stopping_reasons,json=disallowStoppingReasons,proto3" json:"disallow_stopping_reasons,omitempty"` +} + +func (x *Restrictions) Reset() { + *x = Restrictions{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Restrictions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Restrictions) ProtoMessage() {} + +func (x *Restrictions) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Restrictions.ProtoReflect.Descriptor instead. +func (*Restrictions) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{3} +} + +func (x *Restrictions) GetDisallowPausingReasons() []string { + if x != nil { + return x.DisallowPausingReasons + } + return nil +} + +func (x *Restrictions) GetDisallowResumingReasons() []string { + if x != nil { + return x.DisallowResumingReasons + } + return nil +} + +func (x *Restrictions) GetDisallowSeekingReasons() []string { + if x != nil { + return x.DisallowSeekingReasons + } + return nil +} + +func (x *Restrictions) GetDisallowPeekingPrevReasons() []string { + if x != nil { + return x.DisallowPeekingPrevReasons + } + return nil +} + +func (x *Restrictions) GetDisallowPeekingNextReasons() []string { + if x != nil { + return x.DisallowPeekingNextReasons + } + return nil +} + +func (x *Restrictions) GetDisallowSkippingPrevReasons() []string { + if x != nil { + return x.DisallowSkippingPrevReasons + } + return nil +} + +func (x *Restrictions) GetDisallowSkippingNextReasons() []string { + if x != nil { + return x.DisallowSkippingNextReasons + } + return nil +} + +func (x *Restrictions) GetDisallowTogglingRepeatContextReasons() []string { + if x != nil { + return x.DisallowTogglingRepeatContextReasons + } + return nil +} + +func (x *Restrictions) GetDisallowTogglingRepeatTrackReasons() []string { + if x != nil { + return x.DisallowTogglingRepeatTrackReasons + } + return nil +} + +func (x *Restrictions) GetDisallowTogglingShuffleReasons() []string { + if x != nil { + return x.DisallowTogglingShuffleReasons + } + return nil +} + +func (x *Restrictions) GetDisallowSetQueueReasons() []string { + if x != nil { + return x.DisallowSetQueueReasons + } + return nil +} + +func (x *Restrictions) GetDisallowInterruptingPlaybackReasons() []string { + if x != nil { + return x.DisallowInterruptingPlaybackReasons + } + return nil +} + +func (x *Restrictions) GetDisallowTransferringPlaybackReasons() []string { + if x != nil { + return x.DisallowTransferringPlaybackReasons + } + return nil +} + +func (x *Restrictions) GetDisallowRemoteControlReasons() []string { + if x != nil { + return x.DisallowRemoteControlReasons + } + return nil +} + +func (x *Restrictions) GetDisallowInsertingIntoNextTracksReasons() []string { + if x != nil { + return x.DisallowInsertingIntoNextTracksReasons + } + return nil +} + +func (x *Restrictions) GetDisallowInsertingIntoContextTracksReasons() []string { + if x != nil { + return x.DisallowInsertingIntoContextTracksReasons + } + return nil +} + +func (x *Restrictions) GetDisallowReorderingInNextTracksReasons() []string { + if x != nil { + return x.DisallowReorderingInNextTracksReasons + } + return nil +} + +func (x *Restrictions) GetDisallowReorderingInContextTracksReasons() []string { + if x != nil { + return x.DisallowReorderingInContextTracksReasons + } + return nil +} + +func (x *Restrictions) GetDisallowRemovingFromNextTracksReasons() []string { + if x != nil { + return x.DisallowRemovingFromNextTracksReasons + } + return nil +} + +func (x *Restrictions) GetDisallowRemovingFromContextTracksReasons() []string { + if x != nil { + return x.DisallowRemovingFromContextTracksReasons + } + return nil +} + +func (x *Restrictions) GetDisallowUpdatingContextReasons() []string { + if x != nil { + return x.DisallowUpdatingContextReasons + } + return nil +} + +func (x *Restrictions) GetDisallowPlayingReasons() []string { + if x != nil { + return x.DisallowPlayingReasons + } + return nil +} + +func (x *Restrictions) GetDisallowStoppingReasons() []string { + if x != nil { + return x.DisallowStoppingReasons + } + return nil +} + +type PlayOrigin struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FeatureIdentifier string `protobuf:"bytes,1,opt,name=feature_identifier,json=featureIdentifier,proto3" json:"feature_identifier,omitempty"` + FeatureVersion string `protobuf:"bytes,2,opt,name=feature_version,json=featureVersion,proto3" json:"feature_version,omitempty"` + ViewUri string `protobuf:"bytes,3,opt,name=view_uri,json=viewUri,proto3" json:"view_uri,omitempty"` + ExternalReferrer string `protobuf:"bytes,4,opt,name=external_referrer,json=externalReferrer,proto3" json:"external_referrer,omitempty"` + ReferrerIdentifier string `protobuf:"bytes,5,opt,name=referrer_identifier,json=referrerIdentifier,proto3" json:"referrer_identifier,omitempty"` + DeviceIdentifier string `protobuf:"bytes,6,opt,name=device_identifier,json=deviceIdentifier,proto3" json:"device_identifier,omitempty"` + FeatureClasses []string `protobuf:"bytes,7,rep,name=feature_classes,json=featureClasses,proto3" json:"feature_classes,omitempty"` +} + +func (x *PlayOrigin) Reset() { + *x = PlayOrigin{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlayOrigin) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlayOrigin) ProtoMessage() {} + +func (x *PlayOrigin) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlayOrigin.ProtoReflect.Descriptor instead. +func (*PlayOrigin) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{4} +} + +func (x *PlayOrigin) GetFeatureIdentifier() string { + if x != nil { + return x.FeatureIdentifier + } + return "" +} + +func (x *PlayOrigin) GetFeatureVersion() string { + if x != nil { + return x.FeatureVersion + } + return "" +} + +func (x *PlayOrigin) GetViewUri() string { + if x != nil { + return x.ViewUri + } + return "" +} + +func (x *PlayOrigin) GetExternalReferrer() string { + if x != nil { + return x.ExternalReferrer + } + return "" +} + +func (x *PlayOrigin) GetReferrerIdentifier() string { + if x != nil { + return x.ReferrerIdentifier + } + return "" +} + +func (x *PlayOrigin) GetDeviceIdentifier() string { + if x != nil { + return x.DeviceIdentifier + } + return "" +} + +func (x *PlayOrigin) GetFeatureClasses() []string { + if x != nil { + return x.FeatureClasses + } + return nil +} + +type ContextPlayerOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ShufflingContext bool `protobuf:"varint,1,opt,name=shuffling_context,json=shufflingContext,proto3" json:"shuffling_context,omitempty"` + RepeatingContext bool `protobuf:"varint,2,opt,name=repeating_context,json=repeatingContext,proto3" json:"repeating_context,omitempty"` + RepeatingTrack bool `protobuf:"varint,3,opt,name=repeating_track,json=repeatingTrack,proto3" json:"repeating_track,omitempty"` +} + +func (x *ContextPlayerOptions) Reset() { + *x = ContextPlayerOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContextPlayerOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContextPlayerOptions) ProtoMessage() {} + +func (x *ContextPlayerOptions) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContextPlayerOptions.ProtoReflect.Descriptor instead. +func (*ContextPlayerOptions) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{5} +} + +func (x *ContextPlayerOptions) GetShufflingContext() bool { + if x != nil { + return x.ShufflingContext + } + return false +} + +func (x *ContextPlayerOptions) GetRepeatingContext() bool { + if x != nil { + return x.RepeatingContext + } + return false +} + +func (x *ContextPlayerOptions) GetRepeatingTrack() bool { + if x != nil { + return x.RepeatingTrack + } + return false +} + +type Suppressions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Providers []string `protobuf:"bytes,1,rep,name=providers,proto3" json:"providers,omitempty"` +} + +func (x *Suppressions) Reset() { + *x = Suppressions{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Suppressions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Suppressions) ProtoMessage() {} + +func (x *Suppressions) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Suppressions.ProtoReflect.Descriptor instead. +func (*Suppressions) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{6} +} + +func (x *Suppressions) GetProviders() []string { + if x != nil { + return x.Providers + } + return nil +} + +type InstrumentationParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InteractionIds []string `protobuf:"bytes,6,rep,name=interaction_ids,json=interactionIds,proto3" json:"interaction_ids,omitempty"` + PageInstanceIds []string `protobuf:"bytes,7,rep,name=page_instance_ids,json=pageInstanceIds,proto3" json:"page_instance_ids,omitempty"` +} + +func (x *InstrumentationParams) Reset() { + *x = InstrumentationParams{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InstrumentationParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstrumentationParams) ProtoMessage() {} + +func (x *InstrumentationParams) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InstrumentationParams.ProtoReflect.Descriptor instead. +func (*InstrumentationParams) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{7} +} + +func (x *InstrumentationParams) GetInteractionIds() []string { + if x != nil { + return x.InteractionIds + } + return nil +} + +func (x *InstrumentationParams) GetPageInstanceIds() []string { + if x != nil { + return x.PageInstanceIds + } + return nil +} + +type Playback struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + PositionAsOfTimestamp int32 `protobuf:"varint,2,opt,name=position_as_of_timestamp,json=positionAsOfTimestamp,proto3" json:"position_as_of_timestamp,omitempty"` + PlaybackSpeed float64 `protobuf:"fixed64,3,opt,name=playback_speed,json=playbackSpeed,proto3" json:"playback_speed,omitempty"` + IsPaused bool `protobuf:"varint,4,opt,name=is_paused,json=isPaused,proto3" json:"is_paused,omitempty"` + CurrentTrack *ContextTrack `protobuf:"bytes,5,opt,name=current_track,json=currentTrack,proto3" json:"current_track,omitempty"` +} + +func (x *Playback) Reset() { + *x = Playback{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Playback) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Playback) ProtoMessage() {} + +func (x *Playback) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Playback.ProtoReflect.Descriptor instead. +func (*Playback) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{8} +} + +func (x *Playback) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *Playback) GetPositionAsOfTimestamp() int32 { + if x != nil { + return x.PositionAsOfTimestamp + } + return 0 +} + +func (x *Playback) GetPlaybackSpeed() float64 { + if x != nil { + return x.PlaybackSpeed + } + return 0 +} + +func (x *Playback) GetIsPaused() bool { + if x != nil { + return x.IsPaused + } + return false +} + +func (x *Playback) GetCurrentTrack() *ContextTrack { + if x != nil { + return x.CurrentTrack + } + return nil +} + +type Queue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tracks []*ContextTrack `protobuf:"bytes,1,rep,name=tracks,proto3" json:"tracks,omitempty"` + IsPlayingQueue bool `protobuf:"varint,2,opt,name=is_playing_queue,json=isPlayingQueue,proto3" json:"is_playing_queue,omitempty"` +} + +func (x *Queue) Reset() { + *x = Queue{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Queue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Queue) ProtoMessage() {} + +func (x *Queue) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Queue.ProtoReflect.Descriptor instead. +func (*Queue) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{9} +} + +func (x *Queue) GetTracks() []*ContextTrack { + if x != nil { + return x.Tracks + } + return nil +} + +func (x *Queue) GetIsPlayingQueue() bool { + if x != nil { + return x.IsPlayingQueue + } + return false +} + +type Session struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PlayOrigin *PlayOrigin `protobuf:"bytes,1,opt,name=play_origin,json=playOrigin,proto3" json:"play_origin,omitempty"` + Context *Context `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` + CurrentUid string `protobuf:"bytes,3,opt,name=current_uid,json=currentUid,proto3" json:"current_uid,omitempty"` + OptionOverrides *ContextPlayerOptionOverrides `protobuf:"bytes,4,opt,name=option_overrides,json=optionOverrides,proto3" json:"option_overrides,omitempty"` + Suppressions *Suppressions `protobuf:"bytes,5,opt,name=suppressions,proto3" json:"suppressions,omitempty"` + InstrumentationParams *InstrumentationParams `protobuf:"bytes,6,opt,name=instrumentation_params,json=instrumentationParams,proto3" json:"instrumentation_params,omitempty"` +} + +func (x *Session) Reset() { + *x = Session{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Session) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Session) ProtoMessage() {} + +func (x *Session) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Session.ProtoReflect.Descriptor instead. +func (*Session) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{10} +} + +func (x *Session) GetPlayOrigin() *PlayOrigin { + if x != nil { + return x.PlayOrigin + } + return nil +} + +func (x *Session) GetContext() *Context { + if x != nil { + return x.Context + } + return nil +} + +func (x *Session) GetCurrentUid() string { + if x != nil { + return x.CurrentUid + } + return "" +} + +func (x *Session) GetOptionOverrides() *ContextPlayerOptionOverrides { + if x != nil { + return x.OptionOverrides + } + return nil +} + +func (x *Session) GetSuppressions() *Suppressions { + if x != nil { + return x.Suppressions + } + return nil +} + +func (x *Session) GetInstrumentationParams() *InstrumentationParams { + if x != nil { + return x.InstrumentationParams + } + return nil +} + +type TransferState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Options *ContextPlayerOptions `protobuf:"bytes,1,opt,name=options,proto3" json:"options,omitempty"` + Playback *Playback `protobuf:"bytes,2,opt,name=playback,proto3" json:"playback,omitempty"` + CurrentSession *Session `protobuf:"bytes,3,opt,name=current_session,json=currentSession,proto3" json:"current_session,omitempty"` + Queue *Queue `protobuf:"bytes,4,opt,name=queue,proto3" json:"queue,omitempty"` +} + +func (x *TransferState) Reset() { + *x = TransferState{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransferState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransferState) ProtoMessage() {} + +func (x *TransferState) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransferState.ProtoReflect.Descriptor instead. +func (*TransferState) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{11} +} + +func (x *TransferState) GetOptions() *ContextPlayerOptions { + if x != nil { + return x.Options + } + return nil +} + +func (x *TransferState) GetPlayback() *Playback { + if x != nil { + return x.Playback + } + return nil +} + +func (x *TransferState) GetCurrentSession() *Session { + if x != nil { + return x.CurrentSession + } + return nil +} + +func (x *TransferState) GetQueue() *Queue { + if x != nil { + return x.Queue + } + return nil +} + +type ContextTrack struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` + Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` + Gid []byte `protobuf:"bytes,3,opt,name=gid,proto3" json:"gid,omitempty"` + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ContextTrack) Reset() { + *x = ContextTrack{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContextTrack) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContextTrack) ProtoMessage() {} + +func (x *ContextTrack) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContextTrack.ProtoReflect.Descriptor instead. +func (*ContextTrack) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{12} +} + +func (x *ContextTrack) GetUri() string { + if x != nil { + return x.Uri + } + return "" +} + +func (x *ContextTrack) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *ContextTrack) GetGid() []byte { + if x != nil { + return x.Gid + } + return nil +} + +func (x *ContextTrack) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +type ContextPlayerOptionOverrides struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ShufflingContext bool `protobuf:"varint,1,opt,name=shuffling_context,json=shufflingContext,proto3" json:"shuffling_context,omitempty"` + RepeatingContext bool `protobuf:"varint,2,opt,name=repeating_context,json=repeatingContext,proto3" json:"repeating_context,omitempty"` + RepeatingTrack bool `protobuf:"varint,3,opt,name=repeating_track,json=repeatingTrack,proto3" json:"repeating_track,omitempty"` +} + +func (x *ContextPlayerOptionOverrides) Reset() { + *x = ContextPlayerOptionOverrides{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContextPlayerOptionOverrides) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContextPlayerOptionOverrides) ProtoMessage() {} + +func (x *ContextPlayerOptionOverrides) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContextPlayerOptionOverrides.ProtoReflect.Descriptor instead. +func (*ContextPlayerOptionOverrides) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{13} +} + +func (x *ContextPlayerOptionOverrides) GetShufflingContext() bool { + if x != nil { + return x.ShufflingContext + } + return false +} + +func (x *ContextPlayerOptionOverrides) GetRepeatingContext() bool { + if x != nil { + return x.RepeatingContext + } + return false +} + +func (x *ContextPlayerOptionOverrides) GetRepeatingTrack() bool { + if x != nil { + return x.RepeatingTrack + } + return false +} + +type Context struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Restrictions *Restrictions `protobuf:"bytes,4,opt,name=restrictions,proto3" json:"restrictions,omitempty"` + Pages []*ContextPage `protobuf:"bytes,5,rep,name=pages,proto3" json:"pages,omitempty"` + Loading bool `protobuf:"varint,6,opt,name=loading,proto3" json:"loading,omitempty"` +} + +func (x *Context) Reset() { + *x = Context{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Context) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Context) ProtoMessage() {} + +func (x *Context) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Context.ProtoReflect.Descriptor instead. +func (*Context) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{14} +} + +func (x *Context) GetUri() string { + if x != nil { + return x.Uri + } + return "" +} + +func (x *Context) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Context) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *Context) GetRestrictions() *Restrictions { + if x != nil { + return x.Restrictions + } + return nil +} + +func (x *Context) GetPages() []*ContextPage { + if x != nil { + return x.Pages + } + return nil +} + +func (x *Context) GetLoading() bool { + if x != nil { + return x.Loading + } + return false +} + +type ContextPage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PageUrl string `protobuf:"bytes,1,opt,name=page_url,json=pageUrl,proto3" json:"page_url,omitempty"` + NextPageUrl string `protobuf:"bytes,2,opt,name=next_page_url,json=nextPageUrl,proto3" json:"next_page_url,omitempty"` + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Tracks []*ContextTrack `protobuf:"bytes,4,rep,name=tracks,proto3" json:"tracks,omitempty"` + Loading bool `protobuf:"varint,5,opt,name=loading,proto3" json:"loading,omitempty"` +} + +func (x *ContextPage) Reset() { + *x = ContextPage{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContextPage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContextPage) ProtoMessage() {} + +func (x *ContextPage) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContextPage.ProtoReflect.Descriptor instead. +func (*ContextPage) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{15} +} + +func (x *ContextPage) GetPageUrl() string { + if x != nil { + return x.PageUrl + } + return "" +} + +func (x *ContextPage) GetNextPageUrl() string { + if x != nil { + return x.NextPageUrl + } + return "" +} + +func (x *ContextPage) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *ContextPage) GetTracks() []*ContextTrack { + if x != nil { + return x.Tracks + } + return nil +} + +func (x *ContextPage) GetLoading() bool { + if x != nil { + return x.Loading + } + return false +} + +type PlayerQueue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + NextTracks []*ProvidedTrack `protobuf:"bytes,2,rep,name=next_tracks,json=nextTracks,proto3" json:"next_tracks,omitempty"` + PrevTracks []*ProvidedTrack `protobuf:"bytes,3,rep,name=prev_tracks,json=prevTracks,proto3" json:"prev_tracks,omitempty"` + Track *ProvidedTrack `protobuf:"bytes,4,opt,name=track,proto3" json:"track,omitempty"` +} + +func (x *PlayerQueue) Reset() { + *x = PlayerQueue{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlayerQueue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlayerQueue) ProtoMessage() {} + +func (x *PlayerQueue) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlayerQueue.ProtoReflect.Descriptor instead. +func (*PlayerQueue) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{16} +} + +func (x *PlayerQueue) GetRevision() string { + if x != nil { + return x.Revision + } + return "" +} + +func (x *PlayerQueue) GetNextTracks() []*ProvidedTrack { + if x != nil { + return x.NextTracks + } + return nil +} + +func (x *PlayerQueue) GetPrevTracks() []*ProvidedTrack { + if x != nil { + return x.PrevTracks + } + return nil +} + +func (x *PlayerQueue) GetTrack() *ProvidedTrack { + if x != nil { + return x.Track + } + return nil +} + +type PlaybackQuality struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BitrateLevel BitrateLevel `protobuf:"varint,1,opt,name=bitrate_level,json=bitrateLevel,proto3,enum=spotify.connectstate.BitrateLevel" json:"bitrate_level,omitempty"` + Strategy BitrateStrategy `protobuf:"varint,2,opt,name=strategy,proto3,enum=spotify.connectstate.BitrateStrategy" json:"strategy,omitempty"` + TargetBitrateLevel BitrateLevel `protobuf:"varint,3,opt,name=target_bitrate_level,json=targetBitrateLevel,proto3,enum=spotify.connectstate.BitrateLevel" json:"target_bitrate_level,omitempty"` + TargetBitrateAvailable bool `protobuf:"varint,4,opt,name=target_bitrate_available,json=targetBitrateAvailable,proto3" json:"target_bitrate_available,omitempty"` + HifiStatus HiFiStatus `protobuf:"varint,5,opt,name=hifi_status,json=hifiStatus,proto3,enum=spotify.connectstate.HiFiStatus" json:"hifi_status,omitempty"` +} + +func (x *PlaybackQuality) Reset() { + *x = PlaybackQuality{} + if protoimpl.UnsafeEnabled { + mi := &file_player_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlaybackQuality) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlaybackQuality) ProtoMessage() {} + +func (x *PlaybackQuality) ProtoReflect() protoreflect.Message { + mi := &file_player_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlaybackQuality.ProtoReflect.Descriptor instead. +func (*PlaybackQuality) Descriptor() ([]byte, []int) { + return file_player_proto_rawDescGZIP(), []int{17} +} + +func (x *PlaybackQuality) GetBitrateLevel() BitrateLevel { + if x != nil { + return x.BitrateLevel + } + return BitrateLevel_unknown_bitrate_level +} + +func (x *PlaybackQuality) GetStrategy() BitrateStrategy { + if x != nil { + return x.Strategy + } + return BitrateStrategy_unknown_strategy +} + +func (x *PlaybackQuality) GetTargetBitrateLevel() BitrateLevel { + if x != nil { + return x.TargetBitrateLevel + } + return BitrateLevel_unknown_bitrate_level +} + +func (x *PlaybackQuality) GetTargetBitrateAvailable() bool { + if x != nil { + return x.TargetBitrateAvailable + } + return false +} + +func (x *PlaybackQuality) GetHifiStatus() HiFiStatus { + if x != nil { + return x.HifiStatus + } + return HiFiStatus_none +} + +var File_player_proto protoreflect.FileDescriptor + +var file_player_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x81, 0x0e, 0x0a, 0x0b, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x72, + 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x55, 0x72, 0x69, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x55, 0x72, 0x6c, 0x12, 0x55, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, + 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x38, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x39, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x74, 0x72, + 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, + 0x63, 0x6b, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, + 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x70, 0x6c, + 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x4f, 0x66, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x12, + 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x50, 0x61, 0x75, 0x73, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x69, 0x73, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, + 0x2e, 0x0a, 0x13, 0x69, 0x73, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x44, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x0c, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, + 0x0c, 0x73, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x75, 0x70, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x74, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, + 0x0a, 0x70, 0x72, 0x65, 0x76, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x44, 0x0a, 0x0b, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x12, 0x61, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, + 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x65, 0x75, 0x65, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x55, 0x72, 0x69, 0x12, + 0x3d, 0x0a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x3b, + 0x0a, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, + 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x1d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x23, + 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x07, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x18, 0x1f, + 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x12, 0x50, 0x0a, 0x10, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x71, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x51, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x52, 0x0f, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x51, 0x75, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x50, 0x61, 0x67, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xed, 0x03, 0x0a, 0x0d, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x4d, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, + 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x46, 0x0a, + 0x0c, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x72, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x5f, 0x75, + 0x72, 0x69, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x55, + 0x72, 0x69, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x69, + 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x55, 0x72, 0x69, 0x12, 0x2d, 0x0a, 0x12, + 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x69, 0x64, + 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x55, 0x6e, 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x64, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x38, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x22, 0xec, 0x0d, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x70, 0x61, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, + 0x61, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, + 0x19, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x69, + 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x65, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x65, 0x65, 0x6b, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x70, 0x65, 0x65, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1a, 0x64, 0x69, 0x73, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x65, 0x65, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x76, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x70, 0x65, 0x65, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1a, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x65, 0x65, 0x6b, 0x69, 0x6e, 0x67, 0x4e, 0x65, + 0x78, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x6b, 0x69, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x76, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x43, + 0x0a, 0x1e, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x53, 0x6b, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x73, 0x12, 0x56, 0x0a, 0x28, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x24, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, + 0x6f, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x26, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x22, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, + 0x49, 0x0a, 0x21, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1e, 0x64, 0x69, 0x73, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x68, 0x75, 0x66, + 0x66, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x64, 0x69, + 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, + 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x65, 0x74, 0x51, 0x75, 0x65, 0x75, 0x65, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x26, 0x64, 0x69, 0x73, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x23, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6c, 0x61, + 0x79, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x26, + 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x23, 0x64, 0x69, + 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x72, 0x69, + 0x6e, 0x67, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x73, 0x12, 0x45, 0x0a, 0x1f, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1c, 0x64, 0x69, 0x73, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, 0x2b, 0x64, 0x69, 0x73, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, + 0x6e, 0x74, 0x6f, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x5f, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x26, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x74, 0x6f, 0x4e, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x61, 0x0a, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x6f, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x5f, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x29, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x74, 0x6f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x2a, 0x64, 0x69, 0x73, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x69, 0x6e, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x25, 0x64, 0x69, + 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x73, 0x12, 0x5f, 0x0a, 0x2d, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x28, 0x64, 0x69, 0x73, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x2a, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x25, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x65, + 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, + 0x5f, 0x0a, 0x2d, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, + 0x18, 0x14, 0x20, 0x03, 0x28, 0x09, 0x52, 0x28, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, + 0x12, 0x49, 0x0a, 0x21, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1e, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x5f, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x73, 0x22, 0xb3, 0x02, 0x0a, 0x0a, 0x50, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x12, 0x2d, 0x0a, 0x12, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x27, 0x0a, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x69, 0x65, 0x77, + 0x5f, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x69, 0x65, 0x77, + 0x55, 0x72, 0x69, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, + 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x27, + 0x0a, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x99, 0x01, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x75, + 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x2b, 0x0a, + 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x0c, 0x53, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x6c, 0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x73, 0x22, + 0xee, 0x01, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x37, 0x0a, 0x18, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x4f, 0x66, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x70, 0x6c, 0x61, + 0x79, 0x62, 0x61, 0x63, 0x6b, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, + 0x5f, 0x70, 0x61, 0x75, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, + 0x73, 0x50, 0x61, 0x75, 0x73, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, + 0x63, 0x6b, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x22, 0x6d, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x06, 0x74, + 0x72, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, + 0x69, 0x6e, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x69, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x22, + 0xb1, 0x03, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0b, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x79, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x37, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x69, 0x64, 0x12, 0x5d, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x0c, 0x73, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x62, 0x0a, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x15, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x22, 0x8c, 0x02, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x70, + 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x08, 0x70, + 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x46, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x31, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x22, 0xcf, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x4c, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x01, 0x0a, 0x1c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x69, + 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x22, 0xce, 0x02, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x47, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x46, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x72, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x70, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x52, 0x05, 0x70, 0x61, 0x67, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, 0x0b, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x67, + 0x65, 0x55, 0x72, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x4b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x06, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf0, 0x01, 0x0a, 0x0b, 0x50, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x52, 0x0a, + 0x6e, 0x65, 0x78, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x44, 0x0a, 0x0b, 0x70, 0x72, + 0x65, 0x76, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x12, 0x39, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x22, 0xf0, 0x02, 0x0a, 0x0f, + 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, + 0x47, 0x0a, 0x0d, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x69, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0c, 0x62, 0x69, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x41, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x42, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x54, 0x0a, 0x14, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x42, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x12, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x12, 0x38, 0x0a, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x69, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x69, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x68, + 0x69, 0x66, 0x69, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x48, 0x69, 0x46, 0x69, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x0a, 0x68, 0x69, 0x66, 0x69, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x61, + 0x0a, 0x0c, 0x42, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, + 0x0a, 0x15, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x6c, 0x6f, 0x77, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x76, 0x65, 0x72, 0x79, + 0x5f, 0x68, 0x69, 0x67, 0x68, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x68, 0x69, 0x66, 0x69, 0x10, + 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x0f, 0x42, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x62, + 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x13, + 0x0a, 0x0f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x61, 0x64, 0x76, 0x69, 0x73, 0x65, + 0x64, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x64, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x10, 0x05, 0x2a, 0x27, 0x0a, 0x0a, 0x48, 0x69, 0x46, 0x69, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, + 0x07, 0x0a, 0x03, 0x6f, 0x66, 0x66, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x6f, 0x6e, 0x10, 0x02, + 0x42, 0x45, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x48, 0x02, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, 0x61, + 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, 0x6f, + 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_player_proto_rawDescOnce sync.Once + file_player_proto_rawDescData = file_player_proto_rawDesc +) + +func file_player_proto_rawDescGZIP() []byte { + file_player_proto_rawDescOnce.Do(func() { + file_player_proto_rawDescData = protoimpl.X.CompressGZIP(file_player_proto_rawDescData) + }) + return file_player_proto_rawDescData +} + +var file_player_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_player_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_player_proto_goTypes = []interface{}{ + (BitrateLevel)(0), // 0: spotify.connectstate.BitrateLevel + (BitrateStrategy)(0), // 1: spotify.connectstate.BitrateStrategy + (HiFiStatus)(0), // 2: spotify.connectstate.HiFiStatus + (*PlayerState)(nil), // 3: spotify.connectstate.PlayerState + (*ProvidedTrack)(nil), // 4: spotify.connectstate.ProvidedTrack + (*ContextIndex)(nil), // 5: spotify.connectstate.ContextIndex + (*Restrictions)(nil), // 6: spotify.connectstate.Restrictions + (*PlayOrigin)(nil), // 7: spotify.connectstate.PlayOrigin + (*ContextPlayerOptions)(nil), // 8: spotify.connectstate.ContextPlayerOptions + (*Suppressions)(nil), // 9: spotify.connectstate.Suppressions + (*InstrumentationParams)(nil), // 10: spotify.connectstate.InstrumentationParams + (*Playback)(nil), // 11: spotify.connectstate.Playback + (*Queue)(nil), // 12: spotify.connectstate.Queue + (*Session)(nil), // 13: spotify.connectstate.Session + (*TransferState)(nil), // 14: spotify.connectstate.TransferState + (*ContextTrack)(nil), // 15: spotify.connectstate.ContextTrack + (*ContextPlayerOptionOverrides)(nil), // 16: spotify.connectstate.ContextPlayerOptionOverrides + (*Context)(nil), // 17: spotify.connectstate.Context + (*ContextPage)(nil), // 18: spotify.connectstate.ContextPage + (*PlayerQueue)(nil), // 19: spotify.connectstate.PlayerQueue + (*PlaybackQuality)(nil), // 20: spotify.connectstate.PlaybackQuality + nil, // 21: spotify.connectstate.PlayerState.ContextMetadataEntry + nil, // 22: spotify.connectstate.PlayerState.PageMetadataEntry + nil, // 23: spotify.connectstate.ProvidedTrack.MetadataEntry + nil, // 24: spotify.connectstate.ContextTrack.MetadataEntry + nil, // 25: spotify.connectstate.Context.MetadataEntry + nil, // 26: spotify.connectstate.ContextPage.MetadataEntry +} +var file_player_proto_depIdxs = []int32{ + 6, // 0: spotify.connectstate.PlayerState.context_restrictions:type_name -> spotify.connectstate.Restrictions + 7, // 1: spotify.connectstate.PlayerState.play_origin:type_name -> spotify.connectstate.PlayOrigin + 5, // 2: spotify.connectstate.PlayerState.index:type_name -> spotify.connectstate.ContextIndex + 4, // 3: spotify.connectstate.PlayerState.track:type_name -> spotify.connectstate.ProvidedTrack + 8, // 4: spotify.connectstate.PlayerState.options:type_name -> spotify.connectstate.ContextPlayerOptions + 6, // 5: spotify.connectstate.PlayerState.restrictions:type_name -> spotify.connectstate.Restrictions + 9, // 6: spotify.connectstate.PlayerState.suppressions:type_name -> spotify.connectstate.Suppressions + 4, // 7: spotify.connectstate.PlayerState.prev_tracks:type_name -> spotify.connectstate.ProvidedTrack + 4, // 8: spotify.connectstate.PlayerState.next_tracks:type_name -> spotify.connectstate.ProvidedTrack + 21, // 9: spotify.connectstate.PlayerState.context_metadata:type_name -> spotify.connectstate.PlayerState.ContextMetadataEntry + 22, // 10: spotify.connectstate.PlayerState.page_metadata:type_name -> spotify.connectstate.PlayerState.PageMetadataEntry + 4, // 11: spotify.connectstate.PlayerState.reverse:type_name -> spotify.connectstate.ProvidedTrack + 4, // 12: spotify.connectstate.PlayerState.future:type_name -> spotify.connectstate.ProvidedTrack + 20, // 13: spotify.connectstate.PlayerState.playback_quality:type_name -> spotify.connectstate.PlaybackQuality + 23, // 14: spotify.connectstate.ProvidedTrack.metadata:type_name -> spotify.connectstate.ProvidedTrack.MetadataEntry + 6, // 15: spotify.connectstate.ProvidedTrack.restrictions:type_name -> spotify.connectstate.Restrictions + 15, // 16: spotify.connectstate.Playback.current_track:type_name -> spotify.connectstate.ContextTrack + 15, // 17: spotify.connectstate.Queue.tracks:type_name -> spotify.connectstate.ContextTrack + 7, // 18: spotify.connectstate.Session.play_origin:type_name -> spotify.connectstate.PlayOrigin + 17, // 19: spotify.connectstate.Session.context:type_name -> spotify.connectstate.Context + 16, // 20: spotify.connectstate.Session.option_overrides:type_name -> spotify.connectstate.ContextPlayerOptionOverrides + 9, // 21: spotify.connectstate.Session.suppressions:type_name -> spotify.connectstate.Suppressions + 10, // 22: spotify.connectstate.Session.instrumentation_params:type_name -> spotify.connectstate.InstrumentationParams + 8, // 23: spotify.connectstate.TransferState.options:type_name -> spotify.connectstate.ContextPlayerOptions + 11, // 24: spotify.connectstate.TransferState.playback:type_name -> spotify.connectstate.Playback + 13, // 25: spotify.connectstate.TransferState.current_session:type_name -> spotify.connectstate.Session + 12, // 26: spotify.connectstate.TransferState.queue:type_name -> spotify.connectstate.Queue + 24, // 27: spotify.connectstate.ContextTrack.metadata:type_name -> spotify.connectstate.ContextTrack.MetadataEntry + 25, // 28: spotify.connectstate.Context.metadata:type_name -> spotify.connectstate.Context.MetadataEntry + 6, // 29: spotify.connectstate.Context.restrictions:type_name -> spotify.connectstate.Restrictions + 18, // 30: spotify.connectstate.Context.pages:type_name -> spotify.connectstate.ContextPage + 26, // 31: spotify.connectstate.ContextPage.metadata:type_name -> spotify.connectstate.ContextPage.MetadataEntry + 15, // 32: spotify.connectstate.ContextPage.tracks:type_name -> spotify.connectstate.ContextTrack + 4, // 33: spotify.connectstate.PlayerQueue.next_tracks:type_name -> spotify.connectstate.ProvidedTrack + 4, // 34: spotify.connectstate.PlayerQueue.prev_tracks:type_name -> spotify.connectstate.ProvidedTrack + 4, // 35: spotify.connectstate.PlayerQueue.track:type_name -> spotify.connectstate.ProvidedTrack + 0, // 36: spotify.connectstate.PlaybackQuality.bitrate_level:type_name -> spotify.connectstate.BitrateLevel + 1, // 37: spotify.connectstate.PlaybackQuality.strategy:type_name -> spotify.connectstate.BitrateStrategy + 0, // 38: spotify.connectstate.PlaybackQuality.target_bitrate_level:type_name -> spotify.connectstate.BitrateLevel + 2, // 39: spotify.connectstate.PlaybackQuality.hifi_status:type_name -> spotify.connectstate.HiFiStatus + 40, // [40:40] is the sub-list for method output_type + 40, // [40:40] is the sub-list for method input_type + 40, // [40:40] is the sub-list for extension type_name + 40, // [40:40] is the sub-list for extension extendee + 0, // [0:40] is the sub-list for field type_name +} + +func init() { file_player_proto_init() } +func file_player_proto_init() { + if File_player_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_player_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlayerState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvidedTrack); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContextIndex); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Restrictions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlayOrigin); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContextPlayerOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Suppressions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstrumentationParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Playback); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Queue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Session); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransferState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContextTrack); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContextPlayerOptionOverrides); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Context); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContextPage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlayerQueue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_player_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlaybackQuality); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_player_proto_rawDesc, + NumEnums: 3, + NumMessages: 24, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_player_proto_goTypes, + DependencyIndexes: file_player_proto_depIdxs, + EnumInfos: file_player_proto_enumTypes, + MessageInfos: file_player_proto_msgTypes, + }.Build() + File_player_proto = out.File + file_player_proto_rawDesc = nil + file_player_proto_goTypes = nil + file_player_proto_depIdxs = nil +} diff --git a/lib/spot/proto/player.proto b/lib/spot/proto/player.proto new file mode 100644 index 0000000..6a91c5e --- /dev/null +++ b/lib/spot/proto/player.proto @@ -0,0 +1,212 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.connectstate; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.connectstate.model"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message PlayerState { + int64 timestamp = 1; + string context_uri = 2; + string context_url = 3; + Restrictions context_restrictions = 4; + PlayOrigin play_origin = 5; + ContextIndex index = 6; + ProvidedTrack track = 7; + string playback_id = 8; + double playback_speed = 9; + int64 position_as_of_timestamp = 10; + int64 duration = 11; + bool is_playing = 12; + bool is_paused = 13; + bool is_buffering = 14; + bool is_system_initiated = 15; + ContextPlayerOptions options = 16; + Restrictions restrictions = 17; + Suppressions suppressions = 18; + repeated ProvidedTrack prev_tracks = 19; + repeated ProvidedTrack next_tracks = 20; + map context_metadata = 21; + map page_metadata = 22; + string session_id = 23; + string queue_revision = 24; + int64 position = 25; + string entity_uri = 26; + repeated ProvidedTrack reverse = 27; + repeated ProvidedTrack future = 28; + string audio_stream = 29; + bool is_optional = 30 [deprecated = true]; + int64 bitrate = 31 [deprecated = true]; + PlaybackQuality playback_quality = 32; +} + +message ProvidedTrack { + string uri = 1; + string uid = 2; + map metadata = 3; + repeated string removed = 4; + repeated string blocked = 5; + string provider = 6; + Restrictions restrictions = 7; + string album_uri = 8; + repeated string disallow_reasons = 9; + string artist_uri = 10; + repeated string disallow_undecided = 11; +} + +message ContextIndex { + uint32 page = 1; + uint32 track = 2; +} + +message Restrictions { + repeated string disallow_pausing_reasons = 1; + repeated string disallow_resuming_reasons = 2; + repeated string disallow_seeking_reasons = 3; + repeated string disallow_peeking_prev_reasons = 4; + repeated string disallow_peeking_next_reasons = 5; + repeated string disallow_skipping_prev_reasons = 6; + repeated string disallow_skipping_next_reasons = 7; + repeated string disallow_toggling_repeat_context_reasons = 8; + repeated string disallow_toggling_repeat_track_reasons = 9; + repeated string disallow_toggling_shuffle_reasons = 10; + repeated string disallow_set_queue_reasons = 11; + repeated string disallow_interrupting_playback_reasons = 12; + repeated string disallow_transferring_playback_reasons = 13; + repeated string disallow_remote_control_reasons = 14; + repeated string disallow_inserting_into_next_tracks_reasons = 15; + repeated string disallow_inserting_into_context_tracks_reasons = 16; + repeated string disallow_reordering_in_next_tracks_reasons = 17; + repeated string disallow_reordering_in_context_tracks_reasons = 18; + repeated string disallow_removing_from_next_tracks_reasons = 19; + repeated string disallow_removing_from_context_tracks_reasons = 20; + repeated string disallow_updating_context_reasons = 21; + repeated string disallow_playing_reasons = 22; + repeated string disallow_stopping_reasons = 23; +} + +message PlayOrigin { + string feature_identifier = 1; + string feature_version = 2; + string view_uri = 3; + string external_referrer = 4; + string referrer_identifier = 5; + string device_identifier = 6; + repeated string feature_classes = 7; +} + +message ContextPlayerOptions { + bool shuffling_context = 1; + bool repeating_context = 2; + bool repeating_track = 3; +} + +message Suppressions { + repeated string providers = 1; +} + +message InstrumentationParams { + repeated string interaction_ids = 6; + repeated string page_instance_ids = 7; +} + +message Playback { + int64 timestamp = 1; + int32 position_as_of_timestamp = 2; + double playback_speed = 3; + bool is_paused = 4; + ContextTrack current_track = 5; +} + +message Queue { + repeated ContextTrack tracks = 1; + bool is_playing_queue = 2; +} + +message Session { + PlayOrigin play_origin = 1; + Context context = 2; + string current_uid = 3; + ContextPlayerOptionOverrides option_overrides = 4; + Suppressions suppressions = 5; + InstrumentationParams instrumentation_params = 6; +} + +message TransferState { + ContextPlayerOptions options = 1; + Playback playback = 2; + Session current_session = 3; + Queue queue = 4; +} + +message ContextTrack { + string uri = 1; + string uid = 2; + bytes gid = 3; + map metadata = 4; +} + +message ContextPlayerOptionOverrides { + bool shuffling_context = 1; + bool repeating_context = 2; + bool repeating_track = 3; +} + +message Context { + string uri = 1; + string url = 2; + map metadata = 3; + Restrictions restrictions = 4; + repeated ContextPage pages = 5; + bool loading = 6; +} + +message ContextPage { + string page_url = 1; + string next_page_url = 2; + map metadata = 3; + repeated ContextTrack tracks = 4; + bool loading = 5; +} + +message PlayerQueue { + string revision = 1; + repeated ProvidedTrack next_tracks = 2; + repeated ProvidedTrack prev_tracks = 3; + ProvidedTrack track = 4; +} + +message PlaybackQuality { + BitrateLevel bitrate_level = 1; + BitrateStrategy strategy = 2; + BitrateLevel target_bitrate_level = 3; + bool target_bitrate_available = 4; + HiFiStatus hifi_status = 5; +} + +enum BitrateLevel { + unknown_bitrate_level = 0; + low = 1; + normal = 2; + high = 3; + very_high = 4; + hifi = 5; +} + +enum BitrateStrategy { + unknown_strategy = 0; + best_matching = 1; + backend_advised = 2; + offlined_file = 3; + cached_file = 4; + local_file = 5; +} + +enum HiFiStatus { + none = 0; + off = 1; + on = 2; +} diff --git a/lib/spot/proto/player_license.proto b/lib/spot/proto/player_license.proto new file mode 100644 index 0000000..3d0e905 --- /dev/null +++ b/lib/spot/proto/player_license.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message PlayerLicense { + optional string identifier = 1; +} diff --git a/lib/spot/proto/player_model.proto b/lib/spot/proto/player_model.proto new file mode 100644 index 0000000..6856ca0 --- /dev/null +++ b/lib/spot/proto/player_model.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "logging_params.proto"; + +option optimize_for = CODE_SIZE; + +message PlayerModel { + optional bool is_paused = 1; + optional uint64 hash = 2; + optional LoggingParams logging_params = 3; + + optional StartReason start_reason = 4; + enum StartReason { + REMOTE_TRANSFER = 0; + COMEBACK = 1; + PLAY_CONTEXT = 2; + PLAY_SPECIFIC_TRACK = 3; + TRACK_FINISHED = 4; + SKIP_TO_NEXT_TRACK = 5; + SKIP_TO_PREV_TRACK = 6; + ERROR = 7; + IGNORED = 8; + UNKNOWN = 9; + } +} diff --git a/lib/spot/proto/playlist4_external.pb.go b/lib/spot/proto/playlist4_external.pb.go new file mode 100644 index 0000000..2310eda --- /dev/null +++ b/lib/spot/proto/playlist4_external.pb.go @@ -0,0 +1,3762 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: playlist4_external.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ListAttributeKind int32 + +const ( + ListAttributeKind_LIST_UNKNOWN ListAttributeKind = 0 + ListAttributeKind_LIST_NAME ListAttributeKind = 1 + ListAttributeKind_LIST_DESCRIPTION ListAttributeKind = 2 + ListAttributeKind_LIST_PICTURE ListAttributeKind = 3 + ListAttributeKind_LIST_COLLABORATIVE ListAttributeKind = 4 + ListAttributeKind_LIST_PL3_VERSION ListAttributeKind = 5 + ListAttributeKind_LIST_DELETED_BY_OWNER ListAttributeKind = 6 + ListAttributeKind_LIST_CLIENT_ID ListAttributeKind = 10 + ListAttributeKind_LIST_FORMAT ListAttributeKind = 11 + ListAttributeKind_LIST_FORMAT_ATTRIBUTES ListAttributeKind = 12 + ListAttributeKind_LIST_PICTURE_SIZE ListAttributeKind = 13 +) + +// Enum value maps for ListAttributeKind. +var ( + ListAttributeKind_name = map[int32]string{ + 0: "LIST_UNKNOWN", + 1: "LIST_NAME", + 2: "LIST_DESCRIPTION", + 3: "LIST_PICTURE", + 4: "LIST_COLLABORATIVE", + 5: "LIST_PL3_VERSION", + 6: "LIST_DELETED_BY_OWNER", + 10: "LIST_CLIENT_ID", + 11: "LIST_FORMAT", + 12: "LIST_FORMAT_ATTRIBUTES", + 13: "LIST_PICTURE_SIZE", + } + ListAttributeKind_value = map[string]int32{ + "LIST_UNKNOWN": 0, + "LIST_NAME": 1, + "LIST_DESCRIPTION": 2, + "LIST_PICTURE": 3, + "LIST_COLLABORATIVE": 4, + "LIST_PL3_VERSION": 5, + "LIST_DELETED_BY_OWNER": 6, + "LIST_CLIENT_ID": 10, + "LIST_FORMAT": 11, + "LIST_FORMAT_ATTRIBUTES": 12, + "LIST_PICTURE_SIZE": 13, + } +) + +func (x ListAttributeKind) Enum() *ListAttributeKind { + p := new(ListAttributeKind) + *p = x + return p +} + +func (x ListAttributeKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ListAttributeKind) Descriptor() protoreflect.EnumDescriptor { + return file_playlist4_external_proto_enumTypes[0].Descriptor() +} + +func (ListAttributeKind) Type() protoreflect.EnumType { + return &file_playlist4_external_proto_enumTypes[0] +} + +func (x ListAttributeKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ListAttributeKind) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ListAttributeKind(num) + return nil +} + +// Deprecated: Use ListAttributeKind.Descriptor instead. +func (ListAttributeKind) EnumDescriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{0} +} + +type ItemAttributeKind int32 + +const ( + ItemAttributeKind_ITEM_UNKNOWN ItemAttributeKind = 0 + ItemAttributeKind_ITEM_ADDED_BY ItemAttributeKind = 1 + ItemAttributeKind_ITEM_TIMESTAMP ItemAttributeKind = 2 + ItemAttributeKind_ITEM_SEEN_AT ItemAttributeKind = 9 + ItemAttributeKind_ITEM_PUBLIC ItemAttributeKind = 10 + ItemAttributeKind_ITEM_FORMAT_ATTRIBUTES ItemAttributeKind = 11 + ItemAttributeKind_ITEM_ID ItemAttributeKind = 12 +) + +// Enum value maps for ItemAttributeKind. +var ( + ItemAttributeKind_name = map[int32]string{ + 0: "ITEM_UNKNOWN", + 1: "ITEM_ADDED_BY", + 2: "ITEM_TIMESTAMP", + 9: "ITEM_SEEN_AT", + 10: "ITEM_PUBLIC", + 11: "ITEM_FORMAT_ATTRIBUTES", + 12: "ITEM_ID", + } + ItemAttributeKind_value = map[string]int32{ + "ITEM_UNKNOWN": 0, + "ITEM_ADDED_BY": 1, + "ITEM_TIMESTAMP": 2, + "ITEM_SEEN_AT": 9, + "ITEM_PUBLIC": 10, + "ITEM_FORMAT_ATTRIBUTES": 11, + "ITEM_ID": 12, + } +) + +func (x ItemAttributeKind) Enum() *ItemAttributeKind { + p := new(ItemAttributeKind) + *p = x + return p +} + +func (x ItemAttributeKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ItemAttributeKind) Descriptor() protoreflect.EnumDescriptor { + return file_playlist4_external_proto_enumTypes[1].Descriptor() +} + +func (ItemAttributeKind) Type() protoreflect.EnumType { + return &file_playlist4_external_proto_enumTypes[1] +} + +func (x ItemAttributeKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ItemAttributeKind) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ItemAttributeKind(num) + return nil +} + +// Deprecated: Use ItemAttributeKind.Descriptor instead. +func (ItemAttributeKind) EnumDescriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{1} +} + +type GeoblockBlockingType int32 + +const ( + GeoblockBlockingType_GEOBLOCK_BLOCKING_TYPE_UNSPECIFIED GeoblockBlockingType = 0 + GeoblockBlockingType_GEOBLOCK_BLOCKING_TYPE_TITLE GeoblockBlockingType = 1 + GeoblockBlockingType_GEOBLOCK_BLOCKING_TYPE_DESCRIPTION GeoblockBlockingType = 2 + GeoblockBlockingType_GEOBLOCK_BLOCKING_TYPE_IMAGE GeoblockBlockingType = 3 +) + +// Enum value maps for GeoblockBlockingType. +var ( + GeoblockBlockingType_name = map[int32]string{ + 0: "GEOBLOCK_BLOCKING_TYPE_UNSPECIFIED", + 1: "GEOBLOCK_BLOCKING_TYPE_TITLE", + 2: "GEOBLOCK_BLOCKING_TYPE_DESCRIPTION", + 3: "GEOBLOCK_BLOCKING_TYPE_IMAGE", + } + GeoblockBlockingType_value = map[string]int32{ + "GEOBLOCK_BLOCKING_TYPE_UNSPECIFIED": 0, + "GEOBLOCK_BLOCKING_TYPE_TITLE": 1, + "GEOBLOCK_BLOCKING_TYPE_DESCRIPTION": 2, + "GEOBLOCK_BLOCKING_TYPE_IMAGE": 3, + } +) + +func (x GeoblockBlockingType) Enum() *GeoblockBlockingType { + p := new(GeoblockBlockingType) + *p = x + return p +} + +func (x GeoblockBlockingType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GeoblockBlockingType) Descriptor() protoreflect.EnumDescriptor { + return file_playlist4_external_proto_enumTypes[2].Descriptor() +} + +func (GeoblockBlockingType) Type() protoreflect.EnumType { + return &file_playlist4_external_proto_enumTypes[2] +} + +func (x GeoblockBlockingType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *GeoblockBlockingType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = GeoblockBlockingType(num) + return nil +} + +// Deprecated: Use GeoblockBlockingType.Descriptor instead. +func (GeoblockBlockingType) EnumDescriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{2} +} + +type Op_Kind int32 + +const ( + Op_KIND_UNKNOWN Op_Kind = 0 + Op_ADD Op_Kind = 2 + Op_REM Op_Kind = 3 + Op_MOV Op_Kind = 4 + Op_UPDATE_ITEM_ATTRIBUTES Op_Kind = 5 + Op_UPDATE_LIST_ATTRIBUTES Op_Kind = 6 +) + +// Enum value maps for Op_Kind. +var ( + Op_Kind_name = map[int32]string{ + 0: "KIND_UNKNOWN", + 2: "ADD", + 3: "REM", + 4: "MOV", + 5: "UPDATE_ITEM_ATTRIBUTES", + 6: "UPDATE_LIST_ATTRIBUTES", + } + Op_Kind_value = map[string]int32{ + "KIND_UNKNOWN": 0, + "ADD": 2, + "REM": 3, + "MOV": 4, + "UPDATE_ITEM_ATTRIBUTES": 5, + "UPDATE_LIST_ATTRIBUTES": 6, + } +) + +func (x Op_Kind) Enum() *Op_Kind { + p := new(Op_Kind) + *p = x + return p +} + +func (x Op_Kind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Op_Kind) Descriptor() protoreflect.EnumDescriptor { + return file_playlist4_external_proto_enumTypes[3].Descriptor() +} + +func (Op_Kind) Type() protoreflect.EnumType { + return &file_playlist4_external_proto_enumTypes[3] +} + +func (x Op_Kind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Op_Kind) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Op_Kind(num) + return nil +} + +// Deprecated: Use Op_Kind.Descriptor instead. +func (Op_Kind) EnumDescriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{14, 0} +} + +type SourceInfo_Client int32 + +const ( + SourceInfo_CLIENT_UNKNOWN SourceInfo_Client = 0 + SourceInfo_NATIVE_HERMES SourceInfo_Client = 1 + SourceInfo_CLIENT SourceInfo_Client = 2 + SourceInfo_PYTHON SourceInfo_Client = 3 + SourceInfo_JAVA SourceInfo_Client = 4 + SourceInfo_WEBPLAYER SourceInfo_Client = 5 + SourceInfo_LIBSPOTIFY SourceInfo_Client = 6 +) + +// Enum value maps for SourceInfo_Client. +var ( + SourceInfo_Client_name = map[int32]string{ + 0: "CLIENT_UNKNOWN", + 1: "NATIVE_HERMES", + 2: "CLIENT", + 3: "PYTHON", + 4: "JAVA", + 5: "WEBPLAYER", + 6: "LIBSPOTIFY", + } + SourceInfo_Client_value = map[string]int32{ + "CLIENT_UNKNOWN": 0, + "NATIVE_HERMES": 1, + "CLIENT": 2, + "PYTHON": 3, + "JAVA": 4, + "WEBPLAYER": 5, + "LIBSPOTIFY": 6, + } +) + +func (x SourceInfo_Client) Enum() *SourceInfo_Client { + p := new(SourceInfo_Client) + *p = x + return p +} + +func (x SourceInfo_Client) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SourceInfo_Client) Descriptor() protoreflect.EnumDescriptor { + return file_playlist4_external_proto_enumTypes[4].Descriptor() +} + +func (SourceInfo_Client) Type() protoreflect.EnumType { + return &file_playlist4_external_proto_enumTypes[4] +} + +func (x SourceInfo_Client) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *SourceInfo_Client) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = SourceInfo_Client(num) + return nil +} + +// Deprecated: Use SourceInfo_Client.Descriptor instead. +func (SourceInfo_Client) EnumDescriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{17, 0} +} + +type Item struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri *string `protobuf:"bytes,1,req,name=uri" json:"uri,omitempty"` + Attributes *ItemAttributes `protobuf:"bytes,2,opt,name=attributes" json:"attributes,omitempty"` +} + +func (x *Item) Reset() { + *x = Item{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Item) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Item) ProtoMessage() {} + +func (x *Item) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Item.ProtoReflect.Descriptor instead. +func (*Item) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{0} +} + +func (x *Item) GetUri() string { + if x != nil && x.Uri != nil { + return *x.Uri + } + return "" +} + +func (x *Item) GetAttributes() *ItemAttributes { + if x != nil { + return x.Attributes + } + return nil +} + +type MetaItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision []byte `protobuf:"bytes,1,opt,name=revision" json:"revision,omitempty"` + Attributes *ListAttributes `protobuf:"bytes,2,opt,name=attributes" json:"attributes,omitempty"` + Length *int32 `protobuf:"varint,3,opt,name=length" json:"length,omitempty"` + Timestamp *int64 `protobuf:"varint,4,opt,name=timestamp" json:"timestamp,omitempty"` + OwnerUsername *string `protobuf:"bytes,5,opt,name=owner_username,json=ownerUsername" json:"owner_username,omitempty"` + AbuseReportingEnabled *bool `protobuf:"varint,6,opt,name=abuse_reporting_enabled,json=abuseReportingEnabled" json:"abuse_reporting_enabled,omitempty"` + Capabilities *Capabilities `protobuf:"bytes,7,opt,name=capabilities" json:"capabilities,omitempty"` +} + +func (x *MetaItem) Reset() { + *x = MetaItem{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetaItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetaItem) ProtoMessage() {} + +func (x *MetaItem) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetaItem.ProtoReflect.Descriptor instead. +func (*MetaItem) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{1} +} + +func (x *MetaItem) GetRevision() []byte { + if x != nil { + return x.Revision + } + return nil +} + +func (x *MetaItem) GetAttributes() *ListAttributes { + if x != nil { + return x.Attributes + } + return nil +} + +func (x *MetaItem) GetLength() int32 { + if x != nil && x.Length != nil { + return *x.Length + } + return 0 +} + +func (x *MetaItem) GetTimestamp() int64 { + if x != nil && x.Timestamp != nil { + return *x.Timestamp + } + return 0 +} + +func (x *MetaItem) GetOwnerUsername() string { + if x != nil && x.OwnerUsername != nil { + return *x.OwnerUsername + } + return "" +} + +func (x *MetaItem) GetAbuseReportingEnabled() bool { + if x != nil && x.AbuseReportingEnabled != nil { + return *x.AbuseReportingEnabled + } + return false +} + +func (x *MetaItem) GetCapabilities() *Capabilities { + if x != nil { + return x.Capabilities + } + return nil +} + +type ListItems struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Pos *int32 `protobuf:"varint,1,req,name=pos" json:"pos,omitempty"` + Truncated *bool `protobuf:"varint,2,req,name=truncated" json:"truncated,omitempty"` + Items []*Item `protobuf:"bytes,3,rep,name=items" json:"items,omitempty"` + MetaItems []*MetaItem `protobuf:"bytes,4,rep,name=meta_items,json=metaItems" json:"meta_items,omitempty"` +} + +func (x *ListItems) Reset() { + *x = ListItems{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListItems) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListItems) ProtoMessage() {} + +func (x *ListItems) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListItems.ProtoReflect.Descriptor instead. +func (*ListItems) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{2} +} + +func (x *ListItems) GetPos() int32 { + if x != nil && x.Pos != nil { + return *x.Pos + } + return 0 +} + +func (x *ListItems) GetTruncated() bool { + if x != nil && x.Truncated != nil { + return *x.Truncated + } + return false +} + +func (x *ListItems) GetItems() []*Item { + if x != nil { + return x.Items + } + return nil +} + +func (x *ListItems) GetMetaItems() []*MetaItem { + if x != nil { + return x.MetaItems + } + return nil +} + +type FormatListAttribute struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (x *FormatListAttribute) Reset() { + *x = FormatListAttribute{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FormatListAttribute) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FormatListAttribute) ProtoMessage() {} + +func (x *FormatListAttribute) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FormatListAttribute.ProtoReflect.Descriptor instead. +func (*FormatListAttribute) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{3} +} + +func (x *FormatListAttribute) GetKey() string { + if x != nil && x.Key != nil { + return *x.Key + } + return "" +} + +func (x *FormatListAttribute) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +type PictureSize struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetName *string `protobuf:"bytes,1,opt,name=target_name,json=targetName" json:"target_name,omitempty"` + Url *string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` +} + +func (x *PictureSize) Reset() { + *x = PictureSize{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PictureSize) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PictureSize) ProtoMessage() {} + +func (x *PictureSize) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PictureSize.ProtoReflect.Descriptor instead. +func (*PictureSize) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{4} +} + +func (x *PictureSize) GetTargetName() string { + if x != nil && x.TargetName != nil { + return *x.TargetName + } + return "" +} + +func (x *PictureSize) GetUrl() string { + if x != nil && x.Url != nil { + return *x.Url + } + return "" +} + +type ListAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Description *string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"` + Picture []byte `protobuf:"bytes,3,opt,name=picture" json:"picture,omitempty"` + Collaborative *bool `protobuf:"varint,4,opt,name=collaborative" json:"collaborative,omitempty"` + Pl3Version *string `protobuf:"bytes,5,opt,name=pl3_version,json=pl3Version" json:"pl3_version,omitempty"` + DeletedByOwner *bool `protobuf:"varint,6,opt,name=deleted_by_owner,json=deletedByOwner" json:"deleted_by_owner,omitempty"` + ClientId *string `protobuf:"bytes,10,opt,name=client_id,json=clientId" json:"client_id,omitempty"` + Format *string `protobuf:"bytes,11,opt,name=format" json:"format,omitempty"` + FormatAttributes []*FormatListAttribute `protobuf:"bytes,12,rep,name=format_attributes,json=formatAttributes" json:"format_attributes,omitempty"` + PictureSize []*PictureSize `protobuf:"bytes,13,rep,name=picture_size,json=pictureSize" json:"picture_size,omitempty"` +} + +func (x *ListAttributes) Reset() { + *x = ListAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAttributes) ProtoMessage() {} + +func (x *ListAttributes) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAttributes.ProtoReflect.Descriptor instead. +func (*ListAttributes) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{5} +} + +func (x *ListAttributes) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *ListAttributes) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *ListAttributes) GetPicture() []byte { + if x != nil { + return x.Picture + } + return nil +} + +func (x *ListAttributes) GetCollaborative() bool { + if x != nil && x.Collaborative != nil { + return *x.Collaborative + } + return false +} + +func (x *ListAttributes) GetPl3Version() string { + if x != nil && x.Pl3Version != nil { + return *x.Pl3Version + } + return "" +} + +func (x *ListAttributes) GetDeletedByOwner() bool { + if x != nil && x.DeletedByOwner != nil { + return *x.DeletedByOwner + } + return false +} + +func (x *ListAttributes) GetClientId() string { + if x != nil && x.ClientId != nil { + return *x.ClientId + } + return "" +} + +func (x *ListAttributes) GetFormat() string { + if x != nil && x.Format != nil { + return *x.Format + } + return "" +} + +func (x *ListAttributes) GetFormatAttributes() []*FormatListAttribute { + if x != nil { + return x.FormatAttributes + } + return nil +} + +func (x *ListAttributes) GetPictureSize() []*PictureSize { + if x != nil { + return x.PictureSize + } + return nil +} + +type ItemAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AddedBy *string `protobuf:"bytes,1,opt,name=added_by,json=addedBy" json:"added_by,omitempty"` + Timestamp *int64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` + SeenAt *int64 `protobuf:"varint,9,opt,name=seen_at,json=seenAt" json:"seen_at,omitempty"` + Public *bool `protobuf:"varint,10,opt,name=public" json:"public,omitempty"` + FormatAttributes []*FormatListAttribute `protobuf:"bytes,11,rep,name=format_attributes,json=formatAttributes" json:"format_attributes,omitempty"` + ItemId []byte `protobuf:"bytes,12,opt,name=item_id,json=itemId" json:"item_id,omitempty"` +} + +func (x *ItemAttributes) Reset() { + *x = ItemAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ItemAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ItemAttributes) ProtoMessage() {} + +func (x *ItemAttributes) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ItemAttributes.ProtoReflect.Descriptor instead. +func (*ItemAttributes) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{6} +} + +func (x *ItemAttributes) GetAddedBy() string { + if x != nil && x.AddedBy != nil { + return *x.AddedBy + } + return "" +} + +func (x *ItemAttributes) GetTimestamp() int64 { + if x != nil && x.Timestamp != nil { + return *x.Timestamp + } + return 0 +} + +func (x *ItemAttributes) GetSeenAt() int64 { + if x != nil && x.SeenAt != nil { + return *x.SeenAt + } + return 0 +} + +func (x *ItemAttributes) GetPublic() bool { + if x != nil && x.Public != nil { + return *x.Public + } + return false +} + +func (x *ItemAttributes) GetFormatAttributes() []*FormatListAttribute { + if x != nil { + return x.FormatAttributes + } + return nil +} + +func (x *ItemAttributes) GetItemId() []byte { + if x != nil { + return x.ItemId + } + return nil +} + +type Add struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FromIndex *int32 `protobuf:"varint,1,opt,name=from_index,json=fromIndex" json:"from_index,omitempty"` + Items []*Item `protobuf:"bytes,2,rep,name=items" json:"items,omitempty"` + AddLast *bool `protobuf:"varint,4,opt,name=add_last,json=addLast" json:"add_last,omitempty"` + AddFirst *bool `protobuf:"varint,5,opt,name=add_first,json=addFirst" json:"add_first,omitempty"` +} + +func (x *Add) Reset() { + *x = Add{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Add) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Add) ProtoMessage() {} + +func (x *Add) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Add.ProtoReflect.Descriptor instead. +func (*Add) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{7} +} + +func (x *Add) GetFromIndex() int32 { + if x != nil && x.FromIndex != nil { + return *x.FromIndex + } + return 0 +} + +func (x *Add) GetItems() []*Item { + if x != nil { + return x.Items + } + return nil +} + +func (x *Add) GetAddLast() bool { + if x != nil && x.AddLast != nil { + return *x.AddLast + } + return false +} + +func (x *Add) GetAddFirst() bool { + if x != nil && x.AddFirst != nil { + return *x.AddFirst + } + return false +} + +type Rem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FromIndex *int32 `protobuf:"varint,1,opt,name=from_index,json=fromIndex" json:"from_index,omitempty"` + Length *int32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` + Items []*Item `protobuf:"bytes,3,rep,name=items" json:"items,omitempty"` + ItemsAsKey *bool `protobuf:"varint,7,opt,name=items_as_key,json=itemsAsKey" json:"items_as_key,omitempty"` +} + +func (x *Rem) Reset() { + *x = Rem{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Rem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Rem) ProtoMessage() {} + +func (x *Rem) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Rem.ProtoReflect.Descriptor instead. +func (*Rem) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{8} +} + +func (x *Rem) GetFromIndex() int32 { + if x != nil && x.FromIndex != nil { + return *x.FromIndex + } + return 0 +} + +func (x *Rem) GetLength() int32 { + if x != nil && x.Length != nil { + return *x.Length + } + return 0 +} + +func (x *Rem) GetItems() []*Item { + if x != nil { + return x.Items + } + return nil +} + +func (x *Rem) GetItemsAsKey() bool { + if x != nil && x.ItemsAsKey != nil { + return *x.ItemsAsKey + } + return false +} + +type Mov struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FromIndex *int32 `protobuf:"varint,1,req,name=from_index,json=fromIndex" json:"from_index,omitempty"` + Length *int32 `protobuf:"varint,2,req,name=length" json:"length,omitempty"` + ToIndex *int32 `protobuf:"varint,3,req,name=to_index,json=toIndex" json:"to_index,omitempty"` +} + +func (x *Mov) Reset() { + *x = Mov{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Mov) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Mov) ProtoMessage() {} + +func (x *Mov) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Mov.ProtoReflect.Descriptor instead. +func (*Mov) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{9} +} + +func (x *Mov) GetFromIndex() int32 { + if x != nil && x.FromIndex != nil { + return *x.FromIndex + } + return 0 +} + +func (x *Mov) GetLength() int32 { + if x != nil && x.Length != nil { + return *x.Length + } + return 0 +} + +func (x *Mov) GetToIndex() int32 { + if x != nil && x.ToIndex != nil { + return *x.ToIndex + } + return 0 +} + +type ItemAttributesPartialState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Values *ItemAttributes `protobuf:"bytes,1,req,name=values" json:"values,omitempty"` + NoValue []ItemAttributeKind `protobuf:"varint,2,rep,name=no_value,json=noValue,enum=spotify.playlist4.proto.ItemAttributeKind" json:"no_value,omitempty"` +} + +func (x *ItemAttributesPartialState) Reset() { + *x = ItemAttributesPartialState{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ItemAttributesPartialState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ItemAttributesPartialState) ProtoMessage() {} + +func (x *ItemAttributesPartialState) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ItemAttributesPartialState.ProtoReflect.Descriptor instead. +func (*ItemAttributesPartialState) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{10} +} + +func (x *ItemAttributesPartialState) GetValues() *ItemAttributes { + if x != nil { + return x.Values + } + return nil +} + +func (x *ItemAttributesPartialState) GetNoValue() []ItemAttributeKind { + if x != nil { + return x.NoValue + } + return nil +} + +type ListAttributesPartialState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Values *ListAttributes `protobuf:"bytes,1,req,name=values" json:"values,omitempty"` + NoValue []ListAttributeKind `protobuf:"varint,2,rep,name=no_value,json=noValue,enum=spotify.playlist4.proto.ListAttributeKind" json:"no_value,omitempty"` +} + +func (x *ListAttributesPartialState) Reset() { + *x = ListAttributesPartialState{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAttributesPartialState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAttributesPartialState) ProtoMessage() {} + +func (x *ListAttributesPartialState) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAttributesPartialState.ProtoReflect.Descriptor instead. +func (*ListAttributesPartialState) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{11} +} + +func (x *ListAttributesPartialState) GetValues() *ListAttributes { + if x != nil { + return x.Values + } + return nil +} + +func (x *ListAttributesPartialState) GetNoValue() []ListAttributeKind { + if x != nil { + return x.NoValue + } + return nil +} + +type UpdateItemAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index *int32 `protobuf:"varint,1,req,name=index" json:"index,omitempty"` + NewAttributes *ItemAttributesPartialState `protobuf:"bytes,2,req,name=new_attributes,json=newAttributes" json:"new_attributes,omitempty"` + OldAttributes *ItemAttributesPartialState `protobuf:"bytes,3,opt,name=old_attributes,json=oldAttributes" json:"old_attributes,omitempty"` +} + +func (x *UpdateItemAttributes) Reset() { + *x = UpdateItemAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateItemAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateItemAttributes) ProtoMessage() {} + +func (x *UpdateItemAttributes) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateItemAttributes.ProtoReflect.Descriptor instead. +func (*UpdateItemAttributes) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateItemAttributes) GetIndex() int32 { + if x != nil && x.Index != nil { + return *x.Index + } + return 0 +} + +func (x *UpdateItemAttributes) GetNewAttributes() *ItemAttributesPartialState { + if x != nil { + return x.NewAttributes + } + return nil +} + +func (x *UpdateItemAttributes) GetOldAttributes() *ItemAttributesPartialState { + if x != nil { + return x.OldAttributes + } + return nil +} + +type UpdateListAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewAttributes *ListAttributesPartialState `protobuf:"bytes,1,req,name=new_attributes,json=newAttributes" json:"new_attributes,omitempty"` + OldAttributes *ListAttributesPartialState `protobuf:"bytes,2,opt,name=old_attributes,json=oldAttributes" json:"old_attributes,omitempty"` +} + +func (x *UpdateListAttributes) Reset() { + *x = UpdateListAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateListAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateListAttributes) ProtoMessage() {} + +func (x *UpdateListAttributes) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateListAttributes.ProtoReflect.Descriptor instead. +func (*UpdateListAttributes) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{13} +} + +func (x *UpdateListAttributes) GetNewAttributes() *ListAttributesPartialState { + if x != nil { + return x.NewAttributes + } + return nil +} + +func (x *UpdateListAttributes) GetOldAttributes() *ListAttributesPartialState { + if x != nil { + return x.OldAttributes + } + return nil +} + +type Op struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind *Op_Kind `protobuf:"varint,1,req,name=kind,enum=spotify.playlist4.proto.Op_Kind" json:"kind,omitempty"` + Add *Add `protobuf:"bytes,2,opt,name=add" json:"add,omitempty"` + Rem *Rem `protobuf:"bytes,3,opt,name=rem" json:"rem,omitempty"` + Mov *Mov `protobuf:"bytes,4,opt,name=mov" json:"mov,omitempty"` + UpdateItemAttributes *UpdateItemAttributes `protobuf:"bytes,5,opt,name=update_item_attributes,json=updateItemAttributes" json:"update_item_attributes,omitempty"` + UpdateListAttributes *UpdateListAttributes `protobuf:"bytes,6,opt,name=update_list_attributes,json=updateListAttributes" json:"update_list_attributes,omitempty"` +} + +func (x *Op) Reset() { + *x = Op{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Op) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Op) ProtoMessage() {} + +func (x *Op) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Op.ProtoReflect.Descriptor instead. +func (*Op) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{14} +} + +func (x *Op) GetKind() Op_Kind { + if x != nil && x.Kind != nil { + return *x.Kind + } + return Op_KIND_UNKNOWN +} + +func (x *Op) GetAdd() *Add { + if x != nil { + return x.Add + } + return nil +} + +func (x *Op) GetRem() *Rem { + if x != nil { + return x.Rem + } + return nil +} + +func (x *Op) GetMov() *Mov { + if x != nil { + return x.Mov + } + return nil +} + +func (x *Op) GetUpdateItemAttributes() *UpdateItemAttributes { + if x != nil { + return x.UpdateItemAttributes + } + return nil +} + +func (x *Op) GetUpdateListAttributes() *UpdateListAttributes { + if x != nil { + return x.UpdateListAttributes + } + return nil +} + +type OpList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ops []*Op `protobuf:"bytes,1,rep,name=ops" json:"ops,omitempty"` +} + +func (x *OpList) Reset() { + *x = OpList{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpList) ProtoMessage() {} + +func (x *OpList) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpList.ProtoReflect.Descriptor instead. +func (*OpList) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{15} +} + +func (x *OpList) GetOps() []*Op { + if x != nil { + return x.Ops + } + return nil +} + +type ChangeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *string `protobuf:"bytes,1,opt,name=user" json:"user,omitempty"` + Timestamp *int64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"` + Admin *bool `protobuf:"varint,3,opt,name=admin" json:"admin,omitempty"` + Undo *bool `protobuf:"varint,4,opt,name=undo" json:"undo,omitempty"` + Redo *bool `protobuf:"varint,5,opt,name=redo" json:"redo,omitempty"` + Merge *bool `protobuf:"varint,6,opt,name=merge" json:"merge,omitempty"` + Compressed *bool `protobuf:"varint,7,opt,name=compressed" json:"compressed,omitempty"` + Migration *bool `protobuf:"varint,8,opt,name=migration" json:"migration,omitempty"` + SplitId *int32 `protobuf:"varint,9,opt,name=split_id,json=splitId" json:"split_id,omitempty"` + Source *SourceInfo `protobuf:"bytes,10,opt,name=source" json:"source,omitempty"` +} + +func (x *ChangeInfo) Reset() { + *x = ChangeInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeInfo) ProtoMessage() {} + +func (x *ChangeInfo) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeInfo.ProtoReflect.Descriptor instead. +func (*ChangeInfo) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{16} +} + +func (x *ChangeInfo) GetUser() string { + if x != nil && x.User != nil { + return *x.User + } + return "" +} + +func (x *ChangeInfo) GetTimestamp() int64 { + if x != nil && x.Timestamp != nil { + return *x.Timestamp + } + return 0 +} + +func (x *ChangeInfo) GetAdmin() bool { + if x != nil && x.Admin != nil { + return *x.Admin + } + return false +} + +func (x *ChangeInfo) GetUndo() bool { + if x != nil && x.Undo != nil { + return *x.Undo + } + return false +} + +func (x *ChangeInfo) GetRedo() bool { + if x != nil && x.Redo != nil { + return *x.Redo + } + return false +} + +func (x *ChangeInfo) GetMerge() bool { + if x != nil && x.Merge != nil { + return *x.Merge + } + return false +} + +func (x *ChangeInfo) GetCompressed() bool { + if x != nil && x.Compressed != nil { + return *x.Compressed + } + return false +} + +func (x *ChangeInfo) GetMigration() bool { + if x != nil && x.Migration != nil { + return *x.Migration + } + return false +} + +func (x *ChangeInfo) GetSplitId() int32 { + if x != nil && x.SplitId != nil { + return *x.SplitId + } + return 0 +} + +func (x *ChangeInfo) GetSource() *SourceInfo { + if x != nil { + return x.Source + } + return nil +} + +type SourceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Client *SourceInfo_Client `protobuf:"varint,1,opt,name=client,enum=spotify.playlist4.proto.SourceInfo_Client" json:"client,omitempty"` + App *string `protobuf:"bytes,3,opt,name=app" json:"app,omitempty"` + Source *string `protobuf:"bytes,4,opt,name=source" json:"source,omitempty"` + Version *string `protobuf:"bytes,5,opt,name=version" json:"version,omitempty"` +} + +func (x *SourceInfo) Reset() { + *x = SourceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SourceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SourceInfo) ProtoMessage() {} + +func (x *SourceInfo) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SourceInfo.ProtoReflect.Descriptor instead. +func (*SourceInfo) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{17} +} + +func (x *SourceInfo) GetClient() SourceInfo_Client { + if x != nil && x.Client != nil { + return *x.Client + } + return SourceInfo_CLIENT_UNKNOWN +} + +func (x *SourceInfo) GetApp() string { + if x != nil && x.App != nil { + return *x.App + } + return "" +} + +func (x *SourceInfo) GetSource() string { + if x != nil && x.Source != nil { + return *x.Source + } + return "" +} + +func (x *SourceInfo) GetVersion() string { + if x != nil && x.Version != nil { + return *x.Version + } + return "" +} + +type Delta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BaseVersion []byte `protobuf:"bytes,1,opt,name=base_version,json=baseVersion" json:"base_version,omitempty"` + Ops []*Op `protobuf:"bytes,2,rep,name=ops" json:"ops,omitempty"` + Info *ChangeInfo `protobuf:"bytes,4,opt,name=info" json:"info,omitempty"` +} + +func (x *Delta) Reset() { + *x = Delta{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Delta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Delta) ProtoMessage() {} + +func (x *Delta) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Delta.ProtoReflect.Descriptor instead. +func (*Delta) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{18} +} + +func (x *Delta) GetBaseVersion() []byte { + if x != nil { + return x.BaseVersion + } + return nil +} + +func (x *Delta) GetOps() []*Op { + if x != nil { + return x.Ops + } + return nil +} + +func (x *Delta) GetInfo() *ChangeInfo { + if x != nil { + return x.Info + } + return nil +} + +type Diff struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FromRevision []byte `protobuf:"bytes,1,req,name=from_revision,json=fromRevision" json:"from_revision,omitempty"` + Ops []*Op `protobuf:"bytes,2,rep,name=ops" json:"ops,omitempty"` + ToRevision []byte `protobuf:"bytes,3,req,name=to_revision,json=toRevision" json:"to_revision,omitempty"` +} + +func (x *Diff) Reset() { + *x = Diff{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Diff) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Diff) ProtoMessage() {} + +func (x *Diff) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Diff.ProtoReflect.Descriptor instead. +func (*Diff) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{19} +} + +func (x *Diff) GetFromRevision() []byte { + if x != nil { + return x.FromRevision + } + return nil +} + +func (x *Diff) GetOps() []*Op { + if x != nil { + return x.Ops + } + return nil +} + +func (x *Diff) GetToRevision() []byte { + if x != nil { + return x.ToRevision + } + return nil +} + +type ListChanges struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BaseRevision []byte `protobuf:"bytes,1,opt,name=base_revision,json=baseRevision" json:"base_revision,omitempty"` + Deltas []*Delta `protobuf:"bytes,2,rep,name=deltas" json:"deltas,omitempty"` + WantResultingRevisions *bool `protobuf:"varint,3,opt,name=want_resulting_revisions,json=wantResultingRevisions" json:"want_resulting_revisions,omitempty"` + WantSyncResult *bool `protobuf:"varint,4,opt,name=want_sync_result,json=wantSyncResult" json:"want_sync_result,omitempty"` + Nonces []int64 `protobuf:"varint,6,rep,name=nonces" json:"nonces,omitempty"` +} + +func (x *ListChanges) Reset() { + *x = ListChanges{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListChanges) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListChanges) ProtoMessage() {} + +func (x *ListChanges) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListChanges.ProtoReflect.Descriptor instead. +func (*ListChanges) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{20} +} + +func (x *ListChanges) GetBaseRevision() []byte { + if x != nil { + return x.BaseRevision + } + return nil +} + +func (x *ListChanges) GetDeltas() []*Delta { + if x != nil { + return x.Deltas + } + return nil +} + +func (x *ListChanges) GetWantResultingRevisions() bool { + if x != nil && x.WantResultingRevisions != nil { + return *x.WantResultingRevisions + } + return false +} + +func (x *ListChanges) GetWantSyncResult() bool { + if x != nil && x.WantSyncResult != nil { + return *x.WantSyncResult + } + return false +} + +func (x *ListChanges) GetNonces() []int64 { + if x != nil { + return x.Nonces + } + return nil +} + +type SelectedListContent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision []byte `protobuf:"bytes,1,opt,name=revision" json:"revision,omitempty"` + Length *int32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` + Attributes *ListAttributes `protobuf:"bytes,3,opt,name=attributes" json:"attributes,omitempty"` + Contents *ListItems `protobuf:"bytes,5,opt,name=contents" json:"contents,omitempty"` + Diff *Diff `protobuf:"bytes,6,opt,name=diff" json:"diff,omitempty"` + SyncResult *Diff `protobuf:"bytes,7,opt,name=sync_result,json=syncResult" json:"sync_result,omitempty"` + ResultingRevisions [][]byte `protobuf:"bytes,8,rep,name=resulting_revisions,json=resultingRevisions" json:"resulting_revisions,omitempty"` + MultipleHeads *bool `protobuf:"varint,9,opt,name=multiple_heads,json=multipleHeads" json:"multiple_heads,omitempty"` + UpToDate *bool `protobuf:"varint,10,opt,name=up_to_date,json=upToDate" json:"up_to_date,omitempty"` + Nonces []int64 `protobuf:"varint,14,rep,name=nonces" json:"nonces,omitempty"` + Timestamp *int64 `protobuf:"varint,15,opt,name=timestamp" json:"timestamp,omitempty"` + OwnerUsername *string `protobuf:"bytes,16,opt,name=owner_username,json=ownerUsername" json:"owner_username,omitempty"` + AbuseReportingEnabled *bool `protobuf:"varint,17,opt,name=abuse_reporting_enabled,json=abuseReportingEnabled" json:"abuse_reporting_enabled,omitempty"` + Capabilities *Capabilities `protobuf:"bytes,18,opt,name=capabilities" json:"capabilities,omitempty"` + Geoblock []GeoblockBlockingType `protobuf:"varint,19,rep,name=geoblock,enum=spotify.playlist4.proto.GeoblockBlockingType" json:"geoblock,omitempty"` +} + +func (x *SelectedListContent) Reset() { + *x = SelectedListContent{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SelectedListContent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SelectedListContent) ProtoMessage() {} + +func (x *SelectedListContent) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SelectedListContent.ProtoReflect.Descriptor instead. +func (*SelectedListContent) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{21} +} + +func (x *SelectedListContent) GetRevision() []byte { + if x != nil { + return x.Revision + } + return nil +} + +func (x *SelectedListContent) GetLength() int32 { + if x != nil && x.Length != nil { + return *x.Length + } + return 0 +} + +func (x *SelectedListContent) GetAttributes() *ListAttributes { + if x != nil { + return x.Attributes + } + return nil +} + +func (x *SelectedListContent) GetContents() *ListItems { + if x != nil { + return x.Contents + } + return nil +} + +func (x *SelectedListContent) GetDiff() *Diff { + if x != nil { + return x.Diff + } + return nil +} + +func (x *SelectedListContent) GetSyncResult() *Diff { + if x != nil { + return x.SyncResult + } + return nil +} + +func (x *SelectedListContent) GetResultingRevisions() [][]byte { + if x != nil { + return x.ResultingRevisions + } + return nil +} + +func (x *SelectedListContent) GetMultipleHeads() bool { + if x != nil && x.MultipleHeads != nil { + return *x.MultipleHeads + } + return false +} + +func (x *SelectedListContent) GetUpToDate() bool { + if x != nil && x.UpToDate != nil { + return *x.UpToDate + } + return false +} + +func (x *SelectedListContent) GetNonces() []int64 { + if x != nil { + return x.Nonces + } + return nil +} + +func (x *SelectedListContent) GetTimestamp() int64 { + if x != nil && x.Timestamp != nil { + return *x.Timestamp + } + return 0 +} + +func (x *SelectedListContent) GetOwnerUsername() string { + if x != nil && x.OwnerUsername != nil { + return *x.OwnerUsername + } + return "" +} + +func (x *SelectedListContent) GetAbuseReportingEnabled() bool { + if x != nil && x.AbuseReportingEnabled != nil { + return *x.AbuseReportingEnabled + } + return false +} + +func (x *SelectedListContent) GetCapabilities() *Capabilities { + if x != nil { + return x.Capabilities + } + return nil +} + +func (x *SelectedListContent) GetGeoblock() []GeoblockBlockingType { + if x != nil { + return x.Geoblock + } + return nil +} + +type CreateListReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri *string `protobuf:"bytes,1,req,name=uri" json:"uri,omitempty"` + Revision []byte `protobuf:"bytes,2,opt,name=revision" json:"revision,omitempty"` +} + +func (x *CreateListReply) Reset() { + *x = CreateListReply{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateListReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateListReply) ProtoMessage() {} + +func (x *CreateListReply) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateListReply.ProtoReflect.Descriptor instead. +func (*CreateListReply) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{22} +} + +func (x *CreateListReply) GetUri() string { + if x != nil && x.Uri != nil { + return *x.Uri + } + return "" +} + +func (x *CreateListReply) GetRevision() []byte { + if x != nil { + return x.Revision + } + return nil +} + +type PlaylistV1UriRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + V2Uris []string `protobuf:"bytes,1,rep,name=v2_uris,json=v2Uris" json:"v2_uris,omitempty"` +} + +func (x *PlaylistV1UriRequest) Reset() { + *x = PlaylistV1UriRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlaylistV1UriRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlaylistV1UriRequest) ProtoMessage() {} + +func (x *PlaylistV1UriRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlaylistV1UriRequest.ProtoReflect.Descriptor instead. +func (*PlaylistV1UriRequest) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{23} +} + +func (x *PlaylistV1UriRequest) GetV2Uris() []string { + if x != nil { + return x.V2Uris + } + return nil +} + +type PlaylistV1UriReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + V2UriToV1Uri map[string]string `protobuf:"bytes,1,rep,name=v2_uri_to_v1_uri,json=v2UriToV1Uri" json:"v2_uri_to_v1_uri,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (x *PlaylistV1UriReply) Reset() { + *x = PlaylistV1UriReply{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlaylistV1UriReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlaylistV1UriReply) ProtoMessage() {} + +func (x *PlaylistV1UriReply) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlaylistV1UriReply.ProtoReflect.Descriptor instead. +func (*PlaylistV1UriReply) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{24} +} + +func (x *PlaylistV1UriReply) GetV2UriToV1Uri() map[string]string { + if x != nil { + return x.V2UriToV1Uri + } + return nil +} + +type ListUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BaseRevision []byte `protobuf:"bytes,1,opt,name=base_revision,json=baseRevision" json:"base_revision,omitempty"` + Attributes *ListAttributes `protobuf:"bytes,2,opt,name=attributes" json:"attributes,omitempty"` + Items []*Item `protobuf:"bytes,3,rep,name=items" json:"items,omitempty"` + Info *ChangeInfo `protobuf:"bytes,4,opt,name=info" json:"info,omitempty"` +} + +func (x *ListUpdateRequest) Reset() { + *x = ListUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUpdateRequest) ProtoMessage() {} + +func (x *ListUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListUpdateRequest.ProtoReflect.Descriptor instead. +func (*ListUpdateRequest) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{25} +} + +func (x *ListUpdateRequest) GetBaseRevision() []byte { + if x != nil { + return x.BaseRevision + } + return nil +} + +func (x *ListUpdateRequest) GetAttributes() *ListAttributes { + if x != nil { + return x.Attributes + } + return nil +} + +func (x *ListUpdateRequest) GetItems() []*Item { + if x != nil { + return x.Items + } + return nil +} + +func (x *ListUpdateRequest) GetInfo() *ChangeInfo { + if x != nil { + return x.Info + } + return nil +} + +type RegisterPlaylistImageRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UploadToken *string `protobuf:"bytes,1,opt,name=upload_token,json=uploadToken" json:"upload_token,omitempty"` +} + +func (x *RegisterPlaylistImageRequest) Reset() { + *x = RegisterPlaylistImageRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterPlaylistImageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterPlaylistImageRequest) ProtoMessage() {} + +func (x *RegisterPlaylistImageRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterPlaylistImageRequest.ProtoReflect.Descriptor instead. +func (*RegisterPlaylistImageRequest) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{26} +} + +func (x *RegisterPlaylistImageRequest) GetUploadToken() string { + if x != nil && x.UploadToken != nil { + return *x.UploadToken + } + return "" +} + +type RegisterPlaylistImageResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Picture []byte `protobuf:"bytes,1,opt,name=picture" json:"picture,omitempty"` +} + +func (x *RegisterPlaylistImageResponse) Reset() { + *x = RegisterPlaylistImageResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterPlaylistImageResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterPlaylistImageResponse) ProtoMessage() {} + +func (x *RegisterPlaylistImageResponse) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterPlaylistImageResponse.ProtoReflect.Descriptor instead. +func (*RegisterPlaylistImageResponse) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{27} +} + +func (x *RegisterPlaylistImageResponse) GetPicture() []byte { + if x != nil { + return x.Picture + } + return nil +} + +type ResolvedPersonalizedPlaylist struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri *string `protobuf:"bytes,1,opt,name=uri" json:"uri,omitempty"` + Tag *string `protobuf:"bytes,2,opt,name=tag" json:"tag,omitempty"` +} + +func (x *ResolvedPersonalizedPlaylist) Reset() { + *x = ResolvedPersonalizedPlaylist{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResolvedPersonalizedPlaylist) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResolvedPersonalizedPlaylist) ProtoMessage() {} + +func (x *ResolvedPersonalizedPlaylist) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResolvedPersonalizedPlaylist.ProtoReflect.Descriptor instead. +func (*ResolvedPersonalizedPlaylist) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{28} +} + +func (x *ResolvedPersonalizedPlaylist) GetUri() string { + if x != nil && x.Uri != nil { + return *x.Uri + } + return "" +} + +func (x *ResolvedPersonalizedPlaylist) GetTag() string { + if x != nil && x.Tag != nil { + return *x.Tag + } + return "" +} + +type PlaylistUriResolverResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResolvedPlaylists []*ResolvedPersonalizedPlaylist `protobuf:"bytes,1,rep,name=resolved_playlists,json=resolvedPlaylists" json:"resolved_playlists,omitempty"` +} + +func (x *PlaylistUriResolverResponse) Reset() { + *x = PlaylistUriResolverResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlaylistUriResolverResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlaylistUriResolverResponse) ProtoMessage() {} + +func (x *PlaylistUriResolverResponse) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlaylistUriResolverResponse.ProtoReflect.Descriptor instead. +func (*PlaylistUriResolverResponse) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{29} +} + +func (x *PlaylistUriResolverResponse) GetResolvedPlaylists() []*ResolvedPersonalizedPlaylist { + if x != nil { + return x.ResolvedPlaylists + } + return nil +} + +type SubscribeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uris [][]byte `protobuf:"bytes,1,rep,name=uris" json:"uris,omitempty"` +} + +func (x *SubscribeRequest) Reset() { + *x = SubscribeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeRequest) ProtoMessage() {} + +func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. +func (*SubscribeRequest) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{30} +} + +func (x *SubscribeRequest) GetUris() [][]byte { + if x != nil { + return x.Uris + } + return nil +} + +type UnsubscribeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uris [][]byte `protobuf:"bytes,1,rep,name=uris" json:"uris,omitempty"` +} + +func (x *UnsubscribeRequest) Reset() { + *x = UnsubscribeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnsubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnsubscribeRequest) ProtoMessage() {} + +func (x *UnsubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnsubscribeRequest.ProtoReflect.Descriptor instead. +func (*UnsubscribeRequest) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{31} +} + +func (x *UnsubscribeRequest) GetUris() [][]byte { + if x != nil { + return x.Uris + } + return nil +} + +type PlaylistModificationInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri []byte `protobuf:"bytes,1,opt,name=uri" json:"uri,omitempty"` + NewRevision []byte `protobuf:"bytes,2,opt,name=new_revision,json=newRevision" json:"new_revision,omitempty"` + ParentRevision []byte `protobuf:"bytes,3,opt,name=parent_revision,json=parentRevision" json:"parent_revision,omitempty"` + Ops []*Op `protobuf:"bytes,4,rep,name=ops" json:"ops,omitempty"` +} + +func (x *PlaylistModificationInfo) Reset() { + *x = PlaylistModificationInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlaylistModificationInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlaylistModificationInfo) ProtoMessage() {} + +func (x *PlaylistModificationInfo) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlaylistModificationInfo.ProtoReflect.Descriptor instead. +func (*PlaylistModificationInfo) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{32} +} + +func (x *PlaylistModificationInfo) GetUri() []byte { + if x != nil { + return x.Uri + } + return nil +} + +func (x *PlaylistModificationInfo) GetNewRevision() []byte { + if x != nil { + return x.NewRevision + } + return nil +} + +func (x *PlaylistModificationInfo) GetParentRevision() []byte { + if x != nil { + return x.ParentRevision + } + return nil +} + +func (x *PlaylistModificationInfo) GetOps() []*Op { + if x != nil { + return x.Ops + } + return nil +} + +type RootlistModificationInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewRevision []byte `protobuf:"bytes,1,opt,name=new_revision,json=newRevision" json:"new_revision,omitempty"` + ParentRevision []byte `protobuf:"bytes,2,opt,name=parent_revision,json=parentRevision" json:"parent_revision,omitempty"` + Ops []*Op `protobuf:"bytes,3,rep,name=ops" json:"ops,omitempty"` +} + +func (x *RootlistModificationInfo) Reset() { + *x = RootlistModificationInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RootlistModificationInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RootlistModificationInfo) ProtoMessage() {} + +func (x *RootlistModificationInfo) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RootlistModificationInfo.ProtoReflect.Descriptor instead. +func (*RootlistModificationInfo) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{33} +} + +func (x *RootlistModificationInfo) GetNewRevision() []byte { + if x != nil { + return x.NewRevision + } + return nil +} + +func (x *RootlistModificationInfo) GetParentRevision() []byte { + if x != nil { + return x.ParentRevision + } + return nil +} + +func (x *RootlistModificationInfo) GetOps() []*Op { + if x != nil { + return x.Ops + } + return nil +} + +type FollowerUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uri *string `protobuf:"bytes,1,opt,name=uri" json:"uri,omitempty"` + Username *string `protobuf:"bytes,2,opt,name=username" json:"username,omitempty"` + IsFollowing *bool `protobuf:"varint,3,opt,name=is_following,json=isFollowing" json:"is_following,omitempty"` + Timestamp *uint64 `protobuf:"varint,4,opt,name=timestamp" json:"timestamp,omitempty"` +} + +func (x *FollowerUpdate) Reset() { + *x = FollowerUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist4_external_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FollowerUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FollowerUpdate) ProtoMessage() {} + +func (x *FollowerUpdate) ProtoReflect() protoreflect.Message { + mi := &file_playlist4_external_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FollowerUpdate.ProtoReflect.Descriptor instead. +func (*FollowerUpdate) Descriptor() ([]byte, []int) { + return file_playlist4_external_proto_rawDescGZIP(), []int{34} +} + +func (x *FollowerUpdate) GetUri() string { + if x != nil && x.Uri != nil { + return *x.Uri + } + return "" +} + +func (x *FollowerUpdate) GetUsername() string { + if x != nil && x.Username != nil { + return *x.Username + } + return "" +} + +func (x *FollowerUpdate) GetIsFollowing() bool { + if x != nil && x.IsFollowing != nil { + return *x.IsFollowing + } + return false +} + +func (x *FollowerUpdate) GetTimestamp() uint64 { + if x != nil && x.Timestamp != nil { + return *x.Timestamp + } + return 0 +} + +var File_playlist4_external_proto protoreflect.FileDescriptor + +var file_playlist4_external_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x61, + 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x22, 0xd9, 0x02, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, + 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x36, 0x0a, 0x17, 0x61, 0x62, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x15, 0x61, 0x62, 0x75, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xb2, 0x01, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x05, 0x52, 0x03, 0x70, 0x6f, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, + 0x52, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x05, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x40, 0x0a, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, + 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3d, 0x0a, 0x13, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x40, 0x0a, 0x0b, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0xaa, 0x03, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, + 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, + 0x6f, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x63, + 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x70, 0x6c, 0x33, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x70, 0x6c, 0x33, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, + 0x10, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x42, 0x79, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x59, 0x0a, 0x11, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x10, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0c, 0x70, 0x69, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, + 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x52, 0x0b, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x22, 0xee, 0x01, 0x0a, 0x0e, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x17, 0x0a, 0x07, + 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, + 0x65, 0x65, 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x59, 0x0a, + 0x11, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x10, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x74, 0x65, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x69, 0x74, 0x65, 0x6d, 0x49, + 0x64, 0x22, 0x91, 0x01, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, + 0x6d, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x66, + 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x33, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x64, 0x64, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x4c, 0x61, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x5f, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x64, 0x64, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x03, 0x52, 0x65, 0x6d, 0x12, 0x1d, 0x0a, + 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x33, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, + 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x74, + 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x5f, 0x61, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x41, 0x73, 0x4b, 0x65, 0x79, 0x22, 0x57, 0x0a, 0x03, 0x4d, + 0x6f, 0x76, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x02, 0x28, 0x05, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x02, 0x28, + 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x02, 0x28, 0x05, 0x52, 0x07, 0x74, 0x6f, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0xa4, 0x01, 0x0a, 0x1a, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, + 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x74, + 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x06, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4b, 0x69, + 0x6e, 0x64, 0x52, 0x07, 0x6e, 0x6f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x1a, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x6e, + 0x6f, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2a, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, + 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x07, 0x6e, 0x6f, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0xe4, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, + 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x02, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x5a, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, + 0x6e, 0x65, 0x77, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x5a, 0x0a, + 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x6f, 0x6c, 0x64, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0xce, 0x01, 0x0a, 0x14, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x0d, 0x6e, 0x65, 0x77, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x5a, + 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x6f, 0x6c, 0x64, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x81, 0x04, 0x0a, 0x02, 0x4f, + 0x70, 0x12, 0x34, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, + 0x20, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, + 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x2e, 0x4b, 0x69, 0x6e, + 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, + 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, + 0x64, 0x64, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x2e, 0x0a, 0x03, 0x72, 0x65, 0x6d, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, + 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, + 0x65, 0x6d, 0x52, 0x03, 0x72, 0x65, 0x6d, 0x12, 0x2e, 0x0a, 0x03, 0x6d, 0x6f, 0x76, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, + 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, + 0x6f, 0x76, 0x52, 0x03, 0x6d, 0x6f, 0x76, 0x12, 0x63, 0x0a, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x16, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x14, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x22, 0x6b, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, + 0x44, 0x44, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x45, 0x4d, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x4d, 0x4f, 0x56, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, + 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x49, 0x53, + 0x54, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, 0x10, 0x06, 0x22, 0x37, + 0x0a, 0x06, 0x4f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x03, 0x6f, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x4f, 0x70, 0x52, 0x03, 0x6f, 0x70, 0x73, 0x22, 0xa8, 0x02, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x6e, 0x64, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x75, 0x6e, + 0x64, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x64, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x72, 0x65, 0x64, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, + 0x6c, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x70, + 0x6c, 0x69, 0x74, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x22, 0x86, 0x02, 0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x42, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, + 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x06, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x41, 0x54, 0x49, 0x56, + 0x45, 0x5f, 0x48, 0x45, 0x52, 0x4d, 0x45, 0x53, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, + 0x49, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x59, 0x54, 0x48, 0x4f, 0x4e, + 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x4a, 0x41, 0x56, 0x41, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, + 0x57, 0x45, 0x42, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, + 0x49, 0x42, 0x53, 0x50, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x10, 0x06, 0x22, 0x92, 0x01, 0x0a, 0x05, + 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x62, 0x61, 0x73, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x03, 0x6f, 0x70, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x4f, 0x70, 0x52, 0x03, 0x6f, 0x70, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x7b, 0x0a, 0x04, 0x44, 0x69, 0x66, 0x66, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, + 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0c, 0x52, + 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, + 0x03, 0x6f, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x52, 0x03, 0x6f, 0x70, 0x73, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x02, 0x28, + 0x0c, 0x52, 0x0a, 0x74, 0x6f, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe6, 0x01, + 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, + 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, 0x6c, + 0x74, 0x61, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x77, 0x61, + 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x77, 0x61, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x79, 0x6e, + 0x63, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x77, 0x61, 0x6e, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xf0, 0x05, 0x0a, 0x13, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x08, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, + 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x64, + 0x69, 0x66, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x52, 0x04, 0x64, 0x69, 0x66, 0x66, 0x12, 0x3e, + 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, + 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x69, + 0x66, 0x66, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2f, + 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x12, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x25, 0x0a, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x0a, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x75, 0x70, 0x54, 0x6f, + 0x44, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0e, + 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x62, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x15, 0x61, 0x62, 0x75, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0c, 0x63, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x49, + 0x0a, 0x08, 0x67, 0x65, 0x6f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x6f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x08, 0x67, 0x65, 0x6f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3f, 0x0a, 0x0f, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x14, 0x50, 0x6c, + 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x31, 0x55, 0x72, 0x69, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x76, 0x32, 0x5f, 0x75, 0x72, 0x69, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x32, 0x55, 0x72, 0x69, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x12, + 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x31, 0x55, 0x72, 0x69, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x65, 0x0a, 0x10, 0x76, 0x32, 0x5f, 0x75, 0x72, 0x69, 0x5f, 0x74, 0x6f, 0x5f, + 0x76, 0x31, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x56, + 0x31, 0x55, 0x72, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x56, 0x32, 0x55, 0x72, 0x69, 0x54, + 0x6f, 0x56, 0x31, 0x55, 0x72, 0x69, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x76, 0x32, 0x55, + 0x72, 0x69, 0x54, 0x6f, 0x56, 0x31, 0x55, 0x72, 0x69, 0x1a, 0x3f, 0x0a, 0x11, 0x56, 0x32, 0x55, + 0x72, 0x69, 0x54, 0x6f, 0x56, 0x31, 0x55, 0x72, 0x69, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xef, 0x01, 0x0a, 0x11, 0x4c, + 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x33, + 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, + 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x12, 0x37, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, + 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x41, 0x0a, 0x1c, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0x39, 0x0a, 0x1d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x42, 0x0a, 0x1c, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x83, + 0x01, 0x0a, 0x1b, 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x55, 0x72, 0x69, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, + 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x50, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, + 0x74, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x73, 0x22, 0x26, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x22, 0x28, 0x0a, 0x12, + 0x55, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, + 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x18, 0x50, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6e, 0x65, 0x77, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x2d, 0x0a, 0x03, 0x6f, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, + 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x52, 0x03, 0x6f, 0x70, 0x73, + 0x22, 0x95, 0x01, 0x0a, 0x18, 0x52, 0x6f, 0x6f, 0x74, 0x6c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, + 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x03, 0x6f, 0x70, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x4f, 0x70, 0x52, 0x03, 0x6f, 0x70, 0x73, 0x22, 0x7f, 0x0a, 0x0e, 0x46, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, + 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x69, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0xfd, 0x01, 0x0a, 0x11, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, + 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x50, + 0x49, 0x43, 0x54, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x49, 0x53, 0x54, + 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x04, + 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x50, 0x4c, 0x33, 0x5f, 0x56, 0x45, 0x52, + 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, + 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, + 0x5f, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x46, 0x4f, + 0x52, 0x4d, 0x41, 0x54, 0x10, 0x0b, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, + 0x10, 0x0c, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x50, 0x49, 0x43, 0x54, 0x55, + 0x52, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x0d, 0x2a, 0x98, 0x01, 0x0a, 0x11, 0x49, 0x74, + 0x65, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x10, 0x0a, 0x0c, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x5f, + 0x42, 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x54, 0x45, 0x4d, + 0x5f, 0x53, 0x45, 0x45, 0x4e, 0x5f, 0x41, 0x54, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x54, + 0x45, 0x4d, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x0a, 0x12, 0x1a, 0x0a, 0x16, 0x49, + 0x54, 0x45, 0x4d, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, + 0x42, 0x55, 0x54, 0x45, 0x53, 0x10, 0x0b, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x54, 0x45, 0x4d, 0x5f, + 0x49, 0x44, 0x10, 0x0c, 0x2a, 0xaa, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x6f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, + 0x22, 0x47, 0x45, 0x4f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x49, + 0x4e, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x47, 0x45, 0x4f, 0x42, 0x4c, 0x4f, 0x43, + 0x4b, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x54, 0x49, 0x54, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x47, 0x45, 0x4f, 0x42, 0x4c, + 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, + 0x20, 0x0a, 0x1c, 0x47, 0x45, 0x4f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x4c, 0x4f, 0x43, + 0x4b, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x10, + 0x03, 0x42, 0x55, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x42, 0x11, 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x34, 0x41, 0x70, 0x69, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, + 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, + 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, +} + +var ( + file_playlist4_external_proto_rawDescOnce sync.Once + file_playlist4_external_proto_rawDescData = file_playlist4_external_proto_rawDesc +) + +func file_playlist4_external_proto_rawDescGZIP() []byte { + file_playlist4_external_proto_rawDescOnce.Do(func() { + file_playlist4_external_proto_rawDescData = protoimpl.X.CompressGZIP(file_playlist4_external_proto_rawDescData) + }) + return file_playlist4_external_proto_rawDescData +} + +var file_playlist4_external_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_playlist4_external_proto_msgTypes = make([]protoimpl.MessageInfo, 36) +var file_playlist4_external_proto_goTypes = []interface{}{ + (ListAttributeKind)(0), // 0: spotify.playlist4.proto.ListAttributeKind + (ItemAttributeKind)(0), // 1: spotify.playlist4.proto.ItemAttributeKind + (GeoblockBlockingType)(0), // 2: spotify.playlist4.proto.GeoblockBlockingType + (Op_Kind)(0), // 3: spotify.playlist4.proto.Op.Kind + (SourceInfo_Client)(0), // 4: spotify.playlist4.proto.SourceInfo.Client + (*Item)(nil), // 5: spotify.playlist4.proto.Item + (*MetaItem)(nil), // 6: spotify.playlist4.proto.MetaItem + (*ListItems)(nil), // 7: spotify.playlist4.proto.ListItems + (*FormatListAttribute)(nil), // 8: spotify.playlist4.proto.FormatListAttribute + (*PictureSize)(nil), // 9: spotify.playlist4.proto.PictureSize + (*ListAttributes)(nil), // 10: spotify.playlist4.proto.ListAttributes + (*ItemAttributes)(nil), // 11: spotify.playlist4.proto.ItemAttributes + (*Add)(nil), // 12: spotify.playlist4.proto.Add + (*Rem)(nil), // 13: spotify.playlist4.proto.Rem + (*Mov)(nil), // 14: spotify.playlist4.proto.Mov + (*ItemAttributesPartialState)(nil), // 15: spotify.playlist4.proto.ItemAttributesPartialState + (*ListAttributesPartialState)(nil), // 16: spotify.playlist4.proto.ListAttributesPartialState + (*UpdateItemAttributes)(nil), // 17: spotify.playlist4.proto.UpdateItemAttributes + (*UpdateListAttributes)(nil), // 18: spotify.playlist4.proto.UpdateListAttributes + (*Op)(nil), // 19: spotify.playlist4.proto.Op + (*OpList)(nil), // 20: spotify.playlist4.proto.OpList + (*ChangeInfo)(nil), // 21: spotify.playlist4.proto.ChangeInfo + (*SourceInfo)(nil), // 22: spotify.playlist4.proto.SourceInfo + (*Delta)(nil), // 23: spotify.playlist4.proto.Delta + (*Diff)(nil), // 24: spotify.playlist4.proto.Diff + (*ListChanges)(nil), // 25: spotify.playlist4.proto.ListChanges + (*SelectedListContent)(nil), // 26: spotify.playlist4.proto.SelectedListContent + (*CreateListReply)(nil), // 27: spotify.playlist4.proto.CreateListReply + (*PlaylistV1UriRequest)(nil), // 28: spotify.playlist4.proto.PlaylistV1UriRequest + (*PlaylistV1UriReply)(nil), // 29: spotify.playlist4.proto.PlaylistV1UriReply + (*ListUpdateRequest)(nil), // 30: spotify.playlist4.proto.ListUpdateRequest + (*RegisterPlaylistImageRequest)(nil), // 31: spotify.playlist4.proto.RegisterPlaylistImageRequest + (*RegisterPlaylistImageResponse)(nil), // 32: spotify.playlist4.proto.RegisterPlaylistImageResponse + (*ResolvedPersonalizedPlaylist)(nil), // 33: spotify.playlist4.proto.ResolvedPersonalizedPlaylist + (*PlaylistUriResolverResponse)(nil), // 34: spotify.playlist4.proto.PlaylistUriResolverResponse + (*SubscribeRequest)(nil), // 35: spotify.playlist4.proto.SubscribeRequest + (*UnsubscribeRequest)(nil), // 36: spotify.playlist4.proto.UnsubscribeRequest + (*PlaylistModificationInfo)(nil), // 37: spotify.playlist4.proto.PlaylistModificationInfo + (*RootlistModificationInfo)(nil), // 38: spotify.playlist4.proto.RootlistModificationInfo + (*FollowerUpdate)(nil), // 39: spotify.playlist4.proto.FollowerUpdate + nil, // 40: spotify.playlist4.proto.PlaylistV1UriReply.V2UriToV1UriEntry + (*Capabilities)(nil), // 41: spotify.playlist_permission.proto.Capabilities +} +var file_playlist4_external_proto_depIdxs = []int32{ + 11, // 0: spotify.playlist4.proto.Item.attributes:type_name -> spotify.playlist4.proto.ItemAttributes + 10, // 1: spotify.playlist4.proto.MetaItem.attributes:type_name -> spotify.playlist4.proto.ListAttributes + 41, // 2: spotify.playlist4.proto.MetaItem.capabilities:type_name -> spotify.playlist_permission.proto.Capabilities + 5, // 3: spotify.playlist4.proto.ListItems.items:type_name -> spotify.playlist4.proto.Item + 6, // 4: spotify.playlist4.proto.ListItems.meta_items:type_name -> spotify.playlist4.proto.MetaItem + 8, // 5: spotify.playlist4.proto.ListAttributes.format_attributes:type_name -> spotify.playlist4.proto.FormatListAttribute + 9, // 6: spotify.playlist4.proto.ListAttributes.picture_size:type_name -> spotify.playlist4.proto.PictureSize + 8, // 7: spotify.playlist4.proto.ItemAttributes.format_attributes:type_name -> spotify.playlist4.proto.FormatListAttribute + 5, // 8: spotify.playlist4.proto.Add.items:type_name -> spotify.playlist4.proto.Item + 5, // 9: spotify.playlist4.proto.Rem.items:type_name -> spotify.playlist4.proto.Item + 11, // 10: spotify.playlist4.proto.ItemAttributesPartialState.values:type_name -> spotify.playlist4.proto.ItemAttributes + 1, // 11: spotify.playlist4.proto.ItemAttributesPartialState.no_value:type_name -> spotify.playlist4.proto.ItemAttributeKind + 10, // 12: spotify.playlist4.proto.ListAttributesPartialState.values:type_name -> spotify.playlist4.proto.ListAttributes + 0, // 13: spotify.playlist4.proto.ListAttributesPartialState.no_value:type_name -> spotify.playlist4.proto.ListAttributeKind + 15, // 14: spotify.playlist4.proto.UpdateItemAttributes.new_attributes:type_name -> spotify.playlist4.proto.ItemAttributesPartialState + 15, // 15: spotify.playlist4.proto.UpdateItemAttributes.old_attributes:type_name -> spotify.playlist4.proto.ItemAttributesPartialState + 16, // 16: spotify.playlist4.proto.UpdateListAttributes.new_attributes:type_name -> spotify.playlist4.proto.ListAttributesPartialState + 16, // 17: spotify.playlist4.proto.UpdateListAttributes.old_attributes:type_name -> spotify.playlist4.proto.ListAttributesPartialState + 3, // 18: spotify.playlist4.proto.Op.kind:type_name -> spotify.playlist4.proto.Op.Kind + 12, // 19: spotify.playlist4.proto.Op.add:type_name -> spotify.playlist4.proto.Add + 13, // 20: spotify.playlist4.proto.Op.rem:type_name -> spotify.playlist4.proto.Rem + 14, // 21: spotify.playlist4.proto.Op.mov:type_name -> spotify.playlist4.proto.Mov + 17, // 22: spotify.playlist4.proto.Op.update_item_attributes:type_name -> spotify.playlist4.proto.UpdateItemAttributes + 18, // 23: spotify.playlist4.proto.Op.update_list_attributes:type_name -> spotify.playlist4.proto.UpdateListAttributes + 19, // 24: spotify.playlist4.proto.OpList.ops:type_name -> spotify.playlist4.proto.Op + 22, // 25: spotify.playlist4.proto.ChangeInfo.source:type_name -> spotify.playlist4.proto.SourceInfo + 4, // 26: spotify.playlist4.proto.SourceInfo.client:type_name -> spotify.playlist4.proto.SourceInfo.Client + 19, // 27: spotify.playlist4.proto.Delta.ops:type_name -> spotify.playlist4.proto.Op + 21, // 28: spotify.playlist4.proto.Delta.info:type_name -> spotify.playlist4.proto.ChangeInfo + 19, // 29: spotify.playlist4.proto.Diff.ops:type_name -> spotify.playlist4.proto.Op + 23, // 30: spotify.playlist4.proto.ListChanges.deltas:type_name -> spotify.playlist4.proto.Delta + 10, // 31: spotify.playlist4.proto.SelectedListContent.attributes:type_name -> spotify.playlist4.proto.ListAttributes + 7, // 32: spotify.playlist4.proto.SelectedListContent.contents:type_name -> spotify.playlist4.proto.ListItems + 24, // 33: spotify.playlist4.proto.SelectedListContent.diff:type_name -> spotify.playlist4.proto.Diff + 24, // 34: spotify.playlist4.proto.SelectedListContent.sync_result:type_name -> spotify.playlist4.proto.Diff + 41, // 35: spotify.playlist4.proto.SelectedListContent.capabilities:type_name -> spotify.playlist_permission.proto.Capabilities + 2, // 36: spotify.playlist4.proto.SelectedListContent.geoblock:type_name -> spotify.playlist4.proto.GeoblockBlockingType + 40, // 37: spotify.playlist4.proto.PlaylistV1UriReply.v2_uri_to_v1_uri:type_name -> spotify.playlist4.proto.PlaylistV1UriReply.V2UriToV1UriEntry + 10, // 38: spotify.playlist4.proto.ListUpdateRequest.attributes:type_name -> spotify.playlist4.proto.ListAttributes + 5, // 39: spotify.playlist4.proto.ListUpdateRequest.items:type_name -> spotify.playlist4.proto.Item + 21, // 40: spotify.playlist4.proto.ListUpdateRequest.info:type_name -> spotify.playlist4.proto.ChangeInfo + 33, // 41: spotify.playlist4.proto.PlaylistUriResolverResponse.resolved_playlists:type_name -> spotify.playlist4.proto.ResolvedPersonalizedPlaylist + 19, // 42: spotify.playlist4.proto.PlaylistModificationInfo.ops:type_name -> spotify.playlist4.proto.Op + 19, // 43: spotify.playlist4.proto.RootlistModificationInfo.ops:type_name -> spotify.playlist4.proto.Op + 44, // [44:44] is the sub-list for method output_type + 44, // [44:44] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name +} + +func init() { file_playlist4_external_proto_init() } +func file_playlist4_external_proto_init() { + if File_playlist4_external_proto != nil { + return + } + file_playlist_permission_proto_init() + if !protoimpl.UnsafeEnabled { + file_playlist4_external_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Item); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetaItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListItems); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FormatListAttribute); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PictureSize); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ItemAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Add); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Rem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Mov); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ItemAttributesPartialState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttributesPartialState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateItemAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateListAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Op); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SourceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Delta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Diff); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListChanges); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SelectedListContent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateListReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlaylistV1UriRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlaylistV1UriReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterPlaylistImageRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterPlaylistImageResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResolvedPersonalizedPlaylist); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlaylistUriResolverResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnsubscribeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlaylistModificationInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RootlistModificationInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist4_external_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FollowerUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_playlist4_external_proto_rawDesc, + NumEnums: 5, + NumMessages: 36, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_playlist4_external_proto_goTypes, + DependencyIndexes: file_playlist4_external_proto_depIdxs, + EnumInfos: file_playlist4_external_proto_enumTypes, + MessageInfos: file_playlist4_external_proto_msgTypes, + }.Build() + File_playlist4_external_proto = out.File + file_playlist4_external_proto_rawDesc = nil + file_playlist4_external_proto_goTypes = nil + file_playlist4_external_proto_depIdxs = nil +} diff --git a/lib/spot/proto/playlist4_external.proto b/lib/spot/proto/playlist4_external.proto new file mode 100644 index 0000000..9ae0f41 --- /dev/null +++ b/lib/spot/proto/playlist4_external.proto @@ -0,0 +1,293 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist4.proto; + +import "playlist_permission.proto"; + +option optimize_for = CODE_SIZE; +option java_outer_classname = "Playlist4ApiProto"; +option java_package = "com.spotify.playlist4.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message Item { + required string uri = 1; + optional ItemAttributes attributes = 2; +} + +message MetaItem { + optional bytes revision = 1; + optional ListAttributes attributes = 2; + optional int32 length = 3; + optional int64 timestamp = 4; + optional string owner_username = 5; + optional bool abuse_reporting_enabled = 6; + optional spotify.playlist_permission.proto.Capabilities capabilities = 7; +} + +message ListItems { + required int32 pos = 1; + required bool truncated = 2; + repeated Item items = 3; + repeated MetaItem meta_items = 4; +} + +message FormatListAttribute { + optional string key = 1; + optional string value = 2; +} + +message PictureSize { + optional string target_name = 1; + optional string url = 2; +} + +message ListAttributes { + optional string name = 1; + optional string description = 2; + optional bytes picture = 3; + optional bool collaborative = 4; + optional string pl3_version = 5; + optional bool deleted_by_owner = 6; + optional string client_id = 10; + optional string format = 11; + repeated FormatListAttribute format_attributes = 12; + repeated PictureSize picture_size = 13; +} + +message ItemAttributes { + optional string added_by = 1; + optional int64 timestamp = 2; + optional int64 seen_at = 9; + optional bool public = 10; + repeated FormatListAttribute format_attributes = 11; + optional bytes item_id = 12; +} + +message Add { + optional int32 from_index = 1; + repeated Item items = 2; + optional bool add_last = 4; + optional bool add_first = 5; +} + +message Rem { + optional int32 from_index = 1; + optional int32 length = 2; + repeated Item items = 3; + optional bool items_as_key = 7; +} + +message Mov { + required int32 from_index = 1; + required int32 length = 2; + required int32 to_index = 3; +} + +message ItemAttributesPartialState { + required ItemAttributes values = 1; + repeated ItemAttributeKind no_value = 2; +} + +message ListAttributesPartialState { + required ListAttributes values = 1; + repeated ListAttributeKind no_value = 2; +} + +message UpdateItemAttributes { + required int32 index = 1; + required ItemAttributesPartialState new_attributes = 2; + optional ItemAttributesPartialState old_attributes = 3; +} + +message UpdateListAttributes { + required ListAttributesPartialState new_attributes = 1; + optional ListAttributesPartialState old_attributes = 2; +} + +message Op { + required Kind kind = 1; + enum Kind { + KIND_UNKNOWN = 0; + ADD = 2; + REM = 3; + MOV = 4; + UPDATE_ITEM_ATTRIBUTES = 5; + UPDATE_LIST_ATTRIBUTES = 6; + } + + optional Add add = 2; + optional Rem rem = 3; + optional Mov mov = 4; + optional UpdateItemAttributes update_item_attributes = 5; + optional UpdateListAttributes update_list_attributes = 6; +} + +message OpList { + repeated Op ops = 1; +} + +message ChangeInfo { + optional string user = 1; + optional int64 timestamp = 2; + optional bool admin = 3; + optional bool undo = 4; + optional bool redo = 5; + optional bool merge = 6; + optional bool compressed = 7; + optional bool migration = 8; + optional int32 split_id = 9; + optional SourceInfo source = 10; +} + +message SourceInfo { + optional Client client = 1; + enum Client { + CLIENT_UNKNOWN = 0; + NATIVE_HERMES = 1; + CLIENT = 2; + PYTHON = 3; + JAVA = 4; + WEBPLAYER = 5; + LIBSPOTIFY = 6; + } + + optional string app = 3; + optional string source = 4; + optional string version = 5; +} + +message Delta { + optional bytes base_version = 1; + repeated Op ops = 2; + optional ChangeInfo info = 4; +} + +message Diff { + required bytes from_revision = 1; + repeated Op ops = 2; + required bytes to_revision = 3; +} + +message ListChanges { + optional bytes base_revision = 1; + repeated Delta deltas = 2; + optional bool want_resulting_revisions = 3; + optional bool want_sync_result = 4; + repeated int64 nonces = 6; +} + +message SelectedListContent { + optional bytes revision = 1; + optional int32 length = 2; + optional ListAttributes attributes = 3; + optional ListItems contents = 5; + optional Diff diff = 6; + optional Diff sync_result = 7; + repeated bytes resulting_revisions = 8; + optional bool multiple_heads = 9; + optional bool up_to_date = 10; + repeated int64 nonces = 14; + optional int64 timestamp = 15; + optional string owner_username = 16; + optional bool abuse_reporting_enabled = 17; + optional spotify.playlist_permission.proto.Capabilities capabilities = 18; + repeated GeoblockBlockingType geoblock = 19; +} + +message CreateListReply { + required string uri = 1; + optional bytes revision = 2; +} + +message PlaylistV1UriRequest { + repeated string v2_uris = 1; +} + +message PlaylistV1UriReply { + map v2_uri_to_v1_uri = 1; +} + +message ListUpdateRequest { + optional bytes base_revision = 1; + optional ListAttributes attributes = 2; + repeated Item items = 3; + optional ChangeInfo info = 4; +} + +message RegisterPlaylistImageRequest { + optional string upload_token = 1; +} + +message RegisterPlaylistImageResponse { + optional bytes picture = 1; +} + +message ResolvedPersonalizedPlaylist { + optional string uri = 1; + optional string tag = 2; +} + +message PlaylistUriResolverResponse { + repeated ResolvedPersonalizedPlaylist resolved_playlists = 1; +} + +message SubscribeRequest { + repeated bytes uris = 1; +} + +message UnsubscribeRequest { + repeated bytes uris = 1; +} + +message PlaylistModificationInfo { + optional bytes uri = 1; + optional bytes new_revision = 2; + optional bytes parent_revision = 3; + repeated Op ops = 4; +} + +message RootlistModificationInfo { + optional bytes new_revision = 1; + optional bytes parent_revision = 2; + repeated Op ops = 3; +} + +message FollowerUpdate { + optional string uri = 1; + optional string username = 2; + optional bool is_following = 3; + optional uint64 timestamp = 4; +} + +enum ListAttributeKind { + LIST_UNKNOWN = 0; + LIST_NAME = 1; + LIST_DESCRIPTION = 2; + LIST_PICTURE = 3; + LIST_COLLABORATIVE = 4; + LIST_PL3_VERSION = 5; + LIST_DELETED_BY_OWNER = 6; + LIST_CLIENT_ID = 10; + LIST_FORMAT = 11; + LIST_FORMAT_ATTRIBUTES = 12; + LIST_PICTURE_SIZE = 13; +} + +enum ItemAttributeKind { + ITEM_UNKNOWN = 0; + ITEM_ADDED_BY = 1; + ITEM_TIMESTAMP = 2; + ITEM_SEEN_AT = 9; + ITEM_PUBLIC = 10; + ITEM_FORMAT_ATTRIBUTES = 11; + ITEM_ID = 12; +} + +enum GeoblockBlockingType { + GEOBLOCK_BLOCKING_TYPE_UNSPECIFIED = 0; + GEOBLOCK_BLOCKING_TYPE_TITLE = 1; + GEOBLOCK_BLOCKING_TYPE_DESCRIPTION = 2; + GEOBLOCK_BLOCKING_TYPE_IMAGE = 3; +} diff --git a/lib/spot/proto/playlist_annotate3.pb.go b/lib/spot/proto/playlist_annotate3.pb.go new file mode 100644 index 0000000..8493b25 --- /dev/null +++ b/lib/spot/proto/playlist_annotate3.pb.go @@ -0,0 +1,566 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: playlist_annotate3.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type RenderFeatures int32 + +const ( + RenderFeatures_NORMAL_FEATURES RenderFeatures = 1 + RenderFeatures_EXTENDED_FEATURES RenderFeatures = 2 +) + +// Enum value maps for RenderFeatures. +var ( + RenderFeatures_name = map[int32]string{ + 1: "NORMAL_FEATURES", + 2: "EXTENDED_FEATURES", + } + RenderFeatures_value = map[string]int32{ + "NORMAL_FEATURES": 1, + "EXTENDED_FEATURES": 2, + } +) + +func (x RenderFeatures) Enum() *RenderFeatures { + p := new(RenderFeatures) + *p = x + return p +} + +func (x RenderFeatures) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RenderFeatures) Descriptor() protoreflect.EnumDescriptor { + return file_playlist_annotate3_proto_enumTypes[0].Descriptor() +} + +func (RenderFeatures) Type() protoreflect.EnumType { + return &file_playlist_annotate3_proto_enumTypes[0] +} + +func (x RenderFeatures) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *RenderFeatures) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = RenderFeatures(num) + return nil +} + +// Deprecated: Use RenderFeatures.Descriptor instead. +func (RenderFeatures) EnumDescriptor() ([]byte, []int) { + return file_playlist_annotate3_proto_rawDescGZIP(), []int{0} +} + +type AbuseReportState int32 + +const ( + AbuseReportState_OK AbuseReportState = 0 + AbuseReportState_TAKEN_DOWN AbuseReportState = 1 +) + +// Enum value maps for AbuseReportState. +var ( + AbuseReportState_name = map[int32]string{ + 0: "OK", + 1: "TAKEN_DOWN", + } + AbuseReportState_value = map[string]int32{ + "OK": 0, + "TAKEN_DOWN": 1, + } +) + +func (x AbuseReportState) Enum() *AbuseReportState { + p := new(AbuseReportState) + *p = x + return p +} + +func (x AbuseReportState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AbuseReportState) Descriptor() protoreflect.EnumDescriptor { + return file_playlist_annotate3_proto_enumTypes[1].Descriptor() +} + +func (AbuseReportState) Type() protoreflect.EnumType { + return &file_playlist_annotate3_proto_enumTypes[1] +} + +func (x AbuseReportState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *AbuseReportState) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = AbuseReportState(num) + return nil +} + +// Deprecated: Use AbuseReportState.Descriptor instead. +func (AbuseReportState) EnumDescriptor() ([]byte, []int) { + return file_playlist_annotate3_proto_rawDescGZIP(), []int{1} +} + +type TakedownRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AbuseReportState *AbuseReportState `protobuf:"varint,1,opt,name=abuse_report_state,json=abuseReportState,enum=spotify_playlist_annotate3.proto.AbuseReportState" json:"abuse_report_state,omitempty"` +} + +func (x *TakedownRequest) Reset() { + *x = TakedownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_annotate3_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TakedownRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TakedownRequest) ProtoMessage() {} + +func (x *TakedownRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist_annotate3_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TakedownRequest.ProtoReflect.Descriptor instead. +func (*TakedownRequest) Descriptor() ([]byte, []int) { + return file_playlist_annotate3_proto_rawDescGZIP(), []int{0} +} + +func (x *TakedownRequest) GetAbuseReportState() AbuseReportState { + if x != nil && x.AbuseReportState != nil { + return *x.AbuseReportState + } + return AbuseReportState_OK +} + +type AnnotateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description *string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` + ImageUri *string `protobuf:"bytes,2,opt,name=image_uri,json=imageUri" json:"image_uri,omitempty"` +} + +func (x *AnnotateRequest) Reset() { + *x = AnnotateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_annotate3_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AnnotateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AnnotateRequest) ProtoMessage() {} + +func (x *AnnotateRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist_annotate3_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AnnotateRequest.ProtoReflect.Descriptor instead. +func (*AnnotateRequest) Descriptor() ([]byte, []int) { + return file_playlist_annotate3_proto_rawDescGZIP(), []int{1} +} + +func (x *AnnotateRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *AnnotateRequest) GetImageUri() string { + if x != nil && x.ImageUri != nil { + return *x.ImageUri + } + return "" +} + +type TranscodedPicture struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetName *string `protobuf:"bytes,1,opt,name=target_name,json=targetName" json:"target_name,omitempty"` + Uri *string `protobuf:"bytes,2,opt,name=uri" json:"uri,omitempty"` +} + +func (x *TranscodedPicture) Reset() { + *x = TranscodedPicture{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_annotate3_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TranscodedPicture) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TranscodedPicture) ProtoMessage() {} + +func (x *TranscodedPicture) ProtoReflect() protoreflect.Message { + mi := &file_playlist_annotate3_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TranscodedPicture.ProtoReflect.Descriptor instead. +func (*TranscodedPicture) Descriptor() ([]byte, []int) { + return file_playlist_annotate3_proto_rawDescGZIP(), []int{2} +} + +func (x *TranscodedPicture) GetTargetName() string { + if x != nil && x.TargetName != nil { + return *x.TargetName + } + return "" +} + +func (x *TranscodedPicture) GetUri() string { + if x != nil && x.Uri != nil { + return *x.Uri + } + return "" +} + +type PlaylistAnnotation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description *string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` + Picture *string `protobuf:"bytes,2,opt,name=picture" json:"picture,omitempty"` + // Deprecated: Do not use. + DeprecatedRenderFeatures *RenderFeatures `protobuf:"varint,3,opt,name=deprecated_render_features,json=deprecatedRenderFeatures,enum=spotify_playlist_annotate3.proto.RenderFeatures,def=1" json:"deprecated_render_features,omitempty"` + TranscodedPicture []*TranscodedPicture `protobuf:"bytes,4,rep,name=transcoded_picture,json=transcodedPicture" json:"transcoded_picture,omitempty"` + IsAbuseReportingEnabled *bool `protobuf:"varint,6,opt,name=is_abuse_reporting_enabled,json=isAbuseReportingEnabled,def=1" json:"is_abuse_reporting_enabled,omitempty"` + AbuseReportState *AbuseReportState `protobuf:"varint,7,opt,name=abuse_report_state,json=abuseReportState,enum=spotify_playlist_annotate3.proto.AbuseReportState,def=0" json:"abuse_report_state,omitempty"` +} + +// Default values for PlaylistAnnotation fields. +const ( + Default_PlaylistAnnotation_DeprecatedRenderFeatures = RenderFeatures_NORMAL_FEATURES + Default_PlaylistAnnotation_IsAbuseReportingEnabled = bool(true) + Default_PlaylistAnnotation_AbuseReportState = AbuseReportState_OK +) + +func (x *PlaylistAnnotation) Reset() { + *x = PlaylistAnnotation{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_annotate3_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlaylistAnnotation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlaylistAnnotation) ProtoMessage() {} + +func (x *PlaylistAnnotation) ProtoReflect() protoreflect.Message { + mi := &file_playlist_annotate3_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlaylistAnnotation.ProtoReflect.Descriptor instead. +func (*PlaylistAnnotation) Descriptor() ([]byte, []int) { + return file_playlist_annotate3_proto_rawDescGZIP(), []int{3} +} + +func (x *PlaylistAnnotation) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *PlaylistAnnotation) GetPicture() string { + if x != nil && x.Picture != nil { + return *x.Picture + } + return "" +} + +// Deprecated: Do not use. +func (x *PlaylistAnnotation) GetDeprecatedRenderFeatures() RenderFeatures { + if x != nil && x.DeprecatedRenderFeatures != nil { + return *x.DeprecatedRenderFeatures + } + return Default_PlaylistAnnotation_DeprecatedRenderFeatures +} + +func (x *PlaylistAnnotation) GetTranscodedPicture() []*TranscodedPicture { + if x != nil { + return x.TranscodedPicture + } + return nil +} + +func (x *PlaylistAnnotation) GetIsAbuseReportingEnabled() bool { + if x != nil && x.IsAbuseReportingEnabled != nil { + return *x.IsAbuseReportingEnabled + } + return Default_PlaylistAnnotation_IsAbuseReportingEnabled +} + +func (x *PlaylistAnnotation) GetAbuseReportState() AbuseReportState { + if x != nil && x.AbuseReportState != nil { + return *x.AbuseReportState + } + return Default_PlaylistAnnotation_AbuseReportState +} + +var File_playlist_annotate3_proto protoreflect.FileDescriptor + +var file_playlist_annotate3_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x73, 0x70, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x73, 0x0a, 0x0f, + 0x54, 0x61, 0x6b, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x60, 0x0a, 0x12, 0x61, 0x62, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, + 0x62, 0x75, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x10, 0x61, 0x62, 0x75, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x50, 0x0a, 0x0f, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, + 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x55, 0x72, 0x69, 0x22, 0x46, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0xe3, 0x03, 0x0a, 0x12, + 0x50, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x83, + 0x01, 0x0a, 0x1a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x70, 0x6c, + 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x33, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x3a, 0x0f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x46, 0x45, + 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x42, 0x02, 0x18, 0x01, 0x52, 0x18, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x6f, 0x64, + 0x65, 0x64, 0x5f, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x33, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50, 0x69, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x6f, 0x64, 0x65, + 0x64, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x73, 0x5f, 0x61, + 0x62, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, + 0x75, 0x65, 0x52, 0x17, 0x69, 0x73, 0x41, 0x62, 0x75, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x64, 0x0a, 0x12, 0x61, + 0x62, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x65, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x62, 0x75, 0x73, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x02, 0x4f, 0x4b, 0x52, + 0x10, 0x61, 0x62, 0x75, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2a, 0x3c, 0x0a, 0x0e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x5f, 0x46, 0x45, + 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x58, 0x54, 0x45, + 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x53, 0x10, 0x02, 0x2a, + 0x2a, 0x0a, 0x10, 0x41, 0x62, 0x75, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, + 0x41, 0x4b, 0x45, 0x4e, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x42, 0x4b, 0x0a, 0x24, 0x63, + 0x6f, 0x6d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x33, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, + 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, + 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, +} + +var ( + file_playlist_annotate3_proto_rawDescOnce sync.Once + file_playlist_annotate3_proto_rawDescData = file_playlist_annotate3_proto_rawDesc +) + +func file_playlist_annotate3_proto_rawDescGZIP() []byte { + file_playlist_annotate3_proto_rawDescOnce.Do(func() { + file_playlist_annotate3_proto_rawDescData = protoimpl.X.CompressGZIP(file_playlist_annotate3_proto_rawDescData) + }) + return file_playlist_annotate3_proto_rawDescData +} + +var file_playlist_annotate3_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_playlist_annotate3_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_playlist_annotate3_proto_goTypes = []interface{}{ + (RenderFeatures)(0), // 0: spotify_playlist_annotate3.proto.RenderFeatures + (AbuseReportState)(0), // 1: spotify_playlist_annotate3.proto.AbuseReportState + (*TakedownRequest)(nil), // 2: spotify_playlist_annotate3.proto.TakedownRequest + (*AnnotateRequest)(nil), // 3: spotify_playlist_annotate3.proto.AnnotateRequest + (*TranscodedPicture)(nil), // 4: spotify_playlist_annotate3.proto.TranscodedPicture + (*PlaylistAnnotation)(nil), // 5: spotify_playlist_annotate3.proto.PlaylistAnnotation +} +var file_playlist_annotate3_proto_depIdxs = []int32{ + 1, // 0: spotify_playlist_annotate3.proto.TakedownRequest.abuse_report_state:type_name -> spotify_playlist_annotate3.proto.AbuseReportState + 0, // 1: spotify_playlist_annotate3.proto.PlaylistAnnotation.deprecated_render_features:type_name -> spotify_playlist_annotate3.proto.RenderFeatures + 4, // 2: spotify_playlist_annotate3.proto.PlaylistAnnotation.transcoded_picture:type_name -> spotify_playlist_annotate3.proto.TranscodedPicture + 1, // 3: spotify_playlist_annotate3.proto.PlaylistAnnotation.abuse_report_state:type_name -> spotify_playlist_annotate3.proto.AbuseReportState + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_playlist_annotate3_proto_init() } +func file_playlist_annotate3_proto_init() { + if File_playlist_annotate3_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_playlist_annotate3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TakedownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_annotate3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AnnotateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_annotate3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TranscodedPicture); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_annotate3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlaylistAnnotation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_playlist_annotate3_proto_rawDesc, + NumEnums: 2, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_playlist_annotate3_proto_goTypes, + DependencyIndexes: file_playlist_annotate3_proto_depIdxs, + EnumInfos: file_playlist_annotate3_proto_enumTypes, + MessageInfos: file_playlist_annotate3_proto_msgTypes, + }.Build() + File_playlist_annotate3_proto = out.File + file_playlist_annotate3_proto_rawDesc = nil + file_playlist_annotate3_proto_goTypes = nil + file_playlist_annotate3_proto_depIdxs = nil +} diff --git a/lib/spot/proto/playlist_annotate3.proto b/lib/spot/proto/playlist_annotate3.proto new file mode 100644 index 0000000..289770f --- /dev/null +++ b/lib/spot/proto/playlist_annotate3.proto @@ -0,0 +1,42 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto2"; + +package spotify_playlist_annotate3.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist_annotate3.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message TakedownRequest { + optional AbuseReportState abuse_report_state = 1; +} + +message AnnotateRequest { + optional string description = 1; + optional string image_uri = 2; +} + +message TranscodedPicture { + optional string target_name = 1; + optional string uri = 2; +} + +message PlaylistAnnotation { + optional string description = 1; + optional string picture = 2; + optional RenderFeatures deprecated_render_features = 3 [default = NORMAL_FEATURES, deprecated = true]; + repeated TranscodedPicture transcoded_picture = 4; + optional bool is_abuse_reporting_enabled = 6 [default = true]; + optional AbuseReportState abuse_report_state = 7 [default = OK]; +} + +enum RenderFeatures { + NORMAL_FEATURES = 1; + EXTENDED_FEATURES = 2; +} + +enum AbuseReportState { + OK = 0; + TAKEN_DOWN = 1; +} diff --git a/lib/spot/proto/playlist_contains_request.proto b/lib/spot/proto/playlist_contains_request.proto new file mode 100644 index 0000000..072d537 --- /dev/null +++ b/lib/spot/proto/playlist_contains_request.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "contains_request.proto"; +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistContainsRequest { + string uri = 1; + playlist.cosmos.proto.ContainsRequest request = 2; +} + +message PlaylistContainsResponse { + ResponseStatus status = 1; + playlist.cosmos.proto.ContainsResponse response = 2; +} diff --git a/lib/spot/proto/playlist_folder_state.proto b/lib/spot/proto/playlist_folder_state.proto new file mode 100644 index 0000000..a2d32d7 --- /dev/null +++ b/lib/spot/proto/playlist_folder_state.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message FolderMetadata { + optional string id = 1; + optional string name = 2; + optional uint32 num_folders = 3; + optional uint32 num_playlists = 4; + optional uint32 num_recursive_folders = 5; + optional uint32 num_recursive_playlists = 6; + optional string link = 7; +} diff --git a/lib/spot/proto/playlist_get_request.proto b/lib/spot/proto/playlist_get_request.proto new file mode 100644 index 0000000..7e6dd3f --- /dev/null +++ b/lib/spot/proto/playlist_get_request.proto @@ -0,0 +1,26 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "policy/playlist_request_decoration_policy.proto"; +import "playlist_query.proto"; +import "playlist_request.proto"; +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistGetRequest { + string uri = 1; + PlaylistQuery query = 2; + playlist.cosmos.proto.PlaylistRequestDecorationPolicy policy = 3; +} + +message PlaylistGetResponse { + ResponseStatus status = 1; + playlist.cosmos.playlist_request.proto.Response data = 2; +} diff --git a/lib/spot/proto/playlist_members_request.proto b/lib/spot/proto/playlist_members_request.proto new file mode 100644 index 0000000..d5bd9b9 --- /dev/null +++ b/lib/spot/proto/playlist_members_request.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "members_request.proto"; +import "members_response.proto"; +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistMembersResponse { + ResponseStatus status = 1; + playlist.cosmos.proto.PlaylistMembersResponse response = 2; +} diff --git a/lib/spot/proto/playlist_modification_request.proto b/lib/spot/proto/playlist_modification_request.proto new file mode 100644 index 0000000..2bdb014 --- /dev/null +++ b/lib/spot/proto/playlist_modification_request.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "modification_request.proto"; +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistModificationRequest { + string uri = 1; + playlist.cosmos.proto.ModificationRequest request = 2; +} + +message PlaylistModificationResponse { + ResponseStatus status = 1; +} diff --git a/lib/spot/proto/playlist_offline_request.proto b/lib/spot/proto/playlist_offline_request.proto new file mode 100644 index 0000000..e0ab631 --- /dev/null +++ b/lib/spot/proto/playlist_offline_request.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "playlist_query.proto"; +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistOfflineRequest { + string uri = 1; + PlaylistQuery query = 2; + PlaylistOfflineAction action = 3; +} + +message PlaylistOfflineResponse { + ResponseStatus status = 1; +} + +enum PlaylistOfflineAction { + NONE = 0; + SET_AS_AVAILABLE_OFFLINE = 1; + REMOVE_AS_AVAILABLE_OFFLINE = 2; +} diff --git a/lib/spot/proto/playlist_permission.pb.go b/lib/spot/proto/playlist_permission.pb.go new file mode 100644 index 0000000..1809540 --- /dev/null +++ b/lib/spot/proto/playlist_permission.pb.go @@ -0,0 +1,1466 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: playlist_permission.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type PermissionLevel int32 + +const ( + PermissionLevel_UNKNOWN PermissionLevel = 0 + PermissionLevel_BLOCKED PermissionLevel = 1 + PermissionLevel_VIEWER PermissionLevel = 2 + PermissionLevel_CONTRIBUTOR PermissionLevel = 3 +) + +// Enum value maps for PermissionLevel. +var ( + PermissionLevel_name = map[int32]string{ + 0: "UNKNOWN", + 1: "BLOCKED", + 2: "VIEWER", + 3: "CONTRIBUTOR", + } + PermissionLevel_value = map[string]int32{ + "UNKNOWN": 0, + "BLOCKED": 1, + "VIEWER": 2, + "CONTRIBUTOR": 3, + } +) + +func (x PermissionLevel) Enum() *PermissionLevel { + p := new(PermissionLevel) + *p = x + return p +} + +func (x PermissionLevel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PermissionLevel) Descriptor() protoreflect.EnumDescriptor { + return file_playlist_permission_proto_enumTypes[0].Descriptor() +} + +func (PermissionLevel) Type() protoreflect.EnumType { + return &file_playlist_permission_proto_enumTypes[0] +} + +func (x PermissionLevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *PermissionLevel) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = PermissionLevel(num) + return nil +} + +// Deprecated: Use PermissionLevel.Descriptor instead. +func (PermissionLevel) EnumDescriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{0} +} + +type Permission struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision []byte `protobuf:"bytes,1,opt,name=revision" json:"revision,omitempty"` + PermissionLevel *PermissionLevel `protobuf:"varint,2,opt,name=permission_level,json=permissionLevel,enum=spotify.playlist_permission.proto.PermissionLevel" json:"permission_level,omitempty"` +} + +func (x *Permission) Reset() { + *x = Permission{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Permission) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Permission) ProtoMessage() {} + +func (x *Permission) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Permission.ProtoReflect.Descriptor instead. +func (*Permission) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{0} +} + +func (x *Permission) GetRevision() []byte { + if x != nil { + return x.Revision + } + return nil +} + +func (x *Permission) GetPermissionLevel() PermissionLevel { + if x != nil && x.PermissionLevel != nil { + return *x.PermissionLevel + } + return PermissionLevel_UNKNOWN +} + +type Capabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CanView *bool `protobuf:"varint,1,opt,name=can_view,json=canView" json:"can_view,omitempty"` + CanAdministratePermissions *bool `protobuf:"varint,2,opt,name=can_administrate_permissions,json=canAdministratePermissions" json:"can_administrate_permissions,omitempty"` + GrantableLevel []PermissionLevel `protobuf:"varint,3,rep,name=grantable_level,json=grantableLevel,enum=spotify.playlist_permission.proto.PermissionLevel" json:"grantable_level,omitempty"` + CanEditMetadata *bool `protobuf:"varint,4,opt,name=can_edit_metadata,json=canEditMetadata" json:"can_edit_metadata,omitempty"` + CanEditItems *bool `protobuf:"varint,5,opt,name=can_edit_items,json=canEditItems" json:"can_edit_items,omitempty"` + CanCancelMembership *bool `protobuf:"varint,6,opt,name=can_cancel_membership,json=canCancelMembership" json:"can_cancel_membership,omitempty"` +} + +func (x *Capabilities) Reset() { + *x = Capabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Capabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Capabilities) ProtoMessage() {} + +func (x *Capabilities) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Capabilities.ProtoReflect.Descriptor instead. +func (*Capabilities) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{1} +} + +func (x *Capabilities) GetCanView() bool { + if x != nil && x.CanView != nil { + return *x.CanView + } + return false +} + +func (x *Capabilities) GetCanAdministratePermissions() bool { + if x != nil && x.CanAdministratePermissions != nil { + return *x.CanAdministratePermissions + } + return false +} + +func (x *Capabilities) GetGrantableLevel() []PermissionLevel { + if x != nil { + return x.GrantableLevel + } + return nil +} + +func (x *Capabilities) GetCanEditMetadata() bool { + if x != nil && x.CanEditMetadata != nil { + return *x.CanEditMetadata + } + return false +} + +func (x *Capabilities) GetCanEditItems() bool { + if x != nil && x.CanEditItems != nil { + return *x.CanEditItems + } + return false +} + +func (x *Capabilities) GetCanCancelMembership() bool { + if x != nil && x.CanCancelMembership != nil { + return *x.CanCancelMembership + } + return false +} + +type CapabilitiesMultiRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request []*CapabilitiesRequest `protobuf:"bytes,1,rep,name=request" json:"request,omitempty"` + FallbackUsername *string `protobuf:"bytes,2,opt,name=fallback_username,json=fallbackUsername" json:"fallback_username,omitempty"` + FallbackUserId *string `protobuf:"bytes,3,opt,name=fallback_user_id,json=fallbackUserId" json:"fallback_user_id,omitempty"` + FallbackUri *string `protobuf:"bytes,4,opt,name=fallback_uri,json=fallbackUri" json:"fallback_uri,omitempty"` +} + +func (x *CapabilitiesMultiRequest) Reset() { + *x = CapabilitiesMultiRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CapabilitiesMultiRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CapabilitiesMultiRequest) ProtoMessage() {} + +func (x *CapabilitiesMultiRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CapabilitiesMultiRequest.ProtoReflect.Descriptor instead. +func (*CapabilitiesMultiRequest) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{2} +} + +func (x *CapabilitiesMultiRequest) GetRequest() []*CapabilitiesRequest { + if x != nil { + return x.Request + } + return nil +} + +func (x *CapabilitiesMultiRequest) GetFallbackUsername() string { + if x != nil && x.FallbackUsername != nil { + return *x.FallbackUsername + } + return "" +} + +func (x *CapabilitiesMultiRequest) GetFallbackUserId() string { + if x != nil && x.FallbackUserId != nil { + return *x.FallbackUserId + } + return "" +} + +func (x *CapabilitiesMultiRequest) GetFallbackUri() string { + if x != nil && x.FallbackUri != nil { + return *x.FallbackUri + } + return "" +} + +type CapabilitiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Username *string `protobuf:"bytes,1,opt,name=username" json:"username,omitempty"` + UserId *string `protobuf:"bytes,2,opt,name=user_id,json=userId" json:"user_id,omitempty"` + Uri *string `protobuf:"bytes,3,opt,name=uri" json:"uri,omitempty"` + UserIsOwner *bool `protobuf:"varint,4,opt,name=user_is_owner,json=userIsOwner" json:"user_is_owner,omitempty"` +} + +func (x *CapabilitiesRequest) Reset() { + *x = CapabilitiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CapabilitiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CapabilitiesRequest) ProtoMessage() {} + +func (x *CapabilitiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CapabilitiesRequest.ProtoReflect.Descriptor instead. +func (*CapabilitiesRequest) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{3} +} + +func (x *CapabilitiesRequest) GetUsername() string { + if x != nil && x.Username != nil { + return *x.Username + } + return "" +} + +func (x *CapabilitiesRequest) GetUserId() string { + if x != nil && x.UserId != nil { + return *x.UserId + } + return "" +} + +func (x *CapabilitiesRequest) GetUri() string { + if x != nil && x.Uri != nil { + return *x.Uri + } + return "" +} + +func (x *CapabilitiesRequest) GetUserIsOwner() bool { + if x != nil && x.UserIsOwner != nil { + return *x.UserIsOwner + } + return false +} + +type CapabilitiesMultiResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Response []*CapabilitiesResponse `protobuf:"bytes,1,rep,name=response" json:"response,omitempty"` +} + +func (x *CapabilitiesMultiResponse) Reset() { + *x = CapabilitiesMultiResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CapabilitiesMultiResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CapabilitiesMultiResponse) ProtoMessage() {} + +func (x *CapabilitiesMultiResponse) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CapabilitiesMultiResponse.ProtoReflect.Descriptor instead. +func (*CapabilitiesMultiResponse) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{4} +} + +func (x *CapabilitiesMultiResponse) GetResponse() []*CapabilitiesResponse { + if x != nil { + return x.Response + } + return nil +} + +type CapabilitiesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status *ResponseStatus `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"` + Capabilities *Capabilities `protobuf:"bytes,2,opt,name=capabilities" json:"capabilities,omitempty"` +} + +func (x *CapabilitiesResponse) Reset() { + *x = CapabilitiesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CapabilitiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CapabilitiesResponse) ProtoMessage() {} + +func (x *CapabilitiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CapabilitiesResponse.ProtoReflect.Descriptor instead. +func (*CapabilitiesResponse) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{5} +} + +func (x *CapabilitiesResponse) GetStatus() *ResponseStatus { + if x != nil { + return x.Status + } + return nil +} + +func (x *CapabilitiesResponse) GetCapabilities() *Capabilities { + if x != nil { + return x.Capabilities + } + return nil +} + +type SetPermissionLevelRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PermissionLevel *PermissionLevel `protobuf:"varint,1,opt,name=permission_level,json=permissionLevel,enum=spotify.playlist_permission.proto.PermissionLevel" json:"permission_level,omitempty"` +} + +func (x *SetPermissionLevelRequest) Reset() { + *x = SetPermissionLevelRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetPermissionLevelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetPermissionLevelRequest) ProtoMessage() {} + +func (x *SetPermissionLevelRequest) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetPermissionLevelRequest.ProtoReflect.Descriptor instead. +func (*SetPermissionLevelRequest) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{6} +} + +func (x *SetPermissionLevelRequest) GetPermissionLevel() PermissionLevel { + if x != nil && x.PermissionLevel != nil { + return *x.PermissionLevel + } + return PermissionLevel_UNKNOWN +} + +type SetPermissionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResultingPermission *Permission `protobuf:"bytes,1,opt,name=resulting_permission,json=resultingPermission" json:"resulting_permission,omitempty"` +} + +func (x *SetPermissionResponse) Reset() { + *x = SetPermissionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetPermissionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetPermissionResponse) ProtoMessage() {} + +func (x *SetPermissionResponse) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetPermissionResponse.ProtoReflect.Descriptor instead. +func (*SetPermissionResponse) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{7} +} + +func (x *SetPermissionResponse) GetResultingPermission() *Permission { + if x != nil { + return x.ResultingPermission + } + return nil +} + +type GetMemberPermissionsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MemberPermissions map[string]*Permission `protobuf:"bytes,1,rep,name=member_permissions,json=memberPermissions" json:"member_permissions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (x *GetMemberPermissionsResponse) Reset() { + *x = GetMemberPermissionsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetMemberPermissionsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetMemberPermissionsResponse) ProtoMessage() {} + +func (x *GetMemberPermissionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetMemberPermissionsResponse.ProtoReflect.Descriptor instead. +func (*GetMemberPermissionsResponse) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{8} +} + +func (x *GetMemberPermissionsResponse) GetMemberPermissions() map[string]*Permission { + if x != nil { + return x.MemberPermissions + } + return nil +} + +type Permissions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BasePermission *Permission `protobuf:"bytes,1,opt,name=base_permission,json=basePermission" json:"base_permission,omitempty"` +} + +func (x *Permissions) Reset() { + *x = Permissions{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Permissions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Permissions) ProtoMessage() {} + +func (x *Permissions) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Permissions.ProtoReflect.Descriptor instead. +func (*Permissions) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{9} +} + +func (x *Permissions) GetBasePermission() *Permission { + if x != nil { + return x.BasePermission + } + return nil +} + +type PermissionState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Permissions *Permissions `protobuf:"bytes,1,opt,name=permissions" json:"permissions,omitempty"` + Capabilities *Capabilities `protobuf:"bytes,2,opt,name=capabilities" json:"capabilities,omitempty"` + IsPrivate *bool `protobuf:"varint,3,opt,name=is_private,json=isPrivate" json:"is_private,omitempty"` + IsCollaborative *bool `protobuf:"varint,4,opt,name=is_collaborative,json=isCollaborative" json:"is_collaborative,omitempty"` +} + +func (x *PermissionState) Reset() { + *x = PermissionState{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PermissionState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PermissionState) ProtoMessage() {} + +func (x *PermissionState) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PermissionState.ProtoReflect.Descriptor instead. +func (*PermissionState) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{10} +} + +func (x *PermissionState) GetPermissions() *Permissions { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *PermissionState) GetCapabilities() *Capabilities { + if x != nil { + return x.Capabilities + } + return nil +} + +func (x *PermissionState) GetIsPrivate() bool { + if x != nil && x.IsPrivate != nil { + return *x.IsPrivate + } + return false +} + +func (x *PermissionState) GetIsCollaborative() bool { + if x != nil && x.IsCollaborative != nil { + return *x.IsCollaborative + } + return false +} + +type PermissionStatePub struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PermissionState *PermissionState `protobuf:"bytes,1,opt,name=permission_state,json=permissionState" json:"permission_state,omitempty"` +} + +func (x *PermissionStatePub) Reset() { + *x = PermissionStatePub{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PermissionStatePub) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PermissionStatePub) ProtoMessage() {} + +func (x *PermissionStatePub) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PermissionStatePub.ProtoReflect.Descriptor instead. +func (*PermissionStatePub) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{11} +} + +func (x *PermissionStatePub) GetPermissionState() *PermissionState { + if x != nil { + return x.PermissionState + } + return nil +} + +type PermissionGrantOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Permission *Permission `protobuf:"bytes,1,opt,name=permission" json:"permission,omitempty"` + TtlMs *int64 `protobuf:"varint,2,opt,name=ttl_ms,json=ttlMs" json:"ttl_ms,omitempty"` +} + +func (x *PermissionGrantOptions) Reset() { + *x = PermissionGrantOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PermissionGrantOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PermissionGrantOptions) ProtoMessage() {} + +func (x *PermissionGrantOptions) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PermissionGrantOptions.ProtoReflect.Descriptor instead. +func (*PermissionGrantOptions) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{12} +} + +func (x *PermissionGrantOptions) GetPermission() *Permission { + if x != nil { + return x.Permission + } + return nil +} + +func (x *PermissionGrantOptions) GetTtlMs() int64 { + if x != nil && x.TtlMs != nil { + return *x.TtlMs + } + return 0 +} + +type PermissionGrant struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token *string `protobuf:"bytes,1,opt,name=token" json:"token,omitempty"` + PermissionGrantOptions *PermissionGrantOptions `protobuf:"bytes,2,opt,name=permission_grant_options,json=permissionGrantOptions" json:"permission_grant_options,omitempty"` +} + +func (x *PermissionGrant) Reset() { + *x = PermissionGrant{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PermissionGrant) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PermissionGrant) ProtoMessage() {} + +func (x *PermissionGrant) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PermissionGrant.ProtoReflect.Descriptor instead. +func (*PermissionGrant) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{13} +} + +func (x *PermissionGrant) GetToken() string { + if x != nil && x.Token != nil { + return *x.Token + } + return "" +} + +func (x *PermissionGrant) GetPermissionGrantOptions() *PermissionGrantOptions { + if x != nil { + return x.PermissionGrantOptions + } + return nil +} + +type ClaimPermissionGrantResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserPermission *Permission `protobuf:"bytes,1,opt,name=user_permission,json=userPermission" json:"user_permission,omitempty"` + Capabilities *Capabilities `protobuf:"bytes,2,opt,name=capabilities" json:"capabilities,omitempty"` +} + +func (x *ClaimPermissionGrantResponse) Reset() { + *x = ClaimPermissionGrantResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClaimPermissionGrantResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClaimPermissionGrantResponse) ProtoMessage() {} + +func (x *ClaimPermissionGrantResponse) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClaimPermissionGrantResponse.ProtoReflect.Descriptor instead. +func (*ClaimPermissionGrantResponse) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{14} +} + +func (x *ClaimPermissionGrantResponse) GetUserPermission() *Permission { + if x != nil { + return x.UserPermission + } + return nil +} + +func (x *ClaimPermissionGrantResponse) GetCapabilities() *Capabilities { + if x != nil { + return x.Capabilities + } + return nil +} + +type ResponseStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StatusCode *int32 `protobuf:"varint,1,opt,name=status_code,json=statusCode" json:"status_code,omitempty"` + StatusMessage *string `protobuf:"bytes,2,opt,name=status_message,json=statusMessage" json:"status_message,omitempty"` +} + +func (x *ResponseStatus) Reset() { + *x = ResponseStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_playlist_permission_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResponseStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponseStatus) ProtoMessage() {} + +func (x *ResponseStatus) ProtoReflect() protoreflect.Message { + mi := &file_playlist_permission_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResponseStatus.ProtoReflect.Descriptor instead. +func (*ResponseStatus) Descriptor() ([]byte, []int) { + return file_playlist_permission_proto_rawDescGZIP(), []int{15} +} + +func (x *ResponseStatus) GetStatusCode() int32 { + if x != nil && x.StatusCode != nil { + return *x.StatusCode + } + return 0 +} + +func (x *ResponseStatus) GetStatusMessage() string { + if x != nil && x.StatusMessage != nil { + return *x.StatusMessage + } + return "" +} + +var File_playlist_permission_proto protoreflect.FileDescriptor + +var file_playlist_permission_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x87, + 0x01, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, + 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0xce, 0x02, 0x0a, 0x0c, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61, 0x6e, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x61, 0x6e, + 0x56, 0x69, 0x65, 0x77, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x61, 0x6e, 0x5f, 0x61, 0x64, 0x6d, 0x69, + 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x61, 0x6e, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, 0x0f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x32, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x6e, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x63, 0x61, 0x6e, 0x45, 0x64, 0x69, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x24, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x61, 0x6e, 0x45, 0x64, 0x69, 0x74, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x61, 0x6e, 0x5f, 0x63, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, 0x61, 0x6e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x22, 0xe6, 0x01, 0x0a, 0x18, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x75, 0x72, 0x69, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x55, + 0x72, 0x69, 0x22, 0x80, 0x01, 0x0a, 0x13, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x69, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x73, 0x5f, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x49, 0x73, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x70, 0x0a, 0x19, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x53, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, + 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x53, 0x0a, 0x0c, 0x63, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x7a, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, + 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0f, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x79, 0x0a, 0x15, + 0x53, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, + 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x02, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x12, 0x6d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x73, 0x0a, 0x16, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x43, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x0b, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x56, 0x0a, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x62, 0x61, + 0x73, 0x65, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x82, 0x02, 0x0a, + 0x0f, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x50, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6c, + 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x69, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x22, 0x73, 0x0a, 0x12, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x12, 0x5d, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x7e, 0x0a, 0x16, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x4d, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, + 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x15, 0x0a, 0x06, 0x74, 0x74, 0x6c, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x74, 0x74, 0x6c, 0x4d, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x0f, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x73, 0x0a, 0x18, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, + 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x16, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x1c, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x50, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, + 0x75, 0x73, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, + 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, + 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x58, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x48, 0x0a, + 0x0f, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x49, + 0x45, 0x57, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x49, + 0x42, 0x55, 0x54, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x43, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x73, + 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x73, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x21, 0x74, 0x75, 0x78, 0x70, 0x61, + 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, + 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, +} + +var ( + file_playlist_permission_proto_rawDescOnce sync.Once + file_playlist_permission_proto_rawDescData = file_playlist_permission_proto_rawDesc +) + +func file_playlist_permission_proto_rawDescGZIP() []byte { + file_playlist_permission_proto_rawDescOnce.Do(func() { + file_playlist_permission_proto_rawDescData = protoimpl.X.CompressGZIP(file_playlist_permission_proto_rawDescData) + }) + return file_playlist_permission_proto_rawDescData +} + +var file_playlist_permission_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_playlist_permission_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_playlist_permission_proto_goTypes = []interface{}{ + (PermissionLevel)(0), // 0: spotify.playlist_permission.proto.PermissionLevel + (*Permission)(nil), // 1: spotify.playlist_permission.proto.Permission + (*Capabilities)(nil), // 2: spotify.playlist_permission.proto.Capabilities + (*CapabilitiesMultiRequest)(nil), // 3: spotify.playlist_permission.proto.CapabilitiesMultiRequest + (*CapabilitiesRequest)(nil), // 4: spotify.playlist_permission.proto.CapabilitiesRequest + (*CapabilitiesMultiResponse)(nil), // 5: spotify.playlist_permission.proto.CapabilitiesMultiResponse + (*CapabilitiesResponse)(nil), // 6: spotify.playlist_permission.proto.CapabilitiesResponse + (*SetPermissionLevelRequest)(nil), // 7: spotify.playlist_permission.proto.SetPermissionLevelRequest + (*SetPermissionResponse)(nil), // 8: spotify.playlist_permission.proto.SetPermissionResponse + (*GetMemberPermissionsResponse)(nil), // 9: spotify.playlist_permission.proto.GetMemberPermissionsResponse + (*Permissions)(nil), // 10: spotify.playlist_permission.proto.Permissions + (*PermissionState)(nil), // 11: spotify.playlist_permission.proto.PermissionState + (*PermissionStatePub)(nil), // 12: spotify.playlist_permission.proto.PermissionStatePub + (*PermissionGrantOptions)(nil), // 13: spotify.playlist_permission.proto.PermissionGrantOptions + (*PermissionGrant)(nil), // 14: spotify.playlist_permission.proto.PermissionGrant + (*ClaimPermissionGrantResponse)(nil), // 15: spotify.playlist_permission.proto.ClaimPermissionGrantResponse + (*ResponseStatus)(nil), // 16: spotify.playlist_permission.proto.ResponseStatus + nil, // 17: spotify.playlist_permission.proto.GetMemberPermissionsResponse.MemberPermissionsEntry +} +var file_playlist_permission_proto_depIdxs = []int32{ + 0, // 0: spotify.playlist_permission.proto.Permission.permission_level:type_name -> spotify.playlist_permission.proto.PermissionLevel + 0, // 1: spotify.playlist_permission.proto.Capabilities.grantable_level:type_name -> spotify.playlist_permission.proto.PermissionLevel + 4, // 2: spotify.playlist_permission.proto.CapabilitiesMultiRequest.request:type_name -> spotify.playlist_permission.proto.CapabilitiesRequest + 6, // 3: spotify.playlist_permission.proto.CapabilitiesMultiResponse.response:type_name -> spotify.playlist_permission.proto.CapabilitiesResponse + 16, // 4: spotify.playlist_permission.proto.CapabilitiesResponse.status:type_name -> spotify.playlist_permission.proto.ResponseStatus + 2, // 5: spotify.playlist_permission.proto.CapabilitiesResponse.capabilities:type_name -> spotify.playlist_permission.proto.Capabilities + 0, // 6: spotify.playlist_permission.proto.SetPermissionLevelRequest.permission_level:type_name -> spotify.playlist_permission.proto.PermissionLevel + 1, // 7: spotify.playlist_permission.proto.SetPermissionResponse.resulting_permission:type_name -> spotify.playlist_permission.proto.Permission + 17, // 8: spotify.playlist_permission.proto.GetMemberPermissionsResponse.member_permissions:type_name -> spotify.playlist_permission.proto.GetMemberPermissionsResponse.MemberPermissionsEntry + 1, // 9: spotify.playlist_permission.proto.Permissions.base_permission:type_name -> spotify.playlist_permission.proto.Permission + 10, // 10: spotify.playlist_permission.proto.PermissionState.permissions:type_name -> spotify.playlist_permission.proto.Permissions + 2, // 11: spotify.playlist_permission.proto.PermissionState.capabilities:type_name -> spotify.playlist_permission.proto.Capabilities + 11, // 12: spotify.playlist_permission.proto.PermissionStatePub.permission_state:type_name -> spotify.playlist_permission.proto.PermissionState + 1, // 13: spotify.playlist_permission.proto.PermissionGrantOptions.permission:type_name -> spotify.playlist_permission.proto.Permission + 13, // 14: spotify.playlist_permission.proto.PermissionGrant.permission_grant_options:type_name -> spotify.playlist_permission.proto.PermissionGrantOptions + 1, // 15: spotify.playlist_permission.proto.ClaimPermissionGrantResponse.user_permission:type_name -> spotify.playlist_permission.proto.Permission + 2, // 16: spotify.playlist_permission.proto.ClaimPermissionGrantResponse.capabilities:type_name -> spotify.playlist_permission.proto.Capabilities + 1, // 17: spotify.playlist_permission.proto.GetMemberPermissionsResponse.MemberPermissionsEntry.value:type_name -> spotify.playlist_permission.proto.Permission + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name +} + +func init() { file_playlist_permission_proto_init() } +func file_playlist_permission_proto_init() { + if File_playlist_permission_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_playlist_permission_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Permission); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Capabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapabilitiesMultiRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapabilitiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapabilitiesMultiResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapabilitiesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetPermissionLevelRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetPermissionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMemberPermissionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Permissions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PermissionState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PermissionStatePub); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PermissionGrantOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PermissionGrant); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClaimPermissionGrantResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_playlist_permission_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResponseStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_playlist_permission_proto_rawDesc, + NumEnums: 1, + NumMessages: 17, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_playlist_permission_proto_goTypes, + DependencyIndexes: file_playlist_permission_proto_depIdxs, + EnumInfos: file_playlist_permission_proto_enumTypes, + MessageInfos: file_playlist_permission_proto_msgTypes, + }.Build() + File_playlist_permission_proto = out.File + file_playlist_permission_proto_rawDesc = nil + file_playlist_permission_proto_goTypes = nil + file_playlist_permission_proto_depIdxs = nil +} diff --git a/lib/spot/proto/playlist_permission.proto b/lib/spot/proto/playlist_permission.proto new file mode 100644 index 0000000..db73197 --- /dev/null +++ b/lib/spot/proto/playlist_permission.proto @@ -0,0 +1,101 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist_permission.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message Permission { + optional bytes revision = 1; + optional PermissionLevel permission_level = 2; +} + +message Capabilities { + optional bool can_view = 1; + optional bool can_administrate_permissions = 2; + repeated PermissionLevel grantable_level = 3; + optional bool can_edit_metadata = 4; + optional bool can_edit_items = 5; + optional bool can_cancel_membership = 6; +} + +message CapabilitiesMultiRequest { + repeated CapabilitiesRequest request = 1; + optional string fallback_username = 2; + optional string fallback_user_id = 3; + optional string fallback_uri = 4; +} + +message CapabilitiesRequest { + optional string username = 1; + optional string user_id = 2; + optional string uri = 3; + optional bool user_is_owner = 4; +} + +message CapabilitiesMultiResponse { + repeated CapabilitiesResponse response = 1; +} + +message CapabilitiesResponse { + optional ResponseStatus status = 1; + optional Capabilities capabilities = 2; +} + +message SetPermissionLevelRequest { + optional PermissionLevel permission_level = 1; +} + +message SetPermissionResponse { + optional Permission resulting_permission = 1; +} + +message GetMemberPermissionsResponse { + map member_permissions = 1; +} + +message Permissions { + optional Permission base_permission = 1; +} + +message PermissionState { + optional Permissions permissions = 1; + optional Capabilities capabilities = 2; + optional bool is_private = 3; + optional bool is_collaborative = 4; +} + +message PermissionStatePub { + optional PermissionState permission_state = 1; +} + +message PermissionGrantOptions { + optional Permission permission = 1; + optional int64 ttl_ms = 2; +} + +message PermissionGrant { + optional string token = 1; + optional PermissionGrantOptions permission_grant_options = 2; +} + +message ClaimPermissionGrantResponse { + optional Permission user_permission = 1; + optional Capabilities capabilities = 2; +} + +message ResponseStatus { + optional int32 status_code = 1; + optional string status_message = 2; +} + +enum PermissionLevel { + UNKNOWN = 0; + BLOCKED = 1; + VIEWER = 2; + CONTRIBUTOR = 3; +} diff --git a/lib/spot/proto/playlist_play_request.proto b/lib/spot/proto/playlist_play_request.proto new file mode 100644 index 0000000..032b2b2 --- /dev/null +++ b/lib/spot/proto/playlist_play_request.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "es_context.proto"; +import "es_play_options.proto"; +import "es_logging_params.proto"; +import "es_prepare_play_options.proto"; +import "es_play_origin.proto"; +import "playlist_query.proto"; +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistPlayRequest { + PlaylistQuery playlist_query = 1; + player.esperanto.proto.Context context = 2; + player.esperanto.proto.PlayOptions play_options = 3; + player.esperanto.proto.LoggingParams logging_params = 4; + player.esperanto.proto.PreparePlayOptions prepare_play_options = 5; + player.esperanto.proto.PlayOrigin play_origin = 6; +} + +message PlaylistPlayResponse { + ResponseStatus status = 1; +} diff --git a/lib/spot/proto/playlist_playback_request.proto b/lib/spot/proto/playlist_playback_request.proto new file mode 100644 index 0000000..8cd2025 --- /dev/null +++ b/lib/spot/proto/playlist_playback_request.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message PlaybackResponse { + bool success = 1; +} diff --git a/lib/spot/proto/playlist_playlist_state.proto b/lib/spot/proto/playlist_playlist_state.proto new file mode 100644 index 0000000..5663252 --- /dev/null +++ b/lib/spot/proto/playlist_playlist_state.proto @@ -0,0 +1,52 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +import "metadata/extension.proto"; +import "metadata/image_group.proto"; +import "playlist_user_state.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message FormatListAttribute { + optional string key = 1; + optional string value = 2; +} + +message Allows { + optional bool can_insert = 1; + optional bool can_remove = 2; +} + +message PlaylistMetadata { + optional string link = 1; + optional string name = 2; + optional User owner = 3; + optional bool owned_by_self = 4; + optional bool collaborative = 5; + optional uint32 total_length = 6; + optional string description = 7; + optional cosmos_util.proto.ImageGroup pictures = 8; + optional bool followed = 9; + optional bool published = 10; + optional bool browsable_offline = 11; + optional bool description_from_annotate = 12; + optional bool picture_from_annotate = 13; + optional string format_list_type = 14; + repeated FormatListAttribute format_list_attributes = 15; + optional bool can_report_annotation_abuse = 16; + optional bool is_loaded = 17; + optional Allows allows = 18; + optional string load_state = 19; + optional User made_for = 20; + repeated cosmos_util.proto.Extension extension = 21; +} + +message PlaylistOfflineState { + optional string offline = 1; + optional uint32 sync_progress = 2; +} diff --git a/lib/spot/proto/playlist_query.proto b/lib/spot/proto/playlist_query.proto new file mode 100644 index 0000000..afd9761 --- /dev/null +++ b/lib/spot/proto/playlist_query.proto @@ -0,0 +1,63 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistRange { + int32 start = 1; + int32 length = 2; +} + +message PlaylistQuery { + repeated BoolPredicate bool_predicates = 1; + enum BoolPredicate { + NO_FILTER = 0; + AVAILABLE = 1; + AVAILABLE_OFFLINE = 2; + ARTIST_NOT_BANNED = 3; + NOT_BANNED = 4; + NOT_EXPLICIT = 5; + NOT_EPISODE = 6; + } + + string text_filter = 2; + + SortBy sort_by = 3; + enum SortBy { + NO_SORT = 0; + ALBUM_ARTIST_NAME_ASC = 1; + ALBUM_ARTIST_NAME_DESC = 2; + TRACK_NUMBER_ASC = 3; + TRACK_NUMBER_DESC = 4; + DISC_NUMBER_ASC = 5; + DISC_NUMBER_DESC = 6; + ALBUM_NAME_ASC = 7; + ALBUM_NAME_DESC = 8; + ARTIST_NAME_ASC = 9; + ARTIST_NAME_DESC = 10; + NAME_ASC = 11; + NAME_DESC = 12; + ADD_TIME_ASC = 13; + ADD_TIME_DESC = 14; + } + + PlaylistRange range = 4; + int32 update_throttling_ms = 5; + bool group = 6; + PlaylistSourceRestriction source_restriction = 7; + bool show_unavailable = 8; + bool always_show_windowed = 9; + bool load_recommendations = 10; +} + +enum PlaylistSourceRestriction { + NO_RESTRICTION = 0; + RESTRICT_SOURCE_TO_50 = 1; + RESTRICT_SOURCE_TO_500 = 2; +} diff --git a/lib/spot/proto/playlist_request.proto b/lib/spot/proto/playlist_request.proto new file mode 100644 index 0000000..52befb1 --- /dev/null +++ b/lib/spot/proto/playlist_request.proto @@ -0,0 +1,91 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.playlist_request.proto; + +import "collection/episode_collection_state.proto"; +import "metadata/episode_metadata.proto"; +import "played_state/track_played_state.proto"; +import "played_state/episode_played_state.proto"; +import "sync/episode_sync_state.proto"; +import "metadata/image_group.proto"; +import "on_demand_in_free_reason.proto"; +import "playlist_permission.proto"; +import "playlist_playlist_state.proto"; +import "playlist_track_state.proto"; +import "playlist_user_state.proto"; +import "metadata/track_metadata.proto"; + +option objc_class_prefix = "SPTPlaylistCosmosPlaylist"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message Item { + optional string header_field = 1; + optional uint32 add_time = 2; + optional cosmos.proto.User added_by = 3; + optional cosmos_util.proto.TrackMetadata track_metadata = 4; + optional cosmos.proto.TrackCollectionState track_collection_state = 5; + optional cosmos.proto.TrackOfflineState track_offline_state = 6; + optional string row_id = 7; + optional cosmos_util.proto.TrackPlayState track_play_state = 8; + repeated cosmos.proto.FormatListAttribute format_list_attributes = 9; + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 10; + optional cosmos_util.proto.EpisodeSyncState episode_offline_state = 11; + optional cosmos_util.proto.EpisodeCollectionState episode_collection_state = 12; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 13; + optional cosmos_util.proto.ImageGroup display_covers = 14; +} + +message Playlist { + optional cosmos.proto.PlaylistMetadata playlist_metadata = 1; + optional cosmos.proto.PlaylistOfflineState playlist_offline_state = 2; +} + +message RecommendationItem { + optional cosmos_util.proto.TrackMetadata track_metadata = 1; + optional cosmos.proto.TrackCollectionState track_collection_state = 2; + optional cosmos.proto.TrackOfflineState track_offline_state = 3; + optional cosmos_util.proto.TrackPlayState track_play_state = 4; +} + +message Collaborator { + optional cosmos.proto.User user = 1; + optional uint32 number_of_items = 2; + optional uint32 number_of_tracks = 3; + optional uint32 number_of_episodes = 4; + optional bool is_owner = 5; +} + +message Collaborators { + optional uint32 count = 1; + repeated Collaborator collaborator = 2; +} + +message Response { + repeated Item item = 1; + optional Playlist playlist = 2; + optional uint32 unfiltered_length = 3; + optional uint32 unranged_length = 4; + optional uint64 duration = 5; + optional bool loading_contents = 6; + optional uint64 last_modification = 7; + optional uint32 num_followers = 8; + optional bool playable = 9; + repeated RecommendationItem recommendations = 10; + optional bool has_explicit_content = 11; + optional bool contains_spotify_tracks = 12; + optional bool contains_episodes = 13; + optional bool only_contains_explicit = 14; + optional bool contains_audio_episodes = 15; + optional bool contains_tracks = 16; + optional bool is_on_demand_in_free = 17; + optional uint32 number_of_tracks = 18; + optional uint32 number_of_episodes = 19; + optional bool prefer_linear_playback = 20; + optional on_demand_set.proto.OnDemandInFreeReason on_demand_in_free_reason = 21; + optional Collaborators collaborators = 22; + optional playlist_permission.proto.Permission base_permission = 23; + optional playlist_permission.proto.Capabilities user_capabilities = 24; +} diff --git a/lib/spot/proto/playlist_set_base_permission_request.proto b/lib/spot/proto/playlist_set_base_permission_request.proto new file mode 100644 index 0000000..3e8e183 --- /dev/null +++ b/lib/spot/proto/playlist_set_base_permission_request.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "playlist_set_permission_request.proto"; +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistSetBasePermissionRequest { + string uri = 1; + playlist.cosmos.proto.SetBasePermissionRequest request = 2; +} + +message PlaylistSetBasePermissionResponse { + ResponseStatus status = 1; + playlist.cosmos.proto.SetBasePermissionResponse response = 2; +} diff --git a/lib/spot/proto/playlist_set_member_permission_request.proto b/lib/spot/proto/playlist_set_member_permission_request.proto new file mode 100644 index 0000000..d3d687a --- /dev/null +++ b/lib/spot/proto/playlist_set_member_permission_request.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +import "response_status.proto"; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message PlaylistSetMemberPermissionResponse { + ResponseStatus status = 1; +} diff --git a/lib/spot/proto/playlist_set_permission_request.proto b/lib/spot/proto/playlist_set_permission_request.proto new file mode 100644 index 0000000..a410cc2 --- /dev/null +++ b/lib/spot/proto/playlist_set_permission_request.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +import "playlist_permission.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message SetBasePermissionRequest { + optional playlist_permission.proto.PermissionLevel permission_level = 1; + optional uint32 timeout_ms = 2; +} + +message SetBasePermissionResponse { + optional playlist_permission.proto.Permission base_permission = 1; +} diff --git a/lib/spot/proto/playlist_track_state.proto b/lib/spot/proto/playlist_track_state.proto new file mode 100644 index 0000000..cd55947 --- /dev/null +++ b/lib/spot/proto/playlist_track_state.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +option objc_class_prefix = "SPTPlaylist"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message TrackCollectionState { + optional bool is_in_collection = 1; + optional bool can_add_to_collection = 2; + optional bool is_banned = 3; + optional bool can_ban = 4; +} + +message TrackOfflineState { + optional string offline = 1; +} diff --git a/lib/spot/proto/playlist_user_state.proto b/lib/spot/proto/playlist_user_state.proto new file mode 100644 index 0000000..86c07de --- /dev/null +++ b/lib/spot/proto/playlist_user_state.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message User { + optional string link = 1; + optional string username = 2; + optional string display_name = 3; + optional string image_uri = 4; + optional string thumbnail_uri = 5; + optional int32 color = 6; +} diff --git a/lib/spot/proto/plugin.proto b/lib/spot/proto/plugin.proto new file mode 100644 index 0000000..c0e912c --- /dev/null +++ b/lib/spot/proto/plugin.proto @@ -0,0 +1,141 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.offline.proto; + +import "google/protobuf/any.proto"; +import "extension_kind.proto"; +import "resource_type.proto"; + +option optimize_for = CODE_SIZE; + +message PluginRegistry { + repeated Entry plugins = 1; + message Entry { + string id = 1; + repeated LinkType supported_link_types = 2; + ResourceType resource_type = 3; + repeated extendedmetadata.ExtensionKind extension_kinds = 4; + } + + enum LinkType { + EMPTY = 0; + TRACK = 1; + EPISODE = 2; + } +} + +message PluginInit { + string id = 1; +} + +message TargetFormat { + int32 bitrate = 1; +} + +message Metadata { + Header header = 1; + message Header { + int32 status_code = 1; + bool is_empty = 2; + } + + google.protobuf.Any extension_data = 2; +} + +message IdentifyCommand { + Header header = 3; + message Header { + TargetFormat target_format = 1; + } + + repeated Query query = 4; + message Query { + string link = 1; + map metadata = 2; + } +} + +message IdentifyResponse { + map results = 1; + + message Result { + Status status = 1; + enum Status { + UNKNOWN = 0; + MISSING = 1; + COMPLETE = 2; + NOT_APPLICABLE = 3; + } + + int64 estimated_file_size = 2; + } +} + +message DownloadCommand { + string link = 1; + TargetFormat target_format = 2; + map metadata = 3; +} + +message DownloadResponse { + string link = 1; + bool complete = 2; + int64 file_size = 3; + int64 bytes_downloaded = 4; + + Error error = 5; + enum Error { + OK = 0; + TEMPORARY_ERROR = 1; + PERMANENT_ERROR = 2; + DISK_FULL = 3; + } +} + +message StopDownloadCommand { + string link = 1; +} + +message StopDownloadResponse { + +} + +message RemoveCommand { + Header header = 2; + message Header { + + } + + repeated Query query = 3; + message Query { + string link = 1; + } +} + +message RemoveResponse { + +} + +message PluginCommand { + string id = 1; + + oneof command { + IdentifyCommand identify = 2; + DownloadCommand download = 3; + RemoveCommand remove = 4; + StopDownloadCommand stop_download = 5; + } +} + +message PluginResponse { + string id = 1; + + oneof response { + IdentifyResponse identify = 2; + DownloadResponse download = 3; + RemoveResponse remove = 4; + StopDownloadResponse stop_download = 5; + } +} diff --git a/lib/spot/proto/podcast_ad_segments.proto b/lib/spot/proto/podcast_ad_segments.proto new file mode 100644 index 0000000..ebff738 --- /dev/null +++ b/lib/spot/proto/podcast_ad_segments.proto @@ -0,0 +1,34 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.ads.formats; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "PodcastAdsProto"; +option java_package = "com.spotify.ads.formats.proto"; + +message PodcastAds { + repeated string file_ids = 1; + repeated string manifest_ids = 2; + repeated Segment segments = 3; +} + +message Segment { + Slot slot = 1; + int32 start_ms = 2; + int32 stop_ms = 3; +} + +enum Slot { + UNKNOWN = 0; + PODCAST_PREROLL = 1; + PODCAST_POSTROLL = 2; + PODCAST_MIDROLL_1 = 3; + PODCAST_MIDROLL_2 = 4; + PODCAST_MIDROLL_3 = 5; + PODCAST_MIDROLL_4 = 6; + PODCAST_MIDROLL_5 = 7; +} diff --git a/lib/spot/proto/podcast_cta_cards.proto b/lib/spot/proto/podcast_cta_cards.proto new file mode 100644 index 0000000..9cd4dfc --- /dev/null +++ b/lib/spot/proto/podcast_cta_cards.proto @@ -0,0 +1,9 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.context_track_exts.podcastctacards; + +message Card { + bool has_cards = 1; +} diff --git a/lib/spot/proto/podcast_paywalls_cosmos.proto b/lib/spot/proto/podcast_paywalls_cosmos.proto new file mode 100644 index 0000000..9b81813 --- /dev/null +++ b/lib/spot/proto/podcast_paywalls_cosmos.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast_paywalls_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message PodcastPaywallsShowSubscriptionRequest { + string show_uri = 1; +} + +message PodcastPaywallsShowSubscriptionResponse { + bool is_user_subscribed = 1; +} diff --git a/lib/spot/proto/podcast_poll.proto b/lib/spot/proto/podcast_poll.proto new file mode 100644 index 0000000..60dc04c --- /dev/null +++ b/lib/spot/proto/podcast_poll.proto @@ -0,0 +1,48 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.polls; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "PollMetadataProto"; +option java_package = "com.spotify.podcastcreatorinteractivity.v1"; + +message PodcastPoll { + Poll poll = 1; +} + +message Poll { + int32 id = 1; + string opening_date = 2; + string closing_date = 3; + int32 entity_timestamp_ms = 4; + string entity_uri = 5; + string name = 6; + string question = 7; + PollType type = 8; + repeated PollOption options = 9; + PollStatus status = 10; +} + +message PollOption { + string option = 1; + int32 total_votes = 2; + int32 poll_id = 3; + int32 option_id = 4; +} + +enum PollType { + MULTIPLE_CHOICE = 0; + SINGLE_CHOICE = 1; +} + +enum PollStatus { + DRAFT = 0; + SCHEDULED = 1; + LIVE = 2; + CLOSED = 3; + BLOCKED = 4; +} diff --git a/lib/spot/proto/podcast_qna.proto b/lib/spot/proto/podcast_qna.proto new file mode 100644 index 0000000..fca3ba5 --- /dev/null +++ b/lib/spot/proto/podcast_qna.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.qanda; + +import "google/protobuf/timestamp.proto"; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "QnAMetadataProto"; +option java_package = "com.spotify.podcastcreatorinteractivity.v1"; + +message PodcastQna { + Prompt prompt = 1; +} + +message Prompt { + int32 id = 1; + google.protobuf.Timestamp opening_date = 2; + google.protobuf.Timestamp closing_date = 3; + string text = 4; + QAndAStatus status = 5; +} + +enum QAndAStatus { + DRAFT = 0; + SCHEDULED = 1; + LIVE = 2; + CLOSED = 3; + DELETED = 4; +} diff --git a/lib/spot/proto/podcast_ratings.proto b/lib/spot/proto/podcast_ratings.proto new file mode 100644 index 0000000..c78c028 --- /dev/null +++ b/lib/spot/proto/podcast_ratings.proto @@ -0,0 +1,32 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.ratings; + +import "google/protobuf/timestamp.proto"; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "RatingsMetadataProto"; +option java_package = "com.spotify.podcastcreatorinteractivity.v1"; + +message Rating { + string user_id = 1; + string show_uri = 2; + int32 rating = 3; + google.protobuf.Timestamp rated_at = 4; +} + +message AverageRating { + double average = 1; + int64 total_ratings = 2; + bool show_average = 3; +} + +message PodcastRating { + AverageRating average_rating = 1; + Rating rating = 2; + bool can_rate = 3; +} diff --git a/lib/spot/proto/podcast_segments.proto b/lib/spot/proto/podcast_segments.proto new file mode 100644 index 0000000..52a075f --- /dev/null +++ b/lib/spot/proto/podcast_segments.proto @@ -0,0 +1,47 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast_segments; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "PodcastSegmentsProto"; +option java_package = "com.spotify.podcastsegments.proto"; + +message PodcastSegments { + string episode_uri = 1; + repeated PlaybackSegment playback_segments = 2; + repeated EmbeddedSegment embedded_segments = 3; + bool can_upsell = 4; + string album_mosaic_uri = 5; + repeated string artists = 6; + int32 duration_ms = 7; +} + +message PlaybackSegment { + string uri = 1; + int32 start_ms = 2; + int32 stop_ms = 3; + int32 duration_ms = 4; + SegmentType type = 5; + string title = 6; + string subtitle = 7; + string image_url = 8; + string action_url = 9; + bool is_abridged = 10; +} + +message EmbeddedSegment { + string uri = 1; + int32 absolute_start_ms = 2; + int32 absolute_stop_ms = 3; +} + +enum SegmentType { + UNKNOWN = 0; + TALK = 1; + MUSIC = 2; + UPSELL = 3; +} diff --git a/lib/spot/proto/podcast_segments_cosmos_request.proto b/lib/spot/proto/podcast_segments_cosmos_request.proto new file mode 100644 index 0000000..1d5a51f --- /dev/null +++ b/lib/spot/proto/podcast_segments_cosmos_request.proto @@ -0,0 +1,37 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast_segments.cosmos.proto; + +import "policy/album_decoration_policy.proto"; +import "policy/artist_decoration_policy.proto"; +import "policy/episode_decoration_policy.proto"; +import "policy/track_decoration_policy.proto"; +import "policy/show_decoration_policy.proto"; + +option optimize_for = CODE_SIZE; + +message SegmentsRequest { + repeated string episode_uris = 1; + TrackDecorationPolicy track_decoration_policy = 2; + SegmentsPolicy segments_policy = 3; + EpisodeDecorationPolicy episode_decoration_policy = 4; +} + +message TrackDecorationPolicy { + cosmos_util.proto.TrackDecorationPolicy track_policy = 1; + cosmos_util.proto.ArtistDecorationPolicy artists_policy = 2; + cosmos_util.proto.AlbumDecorationPolicy album_policy = 3; + cosmos_util.proto.ArtistDecorationPolicy album_artist_policy = 4; +} + +message SegmentsPolicy { + bool playback = 1; + bool embedded = 2; +} + +message EpisodeDecorationPolicy { + cosmos_util.proto.EpisodeDecorationPolicy episode_policy = 1; + cosmos_util.proto.ShowDecorationPolicy show_decoration_policy = 2; +} diff --git a/lib/spot/proto/podcast_segments_cosmos_response.proto b/lib/spot/proto/podcast_segments_cosmos_response.proto new file mode 100644 index 0000000..a80f727 --- /dev/null +++ b/lib/spot/proto/podcast_segments_cosmos_response.proto @@ -0,0 +1,39 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast_segments.cosmos.proto; + +import "metadata/episode_metadata.proto"; +import "podcast_segments.proto"; +import "metadata/track_metadata.proto"; + +option optimize_for = CODE_SIZE; + +message SegmentsResponse { + bool success = 1; + repeated EpisodeSegments episode_segments = 2; +} + +message EpisodeSegments { + string episode_uri = 1; + repeated DecoratedSegment segments = 2; + bool can_upsell = 3; + string album_mosaic_uri = 4; + repeated string artists = 5; + int32 duration_ms = 6; +} + +message DecoratedSegment { + string uri = 1; + int32 start_ms = 2; + int32 stop_ms = 3; + cosmos_util.proto.TrackMetadata track_metadata = 4; + SegmentType type = 5; + string title = 6; + string subtitle = 7; + string image_url = 8; + string action_url = 9; + cosmos_util.proto.EpisodeMetadata episode_metadata = 10; + bool is_abridged = 11; +} diff --git a/lib/spot/proto/podcast_subscription.proto b/lib/spot/proto/podcast_subscription.proto new file mode 100644 index 0000000..52b7f8f --- /dev/null +++ b/lib/spot/proto/podcast_subscription.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast_paywalls; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "PodcastSubscriptionProto"; +option java_package = "com.spotify.podcastsubscription.proto"; + +message PodcastSubscription { + bool is_paywalled = 1; + bool is_user_subscribed = 2; + + UserExplanation user_explanation = 3; + enum UserExplanation { + SUBSCRIPTION_DIALOG = 0; + NONE = 1; + } +} diff --git a/lib/spot/proto/podcast_virality.proto b/lib/spot/proto/podcast_virality.proto new file mode 100644 index 0000000..902dca9 --- /dev/null +++ b/lib/spot/proto/podcast_virality.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcastvirality.v1; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "PodcastViralityProto"; +option java_package = "com.spotify.podcastvirality.proto.v1"; + +message PodcastVirality { + bool is_viral = 1; +} diff --git a/lib/spot/proto/podcastextensions.proto b/lib/spot/proto/podcastextensions.proto new file mode 100644 index 0000000..4c85e39 --- /dev/null +++ b/lib/spot/proto/podcastextensions.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.podcast.extensions; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "PodcastExtensionsProto"; +option java_package = "com.spotify.podcastextensions.proto"; + +message PodcastTopics { + repeated PodcastTopic topics = 1; +} + +message PodcastTopic { + string uri = 1; + string title = 2; +} + +message PodcastHtmlDescription { + Header header = 1; + message Header { + + } + + string html_description = 2; +} diff --git a/lib/spot/proto/policy/album_decoration_policy.proto b/lib/spot/proto/policy/album_decoration_policy.proto new file mode 100644 index 0000000..359347d --- /dev/null +++ b/lib/spot/proto/policy/album_decoration_policy.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.policy.proto"; + +message AlbumDecorationPolicy { + bool link = 1; + bool name = 2; + bool copyrights = 3; + bool covers = 4; + bool year = 5; + bool num_discs = 6; + bool num_tracks = 7; + bool playability = 8; + bool is_premium_only = 9; +} + +message AlbumCollectionDecorationPolicy { + bool collection_link = 1; + bool num_tracks_in_collection = 2; + bool complete = 3; +} + +message AlbumSyncDecorationPolicy { + bool inferred_offline = 1; + bool offline_state = 2; + bool sync_progress = 3; +} diff --git a/lib/spot/proto/policy/artist_decoration_policy.proto b/lib/spot/proto/policy/artist_decoration_policy.proto new file mode 100644 index 0000000..0419dc3 --- /dev/null +++ b/lib/spot/proto/policy/artist_decoration_policy.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.policy.proto"; + +message ArtistDecorationPolicy { + bool link = 1; + bool name = 2; + bool is_various_artists = 3; + bool portraits = 4; +} + +message ArtistCollectionDecorationPolicy { + bool collection_link = 1; + bool is_followed = 2; + bool num_tracks_in_collection = 3; + bool num_albums_in_collection = 4; + bool is_banned = 5; + bool can_ban = 6; +} + +message ArtistSyncDecorationPolicy { + bool inferred_offline = 1; + bool offline_state = 2; + bool sync_progress = 3; +} diff --git a/lib/spot/proto/policy/episode_decoration_policy.proto b/lib/spot/proto/policy/episode_decoration_policy.proto new file mode 100644 index 0000000..467426b --- /dev/null +++ b/lib/spot/proto/policy/episode_decoration_policy.proto @@ -0,0 +1,64 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.cosmos_util.proto; + +import "extension_kind.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.policy.proto"; + +message EpisodeDecorationPolicy { + bool link = 1; + bool length = 2; + bool name = 3; + bool manifest_id = 4; + bool preview_id = 5; + bool preview_manifest_id = 6; + bool description = 7; + bool publish_date = 8; + bool covers = 9; + bool freeze_frames = 10; + bool language = 11; + bool available = 12; + bool media_type_enum = 13; + bool number = 14; + bool backgroundable = 15; + bool is_explicit = 16; + bool type = 17; + bool is_music_and_talk = 18; + PodcastSegmentsPolicy podcast_segments = 19; + bool podcast_subscription = 20; + repeated extendedmetadata.ExtensionKind extension = 21; + bool is_19_plus_only = 22; + bool is_book_chapter = 23; +} + +message EpisodeCollectionDecorationPolicy { + bool is_following_show = 1; + bool is_in_listen_later = 2; + bool is_new = 3; +} + +message EpisodeSyncDecorationPolicy { + bool offline = 1; + bool sync_progress = 2; +} + +message EpisodePlayedStateDecorationPolicy { + bool time_left = 1; + bool is_played = 2; + bool playable = 3; + bool playability_restriction = 4; + bool last_played_at = 5; +} + +message PodcastSegmentsPolicy { + bool playback_segments = 1; + bool embedded_segments = 2; + bool can_upsell = 3; + bool album_mosaic_uri = 4; + bool artists = 5; +} diff --git a/lib/spot/proto/policy/folder_decoration_policy.proto b/lib/spot/proto/policy/folder_decoration_policy.proto new file mode 100644 index 0000000..0d47e4d --- /dev/null +++ b/lib/spot/proto/policy/folder_decoration_policy.proto @@ -0,0 +1,21 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message FolderDecorationPolicy { + bool row_id = 1; + bool id = 2; + bool link = 3; + bool name = 4; + bool folders = 5; + bool playlists = 6; + bool recursive_folders = 7; + bool recursive_playlists = 8; + bool rows = 9; +} diff --git a/lib/spot/proto/policy/playlist_album_decoration_policy.proto b/lib/spot/proto/policy/playlist_album_decoration_policy.proto new file mode 100644 index 0000000..01537c7 --- /dev/null +++ b/lib/spot/proto/policy/playlist_album_decoration_policy.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +import "policy/album_decoration_policy.proto"; +import "policy/artist_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message PlaylistAlbumDecorationPolicy { + cosmos_util.proto.AlbumDecorationPolicy album = 1; + cosmos_util.proto.ArtistDecorationPolicy artist = 2; +} diff --git a/lib/spot/proto/policy/playlist_decoration_policy.proto b/lib/spot/proto/policy/playlist_decoration_policy.proto new file mode 100644 index 0000000..a6aef1b --- /dev/null +++ b/lib/spot/proto/policy/playlist_decoration_policy.proto @@ -0,0 +1,63 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +import "extension_kind.proto"; +import "policy/user_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message PlaylistAllowsDecorationPolicy { + bool insert = 1; + bool remove = 2; +} + +message PlaylistDecorationPolicy { + bool row_id = 1; + bool link = 2; + bool name = 3; + bool load_state = 4; + bool loaded = 5; + bool collaborative = 6; + bool length = 7; + bool last_modification = 8; + bool total_length = 9; + bool duration = 10; + bool description = 11; + bool picture = 12; + bool playable = 13; + bool description_from_annotate = 14; + bool picture_from_annotate = 15; + bool can_report_annotation_abuse = 16; + bool followed = 17; + bool followers = 18; + bool owned_by_self = 19; + bool offline = 20; + bool sync_progress = 21; + bool published = 22; + bool browsable_offline = 23; + bool format_list_type = 24; + bool format_list_attributes = 25; + bool has_explicit_content = 26; + bool contains_spotify_tracks = 27; + bool contains_tracks = 28; + bool contains_episodes = 29; + bool contains_audio_episodes = 30; + bool only_contains_explicit = 31; + bool is_on_demand_in_free = 32; + UserDecorationPolicy owner = 33; + UserDecorationPolicy made_for = 34; + PlaylistAllowsDecorationPolicy allows = 35; + bool number_of_episodes = 36; + bool number_of_tracks = 37; + bool prefer_linear_playback = 38; + bool on_demand_in_free_reason = 39; + CollaboratingUsersDecorationPolicy collaborating_users = 40; + bool base_permission = 41; + bool user_capabilities = 42; + repeated extendedmetadata.ExtensionKind extension = 43; +} diff --git a/lib/spot/proto/policy/playlist_episode_decoration_policy.proto b/lib/spot/proto/policy/playlist_episode_decoration_policy.proto new file mode 100644 index 0000000..4e03894 --- /dev/null +++ b/lib/spot/proto/policy/playlist_episode_decoration_policy.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +import "policy/episode_decoration_policy.proto"; +import "policy/show_decoration_policy.proto"; +import "policy/user_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message PlaylistEpisodeDecorationPolicy { + cosmos_util.proto.EpisodeDecorationPolicy episode = 1; + bool row_id = 2; + bool add_time = 3; + bool format_list_attributes = 4; + cosmos_util.proto.EpisodeCollectionDecorationPolicy collection = 5; + cosmos_util.proto.EpisodeSyncDecorationPolicy sync = 6; + cosmos_util.proto.EpisodePlayedStateDecorationPolicy played_state = 7; + UserDecorationPolicy added_by = 8; + cosmos_util.proto.ShowDecorationPolicy show = 9; +} diff --git a/lib/spot/proto/policy/playlist_request_decoration_policy.proto b/lib/spot/proto/policy/playlist_request_decoration_policy.proto new file mode 100644 index 0000000..a1663d2 --- /dev/null +++ b/lib/spot/proto/policy/playlist_request_decoration_policy.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +import "policy/playlist_decoration_policy.proto"; +import "policy/playlist_episode_decoration_policy.proto"; +import "policy/playlist_track_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message PlaylistRequestDecorationPolicy { + PlaylistDecorationPolicy playlist = 1; + PlaylistTrackDecorationPolicy track = 2; + PlaylistEpisodeDecorationPolicy episode = 3; +} diff --git a/lib/spot/proto/policy/playlist_track_decoration_policy.proto b/lib/spot/proto/policy/playlist_track_decoration_policy.proto new file mode 100644 index 0000000..97eb018 --- /dev/null +++ b/lib/spot/proto/policy/playlist_track_decoration_policy.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +import "policy/artist_decoration_policy.proto"; +import "policy/track_decoration_policy.proto"; +import "policy/playlist_album_decoration_policy.proto"; +import "policy/user_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message PlaylistTrackDecorationPolicy { + cosmos_util.proto.TrackDecorationPolicy track = 1; + bool row_id = 2; + bool add_time = 3; + bool in_collection = 4; + bool can_add_to_collection = 5; + bool is_banned = 6; + bool can_ban = 7; + bool local_file = 8; + bool offline = 9; + bool format_list_attributes = 10; + bool display_covers = 11; + UserDecorationPolicy added_by = 12; + PlaylistAlbumDecorationPolicy album = 13; + cosmos_util.proto.ArtistDecorationPolicy artist = 14; +} diff --git a/lib/spot/proto/policy/rootlist_folder_decoration_policy.proto b/lib/spot/proto/policy/rootlist_folder_decoration_policy.proto new file mode 100644 index 0000000..f93888b --- /dev/null +++ b/lib/spot/proto/policy/rootlist_folder_decoration_policy.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +import "policy/folder_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message RootlistFolderDecorationPolicy { + optional bool add_time = 1; + optional FolderDecorationPolicy folder = 2; + optional bool group_label = 3; +} diff --git a/lib/spot/proto/policy/rootlist_playlist_decoration_policy.proto b/lib/spot/proto/policy/rootlist_playlist_decoration_policy.proto new file mode 100644 index 0000000..9e8446a --- /dev/null +++ b/lib/spot/proto/policy/rootlist_playlist_decoration_policy.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +import "policy/playlist_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message RootlistPlaylistDecorationPolicy { + optional bool add_time = 1; + optional PlaylistDecorationPolicy playlist = 2; + optional bool group_label = 3; +} diff --git a/lib/spot/proto/policy/rootlist_request_decoration_policy.proto b/lib/spot/proto/policy/rootlist_request_decoration_policy.proto new file mode 100644 index 0000000..ebad00c --- /dev/null +++ b/lib/spot/proto/policy/rootlist_request_decoration_policy.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +import "policy/rootlist_folder_decoration_policy.proto"; +import "policy/rootlist_playlist_decoration_policy.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message RootlistRequestDecorationPolicy { + optional bool unfiltered_length = 1; + optional bool unranged_length = 2; + optional bool is_loading_contents = 3; + optional RootlistPlaylistDecorationPolicy playlist = 4; + optional RootlistFolderDecorationPolicy folder = 5; +} diff --git a/lib/spot/proto/policy/show_decoration_policy.proto b/lib/spot/proto/policy/show_decoration_policy.proto new file mode 100644 index 0000000..2e5e202 --- /dev/null +++ b/lib/spot/proto/policy/show_decoration_policy.proto @@ -0,0 +1,35 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.cosmos_util.proto; + +import "extension_kind.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.policy.proto"; + +message ShowDecorationPolicy { + bool link = 1; + bool name = 2; + bool description = 3; + bool popularity = 4; + bool publisher = 5; + bool language = 6; + bool is_explicit = 7; + bool covers = 8; + bool num_episodes = 9; + bool consumption_order = 10; + bool media_type_enum = 11; + bool copyrights = 12; + bool trailer_uri = 13; + bool is_music_and_talk = 14; + bool access_info = 15; + repeated extendedmetadata.ExtensionKind extension = 16; + bool is_book = 17; +} + +message ShowPlayedStateDecorationPolicy { + bool latest_played_episode_link = 1; +} diff --git a/lib/spot/proto/policy/track_decoration_policy.proto b/lib/spot/proto/policy/track_decoration_policy.proto new file mode 100644 index 0000000..aa71f49 --- /dev/null +++ b/lib/spot/proto/policy/track_decoration_policy.proto @@ -0,0 +1,48 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.policy.proto"; + +message TrackDecorationPolicy { + bool has_lyrics = 1; + bool link = 2; + bool name = 3; + bool length = 4; + bool playable = 5; + bool is_available_in_metadata_catalogue = 6; + bool locally_playable = 7; + bool playable_local_track = 8; + bool disc_number = 9; + bool track_number = 10; + bool is_explicit = 11; + bool preview_id = 12; + bool is_local = 13; + bool is_premium_only = 14; + bool playable_track_link = 15; + bool popularity = 16; + bool is_19_plus_only = 17; + bool track_descriptors = 18; +} + +message TrackPlayedStateDecorationPolicy { + bool playable = 1; + bool is_currently_playable = 2; + bool playability_restriction = 3; +} + +message TrackCollectionDecorationPolicy { + bool is_in_collection = 1; + bool can_add_to_collection = 2; + bool is_banned = 3; + bool can_ban = 4; +} + +message TrackSyncDecorationPolicy { + bool offline_state = 1; + bool sync_progress = 2; +} diff --git a/lib/spot/proto/policy/user_decoration_policy.proto b/lib/spot/proto/policy/user_decoration_policy.proto new file mode 100644 index 0000000..f2c342e --- /dev/null +++ b/lib/spot/proto/policy/user_decoration_policy.proto @@ -0,0 +1,32 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.policy.proto"; + +message UserDecorationPolicy { + bool username = 1; + bool link = 2; + bool name = 3; + bool image = 4; + bool thumbnail = 5; + bool color = 6; +} + +message CollaboratorPolicy { + UserDecorationPolicy user = 1; + bool number_of_items = 2; + bool number_of_tracks = 3; + bool number_of_episodes = 4; + bool is_owner = 5; +} + +message CollaboratingUsersDecorationPolicy { + bool count = 1; + int32 limit = 2; + CollaboratorPolicy collaborator = 3; +} diff --git a/lib/spot/proto/popcount2_external.proto b/lib/spot/proto/popcount2_external.proto new file mode 100644 index 0000000..069cdcf --- /dev/null +++ b/lib/spot/proto/popcount2_external.proto @@ -0,0 +1,30 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.popcount2.proto; + +option optimize_for = CODE_SIZE; + +message PopcountRequest { + +} + +message PopcountResult { + optional sint64 count = 1; + optional bool truncated = 2; + repeated string user = 3; +} + +message PopcountUserUpdate { + optional string user = 1; + optional sint64 timestamp = 2; + optional bool added = 3; +} + +message PopcountUpdate { + repeated PopcountUserUpdate updates = 1; + optional sint64 common_timestamp = 2; + optional sint64 remove_older_than_timestamp = 3; + optional bool verify_counter = 4; +} diff --git a/lib/spot/proto/prepare_play_options.proto b/lib/spot/proto/prepare_play_options.proto new file mode 100644 index 0000000..cb27650 --- /dev/null +++ b/lib/spot/proto/prepare_play_options.proto @@ -0,0 +1,37 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context_player_options.proto"; +import "player_license.proto"; +import "skip_to_track.proto"; + +option optimize_for = CODE_SIZE; + +message PreparePlayOptions { + optional ContextPlayerOptionOverrides player_options_override = 1; + optional PlayerLicense license = 2; + map configuration_override = 3; + optional string playback_id = 4; + optional bool always_play_something = 5; + optional SkipToTrack skip_to_track = 6; + optional int64 seek_to = 7; + optional bool initially_paused = 8; + optional bool system_initiated = 9; + repeated string suppressions = 10; + optional PrefetchLevel prefetch_level = 11; + optional string session_id = 12; + optional AudioStream audio_stream = 13; +} + +enum PrefetchLevel { + kNone = 0; + kMedia = 1; +} + +enum AudioStream { + kDefault = 0; + kAlarm = 1; +} diff --git a/lib/spot/proto/profile_cosmos.proto b/lib/spot/proto/profile_cosmos.proto new file mode 100644 index 0000000..c6c945d --- /dev/null +++ b/lib/spot/proto/profile_cosmos.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.profile_cosmos.proto; + +import "identity.proto"; + +option optimize_for = CODE_SIZE; + +message GetProfilesRequest { + repeated string usernames = 1; +} + +message GetProfilesResponse { + repeated identity.v3.UserProfile profiles = 1; +} + +message ChangeDisplayNameRequest { + string username = 1; + string display_name = 2; +} diff --git a/lib/spot/proto/profile_service.proto b/lib/spot/proto/profile_service.proto new file mode 100644 index 0000000..194e5fe --- /dev/null +++ b/lib/spot/proto/profile_service.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.profile_esperanto.proto.v1; + +import "identity.proto"; + +option optimize_for = CODE_SIZE; + +service ProfileService { + rpc GetProfiles(GetProfilesRequest) returns (GetProfilesResponse); + rpc SubscribeToProfiles(GetProfilesRequest) returns (stream GetProfilesResponse); + rpc ChangeDisplayName(ChangeDisplayNameRequest) returns (ChangeDisplayNameResponse); +} + +message GetProfilesRequest { + repeated string usernames = 1; +} + +message GetProfilesResponse { + repeated identity.v3.UserProfile profiles = 1; + int32 status_code = 2; +} + +message ChangeDisplayNameRequest { + string username = 1; + string display_name = 2; +} + +message ChangeDisplayNameResponse { + int32 status_code = 1; +} diff --git a/lib/spot/proto/property_definition.proto b/lib/spot/proto/property_definition.proto new file mode 100644 index 0000000..9df7caa --- /dev/null +++ b/lib/spot/proto/property_definition.proto @@ -0,0 +1,44 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.remote_config.ucs.proto; + +option optimize_for = CODE_SIZE; + +message PropertyDefinition { + Identifier id = 1; + message Identifier { + string scope = 1; + string name = 2; + } + + Metadata metadata = 4; + message Metadata { + string component_id = 1; + string description = 2; + } + + oneof specification { + BoolSpec bool_spec = 5; + IntSpec int_spec = 6; + EnumSpec enum_spec = 7; + } + + //reserved 2, "hash"; + + message BoolSpec { + bool default = 1; + } + + message IntSpec { + int32 default = 1; + int32 lower = 2; + int32 upper = 3; + } + + message EnumSpec { + string default = 1; + repeated string values = 2; + } +} diff --git a/lib/spot/proto/protobuf_delta.proto b/lib/spot/proto/protobuf_delta.proto new file mode 100644 index 0000000..c0a89fe --- /dev/null +++ b/lib/spot/proto/protobuf_delta.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.protobuf_deltas.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message Delta { + required Type type = 1; + enum Type { + DELETE = 0; + INSERT = 1; + } + + required uint32 index = 2; + required uint32 length = 3; +} diff --git a/lib/spot/proto/pubsub.proto b/lib/spot/proto/pubsub.proto new file mode 100644 index 0000000..a781c37 --- /dev/null +++ b/lib/spot/proto/pubsub.proto @@ -0,0 +1,8 @@ +syntax = "proto2"; + +message Subscription { + optional string uri = 0x1; + optional int32 expiry = 0x2; + optional int32 status_code = 0x3; +} + diff --git a/lib/spot/proto/queue.proto b/lib/spot/proto/queue.proto new file mode 100644 index 0000000..24b45b7 --- /dev/null +++ b/lib/spot/proto/queue.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context_track.proto"; + +option optimize_for = CODE_SIZE; + +message Queue { + repeated ContextTrack tracks = 1; + optional bool is_playing_queue = 2; +} diff --git a/lib/spot/proto/rate_limited_events.proto b/lib/spot/proto/rate_limited_events.proto new file mode 100644 index 0000000..c9116b6 --- /dev/null +++ b/lib/spot/proto/rate_limited_events.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message RateLimitedEventsEntity { + int32 file_format_version = 1; + map map_field = 2; +} diff --git a/lib/spot/proto/rcs.proto b/lib/spot/proto/rcs.proto new file mode 100644 index 0000000..00e8610 --- /dev/null +++ b/lib/spot/proto/rcs.proto @@ -0,0 +1,107 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.remote_config.proto; + +option optimize_for = CODE_SIZE; + +message GranularConfiguration { + repeated AssignedPropertyValue properties = 1; + message AssignedPropertyValue { + Platform platform = 7; + string client_id = 4; + string component_id = 5; + int64 groupId = 8; + string name = 6; + + oneof structured_value { + BoolValue bool_value = 1; + IntValue int_value = 2; + EnumValue enum_value = 3; + } + + message BoolValue { + bool value = 1; + } + + message IntValue { + int32 value = 1; + } + + message EnumValue { + string value = 1; + } + } + + int64 rcs_fetch_time = 2; + string configuration_assignment_id = 3; +} + +message PolicyGroupId { + int64 policy_id = 1; + int64 policy_group_id = 2; +} + +message ClientPropertySet { + string client_id = 1; + string version = 2; + repeated PropertyDefinition properties = 5; + + repeated ComponentInfo component_infos = 6; + message ComponentInfo { + string name = 3; + + //reserved 1, 2, "owner", "tags"; + } + + string property_set_key = 7; + + PublisherInfo publisherInfo = 8; + message PublisherInfo { + string published_for_client_version = 1; + int64 published_at = 2; + } +} + +message PropertyDefinition { + string description = 2; + string component_id = 3; + Platform platform = 8; + + oneof identifier { + string id = 9; + string name = 7; + } + + oneof spec { + BoolSpec bool_spec = 4; + IntSpec int_spec = 5; + EnumSpec enum_spec = 6; + } + + reserved 1; + + message BoolSpec { + bool default = 1; + } + + message IntSpec { + int32 default = 1; + int32 lower = 2; + int32 upper = 3; + } + + message EnumSpec { + string default = 1; + repeated string values = 2; + } +} + +enum Platform { + UNKNOWN_PLATFORM = 0; + ANDROID_PLATFORM = 1; + BACKEND_PLATFORM = 2; + IOS_PLATFORM = 3; + WEB_PLATFORM = 4; +} diff --git a/lib/spot/proto/recently_played.proto b/lib/spot/proto/recently_played.proto new file mode 100644 index 0000000..fd22fdd --- /dev/null +++ b/lib/spot/proto/recently_played.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.recently_played.proto; + +option optimize_for = CODE_SIZE; + +message Item { + string link = 1; + int64 timestamp = 2; + bool hidden = 3; +} diff --git a/lib/spot/proto/recently_played_backend.proto b/lib/spot/proto/recently_played_backend.proto new file mode 100644 index 0000000..fa13728 --- /dev/null +++ b/lib/spot/proto/recently_played_backend.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.recently_played_backend.proto; + +option optimize_for = CODE_SIZE; + +message Context { + optional string uri = 1; + optional int64 lastPlayedTime = 2; +} + +message RecentlyPlayed { + repeated Context contexts = 1; + optional int32 offset = 2; + optional int32 total = 3; +} diff --git a/lib/spot/proto/record_id.proto b/lib/spot/proto/record_id.proto new file mode 100644 index 0000000..167c0ec --- /dev/null +++ b/lib/spot/proto/record_id.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message RecordId { + uint64 value = 1; +} diff --git a/lib/spot/proto/remote.proto b/lib/spot/proto/remote.proto new file mode 100644 index 0000000..a81c1c0 --- /dev/null +++ b/lib/spot/proto/remote.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.shuffle.remote; + +option optimize_for = CODE_SIZE; + +message ServiceRequest { + repeated Track tracks = 1; + message Track { + required string uri = 1; + required string uid = 2; + } +} + +message ServiceResponse { + repeated uint32 order = 1; +} diff --git a/lib/spot/proto/repeating_track_node.proto b/lib/spot/proto/repeating_track_node.proto new file mode 100644 index 0000000..d4691cd --- /dev/null +++ b/lib/spot/proto/repeating_track_node.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "track_instance.proto"; +import "track_instantiator.proto"; + +option optimize_for = CODE_SIZE; + +message RepeatingTrackNode { + optional TrackInstance instance = 1; + optional TrackInstantiator instantiator = 2; +} diff --git a/lib/spot/proto/request_failure.proto b/lib/spot/proto/request_failure.proto new file mode 100644 index 0000000..10deb1b --- /dev/null +++ b/lib/spot/proto/request_failure.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.image.proto; + +option optimize_for = CODE_SIZE; + +message RequestFailure { + optional string request = 1; + optional string source = 2; + optional string error = 3; + optional int64 result = 4; +} diff --git a/lib/spot/proto/resolve.proto b/lib/spot/proto/resolve.proto new file mode 100644 index 0000000..793b8c5 --- /dev/null +++ b/lib/spot/proto/resolve.proto @@ -0,0 +1,116 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.remote_config.ucs.proto; + +import "property_definition.proto"; + +option optimize_for = CODE_SIZE; + +message ResolveRequest { + string property_set_id = 1; + Fetch fetch_type = 2; + Context context = 11; + + oneof resolution_context { + BackendContext backend_context = 12 [deprecated = true]; + } + + //reserved 4, 5, "custom_context", "projection"; +} + +message ResolveResponse { + Configuration configuration = 1; +} + +message Configuration { + string configuration_assignment_id = 1; + int64 fetch_time_millis = 2; + + repeated AssignedValue assigned_values = 3; + message AssignedValue { + PropertyDefinition.Identifier property_id = 1; + + Metadata metadata = 2; + message Metadata { + int64 policy_id = 1; + string external_realm = 2; + int64 external_realm_id = 3; + } + + oneof structured_value { + BoolValue bool_value = 3; + IntValue int_value = 4; + EnumValue enum_value = 5; + } + + message BoolValue { + bool value = 1; + } + + message IntValue { + int32 value = 1; + } + + message EnumValue { + string value = 1; + } + } +} + +message Fetch { + Type type = 1; + enum Type { + BLOCKING = 0; + BACKGROUND_SYNC = 1; + ASYNC = 2; + PUSH_INITIATED = 3; + RECONNECT = 4; + } +} + +message Context { + repeated ContextEntry context = 1; + message ContextEntry { + string value = 10; + + oneof context { + DynamicContext.KnownContext known_context = 1; + } + } +} + +message BackendContext { + string system = 1 [deprecated = true]; + string service_name = 2 [deprecated = true]; + + StaticContext static_context = 3; + message StaticContext { + string system = 1; + string service_name = 2; + } + + DynamicContext dynamic_context = 4; + + SurfaceMetadata surface_metadata = 10; + message SurfaceMetadata { + string backend_sdk_version = 1; + } +} + +message DynamicContext { + repeated ContextDefinition context_definition = 1; + message ContextDefinition { + oneof context { + KnownContext known_context = 1; + } + } + + enum KnownContext { + KNOWN_CONTEXT_INVALID = 0; + KNOWN_CONTEXT_USER_ID = 1; + KNOWN_CONTEXT_INSTALLATION_ID = 2; + KNOWN_CONTEXT_VERSION = 3; + } +} diff --git a/lib/spot/proto/resource_type.proto b/lib/spot/proto/resource_type.proto new file mode 100644 index 0000000..ccea692 --- /dev/null +++ b/lib/spot/proto/resource_type.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.offline.proto; + +option optimize_for = CODE_SIZE; + +enum ResourceType { + OTHER = 0; + AUDIO = 1; + DRM = 2; + IMAGE = 3; + VIDEO = 4; +} diff --git a/lib/spot/proto/response_status.proto b/lib/spot/proto/response_status.proto new file mode 100644 index 0000000..5709571 --- /dev/null +++ b/lib/spot/proto/response_status.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist_esperanto.proto; + +option objc_class_prefix = "SPTPlaylistEsperanto"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.playlist.esperanto.proto"; + +message ResponseStatus { + int32 status_code = 1; + string reason = 2; +} diff --git a/lib/spot/proto/restrictions.proto b/lib/spot/proto/restrictions.proto new file mode 100644 index 0000000..0661858 --- /dev/null +++ b/lib/spot/proto/restrictions.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message Restrictions { + repeated string disallow_pausing_reasons = 1; + repeated string disallow_resuming_reasons = 2; + repeated string disallow_seeking_reasons = 3; + repeated string disallow_peeking_prev_reasons = 4; + repeated string disallow_peeking_next_reasons = 5; + repeated string disallow_skipping_prev_reasons = 6; + repeated string disallow_skipping_next_reasons = 7; + repeated string disallow_toggling_repeat_context_reasons = 8; + repeated string disallow_toggling_repeat_track_reasons = 9; + repeated string disallow_toggling_shuffle_reasons = 10; + repeated string disallow_set_queue_reasons = 11; + repeated string disallow_interrupting_playback_reasons = 12; + repeated string disallow_transferring_playback_reasons = 13; + repeated string disallow_remote_control_reasons = 14; + repeated string disallow_inserting_into_next_tracks_reasons = 15; + repeated string disallow_inserting_into_context_tracks_reasons = 16; + repeated string disallow_reordering_in_next_tracks_reasons = 17; + repeated string disallow_reordering_in_context_tracks_reasons = 18; + repeated string disallow_removing_from_next_tracks_reasons = 19; + repeated string disallow_removing_from_context_tracks_reasons = 20; + repeated string disallow_updating_context_reasons = 21; +} diff --git a/lib/spot/proto/resume_points_node.proto b/lib/spot/proto/resume_points_node.proto new file mode 100644 index 0000000..9f7eed8 --- /dev/null +++ b/lib/spot/proto/resume_points_node.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify_shows.proto; + +option optimize_for = CODE_SIZE; + +message ResumePointsNode { + optional int64 resume_point = 1; +} diff --git a/lib/spot/proto/rootlist_request.proto b/lib/spot/proto/rootlist_request.proto new file mode 100644 index 0000000..ae05547 --- /dev/null +++ b/lib/spot/proto/rootlist_request.proto @@ -0,0 +1,46 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.rootlist_request.proto; + +import "playlist_folder_state.proto"; +import "playlist_permission.proto"; +import "playlist_playlist_state.proto"; +import "protobuf_delta.proto"; + +option objc_class_prefix = "SPTPlaylistCosmosRootlist"; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message Playlist { + optional string row_id = 1; + optional cosmos.proto.PlaylistMetadata playlist_metadata = 2; + optional cosmos.proto.PlaylistOfflineState playlist_offline_state = 3; + optional uint32 add_time = 4; + optional bool is_on_demand_in_free = 5; + optional string group_label = 6; + optional playlist_permission.proto.Capabilities capabilities = 7; +} + +message Item { + optional string header_field = 1; + optional Folder folder = 2; + optional Playlist playlist = 3; + optional protobuf_deltas.proto.Delta delta = 4; +} + +message Folder { + repeated Item item = 1; + optional cosmos.proto.FolderMetadata folder_metadata = 2; + optional string row_id = 3; + optional uint32 add_time = 4; + optional string group_label = 5; +} + +message Response { + optional Folder root = 1; + optional int32 unfiltered_length = 2; + optional int32 unranged_length = 3; + optional bool is_loading_contents = 4; +} diff --git a/lib/spot/proto/seek_to_position.proto b/lib/spot/proto/seek_to_position.proto new file mode 100644 index 0000000..6f42684 --- /dev/null +++ b/lib/spot/proto/seek_to_position.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message SeekToPosition { + optional uint64 value = 1; + optional uint32 revision = 2; +} diff --git a/lib/spot/proto/sequence_number_entity.proto b/lib/spot/proto/sequence_number_entity.proto new file mode 100644 index 0000000..a3b88c8 --- /dev/null +++ b/lib/spot/proto/sequence_number_entity.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.event_sender.proto; + +option optimize_for = CODE_SIZE; + +message SequenceNumberEntity { + uint32 file_format_version = 1; + string event_name = 2; + bytes sequence_id = 3; + uint64 sequence_number_next = 4; +} diff --git a/lib/spot/proto/session.proto b/lib/spot/proto/session.proto new file mode 100644 index 0000000..7c4589f --- /dev/null +++ b/lib/spot/proto/session.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context.proto"; +import "context_player_options.proto"; +import "play_origin.proto"; +import "suppressions.proto"; +import "instrumentation_params.proto"; + +option optimize_for = CODE_SIZE; + +message Session { + optional PlayOrigin play_origin = 1; + optional Context context = 2; + optional string current_uid = 3; + optional ContextPlayerOptionOverrides option_overrides = 4; + optional Suppressions suppressions = 5; + optional InstrumentationParams instrumentation_params = 6; +} diff --git a/lib/spot/proto/set_member_permission_request.proto b/lib/spot/proto/set_member_permission_request.proto new file mode 100644 index 0000000..160eaf9 --- /dev/null +++ b/lib/spot/proto/set_member_permission_request.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.playlist.cosmos.proto; + +import "playlist_permission.proto"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message SetMemberPermissionRequest { + optional string playlist_uri = 1; + optional string username = 2; + optional playlist_permission.proto.PermissionLevel permission_level = 3; + optional uint32 timeout_ms = 4; +} diff --git a/lib/spot/proto/show_access.proto b/lib/spot/proto/show_access.proto new file mode 100644 index 0000000..eddc034 --- /dev/null +++ b/lib/spot/proto/show_access.proto @@ -0,0 +1,50 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.podcast_paywalls; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "ShowAccessProto"; +option java_package = "com.spotify.podcast.access.proto"; + +message ShowAccess { + AccountLinkPrompt prompt = 5; + + oneof explanation { + NoExplanation none = 1; + LegacyExplanation legacy = 2; + BasicExplanation basic = 3; + UpsellLinkExplanation upsellLink = 4; + } +} + +message BasicExplanation { + string title = 1; + string body = 2; + string cta = 3; +} + +message LegacyExplanation { + +} + +message NoExplanation { + +} + +message UpsellLinkExplanation { + string title = 1; + string body = 2; + string cta = 3; + string url = 4; +} + +message AccountLinkPrompt { + string title = 1; + string body = 2; + string cta = 3; + string url = 4; +} diff --git a/lib/spot/proto/show_episode_state.proto b/lib/spot/proto/show_episode_state.proto new file mode 100644 index 0000000..b780dbb --- /dev/null +++ b/lib/spot/proto/show_episode_state.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.show_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message EpisodeCollectionState { + optional bool is_following_show = 1; + optional bool is_new = 2; + optional bool is_in_listen_later = 3; +} + +message EpisodeOfflineState { + optional string offline_state = 1; + optional uint32 sync_progress = 2; +} diff --git a/lib/spot/proto/show_request.proto b/lib/spot/proto/show_request.proto new file mode 100644 index 0000000..3624fa0 --- /dev/null +++ b/lib/spot/proto/show_request.proto @@ -0,0 +1,79 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.show_cosmos.proto; + +import "metadata/episode_metadata.proto"; +import "metadata/show_metadata.proto"; +import "played_state/episode_played_state.proto"; +import "show_episode_state.proto"; +import "show_show_state.proto"; +import "podcast_virality.proto"; +import "transcripts.proto"; +import "podcastextensions.proto"; +import "clips_cover.proto"; +import "show_access.proto"; +import "podcast_ratings.proto"; +import "greenroom_extension.proto"; + +option objc_class_prefix = "SPTShowCosmos"; +option optimize_for = CODE_SIZE; + +message Item { + optional string header_field = 1; + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 2; + optional EpisodeCollectionState episode_collection_state = 3; + optional EpisodeOfflineState episode_offline_state = 4; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 5; + optional corex.transcripts.metadata.EpisodeTranscript episode_transcripts = 7; + optional podcastvirality.v1.PodcastVirality episode_virality = 8; + optional clips.ClipsCover episode_clips = 9; + + reserved 6; +} + +message Header { + optional cosmos_util.proto.ShowMetadata show_metadata = 1; + optional ShowCollectionState show_collection_state = 2; + optional ShowPlayState show_play_state = 3; +} + +message Response { + repeated Item item = 1; + optional Header header = 2; + optional uint32 unfiltered_length = 4; + optional uint32 length = 5; + optional bool loading_contents = 6; + optional uint32 unranged_length = 7; + optional AuxiliarySections auxiliary_sections = 8; + optional podcast_paywalls.ShowAccess access_info = 9; + optional uint32 range_offset = 10; + + reserved 3, "online_data"; +} + +message AuxiliarySections { + optional ContinueListeningSection continue_listening = 1; + optional podcast.extensions.PodcastTopics topics_section = 2; + optional TrailerSection trailer_section = 3; + optional podcast.extensions.PodcastHtmlDescription html_description_section = 5; + optional clips.ClipsCover clips_section = 6; + optional ratings.PodcastRating rating_section = 7; + optional greenroom.api.extendedmetadata.v1.GreenroomSection greenroom_section = 8; + optional LatestUnplayedEpisodeSection latest_unplayed_episode_section = 9; + + reserved 4; +} + +message ContinueListeningSection { + optional Item item = 1; +} + +message TrailerSection { + optional Item item = 1; +} + +message LatestUnplayedEpisodeSection { + optional Item item = 1; +} diff --git a/lib/spot/proto/show_show_state.proto b/lib/spot/proto/show_show_state.proto new file mode 100644 index 0000000..c9c3548 --- /dev/null +++ b/lib/spot/proto/show_show_state.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.show_cosmos.proto; + +option objc_class_prefix = "SPTShowCosmos"; +option optimize_for = CODE_SIZE; + +message ShowCollectionState { + optional bool is_in_collection = 1; +} + +message ShowPlayState { + optional string latest_played_episode_link = 1; +} diff --git a/lib/spot/proto/skip_to_track.proto b/lib/spot/proto/skip_to_track.proto new file mode 100644 index 0000000..67b5f71 --- /dev/null +++ b/lib/spot/proto/skip_to_track.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message SkipToTrack { + optional string page_url = 1; + optional uint64 page_index = 2; + optional string track_uid = 3; + optional string track_uri = 4; + optional uint64 track_index = 5; +} diff --git a/lib/spot/proto/social_connect_v2.proto b/lib/spot/proto/social_connect_v2.proto new file mode 100644 index 0000000..f4d084c --- /dev/null +++ b/lib/spot/proto/social_connect_v2.proto @@ -0,0 +1,77 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package socialconnect; + +option optimize_for = CODE_SIZE; + +message Session { + int64 timestamp = 1; + string session_id = 2; + string join_session_token = 3; + string join_session_url = 4; + string session_owner_id = 5; + repeated SessionMember session_members = 6; + string join_session_uri = 7; + bool is_session_owner = 9; + bool is_listening = 10; + bool is_controlling = 11; + bool is_discoverable = 12; + SessionType initial_session_type = 13; + + oneof _host_active_device_id { + string host_active_device_id = 14; + } + + reserved 8; +} + +message SessionMember { + int64 timestamp = 1; + string id = 2; + string username = 3; + string display_name = 4; + string image_url = 5; + string large_image_url = 6; + bool is_listening = 7; + bool is_controlling = 8; +} + +message SessionUpdate { + Session session = 1; + SessionUpdateReason reason = 2; + repeated SessionMember updated_session_members = 3; +} + +message DevicesExposure { + int64 timestamp = 1; + map devices_exposure = 2; +} + +enum SessionType { + UNKNOWN_SESSION_TYPE = 0; + IN_PERSON = 3; + REMOTE = 4; + REMOTE_V2 = 5; +} + +enum SessionUpdateReason { + UNKNOWN_UPDATE_TYPE = 0; + NEW_SESSION = 1; + USER_JOINED = 2; + USER_LEFT = 3; + SESSION_DELETED = 4; + YOU_LEFT = 5; + YOU_WERE_KICKED = 6; + YOU_JOINED = 7; + PARTICIPANT_PROMOTED_TO_HOST = 8; + DISCOVERABILITY_CHANGED = 9; + USER_KICKED = 10; +} + +enum DeviceExposureStatus { + NOT_EXPOSABLE = 0; + NOT_EXPOSED = 1; + EXPOSED = 2; +} diff --git a/lib/spot/proto/social_service.proto b/lib/spot/proto/social_service.proto new file mode 100644 index 0000000..d5c108a --- /dev/null +++ b/lib/spot/proto/social_service.proto @@ -0,0 +1,52 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.social_esperanto.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.social.esperanto.proto"; + +service SocialService { + rpc SetAccessToken(SetAccessTokenRequest) returns (SetAccessTokenResponse); + rpc SubscribeToEvents(SubscribeToEventsRequest) returns (stream SubscribeToEventsResponse); + rpc SubscribeToState(SubscribeToStateRequest) returns (stream SubscribeToStateResponse); +} + +message SetAccessTokenRequest { + string accessToken = 1; +} + +message SetAccessTokenResponse { + +} + +message SubscribeToEventsRequest { + +} + +message SubscribeToEventsResponse { + Error status = 1; + enum Error { + NONE = 0; + FAILED_TO_CONNECT = 1; + USER_DATA_FAIL = 2; + PERMISSIONS = 3; + SERVICE_CONNECT_NOT_PERMITTED = 4; + USER_UNAUTHORIZED = 5; + } + + string description = 2; +} + +message SubscribeToStateRequest { + +} + +message SubscribeToStateResponse { + bool available = 1; + bool enabled = 2; + repeated string missingPermissions = 3; + string accessToken = 4; +} diff --git a/lib/spot/proto/socialgraph_response_status.proto b/lib/spot/proto/socialgraph_response_status.proto new file mode 100644 index 0000000..1518daf --- /dev/null +++ b/lib/spot/proto/socialgraph_response_status.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.socialgraph_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.socialgraph.esperanto.proto"; + +message ResponseStatus { + int32 status_code = 1; + string reason = 2; +} diff --git a/lib/spot/proto/socialgraphv2.proto b/lib/spot/proto/socialgraphv2.proto new file mode 100644 index 0000000..ace7058 --- /dev/null +++ b/lib/spot/proto/socialgraphv2.proto @@ -0,0 +1,45 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.socialgraph.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.socialgraph.proto"; + +message SocialGraphEntity { + optional string user_uri = 1; + optional string artist_uri = 2; + optional int32 followers_count = 3; + optional int32 following_count = 4; + optional int32 status = 5; + optional bool is_following = 6; + optional bool is_followed = 7; + optional bool is_dismissed = 8; + optional bool is_blocked = 9; + optional int64 following_at = 10; + optional int64 followed_at = 11; + optional int64 dismissed_at = 12; + optional int64 blocked_at = 13; +} + +message SocialGraphRequest { + repeated string target_uris = 1; + optional string source_uri = 2; +} + +message SocialGraphReply { + repeated SocialGraphEntity entities = 1; + optional int32 num_total_entities = 2; +} + +message ChangeNotification { + optional EventType event_type = 1; + repeated SocialGraphEntity entities = 2; +} + +enum EventType { + FOLLOW = 1; + UNFOLLOW = 2; +} diff --git a/lib/spot/proto/spirc.proto b/lib/spot/proto/spirc.proto new file mode 100644 index 0000000..acaeae1 --- /dev/null +++ b/lib/spot/proto/spirc.proto @@ -0,0 +1,133 @@ +syntax = "proto2"; + +message Frame { + optional uint32 version = 0x1; + optional string ident = 0x2; + optional string protocol_version = 0x3; + optional uint32 seq_nr = 0x4; + optional MessageType typ = 0x5; + optional DeviceState device_state = 0x7; + optional Goodbye goodbye = 0xb; + optional State state = 0xc; + optional uint32 position = 0xd; + optional uint32 volume = 0xe; + optional int64 state_update_id = 0x11; + repeated string recipient = 0x12; + optional bytes context_player_state = 0x13; + optional string new_name = 0x14; + optional Metadata metadata = 0x19; +} + +enum MessageType { + kMessageTypeHello = 0x1; + kMessageTypeGoodbye = 0x2; + kMessageTypeProbe = 0x3; + kMessageTypeNotify = 0xa; + kMessageTypeLoad = 0x14; + kMessageTypePlay = 0x15; + kMessageTypePause = 0x16; + kMessageTypePlayPause = 0x17; + kMessageTypeSeek = 0x18; + kMessageTypePrev = 0x19; + kMessageTypeNext = 0x1a; + kMessageTypeVolume = 0x1b; + kMessageTypeShuffle = 0x1c; + kMessageTypeRepeat = 0x1d; + kMessageTypeVolumeDown = 0x1f; + kMessageTypeVolumeUp = 0x20; + kMessageTypeReplace = 0x21; + kMessageTypeLogout = 0x22; + kMessageTypeAction = 0x23; + kMessageTypeRename = 0x24; + kMessageTypeUpdateMetadata = 0x80; +} + +message DeviceState { + optional string sw_version = 0x1; + optional bool is_active = 0xa; + optional bool can_play = 0xb; + optional uint32 volume = 0xc; + optional string name = 0xd; + optional uint32 error_code = 0xe; + optional int64 became_active_at = 0xf; + optional string error_message = 0x10; + repeated Capability capabilities = 0x11; + optional string context_player_error = 0x14; + repeated Metadata metadata = 0x19; +} + +message Capability { + optional CapabilityType typ = 0x1; + repeated int64 intValue = 0x2; + repeated string stringValue = 0x3; +} + +enum CapabilityType { + kSupportedContexts = 0x1; + kCanBePlayer = 0x2; + kRestrictToLocal = 0x3; + kDeviceType = 0x4; + kGaiaEqConnectId = 0x5; + kSupportsLogout = 0x6; + kIsObservable = 0x7; + kVolumeSteps = 0x8; + kSupportedTypes = 0x9; + kCommandAcks = 0xa; + kSupportsRename = 0xb; + kHidden = 0xc; + kSupportsPlaylistV2 = 0xd; + kSupportsExternalEpisodes = 0xe; +} + +message Goodbye { + optional string reason = 0x1; +} + +message State { + optional string context_uri = 0x2; + optional uint32 index = 0x3; + optional uint32 position_ms = 0x4; + optional PlayStatus status = 0x5; + optional uint64 position_measured_at = 0x7; + optional string context_description = 0x8; + optional bool shuffle = 0xd; + optional bool repeat = 0xe; + optional string last_command_ident = 0x14; + optional uint32 last_command_msgid = 0x15; + optional bool playing_from_fallback = 0x18; + optional uint32 row = 0x19; + optional uint32 playing_track_index = 0x1a; + repeated TrackRef track = 0x1b; + optional Ad ad = 0x1c; +} + +enum PlayStatus { + kPlayStatusStop = 0x0; + kPlayStatusPlay = 0x1; + kPlayStatusPause = 0x2; + kPlayStatusLoading = 0x3; +} + +message TrackRef { + optional bytes gid = 0x1; + optional string uri = 0x2; + optional bool queued = 0x3; + optional string context = 0x4; +} + +message Ad { + optional int32 next = 0x1; + optional bytes ogg_fid = 0x2; + optional bytes image_fid = 0x3; + optional int32 duration = 0x4; + optional string click_url = 0x5; + optional string impression_url = 0x6; + optional string product = 0x7; + optional string advertiser = 0x8; + optional bytes gid = 0x9; +} + +message Metadata { + optional string type = 0x1; + optional string metadata = 0x2; +} diff --git a/lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.pb.go b/lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.pb.go new file mode 100644 index 0000000..d1b0b37 --- /dev/null +++ b/lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.pb.go @@ -0,0 +1,1711 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: spotify/clienttoken/v0/clienttoken_http.proto + +package clienttoken_http + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + proto "tuxpa.in/a/goplayd/lib/spot/proto" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ClientTokenRequestType int32 + +const ( + ClientTokenRequestType_REQUEST_UNKNOWN ClientTokenRequestType = 0 + ClientTokenRequestType_REQUEST_CLIENT_DATA_REQUEST ClientTokenRequestType = 1 + ClientTokenRequestType_REQUEST_CHALLENGE_ANSWERS_REQUEST ClientTokenRequestType = 2 +) + +// Enum value maps for ClientTokenRequestType. +var ( + ClientTokenRequestType_name = map[int32]string{ + 0: "REQUEST_UNKNOWN", + 1: "REQUEST_CLIENT_DATA_REQUEST", + 2: "REQUEST_CHALLENGE_ANSWERS_REQUEST", + } + ClientTokenRequestType_value = map[string]int32{ + "REQUEST_UNKNOWN": 0, + "REQUEST_CLIENT_DATA_REQUEST": 1, + "REQUEST_CHALLENGE_ANSWERS_REQUEST": 2, + } +) + +func (x ClientTokenRequestType) Enum() *ClientTokenRequestType { + p := new(ClientTokenRequestType) + *p = x + return p +} + +func (x ClientTokenRequestType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClientTokenRequestType) Descriptor() protoreflect.EnumDescriptor { + return file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes[0].Descriptor() +} + +func (ClientTokenRequestType) Type() protoreflect.EnumType { + return &file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes[0] +} + +func (x ClientTokenRequestType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ClientTokenRequestType.Descriptor instead. +func (ClientTokenRequestType) EnumDescriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{0} +} + +type ClientTokenResponseType int32 + +const ( + ClientTokenResponseType_RESPONSE_UNKNOWN ClientTokenResponseType = 0 + ClientTokenResponseType_RESPONSE_GRANTED_TOKEN_RESPONSE ClientTokenResponseType = 1 + ClientTokenResponseType_RESPONSE_CHALLENGES_RESPONSE ClientTokenResponseType = 2 +) + +// Enum value maps for ClientTokenResponseType. +var ( + ClientTokenResponseType_name = map[int32]string{ + 0: "RESPONSE_UNKNOWN", + 1: "RESPONSE_GRANTED_TOKEN_RESPONSE", + 2: "RESPONSE_CHALLENGES_RESPONSE", + } + ClientTokenResponseType_value = map[string]int32{ + "RESPONSE_UNKNOWN": 0, + "RESPONSE_GRANTED_TOKEN_RESPONSE": 1, + "RESPONSE_CHALLENGES_RESPONSE": 2, + } +) + +func (x ClientTokenResponseType) Enum() *ClientTokenResponseType { + p := new(ClientTokenResponseType) + *p = x + return p +} + +func (x ClientTokenResponseType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClientTokenResponseType) Descriptor() protoreflect.EnumDescriptor { + return file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes[1].Descriptor() +} + +func (ClientTokenResponseType) Type() protoreflect.EnumType { + return &file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes[1] +} + +func (x ClientTokenResponseType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ClientTokenResponseType.Descriptor instead. +func (ClientTokenResponseType) EnumDescriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{1} +} + +type ChallengeType int32 + +const ( + ChallengeType_CHALLENGE_UNKNOWN ChallengeType = 0 + ChallengeType_CHALLENGE_CLIENT_SECRET_HMAC ChallengeType = 1 + ChallengeType_CHALLENGE_EVALUATE_JS ChallengeType = 2 + ChallengeType_CHALLENGE_HASH_CASH ChallengeType = 3 +) + +// Enum value maps for ChallengeType. +var ( + ChallengeType_name = map[int32]string{ + 0: "CHALLENGE_UNKNOWN", + 1: "CHALLENGE_CLIENT_SECRET_HMAC", + 2: "CHALLENGE_EVALUATE_JS", + 3: "CHALLENGE_HASH_CASH", + } + ChallengeType_value = map[string]int32{ + "CHALLENGE_UNKNOWN": 0, + "CHALLENGE_CLIENT_SECRET_HMAC": 1, + "CHALLENGE_EVALUATE_JS": 2, + "CHALLENGE_HASH_CASH": 3, + } +) + +func (x ChallengeType) Enum() *ChallengeType { + p := new(ChallengeType) + *p = x + return p +} + +func (x ChallengeType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ChallengeType) Descriptor() protoreflect.EnumDescriptor { + return file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes[2].Descriptor() +} + +func (ChallengeType) Type() protoreflect.EnumType { + return &file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes[2] +} + +func (x ChallengeType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ChallengeType.Descriptor instead. +func (ChallengeType) EnumDescriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{2} +} + +type ClientTokenRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RequestType ClientTokenRequestType `protobuf:"varint,1,opt,name=request_type,json=requestType,proto3,enum=spotify.clienttoken.http.v0.ClientTokenRequestType" json:"request_type,omitempty"` + // Types that are assignable to Request: + // + // *ClientTokenRequest_ClientData + // *ClientTokenRequest_ChallengeAnswers + Request isClientTokenRequest_Request `protobuf_oneof:"request"` +} + +func (x *ClientTokenRequest) Reset() { + *x = ClientTokenRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientTokenRequest) ProtoMessage() {} + +func (x *ClientTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientTokenRequest.ProtoReflect.Descriptor instead. +func (*ClientTokenRequest) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{0} +} + +func (x *ClientTokenRequest) GetRequestType() ClientTokenRequestType { + if x != nil { + return x.RequestType + } + return ClientTokenRequestType_REQUEST_UNKNOWN +} + +func (m *ClientTokenRequest) GetRequest() isClientTokenRequest_Request { + if m != nil { + return m.Request + } + return nil +} + +func (x *ClientTokenRequest) GetClientData() *ClientDataRequest { + if x, ok := x.GetRequest().(*ClientTokenRequest_ClientData); ok { + return x.ClientData + } + return nil +} + +func (x *ClientTokenRequest) GetChallengeAnswers() *ChallengeAnswersRequest { + if x, ok := x.GetRequest().(*ClientTokenRequest_ChallengeAnswers); ok { + return x.ChallengeAnswers + } + return nil +} + +type isClientTokenRequest_Request interface { + isClientTokenRequest_Request() +} + +type ClientTokenRequest_ClientData struct { + ClientData *ClientDataRequest `protobuf:"bytes,2,opt,name=client_data,json=clientData,proto3,oneof"` +} + +type ClientTokenRequest_ChallengeAnswers struct { + ChallengeAnswers *ChallengeAnswersRequest `protobuf:"bytes,3,opt,name=challenge_answers,json=challengeAnswers,proto3,oneof"` +} + +func (*ClientTokenRequest_ClientData) isClientTokenRequest_Request() {} + +func (*ClientTokenRequest_ChallengeAnswers) isClientTokenRequest_Request() {} + +type ClientDataRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientVersion string `protobuf:"bytes,1,opt,name=client_version,json=clientVersion,proto3" json:"client_version,omitempty"` + ClientId string `protobuf:"bytes,2,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` + // Types that are assignable to Data: + // + // *ClientDataRequest_ConnectivitySdkData + Data isClientDataRequest_Data `protobuf_oneof:"data"` +} + +func (x *ClientDataRequest) Reset() { + *x = ClientDataRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientDataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientDataRequest) ProtoMessage() {} + +func (x *ClientDataRequest) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientDataRequest.ProtoReflect.Descriptor instead. +func (*ClientDataRequest) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{1} +} + +func (x *ClientDataRequest) GetClientVersion() string { + if x != nil { + return x.ClientVersion + } + return "" +} + +func (x *ClientDataRequest) GetClientId() string { + if x != nil { + return x.ClientId + } + return "" +} + +func (m *ClientDataRequest) GetData() isClientDataRequest_Data { + if m != nil { + return m.Data + } + return nil +} + +func (x *ClientDataRequest) GetConnectivitySdkData() *proto.ConnectivitySdkData { + if x, ok := x.GetData().(*ClientDataRequest_ConnectivitySdkData); ok { + return x.ConnectivitySdkData + } + return nil +} + +type isClientDataRequest_Data interface { + isClientDataRequest_Data() +} + +type ClientDataRequest_ConnectivitySdkData struct { + ConnectivitySdkData *proto.ConnectivitySdkData `protobuf:"bytes,3,opt,name=connectivity_sdk_data,json=connectivitySdkData,proto3,oneof"` +} + +func (*ClientDataRequest_ConnectivitySdkData) isClientDataRequest_Data() {} + +type ChallengeAnswersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + Answers []*ChallengeAnswer `protobuf:"bytes,2,rep,name=answers,proto3" json:"answers,omitempty"` +} + +func (x *ChallengeAnswersRequest) Reset() { + *x = ChallengeAnswersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChallengeAnswersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChallengeAnswersRequest) ProtoMessage() {} + +func (x *ChallengeAnswersRequest) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChallengeAnswersRequest.ProtoReflect.Descriptor instead. +func (*ChallengeAnswersRequest) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{2} +} + +func (x *ChallengeAnswersRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *ChallengeAnswersRequest) GetAnswers() []*ChallengeAnswer { + if x != nil { + return x.Answers + } + return nil +} + +type ClientTokenResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResponseType ClientTokenResponseType `protobuf:"varint,1,opt,name=response_type,json=responseType,proto3,enum=spotify.clienttoken.http.v0.ClientTokenResponseType" json:"response_type,omitempty"` + // Types that are assignable to Response: + // + // *ClientTokenResponse_GrantedToken + // *ClientTokenResponse_Challenges + Response isClientTokenResponse_Response `protobuf_oneof:"response"` +} + +func (x *ClientTokenResponse) Reset() { + *x = ClientTokenResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientTokenResponse) ProtoMessage() {} + +func (x *ClientTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientTokenResponse.ProtoReflect.Descriptor instead. +func (*ClientTokenResponse) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{3} +} + +func (x *ClientTokenResponse) GetResponseType() ClientTokenResponseType { + if x != nil { + return x.ResponseType + } + return ClientTokenResponseType_RESPONSE_UNKNOWN +} + +func (m *ClientTokenResponse) GetResponse() isClientTokenResponse_Response { + if m != nil { + return m.Response + } + return nil +} + +func (x *ClientTokenResponse) GetGrantedToken() *GrantedTokenResponse { + if x, ok := x.GetResponse().(*ClientTokenResponse_GrantedToken); ok { + return x.GrantedToken + } + return nil +} + +func (x *ClientTokenResponse) GetChallenges() *ChallengesResponse { + if x, ok := x.GetResponse().(*ClientTokenResponse_Challenges); ok { + return x.Challenges + } + return nil +} + +type isClientTokenResponse_Response interface { + isClientTokenResponse_Response() +} + +type ClientTokenResponse_GrantedToken struct { + GrantedToken *GrantedTokenResponse `protobuf:"bytes,2,opt,name=granted_token,json=grantedToken,proto3,oneof"` +} + +type ClientTokenResponse_Challenges struct { + Challenges *ChallengesResponse `protobuf:"bytes,3,opt,name=challenges,proto3,oneof"` +} + +func (*ClientTokenResponse_GrantedToken) isClientTokenResponse_Response() {} + +func (*ClientTokenResponse_Challenges) isClientTokenResponse_Response() {} + +type TokenDomain struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Domain string `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"` +} + +func (x *TokenDomain) Reset() { + *x = TokenDomain{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TokenDomain) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TokenDomain) ProtoMessage() {} + +func (x *TokenDomain) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TokenDomain.ProtoReflect.Descriptor instead. +func (*TokenDomain) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{4} +} + +func (x *TokenDomain) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + +type GrantedTokenResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + ExpiresAfterSeconds int32 `protobuf:"varint,2,opt,name=expires_after_seconds,json=expiresAfterSeconds,proto3" json:"expires_after_seconds,omitempty"` + RefreshAfterSeconds int32 `protobuf:"varint,3,opt,name=refresh_after_seconds,json=refreshAfterSeconds,proto3" json:"refresh_after_seconds,omitempty"` + Domains []*TokenDomain `protobuf:"bytes,4,rep,name=domains,proto3" json:"domains,omitempty"` +} + +func (x *GrantedTokenResponse) Reset() { + *x = GrantedTokenResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrantedTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrantedTokenResponse) ProtoMessage() {} + +func (x *GrantedTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GrantedTokenResponse.ProtoReflect.Descriptor instead. +func (*GrantedTokenResponse) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{5} +} + +func (x *GrantedTokenResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *GrantedTokenResponse) GetExpiresAfterSeconds() int32 { + if x != nil { + return x.ExpiresAfterSeconds + } + return 0 +} + +func (x *GrantedTokenResponse) GetRefreshAfterSeconds() int32 { + if x != nil { + return x.RefreshAfterSeconds + } + return 0 +} + +func (x *GrantedTokenResponse) GetDomains() []*TokenDomain { + if x != nil { + return x.Domains + } + return nil +} + +type ChallengesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + Challenges []*Challenge `protobuf:"bytes,2,rep,name=challenges,proto3" json:"challenges,omitempty"` +} + +func (x *ChallengesResponse) Reset() { + *x = ChallengesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChallengesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChallengesResponse) ProtoMessage() {} + +func (x *ChallengesResponse) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChallengesResponse.ProtoReflect.Descriptor instead. +func (*ChallengesResponse) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{6} +} + +func (x *ChallengesResponse) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *ChallengesResponse) GetChallenges() []*Challenge { + if x != nil { + return x.Challenges + } + return nil +} + +type ClientSecretParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Salt string `protobuf:"bytes,1,opt,name=salt,proto3" json:"salt,omitempty"` +} + +func (x *ClientSecretParameters) Reset() { + *x = ClientSecretParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientSecretParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientSecretParameters) ProtoMessage() {} + +func (x *ClientSecretParameters) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientSecretParameters.ProtoReflect.Descriptor instead. +func (*ClientSecretParameters) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{7} +} + +func (x *ClientSecretParameters) GetSalt() string { + if x != nil { + return x.Salt + } + return "" +} + +type EvaluateJSParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` + Libraries []string `protobuf:"bytes,2,rep,name=libraries,proto3" json:"libraries,omitempty"` +} + +func (x *EvaluateJSParameters) Reset() { + *x = EvaluateJSParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EvaluateJSParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EvaluateJSParameters) ProtoMessage() {} + +func (x *EvaluateJSParameters) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EvaluateJSParameters.ProtoReflect.Descriptor instead. +func (*EvaluateJSParameters) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{8} +} + +func (x *EvaluateJSParameters) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +func (x *EvaluateJSParameters) GetLibraries() []string { + if x != nil { + return x.Libraries + } + return nil +} + +type HashCashParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Length int32 `protobuf:"varint,1,opt,name=length,proto3" json:"length,omitempty"` + Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` +} + +func (x *HashCashParameters) Reset() { + *x = HashCashParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HashCashParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HashCashParameters) ProtoMessage() {} + +func (x *HashCashParameters) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HashCashParameters.ProtoReflect.Descriptor instead. +func (*HashCashParameters) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{9} +} + +func (x *HashCashParameters) GetLength() int32 { + if x != nil { + return x.Length + } + return 0 +} + +func (x *HashCashParameters) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +type Challenge struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type ChallengeType `protobuf:"varint,1,opt,name=type,proto3,enum=spotify.clienttoken.http.v0.ChallengeType" json:"type,omitempty"` + // Types that are assignable to Parameters: + // + // *Challenge_ClientSecretParameters + // *Challenge_EvaluateJsParameters + // *Challenge_EvaluateHashcashParameters + Parameters isChallenge_Parameters `protobuf_oneof:"parameters"` +} + +func (x *Challenge) Reset() { + *x = Challenge{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Challenge) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Challenge) ProtoMessage() {} + +func (x *Challenge) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Challenge.ProtoReflect.Descriptor instead. +func (*Challenge) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{10} +} + +func (x *Challenge) GetType() ChallengeType { + if x != nil { + return x.Type + } + return ChallengeType_CHALLENGE_UNKNOWN +} + +func (m *Challenge) GetParameters() isChallenge_Parameters { + if m != nil { + return m.Parameters + } + return nil +} + +func (x *Challenge) GetClientSecretParameters() *ClientSecretParameters { + if x, ok := x.GetParameters().(*Challenge_ClientSecretParameters); ok { + return x.ClientSecretParameters + } + return nil +} + +func (x *Challenge) GetEvaluateJsParameters() *EvaluateJSParameters { + if x, ok := x.GetParameters().(*Challenge_EvaluateJsParameters); ok { + return x.EvaluateJsParameters + } + return nil +} + +func (x *Challenge) GetEvaluateHashcashParameters() *HashCashParameters { + if x, ok := x.GetParameters().(*Challenge_EvaluateHashcashParameters); ok { + return x.EvaluateHashcashParameters + } + return nil +} + +type isChallenge_Parameters interface { + isChallenge_Parameters() +} + +type Challenge_ClientSecretParameters struct { + ClientSecretParameters *ClientSecretParameters `protobuf:"bytes,2,opt,name=client_secret_parameters,json=clientSecretParameters,proto3,oneof"` +} + +type Challenge_EvaluateJsParameters struct { + EvaluateJsParameters *EvaluateJSParameters `protobuf:"bytes,3,opt,name=evaluate_js_parameters,json=evaluateJsParameters,proto3,oneof"` +} + +type Challenge_EvaluateHashcashParameters struct { + EvaluateHashcashParameters *HashCashParameters `protobuf:"bytes,4,opt,name=evaluate_hashcash_parameters,json=evaluateHashcashParameters,proto3,oneof"` +} + +func (*Challenge_ClientSecretParameters) isChallenge_Parameters() {} + +func (*Challenge_EvaluateJsParameters) isChallenge_Parameters() {} + +func (*Challenge_EvaluateHashcashParameters) isChallenge_Parameters() {} + +type ClientSecretHMACAnswer struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hmac string `protobuf:"bytes,1,opt,name=hmac,proto3" json:"hmac,omitempty"` +} + +func (x *ClientSecretHMACAnswer) Reset() { + *x = ClientSecretHMACAnswer{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientSecretHMACAnswer) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientSecretHMACAnswer) ProtoMessage() {} + +func (x *ClientSecretHMACAnswer) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientSecretHMACAnswer.ProtoReflect.Descriptor instead. +func (*ClientSecretHMACAnswer) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{11} +} + +func (x *ClientSecretHMACAnswer) GetHmac() string { + if x != nil { + return x.Hmac + } + return "" +} + +type EvaluateJSAnswer struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Result string `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` +} + +func (x *EvaluateJSAnswer) Reset() { + *x = EvaluateJSAnswer{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EvaluateJSAnswer) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EvaluateJSAnswer) ProtoMessage() {} + +func (x *EvaluateJSAnswer) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EvaluateJSAnswer.ProtoReflect.Descriptor instead. +func (*EvaluateJSAnswer) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{12} +} + +func (x *EvaluateJSAnswer) GetResult() string { + if x != nil { + return x.Result + } + return "" +} + +type HashCashAnswer struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Suffix string `protobuf:"bytes,1,opt,name=suffix,proto3" json:"suffix,omitempty"` +} + +func (x *HashCashAnswer) Reset() { + *x = HashCashAnswer{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HashCashAnswer) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HashCashAnswer) ProtoMessage() {} + +func (x *HashCashAnswer) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HashCashAnswer.ProtoReflect.Descriptor instead. +func (*HashCashAnswer) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{13} +} + +func (x *HashCashAnswer) GetSuffix() string { + if x != nil { + return x.Suffix + } + return "" +} + +type ChallengeAnswer struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChallengeType ChallengeType `protobuf:"varint,1,opt,name=ChallengeType,proto3,enum=spotify.clienttoken.http.v0.ChallengeType" json:"ChallengeType,omitempty"` + // Types that are assignable to Answer: + // + // *ChallengeAnswer_ClientSecret + // *ChallengeAnswer_EvaluateJs + // *ChallengeAnswer_HashCash + Answer isChallengeAnswer_Answer `protobuf_oneof:"answer"` +} + +func (x *ChallengeAnswer) Reset() { + *x = ChallengeAnswer{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChallengeAnswer) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChallengeAnswer) ProtoMessage() {} + +func (x *ChallengeAnswer) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChallengeAnswer.ProtoReflect.Descriptor instead. +func (*ChallengeAnswer) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{14} +} + +func (x *ChallengeAnswer) GetChallengeType() ChallengeType { + if x != nil { + return x.ChallengeType + } + return ChallengeType_CHALLENGE_UNKNOWN +} + +func (m *ChallengeAnswer) GetAnswer() isChallengeAnswer_Answer { + if m != nil { + return m.Answer + } + return nil +} + +func (x *ChallengeAnswer) GetClientSecret() *ClientSecretHMACAnswer { + if x, ok := x.GetAnswer().(*ChallengeAnswer_ClientSecret); ok { + return x.ClientSecret + } + return nil +} + +func (x *ChallengeAnswer) GetEvaluateJs() *EvaluateJSAnswer { + if x, ok := x.GetAnswer().(*ChallengeAnswer_EvaluateJs); ok { + return x.EvaluateJs + } + return nil +} + +func (x *ChallengeAnswer) GetHashCash() *HashCashAnswer { + if x, ok := x.GetAnswer().(*ChallengeAnswer_HashCash); ok { + return x.HashCash + } + return nil +} + +type isChallengeAnswer_Answer interface { + isChallengeAnswer_Answer() +} + +type ChallengeAnswer_ClientSecret struct { + ClientSecret *ClientSecretHMACAnswer `protobuf:"bytes,2,opt,name=client_secret,json=clientSecret,proto3,oneof"` +} + +type ChallengeAnswer_EvaluateJs struct { + EvaluateJs *EvaluateJSAnswer `protobuf:"bytes,3,opt,name=evaluate_js,json=evaluateJs,proto3,oneof"` +} + +type ChallengeAnswer_HashCash struct { + HashCash *HashCashAnswer `protobuf:"bytes,4,opt,name=hash_cash,json=hashCash,proto3,oneof"` +} + +func (*ChallengeAnswer_ClientSecret) isChallengeAnswer_Answer() {} + +func (*ChallengeAnswer_EvaluateJs) isChallengeAnswer_Answer() {} + +func (*ChallengeAnswer_HashCash) isChallengeAnswer_Answer() {} + +type ClientTokenBadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *ClientTokenBadRequest) Reset() { + *x = ClientTokenBadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientTokenBadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientTokenBadRequest) ProtoMessage() {} + +func (x *ClientTokenBadRequest) ProtoReflect() protoreflect.Message { + mi := &file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientTokenBadRequest.ProtoReflect.Descriptor instead. +func (*ClientTokenBadRequest) Descriptor() ([]byte, []int) { + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP(), []int{15} +} + +func (x *ClientTokenBadRequest) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +var File_spotify_clienttoken_v0_clienttoken_http_proto protoreflect.FileDescriptor + +var file_spotify_clienttoken_v0_clienttoken_http_proto_rawDesc = []byte{ + 0x0a, 0x2d, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2f, 0x76, 0x30, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x1b, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x1a, 0x12, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0xaf, 0x02, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x51, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x76, 0x30, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x63, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, + 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x43, 0x68, 0x61, 0x6c, + 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, + 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0xc7, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x66, 0x0a, 0x15, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x64, 0x6b, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x70, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x30, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x64, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, + 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x64, 0x6b, + 0x44, 0x61, 0x74, 0x61, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x77, 0x0a, 0x17, + 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x46, 0x0a, + 0x07, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x43, 0x68, 0x61, + 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x52, 0x07, 0x61, 0x6e, + 0x73, 0x77, 0x65, 0x72, 0x73, 0x22, 0xa9, 0x02, 0x0a, 0x13, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, + 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x76, 0x30, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x51, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, + 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x6c, 0x6c, + 0x65, 0x6e, 0x67, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x25, 0x0a, 0x0b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xd8, 0x01, 0x0a, 0x14, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x72, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x41, 0x66, 0x74, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x42, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x22, 0x72, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x46, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, + 0x30, 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x63, 0x68, 0x61, + 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x61, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x73, 0x61, 0x6c, 0x74, 0x22, 0x48, 0x0a, 0x14, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x4a, 0x53, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, + 0x44, 0x0a, 0x12, 0x48, 0x61, 0x73, 0x68, 0x43, 0x61, 0x73, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0xaa, 0x03, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, + 0x6e, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, + 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x6f, 0x0a, 0x18, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, + 0x2e, 0x76, 0x30, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x16, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x69, 0x0a, 0x16, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x5f, 0x6a, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x76, 0x30, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4a, 0x53, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x14, 0x65, 0x76, 0x61, 0x6c, 0x75, + 0x61, 0x74, 0x65, 0x4a, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x73, 0x0a, 0x1c, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x63, 0x61, 0x73, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, + 0x2e, 0x76, 0x30, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x43, 0x61, 0x73, 0x68, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x65, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x73, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x2c, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x48, 0x4d, 0x41, 0x43, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x6d, 0x61, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6d, 0x61, 0x63, + 0x22, 0x2a, 0x0a, 0x10, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4a, 0x53, 0x41, 0x6e, + 0x73, 0x77, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x28, 0x0a, 0x0e, + 0x48, 0x61, 0x73, 0x68, 0x43, 0x61, 0x73, 0x68, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x22, 0xe7, 0x02, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x6c, 0x6c, + 0x65, 0x6e, 0x67, 0x65, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0d, 0x43, 0x68, + 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, + 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x43, + 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5a, 0x0a, 0x0d, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, + 0x30, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x48, 0x4d, + 0x41, 0x43, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x50, 0x0a, 0x0b, 0x65, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x45, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x65, 0x4a, 0x53, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0a, + 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x12, 0x4a, 0x0a, 0x09, 0x68, 0x61, + 0x73, 0x68, 0x5f, 0x63, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x2e, 0x48, 0x61, 0x73, 0x68, + 0x43, 0x61, 0x73, 0x68, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x68, 0x61, + 0x73, 0x68, 0x43, 0x61, 0x73, 0x68, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, + 0x22, 0x31, 0x0a, 0x15, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2a, 0x75, 0x0a, 0x16, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, + 0x0f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x43, 0x4c, + 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, + 0x54, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x43, + 0x48, 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x41, 0x4e, 0x53, 0x57, 0x45, 0x52, 0x53, + 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x2a, 0x76, 0x0a, 0x17, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, + 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x52, + 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, 0x44, 0x5f, + 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x10, 0x01, + 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x5f, 0x43, 0x48, 0x41, + 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, + 0x10, 0x02, 0x2a, 0x7c, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x48, + 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x53, + 0x45, 0x43, 0x52, 0x45, 0x54, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, + 0x43, 0x48, 0x41, 0x4c, 0x4c, 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, + 0x54, 0x45, 0x5f, 0x4a, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x48, 0x41, 0x4c, 0x4c, + 0x45, 0x4e, 0x47, 0x45, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x43, 0x41, 0x53, 0x48, 0x10, 0x03, + 0x42, 0x6c, 0x0a, 0x1b, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x30, 0x48, + 0x02, 0x50, 0x01, 0x5a, 0x49, 0x74, 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, + 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2f, 0x76, 0x30, 0x2f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescOnce sync.Once + file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescData = file_spotify_clienttoken_v0_clienttoken_http_proto_rawDesc +) + +func file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescGZIP() []byte { + file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescOnce.Do(func() { + file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescData = protoimpl.X.CompressGZIP(file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescData) + }) + return file_spotify_clienttoken_v0_clienttoken_http_proto_rawDescData +} + +var file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_spotify_clienttoken_v0_clienttoken_http_proto_goTypes = []interface{}{ + (ClientTokenRequestType)(0), // 0: spotify.clienttoken.http.v0.ClientTokenRequestType + (ClientTokenResponseType)(0), // 1: spotify.clienttoken.http.v0.ClientTokenResponseType + (ChallengeType)(0), // 2: spotify.clienttoken.http.v0.ChallengeType + (*ClientTokenRequest)(nil), // 3: spotify.clienttoken.http.v0.ClientTokenRequest + (*ClientDataRequest)(nil), // 4: spotify.clienttoken.http.v0.ClientDataRequest + (*ChallengeAnswersRequest)(nil), // 5: spotify.clienttoken.http.v0.ChallengeAnswersRequest + (*ClientTokenResponse)(nil), // 6: spotify.clienttoken.http.v0.ClientTokenResponse + (*TokenDomain)(nil), // 7: spotify.clienttoken.http.v0.TokenDomain + (*GrantedTokenResponse)(nil), // 8: spotify.clienttoken.http.v0.GrantedTokenResponse + (*ChallengesResponse)(nil), // 9: spotify.clienttoken.http.v0.ChallengesResponse + (*ClientSecretParameters)(nil), // 10: spotify.clienttoken.http.v0.ClientSecretParameters + (*EvaluateJSParameters)(nil), // 11: spotify.clienttoken.http.v0.EvaluateJSParameters + (*HashCashParameters)(nil), // 12: spotify.clienttoken.http.v0.HashCashParameters + (*Challenge)(nil), // 13: spotify.clienttoken.http.v0.Challenge + (*ClientSecretHMACAnswer)(nil), // 14: spotify.clienttoken.http.v0.ClientSecretHMACAnswer + (*EvaluateJSAnswer)(nil), // 15: spotify.clienttoken.http.v0.EvaluateJSAnswer + (*HashCashAnswer)(nil), // 16: spotify.clienttoken.http.v0.HashCashAnswer + (*ChallengeAnswer)(nil), // 17: spotify.clienttoken.http.v0.ChallengeAnswer + (*ClientTokenBadRequest)(nil), // 18: spotify.clienttoken.http.v0.ClientTokenBadRequest + (*proto.ConnectivitySdkData)(nil), // 19: spotify.clienttoken.data.v0.ConnectivitySdkData +} +var file_spotify_clienttoken_v0_clienttoken_http_proto_depIdxs = []int32{ + 0, // 0: spotify.clienttoken.http.v0.ClientTokenRequest.request_type:type_name -> spotify.clienttoken.http.v0.ClientTokenRequestType + 4, // 1: spotify.clienttoken.http.v0.ClientTokenRequest.client_data:type_name -> spotify.clienttoken.http.v0.ClientDataRequest + 5, // 2: spotify.clienttoken.http.v0.ClientTokenRequest.challenge_answers:type_name -> spotify.clienttoken.http.v0.ChallengeAnswersRequest + 19, // 3: spotify.clienttoken.http.v0.ClientDataRequest.connectivity_sdk_data:type_name -> spotify.clienttoken.data.v0.ConnectivitySdkData + 17, // 4: spotify.clienttoken.http.v0.ChallengeAnswersRequest.answers:type_name -> spotify.clienttoken.http.v0.ChallengeAnswer + 1, // 5: spotify.clienttoken.http.v0.ClientTokenResponse.response_type:type_name -> spotify.clienttoken.http.v0.ClientTokenResponseType + 8, // 6: spotify.clienttoken.http.v0.ClientTokenResponse.granted_token:type_name -> spotify.clienttoken.http.v0.GrantedTokenResponse + 9, // 7: spotify.clienttoken.http.v0.ClientTokenResponse.challenges:type_name -> spotify.clienttoken.http.v0.ChallengesResponse + 7, // 8: spotify.clienttoken.http.v0.GrantedTokenResponse.domains:type_name -> spotify.clienttoken.http.v0.TokenDomain + 13, // 9: spotify.clienttoken.http.v0.ChallengesResponse.challenges:type_name -> spotify.clienttoken.http.v0.Challenge + 2, // 10: spotify.clienttoken.http.v0.Challenge.type:type_name -> spotify.clienttoken.http.v0.ChallengeType + 10, // 11: spotify.clienttoken.http.v0.Challenge.client_secret_parameters:type_name -> spotify.clienttoken.http.v0.ClientSecretParameters + 11, // 12: spotify.clienttoken.http.v0.Challenge.evaluate_js_parameters:type_name -> spotify.clienttoken.http.v0.EvaluateJSParameters + 12, // 13: spotify.clienttoken.http.v0.Challenge.evaluate_hashcash_parameters:type_name -> spotify.clienttoken.http.v0.HashCashParameters + 2, // 14: spotify.clienttoken.http.v0.ChallengeAnswer.ChallengeType:type_name -> spotify.clienttoken.http.v0.ChallengeType + 14, // 15: spotify.clienttoken.http.v0.ChallengeAnswer.client_secret:type_name -> spotify.clienttoken.http.v0.ClientSecretHMACAnswer + 15, // 16: spotify.clienttoken.http.v0.ChallengeAnswer.evaluate_js:type_name -> spotify.clienttoken.http.v0.EvaluateJSAnswer + 16, // 17: spotify.clienttoken.http.v0.ChallengeAnswer.hash_cash:type_name -> spotify.clienttoken.http.v0.HashCashAnswer + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name +} + +func init() { file_spotify_clienttoken_v0_clienttoken_http_proto_init() } +func file_spotify_clienttoken_v0_clienttoken_http_proto_init() { + if File_spotify_clienttoken_v0_clienttoken_http_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientTokenRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientDataRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChallengeAnswersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientTokenResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TokenDomain); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrantedTokenResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChallengesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientSecretParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EvaluateJSParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HashCashParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Challenge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientSecretHMACAnswer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EvaluateJSAnswer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HashCashAnswer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChallengeAnswer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientTokenBadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*ClientTokenRequest_ClientData)(nil), + (*ClientTokenRequest_ChallengeAnswers)(nil), + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[1].OneofWrappers = []interface{}{ + (*ClientDataRequest_ConnectivitySdkData)(nil), + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[3].OneofWrappers = []interface{}{ + (*ClientTokenResponse_GrantedToken)(nil), + (*ClientTokenResponse_Challenges)(nil), + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[10].OneofWrappers = []interface{}{ + (*Challenge_ClientSecretParameters)(nil), + (*Challenge_EvaluateJsParameters)(nil), + (*Challenge_EvaluateHashcashParameters)(nil), + } + file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes[14].OneofWrappers = []interface{}{ + (*ChallengeAnswer_ClientSecret)(nil), + (*ChallengeAnswer_EvaluateJs)(nil), + (*ChallengeAnswer_HashCash)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_spotify_clienttoken_v0_clienttoken_http_proto_rawDesc, + NumEnums: 3, + NumMessages: 16, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_spotify_clienttoken_v0_clienttoken_http_proto_goTypes, + DependencyIndexes: file_spotify_clienttoken_v0_clienttoken_http_proto_depIdxs, + EnumInfos: file_spotify_clienttoken_v0_clienttoken_http_proto_enumTypes, + MessageInfos: file_spotify_clienttoken_v0_clienttoken_http_proto_msgTypes, + }.Build() + File_spotify_clienttoken_v0_clienttoken_http_proto = out.File + file_spotify_clienttoken_v0_clienttoken_http_proto_rawDesc = nil + file_spotify_clienttoken_v0_clienttoken_http_proto_goTypes = nil + file_spotify_clienttoken_v0_clienttoken_http_proto_depIdxs = nil +} diff --git a/lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.proto b/lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.proto new file mode 100644 index 0000000..dfae76a --- /dev/null +++ b/lib/spot/proto/spotify/clienttoken/v0/clienttoken_http.proto @@ -0,0 +1,127 @@ +syntax = "proto3"; + +package spotify.clienttoken.http.v0; + +import "connectivity.proto"; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto/spotify/clienttoken/v0/clienttoken_http"; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "spotify.clienttoken.http.v0"; + +message ClientTokenRequest { + ClientTokenRequestType request_type = 1; + + oneof request { + ClientDataRequest client_data = 2; + ChallengeAnswersRequest challenge_answers = 3; + } +} + +message ClientDataRequest { + string client_version = 1; + string client_id = 2; + + oneof data { + spotify.clienttoken.data.v0.ConnectivitySdkData connectivity_sdk_data = 3; + } +} + +message ChallengeAnswersRequest { + string state = 1; + repeated ChallengeAnswer answers = 2; +} + +message ClientTokenResponse { + ClientTokenResponseType response_type = 1; + + oneof response { + GrantedTokenResponse granted_token = 2; + ChallengesResponse challenges = 3; + } +} + +message TokenDomain { + string domain = 1; +} + +message GrantedTokenResponse { + string token = 1; + int32 expires_after_seconds = 2; + int32 refresh_after_seconds = 3; + repeated TokenDomain domains = 4; +} + +message ChallengesResponse { + string state = 1; + repeated Challenge challenges = 2; +} + +message ClientSecretParameters { + string salt = 1; +} + +message EvaluateJSParameters { + string code = 1; + repeated string libraries = 2; +} + +message HashCashParameters { + int32 length = 1; + string prefix = 2; +} + +message Challenge { + ChallengeType type = 1; + + oneof parameters { + ClientSecretParameters client_secret_parameters = 2; + EvaluateJSParameters evaluate_js_parameters = 3; + HashCashParameters evaluate_hashcash_parameters = 4; + } +} + +message ClientSecretHMACAnswer { + string hmac = 1; +} + +message EvaluateJSAnswer { + string result = 1; +} + +message HashCashAnswer { + string suffix = 1; +} + +message ChallengeAnswer { + ChallengeType ChallengeType = 1; + + oneof answer { + ClientSecretHMACAnswer client_secret = 2; + EvaluateJSAnswer evaluate_js = 3; + HashCashAnswer hash_cash = 4; + } +} + +message ClientTokenBadRequest { + string message = 1; +} + +enum ClientTokenRequestType { + REQUEST_UNKNOWN = 0; + REQUEST_CLIENT_DATA_REQUEST = 1; + REQUEST_CHALLENGE_ANSWERS_REQUEST = 2; +} + +enum ClientTokenResponseType { + RESPONSE_UNKNOWN = 0; + RESPONSE_GRANTED_TOKEN_RESPONSE = 1; + RESPONSE_CHALLENGES_RESPONSE = 2; +} + +enum ChallengeType { + CHALLENGE_UNKNOWN = 0; + CHALLENGE_CLIENT_SECRET_HMAC = 1; + CHALLENGE_EVALUATE_JS = 2; + CHALLENGE_HASH_CASH = 3; +} diff --git a/lib/spot/proto/spotify/login5/v3/challenges/code.proto b/lib/spot/proto/spotify/login5/v3/challenges/code.proto new file mode 100644 index 0000000..980d3de --- /dev/null +++ b/lib/spot/proto/spotify/login5/v3/challenges/code.proto @@ -0,0 +1,26 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto3"; + +package spotify.login5.v3.challenges; + +option objc_class_prefix = "SPTLogin5"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.login5.v3.challenges.proto"; + +message CodeChallenge { + Method method = 1; + enum Method { + UNKNOWN = 0; + SMS = 1; + } + + int32 code_length = 2; + int32 expires_in = 3; + string canonical_phone_number = 4; +} + +message CodeSolution { + string code = 1; +} diff --git a/lib/spot/proto/spotify/login5/v3/challenges/hashcash.proto b/lib/spot/proto/spotify/login5/v3/challenges/hashcash.proto new file mode 100644 index 0000000..3e83981 --- /dev/null +++ b/lib/spot/proto/spotify/login5/v3/challenges/hashcash.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto3"; + +package spotify.login5.v3.challenges; + +import "google/protobuf/duration.proto"; + +option objc_class_prefix = "SPTLogin5"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.login5.v3.challenges.proto"; + +message HashcashChallenge { + bytes prefix = 1; + int32 length = 2; +} + +message HashcashSolution { + bytes suffix = 1; + google.protobuf.Duration duration = 2; +} diff --git a/lib/spot/proto/spotify/login5/v3/client_info.proto b/lib/spot/proto/spotify/login5/v3/client_info.proto new file mode 100644 index 0000000..575891e --- /dev/null +++ b/lib/spot/proto/spotify/login5/v3/client_info.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto3"; + +package spotify.login5.v3; + +option objc_class_prefix = "SPTLogin5"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.login5.v3.proto"; + +message ClientInfo { + string client_id = 1; + string device_id = 2; +} diff --git a/lib/spot/proto/spotify/login5/v3/credentials/credentials.proto b/lib/spot/proto/spotify/login5/v3/credentials/credentials.proto new file mode 100644 index 0000000..c1f4395 --- /dev/null +++ b/lib/spot/proto/spotify/login5/v3/credentials/credentials.proto @@ -0,0 +1,53 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto3"; + +package spotify.login5.v3.credentials; + +option objc_class_prefix = "SPTLogin5"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.login5.v3.credentials.proto"; + +message StoredCredential { + string username = 1; + bytes data = 2; +} + +message Password { + string id = 1; + string password = 2; + bytes padding = 3; +} + +message FacebookAccessToken { + string fb_uid = 1; + string access_token = 2; +} + +message OneTimeToken { + string token = 1; +} + +message ParentChildCredential { + string child_id = 1; + StoredCredential parent_stored_credential = 2; +} + +message AppleSignInCredential { + string auth_code = 1; + string redirect_uri = 2; + string bundle_id = 3; +} + +message SamsungSignInCredential { + string auth_code = 1; + string redirect_uri = 2; + string id_token = 3; + string token_endpoint_url = 4; +} + +message GoogleSignInCredential { + string auth_code = 1; + string redirect_uri = 2; +} diff --git a/lib/spot/proto/spotify/login5/v3/identifiers/identifiers.proto b/lib/spot/proto/spotify/login5/v3/identifiers/identifiers.proto new file mode 100644 index 0000000..b82e994 --- /dev/null +++ b/lib/spot/proto/spotify/login5/v3/identifiers/identifiers.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto3"; + +package spotify.login5.v3.identifiers; + +option objc_class_prefix = "SPTLogin5"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.login5.v3.identifiers.proto"; + +message PhoneNumber { + string number = 1; + string iso_country_code = 2; + string country_calling_code = 3; +} diff --git a/lib/spot/proto/spotify/login5/v3/login5.proto b/lib/spot/proto/spotify/login5/v3/login5.proto new file mode 100644 index 0000000..4b41dcb --- /dev/null +++ b/lib/spot/proto/spotify/login5/v3/login5.proto @@ -0,0 +1,94 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto3"; + +package spotify.login5.v3; + +import "spotify/login5/v3/client_info.proto"; +import "spotify/login5/v3/user_info.proto"; +import "spotify/login5/v3/challenges/code.proto"; +import "spotify/login5/v3/challenges/hashcash.proto"; +import "spotify/login5/v3/credentials/credentials.proto"; +import "spotify/login5/v3/identifiers/identifiers.proto"; + +option objc_class_prefix = "SPTLogin5"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.login5.v3.proto"; + +message Challenges { + repeated Challenge challenges = 1; +} + +message Challenge { + oneof challenge { + challenges.HashcashChallenge hashcash = 1; + challenges.CodeChallenge code = 2; + } +} + +message ChallengeSolutions { + repeated ChallengeSolution solutions = 1; +} + +message ChallengeSolution { + oneof solution { + challenges.HashcashSolution hashcash = 1; + challenges.CodeSolution code = 2; + } +} + +message LoginRequest { + ClientInfo client_info = 1; + bytes login_context = 2; + ChallengeSolutions challenge_solutions = 3; + + oneof login_method { + credentials.StoredCredential stored_credential = 100; + credentials.Password password = 101; + credentials.FacebookAccessToken facebook_access_token = 102; + identifiers.PhoneNumber phone_number = 103; + credentials.OneTimeToken one_time_token = 104; + credentials.ParentChildCredential parent_child_credential = 105; + credentials.AppleSignInCredential apple_sign_in_credential = 106; + credentials.SamsungSignInCredential samsung_sign_in_credential = 107; + credentials.GoogleSignInCredential google_sign_in_credential = 108; + } +} + +message LoginOk { + string username = 1; + string access_token = 2; + bytes stored_credential = 3; + int32 access_token_expires_in = 4; +} + +message LoginResponse { + repeated Warnings warnings = 4; + enum Warnings { + UNKNOWN_WARNING = 0; + DEPRECATED_PROTOCOL_VERSION = 1; + } + + bytes login_context = 5; + string identifier_token = 6; + UserInfo user_info = 7; + + oneof response { + LoginOk ok = 1; + LoginError error = 2; + Challenges challenges = 3; + } +} + +enum LoginError { + UNKNOWN_ERROR = 0; + INVALID_CREDENTIALS = 1; + BAD_REQUEST = 2; + UNSUPPORTED_LOGIN_PROTOCOL = 3; + TIMEOUT = 4; + UNKNOWN_IDENTIFIER = 5; + TOO_MANY_ATTEMPTS = 6; + INVALID_PHONENUMBER = 7; + TRY_AGAIN_LATER = 8; +} diff --git a/lib/spot/proto/spotify/login5/v3/user_info.proto b/lib/spot/proto/spotify/login5/v3/user_info.proto new file mode 100644 index 0000000..a7e040c --- /dev/null +++ b/lib/spot/proto/spotify/login5/v3/user_info.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.33.569 (Windows) + +syntax = "proto3"; + +package spotify.login5.v3; + +option objc_class_prefix = "SPTLogin5"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.login5.v3.proto"; + +message UserInfo { + string name = 1; + string email = 2; + bool email_verified = 3; + string birthdate = 4; + + Gender gender = 5; + enum Gender { + UNKNOWN = 0; + MALE = 1; + FEMALE = 2; + NEUTRAL = 3; + } + + string phone_number = 6; + bool phone_number_verified = 7; + bool email_already_registered = 8; +} diff --git a/lib/spot/proto/state_restore/ads_rules_inject_tracks.proto b/lib/spot/proto/state_restore/ads_rules_inject_tracks.proto new file mode 100644 index 0000000..569c8cd --- /dev/null +++ b/lib/spot/proto/state_restore/ads_rules_inject_tracks.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "state_restore/provided_track.proto"; + +option optimize_for = CODE_SIZE; + +message AdsRulesInjectTracks { + repeated ProvidedTrack ads = 1; + optional bool is_playing_slot = 2; +} diff --git a/lib/spot/proto/state_restore/behavior_metadata_rules.proto b/lib/spot/proto/state_restore/behavior_metadata_rules.proto new file mode 100644 index 0000000..4bb65cd --- /dev/null +++ b/lib/spot/proto/state_restore/behavior_metadata_rules.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message BehaviorMetadataRules { + repeated string page_instance_ids = 1; + repeated string interaction_ids = 2; +} diff --git a/lib/spot/proto/state_restore/circuit_breaker_rules.proto b/lib/spot/proto/state_restore/circuit_breaker_rules.proto new file mode 100644 index 0000000..e81eaf5 --- /dev/null +++ b/lib/spot/proto/state_restore/circuit_breaker_rules.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message CircuitBreakerRules { + repeated string discarded_track_uids = 1; + required int32 num_errored_tracks = 2; + required bool context_track_played = 3; +} diff --git a/lib/spot/proto/state_restore/context_player_rules.proto b/lib/spot/proto/state_restore/context_player_rules.proto new file mode 100644 index 0000000..b06bf8e --- /dev/null +++ b/lib/spot/proto/state_restore/context_player_rules.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "state_restore/context_player_rules_base.proto"; +import "state_restore/mft_rules.proto"; + +option optimize_for = CODE_SIZE; + +message ContextPlayerRules { + optional ContextPlayerRulesBase base = 1; + optional MftRules mft_rules = 2; + map sub_rules = 3; +} diff --git a/lib/spot/proto/state_restore/context_player_rules_base.proto b/lib/spot/proto/state_restore/context_player_rules_base.proto new file mode 100644 index 0000000..da973bb --- /dev/null +++ b/lib/spot/proto/state_restore/context_player_rules_base.proto @@ -0,0 +1,33 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "state_restore/ads_rules_inject_tracks.proto"; +import "state_restore/behavior_metadata_rules.proto"; +import "state_restore/circuit_breaker_rules.proto"; +import "state_restore/explicit_content_rules.proto"; +import "state_restore/explicit_request_rules.proto"; +import "state_restore/mft_rules_core.proto"; +import "state_restore/mod_rules_interruptions.proto"; +import "state_restore/music_injection_rules.proto"; +import "state_restore/remove_banned_tracks_rules.proto"; +import "state_restore/resume_points_rules.proto"; +import "state_restore/track_error_rules.proto"; + +option optimize_for = CODE_SIZE; + +message ContextPlayerRulesBase { + optional BehaviorMetadataRules behavior_metadata_rules = 1; + optional CircuitBreakerRules circuit_breaker_rules = 2; + optional ExplicitContentRules explicit_content_rules = 3; + optional ExplicitRequestRules explicit_request_rules = 4; + optional MusicInjectionRules music_injection_rules = 5; + optional RemoveBannedTracksRules remove_banned_tracks_rules = 6; + optional ResumePointsRules resume_points_rules = 7; + optional TrackErrorRules track_error_rules = 8; + optional AdsRulesInjectTracks ads_rules_inject_tracks = 9; + optional MftRulesCore mft_rules_core = 10; + optional ModRulesInterruptions mod_rules_interruptions = 11; +} diff --git a/lib/spot/proto/state_restore/explicit_content_rules.proto b/lib/spot/proto/state_restore/explicit_content_rules.proto new file mode 100644 index 0000000..271ad6e --- /dev/null +++ b/lib/spot/proto/state_restore/explicit_content_rules.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message ExplicitContentRules { + required bool filter_explicit_content = 1; + required bool filter_age_restricted_content = 2; +} diff --git a/lib/spot/proto/state_restore/explicit_request_rules.proto b/lib/spot/proto/state_restore/explicit_request_rules.proto new file mode 100644 index 0000000..babda5c --- /dev/null +++ b/lib/spot/proto/state_restore/explicit_request_rules.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message ExplicitRequestRules { + required bool always_play_something = 1; +} diff --git a/lib/spot/proto/state_restore/mft_context_history.proto b/lib/spot/proto/state_restore/mft_context_history.proto new file mode 100644 index 0000000..48e7720 --- /dev/null +++ b/lib/spot/proto/state_restore/mft_context_history.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "context_track.proto"; + +option optimize_for = CODE_SIZE; + +message MftContextHistoryEntry { + required ContextTrack track = 1; + required int64 timestamp = 2; + optional int64 position = 3; +} + +message MftContextHistory { + map lookup = 1; +} diff --git a/lib/spot/proto/state_restore/mft_context_switch_rules.proto b/lib/spot/proto/state_restore/mft_context_switch_rules.proto new file mode 100644 index 0000000..d01e929 --- /dev/null +++ b/lib/spot/proto/state_restore/mft_context_switch_rules.proto @@ -0,0 +1,10 @@ +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message MftContextSwitchRules { + required bool has_played_track = 1; + required bool enabled = 2; +} diff --git a/lib/spot/proto/state_restore/mft_fallback_page_history.proto b/lib/spot/proto/state_restore/mft_fallback_page_history.proto new file mode 100644 index 0000000..54d15e8 --- /dev/null +++ b/lib/spot/proto/state_restore/mft_fallback_page_history.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message ContextAndPage { + required string context_uri = 1; + required string fallback_page_url = 2; +} + +message MftFallbackPageHistory { + repeated ContextAndPage context_to_fallback_page = 1; +} diff --git a/lib/spot/proto/state_restore/mft_rules.proto b/lib/spot/proto/state_restore/mft_rules.proto new file mode 100644 index 0000000..141cdac --- /dev/null +++ b/lib/spot/proto/state_restore/mft_rules.proto @@ -0,0 +1,38 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "state_restore/context_player_rules_base.proto"; + +option optimize_for = CODE_SIZE; + +message PlayEvents { + required int32 max_consecutive = 1; + required int32 max_occurrences_in_period = 2; + required int64 period = 3; +} + +message SkipEvents { + required int32 max_occurrences_in_period = 1; + required int64 period = 2; +} + +message Context { + required int32 min_tracks = 1; +} + +message MftConfiguration { + optional PlayEvents track = 1; + optional PlayEvents album = 2; + optional PlayEvents artist = 3; + optional SkipEvents skip = 4; + optional Context context = 5; +} + +message MftRules { + required bool locked = 1; + optional MftConfiguration config = 2; + map forward_rules = 3; +} diff --git a/lib/spot/proto/state_restore/mft_rules_core.proto b/lib/spot/proto/state_restore/mft_rules_core.proto new file mode 100644 index 0000000..0554962 --- /dev/null +++ b/lib/spot/proto/state_restore/mft_rules_core.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "state_restore/mft_context_switch_rules.proto"; +import "state_restore/mft_rules_inject_filler_tracks.proto"; + +option optimize_for = CODE_SIZE; + +message MftRulesCore { + required MftRulesInjectFillerTracks inject_filler_tracks = 1; + required MftContextSwitchRules context_switch_rules = 2; + repeated string feature_classes = 3; +} diff --git a/lib/spot/proto/state_restore/mft_rules_inject_filler_tracks.proto b/lib/spot/proto/state_restore/mft_rules_inject_filler_tracks.proto new file mode 100644 index 0000000..b5b8c65 --- /dev/null +++ b/lib/spot/proto/state_restore/mft_rules_inject_filler_tracks.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "context_track.proto"; +import "state_restore/random_source.proto"; + +option optimize_for = CODE_SIZE; + +message MftRandomTrackInjection { + required RandomSource random_source = 1; + required int32 offset = 2; +} + +message MftRulesInjectFillerTracks { + repeated ContextTrack fallback_tracks = 1; + required MftRandomTrackInjection padding_track_injection = 2; + required RandomSource random_source = 3; + required bool filter_explicit_content = 4; + repeated string feature_classes = 5; +} diff --git a/lib/spot/proto/state_restore/mft_state.proto b/lib/spot/proto/state_restore/mft_state.proto new file mode 100644 index 0000000..8f5f956 --- /dev/null +++ b/lib/spot/proto/state_restore/mft_state.proto @@ -0,0 +1,31 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message EventList { + repeated int64 event_times = 1; +} + +message LastEvent { + required string uri = 1; + required int32 when = 2; +} + +message History { + map when = 1; + required LastEvent last = 2; +} + +message MftState { + required History track = 1; + required History social_track = 2; + required History album = 3; + required History artist = 4; + required EventList skip = 5; + required int32 time = 6; + required bool did_skip = 7; +} diff --git a/lib/spot/proto/state_restore/mod_interruption_state.proto b/lib/spot/proto/state_restore/mod_interruption_state.proto new file mode 100644 index 0000000..e09ffe1 --- /dev/null +++ b/lib/spot/proto/state_restore/mod_interruption_state.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "context_track.proto"; +import "state_restore/provided_track.proto"; + +option optimize_for = CODE_SIZE; + +message StoredInterruption { + required ContextTrack context_track = 1; + required int64 fetched_at = 2; +} + +message ModInterruptionState { + optional string context_uri = 1; + optional ProvidedTrack last_track = 2; + map active_play_count = 3; + repeated StoredInterruption active_play_interruptions = 4; + repeated StoredInterruption repeat_play_interruptions = 5; +} diff --git a/lib/spot/proto/state_restore/mod_rules_interruptions.proto b/lib/spot/proto/state_restore/mod_rules_interruptions.proto new file mode 100644 index 0000000..1b965cc --- /dev/null +++ b/lib/spot/proto/state_restore/mod_rules_interruptions.proto @@ -0,0 +1,27 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "player_license.proto"; +import "state_restore/provided_track.proto"; + +option optimize_for = CODE_SIZE; + +message ModRulesInterruptions { + optional ProvidedTrack seek_repeat_track = 1; + required uint32 prng_seed = 2; + required bool support_video = 3; + required bool is_active_action = 4; + required bool is_in_seek_repeat = 5; + required bool has_tp_api_restrictions = 6; + required InterruptionSource interruption_source = 7; + required PlayerLicense license = 8; +} + +enum InterruptionSource { + Context_IS = 1; + SAS = 2; + NoInterruptions = 3; +} diff --git a/lib/spot/proto/state_restore/music_injection_rules.proto b/lib/spot/proto/state_restore/music_injection_rules.proto new file mode 100644 index 0000000..5ae18bc --- /dev/null +++ b/lib/spot/proto/state_restore/music_injection_rules.proto @@ -0,0 +1,25 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message InjectionSegment { + required string track_uri = 1; + optional int64 start = 2; + optional int64 stop = 3; + required int64 duration = 4; +} + +message InjectionModel { + optional string episode_uri = 1; + optional int64 total_duration = 2; + repeated InjectionSegment segments = 3; +} + +message MusicInjectionRules { + optional InjectionModel injection_model = 1; + optional bytes playback_id = 2; +} diff --git a/lib/spot/proto/state_restore/player_session_queue.proto b/lib/spot/proto/state_restore/player_session_queue.proto new file mode 100644 index 0000000..22ee794 --- /dev/null +++ b/lib/spot/proto/state_restore/player_session_queue.proto @@ -0,0 +1,27 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message SessionJson { + optional string json = 1; +} + +message QueuedSession { + optional Trigger trigger = 1; + optional SessionJson session = 2; +} + +message PlayerSessionQueue { + optional SessionJson active = 1; + repeated SessionJson pushed = 2; + repeated QueuedSession queued = 3; +} + +enum Trigger { + DID_GO_PAST_TRACK = 1; + DID_GO_PAST_CONTEXT = 2; +} diff --git a/lib/spot/proto/state_restore/provided_track.proto b/lib/spot/proto/state_restore/provided_track.proto new file mode 100644 index 0000000..a61010e --- /dev/null +++ b/lib/spot/proto/state_restore/provided_track.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +import "restrictions.proto"; + +option optimize_for = CODE_SIZE; + +message ProvidedTrack { + optional string uid = 1; + optional string uri = 2; + map metadata = 3; + optional string provider = 4; + repeated string removed = 5; + repeated string blocked = 6; + map internal_metadata = 7; + optional Restrictions restrictions = 8; +} diff --git a/lib/spot/proto/state_restore/random_source.proto b/lib/spot/proto/state_restore/random_source.proto new file mode 100644 index 0000000..f1ad101 --- /dev/null +++ b/lib/spot/proto/state_restore/random_source.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message RandomSource { + required uint64 random_0 = 1; + required uint64 random_1 = 2; +} diff --git a/lib/spot/proto/state_restore/remove_banned_tracks_rules.proto b/lib/spot/proto/state_restore/remove_banned_tracks_rules.proto new file mode 100644 index 0000000..9db5c70 --- /dev/null +++ b/lib/spot/proto/state_restore/remove_banned_tracks_rules.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message Strings { + repeated string strings = 1; +} + +message RemoveBannedTracksRules { + repeated string banned_tracks = 1; + repeated string banned_albums = 2; + repeated string banned_artists = 3; + map banned_context_tracks = 4; +} diff --git a/lib/spot/proto/state_restore/resume_points_rules.proto b/lib/spot/proto/state_restore/resume_points_rules.proto new file mode 100644 index 0000000..6f2618a --- /dev/null +++ b/lib/spot/proto/state_restore/resume_points_rules.proto @@ -0,0 +1,17 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message ResumePoint { + required bool is_fully_played = 1; + required int64 position = 2; + required int64 timestamp = 3; +} + +message ResumePointsRules { + map resume_points = 1; +} diff --git a/lib/spot/proto/state_restore/track_error_rules.proto b/lib/spot/proto/state_restore/track_error_rules.proto new file mode 100644 index 0000000..e13b856 --- /dev/null +++ b/lib/spot/proto/state_restore/track_error_rules.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.player.proto.state_restore; + +option optimize_for = CODE_SIZE; + +message TrackErrorRules { + repeated string reasons = 1; + required int32 num_attempted_tracks = 2; + required int32 num_failed_tracks = 3; +} diff --git a/lib/spot/proto/status.proto b/lib/spot/proto/status.proto new file mode 100644 index 0000000..1293af5 --- /dev/null +++ b/lib/spot/proto/status.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.collection_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message Status { + int32 code = 1; + string reason = 2; +} diff --git a/lib/spot/proto/status_code.proto b/lib/spot/proto/status_code.proto new file mode 100644 index 0000000..abc8bd4 --- /dev/null +++ b/lib/spot/proto/status_code.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +enum StatusCode { + SUCCESS = 0; + NO_PLAYBACK_ID = 1; + EVENT_SENDER_ERROR = 2; +} diff --git a/lib/spot/proto/status_response.proto b/lib/spot/proto/status_response.proto new file mode 100644 index 0000000..78d15c9 --- /dev/null +++ b/lib/spot/proto/status_response.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +import "status_code.proto"; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +message StatusResponse { + StatusCode status_code = 1; + string reason = 2; +} diff --git a/lib/spot/proto/storage-resolve.pb.go b/lib/spot/proto/storage-resolve.pb.go new file mode 100644 index 0000000..9b273d9 --- /dev/null +++ b/lib/spot/proto/storage-resolve.pb.go @@ -0,0 +1,226 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: storage-resolve.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type StorageResolveResponse_Result int32 + +const ( + StorageResolveResponse_CDN StorageResolveResponse_Result = 0 + StorageResolveResponse_STORAGE StorageResolveResponse_Result = 1 + StorageResolveResponse_RESTRICTED StorageResolveResponse_Result = 3 +) + +// Enum value maps for StorageResolveResponse_Result. +var ( + StorageResolveResponse_Result_name = map[int32]string{ + 0: "CDN", + 1: "STORAGE", + 3: "RESTRICTED", + } + StorageResolveResponse_Result_value = map[string]int32{ + "CDN": 0, + "STORAGE": 1, + "RESTRICTED": 3, + } +) + +func (x StorageResolveResponse_Result) Enum() *StorageResolveResponse_Result { + p := new(StorageResolveResponse_Result) + *p = x + return p +} + +func (x StorageResolveResponse_Result) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StorageResolveResponse_Result) Descriptor() protoreflect.EnumDescriptor { + return file_storage_resolve_proto_enumTypes[0].Descriptor() +} + +func (StorageResolveResponse_Result) Type() protoreflect.EnumType { + return &file_storage_resolve_proto_enumTypes[0] +} + +func (x StorageResolveResponse_Result) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StorageResolveResponse_Result.Descriptor instead. +func (StorageResolveResponse_Result) EnumDescriptor() ([]byte, []int) { + return file_storage_resolve_proto_rawDescGZIP(), []int{0, 0} +} + +type StorageResolveResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Result StorageResolveResponse_Result `protobuf:"varint,1,opt,name=result,proto3,enum=spotify.download.proto.StorageResolveResponse_Result" json:"result,omitempty"` + Cdnurl []string `protobuf:"bytes,2,rep,name=cdnurl,proto3" json:"cdnurl,omitempty"` + Fileid []byte `protobuf:"bytes,4,opt,name=fileid,proto3" json:"fileid,omitempty"` +} + +func (x *StorageResolveResponse) Reset() { + *x = StorageResolveResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_resolve_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StorageResolveResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StorageResolveResponse) ProtoMessage() {} + +func (x *StorageResolveResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_resolve_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StorageResolveResponse.ProtoReflect.Descriptor instead. +func (*StorageResolveResponse) Descriptor() ([]byte, []int) { + return file_storage_resolve_proto_rawDescGZIP(), []int{0} +} + +func (x *StorageResolveResponse) GetResult() StorageResolveResponse_Result { + if x != nil { + return x.Result + } + return StorageResolveResponse_CDN +} + +func (x *StorageResolveResponse) GetCdnurl() []string { + if x != nil { + return x.Cdnurl + } + return nil +} + +func (x *StorageResolveResponse) GetFileid() []byte { + if x != nil { + return x.Fileid + } + return nil +} + +var File_storage_resolve_proto protoreflect.FileDescriptor + +var file_storage_resolve_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xc7, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x2e, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x64, 0x6e, + 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x63, 0x64, 0x6e, 0x75, 0x72, + 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x65, 0x69, 0x64, 0x22, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x44, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x53, + 0x54, 0x52, 0x49, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x42, 0x25, 0x48, 0x02, 0x5a, 0x21, 0x74, + 0x75, 0x78, 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, + 0x64, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_storage_resolve_proto_rawDescOnce sync.Once + file_storage_resolve_proto_rawDescData = file_storage_resolve_proto_rawDesc +) + +func file_storage_resolve_proto_rawDescGZIP() []byte { + file_storage_resolve_proto_rawDescOnce.Do(func() { + file_storage_resolve_proto_rawDescData = protoimpl.X.CompressGZIP(file_storage_resolve_proto_rawDescData) + }) + return file_storage_resolve_proto_rawDescData +} + +var file_storage_resolve_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_storage_resolve_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_storage_resolve_proto_goTypes = []interface{}{ + (StorageResolveResponse_Result)(0), // 0: spotify.download.proto.StorageResolveResponse.Result + (*StorageResolveResponse)(nil), // 1: spotify.download.proto.StorageResolveResponse +} +var file_storage_resolve_proto_depIdxs = []int32{ + 0, // 0: spotify.download.proto.StorageResolveResponse.result:type_name -> spotify.download.proto.StorageResolveResponse.Result + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_storage_resolve_proto_init() } +func file_storage_resolve_proto_init() { + if File_storage_resolve_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_storage_resolve_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageResolveResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_storage_resolve_proto_rawDesc, + NumEnums: 1, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_storage_resolve_proto_goTypes, + DependencyIndexes: file_storage_resolve_proto_depIdxs, + EnumInfos: file_storage_resolve_proto_enumTypes, + MessageInfos: file_storage_resolve_proto_msgTypes, + }.Build() + File_storage_resolve_proto = out.File + file_storage_resolve_proto_rawDesc = nil + file_storage_resolve_proto_goTypes = nil + file_storage_resolve_proto_depIdxs = nil +} diff --git a/lib/spot/proto/storage-resolve.proto b/lib/spot/proto/storage-resolve.proto new file mode 100644 index 0000000..70e1685 --- /dev/null +++ b/lib/spot/proto/storage-resolve.proto @@ -0,0 +1,20 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.download.proto; + +option optimize_for = CODE_SIZE; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message StorageResolveResponse { + Result result = 1; + enum Result { + CDN = 0; + STORAGE = 1; + RESTRICTED = 3; + } + + repeated string cdnurl = 2; + bytes fileid = 4; +} diff --git a/lib/spot/proto/storage_cosmos.proto b/lib/spot/proto/storage_cosmos.proto new file mode 100644 index 0000000..9716985 --- /dev/null +++ b/lib/spot/proto/storage_cosmos.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.storage_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message GetFileCacheRangesResponse { + bool byte_size_known = 1; + uint64 byte_size = 2; + + repeated Range ranges = 3; + message Range { + uint64 from_byte = 1; + uint64 to_byte = 2; + } +} diff --git a/lib/spot/proto/storylines.proto b/lib/spot/proto/storylines.proto new file mode 100644 index 0000000..c936196 --- /dev/null +++ b/lib/spot/proto/storylines.proto @@ -0,0 +1,29 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.storylines.v1; + +option java_multiple_files = true; +option java_outer_classname = "StorylinesProto"; +option java_package = "com.spotify.storylines.v1.extended_metadata"; + +message Artist { + string uri = 1; + string name = 2; + string avatar_cdn_url = 3; +} + +message Card { + string id = 1; + string image_cdn_url = 2; + int32 image_width = 3; + int32 image_height = 4; +} + +message Storyline { + string id = 1; + string entity_uri = 2; + Artist artist = 3; + repeated Card cards = 4; +} diff --git a/lib/spot/proto/stream_end_request.proto b/lib/spot/proto/stream_end_request.proto new file mode 100644 index 0000000..ed72fd5 --- /dev/null +++ b/lib/spot/proto/stream_end_request.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +import "stream_handle.proto"; +import "play_reason.proto"; +import "media_format.proto"; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +message StreamEndRequest { + StreamHandle stream_handle = 1; + string source_end = 2; + PlayReason reason_end = 3; + MediaFormat format = 4; +} diff --git a/lib/spot/proto/stream_handle.proto b/lib/spot/proto/stream_handle.proto new file mode 100644 index 0000000..b66ed4c --- /dev/null +++ b/lib/spot/proto/stream_handle.proto @@ -0,0 +1,12 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +message StreamHandle { + string playback_id = 1; +} diff --git a/lib/spot/proto/stream_progress_request.proto b/lib/spot/proto/stream_progress_request.proto new file mode 100644 index 0000000..63fe9d8 --- /dev/null +++ b/lib/spot/proto/stream_progress_request.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +import "stream_handle.proto"; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +message StreamProgressRequest { + StreamHandle stream_handle = 1; + uint64 current_position = 2; + bool is_paused = 3; + bool is_playing_video = 4; + bool is_overlapping = 5; + bool is_background = 6; + bool is_fullscreen = 7; + bool is_external = 8; + double playback_speed = 9; +} diff --git a/lib/spot/proto/stream_seek_request.proto b/lib/spot/proto/stream_seek_request.proto new file mode 100644 index 0000000..7d99169 --- /dev/null +++ b/lib/spot/proto/stream_seek_request.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +import "stream_handle.proto"; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +message StreamSeekRequest { + StreamHandle stream_handle = 1; + uint64 from_position = 3; + uint64 to_position = 4; +} diff --git a/lib/spot/proto/stream_start_request.proto b/lib/spot/proto/stream_start_request.proto new file mode 100644 index 0000000..656016a --- /dev/null +++ b/lib/spot/proto/stream_start_request.proto @@ -0,0 +1,44 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +import "media_type.proto"; +import "play_reason.proto"; +import "streaming_rule.proto"; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +message StreamStartRequest { + string playback_id = 1; + string parent_playback_id = 2; + string parent_play_track = 3; + string video_session_id = 4; + string play_context = 5; + string uri = 6; + string displayed_uri = 7; + string feature_identifier = 8; + string feature_version = 9; + string view_uri = 10; + string provider = 11; + string referrer = 12; + string referrer_version = 13; + string referrer_vendor = 14; + StreamingRule streaming_rule = 15; + string connect_controller_device_id = 16; + string page_instance_id = 17; + string interaction_id = 18; + string source_start = 19; + PlayReason reason_start = 20; + bool is_shuffle = 23; + bool is_incognito = 25; + string media_id = 28; + MediaType media_type = 29; + uint64 playback_start_time = 30; + uint64 start_position = 31; + bool is_live = 32; + bool stream_was_offlined = 33; + bool client_offline = 34; +} diff --git a/lib/spot/proto/stream_start_response.proto b/lib/spot/proto/stream_start_response.proto new file mode 100644 index 0000000..98af297 --- /dev/null +++ b/lib/spot/proto/stream_start_response.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +import "status_response.proto"; +import "stream_handle.proto"; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +message StreamStartResponse { + StatusResponse status = 1; + StreamHandle stream_handle = 2; +} diff --git a/lib/spot/proto/streaming_rule.proto b/lib/spot/proto/streaming_rule.proto new file mode 100644 index 0000000..9593fde --- /dev/null +++ b/lib/spot/proto/streaming_rule.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.stream_reporting_esperanto.proto; + +option objc_class_prefix = "ESP"; +option java_package = "com.spotify.stream_reporting_esperanto.proto"; + +enum StreamingRule { + STREAMING_RULE_NONE = 0; + STREAMING_RULE_DMCA_RADIO = 1; + STREAMING_RULE_PREVIEW = 2; + STREAMING_RULE_WIFI = 3; + STREAMING_RULE_SHUFFLE_MODE = 4; +} diff --git a/lib/spot/proto/suppressions.proto b/lib/spot/proto/suppressions.proto new file mode 100644 index 0000000..4ddfaef --- /dev/null +++ b/lib/spot/proto/suppressions.proto @@ -0,0 +1,11 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message Suppressions { + repeated string providers = 1; +} diff --git a/lib/spot/proto/sync/album_sync_state.proto b/lib/spot/proto/sync/album_sync_state.proto new file mode 100644 index 0000000..7ea9027 --- /dev/null +++ b/lib/spot/proto/sync/album_sync_state.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message AlbumSyncState { + optional string offline = 1; + optional string inferred_offline = 2; + optional uint32 sync_progress = 3; +} diff --git a/lib/spot/proto/sync/artist_sync_state.proto b/lib/spot/proto/sync/artist_sync_state.proto new file mode 100644 index 0000000..03ba32f --- /dev/null +++ b/lib/spot/proto/sync/artist_sync_state.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message ArtistSyncState { + optional string offline = 1; + optional string inferred_offline = 2; + optional uint32 sync_progress = 3; +} diff --git a/lib/spot/proto/sync/episode_sync_state.proto b/lib/spot/proto/sync/episode_sync_state.proto new file mode 100644 index 0000000..7dce842 --- /dev/null +++ b/lib/spot/proto/sync/episode_sync_state.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message EpisodeSyncState { + optional string offline_state = 1; + optional uint32 sync_progress = 2; +} diff --git a/lib/spot/proto/sync/track_sync_state.proto b/lib/spot/proto/sync/track_sync_state.proto new file mode 100644 index 0000000..8873fad --- /dev/null +++ b/lib/spot/proto/sync/track_sync_state.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.cosmos_util.proto; + +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.cosmos.util.proto"; + +message TrackSyncState { + optional string offline = 1; + optional uint32 sync_progress = 2; +} diff --git a/lib/spot/proto/sync_request.proto b/lib/spot/proto/sync_request.proto new file mode 100644 index 0000000..b2d7762 --- /dev/null +++ b/lib/spot/proto/sync_request.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.playlist.cosmos.proto; + +option objc_class_prefix = "SPTPlaylist"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist.proto"; + +message SyncRequest { + repeated string playlist_uris = 1; +} diff --git a/lib/spot/proto/techu_core_exercise_cosmos.proto b/lib/spot/proto/techu_core_exercise_cosmos.proto new file mode 100644 index 0000000..155a303 --- /dev/null +++ b/lib/spot/proto/techu_core_exercise_cosmos.proto @@ -0,0 +1,16 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.techu_core_exercise_cosmos.proto; + +option optimize_for = CODE_SIZE; + +message TechUCoreExerciseRequest { + string a = 1; + string b = 2; +} + +message TechUCoreExerciseResponse { + string concatenated = 1; +} diff --git a/lib/spot/proto/track_instance.proto b/lib/spot/proto/track_instance.proto new file mode 100644 index 0000000..952f28c --- /dev/null +++ b/lib/spot/proto/track_instance.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "context_index.proto"; +import "context_track.proto"; +import "seek_to_position.proto"; + +option optimize_for = CODE_SIZE; + +message TrackInstance { + optional ContextTrack track = 1; + optional uint64 id = 2; + optional SeekToPosition seek_to_position = 7; + optional bool initially_paused = 4; + optional ContextIndex index = 5; + optional string provider = 6; + + reserved 3; +} diff --git a/lib/spot/proto/track_instantiator.proto b/lib/spot/proto/track_instantiator.proto new file mode 100644 index 0000000..3b8b8ba --- /dev/null +++ b/lib/spot/proto/track_instantiator.proto @@ -0,0 +1,13 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; + +message TrackInstantiator { + optional uint64 unique = 1; + optional uint64 count = 2; + optional string provider = 3; +} diff --git a/lib/spot/proto/transcripts.proto b/lib/spot/proto/transcripts.proto new file mode 100644 index 0000000..05ac7fb --- /dev/null +++ b/lib/spot/proto/transcripts.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.corex.transcripts.metadata; + +option objc_class_prefix = "SPT"; +option java_multiple_files = true; +option optimize_for = CODE_SIZE; +option java_outer_classname = "TranscriptMetadataProto"; +option java_package = "com.spotify.corex.transcripts.metadata.proto"; + +message EpisodeTranscript { + string episode_uri = 1; + repeated Transcript transcripts = 2; +} + +message Transcript { + string uri = 1; + string language = 2; + bool curated = 3; + string cdn_url = 4; +} diff --git a/lib/spot/proto/transfer_node.proto b/lib/spot/proto/transfer_node.proto new file mode 100644 index 0000000..e5bbc03 --- /dev/null +++ b/lib/spot/proto/transfer_node.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto; + +import "track_instance.proto"; +import "track_instantiator.proto"; + +option optimize_for = CODE_SIZE; + +message TransferNode { + optional TrackInstance instance = 1; + optional TrackInstantiator instantiator = 2; +} diff --git a/lib/spot/proto/transfer_state.proto b/lib/spot/proto/transfer_state.proto new file mode 100644 index 0000000..200547c --- /dev/null +++ b/lib/spot/proto/transfer_state.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context_player_options.proto"; +import "playback.proto"; +import "session.proto"; +import "queue.proto"; + +option optimize_for = CODE_SIZE; + +message TransferState { + optional ContextPlayerOptions options = 1; + optional Playback playback = 2; + optional Session current_session = 3; + optional Queue queue = 4; +} diff --git a/lib/spot/proto/tts-resolve.proto b/lib/spot/proto/tts-resolve.proto new file mode 100644 index 0000000..adb5085 --- /dev/null +++ b/lib/spot/proto/tts-resolve.proto @@ -0,0 +1,53 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.narration_injection.proto; + +option optimize_for = CODE_SIZE; + +service TtsResolveService { + rpc Resolve(ResolveRequest) returns (ResolveResponse); +} + +message ResolveRequest { + AudioFormat audio_format = 3; + enum AudioFormat { + UNSPECIFIED = 0; + WAV = 1; + PCM = 2; + OPUS = 3; + VORBIS = 4; + MP3 = 5; + } + + string language = 4; + + TtsVoice tts_voice = 5; + enum TtsVoice { + UNSET_TTS_VOICE = 0; + VOICE1 = 1; + VOICE2 = 2; + VOICE3 = 3; + } + + TtsProvider tts_provider = 6; + enum TtsProvider { + UNSET_TTS_PROVIDER = 0; + CLOUD_TTS = 1; + READSPEAKER = 2; + POLLY = 3; + WELL_SAID = 4; + } + + int32 sample_rate_hz = 7; + + oneof prompt { + string text = 1; + string ssml = 2; + } +} + +message ResolveResponse { + string url = 1; +} diff --git a/lib/spot/proto/ucs.proto b/lib/spot/proto/ucs.proto new file mode 100644 index 0000000..c5048f8 --- /dev/null +++ b/lib/spot/proto/ucs.proto @@ -0,0 +1,56 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.remote_config.ucs.proto; + +import "resolve.proto"; +import "useraccount.proto"; + +option optimize_for = CODE_SIZE; + +message UcsRequest { + CallerInfo caller_info = 1; + message CallerInfo { + string request_origin_id = 1; + string request_orgin_version = 2; + string reason = 3; + } + + ResolveRequest resolve_request = 2; + + AccountAttributesRequest account_attributes_request = 3; + message AccountAttributesRequest { + + } +} + +message UcsResponseWrapper { + oneof result { + UcsResponse success = 1; + Error error = 2; + } + + message UcsResponse { + int64 fetch_time_millis = 5; + + oneof resolve_result { + ResolveResponse resolve_success = 1; + Error resolve_error = 2; + } + + oneof account_attributes_result { + AccountAttributesResponse account_attributes_success = 3; + Error account_attributes_error = 4; + } + } + + message AccountAttributesResponse { + map account_attributes = 1; + } + + message Error { + int32 error_code = 1; + string error_message = 2; + } +} diff --git a/lib/spot/proto/unfinished_episodes_request.proto b/lib/spot/proto/unfinished_episodes_request.proto new file mode 100644 index 0000000..68e5f90 --- /dev/null +++ b/lib/spot/proto/unfinished_episodes_request.proto @@ -0,0 +1,26 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto2"; + +package spotify.show_cosmos.unfinished_episodes_request.proto; + +import "metadata/episode_metadata.proto"; +import "played_state/episode_played_state.proto"; +import "show_episode_state.proto"; + +option objc_class_prefix = "SPTShowCosmosUnfinshedEpisodes"; +option optimize_for = CODE_SIZE; + +message Episode { + optional cosmos_util.proto.EpisodeMetadata episode_metadata = 1; + optional show_cosmos.proto.EpisodeCollectionState episode_collection_state = 2; + optional show_cosmos.proto.EpisodeOfflineState episode_offline_state = 3; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 4; + optional string link = 5; +} + +message Response { + repeated Episode episode = 2; + + reserved 1; +} diff --git a/lib/spot/proto/user_attributes.pb.go b/lib/spot/proto/user_attributes.pb.go new file mode 100644 index 0000000..795f4bf --- /dev/null +++ b/lib/spot/proto/user_attributes.pb.go @@ -0,0 +1,308 @@ +// Custom protobuf crafted from spotify:user:attributes:mutated response: +// +// 1 { +// 1: "filter-explicit-content" +// } +// 2 { +// 1: 1639087299 +// 2: 418909000 +// } + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: user_attributes.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type UserAttributesMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Fields []*MutatedField `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"` + Cmd *MutationCommand `protobuf:"bytes,2,opt,name=cmd,proto3" json:"cmd,omitempty"` +} + +func (x *UserAttributesMutation) Reset() { + *x = UserAttributesMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_user_attributes_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserAttributesMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserAttributesMutation) ProtoMessage() {} + +func (x *UserAttributesMutation) ProtoReflect() protoreflect.Message { + mi := &file_user_attributes_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserAttributesMutation.ProtoReflect.Descriptor instead. +func (*UserAttributesMutation) Descriptor() ([]byte, []int) { + return file_user_attributes_proto_rawDescGZIP(), []int{0} +} + +func (x *UserAttributesMutation) GetFields() []*MutatedField { + if x != nil { + return x.Fields + } + return nil +} + +func (x *UserAttributesMutation) GetCmd() *MutationCommand { + if x != nil { + return x.Cmd + } + return nil +} + +type MutatedField struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *MutatedField) Reset() { + *x = MutatedField{} + if protoimpl.UnsafeEnabled { + mi := &file_user_attributes_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MutatedField) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutatedField) ProtoMessage() {} + +func (x *MutatedField) ProtoReflect() protoreflect.Message { + mi := &file_user_attributes_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MutatedField.ProtoReflect.Descriptor instead. +func (*MutatedField) Descriptor() ([]byte, []int) { + return file_user_attributes_proto_rawDescGZIP(), []int{1} +} + +func (x *MutatedField) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type MutationCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Unknown int32 `protobuf:"varint,2,opt,name=unknown,proto3" json:"unknown,omitempty"` +} + +func (x *MutationCommand) Reset() { + *x = MutationCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_user_attributes_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MutationCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MutationCommand) ProtoMessage() {} + +func (x *MutationCommand) ProtoReflect() protoreflect.Message { + mi := &file_user_attributes_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MutationCommand.ProtoReflect.Descriptor instead. +func (*MutationCommand) Descriptor() ([]byte, []int) { + return file_user_attributes_proto_rawDescGZIP(), []int{2} +} + +func (x *MutationCommand) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *MutationCommand) GetUnknown() int32 { + if x != nil { + return x.Unknown + } + return 0 +} + +var File_user_attributes_proto protoreflect.FileDescriptor + +var file_user_attributes_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9f, 0x01, 0x0a, 0x16, 0x55, 0x73, 0x65, 0x72, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x43, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x22, 0x22, 0x0a, 0x0c, 0x4d, 0x75, 0x74, 0x61, + 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x0f, + 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, + 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x25, 0x48, 0x02, 0x5a, 0x21, 0x74, 0x75, 0x78, + 0x70, 0x61, 0x2e, 0x69, 0x6e, 0x2f, 0x61, 0x2f, 0x67, 0x6f, 0x70, 0x6c, 0x61, 0x79, 0x64, 0x2f, + 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x70, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_user_attributes_proto_rawDescOnce sync.Once + file_user_attributes_proto_rawDescData = file_user_attributes_proto_rawDesc +) + +func file_user_attributes_proto_rawDescGZIP() []byte { + file_user_attributes_proto_rawDescOnce.Do(func() { + file_user_attributes_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_attributes_proto_rawDescData) + }) + return file_user_attributes_proto_rawDescData +} + +var file_user_attributes_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_user_attributes_proto_goTypes = []interface{}{ + (*UserAttributesMutation)(nil), // 0: spotify.user_attributes.proto.UserAttributesMutation + (*MutatedField)(nil), // 1: spotify.user_attributes.proto.MutatedField + (*MutationCommand)(nil), // 2: spotify.user_attributes.proto.MutationCommand +} +var file_user_attributes_proto_depIdxs = []int32{ + 1, // 0: spotify.user_attributes.proto.UserAttributesMutation.fields:type_name -> spotify.user_attributes.proto.MutatedField + 2, // 1: spotify.user_attributes.proto.UserAttributesMutation.cmd:type_name -> spotify.user_attributes.proto.MutationCommand + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_user_attributes_proto_init() } +func file_user_attributes_proto_init() { + if File_user_attributes_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_user_attributes_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserAttributesMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_attributes_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MutatedField); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_attributes_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MutationCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_user_attributes_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_user_attributes_proto_goTypes, + DependencyIndexes: file_user_attributes_proto_depIdxs, + MessageInfos: file_user_attributes_proto_msgTypes, + }.Build() + File_user_attributes_proto = out.File + file_user_attributes_proto_rawDesc = nil + file_user_attributes_proto_goTypes = nil + file_user_attributes_proto_depIdxs = nil +} diff --git a/lib/spot/proto/user_attributes.proto b/lib/spot/proto/user_attributes.proto new file mode 100644 index 0000000..8053255 --- /dev/null +++ b/lib/spot/proto/user_attributes.proto @@ -0,0 +1,30 @@ +// Custom protobuf crafted from spotify:user:attributes:mutated response: +// +// 1 { +// 1: "filter-explicit-content" +// } +// 2 { +// 1: 1639087299 +// 2: 418909000 +// } + +syntax = "proto3"; + +package spotify.user_attributes.proto; + +option optimize_for = CODE_SIZE; +option go_package = "tuxpa.in/a/goplayd/lib/spot/proto"; + +message UserAttributesMutation { + repeated MutatedField fields = 1; + MutationCommand cmd = 2; +} + +message MutatedField { + string name = 1; +} + +message MutationCommand { + int64 timestamp = 1; + int32 unknown = 2; +} diff --git a/lib/spot/proto/useraccount.proto b/lib/spot/proto/useraccount.proto new file mode 100644 index 0000000..ca8fea9 --- /dev/null +++ b/lib/spot/proto/useraccount.proto @@ -0,0 +1,15 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.remote_config.ucs.proto; + +option optimize_for = CODE_SIZE; + +message AccountAttribute { + oneof value { + bool bool_value = 2; + int64 long_value = 3; + string string_value = 4; + } +} diff --git a/lib/spot/proto/your_library_contains_request.proto b/lib/spot/proto/your_library_contains_request.proto new file mode 100644 index 0000000..bbb43c2 --- /dev/null +++ b/lib/spot/proto/your_library_contains_request.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +import "your_library_pseudo_playlist_config.proto"; + +option optimize_for = CODE_SIZE; + +message YourLibraryContainsRequest { + repeated string requested_uri = 3; + YourLibraryPseudoPlaylistConfig pseudo_playlist_config = 4; +} diff --git a/lib/spot/proto/your_library_contains_response.proto b/lib/spot/proto/your_library_contains_response.proto new file mode 100644 index 0000000..641d71a --- /dev/null +++ b/lib/spot/proto/your_library_contains_response.proto @@ -0,0 +1,22 @@ +// Extracted from: Spotify 1.1.61.583 (Windows) + +syntax = "proto3"; + +package spotify.your_library.proto; + +option optimize_for = CODE_SIZE; + +message YourLibraryContainsResponseHeader { + bool is_loading = 2; +} + +message YourLibraryContainsResponseEntity { + string uri = 1; + bool is_in_library = 2; +} + +message YourLibraryContainsResponse { + YourLibraryContainsResponseHeader header = 1; + repeated YourLibraryContainsResponseEntity entity = 2; + string error = 99; +} diff --git a/lib/spot/proto/your_library_decorate_request.proto b/lib/spot/proto/your_library_decorate_request.proto new file mode 100644 index 0000000..6b77a97 --- /dev/null +++ b/lib/spot/proto/your_library_decorate_request.proto @@ -0,0 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +import "your_library_pseudo_playlist_config.proto"; + +option optimize_for = CODE_SIZE; + +message YourLibraryDecorateRequest { + repeated string requested_uri = 3; + YourLibraryPseudoPlaylistConfig pseudo_playlist_config = 6; +} diff --git a/lib/spot/proto/your_library_decorate_response.proto b/lib/spot/proto/your_library_decorate_response.proto new file mode 100644 index 0000000..125d5c3 --- /dev/null +++ b/lib/spot/proto/your_library_decorate_response.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +import "your_library_decorated_entity.proto"; + +option optimize_for = CODE_SIZE; + +message YourLibraryDecorateResponseHeader { + bool is_loading = 2; +} + +message YourLibraryDecorateResponse { + YourLibraryDecorateResponseHeader header = 1; + repeated YourLibraryDecoratedEntity entity = 2; + string error = 99; +} diff --git a/lib/spot/proto/your_library_decorated_entity.proto b/lib/spot/proto/your_library_decorated_entity.proto new file mode 100644 index 0000000..c31b45e --- /dev/null +++ b/lib/spot/proto/your_library_decorated_entity.proto @@ -0,0 +1,105 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +option optimize_for = CODE_SIZE; + +message YourLibraryEntityInfo { + string key = 1; + string name = 2; + string uri = 3; + string group_label = 5; + string image_uri = 6; + bool pinned = 7; + + Pinnable pinnable = 8; + enum Pinnable { + YES = 0; + NO_IN_FOLDER = 1; + } + + Offline.Availability offline_availability = 9; +} + +message Offline { + enum Availability { + UNKNOWN = 0; + NO = 1; + YES = 2; + DOWNLOADING = 3; + WAITING = 4; + } +} + +message YourLibraryAlbumExtraInfo { + string artist_name = 1; +} + +message YourLibraryArtistExtraInfo { + +} + +message YourLibraryPlaylistExtraInfo { + string creator_name = 1; + bool is_loading = 5; + bool can_view = 6; +} + +message YourLibraryShowExtraInfo { + string creator_name = 1; + int64 publish_date = 4; + bool is_music_and_talk = 5; + int32 number_of_downloaded_episodes = 6; +} + +message YourLibraryFolderExtraInfo { + int32 number_of_playlists = 2; + int32 number_of_folders = 3; +} + +message YourLibraryLikedSongsExtraInfo { + int32 number_of_songs = 3; +} + +message YourLibraryYourEpisodesExtraInfo { + int32 number_of_downloaded_episodes = 4; +} + +message YourLibraryNewEpisodesExtraInfo { + int64 publish_date = 1; +} + +message YourLibraryLocalFilesExtraInfo { + int32 number_of_files = 1; +} + +message YourLibraryBookExtraInfo { + string author_name = 1; +} + +message YourLibraryDecoratedEntity { + YourLibraryEntityInfo entity_info = 1; + + oneof entity { + YourLibraryAlbumExtraInfo album = 2; + YourLibraryArtistExtraInfo artist = 3; + YourLibraryPlaylistExtraInfo playlist = 4; + YourLibraryShowExtraInfo show = 5; + YourLibraryFolderExtraInfo folder = 6; + YourLibraryLikedSongsExtraInfo liked_songs = 8; + YourLibraryYourEpisodesExtraInfo your_episodes = 9; + YourLibraryNewEpisodesExtraInfo new_episodes = 10; + YourLibraryLocalFilesExtraInfo local_files = 11; + YourLibraryBookExtraInfo book = 12; + } +} + +message YourLibraryAvailableEntityTypes { + bool albums = 1; + bool artists = 2; + bool playlists = 3; + bool shows = 4; + bool books = 5; +} diff --git a/lib/spot/proto/your_library_entity.proto b/lib/spot/proto/your_library_entity.proto new file mode 100644 index 0000000..897fc6c --- /dev/null +++ b/lib/spot/proto/your_library_entity.proto @@ -0,0 +1,32 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +import "your_library_index.proto"; +import "collection_index.proto"; + +option optimize_for = CODE_SIZE; + +message YourLibraryShowWrapper { + collection.proto.CollectionAlbumLikeEntry show = 1; + string uri = 2; +} + +message YourLibraryBookWrapper { + collection.proto.CollectionAlbumLikeEntry book = 1; + string uri = 2; +} + +message YourLibraryEntity { + bool pinned = 1; + + oneof entity { + collection.proto.CollectionAlbumLikeEntry album = 2; + collection.proto.CollectionArtistEntry artist = 3; + YourLibraryRootlistEntity rootlist_entity = 4; + YourLibraryShowWrapper show = 7; + YourLibraryBookWrapper book = 8; + } +} diff --git a/lib/spot/proto/your_library_index.proto b/lib/spot/proto/your_library_index.proto new file mode 100644 index 0000000..835c0fa --- /dev/null +++ b/lib/spot/proto/your_library_index.proto @@ -0,0 +1,43 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +option optimize_for = CODE_SIZE; + +message YourLibraryRootlistPlaylist { + string image_uri = 1; + bool is_loading = 3; + int32 rootlist_index = 4; + bool can_view = 5; +} + +message YourLibraryRootlistFolder { + int32 number_of_playlists = 1; + int32 number_of_folders = 2; + int32 rootlist_index = 3; +} + +message YourLibraryRootlistCollection { + Kind kind = 1; + enum Kind { + LIKED_SONGS = 0; + YOUR_EPISODES = 1; + NEW_EPISODES = 2; + LOCAL_FILES = 3; + } +} + +message YourLibraryRootlistEntity { + string uri = 1; + string name = 2; + string creator_name = 3; + int64 add_time = 4; + + oneof entity { + YourLibraryRootlistPlaylist playlist = 5; + YourLibraryRootlistFolder folder = 6; + YourLibraryRootlistCollection collection = 7; + } +} diff --git a/lib/spot/proto/your_library_pseudo_playlist_config.proto b/lib/spot/proto/your_library_pseudo_playlist_config.proto new file mode 100644 index 0000000..77c9bb5 --- /dev/null +++ b/lib/spot/proto/your_library_pseudo_playlist_config.proto @@ -0,0 +1,19 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +option optimize_for = CODE_SIZE; + +message YourLibraryLabelAndImage { + string label = 1; + string image = 2; +} + +message YourLibraryPseudoPlaylistConfig { + YourLibraryLabelAndImage liked_songs = 1; + YourLibraryLabelAndImage your_episodes = 2; + YourLibraryLabelAndImage new_episodes = 3; + YourLibraryLabelAndImage local_files = 4; +} diff --git a/lib/spot/proto/your_library_request.proto b/lib/spot/proto/your_library_request.proto new file mode 100644 index 0000000..917a1ad --- /dev/null +++ b/lib/spot/proto/your_library_request.proto @@ -0,0 +1,18 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +import "your_library_pseudo_playlist_config.proto"; + +option optimize_for = CODE_SIZE; + +message YourLibraryRequestHeader { + bool remaining_entities = 9; +} + +message YourLibraryRequest { + YourLibraryRequestHeader header = 1; + YourLibraryPseudoPlaylistConfig pseudo_playlist_config = 4; +} diff --git a/lib/spot/proto/your_library_response.proto b/lib/spot/proto/your_library_response.proto new file mode 100644 index 0000000..c354ff5 --- /dev/null +++ b/lib/spot/proto/your_library_response.proto @@ -0,0 +1,23 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + +syntax = "proto3"; + +package spotify.your_library.proto; + +import "your_library_decorated_entity.proto"; + +option optimize_for = CODE_SIZE; + +message YourLibraryResponseHeader { + int32 remaining_entities = 9; + bool is_loading = 12; + YourLibraryAvailableEntityTypes has = 13; + YourLibraryAvailableEntityTypes has_downloaded = 14; + string folder_name = 15; +} + +message YourLibraryResponse { + YourLibraryResponseHeader header = 1; + repeated YourLibraryDecoratedEntity entity = 2; + string error = 99; +}