diff --git a/metadata/src/episode.rs b/metadata/src/episode.rs index 35d6ed8f..30c89f19 100644 --- a/metadata/src/episode.rs +++ b/metadata/src/episode.rs @@ -8,6 +8,7 @@ use crate::{ item::{AudioItem, AudioItemResult, InnerAudioItem}, }, availability::Availabilities, + content_rating::ContentRatings, date::Date, error::{MetadataError, RequestError}, image::Images, @@ -48,6 +49,8 @@ pub struct Episode { pub external_url: String, pub episode_type: EpisodeType, pub has_music_and_talk: bool, + pub content_rating: ContentRatings, + pub is_audiobook_chapter: bool, } #[derive(Debug, Clone)] @@ -125,6 +128,8 @@ impl TryFrom<&::Message> for Episode { external_url: episode.get_external_url().to_owned(), episode_type: episode.get_field_type(), has_music_and_talk: episode.get_music_and_talk(), + content_rating: episode.get_content_rating().into(), + is_audiobook_chapter: episode.get_is_audiobook_chapter(), }) } } diff --git a/metadata/src/playlist/item.rs b/metadata/src/playlist/item.rs index 975a9840..de2dc6db 100644 --- a/metadata/src/playlist/item.rs +++ b/metadata/src/playlist/item.rs @@ -9,6 +9,8 @@ use super::attribute::{PlaylistAttributes, PlaylistItemAttributes}; use librespot_core::spotify_id::SpotifyId; use librespot_protocol as protocol; +use super::permission::Capabilities; + use protocol::playlist4_external::Item as PlaylistItemMessage; use protocol::playlist4_external::ListItems as PlaylistItemsMessage; use protocol::playlist4_external::MetaItem as PlaylistMetaItemMessage; @@ -44,6 +46,8 @@ pub struct PlaylistMetaItem { pub length: i32, pub timestamp: Date, pub owner_username: String, + pub has_abuse_reporting: bool, + pub capabilities: Capabilities, } #[derive(Debug, Clone)] @@ -89,6 +93,8 @@ impl TryFrom<&PlaylistMetaItemMessage> for PlaylistMetaItem { length: item.get_length(), timestamp: item.get_timestamp().try_into()?, owner_username: item.get_owner_username().to_owned(), + has_abuse_reporting: item.get_abuse_reporting_enabled(), + capabilities: item.get_capabilities().into(), }) } } diff --git a/metadata/src/playlist/list.rs b/metadata/src/playlist/list.rs index 7b5f0121..625373db 100644 --- a/metadata/src/playlist/list.rs +++ b/metadata/src/playlist/list.rs @@ -8,16 +8,31 @@ use crate::{ date::Date, error::MetadataError, request::{MercuryRequest, RequestResult}, - util::try_from_repeated_message, + util::{from_repeated_enum, try_from_repeated_message}, Metadata, }; -use super::{attribute::PlaylistAttributes, diff::PlaylistDiff, item::PlaylistItemList}; +use super::{ + attribute::PlaylistAttributes, diff::PlaylistDiff, item::PlaylistItemList, + permission::Capabilities, +}; use librespot_core::session::Session; use librespot_core::spotify_id::{NamedSpotifyId, SpotifyId}; use librespot_protocol as protocol; +use protocol::playlist4_external::GeoblockBlockingType as Geoblock; + +#[derive(Debug, Clone)] +pub struct Geoblocks(Vec); + +impl Deref for Geoblocks { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + #[derive(Debug, Clone)] pub struct Playlist { pub id: NamedSpotifyId, @@ -33,6 +48,8 @@ pub struct Playlist { pub nonces: Vec, pub timestamp: Date, pub has_abuse_reporting: bool, + pub capabilities: Capabilities, + pub geoblocks: Geoblocks, } #[derive(Debug, Clone)] @@ -70,6 +87,8 @@ pub struct SelectedListContent { pub timestamp: Date, pub owner_username: String, pub has_abuse_reporting: bool, + pub capabilities: Capabilities, + pub geoblocks: Geoblocks, } impl Playlist { @@ -153,6 +172,8 @@ impl Metadata for Playlist { nonces: playlist.nonces, timestamp: playlist.timestamp, has_abuse_reporting: playlist.has_abuse_reporting, + capabilities: playlist.capabilities, + geoblocks: playlist.geoblocks, }) } } @@ -194,8 +215,11 @@ impl TryFrom<&::Message> for SelectedListContent { timestamp: playlist.get_timestamp().try_into()?, owner_username: playlist.get_owner_username().to_owned(), has_abuse_reporting: playlist.get_abuse_reporting_enabled(), + capabilities: playlist.get_capabilities().into(), + geoblocks: playlist.get_geoblock().into(), }) } } +from_repeated_enum!(Geoblock, Geoblocks); try_from_repeated_message!(Vec, Playlists); diff --git a/metadata/src/playlist/mod.rs b/metadata/src/playlist/mod.rs index c52e637b..d2b66731 100644 --- a/metadata/src/playlist/mod.rs +++ b/metadata/src/playlist/mod.rs @@ -4,6 +4,7 @@ pub mod diff; pub mod item; pub mod list; pub mod operation; +pub mod permission; pub use annotation::PlaylistAnnotation; pub use list::Playlist; diff --git a/metadata/src/playlist/permission.rs b/metadata/src/playlist/permission.rs new file mode 100644 index 00000000..163859a1 --- /dev/null +++ b/metadata/src/playlist/permission.rs @@ -0,0 +1,44 @@ +use std::fmt::Debug; +use std::ops::Deref; + +use crate::util::from_repeated_enum; + +use librespot_protocol as protocol; + +use protocol::playlist_permission::Capabilities as CapabilitiesMessage; +use protocol::playlist_permission::PermissionLevel; + +#[derive(Debug, Clone)] +pub struct Capabilities { + pub can_view: bool, + pub can_administrate_permissions: bool, + pub grantable_levels: PermissionLevels, + pub can_edit_metadata: bool, + pub can_edit_items: bool, + pub can_cancel_membership: bool, +} + +#[derive(Debug, Clone)] +pub struct PermissionLevels(pub Vec); + +impl Deref for PermissionLevels { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From<&CapabilitiesMessage> for Capabilities { + fn from(playlist: &CapabilitiesMessage) -> Self { + Self { + can_view: playlist.get_can_view(), + can_administrate_permissions: playlist.get_can_administrate_permissions(), + grantable_levels: playlist.get_grantable_level().into(), + can_edit_metadata: playlist.get_can_edit_metadata(), + can_edit_items: playlist.get_can_edit_items(), + can_cancel_membership: playlist.get_can_cancel_membership(), + } + } +} + +from_repeated_enum!(PermissionLevel, PermissionLevels); diff --git a/metadata/src/show.rs b/metadata/src/show.rs index 4e75c598..f69ee021 100644 --- a/metadata/src/show.rs +++ b/metadata/src/show.rs @@ -31,6 +31,7 @@ pub struct Show { pub availability: Availabilities, pub trailer_uri: SpotifyId, pub has_music_and_talk: bool, + pub is_audiobook: bool, } #[async_trait] @@ -70,6 +71,7 @@ impl TryFrom<&::Message> for Show { availability: show.get_availability().into(), trailer_uri: SpotifyId::from_uri(show.get_trailer_uri())?, has_music_and_talk: show.get_music_and_talk(), + is_audiobook: show.get_is_audiobook(), }) } } diff --git a/protocol/build.rs b/protocol/build.rs index 560bbfea..2a763183 100644 --- a/protocol/build.rs +++ b/protocol/build.rs @@ -24,11 +24,13 @@ fn compile() { proto_dir.join("metadata.proto"), proto_dir.join("player.proto"), proto_dir.join("playlist_annotate3.proto"), + proto_dir.join("playlist_permission.proto"), proto_dir.join("playlist4_external.proto"), // TODO: remove these legacy protobufs when we are on the new API completely proto_dir.join("authentication.proto"), proto_dir.join("canvaz.proto"), proto_dir.join("canvaz-meta.proto"), + proto_dir.join("explicit_content_pubsub.proto"), proto_dir.join("keyexchange.proto"), proto_dir.join("mercury.proto"), proto_dir.join("pubsub.proto"), diff --git a/protocol/proto/AdContext.proto b/protocol/proto/AdContext.proto new file mode 100644 index 00000000..ba56bd00 --- /dev/null +++ b/protocol/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/protocol/proto/AdEvent.proto b/protocol/proto/AdEvent.proto index 4b0a3059..69cf82bb 100644 --- a/protocol/proto/AdEvent.proto +++ b/protocol/proto/AdEvent.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -24,4 +24,5 @@ message AdEvent { optional int32 duration = 15; optional bool in_focus = 16; optional float volume = 17; + optional string product_name = 18; } diff --git a/protocol/proto/CacheError.proto b/protocol/proto/CacheError.proto index 8da6196d..ad85c342 100644 --- a/protocol/proto/CacheError.proto +++ b/protocol/proto/CacheError.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -13,4 +13,7 @@ message CacheError { 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/protocol/proto/CacheReport.proto b/protocol/proto/CacheReport.proto index c8666ca3..ac034059 100644 --- a/protocol/proto/CacheReport.proto +++ b/protocol/proto/CacheReport.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -8,6 +8,8 @@ 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; diff --git a/protocol/proto/ConnectionStateChange.proto b/protocol/proto/ConnectionStateChange.proto new file mode 100644 index 00000000..28e517c0 --- /dev/null +++ b/protocol/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/protocol/proto/DesktopDeviceInformation.proto b/protocol/proto/DesktopDeviceInformation.proto new file mode 100644 index 00000000..be503177 --- /dev/null +++ b/protocol/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/protocol/proto/DesktopPerformanceIssue.proto b/protocol/proto/DesktopPerformanceIssue.proto new file mode 100644 index 00000000..4e70b435 --- /dev/null +++ b/protocol/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/protocol/proto/Download.proto b/protocol/proto/Download.proto index 417236bd..0b3faee9 100644 --- a/protocol/proto/Download.proto +++ b/protocol/proto/Download.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -50,4 +50,6 @@ message Download { 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/protocol/proto/EventSenderStats2NonAuth.proto b/protocol/proto/EventSenderStats2NonAuth.proto new file mode 100644 index 00000000..e55eaa66 --- /dev/null +++ b/protocol/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/protocol/proto/HeadFileDownload.proto b/protocol/proto/HeadFileDownload.proto index acfa87fa..b0d72794 100644 --- a/protocol/proto/HeadFileDownload.proto +++ b/protocol/proto/HeadFileDownload.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -23,4 +23,5 @@ message HeadFileDownload { 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/protocol/proto/LegacyEndSong.proto b/protocol/proto/LegacyEndSong.proto new file mode 100644 index 00000000..9366f18d --- /dev/null +++ b/protocol/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/protocol/proto/LocalFilesError.proto b/protocol/proto/LocalFilesError.proto index 49347341..f49d805f 100644 --- a/protocol/proto/LocalFilesError.proto +++ b/protocol/proto/LocalFilesError.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -9,4 +9,5 @@ option optimize_for = CODE_SIZE; message LocalFilesError { optional int64 error_code = 1; optional string context = 2; + optional string info = 3; } diff --git a/protocol/proto/LocalFilesImport.proto b/protocol/proto/LocalFilesImport.proto index 4deff70f..4674e721 100644 --- a/protocol/proto/LocalFilesImport.proto +++ b/protocol/proto/LocalFilesImport.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -12,4 +12,5 @@ message LocalFilesImport { optional int64 failed_tracks = 3; optional int64 matched_tracks = 4; optional string source = 5; + optional int64 invalid_tracks = 6; } diff --git a/protocol/proto/MercuryCacheReport.proto b/protocol/proto/MercuryCacheReport.proto deleted file mode 100644 index 4c9e494f..00000000 --- a/protocol/proto/MercuryCacheReport.proto +++ /dev/null @@ -1,20 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto2"; - -package spotify.event_sender.proto; - -option optimize_for = CODE_SIZE; - -message MercuryCacheReport { - optional int64 mercury_cache_version = 1; - optional int64 num_items = 2; - optional int64 num_locked_items = 3; - optional int64 num_expired_items = 4; - optional int64 num_lock_ids = 5; - optional int64 num_expired_lock_ids = 6; - optional int64 max_size = 7; - optional int64 total_size = 8; - optional int64 used_size = 9; - optional int64 free_size = 10; -} diff --git a/protocol/proto/ModuleDebug.proto b/protocol/proto/ModuleDebug.proto deleted file mode 100644 index 87691cd4..00000000 --- a/protocol/proto/ModuleDebug.proto +++ /dev/null @@ -1,11 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto2"; - -package spotify.event_sender.proto; - -option optimize_for = CODE_SIZE; - -message ModuleDebug { - optional string blob = 1; -} diff --git a/protocol/proto/OfflineUserPwdLoginNonAuth.proto b/protocol/proto/OfflineUserPwdLoginNonAuth.proto deleted file mode 100644 index 2932bd56..00000000 --- a/protocol/proto/OfflineUserPwdLoginNonAuth.proto +++ /dev/null @@ -1,11 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto2"; - -package spotify.event_sender.proto; - -option optimize_for = CODE_SIZE; - -message OfflineUserPwdLoginNonAuth { - optional string connection_type = 1; -} diff --git a/protocol/proto/RawCoreStream.proto b/protocol/proto/RawCoreStream.proto new file mode 100644 index 00000000..848b945b --- /dev/null +++ b/protocol/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/protocol/proto/anchor_extended_metadata.proto b/protocol/proto/anchor_extended_metadata.proto deleted file mode 100644 index 24d715a3..00000000 --- a/protocol/proto/anchor_extended_metadata.proto +++ /dev/null @@ -1,14 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto3"; - -package spotify.anchor.extension; - -option objc_class_prefix = "SPT"; -option java_multiple_files = true; -option java_outer_classname = "AnchorExtensionProviderProto"; -option java_package = "com.spotify.anchorextensionprovider.proto"; - -message PodcastCounter { - uint32 counter = 1; -} diff --git a/protocol/proto/apiv1.proto b/protocol/proto/apiv1.proto index deffc3d6..2d8b9c28 100644 --- a/protocol/proto/apiv1.proto +++ b/protocol/proto/apiv1.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// No longer present in Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -39,11 +39,6 @@ message RemoveDeviceRequest { bool is_force_remove = 2; } -message RemoveDeviceResponse { - bool pending = 1; - Device device = 2; -} - message OfflineEnableDeviceResponse { Restrictions restrictions = 1; } diff --git a/protocol/proto/app_state.proto b/protocol/proto/app_state.proto new file mode 100644 index 00000000..fb4b07a4 --- /dev/null +++ b/protocol/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/protocol/proto/autodownload_backend_service.proto b/protocol/proto/autodownload_backend_service.proto new file mode 100644 index 00000000..fa088feb --- /dev/null +++ b/protocol/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/protocol/proto/autodownload_config_common.proto b/protocol/proto/autodownload_config_common.proto new file mode 100644 index 00000000..9d923f04 --- /dev/null +++ b/protocol/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/protocol/proto/autodownload_config_get_request.proto b/protocol/proto/autodownload_config_get_request.proto new file mode 100644 index 00000000..be4681bb --- /dev/null +++ b/protocol/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/protocol/proto/autodownload_config_set_request.proto b/protocol/proto/autodownload_config_set_request.proto new file mode 100644 index 00000000..2adcbeab --- /dev/null +++ b/protocol/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/protocol/proto/automix_mode.proto b/protocol/proto/automix_mode.proto index a4d7d66f..d0d7f938 100644 --- a/protocol/proto/automix_mode.proto +++ b/protocol/proto/automix_mode.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -6,8 +6,21 @@ 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 { @@ -18,4 +31,11 @@ enum AutomixStyle { RADIO_AIRBAG = 4; SLEEP = 5; MIXED = 6; + CUSTOM = 7; +} + +enum TransitionType { + CUEPOINTS = 0; + CROSSFADE = 1; + GAPLESS = 2; } diff --git a/protocol/proto/canvas_storage.proto b/protocol/proto/canvas_storage.proto new file mode 100644 index 00000000..e2f652c2 --- /dev/null +++ b/protocol/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/protocol/proto/canvaz-meta.proto b/protocol/proto/canvaz-meta.proto index 540daeb6..b3b55531 100644 --- a/protocol/proto/canvaz-meta.proto +++ b/protocol/proto/canvaz-meta.proto @@ -1,9 +1,12 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + syntax = "proto3"; -package com.spotify.canvaz; +package spotify.canvaz; +option java_multiple_files = true; option optimize_for = CODE_SIZE; -option java_package = "com.spotify.canvaz"; +option java_package = "com.spotify.canvaz.proto"; enum Type { IMAGE = 0; @@ -11,4 +14,4 @@ enum Type { VIDEO_LOOPING = 2; VIDEO_LOOPING_RANDOM = 3; GIF = 4; -} \ No newline at end of file +} diff --git a/protocol/proto/canvaz.proto b/protocol/proto/canvaz.proto index ca283ab5..2493da95 100644 --- a/protocol/proto/canvaz.proto +++ b/protocol/proto/canvaz.proto @@ -1,11 +1,14 @@ +// Extracted from: Spotify 1.1.73.517 (macOS) + syntax = "proto3"; -package com.spotify.canvazcache; +package spotify.canvaz.cache; import "canvaz-meta.proto"; +option java_multiple_files = true; option optimize_for = CODE_SIZE; -option java_package = "com.spotify.canvaz"; +option java_package = "com.spotify.canvazcache.proto"; message Artist { string uri = 1; @@ -19,15 +22,16 @@ message EntityCanvazResponse { string id = 1; string url = 2; string file_id = 3; - com.spotify.canvaz.Type type = 4; + 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; } @@ -37,4 +41,4 @@ message EntityCanvazRequest { string entity_uri = 1; string etag = 2; } -} \ No newline at end of file +} diff --git a/protocol/proto/client-tts.proto b/protocol/proto/client-tts.proto new file mode 100644 index 00000000..0968f515 --- /dev/null +++ b/protocol/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/protocol/proto/client_config.proto b/protocol/proto/client_config.proto new file mode 100644 index 00000000..b838873e --- /dev/null +++ b/protocol/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/protocol/proto/cloud_host_messages.proto b/protocol/proto/cloud_host_messages.proto deleted file mode 100644 index 49949188..00000000 --- a/protocol/proto/cloud_host_messages.proto +++ /dev/null @@ -1,152 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto3"; - -package spotify.social_listening.cloud_host; - -option objc_class_prefix = "CloudHost"; -option optimize_for = CODE_SIZE; -option java_package = "com.spotify.social_listening.cloud_host"; - -message LookupSessionRequest { - string token = 1; - JoinType join_type = 2; -} - -message LookupSessionResponse { - oneof response { - Session session = 1; - ErrorCode error = 2; - } -} - -message CreateSessionRequest { - -} - -message CreateSessionResponse { - oneof response { - Session session = 1; - ErrorCode error = 2; - } -} - -message DeleteSessionRequest { - string session_id = 1; -} - -message DeleteSessionResponse { - oneof response { - Session session = 1; - ErrorCode error = 2; - } -} - -message JoinSessionRequest { - string join_token = 1; - Experience experience = 3; -} - -message JoinSessionResponse { - oneof response { - Session session = 1; - ErrorCode error = 2; - } -} - -message LeaveSessionRequest { - string session_id = 1; -} - -message LeaveSessionResponse { - oneof response { - Session session = 1; - ErrorCode error = 2; - } -} - -message GetCurrentSessionRequest { - -} - -message GetCurrentSessionResponse { - oneof response { - Session session = 1; - ErrorCode error = 2; - } -} - -message SessionUpdateRequest { - -} - -message SessionUpdate { - Session session = 1; - SessionUpdateReason reason = 3; - repeated SessionMember updated_session_members = 4; -} - -message SessionUpdateResponse { - oneof response { - SessionUpdate session_update = 1; - ErrorCode error = 2; - } -} - -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 = 8; -} - -message SessionMember { - int64 timestamp = 1; - string member_id = 2; - string username = 3; - string display_name = 4; - string image_url = 5; - string large_image_url = 6; - bool current_user = 7; -} - -enum JoinType { - NotSpecified = 0; - Scanning = 1; - DeepLinking = 2; - DiscoveredDevice = 3; - Frictionless = 4; - NearbyWifi = 5; -} - -enum ErrorCode { - Unknown = 0; - ParseError = 1; - JoinFailed = 1000; - SessionFull = 1001; - FreeUser = 1002; - ScannableError = 1003; - JoinExpiredSession = 1004; - NoExistingSession = 1005; -} - -enum Experience { - UNKNOWN = 0; - BEETHOVEN = 1; - BACH = 2; -} - -enum SessionUpdateReason { - UNKNOWN_UPDATE_REASON = 0; - NEW_SESSION = 1; - USER_JOINED = 2; - USER_LEFT = 3; - SESSION_DELETED = 4; - YOU_LEFT = 5; - YOU_WERE_KICKED = 6; - YOU_JOINED = 7; -} diff --git a/protocol/proto/collection/episode_collection_state.proto b/protocol/proto/collection/episode_collection_state.proto index 403bfbb4..56fcc533 100644 --- a/protocol/proto/collection/episode_collection_state.proto +++ b/protocol/proto/collection/episode_collection_state.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; diff --git a/protocol/proto/collection_add_remove_items_request.proto b/protocol/proto/collection_add_remove_items_request.proto new file mode 100644 index 00000000..4dac680e --- /dev/null +++ b/protocol/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/protocol/proto/collection_ban_request.proto b/protocol/proto/collection_ban_request.proto new file mode 100644 index 00000000..e64220df --- /dev/null +++ b/protocol/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/protocol/proto/collection_decoration_policy.proto b/protocol/proto/collection_decoration_policy.proto new file mode 100644 index 00000000..79b4b8cf --- /dev/null +++ b/protocol/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/protocol/proto/collection_get_bans_request.proto b/protocol/proto/collection_get_bans_request.proto new file mode 100644 index 00000000..a67574ae --- /dev/null +++ b/protocol/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/protocol/proto/collection_index.proto b/protocol/proto/collection_index.proto index 5af95a35..ee6b3efc 100644 --- a/protocol/proto/collection_index.proto +++ b/protocol/proto/collection_index.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -12,7 +12,7 @@ message IndexRepairerState { } message CollectionTrackEntry { - string track_uri = 1; + string uri = 1; string track_name = 2; string album_uri = 3; string album_name = 4; @@ -23,18 +23,16 @@ message CollectionTrackEntry { int64 add_time = 9; } -message CollectionAlbumEntry { - string album_uri = 1; +message CollectionAlbumLikeEntry { + string uri = 1; string album_name = 2; - string album_image_uri = 3; - string artist_uri = 4; - string artist_name = 5; + string creator_uri = 4; + string creator_name = 5; int64 add_time = 6; } -message CollectionMetadataMigratorState { - bytes last_checked_key = 1; - bool migrated_tracks = 2; - bool migrated_albums = 3; - bool migrated_album_tracks = 4; +message CollectionArtistEntry { + string uri = 1; + string artist_name = 2; + int64 add_time = 4; } diff --git a/protocol/proto/collection_item.proto b/protocol/proto/collection_item.proto new file mode 100644 index 00000000..4a98e9d0 --- /dev/null +++ b/protocol/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/protocol/proto/collection_platform_requests.proto b/protocol/proto/collection_platform_requests.proto index efe9a847..a855c217 100644 --- a/protocol/proto/collection_platform_requests.proto +++ b/protocol/proto/collection_platform_requests.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -6,10 +6,6 @@ package spotify.collection_platform.proto; option optimize_for = CODE_SIZE; -message CollectionPlatformSimpleRequest { - CollectionSet set = 1; -} - message CollectionPlatformItemsRequest { CollectionSet set = 1; repeated string items = 2; @@ -21,4 +17,5 @@ enum CollectionSet { BAN = 2; LISTENLATER = 3; IGNOREINRECS = 4; + ENHANCED = 5; } diff --git a/protocol/proto/collection_platform_responses.proto b/protocol/proto/collection_platform_responses.proto index fd236c12..6b7716d8 100644 --- a/protocol/proto/collection_platform_responses.proto +++ b/protocol/proto/collection_platform_responses.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -10,8 +10,13 @@ message CollectionPlatformSimpleResponse { string error_msg = 1; } +message CollectionPlatformItem { + string uri = 1; + int64 add_time = 2; +} + message CollectionPlatformItemsResponse { - repeated string items = 1; + repeated CollectionPlatformItem items = 1; } message CollectionPlatformContainsResponse { diff --git a/protocol/proto/collection_storage.proto b/protocol/proto/collection_storage.proto deleted file mode 100644 index 1dd4f034..00000000 --- a/protocol/proto/collection_storage.proto +++ /dev/null @@ -1,20 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto2"; - -package spotify.collection.proto.storage; - -import "collection2.proto"; - -option optimize_for = CODE_SIZE; - -message CollectionHeader { - optional bytes etag = 1; -} - -message CollectionCache { - optional CollectionHeader header = 1; - optional CollectionItems collection = 2; - optional CollectionItems pending = 3; - optional uint32 collection_item_limit = 4; -} diff --git a/protocol/proto/composite_formats_node.proto b/protocol/proto/composite_formats_node.proto deleted file mode 100644 index 75717c98..00000000 --- a/protocol/proto/composite_formats_node.proto +++ /dev/null @@ -1,31 +0,0 @@ -// 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 InjectionSegment { - required string track_uri = 1; - optional int64 start = 2; - optional int64 stop = 3; - required int64 duration = 4; -} - -message InjectionModel { - required string episode_uri = 1; - required int64 total_duration = 2; - repeated InjectionSegment segments = 3; -} - -message CompositeFormatsPrototypeNode { - required string mode = 1; - optional InjectionModel injection_model = 2; - required uint32 index = 3; - required TrackInstantiator instantiator = 4; - optional TrackInstance track = 5; -} diff --git a/protocol/proto/connect.proto b/protocol/proto/connect.proto index dae2561a..d6485252 100644 --- a/protocol/proto/connect.proto +++ b/protocol/proto/connect.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -87,6 +87,9 @@ message DeviceInfo { 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; @@ -133,8 +136,9 @@ message Capabilities { 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"; + //reserved 1, 4, 24, "supported_contexts", "supports_lossless_audio"; } message CapabilitySupportDetails { diff --git a/protocol/proto/context_application_desktop.proto b/protocol/proto/context_application_desktop.proto new file mode 100644 index 00000000..04f443b2 --- /dev/null +++ b/protocol/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/protocol/proto/context_core.proto b/protocol/proto/context_core.proto deleted file mode 100644 index 1e49afaf..00000000 --- a/protocol/proto/context_core.proto +++ /dev/null @@ -1,14 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto3"; - -package spotify.event_sender.proto; - -option optimize_for = CODE_SIZE; - -message Core { - string os_name = 1; - string os_version = 2; - string device_id = 3; - string client_version = 4; -} diff --git a/protocol/proto/context_device_desktop.proto b/protocol/proto/context_device_desktop.proto new file mode 100644 index 00000000..a6b38372 --- /dev/null +++ b/protocol/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/protocol/proto/context_node.proto b/protocol/proto/context_node.proto index 8ff3cb28..82dd9d62 100644 --- a/protocol/proto/context_node.proto +++ b/protocol/proto/context_node.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -20,4 +20,5 @@ message ContextNode { optional ContextProcessor context_processor = 6; optional string session_id = 7; optional sint32 iteration = 8; + optional bool pending_pause = 9; } diff --git a/protocol/proto/context_player_ng.proto b/protocol/proto/context_player_ng.proto deleted file mode 100644 index e61f011e..00000000 --- a/protocol/proto/context_player_ng.proto +++ /dev/null @@ -1,12 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto2"; - -package spotify.player.proto; - -option optimize_for = CODE_SIZE; - -message ContextPlayerNg { - map player_model = 1; - optional uint64 playback_position = 2; -} diff --git a/protocol/proto/context_sdk.proto b/protocol/proto/context_sdk.proto index dc5d3236..419f7aa5 100644 --- a/protocol/proto/context_sdk.proto +++ b/protocol/proto/context_sdk.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -8,4 +8,5 @@ option optimize_for = CODE_SIZE; message Sdk { string version_name = 1; + string type = 2; } diff --git a/protocol/proto/core_configuration_applied_non_auth.proto b/protocol/proto/core_configuration_applied_non_auth.proto deleted file mode 100644 index d7c132dc..00000000 --- a/protocol/proto/core_configuration_applied_non_auth.proto +++ /dev/null @@ -1,11 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto3"; - -package spotify.remote_config.proto; - -option optimize_for = CODE_SIZE; - -message CoreConfigurationAppliedNonAuth { - string configuration_assignment_id = 1; -} diff --git a/protocol/proto/cosmos_changes_request.proto b/protocol/proto/cosmos_changes_request.proto index 47cd584f..2e4b7040 100644 --- a/protocol/proto/cosmos_changes_request.proto +++ b/protocol/proto/cosmos_changes_request.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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/protocol/proto/cosmos_decorate_request.proto b/protocol/proto/cosmos_decorate_request.proto index 2709b30a..9e586021 100644 --- a/protocol/proto/cosmos_decorate_request.proto +++ b/protocol/proto/cosmos_decorate_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -22,6 +22,7 @@ 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 { diff --git a/protocol/proto/cosmos_get_album_list_request.proto b/protocol/proto/cosmos_get_album_list_request.proto index 741e9f49..448dcd46 100644 --- a/protocol/proto/cosmos_get_album_list_request.proto +++ b/protocol/proto/cosmos_get_album_list_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -8,6 +8,7 @@ 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 { diff --git a/protocol/proto/cosmos_get_artist_list_request.proto b/protocol/proto/cosmos_get_artist_list_request.proto index b8ccb662..1dfeedba 100644 --- a/protocol/proto/cosmos_get_artist_list_request.proto +++ b/protocol/proto/cosmos_get_artist_list_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -8,6 +8,7 @@ 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 { diff --git a/protocol/proto/cosmos_get_episode_list_request.proto b/protocol/proto/cosmos_get_episode_list_request.proto index 8168fbfe..437a621f 100644 --- a/protocol/proto/cosmos_get_episode_list_request.proto +++ b/protocol/proto/cosmos_get_episode_list_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -9,6 +9,7 @@ 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 { diff --git a/protocol/proto/cosmos_get_show_list_request.proto b/protocol/proto/cosmos_get_show_list_request.proto index 880f7cea..e2b8a578 100644 --- a/protocol/proto/cosmos_get_show_list_request.proto +++ b/protocol/proto/cosmos_get_show_list_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -8,6 +8,7 @@ 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 { diff --git a/protocol/proto/cosmos_get_tags_info_request.proto b/protocol/proto/cosmos_get_tags_info_request.proto index fe666025..5480c7bc 100644 --- a/protocol/proto/cosmos_get_tags_info_request.proto +++ b/protocol/proto/cosmos_get_tags_info_request.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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 { diff --git a/protocol/proto/cosmos_get_track_list_metadata_request.proto b/protocol/proto/cosmos_get_track_list_metadata_request.proto index 8a02c962..a4586249 100644 --- a/protocol/proto/cosmos_get_track_list_metadata_request.proto +++ b/protocol/proto/cosmos_get_track_list_metadata_request.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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 { diff --git a/protocol/proto/cosmos_get_track_list_request.proto b/protocol/proto/cosmos_get_track_list_request.proto index c92320f7..95c83410 100644 --- a/protocol/proto/cosmos_get_track_list_request.proto +++ b/protocol/proto/cosmos_get_track_list_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -9,6 +9,7 @@ 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 { diff --git a/protocol/proto/cosmos_get_unplayed_episodes_request.proto b/protocol/proto/cosmos_get_unplayed_episodes_request.proto index 8957ae56..09339c78 100644 --- a/protocol/proto/cosmos_get_unplayed_episodes_request.proto +++ b/protocol/proto/cosmos_get_unplayed_episodes_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -9,6 +9,7 @@ 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 { diff --git a/protocol/proto/decorate_request.proto b/protocol/proto/decorate_request.proto index cad3f526..ff1fa0ed 100644 --- a/protocol/proto/decorate_request.proto +++ b/protocol/proto/decorate_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -6,6 +6,7 @@ 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"; @@ -14,8 +15,11 @@ 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 { @@ -24,13 +28,14 @@ message Show { 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 show_cosmos.proto.EpisodePlayState episode_play_state = 4; + 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; @@ -38,6 +43,7 @@ message Episode { 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; } diff --git a/protocol/proto/dependencies/session_control.proto b/protocol/proto/dependencies/session_control.proto deleted file mode 100644 index f4e6d744..00000000 --- a/protocol/proto/dependencies/session_control.proto +++ /dev/null @@ -1,121 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto3"; - -package com.spotify.sessioncontrol.api.v1; - -option java_multiple_files = true; -option optimize_for = CODE_SIZE; -option java_package = "com.spotify.sessioncontrol.api.v1.proto"; - -service SessionControlService { - rpc GetCurrentSession(GetCurrentSessionRequest) returns (GetCurrentSessionResponse); - rpc GetCurrentSessionOrNew(GetCurrentSessionOrNewRequest) returns (GetCurrentSessionOrNewResponse); - rpc JoinSession(JoinSessionRequest) returns (JoinSessionResponse); - rpc GetSessionInfo(GetSessionInfoRequest) returns (GetSessionInfoResponse); - rpc LeaveSession(LeaveSessionRequest) returns (LeaveSessionResponse); - rpc EndSession(EndSessionRequest) returns (EndSessionResponse); - rpc VerifyCommand(VerifyCommandRequest) returns (VerifyCommandResponse); -} - -message SessionUpdate { - Session session = 1; - SessionUpdateReason reason = 2; - repeated SessionMember updated_session_members = 3; -} - -message GetCurrentSessionRequest { - -} - -message GetCurrentSessionResponse { - Session session = 1; -} - -message GetCurrentSessionOrNewRequest { - string fallback_device_id = 1; -} - -message GetCurrentSessionOrNewResponse { - Session session = 1; -} - -message JoinSessionRequest { - string join_token = 1; - string device_id = 2; - Experience experience = 3; -} - -message JoinSessionResponse { - Session session = 1; -} - -message GetSessionInfoRequest { - string join_token = 1; -} - -message GetSessionInfoResponse { - Session session = 1; -} - -message LeaveSessionRequest { - -} - -message LeaveSessionResponse { - -} - -message EndSessionRequest { - string session_id = 1; -} - -message EndSessionResponse { - -} - -message VerifyCommandRequest { - string session_id = 1; - string command = 2; -} - -message VerifyCommandResponse { - bool allowed = 1; -} - -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 = 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; -} - -enum SessionUpdateReason { - UNKNOWN_UPDATE_REASON = 0; - NEW_SESSION = 1; - USER_JOINED = 2; - USER_LEFT = 3; - SESSION_DELETED = 4; - YOU_LEFT = 5; - YOU_WERE_KICKED = 6; - YOU_JOINED = 7; -} - -enum Experience { - UNKNOWN = 0; - BEETHOVEN = 1; - BACH = 2; -} diff --git a/protocol/proto/display_segments_extension.proto b/protocol/proto/display_segments_extension.proto new file mode 100644 index 00000000..04714446 --- /dev/null +++ b/protocol/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/protocol/proto/es_command_options.proto b/protocol/proto/es_command_options.proto index c261ca27..0a37e801 100644 --- a/protocol/proto/es_command_options.proto +++ b/protocol/proto/es_command_options.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -12,4 +12,5 @@ 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/protocol/proto/es_ident.proto b/protocol/proto/es_ident.proto new file mode 100644 index 00000000..6c52abc2 --- /dev/null +++ b/protocol/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/protocol/proto/es_ident_filter.proto b/protocol/proto/es_ident_filter.proto new file mode 100644 index 00000000..19ccee40 --- /dev/null +++ b/protocol/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/protocol/proto/es_prefs.proto b/protocol/proto/es_prefs.proto new file mode 100644 index 00000000..f81916ca --- /dev/null +++ b/protocol/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/protocol/proto/es_pushed_message.proto b/protocol/proto/es_pushed_message.proto new file mode 100644 index 00000000..dd054f5f --- /dev/null +++ b/protocol/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/protocol/proto/es_remote_config.proto b/protocol/proto/es_remote_config.proto new file mode 100644 index 00000000..fca7f0f9 --- /dev/null +++ b/protocol/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/protocol/proto/es_request_info.proto b/protocol/proto/es_request_info.proto new file mode 100644 index 00000000..95b5cb81 --- /dev/null +++ b/protocol/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/protocol/proto/es_seek_to.proto b/protocol/proto/es_seek_to.proto index 0ef8aa4b..59073cf9 100644 --- a/protocol/proto/es_seek_to.proto +++ b/protocol/proto/es_seek_to.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -15,4 +15,11 @@ 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/protocol/proto/es_storage.proto b/protocol/proto/es_storage.proto new file mode 100644 index 00000000..c20b3be7 --- /dev/null +++ b/protocol/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/protocol/proto/event_entity.proto b/protocol/proto/event_entity.proto index 28ec0b5a..06239d59 100644 --- a/protocol/proto/event_entity.proto +++ b/protocol/proto/event_entity.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -7,12 +7,12 @@ package spotify.event_sender.proto; option optimize_for = CODE_SIZE; message EventEntity { - int32 file_format_version = 1; + uint32 file_format_version = 1; string event_name = 2; bytes sequence_id = 3; - int64 sequence_number = 4; + uint64 sequence_number = 4; bytes payload = 5; string owner = 6; bool authenticated = 7; - int64 record_id = 8; + uint64 record_id = 8; } diff --git a/protocol/proto/extension_descriptor_type.proto b/protocol/proto/extension_descriptor_type.proto index a2009d68..2ca05713 100644 --- a/protocol/proto/extension_descriptor_type.proto +++ b/protocol/proto/extension_descriptor_type.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -26,4 +26,5 @@ enum ExtensionDescriptorType { INSTRUMENT = 4; TIME = 5; ERA = 6; + AESTHETIC = 7; } diff --git a/protocol/proto/extension_kind.proto b/protocol/proto/extension_kind.proto index 97768b67..02444dea 100644 --- a/protocol/proto/extension_kind.proto +++ b/protocol/proto/extension_kind.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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; @@ -43,4 +44,11 @@ enum ExtensionKind { 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/protocol/proto/follow_request.proto b/protocol/proto/follow_request.proto new file mode 100644 index 00000000..5a026895 --- /dev/null +++ b/protocol/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/protocol/proto/followed_users_request.proto b/protocol/proto/followed_users_request.proto new file mode 100644 index 00000000..afb71f43 --- /dev/null +++ b/protocol/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/protocol/proto/google/protobuf/descriptor.proto b/protocol/proto/google/protobuf/descriptor.proto index 7f91c408..884a5151 100644 --- a/protocol/proto/google/protobuf/descriptor.proto +++ b/protocol/proto/google/protobuf/descriptor.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -189,7 +189,7 @@ message MessageOptions { extensions 1000 to max; - reserved 8, 9; + reserved 4, 5, 6, 8, 9; } message FieldOptions { diff --git a/protocol/proto/google/protobuf/empty.proto b/protocol/proto/google/protobuf/empty.proto new file mode 100644 index 00000000..28c4d77b --- /dev/null +++ b/protocol/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/protocol/proto/greenroom_extension.proto b/protocol/proto/greenroom_extension.proto new file mode 100644 index 00000000..4fc8dbe3 --- /dev/null +++ b/protocol/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/protocol/proto/format.proto b/protocol/proto/media_format.proto similarity index 84% rename from protocol/proto/format.proto rename to protocol/proto/media_format.proto index 3a75b4df..c54f6323 100644 --- a/protocol/proto/format.proto +++ b/protocol/proto/media_format.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -7,7 +7,7 @@ package spotify.stream_reporting_esperanto.proto; option objc_class_prefix = "ESP"; option java_package = "com.spotify.stream_reporting_esperanto.proto"; -enum Format { +enum MediaFormat { FORMAT_UNKNOWN = 0; FORMAT_OGG_VORBIS_96 = 1; FORMAT_OGG_VORBIS_160 = 2; @@ -27,4 +27,6 @@ enum Format { FORMAT_MP4_256_CBCS = 16; FORMAT_FLAC_FLAC = 17; FORMAT_MP4_FLAC = 18; + FORMAT_MP4_Unknown = 19; + FORMAT_MP3_Unknown = 20; } diff --git a/protocol/proto/media_manifest.proto b/protocol/proto/media_manifest.proto index a6a97681..6e280259 100644 --- a/protocol/proto/media_manifest.proto +++ b/protocol/proto/media_manifest.proto @@ -1,8 +1,8 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; -package spotify.media_manifest; +package spotify.media_manifest.proto; option optimize_for = CODE_SIZE; @@ -33,9 +33,12 @@ message File { message ExternalFile { string method = 1; - string url = 2; - bytes body = 3; - bool is_webgate_endpoint = 4; + bytes body = 4; + + oneof endpoint { + string url = 2; + string service = 3; + } } message FileIdFile { diff --git a/protocol/proto/media_type.proto b/protocol/proto/media_type.proto index 5527922f..2d8def46 100644 --- a/protocol/proto/media_type.proto +++ b/protocol/proto/media_type.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -8,7 +8,6 @@ option objc_class_prefix = "ESP"; option java_package = "com.spotify.stream_reporting_esperanto.proto"; enum MediaType { - MEDIA_TYPE_UNSET = 0; - AUDIO = 1; - VIDEO = 2; + AUDIO = 0; + VIDEO = 1; } diff --git a/protocol/proto/members_request.proto b/protocol/proto/members_request.proto new file mode 100644 index 00000000..931f91d3 --- /dev/null +++ b/protocol/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/protocol/proto/members_response.proto b/protocol/proto/members_response.proto new file mode 100644 index 00000000..f341a8d2 --- /dev/null +++ b/protocol/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/protocol/proto/messages/discovery/force_discover.proto b/protocol/proto/messages/discovery/force_discover.proto new file mode 100644 index 00000000..22bcb066 --- /dev/null +++ b/protocol/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/protocol/proto/messages/discovery/start_discovery.proto b/protocol/proto/messages/discovery/start_discovery.proto new file mode 100644 index 00000000..d4af9339 --- /dev/null +++ b/protocol/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/protocol/proto/metadata.proto b/protocol/proto/metadata.proto index a6d3aded..056dbcfa 100644 --- a/protocol/proto/metadata.proto +++ b/protocol/proto/metadata.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -140,6 +140,7 @@ message Show { repeated Availability availability = 78; optional string trailer_uri = 83; optional bool music_and_talk = 85; + optional bool is_audiobook = 89; } message Episode { @@ -173,6 +174,8 @@ message Episode { } optional bool music_and_talk = 91; + repeated ContentRating content_rating = 95; + optional bool is_audiobook_chapter = 96; } message Licensor { diff --git a/protocol/proto/metadata/episode_metadata.proto b/protocol/proto/metadata/episode_metadata.proto index 9f47deee..5d4a0b25 100644 --- a/protocol/proto/metadata/episode_metadata.proto +++ b/protocol/proto/metadata/episode_metadata.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; @@ -56,4 +57,7 @@ message EpisodeMetadata { 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/protocol/proto/metadata/extension.proto b/protocol/proto/metadata/extension.proto new file mode 100644 index 00000000..b10a0f08 --- /dev/null +++ b/protocol/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/protocol/proto/metadata/show_metadata.proto b/protocol/proto/metadata/show_metadata.proto index 8beaf97b..9b9891d3 100644 --- a/protocol/proto/metadata/show_metadata.proto +++ b/protocol/proto/metadata/show_metadata.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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; @@ -25,4 +26,6 @@ message ShowMetadata { 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/protocol/proto/metadata_esperanto.proto b/protocol/proto/metadata_esperanto.proto new file mode 100644 index 00000000..601290a1 --- /dev/null +++ b/protocol/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/protocol/proto/mod.rs b/protocol/proto/mod.rs index 9dfc8c92..24cf4052 100644 --- a/protocol/proto/mod.rs +++ b/protocol/proto/mod.rs @@ -1,4 +1,2 @@ // generated protobuf files will be included here. See build.rs for details -#![allow(renamed_and_removed_lints)] - include!(env!("PROTO_MOD_RS")); diff --git a/protocol/proto/offline_playlists_containing.proto b/protocol/proto/offline_playlists_containing.proto index 19106b0c..3d75865f 100644 --- a/protocol/proto/offline_playlists_containing.proto +++ b/protocol/proto/offline_playlists_containing.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; diff --git a/protocol/proto/on_demand_set_cosmos_request.proto b/protocol/proto/on_demand_set_cosmos_request.proto index 28b70c16..72d4d3d9 100644 --- a/protocol/proto/on_demand_set_cosmos_request.proto +++ b/protocol/proto/on_demand_set_cosmos_request.proto @@ -1,10 +1,13 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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; diff --git a/protocol/proto/on_demand_set_cosmos_response.proto b/protocol/proto/on_demand_set_cosmos_response.proto index 3e5d708f..8ca68cbe 100644 --- a/protocol/proto/on_demand_set_cosmos_response.proto +++ b/protocol/proto/on_demand_set_cosmos_response.proto @@ -1,10 +1,13 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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/protocol/proto/on_demand_set_response.proto b/protocol/proto/on_demand_set_response.proto new file mode 100644 index 00000000..9d914dd7 --- /dev/null +++ b/protocol/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/protocol/proto/pending_event_entity.proto b/protocol/proto/pending_event_entity.proto new file mode 100644 index 00000000..0dd5c099 --- /dev/null +++ b/protocol/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/protocol/proto/perf_metrics_service.proto b/protocol/proto/perf_metrics_service.proto new file mode 100644 index 00000000..484bd321 --- /dev/null +++ b/protocol/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/protocol/proto/pin_request.proto b/protocol/proto/pin_request.proto index 23e064ad..a5337320 100644 --- a/protocol/proto/pin_request.proto +++ b/protocol/proto/pin_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -19,6 +19,7 @@ message PinResponse { } bool has_maximum_pinned_items = 2; + int32 maximum_pinned_items = 3; string error = 99; } diff --git a/protocol/proto/play_reason.proto b/protocol/proto/play_reason.proto index 6ebfc914..04bba83f 100644 --- a/protocol/proto/play_reason.proto +++ b/protocol/proto/play_reason.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -8,26 +8,25 @@ option objc_class_prefix = "ESP"; option java_package = "com.spotify.stream_reporting_esperanto.proto"; enum PlayReason { - REASON_UNSET = 0; - REASON_APP_LOAD = 1; - REASON_BACK_BTN = 2; - REASON_CLICK_ROW = 3; - REASON_CLICK_SIDE = 4; - REASON_END_PLAY = 5; - REASON_FWD_BTN = 6; - REASON_INTERRUPTED = 7; - REASON_LOGOUT = 8; - REASON_PLAY_BTN = 9; - REASON_POPUP = 10; - REASON_REMOTE = 11; - REASON_SONG_DONE = 12; - REASON_TRACK_DONE = 13; - REASON_TRACK_ERROR = 14; - REASON_PREVIEW = 15; - REASON_PLAY_REASON_UNKNOWN = 16; - REASON_URI_OPEN = 17; - REASON_BACKGROUNDED = 18; - REASON_OFFLINE = 19; - REASON_UNEXPECTED_EXIT = 20; - REASON_UNEXPECTED_EXIT_WHILE_PAUSED = 21; + 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/protocol/proto/play_source.proto b/protocol/proto/play_source.proto deleted file mode 100644 index e4db2b9a..00000000 --- a/protocol/proto/play_source.proto +++ /dev/null @@ -1,47 +0,0 @@ -// 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"; - -enum PlaySource { - SOURCE_UNSET = 0; - SOURCE_ALBUM = 1; - SOURCE_ARTIST = 2; - SOURCE_ARTIST_RADIO = 3; - SOURCE_COLLECTION = 4; - SOURCE_DEVICE_SECTION = 5; - SOURCE_EXTERNAL_DEVICE = 6; - SOURCE_EXT_LINK = 7; - SOURCE_INBOX = 8; - SOURCE_LIBRARY = 9; - SOURCE_LIBRARY_COLLECTION = 10; - SOURCE_LIBRARY_COLLECTION_ALBUM = 11; - SOURCE_LIBRARY_COLLECTION_ARTIST = 12; - SOURCE_LIBRARY_COLLECTION_MISSING_ALBUM = 13; - SOURCE_LOCAL_FILES = 14; - SOURCE_PENDAD = 15; - SOURCE_PLAYLIST = 16; - SOURCE_PLAYLIST_OWNED_BY_OTHER_COLLABORATIVE = 17; - SOURCE_PLAYLIST_OWNED_BY_OTHER_NON_COLLABORATIVE = 18; - SOURCE_PLAYLIST_OWNED_BY_SELF_COLLABORATIVE = 19; - SOURCE_PLAYLIST_OWNED_BY_SELF_NON_COLLABORATIVE = 20; - SOURCE_PLAYLIST_FOLDER = 21; - SOURCE_PLAYLISTS = 22; - SOURCE_PLAY_QUEUE = 23; - SOURCE_PLUGIN_API = 24; - SOURCE_PROFILE = 25; - SOURCE_PURCHASES = 26; - SOURCE_RADIO = 27; - SOURCE_RTMP = 28; - SOURCE_SEARCH = 29; - SOURCE_SHOW = 30; - SOURCE_TEMP_PLAYLIST = 31; - SOURCE_TOPLIST = 32; - SOURCE_TRACK_SET = 33; - SOURCE_PLAY_SOURCE_UNKNOWN = 34; - SOURCE_QUICK_MENU = 35; -} diff --git a/protocol/proto/playback_cosmos.proto b/protocol/proto/playback_cosmos.proto index 83a905fd..b2ae4f96 100644 --- a/protocol/proto/playback_cosmos.proto +++ b/protocol/proto/playback_cosmos.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -60,11 +60,12 @@ message InfoResponse { float gain_adjustment = 13; bool has_loudness = 14; float loudness = 15; - string file_origin = 16; string strategy = 17; int32 target_bitrate = 18; int32 advised_bitrate = 19; bool target_file_available = 20; + + reserved 16; } message FormatsResponse { diff --git a/protocol/proto/playback_esperanto.proto b/protocol/proto/playback_esperanto.proto new file mode 100644 index 00000000..3c57325a --- /dev/null +++ b/protocol/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/protocol/proto/playback_platform.proto b/protocol/proto/playback_platform.proto new file mode 100644 index 00000000..5f50bd95 --- /dev/null +++ b/protocol/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/protocol/proto/played_state/show_played_state.proto b/protocol/proto/played_state/show_played_state.proto index 08910f93..47f13ec7 100644 --- a/protocol/proto/played_state/show_played_state.proto +++ b/protocol/proto/played_state/show_played_state.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; diff --git a/protocol/proto/playlist4_external.proto b/protocol/proto/playlist4_external.proto index 0a5d7084..2a7b44b9 100644 --- a/protocol/proto/playlist4_external.proto +++ b/protocol/proto/playlist4_external.proto @@ -1,9 +1,11 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; @@ -19,6 +21,8 @@ message MetaItem { 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 { @@ -187,16 +191,45 @@ message SelectedListContent { 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 bytes uri = 1; + required string uri = 1; optional bytes revision = 2; } -message ModifyReply { - required bytes 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 { @@ -214,6 +247,19 @@ message PlaylistModificationInfo { 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; @@ -237,3 +283,10 @@ enum ItemAttributeKind { 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/protocol/proto/playlist_contains_request.proto b/protocol/proto/playlist_contains_request.proto new file mode 100644 index 00000000..072d5379 --- /dev/null +++ b/protocol/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/protocol/proto/playlist_members_request.proto b/protocol/proto/playlist_members_request.proto new file mode 100644 index 00000000..d5bd9b98 --- /dev/null +++ b/protocol/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/protocol/proto/playlist_offline_request.proto b/protocol/proto/playlist_offline_request.proto new file mode 100644 index 00000000..e0ab6312 --- /dev/null +++ b/protocol/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/protocol/proto/playlist_permission.proto b/protocol/proto/playlist_permission.proto index babab040..96e9c06d 100644 --- a/protocol/proto/playlist_permission.proto +++ b/protocol/proto/playlist_permission.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -19,6 +19,7 @@ message Capabilities { 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 { @@ -52,6 +53,10 @@ message SetPermissionResponse { optional Permission resulting_permission = 1; } +message GetMemberPermissionsResponse { + map member_permissions = 1; +} + message Permissions { optional Permission base_permission = 1; } @@ -67,6 +72,21 @@ 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; diff --git a/protocol/proto/playlist_playlist_state.proto b/protocol/proto/playlist_playlist_state.proto index 4356fe65..5663252c 100644 --- a/protocol/proto/playlist_playlist_state.proto +++ b/protocol/proto/playlist_playlist_state.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; @@ -42,6 +43,7 @@ message PlaylistMetadata { optional Allows allows = 18; optional string load_state = 19; optional User made_for = 20; + repeated cosmos_util.proto.Extension extension = 21; } message PlaylistOfflineState { diff --git a/protocol/proto/playlist_request.proto b/protocol/proto/playlist_request.proto index cb452f63..52befb1f 100644 --- a/protocol/proto/playlist_request.proto +++ b/protocol/proto/playlist_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -17,6 +17,7 @@ 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"; @@ -86,4 +87,5 @@ message Response { 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/protocol/proto/playlist_set_member_permission_request.proto b/protocol/proto/playlist_set_member_permission_request.proto new file mode 100644 index 00000000..d3d687a4 --- /dev/null +++ b/protocol/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/protocol/proto/playlist_track_state.proto b/protocol/proto/playlist_track_state.proto index 5bd64ae2..cd55947f 100644 --- a/protocol/proto/playlist_track_state.proto +++ b/protocol/proto/playlist_track_state.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; diff --git a/protocol/proto/playlist_user_state.proto b/protocol/proto/playlist_user_state.proto index 510630ca..86c07dee 100644 --- a/protocol/proto/playlist_user_state.proto +++ b/protocol/proto/playlist_user_state.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -14,4 +14,5 @@ message User { optional string display_name = 3; optional string image_uri = 4; optional string thumbnail_uri = 5; + optional int32 color = 6; } diff --git a/protocol/proto/playlist_v1_uri.proto b/protocol/proto/playlist_v1_uri.proto deleted file mode 100644 index 76c9d797..00000000 --- a/protocol/proto/playlist_v1_uri.proto +++ /dev/null @@ -1,15 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto2"; - -package spotify.player.proto; - -option optimize_for = CODE_SIZE; - -message PlaylistV1UriRequest { - repeated string v2_uris = 1; -} - -message PlaylistV1UriReply { - map v2_uri_to_v1_uri = 1; -} diff --git a/protocol/proto/podcast_cta_cards.proto b/protocol/proto/podcast_cta_cards.proto new file mode 100644 index 00000000..9cd4dfc6 --- /dev/null +++ b/protocol/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/protocol/proto/podcast_ratings.proto b/protocol/proto/podcast_ratings.proto new file mode 100644 index 00000000..c78c0282 --- /dev/null +++ b/protocol/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/protocol/proto/policy/album_decoration_policy.proto b/protocol/proto/policy/album_decoration_policy.proto index a20cf324..359347d4 100644 --- a/protocol/proto/policy/album_decoration_policy.proto +++ b/protocol/proto/policy/album_decoration_policy.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -19,3 +19,15 @@ message AlbumDecorationPolicy { 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/protocol/proto/policy/artist_decoration_policy.proto b/protocol/proto/policy/artist_decoration_policy.proto index f8d8b2cb..0419dc31 100644 --- a/protocol/proto/policy/artist_decoration_policy.proto +++ b/protocol/proto/policy/artist_decoration_policy.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -14,3 +14,18 @@ message ArtistDecorationPolicy { 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/protocol/proto/policy/episode_decoration_policy.proto b/protocol/proto/policy/episode_decoration_policy.proto index 77489834..467426bd 100644 --- a/protocol/proto/policy/episode_decoration_policy.proto +++ b/protocol/proto/policy/episode_decoration_policy.proto @@ -1,9 +1,11 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; @@ -29,6 +31,9 @@ message EpisodeDecorationPolicy { 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 { @@ -47,6 +52,7 @@ message EpisodePlayedStateDecorationPolicy { bool is_played = 2; bool playable = 3; bool playability_restriction = 4; + bool last_played_at = 5; } message PodcastSegmentsPolicy { diff --git a/protocol/proto/policy/playlist_decoration_policy.proto b/protocol/proto/policy/playlist_decoration_policy.proto index 9975279c..a6aef1b7 100644 --- a/protocol/proto/policy/playlist_decoration_policy.proto +++ b/protocol/proto/policy/playlist_decoration_policy.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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; @@ -57,4 +58,6 @@ message PlaylistDecorationPolicy { 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/protocol/proto/policy/show_decoration_policy.proto b/protocol/proto/policy/show_decoration_policy.proto index 02ae2f3e..2e5e2020 100644 --- a/protocol/proto/policy/show_decoration_policy.proto +++ b/protocol/proto/policy/show_decoration_policy.proto @@ -1,9 +1,11 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; @@ -24,6 +26,8 @@ message ShowDecorationPolicy { 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 { diff --git a/protocol/proto/policy/track_decoration_policy.proto b/protocol/proto/policy/track_decoration_policy.proto index 45162008..aa71f497 100644 --- a/protocol/proto/policy/track_decoration_policy.proto +++ b/protocol/proto/policy/track_decoration_policy.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -34,3 +34,15 @@ message TrackPlayedStateDecorationPolicy { 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/protocol/proto/policy/user_decoration_policy.proto b/protocol/proto/policy/user_decoration_policy.proto index 4f72e974..f2c342eb 100644 --- a/protocol/proto/policy/user_decoration_policy.proto +++ b/protocol/proto/policy/user_decoration_policy.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -14,6 +14,7 @@ message UserDecorationPolicy { bool name = 3; bool image = 4; bool thumbnail = 5; + bool color = 6; } message CollaboratorPolicy { diff --git a/protocol/proto/prepare_play_options.proto b/protocol/proto/prepare_play_options.proto index cfaeab14..cb27650d 100644 --- a/protocol/proto/prepare_play_options.proto +++ b/protocol/proto/prepare_play_options.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -6,6 +6,7 @@ package spotify.player.proto; import "context_player_options.proto"; import "player_license.proto"; +import "skip_to_track.proto"; option optimize_for = CODE_SIZE; @@ -13,4 +14,24 @@ 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/protocol/proto/profile_cache.proto b/protocol/proto/profile_cache.proto deleted file mode 100644 index 8162612f..00000000 --- a/protocol/proto/profile_cache.proto +++ /dev/null @@ -1,19 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto3"; - -package spotify.profile.proto; - -import "identity.proto"; - -option optimize_for = CODE_SIZE; - -message CachedProfile { - identity.proto.DecorationData profile = 1; - int64 expires_at = 2; - bool pinned = 3; -} - -message ProfileCacheFile { - repeated CachedProfile cached_profiles = 1; -} diff --git a/protocol/proto/profile_service.proto b/protocol/proto/profile_service.proto new file mode 100644 index 00000000..194e5fea --- /dev/null +++ b/protocol/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/protocol/proto/property_definition.proto b/protocol/proto/property_definition.proto index 4552c1b2..9df7caa7 100644 --- a/protocol/proto/property_definition.proto +++ b/protocol/proto/property_definition.proto @@ -25,7 +25,7 @@ message PropertyDefinition { EnumSpec enum_spec = 7; } - reserved 2, "hash"; + //reserved 2, "hash"; message BoolSpec { bool default = 1; diff --git a/protocol/proto/rate_limited_events.proto b/protocol/proto/rate_limited_events.proto new file mode 100644 index 00000000..c9116b6d --- /dev/null +++ b/protocol/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/protocol/proto/rc_dummy_property_resolved.proto b/protocol/proto/rc_dummy_property_resolved.proto deleted file mode 100644 index 9c5e2aaf..00000000 --- a/protocol/proto/rc_dummy_property_resolved.proto +++ /dev/null @@ -1,12 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto3"; - -package spotify.remote_config.proto; - -option optimize_for = CODE_SIZE; - -message RcDummyPropertyResolved { - string resolved_value = 1; - string configuration_assignment_id = 2; -} diff --git a/protocol/proto/rcs.proto b/protocol/proto/rcs.proto index ed8405c2..00e86103 100644 --- a/protocol/proto/rcs.proto +++ b/protocol/proto/rcs.proto @@ -52,7 +52,7 @@ message ClientPropertySet { message ComponentInfo { string name = 3; - reserved 1, 2, "owner", "tags"; + //reserved 1, 2, "owner", "tags"; } string property_set_key = 7; diff --git a/protocol/proto/record_id.proto b/protocol/proto/record_id.proto index 54fa24a3..167c0ecd 100644 --- a/protocol/proto/record_id.proto +++ b/protocol/proto/record_id.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -7,5 +7,5 @@ package spotify.event_sender.proto; option optimize_for = CODE_SIZE; message RecordId { - int64 value = 1; + uint64 value = 1; } diff --git a/protocol/proto/resolve.proto b/protocol/proto/resolve.proto index 5f2cd9b8..793b8c5a 100644 --- a/protocol/proto/resolve.proto +++ b/protocol/proto/resolve.proto @@ -17,7 +17,7 @@ message ResolveRequest { BackendContext backend_context = 12 [deprecated = true]; } - reserved 4, 5, "custom_context", "projection"; + //reserved 4, 5, "custom_context", "projection"; } message ResolveResponse { diff --git a/protocol/proto/resolve_configuration_error.proto b/protocol/proto/resolve_configuration_error.proto deleted file mode 100644 index 22f2e1fb..00000000 --- a/protocol/proto/resolve_configuration_error.proto +++ /dev/null @@ -1,14 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto3"; - -package spotify.remote_config.proto; - -option optimize_for = CODE_SIZE; - -message ResolveConfigurationError { - string error_message = 1; - int64 status_code = 2; - string client_id = 3; - string client_version = 4; -} diff --git a/protocol/proto/response_status.proto b/protocol/proto/response_status.proto index a9ecadd7..5709571f 100644 --- a/protocol/proto/response_status.proto +++ b/protocol/proto/response_status.proto @@ -1,10 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; package spotify.playlist_esperanto.proto; -option objc_class_prefix = "ESP"; +option objc_class_prefix = "SPTPlaylistEsperanto"; option java_multiple_files = true; option optimize_for = CODE_SIZE; option java_package = "spotify.playlist.esperanto.proto"; diff --git a/protocol/proto/rootlist_request.proto b/protocol/proto/rootlist_request.proto index 80af73f0..ae055475 100644 --- a/protocol/proto/rootlist_request.proto +++ b/protocol/proto/rootlist_request.proto @@ -1,13 +1,15 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; @@ -18,6 +20,7 @@ message Playlist { 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 { diff --git a/protocol/proto/sequence_number_entity.proto b/protocol/proto/sequence_number_entity.proto index cd97392c..a3b88c81 100644 --- a/protocol/proto/sequence_number_entity.proto +++ b/protocol/proto/sequence_number_entity.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -7,8 +7,8 @@ package spotify.event_sender.proto; option optimize_for = CODE_SIZE; message SequenceNumberEntity { - int32 file_format_version = 1; + uint32 file_format_version = 1; string event_name = 2; bytes sequence_id = 3; - int64 sequence_number_next = 4; + uint64 sequence_number_next = 4; } diff --git a/protocol/proto/set_member_permission_request.proto b/protocol/proto/set_member_permission_request.proto new file mode 100644 index 00000000..160eaf92 --- /dev/null +++ b/protocol/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/protocol/proto/show_access.proto b/protocol/proto/show_access.proto index 3516cdfd..eddc0342 100644 --- a/protocol/proto/show_access.proto +++ b/protocol/proto/show_access.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -11,10 +11,13 @@ 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; } } @@ -31,3 +34,17 @@ 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/protocol/proto/show_episode_state.proto b/protocol/proto/show_episode_state.proto index 001fafee..b780dbb6 100644 --- a/protocol/proto/show_episode_state.proto +++ b/protocol/proto/show_episode_state.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -16,10 +16,3 @@ message EpisodeOfflineState { optional string offline_state = 1; optional uint32 sync_progress = 2; } - -message EpisodePlayState { - optional uint32 time_left = 1; - optional bool is_playable = 2; - optional bool is_played = 3; - optional uint64 last_played_at = 4; -} diff --git a/protocol/proto/show_request.proto b/protocol/proto/show_request.proto index 0f40a1bd..3624fa04 100644 --- a/protocol/proto/show_request.proto +++ b/protocol/proto/show_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto2"; @@ -6,6 +6,7 @@ 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"; @@ -13,7 +14,10 @@ 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 { @@ -21,9 +25,10 @@ message Item { optional cosmos_util.proto.EpisodeMetadata episode_metadata = 2; optional EpisodeCollectionState episode_collection_state = 3; optional EpisodeOfflineState episode_offline_state = 4; - optional EpisodePlayState episode_play_state = 5; + 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; } @@ -43,6 +48,7 @@ message Response { 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"; } @@ -53,6 +59,9 @@ message AuxiliarySections { 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; } @@ -64,3 +73,7 @@ message ContinueListeningSection { message TrailerSection { optional Item item = 1; } + +message LatestUnplayedEpisodeSection { + optional Item item = 1; +} diff --git a/protocol/proto/show_show_state.proto b/protocol/proto/show_show_state.proto index ab0d1fe3..c9c3548a 100644 --- a/protocol/proto/show_show_state.proto +++ b/protocol/proto/show_show_state.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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 { diff --git a/protocol/proto/social_connect_v2.proto b/protocol/proto/social_connect_v2.proto index 265fbee6..f4d084c8 100644 --- a/protocol/proto/social_connect_v2.proto +++ b/protocol/proto/social_connect_v2.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -15,6 +15,16 @@ message Session { 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 { @@ -24,6 +34,8 @@ message SessionMember { string display_name = 4; string image_url = 5; string large_image_url = 6; + bool is_listening = 7; + bool is_controlling = 8; } message SessionUpdate { @@ -37,6 +49,13 @@ message DevicesExposure { 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; @@ -46,6 +65,9 @@ enum SessionUpdateReason { YOU_LEFT = 5; YOU_WERE_KICKED = 6; YOU_JOINED = 7; + PARTICIPANT_PROMOTED_TO_HOST = 8; + DISCOVERABILITY_CHANGED = 9; + USER_KICKED = 10; } enum DeviceExposureStatus { diff --git a/protocol/proto/social_service.proto b/protocol/proto/social_service.proto new file mode 100644 index 00000000..d5c108a8 --- /dev/null +++ b/protocol/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/protocol/proto/socialgraph_response_status.proto b/protocol/proto/socialgraph_response_status.proto new file mode 100644 index 00000000..1518daf1 --- /dev/null +++ b/protocol/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/protocol/proto/socialgraphv2.proto b/protocol/proto/socialgraphv2.proto new file mode 100644 index 00000000..ace70589 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/ads_rules_inject_tracks.proto b/protocol/proto/state_restore/ads_rules_inject_tracks.proto new file mode 100644 index 00000000..569c8cdf --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/behavior_metadata_rules.proto b/protocol/proto/state_restore/behavior_metadata_rules.proto new file mode 100644 index 00000000..4bb65cd4 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/circuit_breaker_rules.proto b/protocol/proto/state_restore/circuit_breaker_rules.proto new file mode 100644 index 00000000..e81eaf57 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/context_player_rules.proto b/protocol/proto/state_restore/context_player_rules.proto new file mode 100644 index 00000000..b06bf8e8 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/context_player_rules_base.proto b/protocol/proto/state_restore/context_player_rules_base.proto new file mode 100644 index 00000000..da973bba --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/explicit_content_rules.proto b/protocol/proto/state_restore/explicit_content_rules.proto new file mode 100644 index 00000000..271ad6ea --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/explicit_request_rules.proto b/protocol/proto/state_restore/explicit_request_rules.proto new file mode 100644 index 00000000..babda5cb --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mft_context_history.proto b/protocol/proto/state_restore/mft_context_history.proto new file mode 100644 index 00000000..48e77205 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mft_context_switch_rules.proto b/protocol/proto/state_restore/mft_context_switch_rules.proto new file mode 100644 index 00000000..d01e9298 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mft_fallback_page_history.proto b/protocol/proto/state_restore/mft_fallback_page_history.proto new file mode 100644 index 00000000..54d15e8d --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mft_rules.proto b/protocol/proto/state_restore/mft_rules.proto new file mode 100644 index 00000000..141cdac7 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mft_rules_core.proto b/protocol/proto/state_restore/mft_rules_core.proto new file mode 100644 index 00000000..05549624 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mft_rules_inject_filler_tracks.proto b/protocol/proto/state_restore/mft_rules_inject_filler_tracks.proto new file mode 100644 index 00000000..b5b8c657 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mft_state.proto b/protocol/proto/state_restore/mft_state.proto new file mode 100644 index 00000000..8f5f9561 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mod_interruption_state.proto b/protocol/proto/state_restore/mod_interruption_state.proto new file mode 100644 index 00000000..e09ffe13 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/mod_rules_interruptions.proto b/protocol/proto/state_restore/mod_rules_interruptions.proto new file mode 100644 index 00000000..1b965ccd --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/music_injection_rules.proto b/protocol/proto/state_restore/music_injection_rules.proto new file mode 100644 index 00000000..5ae18bce --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/player_session_queue.proto b/protocol/proto/state_restore/player_session_queue.proto new file mode 100644 index 00000000..22ee7941 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/provided_track.proto b/protocol/proto/state_restore/provided_track.proto new file mode 100644 index 00000000..a61010e5 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/random_source.proto b/protocol/proto/state_restore/random_source.proto new file mode 100644 index 00000000..f1ad1019 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/remove_banned_tracks_rules.proto b/protocol/proto/state_restore/remove_banned_tracks_rules.proto new file mode 100644 index 00000000..9db5c70c --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/resume_points_rules.proto b/protocol/proto/state_restore/resume_points_rules.proto new file mode 100644 index 00000000..6f2618a9 --- /dev/null +++ b/protocol/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/protocol/proto/state_restore/track_error_rules.proto b/protocol/proto/state_restore/track_error_rules.proto new file mode 100644 index 00000000..e13b8562 --- /dev/null +++ b/protocol/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/protocol/proto/status.proto b/protocol/proto/status.proto new file mode 100644 index 00000000..1293af57 --- /dev/null +++ b/protocol/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/protocol/proto/status_code.proto b/protocol/proto/status_code.proto index 8e813d25..abc8bd49 100644 --- a/protocol/proto/status_code.proto +++ b/protocol/proto/status_code.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -9,4 +9,6 @@ option java_package = "com.spotify.stream_reporting_esperanto.proto"; enum StatusCode { SUCCESS = 0; + NO_PLAYBACK_ID = 1; + EVENT_SENDER_ERROR = 2; } diff --git a/protocol/proto/stream_end_request.proto b/protocol/proto/stream_end_request.proto index 5ef8be7f..ed72fd51 100644 --- a/protocol/proto/stream_end_request.proto +++ b/protocol/proto/stream_end_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -6,13 +6,14 @@ package spotify.stream_reporting_esperanto.proto; import "stream_handle.proto"; import "play_reason.proto"; -import "play_source.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; - PlaySource source_end = 2; + string source_end = 2; PlayReason reason_end = 3; + MediaFormat format = 4; } diff --git a/protocol/proto/stream_prepare_request.proto b/protocol/proto/stream_prepare_request.proto deleted file mode 100644 index ce22e8eb..00000000 --- a/protocol/proto/stream_prepare_request.proto +++ /dev/null @@ -1,39 +0,0 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) - -syntax = "proto3"; - -package spotify.stream_reporting_esperanto.proto; - -import "play_reason.proto"; -import "play_source.proto"; -import "streaming_rule.proto"; - -option objc_class_prefix = "ESP"; -option java_package = "com.spotify.stream_reporting_esperanto.proto"; - -message StreamPrepareRequest { - 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; - PlaySource source_start = 19; - PlayReason reason_start = 20; - bool is_live = 22; - bool is_shuffle = 23; - bool is_offlined = 24; - bool is_incognito = 25; -} diff --git a/protocol/proto/stream_seek_request.proto b/protocol/proto/stream_seek_request.proto index 3736abf9..7d99169e 100644 --- a/protocol/proto/stream_seek_request.proto +++ b/protocol/proto/stream_seek_request.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -11,4 +11,6 @@ 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/protocol/proto/stream_start_request.proto b/protocol/proto/stream_start_request.proto index 3c4bfbb6..656016a6 100644 --- a/protocol/proto/stream_start_request.proto +++ b/protocol/proto/stream_start_request.proto @@ -1,20 +1,44 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; package spotify.stream_reporting_esperanto.proto; -import "format.proto"; import "media_type.proto"; -import "stream_handle.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 { - StreamHandle stream_handle = 1; - string media_id = 2; - MediaType media_type = 3; - Format format = 4; - uint64 playback_start_time = 5; + 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/protocol/proto/stream_prepare_response.proto b/protocol/proto/stream_start_response.proto similarity index 57% rename from protocol/proto/stream_prepare_response.proto rename to protocol/proto/stream_start_response.proto index 2f5a2c4e..98af2976 100644 --- a/protocol/proto/stream_prepare_response.proto +++ b/protocol/proto/stream_start_response.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -10,9 +10,7 @@ import "stream_handle.proto"; option objc_class_prefix = "ESP"; option java_package = "com.spotify.stream_reporting_esperanto.proto"; -message StreamPrepareResponse { - oneof response { - StatusResponse status = 1; - StreamHandle stream_handle = 2; - } +message StreamStartResponse { + StatusResponse status = 1; + StreamHandle stream_handle = 2; } diff --git a/protocol/proto/streaming_rule.proto b/protocol/proto/streaming_rule.proto index d72d7ca5..9593fdef 100644 --- a/protocol/proto/streaming_rule.proto +++ b/protocol/proto/streaming_rule.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -8,10 +8,9 @@ option objc_class_prefix = "ESP"; option java_package = "com.spotify.stream_reporting_esperanto.proto"; enum StreamingRule { - RULE_UNSET = 0; - RULE_NONE = 1; - RULE_DMCA_RADIO = 2; - RULE_PREVIEW = 3; - RULE_WIFI = 4; - RULE_SHUFFLE_MODE = 5; + 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/protocol/proto/sync_request.proto b/protocol/proto/sync_request.proto index 090f8dce..b2d77625 100644 --- a/protocol/proto/sync_request.proto +++ b/protocol/proto/sync_request.proto @@ -1,9 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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"; diff --git a/protocol/proto/test_request_failure.proto b/protocol/proto/test_request_failure.proto deleted file mode 100644 index 036e38e1..00000000 --- a/protocol/proto/test_request_failure.proto +++ /dev/null @@ -1,14 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto2"; - -package spotify.image.proto; - -option optimize_for = CODE_SIZE; - -message TestRequestFailure { - optional string request = 1; - optional string source = 2; - optional string error = 3; - optional int64 result = 4; -} diff --git a/protocol/proto/track_offlining_cosmos_response.proto b/protocol/proto/track_offlining_cosmos_response.proto deleted file mode 100644 index bb650607..00000000 --- a/protocol/proto/track_offlining_cosmos_response.proto +++ /dev/null @@ -1,24 +0,0 @@ -// Extracted from: Spotify 1.1.33.569 (Windows) - -syntax = "proto2"; - -package spotify.track_offlining_cosmos.proto; - -option optimize_for = CODE_SIZE; - -message DecoratedTrack { - optional string uri = 1; - optional string title = 2; -} - -message ListResponse { - repeated string uri = 1; -} - -message DecorateResponse { - repeated DecoratedTrack tracks = 1; -} - -message StatusResponse { - optional bool offline = 1; -} diff --git a/protocol/proto/tts-resolve.proto b/protocol/proto/tts-resolve.proto index 89956843..adb50854 100644 --- a/protocol/proto/tts-resolve.proto +++ b/protocol/proto/tts-resolve.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -36,8 +36,12 @@ message ResolveRequest { 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; diff --git a/protocol/proto/unfinished_episodes_request.proto b/protocol/proto/unfinished_episodes_request.proto index 1e152bd6..68e5f903 100644 --- a/protocol/proto/unfinished_episodes_request.proto +++ b/protocol/proto/unfinished_episodes_request.proto @@ -1,19 +1,21 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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 show_cosmos.proto.EpisodePlayState episode_play_state = 4; + optional cosmos_util.proto.EpisodePlayState episode_play_state = 4; optional string link = 5; } diff --git a/protocol/proto/your_library_contains_request.proto b/protocol/proto/your_library_contains_request.proto index 33672bad..bbb43c20 100644 --- a/protocol/proto/your_library_contains_request.proto +++ b/protocol/proto/your_library_contains_request.proto @@ -1,11 +1,14 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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/protocol/proto/your_library_decorate_request.proto b/protocol/proto/your_library_decorate_request.proto index e3fccc29..6b77a976 100644 --- a/protocol/proto/your_library_decorate_request.proto +++ b/protocol/proto/your_library_decorate_request.proto @@ -1,17 +1,14 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; package spotify.your_library.proto; -import "your_library_request.proto"; +import "your_library_pseudo_playlist_config.proto"; option optimize_for = CODE_SIZE; message YourLibraryDecorateRequest { repeated string requested_uri = 3; - YourLibraryLabelAndImage liked_songs_label_and_image = 201; - YourLibraryLabelAndImage your_episodes_label_and_image = 202; - YourLibraryLabelAndImage new_episodes_label_and_image = 203; - YourLibraryLabelAndImage local_files_label_and_image = 204; + YourLibraryPseudoPlaylistConfig pseudo_playlist_config = 6; } diff --git a/protocol/proto/your_library_decorate_response.proto b/protocol/proto/your_library_decorate_response.proto index dab14203..125d5c33 100644 --- a/protocol/proto/your_library_decorate_response.proto +++ b/protocol/proto/your_library_decorate_response.proto @@ -1,10 +1,10 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; package spotify.your_library.proto; -import "your_library_response.proto"; +import "your_library_decorated_entity.proto"; option optimize_for = CODE_SIZE; @@ -14,6 +14,6 @@ message YourLibraryDecorateResponseHeader { message YourLibraryDecorateResponse { YourLibraryDecorateResponseHeader header = 1; - repeated YourLibraryResponseEntity entity = 2; + repeated YourLibraryDecoratedEntity entity = 2; string error = 99; } diff --git a/protocol/proto/your_library_decorated_entity.proto b/protocol/proto/your_library_decorated_entity.proto new file mode 100644 index 00000000..c31b45eb --- /dev/null +++ b/protocol/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/protocol/proto/your_library_entity.proto b/protocol/proto/your_library_entity.proto index acb5afe7..897fc6c1 100644 --- a/protocol/proto/your_library_entity.proto +++ b/protocol/proto/your_library_entity.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -9,13 +9,24 @@ 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.CollectionAlbumEntry album = 2; - YourLibraryArtistEntity artist = 3; + collection.proto.CollectionAlbumLikeEntry album = 2; + collection.proto.CollectionArtistEntry artist = 3; YourLibraryRootlistEntity rootlist_entity = 4; - YourLibraryShowEntity show = 5; + YourLibraryShowWrapper show = 7; + YourLibraryBookWrapper book = 8; } } diff --git a/protocol/proto/your_library_index.proto b/protocol/proto/your_library_index.proto index 2d452dd5..835c0fa2 100644 --- a/protocol/proto/your_library_index.proto +++ b/protocol/proto/your_library_index.proto @@ -1,4 +1,4 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// Extracted from: Spotify 1.1.73.517 (macOS) syntax = "proto3"; @@ -6,18 +6,11 @@ package spotify.your_library.proto; option optimize_for = CODE_SIZE; -message YourLibraryArtistEntity { - string uri = 1; - string name = 2; - string image_uri = 3; - int64 add_time = 4; -} - message YourLibraryRootlistPlaylist { string image_uri = 1; - bool is_on_demand_in_free = 2; bool is_loading = 3; int32 rootlist_index = 4; + bool can_view = 5; } message YourLibraryRootlistFolder { @@ -48,13 +41,3 @@ message YourLibraryRootlistEntity { YourLibraryRootlistCollection collection = 7; } } - -message YourLibraryShowEntity { - string uri = 1; - string name = 2; - string creator_name = 3; - string image_uri = 4; - int64 add_time = 5; - bool is_music_and_talk = 6; - int64 publish_date = 7; -} diff --git a/protocol/proto/your_library_pseudo_playlist_config.proto b/protocol/proto/your_library_pseudo_playlist_config.proto new file mode 100644 index 00000000..77c9bb53 --- /dev/null +++ b/protocol/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/protocol/proto/your_library_request.proto b/protocol/proto/your_library_request.proto index a75a0544..917a1add 100644 --- a/protocol/proto/your_library_request.proto +++ b/protocol/proto/your_library_request.proto @@ -1,74 +1,18 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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 YourLibraryRequestEntityInfo { - -} - -message YourLibraryRequestAlbumExtraInfo { - -} - -message YourLibraryRequestArtistExtraInfo { - -} - -message YourLibraryRequestPlaylistExtraInfo { - -} - -message YourLibraryRequestShowExtraInfo { - -} - -message YourLibraryRequestFolderExtraInfo { - -} - -message YourLibraryLabelAndImage { - string label = 1; - string image = 2; -} - -message YourLibraryRequestLikedSongsExtraInfo { - YourLibraryLabelAndImage label_and_image = 101; -} - -message YourLibraryRequestYourEpisodesExtraInfo { - YourLibraryLabelAndImage label_and_image = 101; -} - -message YourLibraryRequestNewEpisodesExtraInfo { - YourLibraryLabelAndImage label_and_image = 101; -} - -message YourLibraryRequestLocalFilesExtraInfo { - YourLibraryLabelAndImage label_and_image = 101; -} - -message YourLibraryRequestEntity { - YourLibraryRequestEntityInfo entityInfo = 1; - YourLibraryRequestAlbumExtraInfo album = 2; - YourLibraryRequestArtistExtraInfo artist = 3; - YourLibraryRequestPlaylistExtraInfo playlist = 4; - YourLibraryRequestShowExtraInfo show = 5; - YourLibraryRequestFolderExtraInfo folder = 6; - YourLibraryRequestLikedSongsExtraInfo liked_songs = 8; - YourLibraryRequestYourEpisodesExtraInfo your_episodes = 9; - YourLibraryRequestNewEpisodesExtraInfo new_episodes = 10; - YourLibraryRequestLocalFilesExtraInfo local_files = 11; -} - message YourLibraryRequestHeader { bool remaining_entities = 9; } message YourLibraryRequest { YourLibraryRequestHeader header = 1; - YourLibraryRequestEntity entity = 2; + YourLibraryPseudoPlaylistConfig pseudo_playlist_config = 4; } diff --git a/protocol/proto/your_library_response.proto b/protocol/proto/your_library_response.proto index 124b35b4..c354ff5b 100644 --- a/protocol/proto/your_library_response.proto +++ b/protocol/proto/your_library_response.proto @@ -1,112 +1,23 @@ -// Extracted from: Spotify 1.1.61.583 (Windows) +// 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 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; - } -} - -message Offline { - enum Availability { - UNKNOWN = 0; - NO = 1; - YES = 2; - DOWNLOADING = 3; - WAITING = 4; - } -} - -message YourLibraryAlbumExtraInfo { - string artist_name = 1; - Offline.Availability offline_availability = 3; -} - -message YourLibraryArtistExtraInfo { - int32 num_tracks_in_collection = 1; -} - -message YourLibraryPlaylistExtraInfo { - string creator_name = 1; - Offline.Availability offline_availability = 3; - bool is_loading = 5; -} - -message YourLibraryShowExtraInfo { - string creator_name = 1; - Offline.Availability offline_availability = 3; - int64 publish_date = 4; - bool is_music_and_talk = 5; -} - -message YourLibraryFolderExtraInfo { - int32 number_of_playlists = 2; - int32 number_of_folders = 3; -} - -message YourLibraryLikedSongsExtraInfo { - Offline.Availability offline_availability = 2; - int32 number_of_songs = 3; -} - -message YourLibraryYourEpisodesExtraInfo { - Offline.Availability offline_availability = 2; - int32 number_of_episodes = 3; -} - -message YourLibraryNewEpisodesExtraInfo { - int64 publish_date = 1; -} - -message YourLibraryLocalFilesExtraInfo { - int32 number_of_files = 1; -} - -message YourLibraryResponseEntity { - YourLibraryEntityInfo entityInfo = 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; - } -} - message YourLibraryResponseHeader { - bool has_albums = 1; - bool has_artists = 2; - bool has_playlists = 3; - bool has_shows = 4; - bool has_downloaded_albums = 5; - bool has_downloaded_artists = 6; - bool has_downloaded_playlists = 7; - bool has_downloaded_shows = 8; 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 YourLibraryResponseEntity entity = 2; + repeated YourLibraryDecoratedEntity entity = 2; string error = 99; }