+"""
+Discogs
+=======
+.. moduleauthor:: Benjamin Ye <GitHub: bbye98>
+"""
+
+fromhttp.serverimportHTTPServer,BaseHTTPRequestHandler
+importjson
+importlogging
+frommultiprocessingimportProcess
+importos
+importre
+importsecrets
+importtime
+fromtypingimportAny,Union
+importurllib
+importwarnings
+importwebbrowser
+
+importrequests
+
+from.import(FOUND_FLASK,FOUND_PLAYWRIGHT,VERSION,REPOSITORY_URL,
+ DIR_HOME,DIR_TEMP,config)
+ifFOUND_FLASK:
+ from.importFlask,request
+ifFOUND_PLAYWRIGHT:
+ from.importsync_playwright
+
+__all__=["API"]
+
+class_DiscogsRedirectHandler(BaseHTTPRequestHandler):
+
+"""
+ HTTP request handler for the Discogs OAuth 1.0a flow.
+ """
+
+ defdo_GET(self):
+
+"""
+ Handles an incoming GET request and parses the query string.
+ """
+
+ self.server.response=dict(
+ urllib.parse.parse_qsl(
+ urllib.parse.urlparse(f"{self.path}").query
+ )
+ )
+ self.send_response(200)
+ self.send_header("Content-Type","text/html")
+ self.end_headers()
+ status="denied"if"denied"inself.server.responseelse"granted"
+ self.wfile.write(
+ f"Access {status}. You may close this page now.".encode()
+ )
+
+
+[docs]
+classAPI:
+
+"""
+ Discogs API client.
+
+ The Discogs API lets developers build their own Discogs-powered
+ applications for the web, desktop, and mobile devices. It is a
+ RESTful interface to Discogs data and enables accessing JSON-
+ formatted information about artists, releases, and labels,
+ managing user collections and wantlists, creating marketplace
+ listings, and more.
+
+ .. seealso::
+
+ For more information, see the `Discogs API home page
+ <https://www.discogs.com/developers>`_.
+
+ The Discogs API can be accessed with or without authentication.
+ (client credentials, personal access token, or OAuth access token
+ and access token secret). However, it is recommended that users at
+ least provide client credentials to enjoy higher rate limits and
+ access to image URLs. The consumer key and consumer secret can
+ either be provided to this class's constructor as keyword arguments
+ or be stored as :code:`DISCOGS_CONSUMER_KEY` and
+ :code:`DISCOGS_CONSUMER_SECRET` in the operating system's
+ environment variables.
+
+ .. seealso::
+
+ To get client credentials, see the Registration section of the
+ `Authentication page <https://www.discogs.com/developers
+ /#page:authentication>`_ of the Discogs API website. To take
+ advantage of Minim's automatic access token retrieval
+ functionality for the OAuth 1.0a flow, the redirect URI should be
+ in the form :code:`http://localhost:{port}/callback`, where
+ :code:`{port}` is an open port on :code:`localhost`.
+
+ To view and make changes to account information and resources, users
+ must either provide a personal access token to this class's
+ constructor as a keyword argument or store it as
+ :code:`DISCOGS_PERSONAL_ACCESS_TOKEN` in the operating system's
+ environment variables, or undergo the OAuth 1.0a flow, which require
+ valid client credentials, using Minim. If an existing OAuth access
+ token/secret pair is available, it can be provided to this class's
+ constructor as keyword arguments to bypass the access token
+ retrieval process.
+
+ .. tip::
+
+ The authorization flow and access token can be changed or updated
+ at any time using :meth:`set_flow` and :meth:`set_access_token`,
+ respectively.
+
+ Minim also stores and manages access tokens and their properties.
+ When the OAuth 1.0a flow is used to acquire an access token/secret
+ pair, it is automatically saved to the Minim configuration file to
+ be loaded on the next instantiation of this class. This behavior can
+ be disabled if there are any security concerns, like if the computer
+ being used is a shared device.
+
+ Parameters
+ ----------
+ consumer_key : `str`, keyword-only, optional
+ Consumer key. Required for the OAuth 1.0a flow, and can be used
+ in the Discogs authorization flow alongside a consumer secret.
+ If it is not stored as :code:`DISCOGS_CONSUMER_KEY` in the
+ operating system's environment variables or found in the Minim
+ configuration file, it can be provided here.
+
+ consumer_secret : `str`, keyword-only, optional
+ Consumer secret. Required for the OAuth 1.0a flow, and can be
+ used in the Discogs authorization flow alongside a consumer key.
+ If it is not stored as :code:`DISCOGS_CONSUMER_SECRET` in the
+ operating system's environment variables or found in the Minim
+ configuration file, it can be provided here.
+
+ flow : `str`, keyword-only, optional
+ Authorization flow. If :code:`None` and no access token is
+ provided, no user authentication will be performed and client
+ credentials will not be attached to requests, even if found or
+ provided.
+
+ .. container::
+
+ **Valid values**:
+
+ * :code:`None` for no user authentication.
+ * :code:`"discogs"` for the Discogs authentication flow.
+ * :code:`"oauth"` for the OAuth 1.0a flow.
+
+ browser : `bool`, keyword-only, default: :code:`False`
+ Determines whether a web browser is automatically opened for the
+ OAuth 1.0a flow. If :code:`False`, users will have to manually
+ open the authorization URL and provide the full callback URI via
+ the terminal.
+
+ web_framework : `str`, keyword-only, optional
+ Determines which web framework to use for the OAuth 1.0a flow.
+
+ .. container::
+
+ **Valid values**:
+
+ * :code:`"http.server"` for the built-in implementation of
+ HTTP servers.
+ * :code:`"flask"` for the Flask framework.
+ * :code:`"playwright"` for the Playwright framework by
+ Microsoft.
+
+ port : `int` or `str`, keyword-only, default: :code:`8888`
+ Port on :code:`localhost` to use for the OAuth 1.0a flow with
+ the :code:`http.server` and Flask frameworks. Only used if
+ `redirect_uri` is not specified.
+
+ redirect_uri : `str`, keyword-only, optional
+ Redirect URI for the OAuth 1.0a flow. If not on
+ :code:`localhost`, the automatic request access token retrieval
+ functionality is not available.
+
+ access_token : `str`, keyword-only, optional
+ Personal or OAuth access token. If provided here or found in the
+ Minim configuration file, the authentication process is
+ bypassed.
+
+ access_token_secret : `str`, keyword-only, optional
+ OAuth access token secret accompanying `access_token`.
+
+ overwrite : `bool`, keyword-only, default: :code:`False`
+ Determines whether to overwrite an existing access token in the
+ Minim configuration file.
+
+ save : `bool`, keyword-only, default: :code:`True`
+ Determines whether newly obtained access tokens and their
+ associated properties are stored to the Minim configuration
+ file.
+
+ Attributes
+ ----------
+ API_URL : `str`
+ Base URL for the Discogs API.
+
+ ACCESS_TOKEN_URL : `str`
+ URL for the OAuth 1.0a access token endpoint.
+
+ AUTH_URL : `str`
+ URL for the OAuth 1.0a authorization endpoint.
+
+ REQUEST_TOKEN_URL : `str`
+ URL for the OAuth 1.0a request token endpoint.
+
+ session : `requests.Session`
+ Session used to send requests to the Discogs API.
+ """
+
+ _FLOWS={"discogs","oauth"}
+ _NAME=f"{__module__}.{__qualname__}"
+
+ API_URL="https://api.discogs.com"
+ ACCESS_TOKEN_URL=f"{API_URL}/oauth/access_token"
+ AUTH_URL="https://www.discogs.com/oauth/authorize"
+ REQUEST_TOKEN_URL=f"{API_URL}/oauth/request_token"
+
+ def__init__(
+ self,*,consumer_key:str=None,consumer_secret:str=None,
+ flow:str=None,browser:bool=False,web_framework:str=None,
+ port:Union[int,str]=8888,redirect_uri:str=None,
+ access_token:str=None,access_token_secret:str=None,
+ overwrite:bool=False,save:bool=True)->None:
+
+"""
+ Create a Discogs API client.
+ """
+
+ self.session=requests.Session()
+ self.session.headers["User-Agent"]=f"Minim/{VERSION} +{REPOSITORY_URL}"
+
+ if(access_tokenisNoneandconfig.has_section(self._NAME)
+ andnotoverwrite):
+ flow=config.get(self._NAME,"flow")
+ access_token=config.get(self._NAME,"access_token")
+ access_token_secret=config.get(self._NAME,"access_token_secret")
+ consumer_key=config.get(self._NAME,"consumer_key")
+ consumer_secret=config.get(self._NAME,"consumer_secret")
+ elifflowisNoneandaccess_tokenisnotNone:
+ flow="discogs"ifaccess_token_secretisNoneelse"oauth"
+
+ self.set_flow(
+ flow,consumer_key=consumer_key,consumer_secret=consumer_secret,
+ browser=browser,web_framework=web_framework,port=port,
+ redirect_uri=redirect_uri,save=save
+ )
+ self.set_access_token(access_token,access_token_secret)
+
+ def_check_authentication(
+ self,endpoint:str,token:bool=True)->None:
+
+"""
+ Check if the user is authenticated for the desired endpoint.
+
+ Parameters
+ ----------
+ endpoint : `str`
+ Discogs API endpoint.
+
+ token : `bool`, default: :code:`True`
+ Specifies whether a personal access token or OAuth access
+ token is required for the endpoint. If :code:`False`, only
+ client credentials are required.
+ """
+
+ iftokenand(
+ self._flow!="oauth"
+ orself._flow=="discogs"
+ and"token"notinself.session.headers["Authorization"]
+ ):
+ emsg=(f"{self._NAME}.{endpoint}() requires user "
+ "authentication.")
+ raiseRuntimeError(emsg)
+ elifself._flowisNone:
+ emsg=f"{self._NAME}.{endpoint}() requires client credentials."
+ raiseRuntimeError(emsg)
+
+ def_get_json(self,url:str,**kwargs)->dict:
+
+"""
+ Send a GET request and return the JSON-encoded content of the
+ response.
+
+ Parameters
+ ----------
+ url : `str`
+ URL for the GET request.
+
+ **kwargs
+ Keyword arguments to pass to :meth:`requests.request`.
+
+ Returns
+ -------
+ resp : `dict`
+ JSON-encoded content of the response.
+ """
+
+ returnself._request("get",url,**kwargs).json()
+
+ def_request(
+ self,method:str,url:str,*,oauth:dict[str,Any]=None,
+ **kwargs)->requests.Response:
+
+"""
+ Construct and send a request with status code checking.
+
+ Parameters
+ ----------
+ method : `str`
+ Method for the request.
+
+ url : `str`
+ URL for the request.
+
+ oauth : `dict`, keyword-only, optional
+ OAuth-related values to be included in the authorization
+ header.
+
+ **kwargs
+ Keyword arguments passed to :meth:`requests.request`.
+
+ Returns
+ -------
+ resp : `requests.Response`
+ Response to the request.
+ """
+
+ ifself._flow=="oauth" \
+ and"Authorization"notinkwargs.get("headers",{}):
+ ifoauthisNone:
+ oauth={}
+ oauth=self._oauth|{
+ "oauth_nonce":secrets.token_hex(32),
+ "oauth_timestamp":f"{time.time():.0f}"
+ }|oauth
+
+ if"headers"notinkwargs:
+ kwargs["headers"]={}
+ kwargs["headers"]["Authorization"]="OAuth "+", ".join(
+ f'{k}="{v}"'fork,vinoauth.items()
+ )
+
+ r=self.session.request(method,url,**kwargs)
+ ifr.status_codenotinrange(200,299):
+ raiseRuntimeError(f"{r.status_code}: {r.json()['message']}")
+ returnr
+
+
+[docs]
+ defget_identity(self)->dict[str,Any]:
+
+"""
+ `User Identity > Identity <https://www.discogs.com/developers
+ /#page:user-identity,header:user-identity-identity-get>`_:
+ Retrieve basic information about the authenticated user.
+
+ .. admonition:: User authentication
+ :class: warning
+
+ Requires user authentication with a personal access token or
+ via the OAuth 1.0a flow.
+
+ You can use this resource to find out who you're authenticated
+ as, and it also doubles as a good sanity check to ensure that
+ you're using OAuth correctly.
+
+ For more detailed information, make another request for the
+ user's profile using :meth:`get_profile`.
+
+ Returns
+ -------
+ identity : `dict`
+ Basic information about the authenticated user.
+
+ .. admonition:: Sample
+ :class: dropdown
+
+ .. code::
+
+ {
+ "id": <int>,
+ "username": <str>,
+ "resource_url": <str>,
+ "consumer_name": <str>
+ }
+ """
+
+ self._check_authentication("get_identity")
+
+ returnself._get_json(f"{self.API_URL}/oauth/identity")
+
+
+
+[docs]
+ defget_profile(self,username:str=None)->dict[str,Any]:
+
+"""
+ `User Identity > Profile > Get Profile
+ <https://www.discogs.com/developers
+ /#page:user-identity,header:user-identity-profile-get>`_:
+ Retrieve a user by username.
+
+ If authenticated as the requested user, the :code:`"email"` key
+ will be visible, and the :code:`"num_lists"` count will include
+ the user's private lists.
+
+ If authenticated as the requested user or the user's
+ collection/wantlist is public, the
+ :code:`"num_collection"`/:code:`"num_wantlist"` keys will be
+ visible.
+
+ Parameters
+ ----------
+ username : `str`, optional
+ The username of whose profile you are requesting. If not
+ specified, the profile of the authenticated user is used.
+
+ **Example**: :code:`"rodneyfool"`.
+
+ Returns
+ -------
+ profile : `dict`
+ Detailed information about the user.
+
+ .. admonition:: Sample
+ :class: dropdown
+
+ .. code::
+
+ {
+ "profile": <str>,
+ "wantlist_url": <str>,
+ "rank": <int>,
+ "num_pending": <int>,
+ "id": <int>,
+ "num_for_sale": <int>,
+ "home_page": <str>,
+ "location": <str>,
+ "collection_folders_url": <str>,
+ "username": <str>,
+ "collection_fields_url": <str>,
+ "releases_contributed": <int>,
+ "registered": <str>,
+ "rating_avg": <float>,
+ "num_collection": <int>,
+ "releases_rated": <int>,
+ "num_lists": <int>,
+ "name": <str>,
+ "num_wantlist": <int>,
+ "inventory_url": <str>,
+ "avatar_url": <str>,
+ "banner_url": <str>,
+ "uri": <str>,
+ "resource_url": <str>,
+ "buyer_rating": <float>,
+ "buyer_rating_stars": <int>,
+ "buyer_num_ratings": <int>,
+ "seller_rating": <float>,
+ "seller_rating_stars": <int>,
+ "seller_num_ratings": <int>,
+ "curr_abbr": <str>,
+ }
+ """
+
+ ifusernameisNone:
+ ifhasattr(self,"_username"):
+ username=self._username
+ else:
+ raiseValueError("No username provided.")
+ returnself._get_json(f"{self.API_URL}/users/{username}")
This module contains a minimum implementation of the private Qobuz API."""
-from.import(
- base64,datetime,hashlib,logging,os,re,requests,
- FOUND_PLAYWRIGHT,DIR_HOME,DIR_TEMP,Any,Union,config
-)
+importbase64
+importdatetime
+importhashlib
+importlogging
+importos
+importre
+fromtypingimportAny,Union
+
+importrequests
+from.importFOUND_PLAYWRIGHT,DIR_HOME,DIR_TEMP,configifFOUND_PLAYWRIGHT:from.importsync_playwright
@@ -497,7 +507,7 @@
Source code for minim.qobuz
def_request(self,method:str,url:str,**kwargs)->requests.Response:"""
- Construct and send a request, but with status code checking.
+ Construct and send a request with status code checking. Parameters ----------
@@ -700,7 +710,7 @@
Source code for minim.qobuz
app_id=app_idoros.environ.get("QOBUZ_PRIVATE_APP_ID")app_secret=app_secretoros.environ.get("QOBUZ_PRIVATE_APP_SECRET")
- if(notapp_idornotapp_secret)andauth_token:
+ if(app_idisNoneorapp_secretisNone)andauth_tokenisnotNone:emsg=("App credentials are required when an user ""authentication token is provided.")
diff --git a/docs/_modules/minim/spotify.html b/docs/_modules/minim/spotify.html
index c868299..f2e4cee 100644
--- a/docs/_modules/minim/spotify.html
+++ b/docs/_modules/minim/spotify.html
@@ -176,28 +176,32 @@
self.send_header("Content-Type","text/html")self.end_headers()status="denied"if"error"inself.server.responseelse"granted"
- self.wfile.write(f"Access {status}. You may close this page now.".encode())
+ self.wfile.write(
+ f"Access {status}. You may close this page now.".encode()
+ )
)->requests.Response:"""
- Construct and send a request, but with status code checking.
+ Construct and send a request with status code checking. Parameters ----------
@@ -717,7 +729,7 @@
Source code for minim.spotify
* :code:`"web_player"` for a Spotify Web Player access token.
- framework : `str`, keyword-only, optional
+ web_framework : `str`, keyword-only, optional Determines which web framework to use for the authorization code flow.
@@ -733,8 +745,8 @@
Source code for minim.spotify
port : `int` or `str`, keyword-only, default: :code:`8888` Port on :code:`localhost` to use for the authorization code
- flow with the Flask framework. Only used if `redirect_uri` is
- not specified.
+ flow with the :code:`http.server` and Flask frameworks. Only
+ used if `redirect_uri` is not specified. redirect_uri : `str`, keyword-only, optional Redirect URI for the authorization code flow. If not on
@@ -919,7 +931,7 @@
)->requests.Response:"""
- Construct and send a request, but with status code checking.
+ Construct and send a request with status code checking. Parameters ----------
@@ -1297,7 +1309,7 @@
Client secret. Required for all OAuth 2.0 authorization flows.
- framework : `str`, keyword-only, optional
+ web_framework : `str`, keyword-only, optional Web framework used to automatically complete the authorization code flow.
@@ -1345,7 +1357,7 @@
Source code for minim.spotify
port : `int` or `str`, keyword-only, default: :code:`8888` Port on :code:`localhost` to use for the authorization code
- flow with the Flask framework.
+ flow with the :code:`http.server` and Flask frameworks. redirect_uri : `str`, keyword-only, optional Redirect URI for the authorization code flow. If not
@@ -1387,24 +1399,24 @@
Source code for minim.spotify
if"localhost"inredirect_uri:self._port=re.search("localhost:(\d+)",redirect_uri).group(1)
- elifframework:
+ elifweb_framework:wmsg=("The redirect URI is not on localhost, ""so automatic authorization code ""retrieval is not available.")logging.warning(wmsg)
- framework=None
+ web_framework=Noneelse:self._port=portself._redirect_uri=f"http://localhost:{port}/callback"
- self._framework=(
- frameworkifframeworkisNone
- orframework=="http.server"
- orglobals()[f"FOUND_{framework.upper()}"]
+ self._web_framework=(
+ web_frameworkifweb_frameworkisNone
+ orweb_framework=="http.server"
+ orglobals()[f"FOUND_{web_framework.upper()}"]elseNone)
- ifself._frameworkisNoneandframework:
- wmsg=(f"The {framework.capitalize()} web "
+ ifself._web_frameworkisNoneandweb_framework:
+ wmsg=(f"The {web_framework.capitalize()} web ""framework was not found, so automatic ""authorization code retrieval is not ""available.")
@@ -2801,8 +2813,8 @@
Source code for minim.spotify
""" `Audiobooks > Get an Audiobook <https://developer.spotify.com/documentation/web-api/reference/
- get-an-audiobook>`_: Get Spotify catalog
- information for a single audiobook.
+ get-an-audiobook>`_: Get Spotify catalog information for a
+ single audiobook. .. note::
diff --git a/docs/_modules/minim/tidal.html b/docs/_modules/minim/tidal.html
index 3415b4c..bdb14e9 100644
--- a/docs/_modules/minim/tidal.html
+++ b/docs/_modules/minim/tidal.html
@@ -176,28 +176,32 @@
def_request(self,method:str,url:str,**kwargs)->requests.Response:"""
- Construct and send a request, but with status code checking.
+ Construct and send a request with status code checking. Parameters ----------
@@ -2524,7 +2538,7 @@
Source code for minim.tidal
)->requests.Response:"""
- Construct and send a request, but with status code checking.
+ Construct and send a request with status code checking. Parameters ----------
diff --git a/docs/_modules/minim/utility.html b/docs/_modules/minim/utility.html
index 2260c0a..cd569ff 100644
--- a/docs/_modules/minim/utility.html
+++ b/docs/_modules/minim/utility.html
@@ -173,29 +173,32 @@
The Discogs API lets developers build their own Discogs-powered
+applications for the web, desktop, and mobile devices. It is a
+RESTful interface to Discogs data and enables accessing JSON-
+formatted information about artists, releases, and labels,
+managing user collections and wantlists, creating marketplace
+listings, and more.
The Discogs API can be accessed with or without authentication.
+(client credentials, personal access token, or OAuth access token
+and access token secret). However, it is recommended that users at
+least provide client credentials to enjoy higher rate limits and
+access to image URLs. The consumer key and consumer secret can
+either be provided to this class’s constructor as keyword arguments
+or be stored as DISCOGS_CONSUMER_KEY and
+DISCOGS_CONSUMER_SECRET in the operating system’s
+environment variables.
+
+
See also
+
To get client credentials, see the Registration section of the
+Authentication page of the Discogs API website. To take
+advantage of Minim’s automatic access token retrieval
+functionality for the OAuth 1.0a flow, the redirect URI should be
+in the form http://localhost:{port}/callback, where
+{port} is an open port on localhost.
+
+
To view and make changes to account information and resources, users
+must either provide a personal access token to this class’s
+constructor as a keyword argument or store it as
+DISCOGS_PERSONAL_ACCESS_TOKEN in the operating system’s
+environment variables, or undergo the OAuth 1.0a flow, which require
+valid client credentials, using Minim. If an existing OAuth access
+token/secret pair is available, it can be provided to this class’s
+constructor as keyword arguments to bypass the access token
+retrieval process.
+
+
Tip
+
The authorization flow and access token can be changed or updated
+at any time using set_flow() and set_access_token(),
+respectively.
+
+
Minim also stores and manages access tokens and their properties.
+When the OAuth 1.0a flow is used to acquire an access token/secret
+pair, it is automatically saved to the Minim configuration file to
+be loaded on the next instantiation of this class. This behavior can
+be disabled if there are any security concerns, like if the computer
+being used is a shared device.
+
+
Parameters:
+
+
consumer_keystr, keyword-only, optional
Consumer key. Required for the OAuth 1.0a flow, and can be used
+in the Discogs authorization flow alongside a consumer secret.
+If it is not stored as DISCOGS_CONSUMER_KEY in the
+operating system’s environment variables or found in the Minim
+configuration file, it can be provided here.
+
+
consumer_secretstr, keyword-only, optional
Consumer secret. Required for the OAuth 1.0a flow, and can be
+used in the Discogs authorization flow alongside a consumer key.
+If it is not stored as DISCOGS_CONSUMER_SECRET in the
+operating system’s environment variables or found in the Minim
+configuration file, it can be provided here.
+
+
flowstr, keyword-only, optional
Authorization flow. If None and no access token is
+provided, no user authentication will be performed and client
+credentials will not be attached to requests, even if found or
+provided.
+
+
Valid values:
+
+
None for no user authentication.
+
"discogs" for the Discogs authentication flow.
+
"oauth" for the OAuth 1.0a flow.
+
+
+
+
browserbool, keyword-only, default: False
Determines whether a web browser is automatically opened for the
+OAuth 1.0a flow. If False, users will have to manually
+open the authorization URL and provide the full callback URI via
+the terminal.
+
+
web_frameworkstr, keyword-only, optional
Determines which web framework to use for the OAuth 1.0a flow.
+
+
Valid values:
+
+
"http.server" for the built-in implementation of
+HTTP servers.
+
"flask" for the Flask framework.
+
"playwright" for the Playwright framework by
+Microsoft.
+
+
+
+
portint or str, keyword-only, default: 8888
Port on localhost to use for the OAuth 1.0a flow with
+the http.server and Flask frameworks. Only used if
+redirect_uri is not specified.
+
+
redirect_uristr, keyword-only, optional
Redirect URI for the OAuth 1.0a flow. If not on
+localhost, the automatic request access token retrieval
+functionality is not available.
+
+
access_tokenstr, keyword-only, optional
Personal or OAuth access token. If provided here or found in the
+Minim configuration file, the authentication process is
+bypassed.
Authorization flow. If None, no user authentication
+will be performed and client credentials will not be
+attached to requests, even if found or provided.
Requires user authentication with a personal access token or
+via the OAuth 1.0a flow.
+
+
You can use this resource to find out who you’re authenticated
+as, and it also doubles as a good sanity check to ensure that
+you’re using OAuth correctly.
+
For more detailed information, make another request for the
+user’s profile using get_profile().
Audiobooks are only available for the US, UK, Ireland, New
diff --git a/docs/api/minim.spotify.html b/docs/api/minim.spotify.html
index 27fbb13..566eebd 100644
--- a/docs/api/minim.spotify.html
+++ b/docs/api/minim.spotify.html
@@ -178,25 +178,29 @@