spotted 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.ignore +2 -0
 - data/CHANGELOG.md +25 -0
 - data/README.md +236 -0
 - data/SECURITY.md +27 -0
 - data/lib/spotted/client.rb +169 -0
 - data/lib/spotted/errors.rb +228 -0
 - data/lib/spotted/file_part.rb +58 -0
 - data/lib/spotted/internal/cursor_url_page.rb +86 -0
 - data/lib/spotted/internal/oauth2.rb +87 -0
 - data/lib/spotted/internal/transport/base_client.rb +567 -0
 - data/lib/spotted/internal/transport/pooled_net_requester.rb +204 -0
 - data/lib/spotted/internal/type/array_of.rb +168 -0
 - data/lib/spotted/internal/type/base_model.rb +529 -0
 - data/lib/spotted/internal/type/base_page.rb +55 -0
 - data/lib/spotted/internal/type/boolean.rb +77 -0
 - data/lib/spotted/internal/type/converter.rb +327 -0
 - data/lib/spotted/internal/type/enum.rb +131 -0
 - data/lib/spotted/internal/type/file_input.rb +111 -0
 - data/lib/spotted/internal/type/hash_of.rb +188 -0
 - data/lib/spotted/internal/type/request_parameters.rb +42 -0
 - data/lib/spotted/internal/type/union.rb +237 -0
 - data/lib/spotted/internal/type/unknown.rb +81 -0
 - data/lib/spotted/internal/util.rb +915 -0
 - data/lib/spotted/internal.rb +20 -0
 - data/lib/spotted/models/album_list_params.rb +43 -0
 - data/lib/spotted/models/album_list_response.rb +297 -0
 - data/lib/spotted/models/album_list_tracks_params.rb +50 -0
 - data/lib/spotted/models/album_restriction_object.rb +39 -0
 - data/lib/spotted/models/album_retrieve_params.rb +33 -0
 - data/lib/spotted/models/album_retrieve_response.rb +287 -0
 - data/lib/spotted/models/artist_list_albums_params.rb +61 -0
 - data/lib/spotted/models/artist_list_albums_response.rb +195 -0
 - data/lib/spotted/models/artist_list_params.rb +27 -0
 - data/lib/spotted/models/artist_list_related_artists_params.rb +14 -0
 - data/lib/spotted/models/artist_list_related_artists_response.rb +16 -0
 - data/lib/spotted/models/artist_list_response.rb +16 -0
 - data/lib/spotted/models/artist_list_top_tracks_params.rb +33 -0
 - data/lib/spotted/models/artist_list_top_tracks_response.rb +16 -0
 - data/lib/spotted/models/artist_object.rb +108 -0
 - data/lib/spotted/models/artist_retrieve_params.rb +14 -0
 - data/lib/spotted/models/audio_analysis_retrieve_params.rb +14 -0
 - data/lib/spotted/models/audio_analysis_retrieve_response.rb +628 -0
 - data/lib/spotted/models/audio_feature_list_params.rb +27 -0
 - data/lib/spotted/models/audio_feature_list_response.rb +214 -0
 - data/lib/spotted/models/audio_feature_retrieve_params.rb +14 -0
 - data/lib/spotted/models/audio_feature_retrieve_response.rb +203 -0
 - data/lib/spotted/models/audiobook_list_chapters_params.rb +50 -0
 - data/lib/spotted/models/audiobook_list_params.rb +43 -0
 - data/lib/spotted/models/audiobook_list_response.rb +266 -0
 - data/lib/spotted/models/audiobook_retrieve_params.rb +33 -0
 - data/lib/spotted/models/audiobook_retrieve_response.rb +255 -0
 - data/lib/spotted/models/author_object.rb +19 -0
 - data/lib/spotted/models/browse/category_get_playlists_params.rb +36 -0
 - data/lib/spotted/models/browse/category_get_playlists_response.rb +29 -0
 - data/lib/spotted/models/browse/category_list_params.rb +51 -0
 - data/lib/spotted/models/browse/category_list_response.rb +121 -0
 - data/lib/spotted/models/browse/category_retrieve_params.rb +34 -0
 - data/lib/spotted/models/browse/category_retrieve_response.rb +47 -0
 - data/lib/spotted/models/browse_get_featured_playlists_params.rb +49 -0
 - data/lib/spotted/models/browse_get_featured_playlists_response.rb +27 -0
 - data/lib/spotted/models/browse_get_new_releases_params.rb +34 -0
 - data/lib/spotted/models/browse_get_new_releases_response.rb +245 -0
 - data/lib/spotted/models/chapter_list_params.rb +43 -0
 - data/lib/spotted/models/chapter_list_response.rb +408 -0
 - data/lib/spotted/models/chapter_restriction_object.rb +29 -0
 - data/lib/spotted/models/chapter_retrieve_params.rb +33 -0
 - data/lib/spotted/models/chapter_retrieve_response.rb +398 -0
 - data/lib/spotted/models/copyright_object.rb +28 -0
 - data/lib/spotted/models/episode_list_params.rb +43 -0
 - data/lib/spotted/models/episode_list_response.rb +16 -0
 - data/lib/spotted/models/episode_object.rb +382 -0
 - data/lib/spotted/models/episode_restriction_object.rb +28 -0
 - data/lib/spotted/models/episode_retrieve_params.rb +33 -0
 - data/lib/spotted/models/external_id_object.rb +35 -0
 - data/lib/spotted/models/external_url_object.rb +20 -0
 - data/lib/spotted/models/followers_object.rb +28 -0
 - data/lib/spotted/models/image_object.rb +35 -0
 - data/lib/spotted/models/linked_track_object.rb +53 -0
 - data/lib/spotted/models/market_list_params.rb +14 -0
 - data/lib/spotted/models/market_list_response.rb +16 -0
 - data/lib/spotted/models/me/album_check_params.rb +29 -0
 - data/lib/spotted/models/me/album_check_response.rb +10 -0
 - data/lib/spotted/models/me/album_list_params.rb +52 -0
 - data/lib/spotted/models/me/album_list_response.rb +318 -0
 - data/lib/spotted/models/me/album_remove_params.rb +31 -0
 - data/lib/spotted/models/me/album_save_params.rb +31 -0
 - data/lib/spotted/models/me/audiobook_check_params.rb +29 -0
 - data/lib/spotted/models/me/audiobook_check_response.rb +10 -0
 - data/lib/spotted/models/me/audiobook_list_params.rb +36 -0
 - data/lib/spotted/models/me/audiobook_list_response.rb +287 -0
 - data/lib/spotted/models/me/audiobook_remove_params.rb +29 -0
 - data/lib/spotted/models/me/audiobook_save_params.rb +29 -0
 - data/lib/spotted/models/me/context_object.rb +46 -0
 - data/lib/spotted/models/me/device_object.rb +82 -0
 - data/lib/spotted/models/me/episode_check_params.rb +29 -0
 - data/lib/spotted/models/me/episode_check_response.rb +10 -0
 - data/lib/spotted/models/me/episode_list_params.rb +52 -0
 - data/lib/spotted/models/me/episode_list_response.rb +32 -0
 - data/lib/spotted/models/me/episode_remove_params.rb +31 -0
 - data/lib/spotted/models/me/episode_save_params.rb +31 -0
 - data/lib/spotted/models/me/following_check_params.rb +49 -0
 - data/lib/spotted/models/me/following_check_response.rb +10 -0
 - data/lib/spotted/models/me/following_follow_params.rb +50 -0
 - data/lib/spotted/models/me/following_list_params.rb +53 -0
 - data/lib/spotted/models/me/following_list_response.rb +94 -0
 - data/lib/spotted/models/me/following_unfollow_params.rb +50 -0
 - data/lib/spotted/models/me/player/queue_add_params.rb +38 -0
 - data/lib/spotted/models/me/player/queue_get_params.rb +18 -0
 - data/lib/spotted/models/me/player/queue_get_response.rb +59 -0
 - data/lib/spotted/models/me/player_get_currently_playing_params.rb +48 -0
 - data/lib/spotted/models/me/player_get_currently_playing_response.rb +175 -0
 - data/lib/spotted/models/me/player_get_devices_params.rb +16 -0
 - data/lib/spotted/models/me/player_get_devices_response.rb +18 -0
 - data/lib/spotted/models/me/player_get_state_params.rb +48 -0
 - data/lib/spotted/models/me/player_get_state_response.rb +200 -0
 - data/lib/spotted/models/me/player_list_recently_played_params.rb +45 -0
 - data/lib/spotted/models/me/player_list_recently_played_response.rb +35 -0
 - data/lib/spotted/models/me/player_pause_playback_params.rb +28 -0
 - data/lib/spotted/models/me/player_seek_to_position_params.rb +38 -0
 - data/lib/spotted/models/me/player_set_repeat_mode_params.rb +38 -0
 - data/lib/spotted/models/me/player_set_volume_params.rb +36 -0
 - data/lib/spotted/models/me/player_skip_next_params.rb +28 -0
 - data/lib/spotted/models/me/player_skip_previous_params.rb +28 -0
 - data/lib/spotted/models/me/player_start_playback_params.rb +68 -0
 - data/lib/spotted/models/me/player_toggle_shuffle_params.rb +37 -0
 - data/lib/spotted/models/me/player_transfer_params.rb +40 -0
 - data/lib/spotted/models/me/playlist_list_params.rb +36 -0
 - data/lib/spotted/models/me/show_check_params.rb +29 -0
 - data/lib/spotted/models/me/show_check_response.rb +10 -0
 - data/lib/spotted/models/me/show_list_params.rb +36 -0
 - data/lib/spotted/models/me/show_list_response.rb +197 -0
 - data/lib/spotted/models/me/show_remove_params.rb +47 -0
 - data/lib/spotted/models/me/show_save_params.rb +31 -0
 - data/lib/spotted/models/me/top_list_top_artists_params.rb +47 -0
 - data/lib/spotted/models/me/top_list_top_tracks_params.rb +47 -0
 - data/lib/spotted/models/me/track_check_params.rb +29 -0
 - data/lib/spotted/models/me/track_check_response.rb +10 -0
 - data/lib/spotted/models/me/track_list_params.rb +52 -0
 - data/lib/spotted/models/me/track_list_response.rb +34 -0
 - data/lib/spotted/models/me/track_remove_params.rb +31 -0
 - data/lib/spotted/models/me/track_save_params.rb +74 -0
 - data/lib/spotted/models/me_retrieve_params.rb +14 -0
 - data/lib/spotted/models/me_retrieve_response.rb +157 -0
 - data/lib/spotted/models/narrator_object.rb +19 -0
 - data/lib/spotted/models/paging_playlist_object.rb +66 -0
 - data/lib/spotted/models/playlist_retrieve_params.rb +63 -0
 - data/lib/spotted/models/playlist_retrieve_response.rb +217 -0
 - data/lib/spotted/models/playlist_track_object.rb +64 -0
 - data/lib/spotted/models/playlist_tracks_ref_object.rb +28 -0
 - data/lib/spotted/models/playlist_update_params.rb +56 -0
 - data/lib/spotted/models/playlist_user_object.rb +65 -0
 - data/lib/spotted/models/playlists/follower_check_params.rb +29 -0
 - data/lib/spotted/models/playlists/follower_check_response.rb +10 -0
 - data/lib/spotted/models/playlists/follower_follow_params.rb +30 -0
 - data/lib/spotted/models/playlists/follower_unfollow_params.rb +16 -0
 - data/lib/spotted/models/playlists/image_list_params.rb +16 -0
 - data/lib/spotted/models/playlists/image_list_response.rb +10 -0
 - data/lib/spotted/models/playlists/image_update_params.rb +24 -0
 - data/lib/spotted/models/playlists/track_add_params.rb +45 -0
 - data/lib/spotted/models/playlists/track_add_response.rb +18 -0
 - data/lib/spotted/models/playlists/track_list_params.rb +82 -0
 - data/lib/spotted/models/playlists/track_remove_params.rb +52 -0
 - data/lib/spotted/models/playlists/track_remove_response.rb +18 -0
 - data/lib/spotted/models/playlists/track_update_params.rb +67 -0
 - data/lib/spotted/models/playlists/track_update_response.rb +18 -0
 - data/lib/spotted/models/recommendation_get_params.rb +549 -0
 - data/lib/spotted/models/recommendation_get_response.rb +86 -0
 - data/lib/spotted/models/recommendation_list_available_genre_seeds_params.rb +14 -0
 - data/lib/spotted/models/recommendation_list_available_genre_seeds_response.rb +16 -0
 - data/lib/spotted/models/resume_point_object.rb +27 -0
 - data/lib/spotted/models/search_retrieve_params.rb +120 -0
 - data/lib/spotted/models/search_retrieve_response.rb +930 -0
 - data/lib/spotted/models/show_list_episodes_params.rb +50 -0
 - data/lib/spotted/models/show_list_params.rb +43 -0
 - data/lib/spotted/models/show_list_response.rb +176 -0
 - data/lib/spotted/models/show_retrieve_params.rb +33 -0
 - data/lib/spotted/models/show_retrieve_response.rb +238 -0
 - data/lib/spotted/models/simplified_artist_object.rb +73 -0
 - data/lib/spotted/models/simplified_chapter_object.rb +209 -0
 - data/lib/spotted/models/simplified_episode_object.rb +211 -0
 - data/lib/spotted/models/simplified_playlist_object.rb +147 -0
 - data/lib/spotted/models/simplified_track_object.rb +161 -0
 - data/lib/spotted/models/time_interval_object.rb +32 -0
 - data/lib/spotted/models/track_list_params.rb +43 -0
 - data/lib/spotted/models/track_list_response.rb +16 -0
 - data/lib/spotted/models/track_object.rb +375 -0
 - data/lib/spotted/models/track_restriction_object.rb +28 -0
 - data/lib/spotted/models/track_retrieve_params.rb +33 -0
 - data/lib/spotted/models/user_retrieve_profile_params.rb +14 -0
 - data/lib/spotted/models/user_retrieve_profile_response.rb +90 -0
 - data/lib/spotted/models/users/playlist_create_params.rb +65 -0
 - data/lib/spotted/models/users/playlist_create_response.rb +219 -0
 - data/lib/spotted/models/users/playlist_list_params.rb +36 -0
 - data/lib/spotted/models.rb +168 -0
 - data/lib/spotted/request_options.rb +77 -0
 - data/lib/spotted/resources/albums.rb +102 -0
 - data/lib/spotted/resources/artists.rb +150 -0
 - data/lib/spotted/resources/audio_analysis.rb +41 -0
 - data/lib/spotted/resources/audio_features.rb +67 -0
 - data/lib/spotted/resources/audiobooks.rb +105 -0
 - data/lib/spotted/resources/browse/categories.rb +105 -0
 - data/lib/spotted/resources/browse.rb +78 -0
 - data/lib/spotted/resources/chapters.rb +72 -0
 - data/lib/spotted/resources/episodes.rb +69 -0
 - data/lib/spotted/resources/markets.rb +32 -0
 - data/lib/spotted/resources/me/albums.rb +127 -0
 - data/lib/spotted/resources/me/audiobooks.rb +121 -0
 - data/lib/spotted/resources/me/episodes.rb +138 -0
 - data/lib/spotted/resources/me/following.rb +133 -0
 - data/lib/spotted/resources/me/player/queue.rb +65 -0
 - data/lib/spotted/resources/me/player.rb +382 -0
 - data/lib/spotted/resources/me/playlists.rb +44 -0
 - data/lib/spotted/resources/me/shows.rb +127 -0
 - data/lib/spotted/resources/me/top.rb +76 -0
 - data/lib/spotted/resources/me/tracks.rb +121 -0
 - data/lib/spotted/resources/me.rb +69 -0
 - data/lib/spotted/resources/playlists/followers.rb +93 -0
 - data/lib/spotted/resources/playlists/images.rb +67 -0
 - data/lib/spotted/resources/playlists/tracks.rb +157 -0
 - data/lib/spotted/resources/playlists.rb +91 -0
 - data/lib/spotted/resources/recommendations.rb +160 -0
 - data/lib/spotted/resources/search.rb +51 -0
 - data/lib/spotted/resources/shows.rb +102 -0
 - data/lib/spotted/resources/tracks.rb +69 -0
 - data/lib/spotted/resources/users/playlists.rb +82 -0
 - data/lib/spotted/resources/users.rb +41 -0
 - data/lib/spotted/version.rb +5 -0
 - data/lib/spotted.rb +257 -0
 - data/manifest.yaml +15 -0
 - data/rbi/spotted/client.rbi +104 -0
 - data/rbi/spotted/errors.rbi +205 -0
 - data/rbi/spotted/file_part.rbi +37 -0
 - data/rbi/spotted/internal/cursor_url_page.rbi +22 -0
 - data/rbi/spotted/internal/oauth2.rbi +34 -0
 - data/rbi/spotted/internal/transport/base_client.rbi +292 -0
 - data/rbi/spotted/internal/transport/pooled_net_requester.rbi +79 -0
 - data/rbi/spotted/internal/type/array_of.rbi +104 -0
 - data/rbi/spotted/internal/type/base_model.rbi +302 -0
 - data/rbi/spotted/internal/type/base_page.rbi +42 -0
 - data/rbi/spotted/internal/type/boolean.rbi +58 -0
 - data/rbi/spotted/internal/type/converter.rbi +216 -0
 - data/rbi/spotted/internal/type/enum.rbi +82 -0
 - data/rbi/spotted/internal/type/file_input.rbi +59 -0
 - data/rbi/spotted/internal/type/hash_of.rbi +104 -0
 - data/rbi/spotted/internal/type/request_parameters.rbi +29 -0
 - data/rbi/spotted/internal/type/union.rbi +128 -0
 - data/rbi/spotted/internal/type/unknown.rbi +58 -0
 - data/rbi/spotted/internal/util.rbi +484 -0
 - data/rbi/spotted/internal.rbi +16 -0
 - data/rbi/spotted/models/album_list_params.rbi +74 -0
 - data/rbi/spotted/models/album_list_response.rbi +479 -0
 - data/rbi/spotted/models/album_list_tracks_params.rbi +86 -0
 - data/rbi/spotted/models/album_restriction_object.rbi +82 -0
 - data/rbi/spotted/models/album_retrieve_params.rbi +59 -0
 - data/rbi/spotted/models/album_retrieve_response.rbi +439 -0
 - data/rbi/spotted/models/artist_list_albums_params.rbi +103 -0
 - data/rbi/spotted/models/artist_list_albums_response.rbi +338 -0
 - data/rbi/spotted/models/artist_list_params.rbi +44 -0
 - data/rbi/spotted/models/artist_list_related_artists_params.rbi +30 -0
 - data/rbi/spotted/models/artist_list_related_artists_response.rbi +30 -0
 - data/rbi/spotted/models/artist_list_response.rbi +27 -0
 - data/rbi/spotted/models/artist_list_top_tracks_params.rbi +59 -0
 - data/rbi/spotted/models/artist_list_top_tracks_response.rbi +30 -0
 - data/rbi/spotted/models/artist_object.rbi +166 -0
 - data/rbi/spotted/models/artist_retrieve_params.rbi +27 -0
 - data/rbi/spotted/models/audio_analysis_retrieve_params.rbi +30 -0
 - data/rbi/spotted/models/audio_analysis_retrieve_response.rbi +1080 -0
 - data/rbi/spotted/models/audio_feature_list_params.rbi +44 -0
 - data/rbi/spotted/models/audio_feature_list_response.rbi +382 -0
 - data/rbi/spotted/models/audio_feature_retrieve_params.rbi +27 -0
 - data/rbi/spotted/models/audio_feature_retrieve_response.rbi +338 -0
 - data/rbi/spotted/models/audiobook_list_chapters_params.rbi +89 -0
 - data/rbi/spotted/models/audiobook_list_params.rbi +74 -0
 - data/rbi/spotted/models/audiobook_list_response.rbi +377 -0
 - data/rbi/spotted/models/audiobook_retrieve_params.rbi +59 -0
 - data/rbi/spotted/models/audiobook_retrieve_response.rbi +332 -0
 - data/rbi/spotted/models/author_object.rbi +30 -0
 - data/rbi/spotted/models/browse/category_get_playlists_params.rbi +64 -0
 - data/rbi/spotted/models/browse/category_get_playlists_response.rbi +51 -0
 - data/rbi/spotted/models/browse/category_list_params.rbi +89 -0
 - data/rbi/spotted/models/browse/category_list_response.rbi +204 -0
 - data/rbi/spotted/models/browse/category_retrieve_params.rbi +62 -0
 - data/rbi/spotted/models/browse/category_retrieve_response.rbi +68 -0
 - data/rbi/spotted/models/browse_get_featured_playlists_params.rbi +87 -0
 - data/rbi/spotted/models/browse_get_featured_playlists_response.rbi +49 -0
 - data/rbi/spotted/models/browse_get_new_releases_params.rbi +59 -0
 - data/rbi/spotted/models/browse_get_new_releases_response.rbi +423 -0
 - data/rbi/spotted/models/chapter_list_params.rbi +74 -0
 - data/rbi/spotted/models/chapter_list_response.rbi +588 -0
 - data/rbi/spotted/models/chapter_restriction_object.rbi +50 -0
 - data/rbi/spotted/models/chapter_retrieve_params.rbi +59 -0
 - data/rbi/spotted/models/chapter_retrieve_response.rbi +551 -0
 - data/rbi/spotted/models/copyright_object.rbi +41 -0
 - data/rbi/spotted/models/episode_list_params.rbi +74 -0
 - data/rbi/spotted/models/episode_list_response.rbi +30 -0
 - data/rbi/spotted/models/episode_object.rbi +485 -0
 - data/rbi/spotted/models/episode_restriction_object.rbi +48 -0
 - data/rbi/spotted/models/episode_retrieve_params.rbi +59 -0
 - data/rbi/spotted/models/external_id_object.rbi +50 -0
 - data/rbi/spotted/models/external_url_object.rbi +32 -0
 - data/rbi/spotted/models/followers_object.rbi +42 -0
 - data/rbi/spotted/models/image_object.rbi +47 -0
 - data/rbi/spotted/models/linked_track_object.rbi +88 -0
 - data/rbi/spotted/models/market_list_params.rbi +27 -0
 - data/rbi/spotted/models/market_list_response.rbi +26 -0
 - data/rbi/spotted/models/me/album_check_params.rbi +46 -0
 - data/rbi/spotted/models/me/album_check_response.rbi +13 -0
 - data/rbi/spotted/models/me/album_list_params.rbi +88 -0
 - data/rbi/spotted/models/me/album_list_response.rbi +529 -0
 - data/rbi/spotted/models/me/album_remove_params.rbi +56 -0
 - data/rbi/spotted/models/me/album_save_params.rbi +56 -0
 - data/rbi/spotted/models/me/audiobook_check_params.rbi +46 -0
 - data/rbi/spotted/models/me/audiobook_check_response.rbi +13 -0
 - data/rbi/spotted/models/me/audiobook_list_params.rbi +61 -0
 - data/rbi/spotted/models/me/audiobook_list_response.rbi +414 -0
 - data/rbi/spotted/models/me/audiobook_remove_params.rbi +49 -0
 - data/rbi/spotted/models/me/audiobook_save_params.rbi +46 -0
 - data/rbi/spotted/models/me/context_object.rbi +77 -0
 - data/rbi/spotted/models/me/device_object.rbi +123 -0
 - data/rbi/spotted/models/me/episode_check_params.rbi +46 -0
 - data/rbi/spotted/models/me/episode_check_response.rbi +13 -0
 - data/rbi/spotted/models/me/episode_list_params.rbi +88 -0
 - data/rbi/spotted/models/me/episode_list_response.rbi +55 -0
 - data/rbi/spotted/models/me/episode_remove_params.rbi +56 -0
 - data/rbi/spotted/models/me/episode_save_params.rbi +53 -0
 - data/rbi/spotted/models/me/following_check_params.rbi +86 -0
 - data/rbi/spotted/models/me/following_check_response.rbi +13 -0
 - data/rbi/spotted/models/me/following_follow_params.rbi +91 -0
 - data/rbi/spotted/models/me/following_list_params.rbi +89 -0
 - data/rbi/spotted/models/me/following_list_response.rbi +187 -0
 - data/rbi/spotted/models/me/following_unfollow_params.rbi +97 -0
 - data/rbi/spotted/models/me/player/queue_add_params.rbi +63 -0
 - data/rbi/spotted/models/me/player/queue_get_params.rbi +34 -0
 - data/rbi/spotted/models/me/player/queue_get_response.rbi +143 -0
 - data/rbi/spotted/models/me/player_get_currently_playing_params.rbi +88 -0
 - data/rbi/spotted/models/me/player_get_currently_playing_response.rbi +304 -0
 - data/rbi/spotted/models/me/player_get_devices_params.rbi +32 -0
 - data/rbi/spotted/models/me/player_get_devices_response.rbi +34 -0
 - data/rbi/spotted/models/me/player_get_state_params.rbi +85 -0
 - data/rbi/spotted/models/me/player_get_state_response.rbi +335 -0
 - data/rbi/spotted/models/me/player_list_recently_played_params.rbi +77 -0
 - data/rbi/spotted/models/me/player_list_recently_played_response.rbi +67 -0
 - data/rbi/spotted/models/me/player_pause_playback_params.rbi +50 -0
 - data/rbi/spotted/models/me/player_seek_to_position_params.rbi +65 -0
 - data/rbi/spotted/models/me/player_set_repeat_mode_params.rbi +65 -0
 - data/rbi/spotted/models/me/player_set_volume_params.rbi +61 -0
 - data/rbi/spotted/models/me/player_skip_next_params.rbi +47 -0
 - data/rbi/spotted/models/me/player_skip_previous_params.rbi +50 -0
 - data/rbi/spotted/models/me/player_start_playback_params.rbi +113 -0
 - data/rbi/spotted/models/me/player_toggle_shuffle_params.rbi +63 -0
 - data/rbi/spotted/models/me/player_transfer_params.rbi +66 -0
 - data/rbi/spotted/models/me/playlist_list_params.rbi +61 -0
 - data/rbi/spotted/models/me/show_check_params.rbi +46 -0
 - data/rbi/spotted/models/me/show_check_response.rbi +13 -0
 - data/rbi/spotted/models/me/show_list_params.rbi +61 -0
 - data/rbi/spotted/models/me/show_list_response.rbi +277 -0
 - data/rbi/spotted/models/me/show_remove_params.rbi +83 -0
 - data/rbi/spotted/models/me/show_save_params.rbi +56 -0
 - data/rbi/spotted/models/me/top_list_top_artists_params.rbi +81 -0
 - data/rbi/spotted/models/me/top_list_top_tracks_params.rbi +81 -0
 - data/rbi/spotted/models/me/track_check_params.rbi +46 -0
 - data/rbi/spotted/models/me/track_check_response.rbi +13 -0
 - data/rbi/spotted/models/me/track_list_params.rbi +88 -0
 - data/rbi/spotted/models/me/track_list_response.rbi +58 -0
 - data/rbi/spotted/models/me/track_remove_params.rbi +56 -0
 - data/rbi/spotted/models/me/track_save_params.rbi +130 -0
 - data/rbi/spotted/models/me_retrieve_params.rbi +27 -0
 - data/rbi/spotted/models/me_retrieve_response.rbi +257 -0
 - data/rbi/spotted/models/narrator_object.rbi +30 -0
 - data/rbi/spotted/models/paging_playlist_object.rbi +83 -0
 - data/rbi/spotted/models/playlist_retrieve_params.rbi +112 -0
 - data/rbi/spotted/models/playlist_retrieve_response.rbi +327 -0
 - data/rbi/spotted/models/playlist_track_object.rbi +101 -0
 - data/rbi/spotted/models/playlist_tracks_ref_object.rbi +41 -0
 - data/rbi/spotted/models/playlist_update_params.rbi +93 -0
 - data/rbi/spotted/models/playlist_user_object.rbi +109 -0
 - data/rbi/spotted/models/playlists/follower_check_params.rbi +52 -0
 - data/rbi/spotted/models/playlists/follower_check_response.rbi +13 -0
 - data/rbi/spotted/models/playlists/follower_follow_params.rbi +54 -0
 - data/rbi/spotted/models/playlists/follower_unfollow_params.rbi +32 -0
 - data/rbi/spotted/models/playlists/image_list_params.rbi +32 -0
 - data/rbi/spotted/models/playlists/image_list_response.rbi +13 -0
 - data/rbi/spotted/models/playlists/image_update_params.rbi +45 -0
 - data/rbi/spotted/models/playlists/track_add_params.rbi +82 -0
 - data/rbi/spotted/models/playlists/track_add_response.rbi +31 -0
 - data/rbi/spotted/models/playlists/track_list_params.rbi +141 -0
 - data/rbi/spotted/models/playlists/track_remove_params.rbi +100 -0
 - data/rbi/spotted/models/playlists/track_remove_response.rbi +31 -0
 - data/rbi/spotted/models/playlists/track_update_params.rbi +111 -0
 - data/rbi/spotted/models/playlists/track_update_response.rbi +31 -0
 - data/rbi/spotted/models/recommendation_get_params.rbi +864 -0
 - data/rbi/spotted/models/recommendation_get_response.rbi +152 -0
 - data/rbi/spotted/models/recommendation_list_available_genre_seeds_params.rbi +30 -0
 - data/rbi/spotted/models/recommendation_list_available_genre_seeds_response.rbi +26 -0
 - data/rbi/spotted/models/resume_point_object.rbi +47 -0
 - data/rbi/spotted/models/search_retrieve_params.rbi +218 -0
 - data/rbi/spotted/models/search_retrieve_response.rbi +1381 -0
 - data/rbi/spotted/models/show_list_episodes_params.rbi +86 -0
 - data/rbi/spotted/models/show_list_params.rbi +74 -0
 - data/rbi/spotted/models/show_list_response.rbi +238 -0
 - data/rbi/spotted/models/show_retrieve_params.rbi +59 -0
 - data/rbi/spotted/models/show_retrieve_response.rbi +305 -0
 - data/rbi/spotted/models/simplified_artist_object.rbi +121 -0
 - data/rbi/spotted/models/simplified_chapter_object.rbi +287 -0
 - data/rbi/spotted/models/simplified_episode_object.rbi +289 -0
 - data/rbi/spotted/models/simplified_playlist_object.rbi +230 -0
 - data/rbi/spotted/models/simplified_track_object.rbi +239 -0
 - data/rbi/spotted/models/time_interval_object.rbi +54 -0
 - data/rbi/spotted/models/track_list_params.rbi +74 -0
 - data/rbi/spotted/models/track_list_response.rbi +27 -0
 - data/rbi/spotted/models/track_object.rbi +556 -0
 - data/rbi/spotted/models/track_restriction_object.rbi +48 -0
 - data/rbi/spotted/models/track_retrieve_params.rbi +59 -0
 - data/rbi/spotted/models/user_retrieve_profile_params.rbi +27 -0
 - data/rbi/spotted/models/user_retrieve_profile_response.rbi +159 -0
 - data/rbi/spotted/models/users/playlist_create_params.rbi +107 -0
 - data/rbi/spotted/models/users/playlist_create_response.rbi +336 -0
 - data/rbi/spotted/models/users/playlist_list_params.rbi +64 -0
 - data/rbi/spotted/models.rbi +132 -0
 - data/rbi/spotted/request_options.rbi +57 -0
 - data/rbi/spotted/resources/albums.rbi +100 -0
 - data/rbi/spotted/resources/artists.rbi +129 -0
 - data/rbi/spotted/resources/audio_analysis.rbi +29 -0
 - data/rbi/spotted/resources/audio_features.rbi +44 -0
 - data/rbi/spotted/resources/audiobooks.rbi +105 -0
 - data/rbi/spotted/resources/browse/categories.rbi +91 -0
 - data/rbi/spotted/resources/browse.rbi +63 -0
 - data/rbi/spotted/resources/chapters.rbi +69 -0
 - data/rbi/spotted/resources/episodes.rbi +66 -0
 - data/rbi/spotted/resources/markets.rbi +21 -0
 - data/rbi/spotted/resources/me/albums.rbi +101 -0
 - data/rbi/spotted/resources/me/audiobooks.rbi +86 -0
 - data/rbi/spotted/resources/me/episodes.rbi +112 -0
 - data/rbi/spotted/resources/me/following.rbi +99 -0
 - data/rbi/spotted/resources/me/player/queue.rbi +45 -0
 - data/rbi/spotted/resources/me/player.rbi +315 -0
 - data/rbi/spotted/resources/me/playlists.rbi +34 -0
 - data/rbi/spotted/resources/me/shows.rbi +101 -0
 - data/rbi/spotted/resources/me/top.rbi +62 -0
 - data/rbi/spotted/resources/me/tracks.rbi +112 -0
 - data/rbi/spotted/resources/me.rbi +49 -0
 - data/rbi/spotted/resources/playlists/followers.rbi +70 -0
 - data/rbi/spotted/resources/playlists/images.rbi +47 -0
 - data/rbi/spotted/resources/playlists/tracks.rbi +177 -0
 - data/rbi/spotted/resources/playlists.rbi +102 -0
 - data/rbi/spotted/resources/recommendations.rbi +336 -0
 - data/rbi/spotted/resources/search.rbi +71 -0
 - data/rbi/spotted/resources/shows.rbi +100 -0
 - data/rbi/spotted/resources/tracks.rbi +66 -0
 - data/rbi/spotted/resources/users/playlists.rbi +78 -0
 - data/rbi/spotted/resources/users.rbi +29 -0
 - data/rbi/spotted/version.rbi +5 -0
 - data/sig/spotted/client.rbs +62 -0
 - data/sig/spotted/errors.rbs +117 -0
 - data/sig/spotted/file_part.rbs +21 -0
 - data/sig/spotted/internal/cursor_url_page.rbs +13 -0
 - data/sig/spotted/internal/oauth2.rbs +19 -0
 - data/sig/spotted/internal/transport/base_client.rbs +131 -0
 - data/sig/spotted/internal/transport/pooled_net_requester.rbs +45 -0
 - data/sig/spotted/internal/type/array_of.rbs +48 -0
 - data/sig/spotted/internal/type/base_model.rbs +102 -0
 - data/sig/spotted/internal/type/base_page.rbs +24 -0
 - data/sig/spotted/internal/type/boolean.rbs +26 -0
 - data/sig/spotted/internal/type/converter.rbs +79 -0
 - data/sig/spotted/internal/type/enum.rbs +32 -0
 - data/sig/spotted/internal/type/file_input.rbs +25 -0
 - data/sig/spotted/internal/type/hash_of.rbs +48 -0
 - data/sig/spotted/internal/type/request_parameters.rbs +17 -0
 - data/sig/spotted/internal/type/union.rbs +52 -0
 - data/sig/spotted/internal/type/unknown.rbs +26 -0
 - data/sig/spotted/internal/util.rbs +185 -0
 - data/sig/spotted/internal.rbs +9 -0
 - data/sig/spotted/models/album_list_params.rbs +30 -0
 - data/sig/spotted/models/album_list_response.rbs +237 -0
 - data/sig/spotted/models/album_list_tracks_params.rbs +38 -0
 - data/sig/spotted/models/album_restriction_object.rbs +34 -0
 - data/sig/spotted/models/album_retrieve_params.rbs +25 -0
 - data/sig/spotted/models/album_retrieve_response.rbs +222 -0
 - data/sig/spotted/models/artist_list_albums_params.rbs +49 -0
 - data/sig/spotted/models/artist_list_albums_response.rbs +141 -0
 - data/sig/spotted/models/artist_list_params.rbs +20 -0
 - data/sig/spotted/models/artist_list_related_artists_params.rbs +15 -0
 - data/sig/spotted/models/artist_list_related_artists_response.rbs +14 -0
 - data/sig/spotted/models/artist_list_response.rbs +13 -0
 - data/sig/spotted/models/artist_list_top_tracks_params.rbs +25 -0
 - data/sig/spotted/models/artist_list_top_tracks_response.rbs +14 -0
 - data/sig/spotted/models/artist_object.rbs +101 -0
 - data/sig/spotted/models/artist_retrieve_params.rbs +15 -0
 - data/sig/spotted/models/audio_analysis_retrieve_params.rbs +15 -0
 - data/sig/spotted/models/audio_analysis_retrieve_response.rbs +518 -0
 - data/sig/spotted/models/audio_feature_list_params.rbs +20 -0
 - data/sig/spotted/models/audio_feature_list_response.rbs +170 -0
 - data/sig/spotted/models/audio_feature_retrieve_params.rbs +15 -0
 - data/sig/spotted/models/audio_feature_retrieve_response.rbs +153 -0
 - data/sig/spotted/models/audiobook_list_chapters_params.rbs +38 -0
 - data/sig/spotted/models/audiobook_list_params.rbs +30 -0
 - data/sig/spotted/models/audiobook_list_response.rbs +189 -0
 - data/sig/spotted/models/audiobook_retrieve_params.rbs +25 -0
 - data/sig/spotted/models/audiobook_retrieve_response.rbs +174 -0
 - data/sig/spotted/models/author_object.rbs +15 -0
 - data/sig/spotted/models/browse/category_get_playlists_params.rbs +34 -0
 - data/sig/spotted/models/browse/category_get_playlists_response.rbs +30 -0
 - data/sig/spotted/models/browse/category_list_params.rbs +40 -0
 - data/sig/spotted/models/browse/category_list_response.rbs +101 -0
 - data/sig/spotted/models/browse/category_retrieve_params.rbs +27 -0
 - data/sig/spotted/models/browse/category_retrieve_response.rbs +37 -0
 - data/sig/spotted/models/browse_get_featured_playlists_params.rbs +38 -0
 - data/sig/spotted/models/browse_get_featured_playlists_response.rbs +28 -0
 - data/sig/spotted/models/browse_get_new_releases_params.rbs +32 -0
 - data/sig/spotted/models/browse_get_new_releases_response.rbs +185 -0
 - data/sig/spotted/models/chapter_list_params.rbs +30 -0
 - data/sig/spotted/models/chapter_list_response.rbs +286 -0
 - data/sig/spotted/models/chapter_restriction_object.rbs +15 -0
 - data/sig/spotted/models/chapter_retrieve_params.rbs +25 -0
 - data/sig/spotted/models/chapter_retrieve_response.rbs +271 -0
 - data/sig/spotted/models/copyright_object.rbs +19 -0
 - data/sig/spotted/models/episode_list_params.rbs +30 -0
 - data/sig/spotted/models/episode_list_response.rbs +13 -0
 - data/sig/spotted/models/episode_object.rbs +259 -0
 - data/sig/spotted/models/episode_restriction_object.rbs +15 -0
 - data/sig/spotted/models/episode_retrieve_params.rbs +25 -0
 - data/sig/spotted/models/external_id_object.rbs +23 -0
 - data/sig/spotted/models/external_url_object.rbs +15 -0
 - data/sig/spotted/models/followers_object.rbs +17 -0
 - data/sig/spotted/models/image_object.rbs +17 -0
 - data/sig/spotted/models/linked_track_object.rbs +52 -0
 - data/sig/spotted/models/market_list_params.rbs +14 -0
 - data/sig/spotted/models/market_list_response.rbs +15 -0
 - data/sig/spotted/models/me/album_check_params.rbs +25 -0
 - data/sig/spotted/models/me/album_check_response.rbs +9 -0
 - data/sig/spotted/models/me/album_list_params.rbs +40 -0
 - data/sig/spotted/models/me/album_list_response.rbs +249 -0
 - data/sig/spotted/models/me/album_remove_params.rbs +28 -0
 - data/sig/spotted/models/me/album_save_params.rbs +28 -0
 - data/sig/spotted/models/me/audiobook_check_params.rbs +25 -0
 - data/sig/spotted/models/me/audiobook_check_response.rbs +9 -0
 - data/sig/spotted/models/me/audiobook_list_params.rbs +34 -0
 - data/sig/spotted/models/me/audiobook_list_response.rbs +204 -0
 - data/sig/spotted/models/me/audiobook_remove_params.rbs +25 -0
 - data/sig/spotted/models/me/audiobook_save_params.rbs +25 -0
 - data/sig/spotted/models/me/context_object.rbs +47 -0
 - data/sig/spotted/models/me/device_object.rbs +69 -0
 - data/sig/spotted/models/me/episode_check_params.rbs +25 -0
 - data/sig/spotted/models/me/episode_check_response.rbs +9 -0
 - data/sig/spotted/models/me/episode_list_params.rbs +40 -0
 - data/sig/spotted/models/me/episode_list_response.rbs +25 -0
 - data/sig/spotted/models/me/episode_remove_params.rbs +28 -0
 - data/sig/spotted/models/me/episode_save_params.rbs +26 -0
 - data/sig/spotted/models/me/following_check_params.rbs +41 -0
 - data/sig/spotted/models/me/following_check_response.rbs +9 -0
 - data/sig/spotted/models/me/following_follow_params.rbs +44 -0
 - data/sig/spotted/models/me/following_list_params.rbs +52 -0
 - data/sig/spotted/models/me/following_list_response.rbs +94 -0
 - data/sig/spotted/models/me/following_unfollow_params.rbs +46 -0
 - data/sig/spotted/models/me/player/queue_add_params.rbs +34 -0
 - data/sig/spotted/models/me/player/queue_get_params.rbs +19 -0
 - data/sig/spotted/models/me/player/queue_get_response.rbs +53 -0
 - data/sig/spotted/models/me/player_get_currently_playing_params.rbs +34 -0
 - data/sig/spotted/models/me/player_get_currently_playing_response.rbs +160 -0
 - data/sig/spotted/models/me/player_get_devices_params.rbs +17 -0
 - data/sig/spotted/models/me/player_get_devices_response.rbs +16 -0
 - data/sig/spotted/models/me/player_get_state_params.rbs +34 -0
 - data/sig/spotted/models/me/player_get_state_response.rbs +181 -0
 - data/sig/spotted/models/me/player_list_recently_played_params.rbs +40 -0
 - data/sig/spotted/models/me/player_list_recently_played_response.rbs +38 -0
 - data/sig/spotted/models/me/player_pause_playback_params.rbs +27 -0
 - data/sig/spotted/models/me/player_seek_to_position_params.rbs +32 -0
 - data/sig/spotted/models/me/player_set_repeat_mode_params.rbs +32 -0
 - data/sig/spotted/models/me/player_set_volume_params.rbs +32 -0
 - data/sig/spotted/models/me/player_skip_next_params.rbs +27 -0
 - data/sig/spotted/models/me/player_skip_previous_params.rbs +27 -0
 - data/sig/spotted/models/me/player_start_playback_params.rbs +58 -0
 - data/sig/spotted/models/me/player_toggle_shuffle_params.rbs +32 -0
 - data/sig/spotted/models/me/player_transfer_params.rbs +32 -0
 - data/sig/spotted/models/me/playlist_list_params.rbs +34 -0
 - data/sig/spotted/models/me/show_check_params.rbs +25 -0
 - data/sig/spotted/models/me/show_check_response.rbs +9 -0
 - data/sig/spotted/models/me/show_list_params.rbs +34 -0
 - data/sig/spotted/models/me/show_list_response.rbs +137 -0
 - data/sig/spotted/models/me/show_remove_params.rbs +34 -0
 - data/sig/spotted/models/me/show_save_params.rbs +28 -0
 - data/sig/spotted/models/me/top_list_top_artists_params.rbs +40 -0
 - data/sig/spotted/models/me/top_list_top_tracks_params.rbs +40 -0
 - data/sig/spotted/models/me/track_check_params.rbs +25 -0
 - data/sig/spotted/models/me/track_check_response.rbs +9 -0
 - data/sig/spotted/models/me/track_list_params.rbs +40 -0
 - data/sig/spotted/models/me/track_list_response.rbs +21 -0
 - data/sig/spotted/models/me/track_remove_params.rbs +28 -0
 - data/sig/spotted/models/me/track_save_params.rbs +49 -0
 - data/sig/spotted/models/me_retrieve_params.rbs +14 -0
 - data/sig/spotted/models/me_retrieve_response.rbs +121 -0
 - data/sig/spotted/models/narrator_object.rbs +15 -0
 - data/sig/spotted/models/paging_playlist_object.rbs +50 -0
 - data/sig/spotted/models/playlist_retrieve_params.rbs +38 -0
 - data/sig/spotted/models/playlist_retrieve_response.rbs +178 -0
 - data/sig/spotted/models/playlist_track_object.rbs +55 -0
 - data/sig/spotted/models/playlist_tracks_ref_object.rbs +19 -0
 - data/sig/spotted/models/playlist_update_params.rbs +44 -0
 - data/sig/spotted/models/playlist_user_object.rbs +64 -0
 - data/sig/spotted/models/playlists/follower_check_params.rbs +27 -0
 - data/sig/spotted/models/playlists/follower_check_response.rbs +9 -0
 - data/sig/spotted/models/playlists/follower_follow_params.rbs +27 -0
 - data/sig/spotted/models/playlists/follower_unfollow_params.rbs +17 -0
 - data/sig/spotted/models/playlists/image_list_params.rbs +17 -0
 - data/sig/spotted/models/playlists/image_list_response.rbs +9 -0
 - data/sig/spotted/models/playlists/image_update_params.rbs +25 -0
 - data/sig/spotted/models/playlists/track_add_params.rbs +34 -0
 - data/sig/spotted/models/playlists/track_add_response.rbs +17 -0
 - data/sig/spotted/models/playlists/track_list_params.rbs +58 -0
 - data/sig/spotted/models/playlists/track_remove_params.rbs +47 -0
 - data/sig/spotted/models/playlists/track_remove_response.rbs +17 -0
 - data/sig/spotted/models/playlists/track_update_params.rbs +58 -0
 - data/sig/spotted/models/playlists/track_update_response.rbs +17 -0
 - data/sig/spotted/models/recommendation_get_params.rbs +350 -0
 - data/sig/spotted/models/recommendation_get_response.rbs +79 -0
 - data/sig/spotted/models/recommendation_list_available_genre_seeds_params.rbs +15 -0
 - data/sig/spotted/models/recommendation_list_available_genre_seeds_response.rbs +14 -0
 - data/sig/spotted/models/resume_point_object.rbs +23 -0
 - data/sig/spotted/models/search_retrieve_params.rbs +88 -0
 - data/sig/spotted/models/search_retrieve_response.rbs +706 -0
 - data/sig/spotted/models/show_list_episodes_params.rbs +38 -0
 - data/sig/spotted/models/show_list_params.rbs +30 -0
 - data/sig/spotted/models/show_list_response.rbs +125 -0
 - data/sig/spotted/models/show_retrieve_params.rbs +25 -0
 - data/sig/spotted/models/show_retrieve_response.rbs +162 -0
 - data/sig/spotted/models/simplified_artist_object.rbs +71 -0
 - data/sig/spotted/models/simplified_chapter_object.rbs +147 -0
 - data/sig/spotted/models/simplified_episode_object.rbs +147 -0
 - data/sig/spotted/models/simplified_playlist_object.rbs +126 -0
 - data/sig/spotted/models/simplified_track_object.rbs +140 -0
 - data/sig/spotted/models/time_interval_object.rbs +28 -0
 - data/sig/spotted/models/track_list_params.rbs +30 -0
 - data/sig/spotted/models/track_list_response.rbs +13 -0
 - data/sig/spotted/models/track_object.rbs +295 -0
 - data/sig/spotted/models/track_restriction_object.rbs +15 -0
 - data/sig/spotted/models/track_retrieve_params.rbs +25 -0
 - data/sig/spotted/models/user_retrieve_profile_params.rbs +15 -0
 - data/sig/spotted/models/user_retrieve_profile_response.rbs +85 -0
 - data/sig/spotted/models/users/playlist_create_params.rbs +44 -0
 - data/sig/spotted/models/users/playlist_create_response.rbs +180 -0
 - data/sig/spotted/models/users/playlist_list_params.rbs +34 -0
 - data/sig/spotted/models.rbs +127 -0
 - data/sig/spotted/request_options.rbs +34 -0
 - data/sig/spotted/resources/albums.rbs +27 -0
 - data/sig/spotted/resources/artists.rbs +37 -0
 - data/sig/spotted/resources/audio_analysis.rbs +12 -0
 - data/sig/spotted/resources/audio_features.rbs +17 -0
 - data/sig/spotted/resources/audiobooks.rbs +27 -0
 - data/sig/spotted/resources/browse/categories.rbs +29 -0
 - data/sig/spotted/resources/browse.rbs +22 -0
 - data/sig/spotted/resources/chapters.rbs +19 -0
 - data/sig/spotted/resources/episodes.rbs +19 -0
 - data/sig/spotted/resources/markets.rbs +11 -0
 - data/sig/spotted/resources/me/albums.rbs +31 -0
 - data/sig/spotted/resources/me/audiobooks.rbs +27 -0
 - data/sig/spotted/resources/me/episodes.rbs +31 -0
 - data/sig/spotted/resources/me/following.rbs +34 -0
 - data/sig/spotted/resources/me/player/queue.rbs +21 -0
 - data/sig/spotted/resources/me/player.rbs +88 -0
 - data/sig/spotted/resources/me/playlists.rbs +15 -0
 - data/sig/spotted/resources/me/shows.rbs +31 -0
 - data/sig/spotted/resources/me/top.rbs +23 -0
 - data/sig/spotted/resources/me/tracks.rbs +32 -0
 - data/sig/spotted/resources/me.rbs +29 -0
 - data/sig/spotted/resources/playlists/followers.rbs +26 -0
 - data/sig/spotted/resources/playlists/images.rbs +20 -0
 - data/sig/spotted/resources/playlists/tracks.rbs +43 -0
 - data/sig/spotted/resources/playlists.rbs +30 -0
 - data/sig/spotted/resources/recommendations.rbs +62 -0
 - data/sig/spotted/resources/search.rbs +17 -0
 - data/sig/spotted/resources/shows.rbs +27 -0
 - data/sig/spotted/resources/tracks.rbs +19 -0
 - data/sig/spotted/resources/users/playlists.rbs +25 -0
 - data/sig/spotted/resources/users.rbs +14 -0
 - data/sig/spotted/version.rbs +3 -0
 - metadata +734 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 67ece5e6ee4843b9441e3846cbbaf8e60ef18d5e02b554df581393cebdbccf97
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: f392bfcd4da1fbf4bcf8dc54ced78c85538177d817fd784ef717774f9e7d5245
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 4d55e8a6eb42dbcc2f0adcbc5eb80c3c4046fd396bf33fa5a919f7d7c16f242ee1e8037acaa3d20f6dc7b4dfe66cab143f2acc6addf70edf160566c6bd612d5d
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: c6cf2a63e8298aec44d8eefa75d064b86578d890341d69e479a0ebef3f9dad15f92a4d18304c5a0bf26f13e3c2e03a3e92eb475db7236a0c8f378544f0ceff62
         
     | 
    
        data/.ignore
    ADDED
    
    
    
        data/CHANGELOG.md
    ADDED
    
    | 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Changelog
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            ## 0.1.0 (2025-10-24)
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Full Changelog: [v0.0.1...v0.1.0](https://github.com/cjavdev/spotted/compare/v0.0.1...v0.1.0)
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ### Features
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            * **api:** add contact ([ad87fa7](https://github.com/cjavdev/spotted/commit/ad87fa77f3182ed0b150de39ceb3337be71e4b3f))
         
     | 
| 
      
 10 
     | 
    
         
            +
            * **api:** apply all suggested fixes ([c4ca210](https://github.com/cjavdev/spotted/commit/c4ca210ed3cb738a84095be888af4fc9a45f1628))
         
     | 
| 
      
 11 
     | 
    
         
            +
            * **api:** manual updates ([a330f57](https://github.com/cjavdev/spotted/commit/a330f5777708dc23682ebbb22ea6f15527df33d1))
         
     | 
| 
      
 12 
     | 
    
         
            +
            * **api:** manual updates ([d59194f](https://github.com/cjavdev/spotted/commit/d59194f15129a3eefda85f37a0a4bc314077fc74))
         
     | 
| 
      
 13 
     | 
    
         
            +
            * **api:** manual updates ([3fe302e](https://github.com/cjavdev/spotted/commit/3fe302ee63021ee1ffd9e57b484a00a5218ddd41))
         
     | 
| 
      
 14 
     | 
    
         
            +
            * **api:** manual updates ([348e8cc](https://github.com/cjavdev/spotted/commit/348e8ccf3d7d37ca4c614ff9b7fef7b6ed05f238))
         
     | 
| 
      
 15 
     | 
    
         
            +
            * **api:** manual updates ([8778e9e](https://github.com/cjavdev/spotted/commit/8778e9e2884f74031f7907bd1a91bfc8a87b02b0))
         
     | 
| 
      
 16 
     | 
    
         
            +
            * **api:** manual updates ([6d67867](https://github.com/cjavdev/spotted/commit/6d678675175ffa86217a0e818b52bac7edd02032))
         
     | 
| 
      
 17 
     | 
    
         
            +
            * **api:** manual updates ([570f827](https://github.com/cjavdev/spotted/commit/570f82718e60a1118e4ed55792d447c3ee0d7294))
         
     | 
| 
      
 18 
     | 
    
         
            +
            * **api:** manual updates ([0a8e919](https://github.com/cjavdev/spotted/commit/0a8e91960f01ba95997252abe8a1f2353566919d))
         
     | 
| 
      
 19 
     | 
    
         
            +
            * **api:** regenerate Stainless config ([9d76367](https://github.com/cjavdev/spotted/commit/9d7636786de76787868438084a54f2bfde50fbe2))
         
     | 
| 
      
 20 
     | 
    
         
            +
            * **api:** rename methods to add list prefix ([c680e99](https://github.com/cjavdev/spotted/commit/c680e99709dbccf81b535cbcc8910d3d6c0bb52d))
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            ### Chores
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            * update SDK settings ([54e4e23](https://github.com/cjavdev/spotted/commit/54e4e2361d68e5f2a386dec969dc46411010138a))
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,236 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Spotted Ruby API library
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            The Spotted Ruby library provides convenient access to the Spotted REST API from any Ruby 3.2.0+ application. It ships with comprehensive types & docstrings in Yard, RBS, and RBI – [see below](https://github.com/cjavdev/spotted#Sorbet) for usage with Sorbet. The standard library's `net/http` is used as the HTTP transport, with connection pooling via the `connection_pool` gem.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            It is generated with [Stainless](https://www.stainless.com/).
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ## Documentation
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            Documentation for releases of this gem can be found [on RubyDoc](https://gemdocs.org/gems/spotted).
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            The REST API documentation can be found on [community.spotify.com](https://community.spotify.com/t5/Spotify-for-Developers/bd-p/Spotify_Developer).
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            To use this gem, install via Bundler by adding the following to your application's `Gemfile`:
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            <!-- x-release-please-start-version -->
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 20 
     | 
    
         
            +
            gem "spotted", "~> 0.1.0"
         
     | 
| 
      
 21 
     | 
    
         
            +
            ```
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            <!-- x-release-please-end -->
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            ## Usage
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 28 
     | 
    
         
            +
            require "bundler/setup"
         
     | 
| 
      
 29 
     | 
    
         
            +
            require "spotted"
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            spotted = Spotted::Client.new(
         
     | 
| 
      
 32 
     | 
    
         
            +
              client_id: ENV["SPOTIFY_CLIENT_ID"], # This is the default and can be omitted
         
     | 
| 
      
 33 
     | 
    
         
            +
              client_secret: ENV["SPOTIFY_CLIENT_SECRET"] # This is the default and can be omitted
         
     | 
| 
      
 34 
     | 
    
         
            +
            )
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            album = spotted.albums.retrieve("4aawyAB9vmqN3uQ7FjRGTy")
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            puts(album.id)
         
     | 
| 
      
 39 
     | 
    
         
            +
            ```
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            ### Handling errors
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            When the library is unable to connect to the API, or if the API returns a non-success status code (i.e., 4xx or 5xx response), a subclass of `Spotted::Errors::APIError` will be thrown:
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 46 
     | 
    
         
            +
            begin
         
     | 
| 
      
 47 
     | 
    
         
            +
              album = spotted.albums.retrieve("4aawyAB9vmqN3uQ7FjRGTy")
         
     | 
| 
      
 48 
     | 
    
         
            +
            rescue Spotted::Errors::APIConnectionError => e
         
     | 
| 
      
 49 
     | 
    
         
            +
              puts("The server could not be reached")
         
     | 
| 
      
 50 
     | 
    
         
            +
              puts(e.cause)  # an underlying Exception, likely raised within `net/http`
         
     | 
| 
      
 51 
     | 
    
         
            +
            rescue Spotted::Errors::RateLimitError => e
         
     | 
| 
      
 52 
     | 
    
         
            +
              puts("A 429 status code was received; we should back off a bit.")
         
     | 
| 
      
 53 
     | 
    
         
            +
            rescue Spotted::Errors::APIStatusError => e
         
     | 
| 
      
 54 
     | 
    
         
            +
              puts("Another non-200-range status code was received")
         
     | 
| 
      
 55 
     | 
    
         
            +
              puts(e.status)
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
| 
      
 57 
     | 
    
         
            +
            ```
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            Error codes are as follows:
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            | Cause            | Error Type                 |
         
     | 
| 
      
 62 
     | 
    
         
            +
            | ---------------- | -------------------------- |
         
     | 
| 
      
 63 
     | 
    
         
            +
            | HTTP 400         | `BadRequestError`          |
         
     | 
| 
      
 64 
     | 
    
         
            +
            | HTTP 401         | `AuthenticationError`      |
         
     | 
| 
      
 65 
     | 
    
         
            +
            | HTTP 403         | `PermissionDeniedError`    |
         
     | 
| 
      
 66 
     | 
    
         
            +
            | HTTP 404         | `NotFoundError`            |
         
     | 
| 
      
 67 
     | 
    
         
            +
            | HTTP 409         | `ConflictError`            |
         
     | 
| 
      
 68 
     | 
    
         
            +
            | HTTP 422         | `UnprocessableEntityError` |
         
     | 
| 
      
 69 
     | 
    
         
            +
            | HTTP 429         | `RateLimitError`           |
         
     | 
| 
      
 70 
     | 
    
         
            +
            | HTTP >= 500      | `InternalServerError`      |
         
     | 
| 
      
 71 
     | 
    
         
            +
            | Other HTTP error | `APIStatusError`           |
         
     | 
| 
      
 72 
     | 
    
         
            +
            | Timeout          | `APITimeoutError`          |
         
     | 
| 
      
 73 
     | 
    
         
            +
            | Network error    | `APIConnectionError`       |
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
            ### Retries
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            Certain errors will be automatically retried 2 times by default, with a short exponential backoff.
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict, 429 Rate Limit, >=500 Internal errors, and timeouts will all be retried by default.
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            You can use the `max_retries` option to configure or disable this:
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 84 
     | 
    
         
            +
            # Configure the default for all requests:
         
     | 
| 
      
 85 
     | 
    
         
            +
            spotted = Spotted::Client.new(
         
     | 
| 
      
 86 
     | 
    
         
            +
              max_retries: 0 # default is 2
         
     | 
| 
      
 87 
     | 
    
         
            +
            )
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
            # Or, configure per-request:
         
     | 
| 
      
 90 
     | 
    
         
            +
            spotted.albums.retrieve("4aawyAB9vmqN3uQ7FjRGTy", request_options: {max_retries: 5})
         
     | 
| 
      
 91 
     | 
    
         
            +
            ```
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            ### Timeouts
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
            By default, requests will time out after 60 seconds. You can use the timeout option to configure or disable this:
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 98 
     | 
    
         
            +
            # Configure the default for all requests:
         
     | 
| 
      
 99 
     | 
    
         
            +
            spotted = Spotted::Client.new(
         
     | 
| 
      
 100 
     | 
    
         
            +
              timeout: nil # default is 60
         
     | 
| 
      
 101 
     | 
    
         
            +
            )
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            # Or, configure per-request:
         
     | 
| 
      
 104 
     | 
    
         
            +
            spotted.albums.retrieve("4aawyAB9vmqN3uQ7FjRGTy", request_options: {timeout: 5})
         
     | 
| 
      
 105 
     | 
    
         
            +
            ```
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
            On timeout, `Spotted::Errors::APITimeoutError` is raised.
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
            Note that requests that time out are retried by default.
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
            ## Advanced concepts
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
            ### BaseModel
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
            All parameter and response objects inherit from `Spotted::Internal::Type::BaseModel`, which provides several conveniences, including:
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
            1. All fields, including unknown ones, are accessible with `obj[:prop]` syntax, and can be destructured with `obj => {prop: prop}` or pattern-matching syntax.
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
            2. Structural equivalence for equality; if two API calls return the same values, comparing the responses with == will return true.
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
            3. Both instances and the classes themselves can be pretty-printed.
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
            4. Helpers such as `#to_h`, `#deep_to_h`, `#to_json`, and `#to_yaml`.
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
            ### Making custom or undocumented requests
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
            #### Undocumented properties
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
            You can send undocumented parameters to any endpoint, and read undocumented response properties, like so:
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
            Note: the `extra_` parameters of the same name overrides the documented parameters.
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 134 
     | 
    
         
            +
            album =
         
     | 
| 
      
 135 
     | 
    
         
            +
              spotted.albums.retrieve(
         
     | 
| 
      
 136 
     | 
    
         
            +
                "4aawyAB9vmqN3uQ7FjRGTy",
         
     | 
| 
      
 137 
     | 
    
         
            +
                request_options: {
         
     | 
| 
      
 138 
     | 
    
         
            +
                  extra_query: {my_query_parameter: value},
         
     | 
| 
      
 139 
     | 
    
         
            +
                  extra_body: {my_body_parameter: value},
         
     | 
| 
      
 140 
     | 
    
         
            +
                  extra_headers: {"my-header": value}
         
     | 
| 
      
 141 
     | 
    
         
            +
                }
         
     | 
| 
      
 142 
     | 
    
         
            +
              )
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
            puts(album[:my_undocumented_property])
         
     | 
| 
      
 145 
     | 
    
         
            +
            ```
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
            #### Undocumented request params
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
            If you want to explicitly send an extra param, you can do so with the `extra_query`, `extra_body`, and `extra_headers` under the `request_options:` parameter when making a request, as seen in the examples above.
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
            #### Undocumented endpoints
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
            To make requests to undocumented endpoints while retaining the benefit of auth, retries, and so on, you can make requests using `client.request`, like so:
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 156 
     | 
    
         
            +
            response = client.request(
         
     | 
| 
      
 157 
     | 
    
         
            +
              method: :post,
         
     | 
| 
      
 158 
     | 
    
         
            +
              path: '/undocumented/endpoint',
         
     | 
| 
      
 159 
     | 
    
         
            +
              query: {"dog": "woof"},
         
     | 
| 
      
 160 
     | 
    
         
            +
              headers: {"useful-header": "interesting-value"},
         
     | 
| 
      
 161 
     | 
    
         
            +
              body: {"hello": "world"}
         
     | 
| 
      
 162 
     | 
    
         
            +
            )
         
     | 
| 
      
 163 
     | 
    
         
            +
            ```
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
      
 165 
     | 
    
         
            +
            ### Concurrency & connection pooling
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
            The `Spotted::Client` instances are threadsafe, but are only are fork-safe when there are no in-flight HTTP requests.
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
            Each instance of `Spotted::Client` has its own HTTP connection pool with a default size of 99. As such, we recommend instantiating the client once per application in most settings.
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
            When all available connections from the pool are checked out, requests wait for a new connection to become available, with queue time counting towards the request timeout.
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
            Unless otherwise specified, other classes in the SDK do not have locks protecting their underlying data structure.
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
            ## Sorbet
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
            This library provides comprehensive [RBI](https://sorbet.org/docs/rbi) definitions, and has no dependency on sorbet-runtime.
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
            You can provide typesafe request parameters like so:
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 182 
     | 
    
         
            +
            spotted.albums.retrieve("4aawyAB9vmqN3uQ7FjRGTy")
         
     | 
| 
      
 183 
     | 
    
         
            +
            ```
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
            Or, equivalently:
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 188 
     | 
    
         
            +
            # Hashes work, but are not typesafe:
         
     | 
| 
      
 189 
     | 
    
         
            +
            spotted.albums.retrieve("4aawyAB9vmqN3uQ7FjRGTy")
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
            # You can also splat a full Params class:
         
     | 
| 
      
 192 
     | 
    
         
            +
            params = Spotted::AlbumRetrieveParams.new
         
     | 
| 
      
 193 
     | 
    
         
            +
            spotted.albums.retrieve("4aawyAB9vmqN3uQ7FjRGTy", **params)
         
     | 
| 
      
 194 
     | 
    
         
            +
            ```
         
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
      
 196 
     | 
    
         
            +
            ### Enums
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
            Since this library does not depend on `sorbet-runtime`, it cannot provide [`T::Enum`](https://sorbet.org/docs/tenum) instances. Instead, we provide "tagged symbols" instead, which is always a primitive at runtime:
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
      
 200 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 201 
     | 
    
         
            +
            # :artist
         
     | 
| 
      
 202 
     | 
    
         
            +
            puts(Spotted::Me::FollowingCheckParams::Type::ARTIST)
         
     | 
| 
      
 203 
     | 
    
         
            +
             
     | 
| 
      
 204 
     | 
    
         
            +
            # Revealed type: `T.all(Spotted::Me::FollowingCheckParams::Type, Symbol)`
         
     | 
| 
      
 205 
     | 
    
         
            +
            T.reveal_type(Spotted::Me::FollowingCheckParams::Type::ARTIST)
         
     | 
| 
      
 206 
     | 
    
         
            +
            ```
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
      
 208 
     | 
    
         
            +
            Enum parameters have a "relaxed" type, so you can either pass in enum constants or their literal value:
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
      
 210 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 211 
     | 
    
         
            +
            # Using the enum constants preserves the tagged type information:
         
     | 
| 
      
 212 
     | 
    
         
            +
            spotted.me.following.check(
         
     | 
| 
      
 213 
     | 
    
         
            +
              type: Spotted::Me::FollowingCheckParams::Type::ARTIST,
         
     | 
| 
      
 214 
     | 
    
         
            +
              # …
         
     | 
| 
      
 215 
     | 
    
         
            +
            )
         
     | 
| 
      
 216 
     | 
    
         
            +
             
     | 
| 
      
 217 
     | 
    
         
            +
            # Literal values are also permissible:
         
     | 
| 
      
 218 
     | 
    
         
            +
            spotted.me.following.check(
         
     | 
| 
      
 219 
     | 
    
         
            +
              type: :artist,
         
     | 
| 
      
 220 
     | 
    
         
            +
              # …
         
     | 
| 
      
 221 
     | 
    
         
            +
            )
         
     | 
| 
      
 222 
     | 
    
         
            +
            ```
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
            ## Versioning
         
     | 
| 
      
 225 
     | 
    
         
            +
             
     | 
| 
      
 226 
     | 
    
         
            +
            This package follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions. As the library is in initial development and has a major version of `0`, APIs may change at any time.
         
     | 
| 
      
 227 
     | 
    
         
            +
             
     | 
| 
      
 228 
     | 
    
         
            +
            This package considers improvements to the (non-runtime) `*.rbi` and `*.rbs` type definitions to be non-breaking changes.
         
     | 
| 
      
 229 
     | 
    
         
            +
             
     | 
| 
      
 230 
     | 
    
         
            +
            ## Requirements
         
     | 
| 
      
 231 
     | 
    
         
            +
             
     | 
| 
      
 232 
     | 
    
         
            +
            Ruby 3.2.0 or higher.
         
     | 
| 
      
 233 
     | 
    
         
            +
             
     | 
| 
      
 234 
     | 
    
         
            +
            ## Contributing
         
     | 
| 
      
 235 
     | 
    
         
            +
             
     | 
| 
      
 236 
     | 
    
         
            +
            See [the contributing documentation](https://github.com/cjavdev/spotted/tree/main/CONTRIBUTING.md).
         
     | 
    
        data/SECURITY.md
    ADDED
    
    | 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Security Policy
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            ## Reporting Security Issues
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            This SDK is generated by [Stainless Software Inc](http://stainless.com). Stainless takes security seriously, and encourages you to report any security vulnerability promptly so that appropriate action can be taken.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            To report a security issue, please contact the Stainless team at security@stainless.com.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ## Responsible Disclosure
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            We appreciate the efforts of security researchers and individuals who help us maintain the security of
         
     | 
| 
      
 12 
     | 
    
         
            +
            SDKs we generate. If you believe you have found a security vulnerability, please adhere to responsible
         
     | 
| 
      
 13 
     | 
    
         
            +
            disclosure practices by allowing us a reasonable amount of time to investigate and address the issue
         
     | 
| 
      
 14 
     | 
    
         
            +
            before making any information public.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            ## Reporting Non-SDK Related Security Issues
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            If you encounter security issues that are not directly related to SDKs but pertain to the services
         
     | 
| 
      
 19 
     | 
    
         
            +
            or products provided by Spotted, please follow the respective company's security reporting guidelines.
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            ### Spotted Terms and Policies
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            Please contact wave@cjav.dev for any questions or concerns regarding the security of our services.
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            ---
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            Thank you for helping us keep the SDKs and systems they interact with secure.
         
     | 
| 
         @@ -0,0 +1,169 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Spotted
         
     | 
| 
      
 4 
     | 
    
         
            +
              class Client < Spotted::Internal::Transport::BaseClient
         
     | 
| 
      
 5 
     | 
    
         
            +
                # Default max number of retries to attempt after a failed retryable request.
         
     | 
| 
      
 6 
     | 
    
         
            +
                DEFAULT_MAX_RETRIES = 2
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                # Default per-request timeout.
         
     | 
| 
      
 9 
     | 
    
         
            +
                DEFAULT_TIMEOUT_IN_SECONDS = 60.0
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                # Default initial retry delay in seconds.
         
     | 
| 
      
 12 
     | 
    
         
            +
                # Overall delay is calculated using exponential backoff + jitter.
         
     | 
| 
      
 13 
     | 
    
         
            +
                DEFAULT_INITIAL_RETRY_DELAY = 0.5
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                # Default max retry delay in seconds.
         
     | 
| 
      
 16 
     | 
    
         
            +
                DEFAULT_MAX_RETRY_DELAY = 8.0
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
      
 19 
     | 
    
         
            +
                attr_reader :client_id
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
      
 22 
     | 
    
         
            +
                attr_reader :client_secret
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                # @return [Spotted::Resources::Albums]
         
     | 
| 
      
 25 
     | 
    
         
            +
                attr_reader :albums
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                # @return [Spotted::Resources::Artists]
         
     | 
| 
      
 28 
     | 
    
         
            +
                attr_reader :artists
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                # @return [Spotted::Resources::Shows]
         
     | 
| 
      
 31 
     | 
    
         
            +
                attr_reader :shows
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                # @return [Spotted::Resources::Episodes]
         
     | 
| 
      
 34 
     | 
    
         
            +
                attr_reader :episodes
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                # @return [Spotted::Resources::Audiobooks]
         
     | 
| 
      
 37 
     | 
    
         
            +
                attr_reader :audiobooks
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                # @return [Spotted::Resources::Me]
         
     | 
| 
      
 40 
     | 
    
         
            +
                attr_reader :me
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                # @return [Spotted::Resources::Chapters]
         
     | 
| 
      
 43 
     | 
    
         
            +
                attr_reader :chapters
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                # @return [Spotted::Resources::Tracks]
         
     | 
| 
      
 46 
     | 
    
         
            +
                attr_reader :tracks
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                # @return [Spotted::Resources::Search]
         
     | 
| 
      
 49 
     | 
    
         
            +
                attr_reader :search
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                # @return [Spotted::Resources::Playlists]
         
     | 
| 
      
 52 
     | 
    
         
            +
                attr_reader :playlists
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                # @return [Spotted::Resources::Users]
         
     | 
| 
      
 55 
     | 
    
         
            +
                attr_reader :users
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                # @return [Spotted::Resources::Browse]
         
     | 
| 
      
 58 
     | 
    
         
            +
                attr_reader :browse
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                # @return [Spotted::Resources::AudioFeatures]
         
     | 
| 
      
 61 
     | 
    
         
            +
                attr_reader :audio_features
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                # @return [Spotted::Resources::AudioAnalysis]
         
     | 
| 
      
 64 
     | 
    
         
            +
                attr_reader :audio_analysis
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                # @return [Spotted::Resources::Recommendations]
         
     | 
| 
      
 67 
     | 
    
         
            +
                attr_reader :recommendations
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                # @return [Spotted::Resources::Markets]
         
     | 
| 
      
 70 
     | 
    
         
            +
                attr_reader :markets
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 73 
     | 
    
         
            +
                # @return [Spotted::Internal::OAuth2ClientCredentials]
         
     | 
| 
      
 74 
     | 
    
         
            +
                attr_reader :oauth_2_0_state
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 77 
     | 
    
         
            +
                #
         
     | 
| 
      
 78 
     | 
    
         
            +
                # @return [Hash{String=>String}]
         
     | 
| 
      
 79 
     | 
    
         
            +
                private def auth_headers
         
     | 
| 
      
 80 
     | 
    
         
            +
                  return @oauth_2_0_state.auth_headers if @oauth_2_0_state
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                  return {} unless @client_id && @client_secret
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                  path = Spotted::Internal::Util.interpolate_path("https://accounts.spotify.com/api/token")
         
     | 
| 
      
 85 
     | 
    
         
            +
                  token_url = Spotted::Internal::Util.join_parsed_uri(
         
     | 
| 
      
 86 
     | 
    
         
            +
                    @base_url_components,
         
     | 
| 
      
 87 
     | 
    
         
            +
                    {
         
     | 
| 
      
 88 
     | 
    
         
            +
                      path: path,
         
     | 
| 
      
 89 
     | 
    
         
            +
                      query: {grant_type: "client_credentials"}
         
     | 
| 
      
 90 
     | 
    
         
            +
                    }
         
     | 
| 
      
 91 
     | 
    
         
            +
                  )
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                  @oauth_2_0_state = Spotted::Internal::OAuth2ClientCredentials.new(
         
     | 
| 
      
 94 
     | 
    
         
            +
                    token_url: token_url.to_s,
         
     | 
| 
      
 95 
     | 
    
         
            +
                    client_id: @client_id,
         
     | 
| 
      
 96 
     | 
    
         
            +
                    client_secret: @client_secret,
         
     | 
| 
      
 97 
     | 
    
         
            +
                    timeout: @timeout,
         
     | 
| 
      
 98 
     | 
    
         
            +
                    client: self
         
     | 
| 
      
 99 
     | 
    
         
            +
                  )
         
     | 
| 
      
 100 
     | 
    
         
            +
                  @oauth_2_0_state.auth_headers
         
     | 
| 
      
 101 
     | 
    
         
            +
                end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                # Creates and returns a new client for interacting with the API.
         
     | 
| 
      
 104 
     | 
    
         
            +
                #
         
     | 
| 
      
 105 
     | 
    
         
            +
                # @param client_id [String, nil] Defaults to `ENV["SPOTIFY_CLIENT_ID"]`
         
     | 
| 
      
 106 
     | 
    
         
            +
                #
         
     | 
| 
      
 107 
     | 
    
         
            +
                # @param client_secret [String, nil] Defaults to `ENV["SPOTIFY_CLIENT_SECRET"]`
         
     | 
| 
      
 108 
     | 
    
         
            +
                #
         
     | 
| 
      
 109 
     | 
    
         
            +
                # @param base_url [String, nil] Override the default base URL for the API, e.g.,
         
     | 
| 
      
 110 
     | 
    
         
            +
                # `"https://api.example.com/v2/"`. Defaults to `ENV["SPOTTED_BASE_URL"]`
         
     | 
| 
      
 111 
     | 
    
         
            +
                #
         
     | 
| 
      
 112 
     | 
    
         
            +
                # @param max_retries [Integer] Max number of retries to attempt after a failed retryable request.
         
     | 
| 
      
 113 
     | 
    
         
            +
                #
         
     | 
| 
      
 114 
     | 
    
         
            +
                # @param timeout [Float]
         
     | 
| 
      
 115 
     | 
    
         
            +
                #
         
     | 
| 
      
 116 
     | 
    
         
            +
                # @param initial_retry_delay [Float]
         
     | 
| 
      
 117 
     | 
    
         
            +
                #
         
     | 
| 
      
 118 
     | 
    
         
            +
                # @param max_retry_delay [Float]
         
     | 
| 
      
 119 
     | 
    
         
            +
                def initialize(
         
     | 
| 
      
 120 
     | 
    
         
            +
                  client_id: ENV["SPOTIFY_CLIENT_ID"],
         
     | 
| 
      
 121 
     | 
    
         
            +
                  client_secret: ENV["SPOTIFY_CLIENT_SECRET"],
         
     | 
| 
      
 122 
     | 
    
         
            +
                  base_url: ENV["SPOTTED_BASE_URL"],
         
     | 
| 
      
 123 
     | 
    
         
            +
                  max_retries: self.class::DEFAULT_MAX_RETRIES,
         
     | 
| 
      
 124 
     | 
    
         
            +
                  timeout: self.class::DEFAULT_TIMEOUT_IN_SECONDS,
         
     | 
| 
      
 125 
     | 
    
         
            +
                  initial_retry_delay: self.class::DEFAULT_INITIAL_RETRY_DELAY,
         
     | 
| 
      
 126 
     | 
    
         
            +
                  max_retry_delay: self.class::DEFAULT_MAX_RETRY_DELAY
         
     | 
| 
      
 127 
     | 
    
         
            +
                )
         
     | 
| 
      
 128 
     | 
    
         
            +
                  base_url ||= "https://api.spotify.com/v1"
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                  if client_id.nil?
         
     | 
| 
      
 131 
     | 
    
         
            +
                    raise ArgumentError.new("client_id is required, and can be set via environ: \"SPOTIFY_CLIENT_ID\"")
         
     | 
| 
      
 132 
     | 
    
         
            +
                  end
         
     | 
| 
      
 133 
     | 
    
         
            +
                  if client_secret.nil?
         
     | 
| 
      
 134 
     | 
    
         
            +
                    # Ignore Layout/LineLength
         
     | 
| 
      
 135 
     | 
    
         
            +
                    # rubocop:disable Layout/LineLength
         
     | 
| 
      
 136 
     | 
    
         
            +
                    raise ArgumentError.new("client_secret is required, and can be set via environ: \"SPOTIFY_CLIENT_SECRET\"")
         
     | 
| 
      
 137 
     | 
    
         
            +
                    # rubocop:enable Layout/LineLength
         
     | 
| 
      
 138 
     | 
    
         
            +
                  end
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                  @client_id = client_id.to_s
         
     | 
| 
      
 141 
     | 
    
         
            +
                  @client_secret = client_secret.to_s
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
                  super(
         
     | 
| 
      
 144 
     | 
    
         
            +
                    base_url: base_url,
         
     | 
| 
      
 145 
     | 
    
         
            +
                    timeout: timeout,
         
     | 
| 
      
 146 
     | 
    
         
            +
                    max_retries: max_retries,
         
     | 
| 
      
 147 
     | 
    
         
            +
                    initial_retry_delay: initial_retry_delay,
         
     | 
| 
      
 148 
     | 
    
         
            +
                    max_retry_delay: max_retry_delay
         
     | 
| 
      
 149 
     | 
    
         
            +
                  )
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
                  @albums = Spotted::Resources::Albums.new(client: self)
         
     | 
| 
      
 152 
     | 
    
         
            +
                  @artists = Spotted::Resources::Artists.new(client: self)
         
     | 
| 
      
 153 
     | 
    
         
            +
                  @shows = Spotted::Resources::Shows.new(client: self)
         
     | 
| 
      
 154 
     | 
    
         
            +
                  @episodes = Spotted::Resources::Episodes.new(client: self)
         
     | 
| 
      
 155 
     | 
    
         
            +
                  @audiobooks = Spotted::Resources::Audiobooks.new(client: self)
         
     | 
| 
      
 156 
     | 
    
         
            +
                  @me = Spotted::Resources::Me.new(client: self)
         
     | 
| 
      
 157 
     | 
    
         
            +
                  @chapters = Spotted::Resources::Chapters.new(client: self)
         
     | 
| 
      
 158 
     | 
    
         
            +
                  @tracks = Spotted::Resources::Tracks.new(client: self)
         
     | 
| 
      
 159 
     | 
    
         
            +
                  @search = Spotted::Resources::Search.new(client: self)
         
     | 
| 
      
 160 
     | 
    
         
            +
                  @playlists = Spotted::Resources::Playlists.new(client: self)
         
     | 
| 
      
 161 
     | 
    
         
            +
                  @users = Spotted::Resources::Users.new(client: self)
         
     | 
| 
      
 162 
     | 
    
         
            +
                  @browse = Spotted::Resources::Browse.new(client: self)
         
     | 
| 
      
 163 
     | 
    
         
            +
                  @audio_features = Spotted::Resources::AudioFeatures.new(client: self)
         
     | 
| 
      
 164 
     | 
    
         
            +
                  @audio_analysis = Spotted::Resources::AudioAnalysis.new(client: self)
         
     | 
| 
      
 165 
     | 
    
         
            +
                  @recommendations = Spotted::Resources::Recommendations.new(client: self)
         
     | 
| 
      
 166 
     | 
    
         
            +
                  @markets = Spotted::Resources::Markets.new(client: self)
         
     | 
| 
      
 167 
     | 
    
         
            +
                end
         
     | 
| 
      
 168 
     | 
    
         
            +
              end
         
     | 
| 
      
 169 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,228 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Spotted
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Errors
         
     | 
| 
      
 5 
     | 
    
         
            +
                class Error < StandardError
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # @!attribute cause
         
     | 
| 
      
 7 
     | 
    
         
            +
                  #
         
     | 
| 
      
 8 
     | 
    
         
            +
                  #   @return [StandardError, nil]
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                class ConversionError < Spotted::Errors::Error
         
     | 
| 
      
 12 
     | 
    
         
            +
                  # @return [StandardError, nil]
         
     | 
| 
      
 13 
     | 
    
         
            +
                  def cause = @cause.nil? ? super : @cause
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 16 
     | 
    
         
            +
                  #
         
     | 
| 
      
 17 
     | 
    
         
            +
                  # @param on [Class<StandardError>]
         
     | 
| 
      
 18 
     | 
    
         
            +
                  # @param method [Symbol]
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # @param target [Object]
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # @param value [Object]
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # @param cause [StandardError, nil]
         
     | 
| 
      
 22 
     | 
    
         
            +
                  def initialize(on:, method:, target:, value:, cause: nil)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    cls = on.name.split("::").last
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                    message = [
         
     | 
| 
      
 26 
     | 
    
         
            +
                      "Failed to parse #{cls}.#{method} from #{value.class} to #{target.inspect}.",
         
     | 
| 
      
 27 
     | 
    
         
            +
                      "To get the unparsed API response, use #{cls}[#{method.inspect}].",
         
     | 
| 
      
 28 
     | 
    
         
            +
                      cause && "Cause: #{cause.message}"
         
     | 
| 
      
 29 
     | 
    
         
            +
                    ].filter(&:itself).join(" ")
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    @cause = cause
         
     | 
| 
      
 32 
     | 
    
         
            +
                    super(message)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                class APIError < Spotted::Errors::Error
         
     | 
| 
      
 37 
     | 
    
         
            +
                  # @return [URI::Generic]
         
     | 
| 
      
 38 
     | 
    
         
            +
                  attr_accessor :url
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                  # @return [Integer, nil]
         
     | 
| 
      
 41 
     | 
    
         
            +
                  attr_accessor :status
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  # @return [Hash{String=>String}, nil]
         
     | 
| 
      
 44 
     | 
    
         
            +
                  attr_accessor :headers
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  # @return [Object, nil]
         
     | 
| 
      
 47 
     | 
    
         
            +
                  attr_accessor :body
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 50 
     | 
    
         
            +
                  #
         
     | 
| 
      
 51 
     | 
    
         
            +
                  # @param url [URI::Generic]
         
     | 
| 
      
 52 
     | 
    
         
            +
                  # @param status [Integer, nil]
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # @param headers [Hash{String=>String}, nil]
         
     | 
| 
      
 54 
     | 
    
         
            +
                  # @param body [Object, nil]
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # @param request [nil]
         
     | 
| 
      
 56 
     | 
    
         
            +
                  # @param response [nil]
         
     | 
| 
      
 57 
     | 
    
         
            +
                  # @param message [String, nil]
         
     | 
| 
      
 58 
     | 
    
         
            +
                  def initialize(url:, status: nil, headers: nil, body: nil, request: nil, response: nil, message: nil)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    @url = url
         
     | 
| 
      
 60 
     | 
    
         
            +
                    @status = status
         
     | 
| 
      
 61 
     | 
    
         
            +
                    @headers = headers
         
     | 
| 
      
 62 
     | 
    
         
            +
                    @body = body
         
     | 
| 
      
 63 
     | 
    
         
            +
                    @request = request
         
     | 
| 
      
 64 
     | 
    
         
            +
                    @response = response
         
     | 
| 
      
 65 
     | 
    
         
            +
                    super(message)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                class APIConnectionError < Spotted::Errors::APIError
         
     | 
| 
      
 70 
     | 
    
         
            +
                  # @!attribute status
         
     | 
| 
      
 71 
     | 
    
         
            +
                  #
         
     | 
| 
      
 72 
     | 
    
         
            +
                  #   @return [nil]
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                  # @!attribute body
         
     | 
| 
      
 75 
     | 
    
         
            +
                  #
         
     | 
| 
      
 76 
     | 
    
         
            +
                  #   @return [nil]
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 79 
     | 
    
         
            +
                  #
         
     | 
| 
      
 80 
     | 
    
         
            +
                  # @param url [URI::Generic]
         
     | 
| 
      
 81 
     | 
    
         
            +
                  # @param status [nil]
         
     | 
| 
      
 82 
     | 
    
         
            +
                  # @param headers [Hash{String=>String}, nil]
         
     | 
| 
      
 83 
     | 
    
         
            +
                  # @param body [nil]
         
     | 
| 
      
 84 
     | 
    
         
            +
                  # @param request [nil]
         
     | 
| 
      
 85 
     | 
    
         
            +
                  # @param response [nil]
         
     | 
| 
      
 86 
     | 
    
         
            +
                  # @param message [String, nil]
         
     | 
| 
      
 87 
     | 
    
         
            +
                  def initialize(
         
     | 
| 
      
 88 
     | 
    
         
            +
                    url:,
         
     | 
| 
      
 89 
     | 
    
         
            +
                    status: nil,
         
     | 
| 
      
 90 
     | 
    
         
            +
                    headers: nil,
         
     | 
| 
      
 91 
     | 
    
         
            +
                    body: nil,
         
     | 
| 
      
 92 
     | 
    
         
            +
                    request: nil,
         
     | 
| 
      
 93 
     | 
    
         
            +
                    response: nil,
         
     | 
| 
      
 94 
     | 
    
         
            +
                    message: "Connection error."
         
     | 
| 
      
 95 
     | 
    
         
            +
                  )
         
     | 
| 
      
 96 
     | 
    
         
            +
                    super
         
     | 
| 
      
 97 
     | 
    
         
            +
                  end
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                class APITimeoutError < Spotted::Errors::APIConnectionError
         
     | 
| 
      
 101 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 102 
     | 
    
         
            +
                  #
         
     | 
| 
      
 103 
     | 
    
         
            +
                  # @param url [URI::Generic]
         
     | 
| 
      
 104 
     | 
    
         
            +
                  # @param status [nil]
         
     | 
| 
      
 105 
     | 
    
         
            +
                  # @param headers [Hash{String=>String}, nil]
         
     | 
| 
      
 106 
     | 
    
         
            +
                  # @param body [nil]
         
     | 
| 
      
 107 
     | 
    
         
            +
                  # @param request [nil]
         
     | 
| 
      
 108 
     | 
    
         
            +
                  # @param response [nil]
         
     | 
| 
      
 109 
     | 
    
         
            +
                  # @param message [String, nil]
         
     | 
| 
      
 110 
     | 
    
         
            +
                  def initialize(
         
     | 
| 
      
 111 
     | 
    
         
            +
                    url:,
         
     | 
| 
      
 112 
     | 
    
         
            +
                    status: nil,
         
     | 
| 
      
 113 
     | 
    
         
            +
                    headers: nil,
         
     | 
| 
      
 114 
     | 
    
         
            +
                    body: nil,
         
     | 
| 
      
 115 
     | 
    
         
            +
                    request: nil,
         
     | 
| 
      
 116 
     | 
    
         
            +
                    response: nil,
         
     | 
| 
      
 117 
     | 
    
         
            +
                    message: "Request timed out."
         
     | 
| 
      
 118 
     | 
    
         
            +
                  )
         
     | 
| 
      
 119 
     | 
    
         
            +
                    super
         
     | 
| 
      
 120 
     | 
    
         
            +
                  end
         
     | 
| 
      
 121 
     | 
    
         
            +
                end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                class APIStatusError < Spotted::Errors::APIError
         
     | 
| 
      
 124 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 125 
     | 
    
         
            +
                  #
         
     | 
| 
      
 126 
     | 
    
         
            +
                  # @param url [URI::Generic]
         
     | 
| 
      
 127 
     | 
    
         
            +
                  # @param status [Integer]
         
     | 
| 
      
 128 
     | 
    
         
            +
                  # @param headers [Hash{String=>String}, nil]
         
     | 
| 
      
 129 
     | 
    
         
            +
                  # @param body [Object, nil]
         
     | 
| 
      
 130 
     | 
    
         
            +
                  # @param request [nil]
         
     | 
| 
      
 131 
     | 
    
         
            +
                  # @param response [nil]
         
     | 
| 
      
 132 
     | 
    
         
            +
                  # @param message [String, nil]
         
     | 
| 
      
 133 
     | 
    
         
            +
                  #
         
     | 
| 
      
 134 
     | 
    
         
            +
                  # @return [self]
         
     | 
| 
      
 135 
     | 
    
         
            +
                  def self.for(url:, status:, headers:, body:, request:, response:, message: nil)
         
     | 
| 
      
 136 
     | 
    
         
            +
                    kwargs =
         
     | 
| 
      
 137 
     | 
    
         
            +
                      {
         
     | 
| 
      
 138 
     | 
    
         
            +
                        url: url,
         
     | 
| 
      
 139 
     | 
    
         
            +
                        status: status,
         
     | 
| 
      
 140 
     | 
    
         
            +
                        headers: headers,
         
     | 
| 
      
 141 
     | 
    
         
            +
                        body: body,
         
     | 
| 
      
 142 
     | 
    
         
            +
                        request: request,
         
     | 
| 
      
 143 
     | 
    
         
            +
                        response: response,
         
     | 
| 
      
 144 
     | 
    
         
            +
                        message: message
         
     | 
| 
      
 145 
     | 
    
         
            +
                      }
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                    case status
         
     | 
| 
      
 148 
     | 
    
         
            +
                    in 400
         
     | 
| 
      
 149 
     | 
    
         
            +
                      Spotted::Errors::BadRequestError.new(**kwargs)
         
     | 
| 
      
 150 
     | 
    
         
            +
                    in 401
         
     | 
| 
      
 151 
     | 
    
         
            +
                      Spotted::Errors::AuthenticationError.new(**kwargs)
         
     | 
| 
      
 152 
     | 
    
         
            +
                    in 403
         
     | 
| 
      
 153 
     | 
    
         
            +
                      Spotted::Errors::PermissionDeniedError.new(**kwargs)
         
     | 
| 
      
 154 
     | 
    
         
            +
                    in 404
         
     | 
| 
      
 155 
     | 
    
         
            +
                      Spotted::Errors::NotFoundError.new(**kwargs)
         
     | 
| 
      
 156 
     | 
    
         
            +
                    in 409
         
     | 
| 
      
 157 
     | 
    
         
            +
                      Spotted::Errors::ConflictError.new(**kwargs)
         
     | 
| 
      
 158 
     | 
    
         
            +
                    in 422
         
     | 
| 
      
 159 
     | 
    
         
            +
                      Spotted::Errors::UnprocessableEntityError.new(**kwargs)
         
     | 
| 
      
 160 
     | 
    
         
            +
                    in 429
         
     | 
| 
      
 161 
     | 
    
         
            +
                      Spotted::Errors::RateLimitError.new(**kwargs)
         
     | 
| 
      
 162 
     | 
    
         
            +
                    in (500..)
         
     | 
| 
      
 163 
     | 
    
         
            +
                      Spotted::Errors::InternalServerError.new(**kwargs)
         
     | 
| 
      
 164 
     | 
    
         
            +
                    else
         
     | 
| 
      
 165 
     | 
    
         
            +
                      Spotted::Errors::APIStatusError.new(**kwargs)
         
     | 
| 
      
 166 
     | 
    
         
            +
                    end
         
     | 
| 
      
 167 
     | 
    
         
            +
                  end
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
                  # @!parse
         
     | 
| 
      
 170 
     | 
    
         
            +
                  #   # @return [Integer]
         
     | 
| 
      
 171 
     | 
    
         
            +
                  #   attr_accessor :status
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 174 
     | 
    
         
            +
                  #
         
     | 
| 
      
 175 
     | 
    
         
            +
                  # @param url [URI::Generic]
         
     | 
| 
      
 176 
     | 
    
         
            +
                  # @param status [Integer]
         
     | 
| 
      
 177 
     | 
    
         
            +
                  # @param headers [Hash{String=>String}, nil]
         
     | 
| 
      
 178 
     | 
    
         
            +
                  # @param body [Object, nil]
         
     | 
| 
      
 179 
     | 
    
         
            +
                  # @param request [nil]
         
     | 
| 
      
 180 
     | 
    
         
            +
                  # @param response [nil]
         
     | 
| 
      
 181 
     | 
    
         
            +
                  # @param message [String, nil]
         
     | 
| 
      
 182 
     | 
    
         
            +
                  def initialize(url:, status:, headers:, body:, request:, response:, message: nil)
         
     | 
| 
      
 183 
     | 
    
         
            +
                    message ||= {url: url.to_s, status: status, body: body}
         
     | 
| 
      
 184 
     | 
    
         
            +
                    super(
         
     | 
| 
      
 185 
     | 
    
         
            +
                      url: url,
         
     | 
| 
      
 186 
     | 
    
         
            +
                      status: status,
         
     | 
| 
      
 187 
     | 
    
         
            +
                      headers: headers,
         
     | 
| 
      
 188 
     | 
    
         
            +
                      body: body,
         
     | 
| 
      
 189 
     | 
    
         
            +
                      request: request,
         
     | 
| 
      
 190 
     | 
    
         
            +
                      response: response,
         
     | 
| 
      
 191 
     | 
    
         
            +
                      message: message&.to_s
         
     | 
| 
      
 192 
     | 
    
         
            +
                    )
         
     | 
| 
      
 193 
     | 
    
         
            +
                  end
         
     | 
| 
      
 194 
     | 
    
         
            +
                end
         
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
      
 196 
     | 
    
         
            +
                class BadRequestError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 197 
     | 
    
         
            +
                  HTTP_STATUS = 400
         
     | 
| 
      
 198 
     | 
    
         
            +
                end
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
      
 200 
     | 
    
         
            +
                class AuthenticationError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 201 
     | 
    
         
            +
                  HTTP_STATUS = 401
         
     | 
| 
      
 202 
     | 
    
         
            +
                end
         
     | 
| 
      
 203 
     | 
    
         
            +
             
     | 
| 
      
 204 
     | 
    
         
            +
                class PermissionDeniedError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 205 
     | 
    
         
            +
                  HTTP_STATUS = 403
         
     | 
| 
      
 206 
     | 
    
         
            +
                end
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
      
 208 
     | 
    
         
            +
                class NotFoundError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 209 
     | 
    
         
            +
                  HTTP_STATUS = 404
         
     | 
| 
      
 210 
     | 
    
         
            +
                end
         
     | 
| 
      
 211 
     | 
    
         
            +
             
     | 
| 
      
 212 
     | 
    
         
            +
                class ConflictError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 213 
     | 
    
         
            +
                  HTTP_STATUS = 409
         
     | 
| 
      
 214 
     | 
    
         
            +
                end
         
     | 
| 
      
 215 
     | 
    
         
            +
             
     | 
| 
      
 216 
     | 
    
         
            +
                class UnprocessableEntityError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 217 
     | 
    
         
            +
                  HTTP_STATUS = 422
         
     | 
| 
      
 218 
     | 
    
         
            +
                end
         
     | 
| 
      
 219 
     | 
    
         
            +
             
     | 
| 
      
 220 
     | 
    
         
            +
                class RateLimitError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 221 
     | 
    
         
            +
                  HTTP_STATUS = 429
         
     | 
| 
      
 222 
     | 
    
         
            +
                end
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
                class InternalServerError < Spotted::Errors::APIStatusError
         
     | 
| 
      
 225 
     | 
    
         
            +
                  HTTP_STATUS = (500..)
         
     | 
| 
      
 226 
     | 
    
         
            +
                end
         
     | 
| 
      
 227 
     | 
    
         
            +
              end
         
     | 
| 
      
 228 
     | 
    
         
            +
            end
         
     |