ytmusicapi package
Subpackages
- ytmusicapi.auth package
- ytmusicapi.mixins package
- Submodules
- ytmusicapi.mixins.browsing module
BrowsingMixinBrowsingMixin.ArtistOrderTypeBrowsingMixin.get_album()BrowsingMixin.get_album_browse_id()BrowsingMixin.get_artist()BrowsingMixin.get_artist_albums()BrowsingMixin.get_basejs_url()BrowsingMixin.get_home()BrowsingMixin.get_lyrics()BrowsingMixin.get_signatureTimestamp()BrowsingMixin.get_song()BrowsingMixin.get_song_related()BrowsingMixin.get_tasteprofile()BrowsingMixin.get_user()BrowsingMixin.get_user_playlists()BrowsingMixin.get_user_videos()BrowsingMixin.set_tasteprofile()
- ytmusicapi.mixins.charts module
- ytmusicapi.mixins.explore module
- ytmusicapi.mixins.library module
LibraryMixinLibraryMixin.add_history_item()LibraryMixin.edit_song_library_status()LibraryMixin.get_account_info()LibraryMixin.get_history()LibraryMixin.get_library_albums()LibraryMixin.get_library_artists()LibraryMixin.get_library_channels()LibraryMixin.get_library_playlists()LibraryMixin.get_library_podcasts()LibraryMixin.get_library_songs()LibraryMixin.get_library_subscriptions()LibraryMixin.rate_playlist()LibraryMixin.rate_song()LibraryMixin.remove_history_items()LibraryMixin.subscribe_artists()LibraryMixin.unsubscribe_artists()
- ytmusicapi.mixins.playlists module
- ytmusicapi.mixins.podcasts module
- ytmusicapi.mixins.search module
- ytmusicapi.mixins.uploads module
- ytmusicapi.mixins.watch module
- Module contents
- ytmusicapi.models package
- ytmusicapi.parsers package
- Submodules
- ytmusicapi.parsers.albums module
- ytmusicapi.parsers.browsing module
- ytmusicapi.parsers.constants module
- ytmusicapi.parsers.explore module
- ytmusicapi.parsers.i18n module
- ytmusicapi.parsers.library module
- ytmusicapi.parsers.playlists module
- ytmusicapi.parsers.podcasts module
- ytmusicapi.parsers.search module
- ytmusicapi.parsers.songs module
- ytmusicapi.parsers.uploads module
- ytmusicapi.parsers.watch module
- Module contents
Submodules
ytmusicapi.constants module
ytmusicapi.continuations module
- ytmusicapi.continuations.get_continuation_contents(continuation: dict[str, Any], parse_func: collections.abc.Callable[[list[dict[str, Any]]], list[dict[str, Any]]]) list[dict[str, Any]]
- Return type:
list[dict[str,Any]]
- ytmusicapi.continuations.get_continuation_params(results: dict[str, Any], ctoken_path: str = '') str
- Return type:
str
- ytmusicapi.continuations.get_continuation_string(ctoken: str) str
Returns the continuation string used in the continuation request
- Parameters:
ctoken (
str) – the unique continuation token- Return type:
str
- ytmusicapi.continuations.get_continuation_token(results: list[dict[str, Any]]) str | None
- Return type:
Optional[str]
- ytmusicapi.continuations.get_continuations(results: dict[str, Any], continuation_type: str, limit: int | None, request_func: collections.abc.Callable[[str], dict[str, Any]], parse_func: collections.abc.Callable[[list[dict[str, Any]]], list[dict[str, Any]]], ctoken_path: str = '', additionalParams: str | None = None) list[dict[str, Any]]
- Parameters:
results (
dict[str,Any]) – result list from request datacontinuation_type (
str) – type of continuation, determines which subkey will be used to navigate the continuation return datalimit (
Optional[int]) – determines minimum of how many items to retrieve in total. None to retrieve all items until no more continuations are returnedrequest_func (
Callable[[str],dict[str,Any]]) – the request func to use to get the continuationsparse_func (
Callable[[list[dict[str,Any]]],list[dict[str,Any]]]) – the parse func to apply on the returned continuationsctoken_path (
str) – rarely used specifier applied to retrieve the ctoken (“next<ctoken_path>ContinuationData”). Default empty stringadditionalParams (
Optional[str]) – Optional additional params to pass to the request func. Default: use get_continuation_params
- Return type:
list[dict[str,Any]]- Returns:
list of parsed continuation results
- ytmusicapi.continuations.get_continuations_2025(results: dict[str, Any], limit: int | None, request_func: collections.abc.Callable[[dict[str, Any]], dict[str, Any]], parse_func: collections.abc.Callable[[list[dict[str, Any]]], list[dict[str, Any]]]) list[dict[str, Any]]
- Return type:
list[dict[str,Any]]
- ytmusicapi.continuations.get_parsed_continuation_items(response: dict[str, Any], parse_func: collections.abc.Callable[[list[dict[str, Any]]], list[dict[str, Any]]], continuation_type: str) dict[str, Any]
- Return type:
dict[str,Any]
- ytmusicapi.continuations.get_reloadable_continuation_params(results: dict[str, Any]) str
- Return type:
str
- ytmusicapi.continuations.get_reloadable_continuations(results: dict[str, Any], continuation_type: str, limit: int | None, request_func: collections.abc.Callable[[str], dict[str, Any]], parse_func: collections.abc.Callable[[list[dict[str, Any]]], list[dict[str, Any]]]) list[dict[str, Any]]
Reloadable continuations are a special case that only exists on the playlists page (suggestions).
- Return type:
list[dict[str,Any]]
- ytmusicapi.continuations.get_validated_continuations(results: dict[str, Any], continuation_type: str, limit: int, per_page: int, request_func: collections.abc.Callable[[str], dict[str, Any]], parse_func: collections.abc.Callable[[list[dict[str, Any]]], list[dict[str, Any]]], ctoken_path: str = '') list[dict[str, Any]]
- Return type:
list[dict[str,Any]]
- ytmusicapi.continuations.resend_request_until_parsed_response_is_valid(request_func: collections.abc.Callable[[str], dict[str, Any]], request_additional_params: str, parse_func: collections.abc.Callable[[dict[str, Any]], dict[str, Any]], validate_func: collections.abc.Callable[[dict[str, Any]], bool], max_retries: int) dict[str, Any]
- Return type:
dict[str,Any]
- ytmusicapi.continuations.validate_response(response: dict[str, Any], per_page: int, limit: int, current_count: int) bool
- Return type:
bool
ytmusicapi.enums module
ytmusicapi.exceptions module
custom exception classes for ytmusicapi
- exception ytmusicapi.exceptions.YTMusicError
Bases:
Exceptionbase error class
shall only be raised if none of the subclasses below are fitting
- exception ytmusicapi.exceptions.YTMusicServerError
Bases:
YTMusicErrorerror caused by the YouTube Music backend
- exception ytmusicapi.exceptions.YTMusicUserError
Bases:
YTMusicErrorerror caused by invalid usage of ytmusicapi
ytmusicapi.helpers module
- ytmusicapi.helpers.get_authorization(auth: str) str
Returns SAPISIDHASH value based on headers and current time
- Parameters:
auth (
str) – SAPISID and Origin value from headers concatenated with space- Return type:
str
- ytmusicapi.helpers.get_visitor_id(request_func: collections.abc.Callable[[str], requests.models.Response]) dict[str, str]
- Return type:
dict[str,str]
- ytmusicapi.helpers.initialize_context() dict[str, Any]
- Return type:
dict[str,Any]
- ytmusicapi.helpers.initialize_headers() requests.structures.CaseInsensitiveDict[str]
- Return type:
CaseInsensitiveDict[str]
- ytmusicapi.helpers.sapisid_from_cookie(raw_cookie: str) str
- Return type:
str
- ytmusicapi.helpers.sum_total_duration(item: dict[str, Any]) int
- Return type:
int
- ytmusicapi.helpers.to_int(string: str) int
Attempts to cast a string to an integer using locale or Python int cast
- Parameters:
string (
str) – string that can be cast to an integer- Return type:
int
:return Integer if string is a valid integer
:raise ValueError if string is not a valid integer
ytmusicapi.setup module
- ytmusicapi.setup.main() ytmusicapi.auth.oauth.token.RefreshingToken | str
- Return type:
RefreshingToken|str
- ytmusicapi.setup.parse_args(args: list[str]) argparse.Namespace
- Return type:
Namespace
- ytmusicapi.setup.setup(filepath: str | None = None, headers_raw: str | None = None) str
Requests browser headers from the user via command line and returns a string that can be passed to YTMusic()
- Parameters:
filepath (
Optional[str]) – Optional filepath to store headers to.headers_raw (
Optional[str]) – Optional request headers copied from browser. Otherwise requested from terminal
- Return type:
str- Returns:
configuration headers string
- ytmusicapi.setup.setup_oauth(client_id: str, client_secret: str, filepath: str | None = None, session: requests.sessions.Session | None = None, proxies: dict[str, str] | None = None, open_browser: bool = False) ytmusicapi.auth.oauth.token.RefreshingToken
Starts oauth flow from the terminal and returns a string that can be passed to YTMusic()
- Parameters:
client_id (
str) – Optional. Used to specify the client_id oauth should use for authentication flow. If provided, client_secret MUST also be passed or both will be ignored.client_secret (
str) – Optional. Same as client_id but for the oauth client secret.session (
Optional[Session]) – Session to use for authenticationproxies (
Optional[dict[str,str]]) – Proxies to use for authenticationfilepath (
Optional[str]) – Optional filepath to store headers to.open_browser (
bool) – If True, open the default browser with the setup link
- Return type:
- Returns:
configuration headers string
ytmusicapi.type_alias module
ytmusicapi.ytmusic module
- class ytmusicapi.ytmusic.YTMusic(auth: str | dict[str, Any] | None = None, user: str | None = None, requests_session: requests.sessions.Session | None = None, proxies: dict[str, str] | None = None, language: str = 'en', location: str = '', oauth_credentials: ytmusicapi.auth.oauth.credentials.OAuthCredentials | None = None)
Bases:
YTMusicBase,BrowsingMixin,SearchMixin,WatchMixin,ChartsMixin,ExploreMixin,LibraryMixin,PlaylistsMixin,PodcastsMixin,UploadsMixinAllows automated interactions with YouTube Music by emulating the YouTube web client’s requests. Permits both authenticated and non-authenticated requests. Authentication header data must be provided on initialization.
- class ytmusicapi.ytmusic.YTMusicBase(auth: str | dict[str, Any] | None = None, user: str | None = None, requests_session: requests.sessions.Session | None = None, proxies: dict[str, str] | None = None, language: str = 'en', location: str = '', oauth_credentials: ytmusicapi.auth.oauth.credentials.OAuthCredentials | None = None)
Bases:
object- as_mobile() collections.abc.Iterator[None]
- Return type:
Iterator[None]
Not thread-safe!
Temporarily changes the context to enable different results from the API, meant for the Android mobile-app. All calls inside the with-statement with emulate mobile behavior.
This context-manager has no enter_result, as it operates in-place and only temporarily alters the underlying YTMusic-object.
Example:
with yt.as_mobile(): yt._send_request(...) # results as mobile-app yt._send_request(...) # back to normal, like web-app
- property base_headers: CaseInsensitiveDict[str]
- property headers: CaseInsensitiveDict[str]
-
proxies:
Optional[dict[str,str]] params for session modification
Module contents
- class ytmusicapi.LikeStatus(value)
Bases:
str,EnumAn enumeration.
- DISLIKE = 'DISLIKE'
- INDIFFERENT = 'INDIFFERENT'
- LIKE = 'LIKE'
- class ytmusicapi.OAuthCredentials(client_id: str, client_secret: str, session: requests.sessions.Session | None = None, proxies: dict[str, str] | None = None)
Bases:
CredentialsClass for handling OAuth credential retrieval and refreshing.
-
client_id:
str
-
client_secret:
str
- get_code() ytmusicapi.auth.oauth.models.AuthCodeDict
Method for obtaining a new user auth code. First step of token creation.
- Return type:
- refresh_token(refresh_token: str) ytmusicapi.auth.oauth.models.BaseTokenDict
Method for requesting a new access token for a given
refresh_token. Token must have been created by the same OAuth client.- Parameters:
refresh_token (
str) – Correspondingrefresh_tokenfor a matchingaccess_token. Obtained via- Return type:
- token_from_code(device_code: str) ytmusicapi.auth.oauth.models.RefreshableTokenDict
Method for verifying user auth code and conversion into a FullTokenDict.
- Return type:
-
client_id:
- class ytmusicapi.YTMusic(auth: str | dict[str, Any] | None = None, user: str | None = None, requests_session: requests.sessions.Session | None = None, proxies: dict[str, str] | None = None, language: str = 'en', location: str = '', oauth_credentials: ytmusicapi.auth.oauth.credentials.OAuthCredentials | None = None)
Bases:
YTMusicBase,BrowsingMixin,SearchMixin,WatchMixin,ChartsMixin,ExploreMixin,LibraryMixin,PlaylistsMixin,PodcastsMixin,UploadsMixinAllows automated interactions with YouTube Music by emulating the YouTube web client’s requests. Permits both authenticated and non-authenticated requests. Authentication header data must be provided on initialization.
- ytmusicapi.setup(filepath: str | None = None, headers_raw: str | None = None) str
Requests browser headers from the user via command line and returns a string that can be passed to YTMusic()
- Parameters:
filepath (
Optional[str]) – Optional filepath to store headers to.headers_raw (
Optional[str]) – Optional request headers copied from browser. Otherwise requested from terminal
- Return type:
str- Returns:
configuration headers string
- ytmusicapi.setup_oauth(client_id: str, client_secret: str, filepath: str | None = None, session: requests.sessions.Session | None = None, proxies: dict[str, str] | None = None, open_browser: bool = False) ytmusicapi.auth.oauth.token.RefreshingToken
Starts oauth flow from the terminal and returns a string that can be passed to YTMusic()
- Parameters:
client_id (
str) – Optional. Used to specify the client_id oauth should use for authentication flow. If provided, client_secret MUST also be passed or both will be ignored.client_secret (
str) – Optional. Same as client_id but for the oauth client secret.session (
Optional[Session]) – Session to use for authenticationproxies (
Optional[dict[str,str]]) – Proxies to use for authenticationfilepath (
Optional[str]) – Optional filepath to store headers to.open_browser (
bool) – If True, open the default browser with the setup link
- Return type:
- Returns:
configuration headers string