diff --git a/.coverage b/.coverage index 5371006..bd068cd 100644 Binary files a/.coverage and b/.coverage differ diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..a7dc8a2 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,5 @@ +[run] +omit = **/tests/* + +[html] +directory = tests/coverage/htmlcov \ No newline at end of file diff --git a/docs/.doctrees/api/minim.discogs.API.doctree b/docs/.doctrees/api/minim.discogs.API.doctree index 4dd939a..abaa6c5 100644 Binary files a/docs/.doctrees/api/minim.discogs.API.doctree and b/docs/.doctrees/api/minim.discogs.API.doctree differ diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle index 48c7aa8..e82b102 100644 Binary files a/docs/.doctrees/environment.pickle and b/docs/.doctrees/environment.pickle differ diff --git a/docs/_modules/minim/discogs.html b/docs/_modules/minim/discogs.html index 416ee5a..b8076cd 100644 --- a/docs/_modules/minim/discogs.html +++ b/docs/_modules/minim/discogs.html @@ -263,11 +263,11 @@

Source code for minim.discogs

 import requests
 
 from . import (FOUND_FLASK, FOUND_PLAYWRIGHT, VERSION, REPOSITORY_URL, 
-               DIR_HOME, DIR_TEMP, config)
+               DIR_HOME, DIR_TEMP, _config)
 if FOUND_FLASK:
-    from . import Flask, request
+    from flask import Flask, request
 if FOUND_PLAYWRIGHT:
-    from . import sync_playwright
+    from playwright.sync_api import sync_playwright
 
 __all__ = ["API"]
 
@@ -472,13 +472,13 @@ 

Source code for minim.discogs

         self.session = requests.Session()
         self.session.headers["User-Agent"] = f"Minim/{VERSION} +{REPOSITORY_URL}"
 
-        if (access_token is None and config.has_section(self._NAME) 
+        if (access_token is None and _config.has_section(self._NAME) 
                 and not overwrite):
-            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")
+            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")
         elif flow is None and access_token is not None:
             flow = "discogs" if access_token_secret is None else "oauth"
 
@@ -642,8 +642,8 @@ 

Source code for minim.discogs

                         oauth |= dict(
                             urllib.parse.parse_qsl(
                                 urllib.parse.urlparse(
-                                    re.search(f'{self._redirect_uri}\?(.*?)"', 
-                                                f.read()).group(0)
+                                    re.search(fr'{self._redirect_uri}\?(.*?)"', 
+                                              f.read()).group(0)
                                 ).query
                             )
                         )
@@ -712,7 +712,7 @@ 

Source code for minim.discogs

                     dict(urllib.parse.parse_qsl(r.text)).values()
 
                 if self._save:
-                    config[self._NAME] = {
+                    _config[self._NAME] = {
                         "flow": self._flow,
                         "access_token": access_token,
                         "access_token_secret": access_token_secret,
@@ -720,7 +720,7 @@ 

Source code for minim.discogs

                         "consumer_secret": self._consumer_secret
                     }
                     with open(DIR_HOME / "minim.cfg", "w") as f:
-                        config.write(f)
+                        _config.write(f)
         
             self._oauth |= {
                 "oauth_token": access_token,
@@ -775,6 +775,54 @@ 

Source code for minim.discogs

                * :code:`"oauth"` for the OAuth 1.0a flow.
 
         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.
+
+        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. 
+
+        save : `bool`, keyword-only, default: :code:`True`
+            Determines whether newly obtained access tokens and their
+            associated properties are stored to the Minim configuration
+            file.
         """
 
         if flow and flow not in self._FLOWS:
@@ -794,8 +842,8 @@ 

Source code for minim.discogs

             if redirect_uri:
                 self._redirect_uri = redirect_uri
                 if "localhost" in redirect_uri:
-                    self._port = re.search("localhost:(\d+)", 
-                                            redirect_uri).group(1)
+                    self._port = re.search(r"localhost:(\d+)", 
+                                           redirect_uri).group(1)
                 elif web_framework:
                     wmsg = ("The redirect URI is not on localhost, "
                             "so automatic authorization code "
@@ -1007,9 +1055,9 @@ 

Source code for minim.discogs

         )
-
-[docs] - def get_release_user_rating( +
+[docs] + def get_user_release_rating( self, release_id: Union[int, str], username: str = None ) -> dict[str, Any]: @@ -1061,9 +1109,9 @@

Source code for minim.discogs

         )
-
-[docs] - def update_release_user_rating( +
+[docs] + def update_user_release_rating( self, release_id: Union[int, str], rating: int, username: str = None) -> dict[str, Any]: @@ -1113,7 +1161,7 @@

Source code for minim.discogs

                   }
         """ 
 
-        self._check_authentication("update_release_rating")
+        self._check_authentication("update_user_release_rating")
 
         if username is None:
             if hasattr(self, "_username"):
@@ -1128,62 +1176,819 @@ 

Source code for minim.discogs

         )
- def delete_release_user_rating( +
+[docs] + def delete_user_release_rating( self, release_id: Union[int, str], username: str = None) -> None: + + """ + `Database > Release Rating By User > Delete Release Rating By + User <https://www.discogs.com/developers + /#page:database,header:database-release-rating-by-user-delete>`_: + Deletes the release's rating for a given user. + + .. admonition:: User authentication + :class: warning + + Requires user authentication with a personal access token or + via the OAuth 1.0a flow. + + Parameters + ---------- + release_id : `int` or `str` + The release ID. + + **Example**: :code:`249504`. + + username : `str`, optional + The username of the user whose rating you are requesting. If + not specified, the username of the authenticated user is + used. + + **Example**: :code:`"memory"`. + """ + + self._check_authentication("delete_user_release_rating") - raise NotImplementedError + if username is None: + if hasattr(self, "_username"): + username = self._username + else: + raise ValueError("No username provided.") + + return self._request( + "delete", + f"{self.API_URL}/releases/{release_id}/rating/{username}" + )
- def get_release_community_rating( - self, release_id: Union[int, str]) -> dict[str, Any]: + +
+[docs] + def get_community_release_rating( + self, release_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Community Release Rating <https://www.discogs.com + /developers/#page:database,header + :database-community-release-rating-get>`_: Retrieves the + community release rating average and count. + + Parameters + ---------- + release_id : `int` or `str` + The release ID. + + **Example**: :code:`249504`. + + Returns + ------- + rating : `dict` + Community release rating average and count. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "rating": { + "count": <int>, + "average": <float> + }, + "release_id": <int> + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/releases/{release_id}/rating")
+ +
+[docs] def get_release_stats(self, release_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Release Stats <https://www.discogs.com/developers + /#page:database,header:database-release-stats-get>`_: Retrieves + the release's "have" and "want" counts. + + .. attention:: + + This endpoint does not appear to be working correctly. + Currently, the response will be of the form + + .. code:: + + { + "is_offense": <bool> + } + + Parameters + ---------- + release_id : `int` or `str` + The release ID. + + **Example**: :code:`249504`. + + Returns + ------- + stats : `dict` + Release "have" and "want" counts. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "num_have": <int>, + "num_want": <int> + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/releases/{release_id}/stats")
+ +
+[docs] def get_master_release(self, master_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Master Release <https://www.discogs.com/developers + /#page:database,header:database-master-release-get>`_: Get a + master release. + + Parameters + ---------- + master_id : `int` or `str` + The master release ID. + + **Example**: :code:`1000`. + + Returns + ------- + master_release : `dict` + Discogs database information for a single master release. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "styles": [<str>], + "genres": [<str>], + "videos": [ + { + "duration": <int>, + "description": <str>, + "embed": <bool>, + "uri": <str>, + "title": <str> + } + ], + "title": <str>, + "main_release": <int>, + "main_release_url": <str>, + "uri": <str>, + "artists": [ + { + "join": <str>, + "name": <str>, + "anv": <str>, + "tracks": <str>, + "role": <str>, + "resource_url": <str>, + "id": <int> + } + ], + "versions_url": <str>, + "year": <int>, + "images": [ + { + "height": <int>, + "resource_url": <str>, + "type": <str>, + "uri": <str>, + "uri150": <str>, + "width": <int> + } + ], + "resource_url": <str>, + "tracklist": [ + { + "duration": <str>, + "position": <str>, + "type_": <str>, + "extraartists": [ + { + "join": <str>, + "name": <str>, + "anv": <str>, + "tracks": <str>, + "role": <str>, + "resource_url": <str>, + "id": <int> + } + ], + "title": <str> + } + ], + "id": <int>, + "num_for_sale": <int>, + "lowest_price": <float>, + "data_quality": <str> + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/masters/{master_id}")
+ +
+[docs] def get_master_release_versions( self, master_id: Union[int, str], *, country: str = None, format: str = None, label: str = None, released: str = None, page: int = None, per_page: int = None, sort: str = None, sort_order: str = None) -> dict[str, Any]: + + """ + `Database > Master Release Versions <https://www.discogs.com + /developers/#page:database,header + :database-master-release-versions-get>`_: Retrieves a list of + all releases that are versions of this master. + + Parameters + ---------- + master_id : `int` or `str` + The master release ID. + + **Example**: :code:`1000`. + + country : `str`, keyword-only, optional + The country to filter for. + + **Example**: :code:`"Belgium"`. + + format : `str`, keyword-only, optional + The format to filter for. + + **Example**: :code:`"Vinyl"`. + + label : `str`, keyword-only, optional + The label to filter for. + + **Example**: :code:`"Scorpio Music"`. + + released : `str`, keyword-only, optional + The release year to filter for. + + **Example**: :code:`"1992"`. + + page : `int`, keyword-only, optional + The page you want to request. + + **Example**: :code:`3`. + + per_page : `int`, keyword-only, optional + The number of items per page. + + **Example**: :code:`25`. + + sort : `str`, keyword-only, optional + Sort items by this field. + + **Valid values**: :code:`"released"`, :code:`"title"`, + :code:`"format"`, :code:`"label"`, :code:`"catno"`, + and :code:`"country"`. + + sort_order : `str`, keyword-only, optional + Sort items in a particular order. + + **Valid values**: :code:`"asc"` and :code:`"desc"`. + + Returns + ------- + versions : `dict` + Discogs database information for all releases that are + versions of the specified master. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": <int>, + "page": <int>, + "pages": <int>, + "per_page": <int>, + "urls": { + "last": <str>, + "next": <str> + } + }, + "versions": [ + { + "status": <str>, + "stats": { + "user": { + "in_collection": <int>, + "in_wantlist": <int> + }, + "community": { + "in_collection": <int>, + "in_wantlist": <int> + } + }, + "thumb": <str>, + "format": <str>, + "country": <str>, + "title": <str>, + "label": <str>, + "released": <str>, + "major_formats": [<str>], + "catno": <str>, + "resource_url": <str>, + "id": <int> + } + ] + } + """ - raise NotImplementedError + return self._get_json( + f"{self.API_URL}/masters/{master_id}/versions", + params={ + "country": country, + "format": format, + "label": label, + "released": released, + "page": page, + "per_page": per_page, + "sort": sort, + "sort_order": sort_order + }, + )
+ +
+[docs] def get_artist(self, artist_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Artist <https://www.discogs.com/developers + /#page:database,header:database-artist-get>`_: Get an artist. + + Parameters + ---------- + artist_id : `int` or `str` + The artist ID. + + **Example**: :code:`108713`. + + Returns + ------- + artist : `dict` + Discogs database information for a single artist. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "namevariations": [<str>], + "profile": <str>, + "releases_url": <str>, + "resource_url": <str>, + "uri": <str>, + "urls": [<str>], + "data_quality": <str>, + "id": <int>, + "images": [ + { + "height": <int>, + "resource_url": <str>, + "type": <str>, + "uri": <str>, + "uri150": <str>, + "width": <int> + } + ], + "members": [ + { + "active": <bool>, + "id": <int>, + "name": <str>, + "resource_url": <str> + } + ] + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/artists/{artist_id}")
+ +
+[docs] def get_artist_releases( - self, artist_id: Union[int, str], *, sort: str = None, - sort_order: str = None) -> dict[str, Any]: + self, artist_id: Union[int, str], *, page: int = None, + per_page: int = None, sort: str = None, sort_order: str = None + ) -> dict[str, Any]: + + """ + `Database > Artist Releases <https://www.discogs.com/developers + /#page:database,header:database-artist-releases-get>`_: Get an + artist's releases and masters. + + Parameters + ---------- + artist_id : `int` or `str` + The artist ID. + + **Example**: :code:`108713`. + + page : `int`, keyword-only, optional + Page of results to fetch. + + per_page : `int`, keyword-only, optional + Number of results per page. + + sort : `str`, keyword-only, optional + Sort results by this field. + + **Valid values**: :code:`"year"`, :code:`"title"`, and + :code:`"format"`. + + sort_order : `str`, keyword-only, optional + Sort results in a particular order. + + **Valid values**: :code:`"asc"` and :code:`"desc"`. + + Returns + ------- + releases : `dict` + Discogs database information for all releases by the + specified artist. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": <int>, + "page": <int>, + "pages": <int>, + "per_page": <int>, + "urls": { + "last": <str>, + "next": <str> + } + }, + "releases": [ + { + "artist": <str>, + "id": <int>, + "main_release": <int>, + "resource_url": <str>, + "role": <str>, + "thumb": <str>, + "title": <str>, + "type": <str>, + "year": <int> + } + ] + } + """ - raise NotImplementedError + return self._get_json( + f"{self.API_URL}/artists/{artist_id}/releases", + params={ + "page": page, + "per_page": per_page, + "sort": sort, + "sort_order": sort_order + } + )
+ +
+[docs] def get_label(self, label_id: Union[int, str]) -> dict[str, Any]: - - raise NotImplementedError + + """ + `Database > Label <https://www.discogs.com/developers + /#page:database,header:database-label-get>`_: Get a label, + company, recording studio, locxation, or other entity involved + with artists and releases. + + Parameters + ---------- + label_id : `int` or `str` + The label ID. + + **Example**: :code:`1`. + + Returns + ------- + label : `dict` + Discogs database information for a single label. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "profile": <str>, + "releases_url": <str>, + "name": <str>, + "contact_info": <str>, + "uri": <str>, + "sublabels": [ + { + "resource_url": <str>, + "id": <int>, + "name": <str> + } + ], + "urls": [<str>], + "images": [ + { + "height": <int>, + "resource_url": <str>, + "type": <str>, + "uri": <str>, + "uri150": <str>, + "width": <int> + } + ], + "resource_url": <str>, + "id": <int>, + "data_quality": <str> + } + """ + + return self._get_json(f"{self.API_URL}/labels/{label_id}")
+ +
+[docs] def get_label_releases( self, label_id: Union[int, str], *, page: int = None, per_page: int = None) -> dict[str, Any]: + + """ + `Database > Label Releases <https://www.discogs.com/developers + /#page:database,header:database-all-label-releases-get>`_: Get a + list of releases associated with the label. + + Parameters + ---------- + label_id : `int` or `str` + The label ID. + + **Example**: :code:`1`. + + page : `int`, keyword-only, optional + Page of results to fetch. + + per_page : `int`, keyword-only, optional + Number of results per page. + + Returns + ------- + releases : `dict` + Discogs database information for all releases by the + specified label. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": <int>, + "page": <int>, + "pages": <int>, + "per_page": <int>, + "urls": { + "last": <str>, + "next": <str> + } + }, + "releases": [ + { + "artist": <str>, + "catno": <str>, + "format": <str>, + "id": <int>, + "resource_url": <str>, + "status": <str>, + "thumb": <str>, + "title": <str>, + "year": <int> + } + ] + } + """ - raise NotImplementedError + return self._get_json( + f"{self.API_URL}/labels/{label_id}/releases", + params={"page": page, "per_page": per_page} + )
+ +
+[docs] def search( - self, query: str, *, type: str = None, title: str = None, + self, query: str = None, *, type: str = None, title: str = None, release_title: str = None, credit: str = None, artist: str = None, anv: str = None, label: str = None, genre: str = None, style: str = None, country: str = None, year: str = None, format: str = None, catno: str = None, barcode: str = None, track: str = None, submitter: str = None, - contributor: str = None): + contributor: str = None) -> dict[str, Any]: + + """ + `Database > Search <https://www.discogs.com/developers + /#page:database,header:database-search-get>`_: Issue a search + query to the Discogs database. + + .. admonition:: Authentication + :class: warning + + Requires authentication with consumer credentials, with a + personal access token, or via the OAuth 1.0a flow. + + Parameters + ---------- + query : `str`, optional + The search query. + + **Example**: :code:`"Nirvana"`. + + type : `str`, keyword-only, optional + The type of item to search for. + + **Valid values**: :code:`"release"`, :code:`"master"`, + :code:`"artist"`, and :code:`"label"`. + + title : `str`, keyword-only, optional + Search by combined :code:`"<artist name> - <release title>"` + title field. + + **Example**: :code:`"Nirvana - Nevermind"`. + + release_title : `str`, keyword-only, optional + Search release titles. + + **Example**: :code:`"Nevermind"`. + + credit : `str`, keyword-only, optional + Search release credits. + + **Example**: :code:`"Kurt"`. + + artist : `str`, keyword-only, optional + Search artist names. + + **Example**: :code:`"Nirvana"`. + + anv : `str`, keyword-only, optional + Search artist name variations (ANV). + + **Example**: :code:`"Nirvana"`. + + label : `str`, keyword-only, optional + Search labels. + + **Example**: :code:`"DGC"`. + + genre : `str`, keyword-only, optional + Search genres. + + **Example**: :code:`"Rock"`. + + style : `str`, keyword-only, optional + Search styles. + + **Example**: :code:`"Grunge"`. + + country : `str`, keyword-only, optional + Search release country. + + **Example**: :code:`"Canada"`. + + year : `str`, keyword-only, optional + Search release year. + + **Example**: :code:`"1991"`. + + format : `str`, keyword-only, optional + Search formats. + + **Example**: :code:`"Album"`. + + catno : `str`, keyword-only, optional + Search catalog number. + + **Example**: :code:`"DGCD-24425"`. + + barcode : `str`, keyword-only, optional + Search barcode. + + **Example**: :code:`"720642442524"`. + + track : `str`, keyword-only, optional + Search track. + + **Example**: :code:`"Smells Like Teen Spirit"`. + + submitter : `str`, keyword-only, optional + Search submitter username. + + **Example**: :code:`"milKt"`. + + contributor : `str`, keyword-only, optional + Search contributor username. + + **Example**: :code:`"jerome99"`. + + Returns + ------- + results : `dict` + Search results. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": <int>, + "page": <int>, + "pages": <int>, + "per_page": <int>, + "urls": { + "last": <str>, + "next": <str> + } + }, + "results": [ + { + "style": [<str>], + "thumb": <str>, + "title": <str>, + "country": <str>, + "format": [<str>], + "uri": <str>, + "community": { + "want": <int>, + "have": <int> + }, + "label": [<str>], + "catno": <str>, + "year": <str>, + "genre": [<str>], + "resource_url": <str>, + "type": <str>, + "id": <int> + } + ] + } + """ + + self._check_authentication("search", False) - raise NotImplementedError + return self._get_json( + f"{self.API_URL}/database/search", + params={ + "q": query, + "type": type, + "title": title, + "release_title": release_title, + "credit": credit, + "artist": artist, + "anv": anv, + "label": label, + "genre": genre, + "style": style, + "country": country, + "year": year, + "format": format, + "catno": catno, + "barcode": barcode, + "track": track, + "submitter": submitter, + "contributor": contributor + } + )
+ ### MARKETPLACE ########################################################### @@ -1226,7 +2031,7 @@

Source code for minim.discogs

                .. code::
 
                   {
-                    "id": <int><int>,
+                    "id": <int>,
                     "username": <str>,
                     "resource_url": <str>,
                     "consumer_name": <str>
@@ -1280,7 +2085,7 @@ 

Source code for minim.discogs

                     "wantlist_url": <str>,
                     "rank": <int>,
                     "num_pending": <int>,
-                    "id": <int><int>,
+                    "id": <int>,
                     "num_for_sale": <int>,
                     "home_page": <str>,
                     "location": <str>,
@@ -1479,7 +2284,10 @@ 

Source code for minim.discogs

                       "page": <int>,
                       "pages": <int>,
                       "per_page": <int>,
-                      "urls": {}
+                      "urls": {
+                        "last": <str>,
+                        "next": <str>
+                      }
                     },
                     "submissions": {
                       "artists": [
@@ -1658,7 +2466,10 @@ 

Source code for minim.discogs

                       "page": <int>,
                       "pages": <int>,
                       "per_page": <int>,
-                      "urls": {}
+                      "urls": {
+                        "last": <str>,
+                        "next": <str>
+                      }
                     },
                     "contributions": [
                       {
@@ -1763,8 +2574,12 @@ 

Source code for minim.discogs

 
         return self._get_json(
             f"{self.API_URL}/users/{username}/contributions",
-            params={"page": page, "per_page": per_page, "sort": sort,
-                    "sort_order": sort_order}
+            params={
+                "page": page, 
+                "per_page": per_page, 
+                "sort": sort,
+                "sort_order": sort_order
+            }
         )
diff --git a/docs/_modules/minim/qobuz.html b/docs/_modules/minim/qobuz.html index e7fccd6..139bb7c 100644 --- a/docs/_modules/minim/qobuz.html +++ b/docs/_modules/minim/qobuz.html @@ -173,6 +173,7 @@
  • FLACAudio
  • MP3Audio
  • MP4Audio
  • +
  • OggAudio
  • WAVEAudio
  • @@ -258,9 +259,9 @@

    Source code for minim.qobuz

     
     import requests
     
    -from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, config
    +from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, _config
     if FOUND_PLAYWRIGHT:
    -    from . import sync_playwright
    +    from playwright.sync_api import sync_playwright
     
     __all__ = ["PrivateAPI"]
     
    @@ -455,12 +456,12 @@ 

    Source code for minim.qobuz

             if user_agent:
                 self.session.headers["User-Agent"] = user_agent
     
    -        if (auth_token is None and config.has_section(self._NAME)
    +        if (auth_token is None and _config.has_section(self._NAME)
                     and not overwrite):
    -            flow = config.get(self._NAME, "flow") or None
    -            auth_token = config.get(self._NAME, "auth_token")
    -            app_id = config.get(self._NAME, "app_id")
    -            app_secret = config.get(self._NAME, "app_secret")
    +            flow = _config.get(self._NAME, "flow") or None
    +            auth_token = _config.get(self._NAME, "auth_token")
    +            app_id = _config.get(self._NAME, "app_id")
    +            app_secret = _config.get(self._NAME, "app_secret")
     
             self.set_flow(flow, app_id=app_id, app_secret=app_secret, 
                           auth_token=auth_token, browser=browser, save=save)
    @@ -625,14 +626,14 @@ 

    Source code for minim.qobuz

                         auth_token = r["user_auth_token"]
     
                 if self._save:
    -                config[self._NAME] = {
    +                _config[self._NAME] = {
                         "flow": self._flow,
                         "auth_token": auth_token,
                         "app_id": self.session.headers["X-App-Id"],
                         "app_secret": self._app_secret
                     }
                     with open(DIR_HOME / "minim.cfg", "w") as f:
    -                    config.write(f)
    +                    _config.write(f)
     
             self.session.headers["X-User-Auth-Token"] = auth_token
     
    diff --git a/docs/_modules/minim/spotify.html b/docs/_modules/minim/spotify.html
    index c36540c..2d34e74 100644
    --- a/docs/_modules/minim/spotify.html
    +++ b/docs/_modules/minim/spotify.html
    @@ -269,11 +269,11 @@ 

    Source code for minim.spotify

     
     import requests
     
    -from . import FOUND_FLASK, FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, config
    +from . import FOUND_FLASK, FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, _config
     if FOUND_FLASK:
    -    from . import Flask, request
    +    from flask import Flask, request
     if FOUND_PLAYWRIGHT:
    -    from . import sync_playwright
    +    from playwright.sync_api import sync_playwright
     
     __all__ = ["PrivateLyricsService", "WebAPI"]
     
    @@ -406,10 +406,10 @@ 

    Source code for minim.spotify

             self.session = requests.Session()
             self.session.headers["App-Platform"] = "WebPlayer"
     
    -        if access_token is None and config.has_section(self._NAME):
    -            sp_dc = config.get(self._NAME, "sp_dc")
    -            access_token = config.get(self._NAME, "access_token")
    -            expiry = config.get(self._NAME, "expiry")
    +        if access_token is None and _config.has_section(self._NAME):
    +            sp_dc = _config.get(self._NAME, "sp_dc")
    +            access_token = _config.get(self._NAME, "access_token")
    +            expiry = _config.get(self._NAME, "expiry")
     
             self.set_sp_dc(sp_dc, save=save)
             self.set_access_token(access_token=access_token, expiry=expiry)
    @@ -539,13 +539,13 @@ 

    Source code for minim.spotify

                 )
     
                 if self._save:
    -                config[self._NAME] = {
    +                _config[self._NAME] = {
                         "sp_dc": self._sp_dc,
                         "access_token": access_token,
                         "expiry": expiry.strftime("%Y-%m-%dT%H:%M:%SZ")
                     }
                     with open(DIR_HOME / "minim.cfg", "w") as f:
    -                    config.write(f)
    +                    _config.write(f)
             
             self.session.headers["Authorization"] = f"Bearer {access_token}"
             self._expiry = (
    @@ -945,20 +945,20 @@ 

    Source code for minim.spotify

     
             self.session = requests.Session()
     
    -        if (access_token is None and config.has_section(self._NAME) 
    +        if (access_token is None and _config.has_section(self._NAME) 
                     and not overwrite):
    -            flow = config.get(self._NAME, "flow")
    -            access_token = config.get(self._NAME, "access_token")
    -            refresh_token = config.get(self._NAME, "refresh_token", 
    +            flow = _config.get(self._NAME, "flow")
    +            access_token = _config.get(self._NAME, "access_token")
    +            refresh_token = _config.get(self._NAME, "refresh_token", 
                                            fallback=None)
    -            expiry = config.get(self._NAME, "expiry", fallback=None)
    -            client_id = config.get(self._NAME, "client_id")
    -            client_secret = config.get(self._NAME, "client_secret", 
    +            expiry = _config.get(self._NAME, "expiry", fallback=None)
    +            client_id = _config.get(self._NAME, "client_id")
    +            client_secret = _config.get(self._NAME, "client_secret", 
                                            fallback=None)
    -            redirect_uri = config.get(self._NAME, "redirect_uri", 
    +            redirect_uri = _config.get(self._NAME, "redirect_uri", 
                                           fallback=None)
    -            scopes = config.get(self._NAME, "scopes")
    -            sp_dc = config.get(self._NAME, "sp_dc", fallback=None)
    +            scopes = _config.get(self._NAME, "scopes")
    +            sp_dc = _config.get(self._NAME, "sp_dc", fallback=None)
     
             self.set_flow(
                 flow, client_id=client_id, client_secret=client_secret, 
    @@ -1139,14 +1139,14 @@ 

    Source code for minim.spotify

                 self._scopes = r["scope"]
     
                 if self._save:
    -                config[self._NAME].update({
    +                _config[self._NAME].update({
                         "access_token": r["access_token"],
                         "refresh_token": self._refresh_token,
                         "expiry": self._expiry.strftime("%Y-%m-%dT%H:%M:%SZ"),
                         "scopes": self._scopes
                     })
                     with open(DIR_HOME / "minim.cfg", "w") as f:
    -                    config.write(f)
    +                    _config.write(f)
     
         def _request(
                 self, method: str, url: str, retry: bool = True, **kwargs
    @@ -1277,7 +1277,7 @@ 

    Source code for minim.spotify

                               + datetime.timedelta(0, r["expires_in"]))
     
                 if self._save:
    -                config[self._NAME] = {
    +                _config[self._NAME] = {
                         "flow": self._flow,
                         "client_id": self._client_id,
                         "access_token": access_token,
    @@ -1285,14 +1285,14 @@ 

    Source code for minim.spotify

                         "scopes": self._scopes
                     }
                     if refresh_token:
    -                    config[self._NAME]["refresh_token"] \
    +                    _config[self._NAME]["refresh_token"] \
                             = refresh_token
                     for attr in ("client_secret", "redirect_uri", "sp_dc"):
                         if hasattr(self, f"_{attr}"):
    -                        config[self._NAME][attr] \
    +                        _config[self._NAME][attr] \
                                 = getattr(self, f"_{attr}") or ""
                     with open(DIR_HOME / "minim.cfg", "w") as f:
    -                    config.write(f)
    +                    _config.write(f)
                     
             self.session.headers["Authorization"] = f"Bearer {access_token}"
             self._refresh_token = refresh_token
    diff --git a/docs/_modules/minim/tidal.html b/docs/_modules/minim/tidal.html
    index bdb14e9..923bc73 100644
    --- a/docs/_modules/minim/tidal.html
    +++ b/docs/_modules/minim/tidal.html
    @@ -173,6 +173,7 @@
     
  • FLACAudio
  • MP3Audio
  • MP4Audio
  • +
  • OggAudio
  • WAVEAudio
  • @@ -269,9 +270,9 @@

    Source code for minim.tidal

     from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
     import requests
     
    -from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, config
    +from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, _config
     if FOUND_PLAYWRIGHT:
    -    from . import sync_playwright
    +    from playwright.sync_api import sync_playwright
     
     __all__ = ["API", "PrivateAPI"]
     
    @@ -400,13 +401,13 @@ 

    Source code for minim.tidal

             self.session = requests.Session()
             self.session.headers["Content-Type"] = "application/vnd.tidal.v1+json"
     
    -        if (access_token is None and config.has_section(self._NAME) 
    +        if (access_token is None and _config.has_section(self._NAME) 
                     and not overwrite):
    -            flow = config.get(self._NAME, "flow")
    -            access_token = config.get(self._NAME, "access_token")
    -            expiry = config.get(self._NAME, "expiry")
    -            client_id = config.get(self._NAME, "client_id")
    -            client_secret = config.get(self._NAME, "client_secret")
    +            flow = _config.get(self._NAME, "flow")
    +            access_token = _config.get(self._NAME, "access_token")
    +            expiry = _config.get(self._NAME, "expiry")
    +            client_id = _config.get(self._NAME, "client_id")
    +            client_secret = _config.get(self._NAME, "client_secret")
     
             self.set_flow(flow, client_id=client_id, client_secret=client_secret,
                           save=save)
    @@ -509,7 +510,7 @@ 

    Source code for minim.tidal

                               + datetime.timedelta(0, r["expires_in"]))
                     
                 if self._save:
    -                config[self._NAME] = {
    +                _config[self._NAME] = {
                         "flow": self._flow,
                         "client_id": self._client_id,
                         "client_secret": self._client_secret,
    @@ -517,7 +518,7 @@ 

    Source code for minim.tidal

                         "expiry": expiry.strftime("%Y-%m-%dT%H:%M:%SZ")
                     }
                     with open(DIR_HOME / "minim.cfg", "w") as f:
    -                    config.write(f)
    +                    _config.write(f)
     
             self.session.headers["Authorization"] = f"Bearer {access_token}"
             self._expiry = (
    @@ -2316,15 +2317,15 @@ 

    Source code for minim.tidal

             if user_agent:
                 self.session.headers["User-Agent"] = user_agent
     
    -        if (access_token is None and config.has_section(self._NAME)
    +        if (access_token is None and _config.has_section(self._NAME)
                     and not overwrite):
    -            flow = config.get(self._NAME, "flow")
    -            access_token = config.get(self._NAME, "access_token")
    -            refresh_token = config.get(self._NAME, "refresh_token")
    -            expiry = config.get(self._NAME, "expiry")
    -            client_id = config.get(self._NAME, "client_id")
    -            client_secret = config.get(self._NAME, "client_secret")
    -            scopes = config.get(self._NAME, "scopes")
    +            flow = _config.get(self._NAME, "flow")
    +            access_token = _config.get(self._NAME, "access_token")
    +            refresh_token = _config.get(self._NAME, "refresh_token")
    +            expiry = _config.get(self._NAME, "expiry")
    +            client_id = _config.get(self._NAME, "client_id")
    +            client_secret = _config.get(self._NAME, "client_secret")
    +            scopes = _config.get(self._NAME, "scopes")
     
             self.set_flow(flow, client_id=client_id, client_secret=client_secret,
                           browser=browser, scopes=scopes, save=save)
    @@ -2525,13 +2526,13 @@ 

    Source code for minim.tidal

                 self._scopes = r["scope"]
                 
                 if self._save:
    -                config[self._NAME].update({
    +                _config[self._NAME].update({
                         "access_token": r["access_token"],
                         "expiry": self._expiry.strftime("%Y-%m-%dT%H:%M:%SZ"),
                         "scopes": self._scopes
                     })
                     with open(DIR_HOME / "minim.cfg", "w") as f:
    -                    config.write(f)
    +                    _config.write(f)
     
         def _request(
                 self, method: str, url: str, retry: bool = True, **kwargs
    @@ -2684,7 +2685,7 @@ 

    Source code for minim.tidal

                               + datetime.timedelta(0, r["expires_in"]))
                     
                     if self._save:
    -                    config[self._NAME] = {
    +                    _config[self._NAME] = {
                             "flow": self._flow,
                             "client_id": self._client_id,
                             "access_token": access_token,
    @@ -2693,10 +2694,10 @@ 

    Source code for minim.tidal

                             "scopes": self._scopes
                         }
                         if hasattr(self, "_client_secret"):
    -                        config[self._NAME]["client_secret"] \
    +                        _config[self._NAME]["client_secret"] \
                                 = self._client_secret
                         with open(DIR_HOME / "minim.cfg", "w") as f:
    -                        config.write(f)
    +                        _config.write(f)
                         
             self.session.headers["Authorization"] = f"Bearer {access_token}"
             self._refresh_token = refresh_token
    diff --git a/docs/_modules/minim/utility.html b/docs/_modules/minim/utility.html
    index cd569ff..d6f7a0f 100644
    --- a/docs/_modules/minim/utility.html
    +++ b/docs/_modules/minim/utility.html
    @@ -173,6 +173,7 @@
     
  • FLACAudio
  • MP3Audio
  • MP4Audio
  • +
  • OggAudio
  • WAVEAudio
  • @@ -262,7 +263,7 @@

    Source code for minim.utility

     except ModuleNotFoundError:
         FOUND_NUMPY = False
     
    -__all__ = ["format_multivalue", "gestalt_ratios", "levenshtein_ratios"]
    +__all__ = ["format_multivalue", "gestalt_ratio", "levenshtein_ratio"]
     
     
    [docs] diff --git a/docs/_sources/api/minim.discogs.API.rst.txt b/docs/_sources/api/minim.discogs.API.rst.txt index 98a28e6..aa3309f 100644 --- a/docs/_sources/api/minim.discogs.API.rst.txt +++ b/docs/_sources/api/minim.discogs.API.rst.txt @@ -16,10 +16,11 @@ .. autosummary:: :nosignatures: - ~API.delete_release_user_rating + ~API.delete_user_release_rating ~API.edit_profile ~API.get_artist ~API.get_artist_releases + ~API.get_community_release_rating ~API.get_identity ~API.get_label ~API.get_label_releases @@ -27,14 +28,13 @@ ~API.get_master_release_versions ~API.get_profile ~API.get_release - ~API.get_release_community_rating ~API.get_release_stats - ~API.get_release_user_rating ~API.get_user_contributions + ~API.get_user_release_rating ~API.get_user_submissions ~API.search ~API.set_access_token ~API.set_flow - ~API.update_release_user_rating + ~API.update_user_release_rating \ No newline at end of file diff --git a/docs/api/minim.discogs.API.html b/docs/api/minim.discogs.API.html index c286073..4091b4a 100644 --- a/docs/api/minim.discogs.API.html +++ b/docs/api/minim.discogs.API.html @@ -383,56 +383,56 @@

    API#

    - - + + - - + + - - + + - + + + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - + - - - - - + + @@ -440,7 +440,7 @@

    API#

    - + @@ -481,7 +481,49 @@

    API#

    -
    consumer_keystr, keyword-only, optional
    +
    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.

    +
    +
    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.

    +
    +
    savebool, keyword-only, default: True

    Determines whether newly obtained access tokens and their +associated properties are stored to the Minim configuration +file.

    +
    @@ -649,8 +691,8 @@

    API#

    -
    -get_release_user_rating(release_id: int | str, username: str = None) dict[str, Any][source]#
    +
    +get_user_release_rating(release_id: int | str, username: str = None) dict[str, Any][source]#

    Database > Release Rating By User > Get Release Rating By User: Retrieves the release’s rating for a given user.

    @@ -686,8 +728,8 @@

    API#

    -
    -update_release_user_rating(release_id: int | str, rating: int, username: str = None) dict[str, Any][source]#
    +
    +update_user_release_rating(release_id: int | str, rating: int, username: str = None) dict[str, Any][source]#

    Database > Release Rating By User > Update Release Rating By User: Updates the release’s rating for a given user.

    @@ -730,6 +772,641 @@

    API#

    +
    +
    +delete_user_release_rating(release_id: int | str, username: str = None) None[source]#
    +

    Database > Release Rating By User > Delete Release Rating By +User: +Deletes the release’s rating for a given user.

    +
    +

    User authentication

    +

    Requires user authentication with a personal access token or +via the OAuth 1.0a flow.

    +
    +
    +
    Parameters:
    +
    +
    release_idint or str

    The release ID.

    +

    Example: 249504.

    +
    +
    usernamestr, optional

    The username of the user whose rating you are requesting. If +not specified, the username of the authenticated user is +used.

    +

    Example: "memory".

    +
    +
    +
    +
    +
    + +
    +
    +get_community_release_rating(release_id: int | str) dict[str, Any][source]#
    +

    Database > Community Release Rating: Retrieves the +community release rating average and count.

    +
    +
    Parameters:
    +
    +
    release_idint or str

    The release ID.

    +

    Example: 249504.

    +
    +
    +
    +
    Returns:
    +
    +
    ratingdict

    Community release rating average and count.

    + +
    +
    +
    +
    +
    + +
    +
    +get_release_stats(release_id: int | str) dict[str, Any][source]#
    +

    Database > Release Stats: Retrieves +the release’s “have” and “want” counts.

    +
    +

    Attention

    +

    This endpoint does not appear to be working correctly. +Currently, the response will be of the form

    +
    {
    +  "is_offense": <bool>
    +}
    +
    +
    +
    +
    +
    Parameters:
    +
    +
    release_idint or str

    The release ID.

    +

    Example: 249504.

    +
    +
    +
    +
    Returns:
    +
    +
    statsdict

    Release “have” and “want” counts.

    + +
    +
    +
    +
    +
    + +
    +
    +get_master_release(master_id: int | str) dict[str, Any][source]#
    +

    Database > Master Release: Get a +master release.

    +
    +
    Parameters:
    +
    +
    master_idint or str

    The master release ID.

    +

    Example: 1000.

    +
    +
    +
    +
    Returns:
    +
    +
    master_releasedict

    Discogs database information for a single master release.

    + +
    +
    +
    +
    +
    + +
    +
    +get_master_release_versions(master_id: int | str, *, country: str = None, format: str = None, label: str = None, released: str = None, page: int = None, per_page: int = None, sort: str = None, sort_order: str = None) dict[str, Any][source]#
    +

    Database > Master Release Versions: Retrieves a list of +all releases that are versions of this master.

    +
    +
    Parameters:
    +
    +
    master_idint or str

    The master release ID.

    +

    Example: 1000.

    +
    +
    countrystr, keyword-only, optional

    The country to filter for.

    +

    Example: "Belgium".

    +
    +
    formatstr, keyword-only, optional

    The format to filter for.

    +

    Example: "Vinyl".

    +
    +
    labelstr, keyword-only, optional

    The label to filter for.

    +

    Example: "Scorpio Music".

    +
    +
    releasedstr, keyword-only, optional

    The release year to filter for.

    +

    Example: "1992".

    +
    +
    pageint, keyword-only, optional

    The page you want to request.

    +

    Example: 3.

    +
    +
    per_pageint, keyword-only, optional

    The number of items per page.

    +

    Example: 25.

    +
    +
    sortstr, keyword-only, optional

    Sort items by this field.

    +

    Valid values: "released", "title", +"format", "label", "catno", +and "country".

    +
    +
    sort_orderstr, keyword-only, optional

    Sort items in a particular order.

    +

    Valid values: "asc" and "desc".

    +
    +
    +
    +
    Returns:
    +
    +
    versionsdict

    Discogs database information for all releases that are +versions of the specified master.

    + +
    +
    +
    +
    +
    + +
    +
    +get_artist(artist_id: int | str) dict[str, Any][source]#
    +

    Database > Artist: Get an artist.

    +
    +
    Parameters:
    +
    +
    artist_idint or str

    The artist ID.

    +

    Example: 108713.

    +
    +
    +
    +
    Returns:
    +
    +
    artistdict

    Discogs database information for a single artist.

    + +
    +
    +
    +
    +
    + +
    +
    +get_artist_releases(artist_id: int | str, *, page: int = None, per_page: int = None, sort: str = None, sort_order: str = None) dict[str, Any][source]#
    +

    Database > Artist Releases: Get an +artist’s releases and masters.

    +
    +
    Parameters:
    +
    +
    artist_idint or str

    The artist ID.

    +

    Example: 108713.

    +
    +
    pageint, keyword-only, optional

    Page of results to fetch.

    +
    +
    per_pageint, keyword-only, optional

    Number of results per page.

    +
    +
    sortstr, keyword-only, optional

    Sort results by this field.

    +

    Valid values: "year", "title", and +"format".

    +
    +
    sort_orderstr, keyword-only, optional

    Sort results in a particular order.

    +

    Valid values: "asc" and "desc".

    +
    +
    +
    +
    Returns:
    +
    +
    releasesdict

    Discogs database information for all releases by the +specified artist.

    + +
    +
    +
    +
    +
    + +
    +
    +get_label(label_id: int | str) dict[str, Any][source]#
    +

    Database > Label: Get a label, +company, recording studio, locxation, or other entity involved +with artists and releases.

    +
    +
    Parameters:
    +
    +
    label_idint or str

    The label ID.

    +

    Example: 1.

    +
    +
    +
    +
    Returns:
    +
    +
    labeldict

    Discogs database information for a single label.

    + +
    +
    +
    +
    +
    + +
    +
    +get_label_releases(label_id: int | str, *, page: int = None, per_page: int = None) dict[str, Any][source]#
    +

    Database > Label Releases: Get a +list of releases associated with the label.

    +
    +
    Parameters:
    +
    +
    label_idint or str

    The label ID.

    +

    Example: 1.

    +
    +
    pageint, keyword-only, optional

    Page of results to fetch.

    +
    +
    per_pageint, keyword-only, optional

    Number of results per page.

    +
    +
    +
    +
    Returns:
    +
    +
    releasesdict

    Discogs database information for all releases by the +specified label.

    + +
    +
    +
    +
    +
    + +
    +
    +search(query: str = None, *, type: str = None, title: str = None, release_title: str = None, credit: str = None, artist: str = None, anv: str = None, label: str = None, genre: str = None, style: str = None, country: str = None, year: str = None, format: str = None, catno: str = None, barcode: str = None, track: str = None, submitter: str = None, contributor: str = None) dict[str, Any][source]#
    +

    Database > Search: Issue a search +query to the Discogs database.

    +
    +

    Authentication

    +
    +

    Requires authentication with consumer credentials, with a +personal access token, or via the OAuth 1.0a flow.

    +
    +
    +
    +
    Parameters:
    +
    +
    querystr, optional

    The search query.

    +

    Example: "Nirvana".

    +
    +
    typestr, keyword-only, optional

    The type of item to search for.

    +

    Valid values: "release", "master", +"artist", and "label".

    +
    +
    titlestr, keyword-only, optional

    Search by combined "<artist name> - <release title>" +title field.

    +

    Example: "Nirvana - Nevermind".

    +
    +
    release_titlestr, keyword-only, optional

    Search release titles.

    +

    Example: "Nevermind".

    +
    +
    creditstr, keyword-only, optional

    Search release credits.

    +

    Example: "Kurt".

    +
    +
    artiststr, keyword-only, optional

    Search artist names.

    +

    Example: "Nirvana".

    +
    +
    anvstr, keyword-only, optional

    Search artist name variations (ANV).

    +

    Example: "Nirvana".

    +
    +
    labelstr, keyword-only, optional

    Search labels.

    +

    Example: "DGC".

    +
    +
    genrestr, keyword-only, optional

    Search genres.

    +

    Example: "Rock".

    +
    +
    stylestr, keyword-only, optional

    Search styles.

    +

    Example: "Grunge".

    +
    +
    countrystr, keyword-only, optional

    Search release country.

    +

    Example: "Canada".

    +
    +
    yearstr, keyword-only, optional

    Search release year.

    +

    Example: "1991".

    +
    +
    formatstr, keyword-only, optional

    Search formats.

    +

    Example: "Album".

    +
    +
    catnostr, keyword-only, optional

    Search catalog number.

    +

    Example: "DGCD-24425".

    +
    +
    barcodestr, keyword-only, optional

    Search barcode.

    +

    Example: "720642442524".

    +
    +
    trackstr, keyword-only, optional

    Search track.

    +

    Example: "Smells Like Teen Spirit".

    +
    +
    submitterstr, keyword-only, optional

    Search submitter username.

    +

    Example: "milKt".

    +
    +
    contributorstr, keyword-only, optional

    Search contributor username.

    +

    Example: "jerome99".

    +
    +
    +
    +
    Returns:
    +
    +
    resultsdict

    Search results.

    + +
    +
    +
    +
    +
    +
    get_identity() dict[str, Any][source]#
    @@ -752,7 +1429,7 @@

    API#

    +

    delete_release_user_rating

    delete_user_release_rating

    Database > Release Rating By User > Delete Release Rating By User: Deletes the release's rating for a given user.

    edit_profile

    User Identity > Profile > Edit Profile: Edit a user's profile data.

    get_artist

    get_artist

    Database > Artist: Get an artist.

    get_artist_releases

    get_artist_releases

    Database > Artist Releases: Get an artist's releases and masters.

    get_identity

    get_community_release_rating

    Database > Community Release Rating: Retrieves the community release rating average and count.

    get_identity

    User Identity > Identity: Retrieve basic information about the authenticated user.

    get_label

    get_label

    Database > Label: Get a label, company, recording studio, locxation, or other entity involved with artists and releases.

    get_label_releases

    get_label_releases

    Database > Label Releases: Get a list of releases associated with the label.

    get_master_release

    get_master_release

    Database > Master Release: Get a master release.

    get_master_release_versions

    get_master_release_versions

    Database > Master Release Versions: Retrieves a list of all releases that are versions of this master.

    get_profile

    get_profile

    User Identity > Profile > Get Profile: Retrieve a user by username.

    get_release

    get_release

    Database > Release: Get a release (physical or digital object released by one or more artists).

    get_release_community_rating

    get_release_stats

    Database > Release Stats: Retrieves the release's "have" and "want" counts.

    get_release_stats

    get_user_contributions

    User Identity > User Contributions: Retrieve a user's contributions (releases, labels, artists) by username.

    get_release_user_rating

    get_user_release_rating

    Database > Release Rating By User > Get Release Rating By User: Retrieves the release's rating for a given user.

    get_user_contributions

    User Identity > User Contributions: Retrieve a user's contributions (releases, labels, artists) by username.

    get_user_submissions

    User Identity > User Submissions: Retrieve a user's submissions (edits made to releases, labels, and artists) by username.

    search

    search

    Database > Search: Issue a search query to the Discogs database.

    set_access_token

    Set the Discogs API personal or OAuth access token (and secret).

    set_flow

    Set the authorization flow.

    update_release_user_rating

    update_user_release_rating

    Database > Release Rating By User > Update Release Rating By User: Updates the release's rating for a given user.

    @@ -444,9 +446,11 @@

    G

  • (minim.tidal.API method)
  • -
  • get_artist() (minim.qobuz.PrivateAPI method) +
  • get_artist() (minim.discogs.API method)
  • +
  • get_community_release_rating() (minim.discogs.API method) +
  • get_country_code() (minim.tidal.PrivateAPI method)
  • get_curated_tracks() (minim.qobuz.PrivateAPI method) @@ -554,11 +562,21 @@

    G

  • get_image() (minim.tidal.PrivateAPI method)
  • -
  • get_label() (minim.qobuz.PrivateAPI method) +
  • get_label() (minim.discogs.API method) + +
  • +
  • get_label_releases() (minim.discogs.API method)
  • get_lyrics() (minim.spotify.PrivateLyricsService method)
  • get_markets() (minim.spotify.WebAPI method) +
  • +
  • get_master_release() (minim.discogs.API method) +
  • +
  • get_master_release_versions() (minim.discogs.API method)
  • get_mix_items() (minim.tidal.PrivateAPI method)
  • @@ -566,6 +584,8 @@

    G

  • get_new_albums() (minim.spotify.WebAPI method)
  • + + - - +
  • get_user_release_rating() (minim.discogs.API method) +
  • get_user_submissions() (minim.discogs.API method)
  • get_video() (minim.tidal.API method) @@ -925,9 +945,11 @@

    S

  • save_tracks() (minim.spotify.WebAPI method)
  • -
  • search() (minim.itunes.SearchAPI method) +
  • search() (minim.discogs.API method) diff --git a/docs/objects.inv b/docs/objects.inv index 849ad10..72f4a27 100644 Binary files a/docs/objects.inv and b/docs/objects.inv differ diff --git a/docs/searchindex.js b/docs/searchindex.js index c0dc2f3..dec16d1 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["api", "api/minim", "api/minim.audio", "api/minim.audio.Audio", "api/minim.audio.FLACAudio", "api/minim.audio.MP3Audio", "api/minim.audio.MP4Audio", "api/minim.audio.OggAudio", "api/minim.audio.WAVEAudio", "api/minim.discogs", "api/minim.discogs.API", "api/minim.itunes", "api/minim.itunes.SearchAPI", "api/minim.qobuz", "api/minim.qobuz.PrivateAPI", "api/minim.spotify", "api/minim.spotify.PrivateLyricsService", "api/minim.spotify.WebAPI", "api/minim.tidal", "api/minim.tidal.API", "api/minim.tidal.PrivateAPI", "api/minim.utility", "api/minim.utility.format_multivalue", "api/minim.utility.gestalt_ratio", "api/minim.utility.levenshtein_ratio", "index", "notebooks/getting_started", "notebooks/user_guide/editing_audio_metadata", "notebooks/user_guide/getting_recommendations", "notebooks/user_guide/transferring_music_libraries", "user_guide"], "filenames": ["api.rst", "api/minim.rst", "api/minim.audio.rst", "api/minim.audio.Audio.rst", "api/minim.audio.FLACAudio.rst", "api/minim.audio.MP3Audio.rst", "api/minim.audio.MP4Audio.rst", "api/minim.audio.OggAudio.rst", "api/minim.audio.WAVEAudio.rst", "api/minim.discogs.rst", "api/minim.discogs.API.rst", "api/minim.itunes.rst", "api/minim.itunes.SearchAPI.rst", "api/minim.qobuz.rst", "api/minim.qobuz.PrivateAPI.rst", "api/minim.spotify.rst", "api/minim.spotify.PrivateLyricsService.rst", "api/minim.spotify.WebAPI.rst", "api/minim.tidal.rst", "api/minim.tidal.API.rst", "api/minim.tidal.PrivateAPI.rst", "api/minim.utility.rst", "api/minim.utility.format_multivalue.rst", "api/minim.utility.gestalt_ratio.rst", "api/minim.utility.levenshtein_ratio.rst", "index.rst", "notebooks/getting_started.ipynb", "notebooks/user_guide/editing_audio_metadata.ipynb", "notebooks/user_guide/getting_recommendations.ipynb", "notebooks/user_guide/transferring_music_libraries.ipynb", "user_guide.rst"], "titles": ["<no title>", "minim", "audio", "Audio", "FLACAudio", "MP3Audio", "MP4Audio", "OggAudio", "WAVEAudio", "discogs", "API", "itunes", "SearchAPI", "qobuz", "PrivateAPI", "spotify", "PrivateLyricsService", "WebAPI", "tidal", "API", "PrivateAPI", "utility", "format_multivalue", "gestalt_ratio", "levenshtein_ratio", "Minim", "Getting Started", "Editing Audio Metadata", "Getting Recommendations", "Transferring Music Libraries", "User Guide"], "terms": {"thi": [2, 3, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 26, 27, 28, 29], "modul": [2, 3, 11, 13, 15, 18, 21, 26], "provid": [2, 3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22, 26, 27, 29], "conveni": [2, 14, 20, 27], "python": [2, 25, 26], "keep": [2, 17], "track": [2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 27, 28, 29], "handl": [2, 29], "metadata": [2, 3, 4, 5, 6, 7, 8, 17, 19, 20, 25, 26, 29, 30], "convert": [2, 3, 4, 5, 6, 7, 8, 25], "between": [2, 3, 4, 5, 6, 7, 8, 10, 12, 17, 25, 29], "differ": [2, 17, 26], "format": [2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 25, 27], "class": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 27, 28, 29], "minim": [3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 19, 20, 22, 23, 24, 27, 28, 29], "arg": [3, 4, 5, 6, 7, 8], "kwarg": [3, 4, 5, 6, 7, 8, 17], "sourc": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 29], "base": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 28], "object": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27, 28], "gener": [3, 17, 27, 28, 29], "file": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 25, 28], "handler": [3, 4, 5, 6, 7, 8, 27], "subclass": 3, "specif": [3, 17, 26, 27], "contain": [3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 26, 27], "includ": [3, 10, 12, 17, 20, 27], "flacaudio": [3, 5, 6, 7, 8, 26, 27], "encod": [3, 12, 17, 20, 26], "us": [3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 19, 20, 22, 26, 27, 28, 29], "free": [3, 29], "lossless": [3, 4, 5, 6, 7, 8, 14, 20, 26], "codec": [3, 4, 5, 6, 7, 8, 20, 26, 27], "flac": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "mp3audio": [3, 26, 27], "store": [3, 10, 12, 14, 16, 17, 19, 20, 26, 27, 28, 29], "mpeg": 3, "layer": 3, "iii": [3, 20], "mp3": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "mp4audio": [3, 4, 5, 7, 8, 26], "advanc": 3, "code": [3, 4, 5, 6, 7, 8, 12, 14, 17, 19, 20, 26], "aac": [3, 4, 5, 6, 7, 8, 20, 26], "appl": [3, 12, 26, 27], "alac": [3, 4, 5, 6, 7, 8, 20, 26], "4": [3, 17, 26], "part": 3, "14": [3, 26], "mp4": [3, 4, 5, 6, 7, 8, 20, 26], "m4a": [3, 4, 5, 6, 7, 8, 26], "oggaudio": [3, 26], "opu": [3, 4, 5, 6, 7, 8, 26], "vorbi": [3, 4, 5, 6, 7, 8, 26], "an": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 28], "ogg": [3, 4, 5, 6, 7, 8], "waveaudio": [3, 26], "linear": 3, "puls": 3, "lpcm": [3, 4, 5, 6, 7, 8, 26], "waveform": 3, "wave": [3, 4, 5, 6, 7, 8, 26], "can": [3, 10, 14, 16, 17, 19, 20, 25, 26, 27, 28, 29], "instanti": [3, 10, 14, 16, 17, 19, 20, 26, 28, 29], "from": [3, 4, 5, 6, 7, 8, 12, 14, 16, 17, 19, 20, 26, 27, 28], "list": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 23, 24, 28], "abov": [3, 17, 26, 27, 28, 29], "examin": 3, "its": [3, 12, 14, 16, 17, 19, 20, 26, 27, 29], "extens": [3, 4, 5, 6, 7, 8, 20], "howev": [3, 10, 27, 29], "mai": [3, 17, 20, 29], "instanc": 3, "when": [3, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 29], "detect": [3, 14, 26], "fail": [3, 20], "especi": [3, 29], "combin": [3, 14, 17], "i": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29], "rare": 3, "seen": 3, "As": [3, 14, 16, 20, 26, 27], "alwai": [3, 27], "best": [3, 4, 5, 6, 7, 8, 14, 29], "directli": [3, 20, 27, 29], "one": [3, 10, 16, 17, 19, 20, 26, 27], "creat": [3, 10, 12, 14, 17, 20, 27, 28, 29], "your": [3, 12, 16, 17, 20, 26, 27, 28], "ar": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 28, 29], "known": [3, 26, 27], "paramet": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24], "str": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27], "pattern": [3, 4, 5, 6, 7, 8, 27], "tupl": [3, 4, 5, 6, 7, 8, 14, 20, 22], "keyword": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 28], "onli": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 28, 29], "option": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26], "regular": [3, 4, 5, 6, 7, 8, 27], "express": [3, 4, 5, 6, 7, 8, 27], "search": [3, 4, 5, 6, 7, 8, 11, 12, 14, 17, 19, 20, 27, 29], "correspond": [3, 4, 5, 6, 7, 8, 17, 27, 29], "field": [3, 4, 5, 6, 7, 8, 10, 17, 22, 27], "": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 29], "valid": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20], "valu": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 27], "The": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27, 28, 29], "support": [3, 4, 5, 6, 7, 8, 12, 17, 20, 22, 26, 29], "artist": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 27, 28, 29], "titl": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 29], "track_numb": [3, 4, 5, 6, 7, 8, 14, 17, 26], "number": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 27, 28, 29], "exampl": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 27, 28, 29], "match": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 27, 29], "filenam": [3, 4, 5, 6, 7, 8, 20, 26, 27], "like": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 29], "taylor": [3, 4, 5, 6, 7, 8], "swift": [3, 4, 5, 6, 7, 8], "cruel": 3, "summer": 3, "d": [3, 4, 5, 6, 7, 8], "04": [3, 5, 6, 26], "man": 3, "13": [3, 12, 19], "you": [3, 4, 5, 8, 10, 12, 14, 16, 17, 20, 26, 27, 28], "need": [3, 17, 26, 27], "calm": 3, "down": [3, 17, 26], "multivalu": [3, 4, 5, 6, 7, 8, 22], "bool": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22], "determin": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22, 27], "whether": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22], "tag": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 22, 26], "If": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27, 28], "fals": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 26, 27, 28], "item": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 26, 27, 28, 29], "concaten": [3, 4, 5, 6, 7, 8, 22], "separ": [3, 4, 5, 6, 7, 8, 17, 22, 27], "specifi": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 28], "sep": [3, 4, 5, 6, 7, 8, 22], "default": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27], "all": [3, 4, 5, 6, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 26, 27, 29], "first": [3, 4, 5, 6, 7, 8, 12, 14, 17, 20, 22, 26, 27, 28, 29], "n": [3, 4, 5, 6, 7, 8, 26], "1": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 28, 29], "second": [3, 4, 5, 6, 7, 8, 20, 22, 27], "append": [3, 4, 5, 6, 7, 8, 17, 22, 29], "final": [3, 4, 5, 6, 7, 8, 22, 27, 28, 29], "attribut": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 28], "album": [3, 4, 5, 6, 7, 8, 12, 14, 17, 19, 20, 26, 27, 28, 29], "album_artist": 3, "artwork": [3, 4, 5, 6, 7, 8, 27], "byte": [3, 14, 17, 20, 27], "represent": 3, "url": [3, 10, 12, 14, 16, 17, 19, 20, 26], "lead": 3, "cover": [3, 4, 5, 6, 7, 8, 17, 20, 26, 27, 28], "bit_depth": [3, 14, 26], "int": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20], "bit": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "per": [3, 10], "sampl": [3, 26, 27, 29], "bitrat": [3, 14, 26, 27], "b": [3, 4, 5, 6, 7, 8, 26], "channel_count": 3, "channel": [3, 27], "comment": [3, 4, 5, 6, 7, 8, 27], "compil": [3, 4, 5, 6, 7, 8, 17, 20, 27], "song": [3, 12, 14, 17, 26], "variou": [3, 29], "compos": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "lyric": [3, 4, 5, 6, 7, 8, 15, 16, 20, 27], "writer": [3, 14], "copyright": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 26, 27], "inform": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 28, 29], "date": [3, 14, 17, 20, 27], "releas": [3, 10, 14, 17, 26], "disc_numb": [3, 17, 26], "disc": [3, 4, 5, 6, 7, 8, 27], "disc_count": 3, "total": [3, 14, 17, 19, 20, 26, 29], "genr": [3, 10, 14, 17, 26, 27, 28], "isrc": [3, 14, 17, 19, 20, 26, 27, 29], "intern": 3, "standard": 3, "record": [3, 12, 14, 26], "sample_r": 3, "rate": [3, 10, 27], "hz": [3, 26], "tempo": [3, 4, 5, 6, 7, 8, 17, 27], "beat": [3, 17], "minut": 3, "bpm": [3, 26], "track_count": [3, 14], "method": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27], "none": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27], "preserv": [3, 4, 5, 6, 7, 8], "true": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 29], "current": [3, 4, 5, 6, 7, 8, 14, 17, 20, 26, 29], "anoth": [3, 4, 5, 6, 7, 8, 10, 27, 28], "requir": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26], "ffmpeg": [3, 4, 5, 6, 7, 8, 26], "automat": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27], "updat": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 25, 26, 27, 28, 29], "reflect": [3, 4, 5, 6, 7, 8], "new": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 28, 29], "For": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 29], "chang": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27], "mp4a": [3, 4, 5, 6, 7, 8], "lossi": [3, 4, 5, 6, 7, 8], "wav": [3, 4, 5, 6, 7, 8, 26], "which": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 28], "command": [3, 4, 5, 6, 7, 8, 26], "line": [3, 4, 5, 6, 7, 8, 16, 28], "exclud": [3, 4, 5, 6, 7, 8, 17], "input": [3, 4, 5, 6, 7, 8], "output": [3, 4, 5, 6, 7, 8, 28], "y": [3, 4, 5, 6, 7, 8, 16, 17, 19, 20], "flag": [3, 4, 5, 6, 7, 8, 12], "overwrit": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 27], "c": [3, 4, 5, 6, 7, 8, 26], "v": [3, 4, 5, 6, 7, 8], "copi": [3, 4, 5, 6, 7, 8, 20, 26], "argument": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 28], "art": [3, 4, 5, 6, 7, 8, 20, 27, 28], "256k": [3, 4, 5, 6, 7, 8], "libfdk_aac": [3, 4, 5, 6, 7, 8], "wa": [3, 4, 5, 6, 7, 8, 17, 20], "enabl": [3, 4, 5, 6, 7, 8, 10, 14, 17], "libfdk": [3, 4, 5, 6, 7, 8], "libmp3lam": [3, 4, 5, 6, 7, 8], "q": [3, 4, 5, 6, 7, 8, 17], "0": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 26, 27, 28, 29], "libopu": [3, 4, 5, 6, 7, 8], "vn": [3, 4, 5, 6, 7, 8, 26], "strict": [3, 4, 5, 6, 7, 8, 14, 26], "experiment": [3, 4, 5, 6, 7, 8], "libvorbi": [3, 4, 5, 6, 7, 8], "pcm_s16le": [3, 4, 5, 6, 7, 8], "pcm_s24le": [3, 4, 5, 6, 7, 8], "depth": [3, 4, 5, 6, 7, 8, 14, 26, 27], "origin": [3, 4, 5, 6, 7, 8, 17, 27], "appropri": [3, 4, 5, 6, 7, 8, 28], "kept": [3, 4, 5, 6, 7, 8, 17], "set_metadata_using_itun": [3, 4, 5, 6, 7, 8, 27], "data": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26, 27, 28, 29], "dict": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 27], "ani": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22], "album_data": [3, 4, 5, 6, 7, 8, 27], "artwork_s": [3, 4, 5, 6, 7, 8], "1400": [3, 4, 5, 6, 7, 8], "artwork_format": [3, 4, 5, 6, 7, 8], "jpg": [3, 4, 5, 6, 7, 8, 20, 26, 28], "popul": [3, 4, 5, 6, 7, 8, 27], "retriev": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26, 27], "itun": [3, 4, 5, 6, 7, 8, 12, 25, 27], "api": [3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 17, 18, 20, 25, 28, 29], "about": [3, 4, 5, 6, 7, 8, 10, 14, 17, 20, 26, 27, 28, 29], "json": [3, 4, 5, 6, 7, 8, 10, 12, 17, 27], "obtain": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26], "via": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26, 27], "searchapi": [3, 4, 5, 6, 7, 8, 27], "lookup": [3, 4, 5, 6, 7, 8, 12, 27, 29], "unavail": [3, 4, 5, 6, 7, 8, 17, 26], "resiz": [3, 4, 5, 6, 7, 8], "size": [3, 4, 5, 6, 7, 8, 17, 19, 20, 26, 27], "pixel": [3, 4, 5, 6, 7, 8, 20], "raw": [3, 4, 5, 6, 7, 8], "uncompress": [3, 4, 5, 6, 7, 8], "high": [3, 4, 5, 6, 7, 8, 14, 20], "resolut": [3, 4, 5, 6, 7, 8, 14, 20], "imag": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26], "regardless": [3, 4, 5, 6, 7, 8], "png": [3, 4, 5, 6, 7, 8], "take": [3, 4, 5, 6, 7, 8, 10, 17, 27], "preced": [3, 4, 5, 6, 7, 8], "exist": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20], "should": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22], "overwritten": [3, 4, 5, 6, 7, 8], "set_metadata_using_spotifi": [3, 4, 5, 6, 7, 8, 27], "audio_featur": [3, 4, 5, 6, 7, 8, 17, 27], "spotifi": [3, 4, 5, 6, 7, 8, 16, 17, 20, 25, 27], "web": [3, 4, 5, 6, 7, 8, 10, 14, 15, 16, 17, 20, 27, 28, 29], "servic": [3, 4, 5, 6, 7, 8, 15, 16, 17, 20, 25, 27, 29], "webapi": [3, 4, 5, 6, 7, 8, 27, 28, 29], "get_track": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20], "featur": [3, 4, 5, 6, 7, 8, 14, 17, 27, 29], "get_track_audio_featur": [3, 4, 5, 6, 7, 8, 17, 27], "time": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27], "sync": [3, 4, 5, 6, 7, 8, 16, 20], "privatelyricsservic": [3, 4, 5, 6, 7, 8], "get_lyr": [3, 4, 5, 6, 7, 8, 16], "set_metadata_using_tid": [3, 4, 5, 6, 7, 8, 27], "1280": [3, 4, 5, 6, 7, 8], "tidal": [3, 4, 5, 6, 7, 8, 14, 19, 20, 25, 27], "privateapi": [3, 4, 5, 6, 7, 8, 27, 29], "get_album": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20], "maximum": [3, 4, 5, 6, 7, 8, 14, 17, 20], "80": [3, 4, 5, 6, 7, 8], "get_track_compos": [3, 4, 5, 6, 7, 8, 20, 27], "get_track_contributor": [3, 4, 5, 6, 7, 8, 20], "get_track_credit": [3, 4, 5, 6, 7, 8, 20], "songwrit": [3, 4, 5, 6, 7, 8, 20, 26, 27], "credit": [3, 4, 5, 6, 7, 8, 14, 20, 27], "get_track_lyr": [3, 4, 5, 6, 7, 8, 20, 27], "descript": [3, 4, 5, 6, 7, 8, 10, 14, 17, 20, 26, 29], "set_metadata_using_qobuz": [3, 4, 5, 6, 7, 8], "larg": [3, 4, 5, 6, 7, 8, 14, 17, 20, 26], "qobuz": [3, 4, 5, 6, 7, 8, 14, 25], "small": [3, 4, 5, 6, 7, 8, 14, 17, 20, 26], "thumbnail": [3, 4, 5, 6, 7, 8, 14, 26], "audio": [4, 5, 6, 7, 8, 12, 14, 17, 20, 25, 30], "_vorbiscom": [4, 7], "full": [4, 5, 6, 7, 8, 10, 14, 17, 20], "see": [4, 5, 6, 7, 8, 10, 12, 17, 19, 20, 27, 28, 29], "pathlib": [4, 5, 6, 7, 8, 20, 26, 27], "path": [4, 5, 6, 7, 8, 14, 20, 26, 27], "fearless": 4, "03": [4, 7, 27], "love": 4, "stori": [4, 6, 14, 28], "06": [4, 5, 7, 8, 26, 27], "belong": 4, "me": [4, 8, 26], "write_metadata": [4, 5, 6, 7, 8, 26, 27], "write": [4, 5, 6, 7, 8, 26, 27], "_id3": [5, 8], "red": 5, "knew": 5, "were": [5, 17], "troubl": [5, 28], "22": [5, 20], "mine": 6, "speak": 6, "now": [6, 26, 27], "07": [6, 27], "u": [6, 12, 17, 19, 20, 26, 27, 28], "blank": 7, "space": [7, 12], "style": [7, 10, 28], "shake": 7, "It": [7, 10, 12, 16, 17, 19, 20], "off": [7, 17], "don": [8, 26, 27, 28], "t": [8, 17, 26, 27, 28], "blame": 8, "05": [8, 20, 26], "delic": 8, "look": [8, 12, 20, 27, 29], "what": [8, 17], "made": [8, 10, 17, 26, 28], "do": [8, 26, 27, 29], "complet": [11, 14, 15, 17, 18, 27], "implement": [10, 11, 13, 15, 17, 18, 26, 29], "endpoint": [10, 11, 14, 15, 16, 17, 18, 19, 20, 26, 27], "client": [10, 12, 14, 16, 17, 19, 20, 26, 28, 29], "allow": [12, 14, 17, 20, 27, 29], "varieti": 12, "content": [12, 14, 17, 19, 20], "app": [12, 14, 17, 26], "ibook": 12, "movi": 12, "podcast": [12, 17], "music": [12, 17, 20, 25, 27, 28, 30], "video": [10, 12, 19, 20], "audiobook": [12, 17], "tv": [12, 20, 26], "show": [12, 17, 26, 27], "within": [12, 17], "mac": 12, "also": [10, 12, 14, 16, 17, 19, 20, 26, 27], "id": [10, 12, 14, 16, 17, 19, 20, 26, 27, 28, 29], "request": [10, 12, 14, 16, 17, 19, 20, 26], "map": 12, "librari": [12, 17, 25, 27, 28, 30], "digit": [10, 12], "catalog": [12, 14, 17, 19, 20, 27, 29], "more": [10, 12, 17, 18, 19, 20, 28, 29], "document": [12, 14, 16, 20], "api_url": [10, 12, 14, 17, 19, 20], "term": [12, 14, 16, 20], "countri": [10, 12, 14, 17, 19, 20, 26], "media": [12, 14, 20, 26, 29], "entiti": [12, 17, 20, 26, 29], "limit": [10, 12, 14, 17, 19, 20, 26, 28, 29], "lang": 12, "version": [12, 14, 20, 26, 29], "explicit": [12, 17, 20, 26], "text": [12, 16, 17, 20], "string": [12, 14, 17, 23, 24, 27], "replac": [12, 17, 26, 27], "plu": [12, 20, 26], "charact": [12, 19], "except": [12, 22, 27, 29], "letter": 12, "period": [12, 14], "dash": 12, "underscor": [12, 17], "_": [12, 26, 27], "asterisk": 12, "jack": 12, "johnson": 12, "two": [12, 17, 27, 28], "want": [10, 12, 17, 27, 28], "front": 12, "iso": [12, 16, 17, 19, 20], "obp": 12, "type": [10, 12, 14, 17, 19, 20, 26, 27, 29], "musicvideo": 12, "shortfilm": 12, "tvshow": 12, "softwar": [12, 20], "ebook": 12, "result": [10, 12, 14, 17, 19, 20, 26, 27, 29], "return": [10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27, 29], "rel": [12, 28], "avail": [10, 12, 14, 16, 17, 19, 20, 27, 28, 29], "tabl": 12, "2": [12, 17, 19, 20, 26, 27, 28], "associ": [10, 12, 14, 16, 17, 19, 20], "movieartist": 12, "name": [10, 12, 14, 17, 19, 20, 26, 27, 29], "allartist": 12, "allartistterm": 12, "Then": [12, 28, 29], "maroon": 12, "5": [10, 12, 14, 17, 28, 29], "instead": [12, 17, 20, 26, 28], "who": [10, 12], "have": [10, 12, 14, 16, 17, 20, 26, 27, 29], "ever": 12, "word": [12, 14, 16], "must": [10, 12, 14, 16, 17, 19, 20, 29], "200": [12, 19, 26], "50": [12, 14, 17, 20, 26, 28], "languag": [12, 14, 16, 17], "english": [12, 17], "japanes": 12, "five": 12, "codenam": 12, "en_u": 12, "ja_jp": 12, "kei": [10, 12, 14, 17, 20], "receiv": 12, "back": [12, 14, 27], "A": [12, 14, 17, 19, 20, 26, 27], "indic": [12, 17], "ye": 12, "To": [10, 12, 14, 17, 19, 20, 26, 27], "short": 12, "film": 12, "25": [12, 14, 27], "jim": 12, "jone": 12, "canada": 12, "ca": [12, 17, 26], "applic": [10, 12, 14, 17, 19, 20, 26, 28], "yelp": 12, "unit": 12, "state": [12, 17], "amg_artist_id": 12, "amg_album_id": 12, "amg_video_id": 12, "bundle_id": 12, "upc": [12, 14, 17, 19, 20, 26, 29], "isbn": 12, "sort": [10, 12, 20], "amg": 12, "ean": [12, 17, 19], "faster": 12, "fewer": 12, "posit": [10, 12, 14, 17, 20, 26, 28], "bundl": 12, "appli": [12, 17, 19], "recent": [12, 14, 17], "up": [12, 14, 17, 20, 28, 29], "909253": 12, "284910350": 12, "468749": 12, "multipl": [12, 17, 19, 29], "5723": 12, "get": [10, 12, 14, 16, 17, 19, 20, 27, 29, 30], "each": [12, 17, 20, 26], "top": [12, 17, 20, 26, 28], "most": [12, 14, 26, 27], "720642462928": 12, "15175": 12, "15176": 12, "15177": 12, "15178": 12, "15183": 12, "15184": 12, "15187": 12, "15190": 12, "15191": 12, "15195": 12, "15197": 12, "15198": 12, "17120": 12, "book": 12, "9780316069359": 12, "com": [10, 12, 20, 26, 28], "yelpiphon": 12, "minimum": [13, 17, 18], "privat": [10, 13, 14, 15, 17, 18, 20, 27, 28, 29], "app_id": [14, 26], "app_secret": [14, 26], "flow": [10, 14, 17, 19, 20, 26, 29], "browser": [10, 14, 16, 20, 26, 29], "user_ag": [14, 20], "email": [10, 14, 17, 20, 26], "password": [14, 26, 29], "auth_token": [14, 26], "save": [10, 14, 16, 17, 19, 20], "collect": [10, 14, 17, 20, 21], "playlist": [14, 17, 20, 28], "perform": [10, 14, 20, 26, 29], "queri": [14, 17, 19, 20, 27], "them": [14, 17, 20, 26, 28, 29], "offici": [14, 17, 20], "been": [14, 16, 17, 20, 26, 27], "watch": [14, 16, 20], "http": [10, 14, 16, 17, 20, 26, 28, 29], "network": [14, 16, 20], "traffic": [14, 16, 20, 26], "design": [14, 16, 17, 20], "publicli": [14, 16, 20], "access": [10, 14, 16, 17, 19, 20, 26, 28, 29], "disabl": [10, 14, 16, 17, 19, 20], "remov": [14, 16, 17, 20, 26], "ensur": [10, 14, 16, 17, 20], "complianc": [14, 16, 20], "while": [14, 17, 20, 27], "necessari": [14, 17, 20, 26, 29], "public": [10, 14, 17, 18, 20, 26, 28, 29], "person": [10, 14, 17, 20], "stream": [14, 17, 20, 29], "activ": [14, 17, 20, 26], "In": [14, 16, 17, 19, 20, 28, 29], "latter": [14, 20], "case": [14, 16, 17, 19, 20, 26, 29], "accompani": [10, 14, 16, 17, 19, 20, 26], "token": [10, 14, 16, 17, 19, 20, 26], "header": [14, 16, 17, 19, 20], "grant": [14, 17], "inher": 14, "unsaf": 14, "sinc": [14, 17, 28], "ha": [14, 26, 27], "mechan": 14, "multifactor": 14, "brute": 14, "forc": 14, "attack": 14, "highli": [14, 17], "encourag": 14, "yourself": 14, "through": [14, 17], "player": [14, 16, 17, 20, 26, 27], "android": [14, 20, 26], "io": [14, 20, 26], "maco": [14, 20, 26], "window": [14, 20, 26], "secret": [10, 14, 17, 19, 20], "constructor": [10, 14, 16, 17, 19, 20, 26, 27, 28], "credenti": [10, 14, 17, 19, 20, 26, 28, 29], "qobuz_private_app_id": 14, "qobuz_private_app_secret": 14, "oper": [10, 14, 16, 17, 19, 20, 25], "system": [10, 14, 16, 17, 19, 20, 28], "environ": [10, 14, 16, 17, 19, 20, 26, 28, 29], "variabl": [10, 14, 16, 17, 19, 20, 26, 28, 29], "thei": [14, 17, 26, 28, 29], "set_flow": [10, 14, 17, 19, 20], "set_auth_token": 14, "respect": [10, 14, 16, 17, 19, 20, 23, 24, 26, 27, 28, 29], "manag": [10, 14, 16, 17, 19, 20], "properti": [10, 14, 16, 17, 19, 20, 27], "acquir": [10, 14, 16, 17, 19, 20], "configur": [10, 14, 16, 17, 19, 20, 28], "load": [10, 14, 16, 17, 19, 20, 27, 28], "next": [10, 14, 16, 17, 19, 20, 26, 27], "behavior": [10, 14, 16, 17, 19, 20, 27], "secur": [10, 14, 16, 17, 19, 20], "concern": [10, 14, 16, 17, 19, 20], "comput": [10, 14, 16, 17, 19, 20, 23, 24], "being": [10, 14, 16, 17, 19, 20], "share": [10, 14, 16, 17, 19, 20], "devic": [10, 14, 16, 17, 19, 20, 26, 28, 29], "author": [10, 14, 19, 26], "open": [10, 14, 17, 20, 26, 28, 29], "login": [14, 26], "page": [10, 14, 17, 19, 20, 26], "playwright": [10, 14, 17, 20], "framework": [10, 14, 17, 20, 26], "microsoft": [10, 14, 17, 20], "account": [10, 14, 17, 20, 26], "agent": [14, 20], "send": [10, 14, 16, 17, 19, 20], "address": [14, 20], "here": [10, 14, 16, 17, 19, 20, 26], "found": [10, 14, 16, 17, 19, 20, 28], "process": [10, 14, 16, 17, 19, 20, 26, 27, 29], "bypass": [10, 14, 16, 17, 19, 20], "newli": [10, 14, 16, 17, 19, 20, 29], "web_url": [14, 20], "set": [10, 14, 16, 17, 19, 20, 28, 29], "album_id": [14, 19, 20, 29], "singl": [10, 14, 17, 19, 27], "0060254735180": 14, "maximum_bit_depth": [14, 26], "media_count": [14, 26], "albums_count": [14, 26], "slug": [14, 26], "pictur": [14, 19, 20, 26], "role": [10, 14, 20], "released_at": [14, 26], "label": [10, 14, 17, 26], "supplier_id": [14, 26], "qobuz_id": [14, 26], "durat": [10, 14, 17, 19, 20, 26], "parental_warn": [14, 26], "popular": [14, 17, 19, 20, 25, 26, 27], "tracks_count": [14, 26, 29], "color": [14, 16, 20, 26], "maximum_channel_count": [14, 26], "maximum_sampling_r": [14, 26], "articl": [14, 20], "release_date_origin": [14, 26], "release_date_download": [14, 26], "release_date_stream": [14, 26], "purchas": [14, 26], "streamabl": [14, 26], "preview": [14, 20, 26, 27], "sampleabl": [14, 26], "download": [14, 17, 20, 26], "display": [14, 26], "purchasable_at": [14, 26], "streamable_at": [14, 26], "hire": [14, 26], "hires_stream": [14, 26], "award": 14, "description_languag": 14, "goodi": 14, "area": 14, "catchlin": 14, "created_at": [14, 26], "genres_list": 14, "is_offici": 14, "maximum_technical_specif": 14, "product_sales_factors_monthli": 14, "product_sales_factors_weekli": 14, "product_sales_factors_yearli": 14, "product_typ": 14, "product_url": 14, "recording_inform": 14, "relative_url": 14, "release_tag": 14, "release_typ": 14, "subtitl": [14, 20], "offset": [14, 17, 19, 20, 26], "audio_info": [14, 26], "replaygain_track_peak": [14, 26], "float": [10, 14, 17, 20, 23, 24], "replaygain_track_gain": [14, 26], "work": [14, 20, 26], "media_numb": [14, 26], "release_date_purchas": [14, 26], "get_featured_album": 14, "seller": 14, "editor": 14, "pick": 14, "ideal": [14, 26], "discographi": 14, "press": [14, 26], "qobuzissim": 14, "harmonia": 14, "mundi": 14, "univers": 14, "classic": [14, 17], "jazz": 14, "jeuness": 14, "chanson": 14, "index": [14, 17, 20], "get_artist": [14, 17, 19, 20], "artist_id": [14, 19, 20, 29], "extra": 14, "tracks_appears_on": 14, "albums_with_last_releas": 14, "effect": 14, "albums_as_primary_artist_count": 14, "albums_as_primary_composer_count": 14, "medium": [14, 20, 26], "extralarg": [14, 26], "mega": [14, 26], "similar_artist_id": 14, "biographi": [14, 20], "summari": [14, 20], "get_label": 14, "label_id": 14, "1153": 14, "get_playlist": [14, 17, 20, 26, 29], "playlist_id": [14, 17], "15732665": 14, "image_rectangle_mini": 14, "featured_artist": 14, "timestamp_posit": 14, "images300": [14, 26], "updated_at": [14, 26], "percent": 14, "image_rectangl": 14, "owner": [14, 17, 26], "users_count": [14, 26], "images150": [14, 26], "is_collabor": [14, 26, 29], "featured_tag_id": 14, "name_json": 14, "genre_tag": 14, "is_discov": 14, "public_at": [14, 26], "is_publ": [14, 26, 29], "is_featur": [14, 26], "null": 14, "playlist_track_id": [14, 26], "get_featured_playlist": [14, 17], "last": [14, 17, 20, 22, 27, 28, 29], "get_user_playlist": [14, 17, 20, 26, 29], "custom": [14, 17, 28], "favorit": [14, 28], "500": [14, 20, 26], "is_publish": 14, "published_to": [14, 26], "welcom": 14, "published_from": [14, 26], "create_playlist": [14, 17, 20, 26, 28, 29], "collabor": [14, 17, 26, 29], "brief": [14, 20], "update_playlist": [14, 20, 26], "privaci": [14, 20], "own": [10, 14, 17, 20], "17737508": 14, "update_playlist_posit": 14, "from_playlist_id": 14, "to_playlist_id": 14, "organ": [14, 27], "move": [14, 17, 20], "swap": 14, "17737509": 14, "add_playlist_track": [14, 26, 29], "track_id": [14, 16, 19, 20], "duplic": 14, "add": [14, 17, 20, 26, 28, 29], "24393122": 14, "24393138": 14, "ad": [10, 14, 17, 20, 26, 29], "move_playlist_track": 14, "insert_befor": [14, 17], "same": [14, 17, 29], "delete_playlist_track": 14, "delet": [14, 17, 20], "delete_playlist": [14, 20, 26], "favorite_playlist": [14, 20], "subscrib": 14, "unfavorite_playlist": [14, 20], "unsubscrib": 14, "hi_r": [14, 20], "new_releas": 14, "10": [14, 17, 19, 20, 26], "categori": [14, 17, 20, 26], "mainartist": [14, 26], "releasenam": [14, 26], "exact": 14, "phrase": 14, "focu": 14, "name_superbloc": 14, "accroch": 14, "genre_id": 14, "root_categori": 14, "abstract": 14, "image_origin": 14, "category_id": [14, 17], "source_imag": 14, "published_at": 14, "section_slug": 14, "description_short": 14, "display_d": 14, "get_track_perform": 14, "unformat": 14, "call": [14, 26], "filter": [14, 17, 20], "special": 14, "composerlyricist": [14, 26], "lyricist": [14, 20], "featuredartist": 14, "produc": [14, 26], "co": [14, 26], "mixer": 14, "musicpublish": 14, "etc": [14, 20, 29], "dictionari": [14, 17, 19, 20], "contributor": [10, 14, 20, 26], "snake": 14, "get_track_file_url": 14, "format_id": 14, "27": 14, "playback": [14, 17, 20], "hi": [14, 20], "re": [10, 14, 20, 26], "qualiti": [14, 20], "constant": 14, "320": [14, 20, 26], "kbp": [14, 20], "6": [14, 17], "cd": [14, 26], "16": [14, 20, 26, 27], "44": [14, 20, 26], "khz": [14, 20], "7": [14, 26], "24": [14, 20, 26], "96": [14, 20], "192": 14, "mime_typ": 14, "restrict": [14, 17], "sampling_r": 14, "get_curated_track": 14, "weekli": 14, "curat": [14, 20], "baselin": 14, "step_pagin": 14, "graphic": 14, "background": [14, 16], "foreground": 14, "generated_at": 14, "expires_on": 14, "get_track_stream": [14, 20], "mime": [14, 20], "get_collection_stream": [14, 20], "get_profil": [10, 14, 17, 20], "profil": [10, 14, 17, 20, 26], "publicid": 14, "firstnam": [14, 20], "lastnam": [14, 20], "display_nam": [14, 17], "country_cod": [14, 19, 20], "language_cod": 14, "zone": 14, "avatar": 14, "ag": [14, 26], "creation_d": 14, "offer": 14, "start_dat": 14, "end_dat": 14, "is_cancel": 14, "household_size_max": 14, "lossy_stream": 14, "lossless_stream": 14, "hires_purchases_stream": 14, "mobile_stream": 14, "offline_stream": 14, "hfp_purchas": 14, "included_format_group_id": 14, "color_schem": 14, "logo": 14, "short_label": 14, "last_upd": 14, "favorite_album": [14, 20, 29], "favorite_artist": [14, 20, 29], "favorite_track": [14, 20, 28], "store_featur": 14, "editori": 14, "club": 14, "wallet": 14, "weeklyq": 14, "autoplai": 14, "inapp_purchase_subscripton": 14, "opt_in": 14, "music_import": 14, "get_favorit": [14, 29], "get_purchas": 14, "favorite_item": [14, 29], "unfavorite_item": 14, "unfavorit": 14, "sp_dc": [16, 17, 26], "access_token": [10, 16, 17, 19, 20, 26], "expiri": [16, 17, 19, 20, 26], "datetim": [16, 17, 19, 20], "power": [10, 16, 26], "musixmatch": 16, "petitlyr": 16, "japan": 16, "interfac": [10, 16, 25], "so": [16, 17, 19, 20, 26, 27, 28, 29], "develop": [10, 16, 20], "cooki": [16, 17, 26], "either": [10, 16, 17, 19, 20, 26, 28], "spotify_sp_dc": [16, 17, 26], "extract": [16, 20], "local": [16, 17, 27], "storag": [16, 26], "after": [16, 17], "log": [16, 26], "exchang": [16, 17, 20], "recommend": [10, 16, 17, 19, 20, 29, 30], "other": [16, 17, 19, 20, 26, 27], "authent": [16, 17, 19, 26, 28, 29], "relat": [16, 17, 19, 20, 26], "expir": [16, 17, 19, 20, 26], "set_sp_dc": 16, "set_access_token": [10, 16, 17, 19, 20], "former": [16, 17, 19, 20], "relev": [16, 17, 19, 20, 29], "refresh": [16, 17, 19, 20, 26], "8601": [16, 17, 19, 20], "m": [16, 17, 19, 20, 26], "dt": [16, 17, 19, 20], "h": [16, 17, 19, 20], "sz": [16, 17, 19, 20, 26], "user": [16, 17, 19, 26, 28, 29], "reauthent": [16, 17, 19, 20], "lyrics_url": 16, "token_url": [16, 17, 19, 20], "session": [10, 16, 17, 19, 20], "timestamp": [16, 17, 19, 20], "0vjijw4gluzamyd2vxmi3b": 16, "synctyp": 16, "starttimem": 16, "syllabl": 16, "endtimem": 16, "providerlyricsid": [16, 20], "providerdisplaynam": 16, "synclyricsuri": 16, "isdensetypefac": 16, "altern": [16, 17, 29], "isrtllanguag": 16, "fullscreenact": 16, "showupsel": 16, "highlighttext": 16, "hasvocalremov": 16, "client_id": [17, 19, 20, 26], "client_secret": [17, 19, 20, 26], "web_play": 17, "port": [10, 17, 26], "8888": [10, 17, 26], "redirect_uri": [10, 17], "refresh_token": [17, 20, 26], "creation": 17, "interact": [17, 28], "control": 17, "visual": [17, 28], "form": [10, 17], "refer": [17, 19, 23, 24], "without": [10, 17, 20, 26, 27], "proof": [17, 20], "pkce": [17, 20, 26, 29], "These": [17, 20], "oauth": [10, 17, 19, 20], "spotify_client_id": [17, 26], "spotify_client_secret": [17, 26], "guid": [17, 19], "how": [17, 19, 27], "advantag": [10, 17], "function": [10, 17, 19, 20], "redirect": [10, 17, 26], "uri": [10, 17, 20, 26], "localhost": [10, 17, 26], "callback": [10, 17, 20, 26], "where": [10, 17], "approach": [17, 26], "resort": 17, "deprec": 17, "unless": 17, "authorization_cod": 17, "client_credenti": [17, 19, 20], "server": [10, 17, 26, 29], "built": [10, 17], "flask": [10, 17], "get_scop": [17, 26, 29], "possibl": [17, 19, 20], "auth_url": [10, 17, 20], "web_player_token_url": 17, "classmethod": 17, "ugc": 17, "upload": 17, "spotify_connect": 17, "connect": 17, "read": [17, 28], "modifi": 17, "plai": 17, "remot": 17, "follow": [17, 20, 26, 28, 29], "listening_histori": 17, "histori": 17, "substr": 17, "e": [17, 26], "market": 17, "4aawyab9vmqn3uq7fjrgti": 17, "3166": [17, 19, 20], "alpha": [17, 19, 20], "prioriti": 17, "over": 17, "neither": 17, "consid": 17, "album_typ": [17, 26], "total_track": [17, 26, 29], "available_market": [17, 26], "external_url": [17, 26], "href": [17, 26], "height": [10, 17, 19, 20, 26, 28], "width": [10, 17, 19, 20, 26, 28], "release_d": [17, 26], "release_date_precis": [17, 26], "reason": 17, "external_id": [17, 26, 29], "previou": [17, 20, 26, 27], "duration_m": [17, 26], "is_play": 17, "linked_from": 17, "preview_url": [17, 26], "is_loc": [17, 26], "sever": 17, "identifi": [10, 17, 26], "comma": 17, "20": 17, "382obepsp2rxgrnsizn5tx": 17, "1a2gtwgtffwp7ksqtwwoyo": 17, "2norn2aes5aonvsu6iwthc": 17, "get_album_track": 17, "000": [17, 26], "get_saved_album": [17, 29], "added_at": [17, 26], "save_album": [17, 29], "remove_saved_album": 17, "check_saved_album": 17, "check": [10, 17], "alreadi": [17, 20, 26, 27], "arrai": 17, "boolean": 17, "get_new_album": 17, "shown": 17, "brows": 17, "tab": 17, "particular": [10, 17], "omit": 17, "se": [17, 26], "album_group": 17, "uniqu": [17, 27], "0tnoyisbd1xyrbk9myaseg": 17, "2cimqhirsu0mqqyyhq0eox": 17, "57dn52uhvrhoxijzpigu3": 17, "1vcwhac5f2us3yhpwwbia6": 17, "get_artist_album": [17, 19, 20], "include_group": 17, "suppli": 17, "promot": 17, "appears_on": 17, "appear": [17, 20, 27], "main": [17, 19, 26, 29], "get_artist_top_track": [17, 20], "get_related_artist": 17, "similar": [17, 19, 20, 23, 24, 28, 29], "given": [10, 17, 19], "analysi": 17, "commun": [10, 17], "listen": 17, "get_audiobook": 17, "uk": 17, "ireland": 17, "zealand": 17, "australia": 17, "7ihfbu1ypacw6ozpafjtq": 17, "html_descript": 17, "edit": [10, 17, 20, 30], "media_typ": 17, "narrat": 17, "publish": 17, "total_chapt": 17, "chapter": 17, "audio_preview_url": 17, "chapter_numb": 17, "resume_point": 17, "fully_plai": 17, "resume_position_m": 17, "episod": [17, 26], "18yvqkdbdrvs24c0ilj2ci": 17, "1hgw3j3nxzo1tp1bttvhpz": 17, "get_audiobook_chapt": 17, "get_saved_audiobook": 17, "save_audiobook": 17, "remove_saved_audiobook": 17, "check_saved_audiobook": 17, "get_categori": 17, "dinner": 17, "desir": [17, 20], "consist": 17, "639": 17, "join": [10, 17], "american": 17, "es_mx": 17, "spanish": 17, "mexico": 17, "icon": 17, "nformat": 17, "get_chapt": 17, "0d5wendkdwbqlrhoaj9g29": 17, "0isxvp0jmcb2adse338gkk": 17, "3zxb8fkzgu0ehalyx6uczu": 17, "get_episod": 17, "512ojhouo1ktjprkbvckyq": 17, "is_externally_host": 17, "total_episod": 17, "77o6bivlym3msb4mmil1jh": 17, "0q86acnrm6v9gyx55sxkwf": 17, "get_saved_episod": 17, "save_episod": 17, "remove_saved_episod": 17, "check_saved_episod": 17, "get_genre_se": 17, "seed": [17, 28], "get_recommend": [17, 28], "acoust": 17, "afrobeat": 17, "get_market": 17, "br": [17, 26], "IT": [17, 26], "get_playback_st": 17, "additional_typ": 17, "progress": 17, "besid": 17, "introduc": 17, "maintain": [17, 26], "might": 17, "futur": 17, "is_act": 17, "is_private_sess": 17, "is_restrict": 17, "volume_perc": 17, "repeat_st": 17, "shuffle_st": 17, "context": 17, "progress_m": 17, "is_plai": 17, "currently_playing_typ": 17, "action": 17, "interrupting_playback": 17, "paus": 17, "resum": 17, "seek": 17, "skipping_next": 17, "skipping_prev": 17, "toggling_repeat_context": 17, "toggling_shuffl": 17, "toggling_repeat_track": 17, "transferring_playback": 17, "transfer_playback": 17, "device_id": 17, "transfer": [17, 30], "start": [17, 27, 28, 29], "although": 17, "accept": 17, "than": [17, 26, 27], "400": 17, "bad": 17, "74aszwbe4lxaubb36ztrgx": 17, "happen": [17, 27], "get_devic": 17, "get_currently_plai": 17, "start_playback": 17, "context_uri": 17, "position_m": 17, "target": [17, 19, 20], "0d1841b0976bae2a3a310dd74c0f3df354899bc8": 17, "1je1imulbxcx1fz0we7opt": 17, "4iv5w9uyedyuva79axb7rh": 17, "1301wleyt98msxvhpzca6m": 17, "zero": 17, "neg": 17, "repres": 17, "sixth": 17, "millisecond": 17, "pass": [17, 26, 27, 28], "greater": 17, "length": 17, "caus": 17, "pause_playback": 17, "skip_to_next": 17, "skip": [17, 20, 26], "queue": 17, "skip_to_previ": 17, "seek_to_posit": 17, "25000": 17, "set_repeat_mod": 17, "repeat": [17, 27], "mode": [17, 20], "turn": 17, "set_playback_volum": 17, "volum": 17, "100": [17, 20, 26, 28], "inclus": 17, "toggle_playback_shuffl": 17, "toggl": 17, "shuffl": 17, "get_recently_plai": 17, "befor": [17, 26, 27, 29], "doesn": 17, "unix": 17, "cursor": [17, 20], "1484811043508": 17, "played_at": 17, "get_queu": 17, "make": [10, 17, 19, 20, 26, 28], "currently_plai": 17, "add_to_queu": 17, "end": 17, "3ceypja9oz9gipac4ash4n": 17, "dot": [17, 26], "non": 17, "reoccur": 17, "parenthes": 17, "drill": 17, "nest": 17, "prefix": 17, "exclam": 17, "mark": 17, "just": 17, "added_bi": [17, 26], "adder": 17, "snapshot_id": [17, 26], "change_playlist_detail": [17, 26], "detail": [10, 17, 19, 29], "cours": 17, "my": [17, 20, 26], "becom": 17, "abl": 17, "displai": [17, 28], "get_playlist_item": [17, 20, 29], "add_playlist_item": [17, 20, 26, 28, 29], "exce": 17, "bodi": 17, "insert": 17, "order": [10, 17, 20], "third": [17, 29], "snapshot": 17, "update_playlist_item": 17, "range_start": 17, "range_length": 17, "reorder": 17, "depend": [17, 26], "clear": 17, "mutual": 17, "exclus": 17, "togeth": 17, "simpli": [17, 26], "9": 17, "amount": 17, "rang": 17, "begin": 17, "subsequ": 17, "against": 17, "remove_playlist_item": 17, "even": [10, 17, 27], "user_id": [17, 20], "smedjan": 17, "empti": 17, "until": 17, "doe": [17, 20, 26, 27, 29], "coolest": 17, "yyyi": 17, "mm": 17, "ddthh": 17, "ss": 17, "tailor": 17, "dai": [17, 26], "revert": 17, "utc": 17, "2014": 17, "23t09": 17, "00": [17, 26, 27], "whose": [10, 17], "am": [10, 17, 26], "messag": [17, 19, 26], "get_category_playlist": 17, "get_playlist_cover_imag": 17, "dimens": 17, "add_playlist_cover_imag": [17, 28], "base64": [17, 28], "jpeg": 17, "payload": 17, "256": [17, 26], "kb": 17, "narrow": 17, "year": [10, 17], "hipster": 17, "certain": 17, "g": [17, 20], "1955": 17, "1960": 17, "past": [17, 26], "week": 17, "lowest": [17, 27], "remast": 17, "doxi": 17, "mile": 17, "davi": 17, "across": [17, 29], "hit": [17, 26], "both": [17, 20, 26], "get_show": 17, "38bs44xjbvvz3no3byf1dj": 17, "5cfcwki5pz28u0uozxkdh": 17, "5as3akmn2k11yfdddsrvaz": 17, "get_show_episod": 17, "get_saved_show": 17, "save_show": 17, "remove_saved_show": 17, "check_saved_show": 17, "11dfghvxanmlkmjxsncbnl": 17, "7oumywpwj422jrcdaszb7p": 17, "4vqporuhp5edpber92t6lq": 17, "2takcwoaazwixqijphix7b": 17, "get_saved_track": [17, 28], "save_track": 17, "remove_saved_track": 17, "check_saved_track": 17, "analysis_url": 17, "danceabl": 17, "energi": 17, "instrument": 17, "live": 17, "loud": 17, "speechi": 17, "time_signatur": 17, "track_href": 17, "valenc": 17, "get_tracks_audio_featur": 17, "get_track_audio_analysi": 17, "low": [17, 20], "level": 17, "describ": 17, "structur": 17, "rhythm": 17, "pitch": 17, "timbr": 17, "audio_analysi": 17, "meta": 17, "analyzer_vers": 17, "platform": 17, "detailed_statu": 17, "status_cod": 17, "analysis_tim": 17, "input_process": 17, "num_sampl": 17, "sample_md5": 17, "offset_second": 17, "window_second": 17, "analysis_sample_r": 17, "analysis_channel": 17, "end_of_fade_in": 17, "start_of_fade_out": 17, "tempo_confid": 17, "time_signature_confid": 17, "key_confid": 17, "mode_confid": 17, "codestr": 17, "code_vers": 17, "echoprintstr": 17, "echoprint_vers": 17, "synchstr": 17, "synch_vers": 17, "rhythmstr": 17, "rhythm_vers": 17, "bar": 17, "confid": 17, "section": [10, 17, 26], "segment": 17, "loudness_start": 17, "loudness_max": 17, "loudness_max_tim": 17, "loudness_end": 17, "tatum": 17, "seed_artist": 17, "seed_genr": 17, "seed_track": [17, 28], "suffici": 17, "pool": 17, "veri": [17, 27], "obscur": 17, "enough": 17, "train": 17, "machin": 17, "learn": 17, "ai": 17, "model": 17, "4nhqugzhttlfvgf5szeslk": 17, "0c6xiddpze81m2q797orda": 17, "unusu": 17, "imposs": 17, "debug": [17, 26], "tunabl": [17, 28], "afterfilterings": 17, "afterrelinkings": 17, "initialpools": 17, "usernam": [10, 17, 20], "explicit_cont": 17, "filter_en": 17, "filter_lock": 17, "product": [17, 26], "get_top_item": 17, "time_rang": 17, "calcul": 17, "affin": 17, "frame": 17, "long_term": 17, "medium_term": 17, "approxim": 17, "month": 17, "short_term": 17, "get_user_profil": [17, 20], "follow_playlist": 17, "unfollow_playlist": [17, 26], "unfollow": [17, 20], "get_followed_artist": [17, 29], "0i2xqvxqhscxjhhk6ayyr": 17, "follow_peopl": [17, 29], "sent": 17, "unfollow_peopl": 17, "check_followed_peopl": 17, "check_playlist_follow": 17, "jmperezperez": 17, "thelinmichael": 17, "wizzler": 17, "robust": 18, "expos": 19, "build": [10, 19, 27, 28], "tidal_client_id": [19, 26], "tidal_client_secret": [19, 26], "regist": [10, 19, 26], "set_auflow": 19, "251380836": [19, 20], "barcodeid": 19, "released": [19, 20, 26], "imagecov": 19, "videocov": [19, 20, 26], "numberofvolum": [19, 20], "numberoftrack": [19, 20, 26, 29], "numberofvideo": [19, 20, 26], "mediametadata": [19, 20, 26], "275646830": [19, 20], "resourc": [10, 19, 26, 28], "statu": [10, 19, 20, 26], "success": [19, 26], "failur": 19, "get_album_item": [19, 20], "pagin": [10, 19, 20], "artifacttyp": 19, "tracknumb": [19, 20, 26], "volumenumb": [19, 20, 26], "get_album_by_barcode_id": 19, "barcode_id": 19, "barcod": 19, "196589525444": 19, "get_similar_album": [19, 20, 28], "1566": [19, 20], "7804": [19, 20], "get_similar_artist": [19, 20, 28], "251380837": [19, 20], "251380838": [19, 20], "get_track_by_isrc": 19, "usual": 19, "compris": 19, "12": [19, 26], "alphanumer": 19, "ussm12209515": 19, "get_similar_track": [19, 28], "get_video": [19, 20], "video_id": [19, 20], "75623239": [19, 20], "59727844": [19, 20], "beyonc\u00e9": [19, 20], "worldwid": 19, "r_usr": 20, "tidal_private_client_id": 20, "tidal_private_client_secret": 20, "desktop": [10, 20, 26], "device_cod": 20, "manual": [10, 20, 28], "termin": [10, 20], "w_usr": 20, "w_sub": 20, "temporarili": 20, "block": 20, "ip": 20, "too": 20, "quickli": 20, "login_url": 20, "redirect_url": 20, "resources_url": 20, "streamreadi": [20, 26], "adsupportedstreamreadi": [20, 26], "djreadi": [20, 26], "stemreadi": [20, 26], "streamstartd": [20, 26], "allowstream": [20, 26], "premiumstreamingonli": [20, 26], "vibrantcolor": [20, 26], "audioqu": [20, 26], "audiomod": [20, 26], "totalnumberofitem": 20, "replaygain": [20, 26], "peak": [20, 26], "mix": [20, 26, 28], "track_mix": [20, 26], "get_album_credit": 20, "get_album_review": 20, "review": 20, "synopsi": 20, "lastupd": [20, 26], "get_favorite_album": [20, 29], "order_direct": 20, "desc": [10, 20], "direct": 20, "asc": [10, 20], "on_artifact_not_found": 20, "unfavorite_album": 20, "artisttyp": [20, 26], "artistrol": [20, 26], "categoryid": [20, 26], "artist_mix": [20, 26], "subset": 20, "epsandsingl": 20, "get_artist_video": 20, "imagepath": 20, "imageid": 20, "adsurl": 20, "adsprepaywallonli": 20, "get_artist_mix_id": 20, "mix_id": 20, "000ec0b01da1ddd752ec5dee553d48": 20, "get_artist_radio": 20, "inspir": 20, "ident": [10, 20], "get_mix_item": 20, "get_artist_biographi": 20, "biograph": 20, "get_artist_link": 20, "link": 20, "websit": [10, 20], "sitenam": 20, "banner": 20, "relationtyp": 20, "similar_artist": 20, "get_favorite_artist": [20, 29], "unfavorite_artist": 20, "get_blocked_artist": 20, "block_artist": 20, "radio": 20, "unblock_artist": 20, "unblock": 20, "get_country_cod": 20, "get_imag": 20, "uuid": [20, 26, 29], "anim": 20, "d3c4372b": 20, "a652": 20, "40e0": 20, "bdb1": 20, "fc8d032708f6": 20, "userprofil": 20, "get_favorite_mix": 20, "datead": 20, "mixtyp": 20, "subtitletextinfo": 20, "detailimag": 20, "master": 20, "titletextinfo": 20, "lastmodifiedat": 20, "favorite_mix": 20, "000dd748ceabd5508947c6a5d3880a": 20, "unfavorite_mix": 20, "get_album_pag": 20, "device_typ": 20, "phone": 20, "mobil": [10, 20], "smart": 20, "submodul": 20, "get_artist_pag": 20, "get_mix_pag": 20, "get_video_pag": 20, "playlist_uuid": 20, "36ea71a8": 20, "445e": 20, "41a4": 20, "82ab": 20, "6628c581535d": 20, "creator": [20, 26], "publicplaylist": 20, "squareimag": [20, 26], "promotedartist": [20, 26], "lastitemaddedat": [20, 26], "get_playlist_etag": 20, "etag": 20, "1698984074453": 20, "get_playlist_recommend": 20, "folder_id": 20, "root": 20, "4261748a": 20, "4287": 20, "4758": 20, "aaab": 20, "6d5be3e99e52": 20, "folder": 20, "place": 20, "under": 20, "move_playlist": 20, "e09ab9c": 20, "2e87": 20, "41b8": 20, "b404": 20, "3cd712bf706e": 20, "contentbehavior": [20, 26], "sharinglevel": [20, 26], "trn": [20, 26], "followinfo": [20, 26], "nroffollow": [20, 26], "tidalresourcenam": [20, 26], "followtyp": [20, 26], "userid": 20, "get_personal_playlist": [17, 20], "folder_uuid": 20, "itemtyp": 20, "addedat": 20, "parent": [20, 26, 27, 28], "readi": [20, 26], "set_playlist_privaci": [20, 26], "from_playlist_uuid": 20, "on_dupl": 20, "move_playlist_item": 20, "from_index": 20, "to_index": 20, "delete_playlist_item": 20, "get_personal_playlist_fold": 20, "flatten": 20, "include_onli": 20, "date_upd": 20, "createdat": 20, "create_playlist_fold": 20, "delete_playlist_fold": 20, "92b3c1ea": 20, "245a": 20, "4e5a": 20, "a5a4": 20, "c215f7a65b9f": 20, "tophit": 20, "collection_id": 20, "audio_qu": 20, "video_qu": 20, "max_resolut": 20, "2160": 20, "playback_mod": 20, "asset_present": 20, "streaming_session_id": 20, "immers": 20, "hifi": 20, "plan": 20, "price": 20, "dolbi": 20, "atmo": 20, "64": [20, 26], "1411": 20, "9216": 20, "mqa": 20, "audio_onli": 20, "vertic": 20, "offlin": 20, "asset": [20, 26, 28], "present": 20, "30": [20, 27], "get_video_stream": 20, "tommi": 20, "wright": 20, "kelman": 20, "duran": 20, "teriu": 20, "dream": 20, "de": [20, 26], "diamant": 20, "mike": [20, 28], "dean": 20, "trackid": [20, 26], "lyricsprovid": 20, "providercommontrackid": 20, "isrighttoleft": 20, "get_track_mix_id": 20, "tidal_id": 20, "0017159e6a1f34ae3d981792d72ecf": 20, "get_track_playback_info": 20, "hc": 20, "en": 20, "360004255778": 20, "info": 20, "assetpresent": 20, "manifestmimetyp": 20, "manifesthash": 20, "manifest": 20, "albumreplaygain": 20, "albumpeakamplitud": 20, "trackreplaygain": 20, "trackpeakamplitud": 20, "get_track_recommend": 20, "suggested_track": 20, "get_favorite_track": 20, "unfavorite_track": 20, "countrycod": 20, "fullnam": 20, "nicknam": 20, "citi": 20, "postalcod": 20, "usstat": 20, "phonenumb": 20, "birthdai": 20, "channelid": 20, "parentid": 20, "acceptedeula": 20, "facebookuid": 20, "appleuid": 20, "googleuid": 20, "accountlinkcr": 20, "emailverifi": 20, "newus": 20, "get_sess": 20, "sessionid": 20, "partnerid": 20, "authorizedforofflin": 20, "authorizedforofflined": 20, "get_favorite_id": 20, "172311284": 20, "numberoffollow": 20, "prompt": [20, 26], "primari": [20, 22], "secondari": 20, "updatedtim": 20, "supportedcontenttyp": 20, "profiletyp": 20, "get_user_follow": 20, "peopl": [20, 29], "imfollow": 20, "follow_us": 20, "unfollow_us": 20, "get_blocked_us": 20, "block_us": 20, "unblock_us": 20, "get_video_playback_info": 20, "videoid": 20, "streamtyp": 20, "videoqu": 20, "get_favorite_video": 20, "favorite_video": 20, "unfavorite_video": 20, "util": [22, 23, 24, 27], "ndarrai": [23, 24], "levenshtein": [24, 27], "ratio": [23, 24, 27], "measur": [23, 24], "compar": [23, 24], "numpi": [23, 24, 27], "instal": [23, 24], "otherwis": [23, 24, 27], "lightweight": 25, "3": [25, 26, 27, 28], "packag": 26, "pip": 26, "come": [26, 28], "pypi": 26, "conda": 26, "forg": 26, "onc": 26, "pep": 26, "541": 26, "resolv": [26, 27], "grab": 26, "repositori": 26, "git": 26, "clone": 26, "github": 26, "bbye98": 26, "enter": [26, 27], "directori": [26, 27], "virtual": 26, "prevent": 26, "conflict": 26, "requirements_minim": 26, "txt": 26, "env": 26, "f": [26, 27, 28, 29], "yml": 26, "venv": 26, "bin": 26, "posix": 26, "bash": 26, "zsh": 26, "script": 26, "bat": 26, "cmd": 26, "ex": 26, "ps1": 26, "powershel": 26, "alongsid": [10, 26], "step": [26, 29], "r": [26, 27], "virtualenv": 26, "linux": 26, "done": 26, "try": [10, 26, 29], "import": [26, 27, 28, 29], "error": 26, "modulenotfounderror": 26, "No": 26, "rais": 26, "successfulli": 26, "out": [10, 26, 27, 28], "box": 26, "few": 26, "addit": [26, 29], "prerequisit": 26, "cach": 26, "client_itun": [26, 27], "client_qobuz": [26, 29], "protect": 26, "qobuz_email": 26, "qobuz_password": 26, "post": 26, "spawn": 26, "normal": 26, "launch": 26, "find": [10, 26, 28, 29], "chromium": 26, "f12": 26, "devtool": 26, "navig": 26, "firefox": 26, "shift": 26, "f9": 26, "inspector": 26, "nagiv": 26, "client_spotify_lyr": 26, "choic": [26, 28], "spotify_port": 26, "client_spotifi": [26, 27, 28, 29], "scope": [26, 28, 29], "get_authorization_scop": 26, "autom": 26, "click": 26, "agre": 26, "jot": 26, "client_tid": [26, 27, 28, 29], "client_tidal_priv": 26, "proxi": 26, "tool": 26, "intercept": 26, "instruct": 26, "consol": 26, "edm": 26, "group": 26, "galanti": [26, 28], "musicartist": 26, "wrappertyp": 26, "artistnam": [26, 27], "artistlinkurl": 26, "543322169": 26, "uo": 26, "artistid": 26, "amgartistid": 26, "2616267": 26, "primarygenrenam": 26, "danc": 26, "primarygenreid": 26, "17": 26, "static": 26, "8dcf30e5c8e30281ecbb13b0886426c8": 26, "127": 26, "865362": 26, "4stqvofp9vemcemlw50sbu": 26, "3382444": [], "pop": 26, "v1": 26, "640": 26, "scdn": 26, "ab6761610000e5eb7bda087d6fb48d481efd3344": 26, "ab676161000051747bda087d6fb48d481efd3344": 26, "160": 26, "ab6761610000f1787bda087d6fb48d481efd3344": 26, "67": [], "4676988": 26, "a627e21c": 26, "60f7": 26, "4e90": 26, "b2bb": 26, "e50b178c4f0b": 26, "1024x256": 26, "1024": 26, "1080x720": 26, "1080": 26, "720": 26, "160x107": 26, "107": 26, "160x160": 26, "320x214": 26, "214": 26, "320x320": 26, "480x480": 26, "480": 26, "640x428": 26, "428": 26, "750x500": 26, "750": 26, "750x750": 26, "www": [10, 26], "72": 26, "11": [26, 27], "engin": 26, "team": 26, "000202a7e72fd90d0c0df2ed56ddea": 26, "everybodi": 26, "talk": 26, "neon": 26, "tree": 26, "kind": 26, "315816847": [], "collectionid": [26, 27], "578054990": [], "578054997": [], "glee": [], "cast": [], "collectionnam": 26, "season": [], "vol": 26, "tracknam": [26, 27], "collectioncensorednam": 26, "trackcensorednam": 26, "artistviewurl": 26, "collectionviewurl": 26, "trackviewurl": 26, "previewurl": 26, "ssl": 26, "audiopreview125": [], "v4": 26, "86": [], "4b": [], "3f": [], "864b3f23": [], "9155": [], "9ce8": [], "c1c0": [], "fc115a8af80a": [], "mzaf_13828074306318913858": [], "p": 26, "artworkurl30": 26, "is1": 26, "mzstatic": 26, "thumb": [10, 26], "music115": [], "57": [], "6d": [], "4e": [], "576d4e7a": [], "7860": [], "595a": [], "5ccd": [], "05e965413df5": [], "886443746404": [], "30x30bb": 26, "artworkurl60": 26, "60x60bb": 26, "artworkurl100": 26, "100x100bb": 26, "collectionpric": 26, "99": 26, "trackpric": 26, "29": 26, "2012": 26, "05t12": [], "00z": [26, 27], "collectionexplicit": 26, "notexplicit": 26, "trackexplicit": 26, "disccount": 26, "discnumb": 26, "trackcount": 26, "tracktimemilli": 26, "179280": [], "usa": 26, "currenc": [10, 26], "usd": [10, 26], "isstream": 26, "track_qobuz": 26, "2022": [26, 27], "arko": 26, "boom": 26, "todd": 26, "15899504": 26, "fc": 26, "7v": 26, "ilfmuz10e7vfc_230": 26, "ilfmuz10e7vfc_50": 26, "ilfmuz10e7vfc_600": 26, "0859766309663": 26, "1665180000": 26, "4026379": 26, "95": 26, "speedi": 26, "178369185": 26, "536": 26, "133": 26, "0070ef": 26, "hip": 26, "hop": 26, "rap": 26, "ilfmuz10e7vfc": 26, "1689231600": 26, "08": 26, "15899505": 26, "tcagm2280786": 26, "178369187": 26, "track_spotifi": 26, "0rpddszuhfncuwnjxkosji": 26, "au": 26, "AT": 26, "BE": 26, "bo": 26, "bg": 26, "cl": 26, "cr": 26, "cy": 26, "cz": 26, "dk": 26, "ec": 26, "ee": 26, "sv": 26, "fi": 26, "fr": 26, "gr": 26, "gt": 26, "hn": 26, "hk": 26, "hu": 26, "ie": 26, "lv": 26, "lt": 26, "lu": 26, "mt": 26, "nl": 26, "nz": 26, "ni": 26, "NO": 26, "pa": 26, "py": 26, "pe": 26, "ph": 26, "pl": 26, "pt": 26, "sg": 26, "sk": 26, "ch": 26, "tw": 26, "tr": 26, "ui": 26, "gb": 26, "li": [26, 29], "mc": 26, "th": 26, "ro": 26, "il": 26, "za": 26, "sa": 26, "ae": 26, "bh": 26, "qa": 26, "om": 26, "kw": 26, "eg": 26, "tn": 26, "lb": 26, "jo": 26, "IN": 26, "BY": 26, "kz": 26, "md": 26, "ua": 26, "al": 26, "ba": 26, "hr": 26, "mk": 26, "si": 26, "kr": 26, "bd": 26, "pk": 26, "lk": 26, "gh": 26, "ke": 26, "ng": 26, "tz": 26, "ug": 26, "bb": 26, "bz": 26, "bt": 26, "bw": 26, "bf": 26, "cv": 26, "cw": 26, "dm": 26, "fj": 26, "gm": 26, "gd": 26, "gw": 26, "gy": 26, "ht": 26, "jm": 26, "ki": 26, "l": 26, "lr": 26, "mw": 26, "mv": 26, "ml": 26, "mh": 26, "fm": 26, "na": 26, "nr": 26, "ne": 26, "pw": 26, "pg": 26, "w": 26, "st": 26, "sn": 26, "sc": 26, "sl": 26, "sb": 26, "kn": 26, "lc": 26, "vc": 26, "sr": 26, "tl": 26, "TO": 26, "tt": 26, "az": 26, "bn": 26, "bi": 26, "kh": 26, "cm": 26, "td": 26, "km": 26, "gq": 26, "ga": 26, "gn": 26, "kg": 26, "la": 26, "mo": 26, "mr": 26, "mn": 26, "np": [26, 27], "rw": 26, "tg": 26, "uz": 26, "zw": 26, "bj": 26, "mg": 26, "mu": 26, "mz": 26, "ao": 26, "ci": 26, "dj": 26, "zm": 26, "cg": 26, "iq": 26, "tj": 26, "ve": 26, "xk": 26, "0urfz92jmjwdbzbb7hebir": 26, "ab67616d0000b2734a6c0376235e5aa44e59d2c2": 26, "300": 26, "ab67616d00001e024a6c0376235e5aa44e59d2c2": 26, "ab67616d000048514a6c0376235e5aa44e59d2c2": 26, "01": 26, "177280": 26, "usum71119189": 26, "2iumqdfgzchihs3b9e9ewq": 26, "81": [], "14492425": 26, "451": 26, "due": 26, "demand": 26, "right": [26, 29], "holder": 26, "prohibit": 26, "track_tidal_priv": 26, "177": 26, "999969": 26, "17t00": 26, "0000": 26, "55": 26, "mercuri": 26, "2011": 26, "umg": 26, "inc": 26, "stereo": 26, "3665225": 26, "e6f17398": 26, "759e": 26, "45a0": 26, "9673": 26, "6ded6811e199": 26, "14492422": 26, "1c2d7c90": 26, "034e": 26, "485a": 26, "be1f": 26, "24a669c7e6e": 26, "f8af88": 26, "0019768c833a193c29829e5bf473fc": 26, "we": [26, 27, 28, 29], "playlist_qobuz": 26, "ilfmuz10e7vfc_150": 26, "1701053442": [], "ilfmuz10e7vfc_300": 26, "1701053443": [], "18171379": [], "52": [], "3865979203": [], "playlist_spotifi": 26, "3vsxl8ftlyoqgewazcz5d": [], "primary_color": 26, "myw0ndk1ngnlmze0m2e1otbkmtg0otdkn2m4mgi1nmi3zji5ymmxytgz": [], "2023": [26, 27, 28, 29], "27t02": [], "45z": [], "video_thumbnail": 26, "playlist_tidal_priv": 26, "e9f6aff1": [], "f39e": [], "462b": [], "90c4": [], "41686877a555": [], "unrestrict": 26, "8e75fac4": [], "cf24": [], "45c8": [], "8bd2": [], "98ab69f7f74b": [], "eefe947a": [], "5cdb": [], "40ee": [], "8057": [], "213941ff48d5": [], "45": [], "504": [], "46": [], "085": [], "mutagen": 26, "common": 26, "test": [26, 27], "middle_c": 26, "notat": 26, "getattr": 26, "attr": 26, "print": [26, 27], "capit": [26, 27], "middl": 26, "squar": 26, "game": 26, "similarli": 26, "setattr": 26, "261": 26, "63": 26, "forget": [26, 27], "convers": [26, 27], "middle_c_alac": 26, "116kb": 26, "02": [], "930": [], "3kbit": [], "speed": [26, 27], "177x": [], "point": [26, 27], "novemb": [27, 28, 29], "glob": 27, "audio_fil": 27, "suffix": 27, "dive": 27, "def": 27, "print_metadata": 27, "__dict__": 27, "startswith": 27, "upper": 27, "els": 27, "below": [27, 29], "highlight": 27, "involv": 27, "spektrem_shin": 27, "0x7fb5cdaeb790": [], "let": [10, 27], "spektrem": 27, "shine": 27, "count": [10, 27], "1030107": 27, "44100": 27, "had": 27, "pull": 27, "At": 27, "yet": 27, "written": 27, "compat": 27, "1032kb": 27, "09": [], "280": [], "9kbit": [], "68": 26, "5x": [], "With": 27, "280593": 27, "persist": 27, "typic": 27, "accur": 27, "good": [10, 27], "idea": 27, "select": [27, 28, 29], "closest": 27, "choos": 27, "distanc": 27, "levenshtein_ratio": 27, "lower": 27, "itunes_result": 27, "itunes_track": 27, "argmax": 27, "itunes_album": 27, "2013": 27, "gfted": 27, "06t12": 27, "electron": 27, "fill": 27, "By": [10, 27], "set_metadata_us": 27, "spotify_result": 27, "spotify_track": [27, 29], "gb2ld0901581": 27, "128": 27, "correct": [27, 29], "get_track_compo": 27, "tidal_result": 27, "tidal_track": [27, 29], "tidal_compos": 27, "tidal_lyr": 27, "did": 27, "sometim": [27, 29], "tobu_back_to_y": 27, "0x7fb6744afdd0": [], "tobu": 27, "tom": 27, "burkovski": 27, "nc": 27, "06t07": 27, "hous": [27, 28], "gb2ld2210368": 27, "1104053": 27, "poorli": 27, "miss": 27, "fix": 27, "three": 27, "25t12": 27, "98": 27, "voil\u00e0": 27, "twice": 27, "becaus": 27, "There": 27, "eleg": 27, "solut": 27, "problem": 27, "unfortun": [27, 29], "19": [28, 29], "help": 28, "discov": 28, "leverag": 28, "suggest": 28, "b64encod": 28, "random": 28, "ipython": 28, "html": 28, "ifram": 28, "ipywidget": 28, "gridspeclayout": 28, "sure": 28, "0jz9tvoltzjagqiyc4hyzx": 28, "avicii": 28, "0bmb3nzquhbfi6nm4setvu": 28, "cash": 28, "surrend": 28, "1pq8ywty9v2ivzwj7gyxxb": 28, "mako": 28, "our": 28, "70iflb5egla8wufwgxborz": 28, "william": 28, "fallin": 28, "6jspbxzld2yemjtjz2gqot": 28, "passion": 28, "pit": 28, "76b6ljxtolasgxlanjnndr": 28, "sick": 28, "individu": 28, "2v65y3px4dkrhy1djlxd9p": 28, "swedish": 28, "mafia": 28, "worri": 28, "child": 28, "feat": 28, "john": 28, "martin": 28, "1gpf8iwqqj8qoevjhfiidu": 28, "zedd": 28, "matthew": 28, "koma": 28, "miriam": 28, "bryant": 28, "randomli": 28, "recommended_track": 28, "k": 28, "spotify_playlist": [28, 29], "global": 28, "_dh": 28, "minim_mix_smal": 28, "rb": 28, "nifti": 28, "emb": [10, 28], "grid": 28, "len": 28, "enumer": 28, "framebord": 28, "lazi": 28, "152": 28, "510": 28, "divmod": 28, "procedur": [28, 29], "51073951": 28, "62082351": 28, "32553484": 28, "147258423": 28, "109273852": 28, "237059212": 28, "17271290": 28, "27171015": 28, "similar_track": 28, "div": 28, "pad": 28, "bottom": 28, "overflow": 28, "hidden": 28, "max": 28, "src": 28, "layout": 28, "gridifi": 28, "allowfullscreen": 28, "absolut": 28, "left": 28, "1px": 28, "min": 28, "margin": 28, "auto": 28, "tunemymus": 29, "assum": 29, "destin": 29, "challeng": 29, "often": 29, "difficult": 29, "barebon": 29, "pair": [10, 29], "fine": 29, "tune": 29, "complex": 29, "those": 29, "remix": 29, "qobuz_playlist_id": 29, "17865119": 29, "qobuz_playlist": 29, "new_spotify_playlist": 29, "equival": 29, "simpl": 29, "spotify_track_uri": 29, "qobuz_track": 29, "new_tidal_playlist": 29, "confirm": 29, "tidal_track_id": 29, "spotify_playlist_id": 29, "3rw9qy60ceh6dfjauwdxmh": 29, "new_qobuz_playlist": 29, "thankfulli": 29, "qobuz_track_id": 29, "tidal_playlist_uuid": 29, "40052e73": 29, "58d4": 29, "4abb": 29, "bc1c": 29, "abace76d2f15": 29, "tidal_playlist": 29, "tidal_playlist_item": 29, "qobuz_favorit": 29, "qobuz_favorite_album": 29, "qobuz_favorite_artist": 29, "align": 29, "spotify_album_id": 29, "qobuz_album": 29, "spotify_album": 29, "indexerror": 29, "break": 29, "follow_artist": 29, "spotify_artist_id": 29, "qobuz_artist": 29, "spotify_artist": 29, "tidal_album_id": 29, "tidal_album": 29, "lstrip": 29, "tidal_artist_id": 29, "tidal_artist": 29, "spotify_favorite_album": 29, "spotify_favorite_artist": 29, "qobuz_album_id": 29, "qobuz_artist_id": 29, "tidal_favorite_album": 29, "tidal_favorite_artist": 29, "gestalt": 23, "ratcliff": 23, "obershelp": 23, "keyerror": [], "traceback": [], "cell": [], "mnt": [], "benjamin": [], "700": [], "__init__": [], "self": [], "693": [], "config": [], "_name": [], "fallback": [], "695": [], "696": [], "697": [], "698": [], "699": [], "701": [], "1036": [], "1029": [], "_expiri": [], "1030": [], "strptime": [], "1031": [], "isinst": [], "1032": [], "1034": [], "_flow": [], "1035": [], "_sp_dc": [], "_user_id": [], "9108": [], "9054": [], "9055": [], "9056": [], "9103": [], "9104": [], "9106": [], "_check_scop": [], "_get_json": [], "843": [], "823": [], "825": [], "826": [], "827": [], "respons": [], "840": [], "841": [], "_request": [], "912": [], "retri": [], "887": [], "888": [], "construct": [], "889": [], "908": [], "909": [], "911": [], "_refresh_access_token": [], "914": [], "915": [], "299": [], "867": [], "855": [], "client_b64": [], "urlsafe_b64encod": [], "856": [], "_client_id": [], "_client_secret": [], "857": [], "decod": [], "858": [], "859": [], "860": [], "864": [], "basic": 10, "865": [], "bearer": [], "868": [], "_refresh_token": [], "869": [], "870": [], "timedelta": [], "expires_in": [], "126": 26, "3375748": [], "350172836": [], "1443469527": [], "1443469581": [], "audiopreview122": [], "5c": [], "5c29bf6b": [], "ca2c": [], "4e8b": [], "2be6": [], "c51a282c7da": [], "mzaf_1255557534804450018": [], "e3": [], "80e39565": [], "35f9": [], "2496": [], "c6f8": [], "6572490c4a7b": [], "12umgim12509": [], "rgb": [], "19t12": [], "contentadvisoryr": [], "justin": [], "meldal": [], "johnsen": [], "guitar": [], "keyboard": [], "percuss": [], "programm": [], "associatedperform": [], "tim": [], "pagnotta": [], "greg": [], "collin": [], "studiopersonnel": [], "weslei": [], "seidman": [], "asst": [], "tyler": [], "glenn": [], "matt": [], "wigger": [], "bill": [], "bush": [], "470727": [], "42": [], "54": [], "0060252795442_230": [], "0060252795442_50": [], "0060252795442_600": [], "0060252795442": [], "1325372400": [], "17487": [], "774": [], "5653617": [], "2785": [], "112": [], "119": [], "113": [], "indi": [], "alternatif": [], "et": [], "ind": [], "1683529200": [], "583118": [], "5653620": [], "1683702000": [], "0060252795442_150": [], "1699766986": [], "0060252795442_300": [], "1699766987": [], "17864724": [], "31": [], "3775088385": [], "193pq0l1m0ykfekbrb4c1v": [], "myxhzgzkzdk4m2m0ogy2zwvmytuxyweymjawm2mzmde5nze5ndq4ode0": [], "12t05": [], "49z": [], "771dc2db": [], "c763": [], "4e71": [], "9c87": [], "f5d82bfa4153": [], "9412a3c1": [], "7d10": [], "40b3": [], "b9b4": [], "96f0791dee9c": [], "74d8c599": [], "cfbd": [], "464f": [], "8e70": [], "80d51a6482bd": [], "155": 26, "740": [], "161x": [], "0x7f126c60b150": [], "0kb": [26, 27], "1891": [], "2kbit": [], "813x": [], "256kb": [], "89": [], "150": [], "768kb": [], "28": [], "222": [], "1x": 27, "281": 27, "1kbit": 27, "28x": [], "attributeerror": [], "8": [], "0x7efd3873e650": [], "3363420": [], "112115157": 26, "583394431": 26, "583394802": 26, "workout": 26, "35": 26, "unmix": 26, "gym": 26, "jog": 26, "run": 26, "cycl": 26, "cardio": 26, "fit": 26, "audiopreview115": 26, "c4": 26, "8d": 26, "c4fc8d9a": 26, "0b75": 26, "55fb": 26, "6413": 26, "6bdbf7d17e65": 26, "mzaf_7998633680287936907": 26, "music114": 26, "b4": 26, "a7": 26, "dc": 26, "b4a7dc27": 26, "6fcd": 26, "22ba": 26, "c9a6": 26, "564166a4c43d": 26, "35tophitswom3_2400": 26, "03t12": 26, "34": 26, "179055": 26, "79": 26, "1703541258": [], "1703541259": [], "18794965": [], "4056401760": [], "0nnctudbv2hxvrsbtw9uvd": [], "miwyywm2ywywymm2otmzmjfiogu1mdi5odjmzwrlndgwn2y5zjazzjyi": [], "25t21": [], "21z": [], "4d1dc535": [], "556c": [], "4368": [], "a6cc": [], "2fa0e373e4da": [], "af52f4df": [], "06f8": [], "40ad": [], "9ebd": [], "4ad993523c39": [], "7b203db1": [], "e8f4": [], "4fbc": [], "a87f": [], "a5032bcdcbd7": [], "21": [], "876": [], "633": [], "577014": [], "32": 26, "77": [], "0kbit": [], "92": 26, "1023": 26, "4kbit": 26, "163x": [], "0x7fb2b0648090": [], "652x": [], "83": [], "141": [], "6x": [], "1024kb": [], "279": [], "7kbit": 27, "1703541385": [], "1703541386": [], "18794976": [], "4056413118": [], "3r7m5jqsbyhqraljwmxop5": [], "miwymjgwzmy1ngnhnmeymdcynme4oda0nwfkmmmwzdvjyzjimdq5odc0": [], "56": [], "28z": [], "999521e8": [], "cc89": [], "40e2": [], "b5e4": [], "feef8fc55e2b": [], "9e9beafc": [], "fe9e": [], "41b5": [], "a3e2": [], "2165c7eb9ea5": [], "7be303ac": [], "90c3": [], "461a": [], "9e9c": [], "29b2e9737a93": [], "025": [], "411": [], "143x": [], "0x7f2a63fc6090": [], "773x": [], "146": [], "5kbit": [], "4x": [], "58": [], "228": [], "2x": [], "0x7f2a63fc5150": [], "1703541443": [], "1703541444": [], "18794997": [], "4056419200": [], "6lsdixcynk4tviweun0r2x": [], "miw1zdi0njy3zjzkoddkndm0mjcwyjnkywe4ntk2m2mwymm4nti4yjy4": [], "25z": [], "f7db0333": [], "9032": [], "4410": [], "8092": [], "33e2fd57a9a0": [], "dd039132": [], "45a2": [], "a7cc": [], "0c5a6de9b202": [], "c951760e": [], "df32": [], "469e": [], "9022": [], "a0f96adbbd51": [], "26": 26, "548": [], "131": [], "158x": [], "0x7fa51e606090": [], "746x": [], "223": [], "0x7fa5e9463ed0": [], "1703542953": [], "1703542954": [], "18795217": [], "4056566210": [], "05nxuuwubqkvqkokwts9sf": [], "miwzmwjizdyyzdg3mwizyzmyogq2ogqzmwi5zdc5yta5nmm4y2ywmgjh": [], "25t22": [], "36z": [], "b32ca39": [], "fc75": [], "41e8": [], "8983": [], "ac2c60a343b6": [], "add565f1": [], "aa6d": [], "4ba6": [], "9add": [], "b79766ffebff": [], "320db6de": [], "97ae": [], "499f": [], "bd6f": [], "d5fafed56818": [], "36": [], "519": [], "169x": [], "0x7f3ad3cea410": [], "71x": [], "94": [], "140": [], "221": [], "0x7f3ad38bdb50": [], "1703543032": [], "1703543033": [], "18795231": [], "4056571639": [], "6utaldny4jas8p62xkuob1": [], "miw1ytnmngyxnzblndnmy2fhyzcwnjdinmu4ngjmzgzmmdhmotmxm2rm": [], "23": [], "55z": [], "5ad15881": [], "d24a": [], "431d": [], "8842": [], "e984b14acddd": [], "b51cac5": [], "afda": [], "412e": [], "b776": [], "157cdf14ce72": [], "d8ce78a4": [], "6e66": [], "45b2": [], "b642": [], "3d8ad94ab51a": [], "288": [], "621": [], "151x": [], "0x7f3120028710": [], "688x": [], "62": 27, "143": [], "0x7f311f41c450": [], "1703543101": [], "1703543102": [], "18795240": [], "4056579211": [], "7byelnhlxdpl1suxbohdxc": [], "miximge3nmzkztjmnjhimzk3ogfimtcxmgfiowjhyjdkzmnin2qwzgi3": [], "04z": [], "72822fee": [], "3bd8": [], "4e6a": [], "8919": [], "6209622dbfee": [], "b9692a2e": [], "b994": [], "4add": [], "8cd8": [], "d55f713c9d2a": [], "db6c068e": [], "f503": [], "4564": [], "b13f": [], "de4ea788ca77": [], "276": [], "756": [], "157x": [], "0x7f31c2b320d0": [], "872x": [], "0x7f31c2b2e050": [], "1703543295": [], "1703543296": [], "18795266": [], "4056598057": [], "2hevunznshidx5g69qb6zo": [], "mixjmjm2owzkztlkmjaxotq3ytg3mgezy2zknwe3mjvingu1ywfjmwri": [], "17z": [], "19cbbd20": [], "a52a": [], "8a8f": [], "f61363ae06bf": [], "3ee9a69b": [], "8be3": [], "432e": [], "8797": [], "2f37410cfd60": [], "e9540028": [], "d848": [], "4ad4": [], "962d": [], "c15c46517dec": [], "18": [], "304": [], "782": [], "0x7fa22b87db10": [], "895x": [], "149": [], "8kbit": [], "8x": [], "7x": [], "0x7fa22b88ba10": [], "1703543445": [], "18795289": [], "4056613633": [], "519yixsucuo8znb1pid8gr": [], "miw5ntlhyjdjm2y1mtdjyzzhm2u4nwq0ymy3ywziyzjimzvhotlkyji1": [], "48z": [], "635c228f": [], "c946": [], "4243": [], "be68": [], "b26e3f48f64c": [], "5feae44a": [], "9961": [], "4173": [], "a4af": [], "7cdc80a43e95": [], "fbb4cf4e": [], "1268": [], "4adf": [], "be9c": [], "5a0fc14ba600": [], "48": [], "732": [], "49": [], "203": [], "154x": [], "0x7f0bf74f2710": [], "653x": [], "0x7f0bf6ab9510": [], "1703543491": [], "1703543492": [], "18795302": [], "4056619241": [], "65jzri70liabjp3vvmknvc": [], "miwzngy4mwzjody4ymiyyzg0ztixmznlzjvjotvkowrknzu1mtqxmwnh": [], "34z": [], "b464d4a7": [], "4e66": [], "4cc4": [], "aefd": [], "16ab91c81039": [], "21bdd5bd": [], "3daa": [], "45ba": [], "949a": [], "c82b37eeb088": [], "d0198e9e": [], "4fe2": [], "4285": [], "ba25": [], "f77658438440": [], "924": [], "291": [], "146x": [], "0x7fc1867c9710": [], "804x": [], "144": [], "0x7fc185d9d750": [], "1703543652": [], "18795317": [], "4056634586": [], "25thystgggzlzqfhklecqx": [], "mixln2m1m2yyndu1zge1ndmxodeyzgvhyzy1nznimdk1ztgwyzvjmtnh": [], "14z": [], "532c3063": [], "45aa": [], "8781": [], "07f88e6e371b": [], "3bd94903": [], "8ecf": [], "4ac9": [], "8698": [], "9c8ce41fe5dd": [], "319f5bf4": [], "4417": [], "8909": [], "3a532fb33d12": [], "15": [], "008": [], "490": [], "0x7f5d7dc6f710": [], "675x": [], "153": [], "0x7f5e47f61650": [], "discog": 10, "consumer_kei": 10, "consumer_secret": 10, "web_framework": [10, 17, 29], "access_token_secret": 10, "rest": 10, "wantlist": 10, "marketplac": 10, "home": 10, "least": 10, "enjoi": 10, "higher": 10, "consum": 10, "discogs_consumer_kei": 10, "discogs_consumer_secret": 10, "registr": 10, "0a": 10, "view": 10, "discogs_personal_access_token": [], "undergo": 10, "attach": 10, "access_token_url": 10, "request_token_url": 10, "get_ident": 10, "doubl": 10, "saniti": 10, "correctli": 10, "resource_url": 10, "consumer_nam": 10, "visibl": 10, "num_list": 10, "num_collect": 10, "num_wantlist": 10, "rodneyfool": 10, "wantlist_url": 10, "rank": 10, "num_pend": 10, "num_for_sal": 10, "home_pag": 10, "locat": 10, "collection_folders_url": 10, "collection_fields_url": 10, "releases_contribut": 10, "rating_avg": 10, "releases_r": 10, "inventory_url": 10, "avatar_url": 10, "banner_url": 10, "buyer_r": 10, "buyer_rating_star": 10, "buyer_num_r": 10, "seller_r": 10, "seller_rating_star": 10, "seller_num_r": 10, "curr_abbr": 10, "edit_profil": 10, "real": 10, "nicola": 10, "cage": 10, "geograph": 10, "portland": 10, "biolog": 10, "abbrevi": 10, "gbp": 10, "eur": 10, "cad": 10, "aud": 10, "jpy": 10, "chf": 10, "mxn": 10, "brl": 10, "nzd": 10, "sek": 10, "zar": 10, "get_user_submiss": 10, "per_pag": 10, "get_user_contribut": 10, "sort_ord": 10, "708": [], "703": [], "704": [], "705": [], "706": [], "707": [], "709": [], "1044": [], "1037": [], "1038": [], "1039": [], "1040": [], "1042": [], "1043": [], "9116": [], "9062": [], "9063": [], "9064": [], "9111": [], "9112": [], "9114": [], "851": [], "831": [], "833": [], "834": [], "835": [], "848": [], "849": [], "920": [], "895": [], "896": [], "897": [], "916": [], "917": [], "919": [], "922": [], "923": [], "875": [], "863": [], "866": [], "872": [], "873": [], "877": [], "878": [], "0x7f3294a0e750": [], "1898": 27, "268x": [], "512kb": [], "265": [], "41": [], "0x7f320db6c290": [], "typeerror": [], "got": [], "unexpect": [], "3360776": [], "1703640723": [], "1703640724": [], "18814004": [], "4066997546": [], "6qcocfmdcnfktgmv2ujar": [], "miw2yzfhyjnhnmqzmge3mdzlmgy2zge0mzi5mmrlm2i5ote0mmywymu0": [], "27t01": [], "06z": [], "7c0572d8": [], "6a94": [], "4a56": [], "a26": [], "7b7fa6087bca": [], "8b359656": [], "544a": [], "46ec": [], "87eb": [], "0be478d31615": [], "b87d83bd": [], "b77a": [], "45f5": [], "a294": [], "c2dfd542c695": [], "357": [], "518": [], "90": [], "0x7f3937f2ced0": [], "733x": [], "3x": [], "0x7f393734cb90": [], "1703640810": [], "1703640811": [], "18814014": [], "4067006648": [], "1bs3bkyqi6g6qbvj4skpkc": [], "mswxnmnmy2u5ogy4odk4nmrimzlhmda0nzbjnzc4m2rhnju2nmm3mgvm": [], "33": 26, "32z": 26, "e02223ff": [], "d067": [], "41b2": [], "aa44": [], "ea5bd0bb14d1": [], "dc385d5b": [], "dc19": [], "4257": [], "a1a8": [], "8f3e5d7fa050": [], "42b6e4c7": [], "92d7": [], "80f7": [], "3199018785bd": [], "157": [], "318": [], "82": [], "0x7f4b180a9cd0": [], "566x": 27, "59": [], "9x": [], "0x7f4ab6deacd0": [], "submiss": 10, "fetch": 10, "shooezgirl": 10, "data_qu": 10, "namevari": 10, "releases_url": 10, "anv": 10, "averag": 10, "submitt": 10, "compani": 10, "date_ad": 10, "date_chang": 10, "estimated_weight": 10, "format_quant": 10, "qty": 10, "uri150": 10, "catno": 10, "entity_typ": 10, "master_id": 10, "master_url": 10, "note": 10, "released_format": 10, "seri": 10, "contribut": 10, "0x7f32a73529d0": [], "285x": [], "0x7f32a7353450": [], "3360524": 26, "1703696805": [], "1703696806": [], "18825699": [], "4072825591": [], "3xgm65vvklhkb1wvr6hhb6": [], "mswzzjk5zdnhmgrmmmnkyjm5nta0mgiyotnhyjm3ymzknzmwzmrjnjm5": [], "27t17": [], "cf693fb2": [], "7e90": [], "41a7": [], "92e7": [], "9f45179d6b6a": [], "2cad7241": [], "6d60": [], "4f7e": [], "aaa4": [], "a38677f91bb8": [], "2ee97ca": [], "dcb6": [], "40ec": [], "9f07": [], "7031e7ee0d83": [], "702": [], "387": [], "0x7f06d4ff2390": [], "471x": [], "226": [], "0x7f06d50b8250": [], "0x7f3b70212ad0": [], "553x": [], "58x": [], "0x7f3b70bb81d0": [], "1703712390": 26, "18831593": 26, "4074552535": 26, "2nijcg6e6ze8qv7aeckwnz": 26, "miw4ote4m2fkyznlzjlhmdjhywvinwnkmzuxyzawymmwyju2mgq1y2zl": 26, "27t21": 26, "c133107f": 26, "bf42": 26, "4fa0": 26, "8f7f": 26, "48b2fee31ec2": 26, "33dc107d": 26, "321e": 26, "4127": 26, "a0": 26, "9ed7723d1d60": 26, "f1293b2d": 26, "b657": 26, "40af": 26, "8961": 26, "0865891ac3cb": 26, "986": 26, "147": 26, "70x": 26, "0x7fa4c8389e50": 27, "0x7fa4c8433ed0": 27, "get_releas": 10, "release_id": 10, "databas": 10, "physic": 10, "249504": 10, "entity_type_nam": 10, "extraartist": 10, "lowest_pric": 10, "tracklist": 10, "type_": 10, "get_release_user_r": 10, "memori": 10, "update_release_user_r": 10}, "objects": {"": [[1, 0, 0, "-", "minim"]], "minim": [[2, 0, 0, "-", "audio"], [9, 0, 0, "-", "discogs"], [11, 0, 0, "-", "itunes"], [13, 0, 0, "-", "qobuz"], [15, 0, 0, "-", "spotify"], [18, 0, 0, "-", "tidal"], [21, 0, 0, "-", "utility"]], "minim.audio": [[3, 1, 1, "", "Audio"], [4, 1, 1, "", "FLACAudio"], [5, 1, 1, "", "MP3Audio"], [6, 1, 1, "", "MP4Audio"], [7, 1, 1, "", "OggAudio"], [8, 1, 1, "", "WAVEAudio"]], "minim.audio.Audio": [[3, 2, 1, "", "convert"], [3, 2, 1, "", "set_metadata_using_itunes"], [3, 2, 1, "", "set_metadata_using_qobuz"], [3, 2, 1, "", "set_metadata_using_spotify"], [3, 2, 1, "", "set_metadata_using_tidal"]], "minim.audio.FLACAudio": [[4, 2, 1, "", "convert"], [4, 2, 1, "", "set_metadata_using_itunes"], [4, 2, 1, "", "set_metadata_using_qobuz"], [4, 2, 1, "", "set_metadata_using_spotify"], [4, 2, 1, "", "set_metadata_using_tidal"], [4, 2, 1, "", "write_metadata"]], "minim.audio.MP3Audio": [[5, 2, 1, "", "convert"], [5, 2, 1, "", "set_metadata_using_itunes"], [5, 2, 1, "", "set_metadata_using_qobuz"], [5, 2, 1, "", "set_metadata_using_spotify"], [5, 2, 1, "", "set_metadata_using_tidal"], [5, 2, 1, "", "write_metadata"]], "minim.audio.MP4Audio": [[6, 2, 1, "", "convert"], [6, 2, 1, "", "set_metadata_using_itunes"], [6, 2, 1, "", "set_metadata_using_qobuz"], [6, 2, 1, "", "set_metadata_using_spotify"], [6, 2, 1, "", "set_metadata_using_tidal"], [6, 2, 1, "", "write_metadata"]], "minim.audio.OggAudio": [[7, 2, 1, "", "convert"], [7, 2, 1, "", "set_metadata_using_itunes"], [7, 2, 1, "", "set_metadata_using_qobuz"], [7, 2, 1, "", "set_metadata_using_spotify"], [7, 2, 1, "", "set_metadata_using_tidal"], [7, 2, 1, "", "write_metadata"]], "minim.audio.WAVEAudio": [[8, 2, 1, "", "convert"], [8, 2, 1, "", "set_metadata_using_itunes"], [8, 2, 1, "", "set_metadata_using_qobuz"], [8, 2, 1, "", "set_metadata_using_spotify"], [8, 2, 1, "", "set_metadata_using_tidal"], [8, 2, 1, "", "write_metadata"]], "minim.discogs": [[10, 1, 1, "", "API"]], "minim.discogs.API": [[10, 2, 1, "", "edit_profile"], [10, 2, 1, "", "get_identity"], [10, 2, 1, "", "get_profile"], [10, 2, 1, "", "get_release"], [10, 2, 1, "", "get_release_user_rating"], [10, 2, 1, "", "get_user_contributions"], [10, 2, 1, "", "get_user_submissions"], [10, 2, 1, "", "set_access_token"], [10, 2, 1, "", "set_flow"], [10, 2, 1, "", "update_release_user_rating"]], "minim.itunes": [[12, 1, 1, "", "SearchAPI"]], "minim.itunes.SearchAPI": [[12, 2, 1, "", "lookup"], [12, 2, 1, "", "search"]], "minim.qobuz": [[14, 1, 1, "", "PrivateAPI"]], "minim.qobuz.PrivateAPI": [[14, 2, 1, "", "add_playlist_tracks"], [14, 2, 1, "", "create_playlist"], [14, 2, 1, "", "delete_playlist"], [14, 2, 1, "", "delete_playlist_tracks"], [14, 2, 1, "", "favorite_items"], [14, 2, 1, "", "favorite_playlist"], [14, 2, 1, "", "get_album"], [14, 2, 1, "", "get_artist"], [14, 2, 1, "", "get_collection_streams"], [14, 2, 1, "", "get_curated_tracks"], [14, 2, 1, "", "get_favorites"], [14, 2, 1, "", "get_featured_albums"], [14, 2, 1, "", "get_featured_playlists"], [14, 2, 1, "", "get_label"], [14, 2, 1, "", "get_playlist"], [14, 2, 1, "", "get_profile"], [14, 2, 1, "", "get_purchases"], [14, 2, 1, "", "get_track"], [14, 2, 1, "", "get_track_file_url"], [14, 2, 1, "", "get_track_performers"], [14, 2, 1, "", "get_track_stream"], [14, 2, 1, "", "get_user_playlists"], [14, 2, 1, "", "move_playlist_tracks"], [14, 2, 1, "", "search"], [14, 2, 1, "", "set_auth_token"], [14, 2, 1, "", "set_flow"], [14, 2, 1, "", "unfavorite_items"], [14, 2, 1, "", "unfavorite_playlist"], [14, 2, 1, "", "update_playlist"], [14, 2, 1, "", "update_playlist_position"]], "minim.spotify": [[16, 1, 1, "", "PrivateLyricsService"], [17, 1, 1, "", "WebAPI"]], "minim.spotify.PrivateLyricsService": [[16, 2, 1, "", "get_lyrics"], [16, 2, 1, "", "set_access_token"], [16, 2, 1, "", "set_sp_dc"]], "minim.spotify.WebAPI": [[17, 2, 1, "", "add_playlist_cover_image"], [17, 2, 1, "", "add_playlist_items"], [17, 2, 1, "", "add_to_queue"], [17, 2, 1, "", "change_playlist_details"], [17, 2, 1, "", "check_followed_people"], [17, 2, 1, "", "check_playlist_followers"], [17, 2, 1, "", "check_saved_albums"], [17, 2, 1, "", "check_saved_audiobooks"], [17, 2, 1, "", "check_saved_episodes"], [17, 2, 1, "", "check_saved_shows"], [17, 2, 1, "", "check_saved_tracks"], [17, 2, 1, "", "create_playlist"], [17, 2, 1, "", "follow_people"], [17, 2, 1, "", "follow_playlist"], [17, 2, 1, "", "get_album"], [17, 2, 1, "", "get_album_tracks"], [17, 2, 1, "", "get_albums"], [17, 2, 1, "", "get_artist"], [17, 2, 1, "", "get_artist_albums"], [17, 2, 1, "", "get_artist_top_tracks"], [17, 2, 1, "", "get_artists"], [17, 2, 1, "", "get_audiobook"], [17, 2, 1, "", "get_audiobook_chapters"], [17, 2, 1, "", "get_audiobooks"], [17, 2, 1, "", "get_categories"], [17, 2, 1, "", "get_category"], [17, 2, 1, "", "get_category_playlists"], [17, 2, 1, "", "get_chapter"], [17, 2, 1, "", "get_chapters"], [17, 2, 1, "", "get_currently_playing"], [17, 2, 1, "", "get_devices"], [17, 2, 1, "", "get_episode"], [17, 2, 1, "", "get_episodes"], [17, 2, 1, "", "get_featured_playlists"], [17, 2, 1, "", "get_followed_artists"], [17, 2, 1, "", "get_genre_seeds"], [17, 2, 1, "", "get_markets"], [17, 2, 1, "", "get_new_albums"], [17, 2, 1, "", "get_personal_playlists"], [17, 2, 1, "", "get_playback_state"], [17, 2, 1, "", "get_playlist"], [17, 2, 1, "", "get_playlist_cover_image"], [17, 2, 1, "", "get_playlist_items"], [17, 2, 1, "", "get_profile"], [17, 2, 1, "", "get_queue"], [17, 2, 1, "", "get_recently_played"], [17, 2, 1, "", "get_recommendations"], [17, 2, 1, "", "get_related_artists"], [17, 2, 1, "", "get_saved_albums"], [17, 2, 1, "", "get_saved_audiobooks"], [17, 2, 1, "", "get_saved_episodes"], [17, 2, 1, "", "get_saved_shows"], [17, 2, 1, "", "get_saved_tracks"], [17, 2, 1, "", "get_scopes"], [17, 2, 1, "", "get_show"], [17, 2, 1, "", "get_show_episodes"], [17, 2, 1, "", "get_shows"], [17, 2, 1, "", "get_top_items"], [17, 2, 1, "", "get_track"], [17, 2, 1, "", "get_track_audio_analysis"], [17, 2, 1, "", "get_track_audio_features"], [17, 2, 1, "", "get_tracks"], [17, 2, 1, "", "get_tracks_audio_features"], [17, 2, 1, "", "get_user_playlists"], [17, 2, 1, "", "get_user_profile"], [17, 2, 1, "", "pause_playback"], [17, 2, 1, "", "remove_playlist_items"], [17, 2, 1, "", "remove_saved_albums"], [17, 2, 1, "", "remove_saved_audiobooks"], [17, 2, 1, "", "remove_saved_episodes"], [17, 2, 1, "", "remove_saved_shows"], [17, 2, 1, "", "remove_saved_tracks"], [17, 2, 1, "", "save_albums"], [17, 2, 1, "", "save_audiobooks"], [17, 2, 1, "", "save_episodes"], [17, 2, 1, "", "save_shows"], [17, 2, 1, "", "save_tracks"], [17, 2, 1, "", "search"], [17, 2, 1, "", "seek_to_position"], [17, 2, 1, "", "set_access_token"], [17, 2, 1, "", "set_flow"], [17, 2, 1, "", "set_playback_volume"], [17, 2, 1, "", "set_repeat_mode"], [17, 2, 1, "", "skip_to_next"], [17, 2, 1, "", "skip_to_previous"], [17, 2, 1, "", "start_playback"], [17, 2, 1, "", "toggle_playback_shuffle"], [17, 2, 1, "", "transfer_playback"], [17, 2, 1, "", "unfollow_people"], [17, 2, 1, "", "unfollow_playlist"], [17, 2, 1, "", "update_playlist_items"]], "minim.tidal": [[19, 1, 1, "", "API"], [20, 1, 1, "", "PrivateAPI"]], "minim.tidal.API": [[19, 2, 1, "", "get_album"], [19, 2, 1, "", "get_album_by_barcode_id"], [19, 2, 1, "", "get_album_items"], [19, 2, 1, "", "get_albums"], [19, 2, 1, "", "get_artist"], [19, 2, 1, "", "get_artist_albums"], [19, 2, 1, "", "get_artists"], [19, 2, 1, "", "get_similar_albums"], [19, 2, 1, "", "get_similar_artists"], [19, 2, 1, "", "get_similar_tracks"], [19, 2, 1, "", "get_track"], [19, 2, 1, "", "get_track_by_isrc"], [19, 2, 1, "", "get_tracks"], [19, 2, 1, "", "get_video"], [19, 2, 1, "", "get_videos"], [19, 2, 1, "", "search"], [19, 2, 1, "", "set_access_token"], [19, 2, 1, "", "set_flow"]], "minim.tidal.PrivateAPI": [[20, 2, 1, "", "add_playlist_items"], [20, 2, 1, "", "block_artist"], [20, 2, 1, "", "block_user"], [20, 2, 1, "", "create_playlist"], [20, 2, 1, "", "create_playlist_folder"], [20, 2, 1, "", "delete_playlist"], [20, 2, 1, "", "delete_playlist_folder"], [20, 2, 1, "", "delete_playlist_item"], [20, 2, 1, "", "favorite_albums"], [20, 2, 1, "", "favorite_artists"], [20, 2, 1, "", "favorite_mixes"], [20, 2, 1, "", "favorite_playlists"], [20, 2, 1, "", "favorite_tracks"], [20, 2, 1, "", "favorite_videos"], [20, 2, 1, "", "follow_user"], [20, 2, 1, "", "get_album"], [20, 2, 1, "", "get_album_credits"], [20, 2, 1, "", "get_album_items"], [20, 2, 1, "", "get_album_page"], [20, 2, 1, "", "get_album_review"], [20, 2, 1, "", "get_artist"], [20, 2, 1, "", "get_artist_albums"], [20, 2, 1, "", "get_artist_biography"], [20, 2, 1, "", "get_artist_links"], [20, 2, 1, "", "get_artist_mix_id"], [20, 2, 1, "", "get_artist_page"], [20, 2, 1, "", "get_artist_radio"], [20, 2, 1, "", "get_artist_top_tracks"], [20, 2, 1, "", "get_artist_videos"], [20, 2, 1, "", "get_blocked_artists"], [20, 2, 1, "", "get_blocked_users"], [20, 2, 1, "", "get_collection_streams"], [20, 2, 1, "", "get_country_code"], [20, 2, 1, "", "get_favorite_albums"], [20, 2, 1, "", "get_favorite_artists"], [20, 2, 1, "", "get_favorite_ids"], [20, 2, 1, "", "get_favorite_mixes"], [20, 2, 1, "", "get_favorite_tracks"], [20, 2, 1, "", "get_favorite_videos"], [20, 2, 1, "", "get_image"], [20, 2, 1, "", "get_mix_items"], [20, 2, 1, "", "get_mix_page"], [20, 2, 1, "", "get_personal_playlist_folders"], [20, 2, 1, "", "get_personal_playlists"], [20, 2, 1, "", "get_playlist"], [20, 2, 1, "", "get_playlist_etag"], [20, 2, 1, "", "get_playlist_items"], [20, 2, 1, "", "get_playlist_recommendations"], [20, 2, 1, "", "get_profile"], [20, 2, 1, "", "get_session"], [20, 2, 1, "", "get_similar_albums"], [20, 2, 1, "", "get_similar_artists"], [20, 2, 1, "", "get_track"], [20, 2, 1, "", "get_track_composers"], [20, 2, 1, "", "get_track_contributors"], [20, 2, 1, "", "get_track_credits"], [20, 2, 1, "", "get_track_lyrics"], [20, 2, 1, "", "get_track_mix_id"], [20, 2, 1, "", "get_track_playback_info"], [20, 2, 1, "", "get_track_recommendations"], [20, 2, 1, "", "get_track_stream"], [20, 2, 1, "", "get_user_followers"], [20, 2, 1, "", "get_user_following"], [20, 2, 1, "", "get_user_playlist"], [20, 2, 1, "", "get_user_playlists"], [20, 2, 1, "", "get_user_profile"], [20, 2, 1, "", "get_video"], [20, 2, 1, "", "get_video_page"], [20, 2, 1, "", "get_video_playback_info"], [20, 2, 1, "", "get_video_stream"], [20, 2, 1, "", "move_playlist"], [20, 2, 1, "", "move_playlist_item"], [20, 2, 1, "", "search"], [20, 2, 1, "", "set_access_token"], [20, 2, 1, "", "set_flow"], [20, 2, 1, "", "set_playlist_privacy"], [20, 2, 1, "", "unblock_artist"], [20, 2, 1, "", "unblock_user"], [20, 2, 1, "", "unfavorite_albums"], [20, 2, 1, "", "unfavorite_artists"], [20, 2, 1, "", "unfavorite_mixes"], [20, 2, 1, "", "unfavorite_playlist"], [20, 2, 1, "", "unfavorite_tracks"], [20, 2, 1, "", "unfavorite_videos"], [20, 2, 1, "", "unfollow_user"], [20, 2, 1, "", "update_playlist"]], "minim.utility": [[22, 3, 1, "", "format_multivalue"], [23, 3, 1, "", "gestalt_ratio"], [24, 3, 1, "", "levenshtein_ratio"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"minim": [1, 25, 26], "audio": [2, 3, 26, 27], "file": [2, 26, 27], "object": 2, "softwar": [3, 4, 5, 6, 7, 8], "depend": [3, 4, 5, 6, 7, 8], "flacaudio": 4, "mp3audio": 5, "mp4audio": 6, "oggaudio": 7, "waveaudio": 8, "itun": [11, 26], "searchapi": [12, 26], "qobuz": [13, 26, 29], "privateapi": [14, 20, 26], "sampl": [10, 14, 16, 17, 19, 20], "respons": [14, 16, 17, 19, 20], "user": [10, 14, 20, 30], "authent": [10, 14, 20], "subscript": [14, 20], "spotifi": [15, 26, 28, 29], "privatelyricsservic": [16, 26], "webapi": [17, 26], "author": [17, 20], "scope": [17, 20], "tidal": [18, 26, 28, 29], "api": [10, 19, 26, 27], "util": 21, "function": [21, 27], "levenshtein_ratio": 24, "multivalue_formatt": [], "get": [26, 28], "start": 26, "instal": 26, "usag": 26, "music": [26, 29], "servic": 26, "search": 26, "privat": 26, "lyric": 26, "web": 26, "exampl": 26, "artist": 26, "track": 26, "creat": 26, "modifi": 26, "delet": 26, "person": 26, "playlist": [26, 29], "handler": 26, "load": 26, "edit": [26, 27], "convert": [26, 27], "between": 26, "format": 26, "metadata": 27, "setup": 27, "instanti": 27, "client": 27, "find": 27, "defin": 27, "helper": 27, "tag": 27, "an": 27, "exist": 27, "recommend": 28, "transfer": 29, "librari": 29, "prerequisit": 29, "move": 29, "from": 29, "To": 29, "synchron": 29, "favorit": 29, "guid": 30, "format_multivalu": 22, "gestalt_ratio": 23, "discog": 9}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"audio": [[2, "module-minim.audio"]], "Audio file objects": [[2, "audio-file-objects"]], "minim": [[1, "module-minim"]], "gestalt_ratio": [[23, "gestalt-ratio"]], "utility": [[21, "module-minim.utility"]], "Utility functions": [[21, "utility-functions"]], "format_multivalue": [[22, "format-multivalue"]], "User Guide": [[30, "user-guide"]], "itunes": [[11, "module-minim.itunes"]], "iTunes": [[11, "id1"]], "MP4Audio": [[6, "mp4audio"]], "Software dependency": [[6, null], [8, null], [7, null], [3, null], [4, null], [5, null]], "WAVEAudio": [[8, "waveaudio"]], "OggAudio": [[7, "oggaudio"]], "Audio": [[3, "audio"]], "FLACAudio": [[4, "flacaudio"]], "MP3Audio": [[5, "mp3audio"]], "User authentication": [[14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [20, null], [10, null], [10, null], [10, null]], "PrivateAPI": [[14, "privateapi"], [20, "privateapi"]], "Sample response": [[14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [16, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null]], "Subscription": [[14, null], [14, null], [14, null]], "qobuz": [[13, "module-minim.qobuz"]], "Qobuz": [[13, "id1"]], "SearchAPI": [[12, "searchapi"]], "Authorization scope": [[20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null]], "User authentication and authorization scope": [[20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null]], "User authentication, authorization scope, and\n subscription": [[20, null], [20, null], [20, null], [20, null], [20, null]], "User authentication and subscription": [[20, null]], "API": [[19, "api"], [10, "api"]], "tidal": [[18, "module-minim.tidal"]], "TIDAL": [[18, "id1"], [28, "tidal"]], "Minim": [[25, "minim"]], "levenshtein_ratio": [[24, "levenshtein-ratio"]], "Getting Started": [[26, "getting-started"]], "Installation": [[26, "installation"]], "Usage": [[26, "usage"]], "Music service APIs": [[26, "music-service-apis"]], "iTunes Search API (minim.itunes.SearchAPI)": [[26, "itunes-search-api-minim-itunes-searchapi"]], "Private Qobuz API (minim.qobuz.PrivateAPI)": [[26, "private-qobuz-api-minim-qobuz-privateapi"]], "Private Spotify Lyrics Service (minim.spotify.PrivateLyricsService)": [[26, "private-spotify-lyrics-service-minim-spotify-privatelyricsservice"]], "Spotify Web API (minim.spotify.WebAPI)": [[26, "spotify-web-api-minim-spotify-webapi"]], "TIDAL API (minim.tidal.API)": [[26, "tidal-api-minim-tidal-api"]], "Private TIDAL API (minim.tidal.PrivateAPI)": [[26, "private-tidal-api-minim-tidal-privateapi"]], "Examples": [[26, "examples"], [26, "id9"]], "Searching for artists": [[26, "searching-for-artists"]], "iTunes Search API": [[26, "itunes-search-api"], [26, "id1"]], "Private Qobuz API": [[26, "private-qobuz-api"], [26, "id2"], [26, "id6"]], "Spotify Web API": [[26, "spotify-web-api"], [26, "id3"], [26, "id7"]], "TIDAL API": [[26, "tidal-api"], [26, "id4"]], "Private TIDAL API": [[26, "private-tidal-api"], [26, "id5"], [26, "id8"]], "Searching for tracks": [[26, "searching-for-tracks"]], "Creating, modifying, and deleting a personal playlist": [[26, "creating-modifying-and-deleting-a-personal-playlist"]], "Audio file handlers": [[26, "audio-file-handlers"]], "Loading and editing audio files": [[26, "loading-and-editing-audio-files"]], "Converting between audio formats": [[26, "converting-between-audio-formats"]], "Editing Audio Metadata": [[27, "editing-audio-metadata"]], "Setup": [[27, "setup"]], "Instantiating API clients": [[27, "instantiating-api-clients"]], "Finding audio files": [[27, "finding-audio-files"]], "Defining helper functions": [[27, "defining-helper-functions"]], "Converting and tagging an audio file with no metadata": [[27, "converting-and-tagging-an-audio-file-with-no-metadata"]], "Tagging an audio file with existing metadata": [[27, "tagging-an-audio-file-with-existing-metadata"]], "Spotify": [[28, "spotify"], [15, "id1"]], "Getting Recommendations": [[28, "getting-recommendations"]], "Transferring Music Libraries": [[29, "transferring-music-libraries"]], "Prerequisites": [[29, "prerequisites"]], "Moving playlists": [[29, "moving-playlists"]], "From Qobuz": [[29, "from-qobuz"], [29, "id4"]], "To Spotify": [[29, "to-spotify"], [29, "id3"], [29, "id5"], [29, "id12"]], "To TIDAL": [[29, "to-tidal"], [29, "id1"], [29, "id6"], [29, "id9"]], "From Spotify": [[29, "from-spotify"], [29, "id7"]], "To Qobuz": [[29, "to-qobuz"], [29, "id2"], [29, "id8"], [29, "id11"]], "From TIDAL": [[29, "from-tidal"], [29, "id10"]], "Synchronizing favorites": [[29, "synchronizing-favorites"]], "spotify": [[15, "module-minim.spotify"]], "PrivateLyricsService": [[16, "privatelyricsservice"]], "Sample": [[17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null]], "WebAPI": [[17, "webapi"]], "discogs": [[9, "module-minim.discogs"]], "Discogs": [[9, "id1"]]}, "indexentries": {"minim": [[1, "module-minim"]], "module": [[1, "module-minim"], [9, "module-minim.discogs"]], "minim.discogs": [[9, "module-minim.discogs"]], "api (class in minim.discogs)": [[10, "minim.discogs.API"]], "edit_profile() (minim.discogs.api method)": [[10, "minim.discogs.API.edit_profile"]], "get_identity() (minim.discogs.api method)": [[10, "minim.discogs.API.get_identity"]], "get_profile() (minim.discogs.api method)": [[10, "minim.discogs.API.get_profile"]], "get_release() (minim.discogs.api method)": [[10, "minim.discogs.API.get_release"]], "get_release_user_rating() (minim.discogs.api method)": [[10, "minim.discogs.API.get_release_user_rating"]], "get_user_contributions() (minim.discogs.api method)": [[10, "minim.discogs.API.get_user_contributions"]], "get_user_submissions() (minim.discogs.api method)": [[10, "minim.discogs.API.get_user_submissions"]], "set_access_token() (minim.discogs.api method)": [[10, "minim.discogs.API.set_access_token"]], "set_flow() (minim.discogs.api method)": [[10, "minim.discogs.API.set_flow"]], "update_release_user_rating() (minim.discogs.api method)": [[10, "minim.discogs.API.update_release_user_rating"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["api", "api/minim", "api/minim.audio", "api/minim.audio.Audio", "api/minim.audio.FLACAudio", "api/minim.audio.MP3Audio", "api/minim.audio.MP4Audio", "api/minim.audio.OggAudio", "api/minim.audio.WAVEAudio", "api/minim.discogs", "api/minim.discogs.API", "api/minim.itunes", "api/minim.itunes.SearchAPI", "api/minim.qobuz", "api/minim.qobuz.PrivateAPI", "api/minim.spotify", "api/minim.spotify.PrivateLyricsService", "api/minim.spotify.WebAPI", "api/minim.tidal", "api/minim.tidal.API", "api/minim.tidal.PrivateAPI", "api/minim.utility", "api/minim.utility.format_multivalue", "api/minim.utility.gestalt_ratio", "api/minim.utility.levenshtein_ratio", "index", "notebooks/getting_started", "notebooks/user_guide/editing_audio_metadata", "notebooks/user_guide/getting_recommendations", "notebooks/user_guide/transferring_music_libraries", "user_guide"], "filenames": ["api.rst", "api/minim.rst", "api/minim.audio.rst", "api/minim.audio.Audio.rst", "api/minim.audio.FLACAudio.rst", "api/minim.audio.MP3Audio.rst", "api/minim.audio.MP4Audio.rst", "api/minim.audio.OggAudio.rst", "api/minim.audio.WAVEAudio.rst", "api/minim.discogs.rst", "api/minim.discogs.API.rst", "api/minim.itunes.rst", "api/minim.itunes.SearchAPI.rst", "api/minim.qobuz.rst", "api/minim.qobuz.PrivateAPI.rst", "api/minim.spotify.rst", "api/minim.spotify.PrivateLyricsService.rst", "api/minim.spotify.WebAPI.rst", "api/minim.tidal.rst", "api/minim.tidal.API.rst", "api/minim.tidal.PrivateAPI.rst", "api/minim.utility.rst", "api/minim.utility.format_multivalue.rst", "api/minim.utility.gestalt_ratio.rst", "api/minim.utility.levenshtein_ratio.rst", "index.rst", "notebooks/getting_started.ipynb", "notebooks/user_guide/editing_audio_metadata.ipynb", "notebooks/user_guide/getting_recommendations.ipynb", "notebooks/user_guide/transferring_music_libraries.ipynb", "user_guide.rst"], "titles": ["<no title>", "minim", "audio", "Audio", "FLACAudio", "MP3Audio", "MP4Audio", "OggAudio", "WAVEAudio", "discogs", "API", "itunes", "SearchAPI", "qobuz", "PrivateAPI", "spotify", "PrivateLyricsService", "WebAPI", "tidal", "API", "PrivateAPI", "utility", "format_multivalue", "gestalt_ratio", "levenshtein_ratio", "Minim", "Getting Started", "Editing Audio Metadata", "Getting Recommendations", "Transferring Music Libraries", "User Guide"], "terms": {"thi": [2, 3, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 26, 27, 28, 29], "modul": [2, 3, 11, 13, 15, 18, 21, 26], "provid": [2, 3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22, 26, 27, 29], "conveni": [2, 14, 20, 27], "python": [2, 25, 26], "keep": [2, 17], "track": [2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 27, 28, 29], "handl": [2, 29], "metadata": [2, 3, 4, 5, 6, 7, 8, 17, 19, 20, 25, 26, 29, 30], "convert": [2, 3, 4, 5, 6, 7, 8, 25], "between": [2, 3, 4, 5, 6, 7, 8, 10, 12, 17, 25, 29], "differ": [2, 17, 26], "format": [2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 25, 27], "class": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26, 27, 28, 29], "minim": [3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 19, 20, 22, 23, 24, 27, 28, 29], "arg": [3, 4, 5, 6, 7, 8], "kwarg": [3, 4, 5, 6, 7, 8, 17], "sourc": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 29], "base": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 28], "object": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27, 28], "gener": [3, 17, 27, 28, 29], "file": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 25, 28], "handler": [3, 4, 5, 6, 7, 8, 27], "subclass": 3, "specif": [3, 17, 26, 27], "contain": [3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 26, 27], "includ": [3, 10, 12, 17, 20, 27], "flacaudio": [3, 5, 6, 7, 8, 26, 27], "encod": [3, 12, 17, 20, 26], "us": [3, 4, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17, 19, 20, 22, 26, 27, 28, 29], "free": [3, 29], "lossless": [3, 4, 5, 6, 7, 8, 14, 20, 26], "codec": [3, 4, 5, 6, 7, 8, 20, 26, 27], "flac": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "mp3audio": [3, 26, 27], "store": [3, 10, 12, 14, 16, 17, 19, 20, 26, 27, 28, 29], "mpeg": 3, "layer": 3, "iii": [3, 20], "mp3": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "mp4audio": [3, 4, 5, 7, 8, 26], "advanc": 3, "code": [3, 4, 5, 6, 7, 8, 12, 14, 17, 19, 20, 26], "aac": [3, 4, 5, 6, 7, 8, 20, 26], "appl": [3, 12, 26, 27], "alac": [3, 4, 5, 6, 7, 8, 20, 26], "4": [3, 17, 26], "part": 3, "14": [3, 26], "mp4": [3, 4, 5, 6, 7, 8, 20, 26], "m4a": [3, 4, 5, 6, 7, 8, 26], "oggaudio": [3, 26], "opu": [3, 4, 5, 6, 7, 8, 26], "vorbi": [3, 4, 5, 6, 7, 8, 26], "an": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 28], "ogg": [3, 4, 5, 6, 7, 8], "waveaudio": [3, 26], "linear": 3, "puls": 3, "lpcm": [3, 4, 5, 6, 7, 8, 26], "waveform": 3, "wave": [3, 4, 5, 6, 7, 8, 26], "can": [3, 10, 14, 16, 17, 19, 20, 25, 26, 27, 28, 29], "instanti": [3, 10, 14, 16, 17, 19, 20, 26, 28, 29], "from": [3, 4, 5, 6, 7, 8, 12, 14, 16, 17, 19, 20, 26, 27, 28], "list": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 23, 24, 28], "abov": [3, 17, 26, 27, 28, 29], "examin": 3, "its": [3, 12, 14, 16, 17, 19, 20, 26, 27, 29], "extens": [3, 4, 5, 6, 7, 8, 20], "howev": [3, 10, 27, 29], "mai": [3, 17, 20, 29], "instanc": 3, "when": [3, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 29], "detect": [3, 14, 26], "fail": [3, 20], "especi": [3, 29], "combin": [3, 10, 14, 17], "i": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29], "rare": 3, "seen": 3, "As": [3, 14, 16, 20, 26, 27], "alwai": [3, 27], "best": [3, 4, 5, 6, 7, 8, 14, 29], "directli": [3, 20, 27, 29], "one": [3, 10, 16, 17, 19, 20, 26, 27], "creat": [3, 10, 12, 14, 17, 20, 27, 28, 29], "your": [3, 12, 16, 17, 20, 26, 27, 28], "ar": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 28, 29], "known": [3, 26, 27], "paramet": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24], "str": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27], "pattern": [3, 4, 5, 6, 7, 8, 27], "tupl": [3, 4, 5, 6, 7, 8, 14, 20, 22], "keyword": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 28], "onli": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 28, 29], "option": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26], "regular": [3, 4, 5, 6, 7, 8, 27], "express": [3, 4, 5, 6, 7, 8, 27], "search": [3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 20, 27, 29], "correspond": [3, 4, 5, 6, 7, 8, 17, 27, 29], "field": [3, 4, 5, 6, 7, 8, 10, 17, 22, 27], "": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 29], "valid": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20], "valu": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 27], "The": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27, 28, 29], "support": [3, 4, 5, 6, 7, 8, 12, 17, 20, 22, 26, 29], "artist": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 27, 28, 29], "titl": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 29], "track_numb": [3, 4, 5, 6, 7, 8, 14, 17, 26], "number": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 27, 28, 29], "exampl": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 27, 28, 29], "match": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 27, 29], "filenam": [3, 4, 5, 6, 7, 8, 20, 26, 27], "like": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 29], "taylor": [3, 4, 5, 6, 7, 8], "swift": [3, 4, 5, 6, 7, 8], "cruel": 3, "summer": 3, "d": [3, 4, 5, 6, 7, 8], "04": [3, 5, 6, 26], "man": 3, "13": [3, 12, 19], "you": [3, 4, 5, 8, 10, 12, 14, 16, 17, 20, 26, 27, 28], "need": [3, 17, 26, 27], "calm": 3, "down": [3, 17, 26], "multivalu": [3, 4, 5, 6, 7, 8, 22], "bool": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22], "determin": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22, 27], "whether": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22], "tag": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 22, 26], "If": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27, 28], "fals": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 26, 27, 28], "item": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 22, 26, 27, 28, 29], "concaten": [3, 4, 5, 6, 7, 8, 22], "separ": [3, 4, 5, 6, 7, 8, 17, 22, 27], "specifi": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27, 28], "sep": [3, 4, 5, 6, 7, 8, 22], "default": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22, 26, 27], "all": [3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 26, 27, 29], "first": [3, 4, 5, 6, 7, 8, 12, 14, 17, 20, 22, 26, 27, 28, 29], "n": [3, 4, 5, 6, 7, 8, 26], "1": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 28, 29], "second": [3, 4, 5, 6, 7, 8, 20, 22, 27], "append": [3, 4, 5, 6, 7, 8, 17, 22, 29], "final": [3, 4, 5, 6, 7, 8, 22, 27, 28, 29], "attribut": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 28], "album": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 28, 29], "album_artist": 3, "artwork": [3, 4, 5, 6, 7, 8, 27], "byte": [3, 14, 17, 20, 27], "represent": 3, "url": [3, 10, 12, 14, 16, 17, 19, 20, 26], "lead": 3, "cover": [3, 4, 5, 6, 7, 8, 17, 20, 26, 27, 28], "bit_depth": [3, 14, 26], "int": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20], "bit": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "per": [3, 10], "sampl": [3, 26, 27, 29], "bitrat": [3, 14, 26, 27], "b": [3, 4, 5, 6, 7, 8, 26], "channel_count": 3, "channel": [3, 27], "comment": [3, 4, 5, 6, 7, 8, 27], "compil": [3, 4, 5, 6, 7, 8, 17, 20, 27], "song": [3, 12, 14, 17, 26], "variou": [3, 29], "compos": [3, 4, 5, 6, 7, 8, 14, 20, 26, 27], "lyric": [3, 4, 5, 6, 7, 8, 15, 16, 20, 27], "writer": [3, 14], "copyright": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 26, 27], "inform": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 28, 29], "date": [3, 14, 17, 20, 27], "releas": [3, 10, 14, 17, 26], "disc_numb": [3, 17, 26], "disc": [3, 4, 5, 6, 7, 8, 27], "disc_count": 3, "total": [3, 14, 17, 19, 20, 26, 29], "genr": [3, 10, 14, 17, 26, 27, 28], "isrc": [3, 14, 17, 19, 20, 26, 27, 29], "intern": 3, "standard": 3, "record": [3, 10, 12, 14, 26], "sample_r": 3, "rate": [3, 10, 27], "hz": [3, 26], "tempo": [3, 4, 5, 6, 7, 8, 17, 27], "beat": [3, 17], "minut": 3, "bpm": [3, 26], "track_count": [3, 14], "method": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27], "none": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 26, 27], "preserv": [3, 4, 5, 6, 7, 8], "true": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 29], "current": [3, 4, 5, 6, 7, 8, 10, 14, 17, 20, 26, 29], "anoth": [3, 4, 5, 6, 7, 8, 10, 27, 28], "requir": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26], "ffmpeg": [3, 4, 5, 6, 7, 8, 26], "automat": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27], "updat": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 25, 26, 27, 28, 29], "reflect": [3, 4, 5, 6, 7, 8], "new": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 28, 29], "For": [3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 19, 20, 26, 27, 29], "chang": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27], "mp4a": [3, 4, 5, 6, 7, 8], "lossi": [3, 4, 5, 6, 7, 8], "wav": [3, 4, 5, 6, 7, 8, 26], "which": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 28], "command": [3, 4, 5, 6, 7, 8, 26], "line": [3, 4, 5, 6, 7, 8, 16, 28], "exclud": [3, 4, 5, 6, 7, 8, 17], "input": [3, 4, 5, 6, 7, 8], "output": [3, 4, 5, 6, 7, 8, 28], "y": [3, 4, 5, 6, 7, 8, 16, 17, 19, 20], "flag": [3, 4, 5, 6, 7, 8, 12], "overwrit": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 27], "c": [3, 4, 5, 6, 7, 8, 26], "v": [3, 4, 5, 6, 7, 8], "copi": [3, 4, 5, 6, 7, 8, 20, 26], "argument": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27, 28], "art": [3, 4, 5, 6, 7, 8, 20, 27, 28], "256k": [3, 4, 5, 6, 7, 8], "libfdk_aac": [3, 4, 5, 6, 7, 8], "wa": [3, 4, 5, 6, 7, 8, 17, 20], "enabl": [3, 4, 5, 6, 7, 8, 10, 14, 17], "libfdk": [3, 4, 5, 6, 7, 8], "libmp3lam": [3, 4, 5, 6, 7, 8], "q": [3, 4, 5, 6, 7, 8, 17], "0": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20, 26, 27, 28, 29], "libopu": [3, 4, 5, 6, 7, 8], "vn": [3, 4, 5, 6, 7, 8, 26], "strict": [3, 4, 5, 6, 7, 8, 14, 26], "experiment": [3, 4, 5, 6, 7, 8], "libvorbi": [3, 4, 5, 6, 7, 8], "pcm_s16le": [3, 4, 5, 6, 7, 8], "pcm_s24le": [3, 4, 5, 6, 7, 8], "depth": [3, 4, 5, 6, 7, 8, 14, 26, 27], "origin": [3, 4, 5, 6, 7, 8, 17, 27], "appropri": [3, 4, 5, 6, 7, 8, 28], "kept": [3, 4, 5, 6, 7, 8, 17], "set_metadata_using_itun": [3, 4, 5, 6, 7, 8, 27], "data": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26, 27, 28, 29], "dict": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 27], "ani": [3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 20, 22], "album_data": [3, 4, 5, 6, 7, 8, 27], "artwork_s": [3, 4, 5, 6, 7, 8], "1400": [3, 4, 5, 6, 7, 8], "artwork_format": [3, 4, 5, 6, 7, 8], "jpg": [3, 4, 5, 6, 7, 8, 20, 26, 28], "popul": [3, 4, 5, 6, 7, 8, 27], "retriev": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26, 27], "itun": [3, 4, 5, 6, 7, 8, 12, 25, 27], "api": [3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 17, 18, 20, 25, 28, 29], "about": [3, 4, 5, 6, 7, 8, 10, 14, 17, 20, 26, 27, 28, 29], "json": [3, 4, 5, 6, 7, 8, 10, 12, 17, 27], "obtain": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26], "via": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26, 27], "searchapi": [3, 4, 5, 6, 7, 8, 27], "lookup": [3, 4, 5, 6, 7, 8, 12, 27, 29], "unavail": [3, 4, 5, 6, 7, 8, 17, 26], "resiz": [3, 4, 5, 6, 7, 8], "size": [3, 4, 5, 6, 7, 8, 17, 19, 20, 26, 27], "pixel": [3, 4, 5, 6, 7, 8, 20], "raw": [3, 4, 5, 6, 7, 8], "uncompress": [3, 4, 5, 6, 7, 8], "high": [3, 4, 5, 6, 7, 8, 14, 20], "resolut": [3, 4, 5, 6, 7, 8, 14, 20], "imag": [3, 4, 5, 6, 7, 8, 10, 14, 17, 19, 20, 26], "regardless": [3, 4, 5, 6, 7, 8], "png": [3, 4, 5, 6, 7, 8], "take": [3, 4, 5, 6, 7, 8, 10, 17, 27], "preced": [3, 4, 5, 6, 7, 8], "exist": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20], "should": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 22], "overwritten": [3, 4, 5, 6, 7, 8], "set_metadata_using_spotifi": [3, 4, 5, 6, 7, 8, 27], "audio_featur": [3, 4, 5, 6, 7, 8, 17, 27], "spotifi": [3, 4, 5, 6, 7, 8, 16, 17, 20, 25, 27], "web": [3, 4, 5, 6, 7, 8, 10, 14, 15, 16, 17, 20, 27, 28, 29], "servic": [3, 4, 5, 6, 7, 8, 15, 16, 17, 20, 25, 27, 29], "webapi": [3, 4, 5, 6, 7, 8, 27, 28, 29], "get_track": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20], "featur": [3, 4, 5, 6, 7, 8, 14, 17, 27, 29], "get_track_audio_featur": [3, 4, 5, 6, 7, 8, 17, 27], "time": [3, 4, 5, 6, 7, 8, 10, 14, 16, 17, 19, 20, 26, 27], "sync": [3, 4, 5, 6, 7, 8, 16, 20], "privatelyricsservic": [3, 4, 5, 6, 7, 8], "get_lyr": [3, 4, 5, 6, 7, 8, 16], "set_metadata_using_tid": [3, 4, 5, 6, 7, 8, 27], "1280": [3, 4, 5, 6, 7, 8], "tidal": [3, 4, 5, 6, 7, 8, 14, 19, 20, 25, 27], "privateapi": [3, 4, 5, 6, 7, 8, 27, 29], "get_album": [3, 4, 5, 6, 7, 8, 14, 17, 19, 20], "maximum": [3, 4, 5, 6, 7, 8, 14, 17, 20], "80": [3, 4, 5, 6, 7, 8], "get_track_compos": [3, 4, 5, 6, 7, 8, 20, 27], "get_track_contributor": [3, 4, 5, 6, 7, 8, 20], "get_track_credit": [3, 4, 5, 6, 7, 8, 20], "songwrit": [3, 4, 5, 6, 7, 8, 20, 26, 27], "credit": [3, 4, 5, 6, 7, 8, 10, 14, 20, 27], "get_track_lyr": [3, 4, 5, 6, 7, 8, 20, 27], "descript": [3, 4, 5, 6, 7, 8, 10, 14, 17, 20, 26, 29], "set_metadata_using_qobuz": [3, 4, 5, 6, 7, 8], "larg": [3, 4, 5, 6, 7, 8, 14, 17, 20, 26], "qobuz": [3, 4, 5, 6, 7, 8, 14, 25], "small": [3, 4, 5, 6, 7, 8, 14, 17, 20, 26], "thumbnail": [3, 4, 5, 6, 7, 8, 14, 26], "audio": [4, 5, 6, 7, 8, 12, 14, 17, 20, 25, 30], "_vorbiscom": [4, 7], "full": [4, 5, 6, 7, 8, 10, 14, 17, 20], "see": [4, 5, 6, 7, 8, 10, 12, 17, 19, 20, 27, 28, 29], "pathlib": [4, 5, 6, 7, 8, 20, 26, 27], "path": [4, 5, 6, 7, 8, 14, 20, 26, 27], "fearless": 4, "03": [4, 7, 27], "love": 4, "stori": [4, 6, 14, 28], "06": [4, 5, 7, 8, 26, 27], "belong": 4, "me": [4, 8, 26], "write_metadata": [4, 5, 6, 7, 8, 26, 27], "write": [4, 5, 6, 7, 8, 26, 27], "_id3": [5, 8], "red": 5, "knew": 5, "were": [5, 17], "troubl": [5, 28], "22": [5, 20], "mine": 6, "speak": 6, "now": [6, 26, 27], "07": [6, 27], "u": [6, 12, 17, 19, 20, 26, 27, 28], "blank": 7, "space": [7, 12], "style": [7, 10, 28], "shake": 7, "It": [7, 10, 12, 16, 17, 19, 20], "off": [7, 17], "don": [8, 26, 27, 28], "t": [8, 17, 26, 27, 28], "blame": 8, "05": [8, 20, 26], "delic": 8, "look": [8, 12, 20, 27, 29], "what": [8, 17], "made": [8, 10, 17, 26, 28], "do": [8, 26, 27, 29], "complet": [11, 14, 15, 17, 18, 27], "implement": [10, 11, 13, 15, 17, 18, 26, 29], "endpoint": [10, 11, 14, 15, 16, 17, 18, 19, 20, 26, 27], "client": [10, 12, 14, 16, 17, 19, 20, 26, 28, 29], "allow": [12, 14, 17, 20, 27, 29], "varieti": 12, "content": [12, 14, 17, 19, 20], "app": [12, 14, 17, 26], "ibook": 12, "movi": 12, "podcast": [12, 17], "music": [10, 12, 17, 20, 25, 27, 28, 30], "video": [10, 12, 19, 20], "audiobook": [12, 17], "tv": [12, 20, 26], "show": [12, 17, 26, 27], "within": [12, 17], "mac": 12, "also": [10, 12, 14, 16, 17, 19, 20, 26, 27], "id": [10, 12, 14, 16, 17, 19, 20, 26, 27, 28, 29], "request": [10, 12, 14, 16, 17, 19, 20, 26], "map": 12, "librari": [12, 17, 25, 27, 28, 30], "digit": [10, 12], "catalog": [10, 12, 14, 17, 19, 20, 27, 29], "more": [10, 12, 17, 18, 19, 20, 28, 29], "document": [12, 14, 16, 20], "api_url": [10, 12, 14, 17, 19, 20], "term": [12, 14, 16, 20], "countri": [10, 12, 14, 17, 19, 20, 26], "media": [12, 14, 20, 26, 29], "entiti": [10, 12, 17, 20, 26, 29], "limit": [10, 12, 14, 17, 19, 20, 26, 28, 29], "lang": 12, "version": [10, 12, 14, 20, 26, 29], "explicit": [12, 17, 20, 26], "text": [12, 16, 17, 20], "string": [12, 14, 17, 23, 24, 27], "replac": [12, 17, 26, 27], "plu": [12, 20, 26], "charact": [12, 19], "except": [12, 22, 27, 29], "letter": 12, "period": [12, 14], "dash": 12, "underscor": [12, 17], "_": [12, 26, 27], "asterisk": 12, "jack": 12, "johnson": 12, "two": [12, 17, 27, 28], "want": [10, 12, 17, 27, 28], "front": 12, "iso": [12, 16, 17, 19, 20], "obp": 12, "type": [10, 12, 14, 17, 19, 20, 26, 27, 29], "musicvideo": 12, "shortfilm": 12, "tvshow": 12, "softwar": [12, 20], "ebook": 12, "result": [10, 12, 14, 17, 19, 20, 26, 27, 29], "return": [10, 12, 14, 16, 17, 19, 20, 22, 23, 24, 26, 27, 29], "rel": [12, 28], "avail": [10, 12, 14, 16, 17, 19, 20, 27, 28, 29], "tabl": 12, "2": [12, 17, 19, 20, 26, 27, 28], "associ": [10, 12, 14, 16, 17, 19, 20], "movieartist": 12, "name": [10, 12, 14, 17, 19, 20, 26, 27, 29], "allartist": 12, "allartistterm": 12, "Then": [12, 28, 29], "maroon": 12, "5": [10, 12, 14, 17, 28, 29], "instead": [12, 17, 20, 26, 28], "who": [10, 12], "have": [10, 12, 14, 16, 17, 20, 26, 27, 29], "ever": 12, "word": [12, 14, 16], "must": [10, 12, 14, 16, 17, 19, 20, 29], "200": [12, 19, 26], "50": [12, 14, 17, 20, 26, 28], "languag": [12, 14, 16, 17], "english": [12, 17], "japanes": 12, "five": 12, "codenam": 12, "en_u": 12, "ja_jp": 12, "kei": [10, 12, 14, 17, 20], "receiv": 12, "back": [12, 14, 27], "A": [12, 14, 17, 19, 20, 26, 27], "indic": [12, 17], "ye": 12, "To": [10, 12, 14, 17, 19, 20, 26, 27], "short": 12, "film": 12, "25": [10, 12, 14, 27], "jim": 12, "jone": 12, "canada": [10, 12], "ca": [12, 17, 26], "applic": [10, 12, 14, 17, 19, 20, 26, 28], "yelp": 12, "unit": 12, "state": [12, 17], "amg_artist_id": 12, "amg_album_id": 12, "amg_video_id": 12, "bundle_id": 12, "upc": [12, 14, 17, 19, 20, 26, 29], "isbn": 12, "sort": [10, 12, 20], "amg": 12, "ean": [12, 17, 19], "faster": 12, "fewer": 12, "posit": [10, 12, 14, 17, 20, 26, 28], "bundl": 12, "appli": [12, 17, 19], "recent": [12, 14, 17], "up": [12, 14, 17, 20, 28, 29], "909253": 12, "284910350": 12, "468749": 12, "multipl": [12, 17, 19, 29], "5723": 12, "get": [10, 12, 14, 16, 17, 19, 20, 27, 29, 30], "each": [12, 17, 20, 26], "top": [12, 17, 20, 26, 28], "most": [12, 14, 26, 27], "720642462928": 12, "15175": 12, "15176": 12, "15177": 12, "15178": 12, "15183": 12, "15184": 12, "15187": 12, "15190": 12, "15191": 12, "15195": 12, "15197": 12, "15198": 12, "17120": 12, "book": 12, "9780316069359": 12, "com": [10, 12, 20, 26, 28], "yelpiphon": 12, "minimum": [13, 17, 18], "privat": [10, 13, 14, 15, 17, 18, 20, 27, 28, 29], "app_id": [14, 26], "app_secret": [14, 26], "flow": [10, 14, 17, 19, 20, 26, 29], "browser": [10, 14, 16, 20, 26, 29], "user_ag": [14, 20], "email": [10, 14, 17, 20, 26], "password": [14, 26, 29], "auth_token": [14, 26], "save": [10, 14, 16, 17, 19, 20], "collect": [10, 14, 17, 20, 21], "playlist": [14, 17, 20, 28], "perform": [10, 14, 20, 26, 29], "queri": [10, 14, 17, 19, 20, 27], "them": [14, 17, 20, 26, 28, 29], "offici": [14, 17, 20], "been": [14, 16, 17, 20, 26, 27], "watch": [14, 16, 20], "http": [10, 14, 16, 17, 20, 26, 28, 29], "network": [14, 16, 20], "traffic": [14, 16, 20, 26], "design": [14, 16, 17, 20], "publicli": [14, 16, 20], "access": [10, 14, 16, 17, 19, 20, 26, 28, 29], "disabl": [10, 14, 16, 17, 19, 20], "remov": [14, 16, 17, 20, 26], "ensur": [10, 14, 16, 17, 20], "complianc": [14, 16, 20], "while": [14, 17, 20, 27], "necessari": [14, 17, 20, 26, 29], "public": [10, 14, 17, 18, 20, 26, 28, 29], "person": [10, 14, 17, 20], "stream": [14, 17, 20, 29], "activ": [10, 14, 17, 20, 26], "In": [14, 16, 17, 19, 20, 28, 29], "latter": [14, 20], "case": [14, 16, 17, 19, 20, 26, 29], "accompani": [10, 14, 16, 17, 19, 20, 26], "token": [10, 14, 16, 17, 19, 20, 26], "header": [14, 16, 17, 19, 20], "grant": [14, 17], "inher": 14, "unsaf": 14, "sinc": [14, 17, 28], "ha": [14, 26, 27], "mechan": 14, "multifactor": 14, "brute": 14, "forc": 14, "attack": 14, "highli": [14, 17], "encourag": 14, "yourself": 14, "through": [14, 17], "player": [14, 16, 17, 20, 26, 27], "android": [14, 20, 26], "io": [14, 20, 26], "maco": [14, 20, 26], "window": [14, 20, 26], "secret": [10, 14, 17, 19, 20], "constructor": [10, 14, 16, 17, 19, 20, 26, 27, 28], "credenti": [10, 14, 17, 19, 20, 26, 28, 29], "qobuz_private_app_id": 14, "qobuz_private_app_secret": 14, "oper": [10, 14, 16, 17, 19, 20, 25], "system": [10, 14, 16, 17, 19, 20, 28], "environ": [10, 14, 16, 17, 19, 20, 26, 28, 29], "variabl": [10, 14, 16, 17, 19, 20, 26, 28, 29], "thei": [14, 17, 26, 28, 29], "set_flow": [10, 14, 17, 19, 20], "set_auth_token": 14, "respect": [10, 14, 16, 17, 19, 20, 23, 24, 26, 27, 28, 29], "manag": [10, 14, 16, 17, 19, 20], "properti": [10, 14, 16, 17, 19, 20, 27], "acquir": [10, 14, 16, 17, 19, 20], "configur": [10, 14, 16, 17, 19, 20, 28], "load": [10, 14, 16, 17, 19, 20, 27, 28], "next": [10, 14, 16, 17, 19, 20, 26, 27], "behavior": [10, 14, 16, 17, 19, 20, 27], "secur": [10, 14, 16, 17, 19, 20], "concern": [10, 14, 16, 17, 19, 20], "comput": [10, 14, 16, 17, 19, 20, 23, 24], "being": [10, 14, 16, 17, 19, 20], "share": [10, 14, 16, 17, 19, 20], "devic": [10, 14, 16, 17, 19, 20, 26, 28, 29], "author": [10, 14, 19, 26], "open": [10, 14, 17, 20, 26, 28, 29], "login": [14, 26], "page": [10, 14, 17, 19, 20, 26], "playwright": [10, 14, 17, 20], "framework": [10, 14, 17, 20, 26], "microsoft": [10, 14, 17, 20], "account": [10, 14, 17, 20, 26], "agent": [14, 20], "send": [10, 14, 16, 17, 19, 20], "address": [14, 20], "here": [10, 14, 16, 17, 19, 20, 26], "found": [10, 14, 16, 17, 19, 20, 28], "process": [10, 14, 16, 17, 19, 20, 26, 27, 29], "bypass": [10, 14, 16, 17, 19, 20], "newli": [10, 14, 16, 17, 19, 20, 29], "web_url": [14, 20], "set": [10, 14, 16, 17, 19, 20, 28, 29], "album_id": [14, 19, 20, 29], "singl": [10, 14, 17, 19, 27], "0060254735180": 14, "maximum_bit_depth": [14, 26], "media_count": [14, 26], "albums_count": [14, 26], "slug": [14, 26], "pictur": [14, 19, 20, 26], "role": [10, 14, 20], "released_at": [14, 26], "label": [10, 14, 17, 26], "supplier_id": [14, 26], "qobuz_id": [14, 26], "durat": [10, 14, 17, 19, 20, 26], "parental_warn": [14, 26], "popular": [14, 17, 19, 20, 25, 26, 27], "tracks_count": [14, 26, 29], "color": [14, 16, 20, 26], "maximum_channel_count": [14, 26], "maximum_sampling_r": [14, 26], "articl": [14, 20], "release_date_origin": [14, 26], "release_date_download": [14, 26], "release_date_stream": [14, 26], "purchas": [14, 26], "streamabl": [14, 26], "preview": [14, 20, 26, 27], "sampleabl": [14, 26], "download": [14, 17, 20, 26], "display": [14, 26], "purchasable_at": [14, 26], "streamable_at": [14, 26], "hire": [14, 26], "hires_stream": [14, 26], "award": 14, "description_languag": 14, "goodi": 14, "area": 14, "catchlin": 14, "created_at": [14, 26], "genres_list": 14, "is_offici": 14, "maximum_technical_specif": 14, "product_sales_factors_monthli": 14, "product_sales_factors_weekli": 14, "product_sales_factors_yearli": 14, "product_typ": 14, "product_url": 14, "recording_inform": 14, "relative_url": 14, "release_tag": 14, "release_typ": 14, "subtitl": [14, 20], "offset": [14, 17, 19, 20, 26], "audio_info": [14, 26], "replaygain_track_peak": [14, 26], "float": [10, 14, 17, 20, 23, 24], "replaygain_track_gain": [14, 26], "work": [10, 14, 20, 26], "media_numb": [14, 26], "release_date_purchas": [14, 26], "get_featured_album": 14, "seller": 14, "editor": 14, "pick": 14, "ideal": [14, 26], "discographi": 14, "press": [14, 26], "qobuzissim": 14, "harmonia": 14, "mundi": 14, "univers": 14, "classic": [14, 17], "jazz": 14, "jeuness": 14, "chanson": 14, "index": [14, 17, 20], "get_artist": [10, 14, 17, 19, 20], "artist_id": [10, 14, 19, 20, 29], "extra": 14, "tracks_appears_on": 14, "albums_with_last_releas": 14, "effect": 14, "albums_as_primary_artist_count": 14, "albums_as_primary_composer_count": 14, "medium": [14, 20, 26], "extralarg": [14, 26], "mega": [14, 26], "similar_artist_id": 14, "biographi": [14, 20], "summari": [14, 20], "get_label": [10, 14], "label_id": [10, 14], "1153": 14, "get_playlist": [14, 17, 20, 26, 29], "playlist_id": [14, 17], "15732665": 14, "image_rectangle_mini": 14, "featured_artist": 14, "timestamp_posit": 14, "images300": [14, 26], "updated_at": [14, 26], "percent": 14, "image_rectangl": 14, "owner": [14, 17, 26], "users_count": [14, 26], "images150": [14, 26], "is_collabor": [14, 26, 29], "featured_tag_id": 14, "name_json": 14, "genre_tag": 14, "is_discov": 14, "public_at": [14, 26], "is_publ": [14, 26, 29], "is_featur": [14, 26], "null": 14, "playlist_track_id": [14, 26], "get_featured_playlist": [14, 17], "last": [10, 14, 17, 20, 22, 27, 28, 29], "get_user_playlist": [14, 17, 20, 26, 29], "custom": [14, 17, 28], "favorit": [14, 28], "500": [14, 20, 26], "is_publish": 14, "published_to": [14, 26], "welcom": 14, "published_from": [14, 26], "create_playlist": [14, 17, 20, 26, 28, 29], "collabor": [14, 17, 26, 29], "brief": [14, 20], "update_playlist": [14, 20, 26], "privaci": [14, 20], "own": [10, 14, 17, 20], "17737508": 14, "update_playlist_posit": 14, "from_playlist_id": 14, "to_playlist_id": 14, "organ": [14, 27], "move": [14, 17, 20], "swap": 14, "17737509": 14, "add_playlist_track": [14, 26, 29], "track_id": [14, 16, 19, 20], "duplic": 14, "add": [14, 17, 20, 26, 28, 29], "24393122": 14, "24393138": 14, "ad": [10, 14, 17, 20, 26, 29], "move_playlist_track": 14, "insert_befor": [14, 17], "same": [14, 17, 29], "delete_playlist_track": 14, "delet": [10, 14, 17, 20], "delete_playlist": [14, 20, 26], "favorite_playlist": [14, 20], "subscrib": 14, "unfavorite_playlist": [14, 20], "unsubscrib": 14, "hi_r": [14, 20], "new_releas": 14, "10": [14, 17, 19, 20, 26], "categori": [14, 17, 20, 26], "mainartist": [14, 26], "releasenam": [14, 26], "exact": 14, "phrase": 14, "focu": 14, "name_superbloc": 14, "accroch": 14, "genre_id": 14, "root_categori": 14, "abstract": 14, "image_origin": 14, "category_id": [14, 17], "source_imag": 14, "published_at": 14, "section_slug": 14, "description_short": 14, "display_d": 14, "get_track_perform": 14, "unformat": 14, "call": [14, 26], "filter": [10, 14, 17, 20], "special": 14, "composerlyricist": [14, 26], "lyricist": [14, 20], "featuredartist": 14, "produc": [14, 26], "co": [14, 26], "mixer": 14, "musicpublish": 14, "etc": [14, 20, 29], "dictionari": [14, 17, 19, 20], "contributor": [10, 14, 20, 26], "snake": 14, "get_track_file_url": 14, "format_id": 14, "27": 14, "playback": [14, 17, 20], "hi": [14, 20], "re": [10, 14, 20, 26], "qualiti": [14, 20], "constant": 14, "320": [14, 20, 26], "kbp": [14, 20], "6": [14, 17], "cd": [14, 26], "16": [14, 20, 26, 27], "44": [14, 20, 26], "khz": [14, 20], "7": [14, 26], "24": [14, 20, 26], "96": [14, 20], "192": 14, "mime_typ": 14, "restrict": [14, 17], "sampling_r": 14, "get_curated_track": 14, "weekli": 14, "curat": [14, 20], "baselin": 14, "step_pagin": 14, "graphic": 14, "background": [14, 16], "foreground": 14, "generated_at": 14, "expires_on": 14, "get_track_stream": [14, 20], "mime": [14, 20], "get_collection_stream": [14, 20], "get_profil": [10, 14, 17, 20], "profil": [10, 14, 17, 20, 26], "publicid": 14, "firstnam": [14, 20], "lastnam": [14, 20], "display_nam": [14, 17], "country_cod": [14, 19, 20], "language_cod": 14, "zone": 14, "avatar": 14, "ag": [14, 26], "creation_d": 14, "offer": 14, "start_dat": 14, "end_dat": 14, "is_cancel": 14, "household_size_max": 14, "lossy_stream": 14, "lossless_stream": 14, "hires_purchases_stream": 14, "mobile_stream": 14, "offline_stream": 14, "hfp_purchas": 14, "included_format_group_id": 14, "color_schem": 14, "logo": 14, "short_label": 14, "last_upd": 14, "favorite_album": [14, 20, 29], "favorite_artist": [14, 20, 29], "favorite_track": [14, 20, 28], "store_featur": 14, "editori": 14, "club": 14, "wallet": 14, "weeklyq": 14, "autoplai": 14, "inapp_purchase_subscripton": 14, "opt_in": 14, "music_import": 14, "get_favorit": [14, 29], "get_purchas": 14, "favorite_item": [14, 29], "unfavorite_item": 14, "unfavorit": 14, "sp_dc": [16, 17, 26], "access_token": [10, 16, 17, 19, 20, 26], "expiri": [16, 17, 19, 20, 26], "datetim": [16, 17, 19, 20], "power": [10, 16, 26], "musixmatch": 16, "petitlyr": 16, "japan": 16, "interfac": [10, 16, 25], "so": [16, 17, 19, 20, 26, 27, 28, 29], "develop": [10, 16, 20], "cooki": [16, 17, 26], "either": [10, 16, 17, 19, 20, 26, 28], "spotify_sp_dc": [16, 17, 26], "extract": [16, 20], "local": [16, 17, 27], "storag": [16, 26], "after": [16, 17], "log": [16, 26], "exchang": [16, 17, 20], "recommend": [10, 16, 17, 19, 20, 29, 30], "other": [10, 16, 17, 19, 20, 26, 27], "authent": [16, 17, 19, 26, 28, 29], "relat": [16, 17, 19, 20, 26], "expir": [16, 17, 19, 20, 26], "set_sp_dc": 16, "set_access_token": [10, 16, 17, 19, 20], "former": [16, 17, 19, 20], "relev": [16, 17, 19, 20, 29], "refresh": [16, 17, 19, 20, 26], "8601": [16, 17, 19, 20], "m": [16, 17, 19, 20, 26], "dt": [16, 17, 19, 20], "h": [16, 17, 19, 20], "sz": [16, 17, 19, 20, 26], "user": [16, 17, 19, 26, 28, 29], "reauthent": [16, 17, 19, 20], "lyrics_url": 16, "token_url": [16, 17, 19, 20], "session": [10, 16, 17, 19, 20], "timestamp": [16, 17, 19, 20], "0vjijw4gluzamyd2vxmi3b": 16, "synctyp": 16, "starttimem": 16, "syllabl": 16, "endtimem": 16, "providerlyricsid": [16, 20], "providerdisplaynam": 16, "synclyricsuri": 16, "isdensetypefac": 16, "altern": [16, 17, 29], "isrtllanguag": 16, "fullscreenact": 16, "showupsel": 16, "highlighttext": 16, "hasvocalremov": 16, "client_id": [17, 19, 20, 26], "client_secret": [17, 19, 20, 26], "web_play": 17, "port": [10, 17, 26], "8888": [10, 17, 26], "redirect_uri": [10, 17], "refresh_token": [17, 20, 26], "creation": 17, "interact": [17, 28], "control": 17, "visual": [17, 28], "form": [10, 17], "refer": [17, 19, 23, 24], "without": [10, 17, 20, 26, 27], "proof": [17, 20], "pkce": [17, 20, 26, 29], "These": [17, 20], "oauth": [10, 17, 19, 20], "spotify_client_id": [17, 26], "spotify_client_secret": [17, 26], "guid": [17, 19], "how": [17, 19, 27], "advantag": [10, 17], "function": [10, 17, 19, 20], "redirect": [10, 17, 26], "uri": [10, 17, 20, 26], "localhost": [10, 17, 26], "callback": [10, 17, 20, 26], "where": [10, 17], "approach": [17, 26], "resort": 17, "deprec": 17, "unless": 17, "authorization_cod": 17, "client_credenti": [17, 19, 20], "server": [10, 17, 26, 29], "built": [10, 17], "flask": [10, 17], "get_scop": [17, 26, 29], "possibl": [17, 19, 20], "auth_url": [10, 17, 20], "web_player_token_url": 17, "classmethod": 17, "ugc": 17, "upload": 17, "spotify_connect": 17, "connect": 17, "read": [17, 28], "modifi": 17, "plai": 17, "remot": 17, "follow": [17, 20, 26, 28, 29], "listening_histori": 17, "histori": 17, "substr": 17, "e": [17, 26], "market": 17, "4aawyab9vmqn3uq7fjrgti": 17, "3166": [17, 19, 20], "alpha": [17, 19, 20], "prioriti": 17, "over": 17, "neither": 17, "consid": 17, "album_typ": [17, 26], "total_track": [17, 26, 29], "available_market": [17, 26], "external_url": [17, 26], "href": [17, 26], "height": [10, 17, 19, 20, 26, 28], "width": [10, 17, 19, 20, 26, 28], "release_d": [17, 26], "release_date_precis": [17, 26], "reason": 17, "external_id": [17, 26, 29], "previou": [17, 20, 26, 27], "duration_m": [17, 26], "is_play": 17, "linked_from": 17, "preview_url": [17, 26], "is_loc": [17, 26], "sever": 17, "identifi": [10, 17, 26], "comma": 17, "20": 17, "382obepsp2rxgrnsizn5tx": 17, "1a2gtwgtffwp7ksqtwwoyo": 17, "2norn2aes5aonvsu6iwthc": 17, "get_album_track": 17, "000": [17, 26], "get_saved_album": [17, 29], "added_at": [17, 26], "save_album": [17, 29], "remove_saved_album": 17, "check_saved_album": 17, "check": [10, 17], "alreadi": [17, 20, 26, 27], "arrai": 17, "boolean": 17, "get_new_album": 17, "shown": 17, "brows": 17, "tab": 17, "particular": [10, 17], "omit": 17, "se": [17, 26], "album_group": 17, "uniqu": [17, 27], "0tnoyisbd1xyrbk9myaseg": 17, "2cimqhirsu0mqqyyhq0eox": 17, "57dn52uhvrhoxijzpigu3": 17, "1vcwhac5f2us3yhpwwbia6": 17, "get_artist_album": [17, 19, 20], "include_group": 17, "suppli": 17, "promot": 17, "appears_on": 17, "appear": [10, 17, 20, 27], "main": [17, 19, 26, 29], "get_artist_top_track": [17, 20], "get_related_artist": 17, "similar": [17, 19, 20, 23, 24, 28, 29], "given": [10, 17, 19], "analysi": 17, "commun": [10, 17], "listen": 17, "get_audiobook": 17, "uk": 17, "ireland": 17, "zealand": 17, "australia": 17, "7ihfbu1ypacw6ozpafjtq": 17, "html_descript": 17, "edit": [10, 17, 20, 30], "media_typ": 17, "narrat": 17, "publish": 17, "total_chapt": 17, "chapter": 17, "audio_preview_url": 17, "chapter_numb": 17, "resume_point": 17, "fully_plai": 17, "resume_position_m": 17, "episod": [17, 26], "18yvqkdbdrvs24c0ilj2ci": 17, "1hgw3j3nxzo1tp1bttvhpz": 17, "get_audiobook_chapt": 17, "get_saved_audiobook": 17, "save_audiobook": 17, "remove_saved_audiobook": 17, "check_saved_audiobook": 17, "get_categori": 17, "dinner": 17, "desir": [17, 20], "consist": 17, "639": 17, "join": [10, 17], "american": 17, "es_mx": 17, "spanish": 17, "mexico": 17, "icon": 17, "nformat": 17, "get_chapt": 17, "0d5wendkdwbqlrhoaj9g29": 17, "0isxvp0jmcb2adse338gkk": 17, "3zxb8fkzgu0ehalyx6uczu": 17, "get_episod": 17, "512ojhouo1ktjprkbvckyq": 17, "is_externally_host": 17, "total_episod": 17, "77o6bivlym3msb4mmil1jh": 17, "0q86acnrm6v9gyx55sxkwf": 17, "get_saved_episod": 17, "save_episod": 17, "remove_saved_episod": 17, "check_saved_episod": 17, "get_genre_se": 17, "seed": [17, 28], "get_recommend": [17, 28], "acoust": 17, "afrobeat": 17, "get_market": 17, "br": [17, 26], "IT": [17, 26], "get_playback_st": 17, "additional_typ": 17, "progress": 17, "besid": 17, "introduc": 17, "maintain": [17, 26], "might": 17, "futur": 17, "is_act": 17, "is_private_sess": 17, "is_restrict": 17, "volume_perc": 17, "repeat_st": 17, "shuffle_st": 17, "context": 17, "progress_m": 17, "is_plai": 17, "currently_playing_typ": 17, "action": 17, "interrupting_playback": 17, "paus": 17, "resum": 17, "seek": 17, "skipping_next": 17, "skipping_prev": 17, "toggling_repeat_context": 17, "toggling_shuffl": 17, "toggling_repeat_track": 17, "transferring_playback": 17, "transfer_playback": 17, "device_id": 17, "transfer": [17, 30], "start": [17, 27, 28, 29], "although": 17, "accept": 17, "than": [17, 26, 27], "400": 17, "bad": 17, "74aszwbe4lxaubb36ztrgx": 17, "happen": [17, 27], "get_devic": 17, "get_currently_plai": 17, "start_playback": 17, "context_uri": 17, "position_m": 17, "target": [17, 19, 20], "0d1841b0976bae2a3a310dd74c0f3df354899bc8": 17, "1je1imulbxcx1fz0we7opt": 17, "4iv5w9uyedyuva79axb7rh": 17, "1301wleyt98msxvhpzca6m": 17, "zero": 17, "neg": 17, "repres": 17, "sixth": 17, "millisecond": 17, "pass": [17, 26, 27, 28], "greater": 17, "length": 17, "caus": 17, "pause_playback": 17, "skip_to_next": 17, "skip": [17, 20, 26], "queue": 17, "skip_to_previ": 17, "seek_to_posit": 17, "25000": 17, "set_repeat_mod": 17, "repeat": [17, 27], "mode": [17, 20], "turn": 17, "set_playback_volum": 17, "volum": 17, "100": [17, 20, 26, 28], "inclus": 17, "toggle_playback_shuffl": 17, "toggl": 17, "shuffl": 17, "get_recently_plai": 17, "befor": [17, 26, 27, 29], "doesn": 17, "unix": 17, "cursor": [17, 20], "1484811043508": 17, "played_at": 17, "get_queu": 17, "make": [10, 17, 19, 20, 26, 28], "currently_plai": 17, "add_to_queu": 17, "end": 17, "3ceypja9oz9gipac4ash4n": 17, "dot": [17, 26], "non": 17, "reoccur": 17, "parenthes": 17, "drill": 17, "nest": 17, "prefix": 17, "exclam": 17, "mark": 17, "just": 17, "added_bi": [17, 26], "adder": 17, "snapshot_id": [17, 26], "change_playlist_detail": [17, 26], "detail": [10, 17, 19, 29], "cours": 17, "my": [17, 20, 26], "becom": 17, "abl": 17, "displai": [17, 28], "get_playlist_item": [17, 20, 29], "add_playlist_item": [17, 20, 26, 28, 29], "exce": 17, "bodi": 17, "insert": 17, "order": [10, 17, 20], "third": [17, 29], "snapshot": 17, "update_playlist_item": 17, "range_start": 17, "range_length": 17, "reorder": 17, "depend": [17, 26], "clear": 17, "mutual": 17, "exclus": 17, "togeth": 17, "simpli": [17, 26], "9": 17, "amount": 17, "rang": 17, "begin": 17, "subsequ": 17, "against": 17, "remove_playlist_item": 17, "even": [10, 17, 27], "user_id": [17, 20], "smedjan": 17, "empti": 17, "until": 17, "doe": [10, 17, 20, 26, 27, 29], "coolest": 17, "yyyi": 17, "mm": 17, "ddthh": 17, "ss": 17, "tailor": 17, "dai": [17, 26], "revert": 17, "utc": 17, "2014": 17, "23t09": 17, "00": [17, 26, 27], "whose": [10, 17], "am": [10, 17, 26], "messag": [17, 19, 26], "get_category_playlist": 17, "get_playlist_cover_imag": 17, "dimens": 17, "add_playlist_cover_imag": [17, 28], "base64": [17, 28], "jpeg": 17, "payload": 17, "256": [17, 26], "kb": 17, "narrow": 17, "year": [10, 17], "hipster": 17, "certain": 17, "g": [17, 20], "1955": 17, "1960": 17, "past": [17, 26], "week": 17, "lowest": [17, 27], "remast": 17, "doxi": 17, "mile": 17, "davi": 17, "across": [17, 29], "hit": [17, 26], "both": [17, 20, 26], "get_show": 17, "38bs44xjbvvz3no3byf1dj": 17, "5cfcwki5pz28u0uozxkdh": 17, "5as3akmn2k11yfdddsrvaz": 17, "get_show_episod": 17, "get_saved_show": 17, "save_show": 17, "remove_saved_show": 17, "check_saved_show": 17, "11dfghvxanmlkmjxsncbnl": 17, "7oumywpwj422jrcdaszb7p": 17, "4vqporuhp5edpber92t6lq": 17, "2takcwoaazwixqijphix7b": 17, "get_saved_track": [17, 28], "save_track": 17, "remove_saved_track": 17, "check_saved_track": 17, "analysis_url": 17, "danceabl": 17, "energi": 17, "instrument": 17, "live": 17, "loud": 17, "speechi": 17, "time_signatur": 17, "track_href": 17, "valenc": 17, "get_tracks_audio_featur": 17, "get_track_audio_analysi": 17, "low": [17, 20], "level": 17, "describ": 17, "structur": 17, "rhythm": 17, "pitch": 17, "timbr": 17, "audio_analysi": 17, "meta": 17, "analyzer_vers": 17, "platform": 17, "detailed_statu": 17, "status_cod": 17, "analysis_tim": 17, "input_process": 17, "num_sampl": 17, "sample_md5": 17, "offset_second": 17, "window_second": 17, "analysis_sample_r": 17, "analysis_channel": 17, "end_of_fade_in": 17, "start_of_fade_out": 17, "tempo_confid": 17, "time_signature_confid": 17, "key_confid": 17, "mode_confid": 17, "codestr": 17, "code_vers": 17, "echoprintstr": 17, "echoprint_vers": 17, "synchstr": 17, "synch_vers": 17, "rhythmstr": 17, "rhythm_vers": 17, "bar": 17, "confid": 17, "section": [10, 17, 26], "segment": 17, "loudness_start": 17, "loudness_max": 17, "loudness_max_tim": 17, "loudness_end": 17, "tatum": 17, "seed_artist": 17, "seed_genr": 17, "seed_track": [17, 28], "suffici": 17, "pool": 17, "veri": [17, 27], "obscur": 17, "enough": 17, "train": 17, "machin": 17, "learn": 17, "ai": 17, "model": 17, "4nhqugzhttlfvgf5szeslk": 17, "0c6xiddpze81m2q797orda": 17, "unusu": 17, "imposs": 17, "debug": [17, 26], "tunabl": [17, 28], "afterfilterings": 17, "afterrelinkings": 17, "initialpools": 17, "usernam": [10, 17, 20], "explicit_cont": 17, "filter_en": 17, "filter_lock": 17, "product": [17, 26], "get_top_item": 17, "time_rang": 17, "calcul": 17, "affin": 17, "frame": 17, "long_term": 17, "medium_term": 17, "approxim": 17, "month": 17, "short_term": 17, "get_user_profil": [17, 20], "follow_playlist": 17, "unfollow_playlist": [17, 26], "unfollow": [17, 20], "get_followed_artist": [17, 29], "0i2xqvxqhscxjhhk6ayyr": 17, "follow_peopl": [17, 29], "sent": 17, "unfollow_peopl": 17, "check_followed_peopl": 17, "check_playlist_follow": 17, "jmperezperez": 17, "thelinmichael": 17, "wizzler": 17, "robust": 18, "expos": 19, "build": [10, 19, 27, 28], "tidal_client_id": [19, 26], "tidal_client_secret": [19, 26], "regist": [10, 19, 26], "set_auflow": 19, "251380836": [19, 20], "barcodeid": 19, "released": [19, 20, 26], "imagecov": 19, "videocov": [19, 20, 26], "numberofvolum": [19, 20], "numberoftrack": [19, 20, 26, 29], "numberofvideo": [19, 20, 26], "mediametadata": [19, 20, 26], "275646830": [19, 20], "resourc": [10, 19, 26, 28], "statu": [10, 19, 20, 26], "success": [19, 26], "failur": 19, "get_album_item": [19, 20], "pagin": [10, 19, 20], "artifacttyp": 19, "tracknumb": [19, 20, 26], "volumenumb": [19, 20, 26], "get_album_by_barcode_id": 19, "barcode_id": 19, "barcod": [10, 19], "196589525444": 19, "get_similar_album": [19, 20, 28], "1566": [19, 20], "7804": [19, 20], "get_similar_artist": [19, 20, 28], "251380837": [19, 20], "251380838": [19, 20], "get_track_by_isrc": 19, "usual": 19, "compris": 19, "12": [19, 26], "alphanumer": 19, "ussm12209515": 19, "get_similar_track": [19, 28], "get_video": [19, 20], "video_id": [19, 20], "75623239": [19, 20], "59727844": [19, 20], "beyonc\u00e9": [19, 20], "worldwid": 19, "r_usr": 20, "tidal_private_client_id": 20, "tidal_private_client_secret": 20, "desktop": [10, 20, 26], "device_cod": 20, "manual": [10, 20, 28], "termin": [10, 20], "w_usr": 20, "w_sub": 20, "temporarili": 20, "block": 20, "ip": 20, "too": 20, "quickli": 20, "login_url": 20, "redirect_url": 20, "resources_url": 20, "streamreadi": [20, 26], "adsupportedstreamreadi": [20, 26], "djreadi": [20, 26], "stemreadi": [20, 26], "streamstartd": [20, 26], "allowstream": [20, 26], "premiumstreamingonli": [20, 26], "vibrantcolor": [20, 26], "audioqu": [20, 26], "audiomod": [20, 26], "totalnumberofitem": 20, "replaygain": [20, 26], "peak": [20, 26], "mix": [20, 26, 28], "track_mix": [20, 26], "get_album_credit": 20, "get_album_review": 20, "review": 20, "synopsi": 20, "lastupd": [20, 26], "get_favorite_album": [20, 29], "order_direct": 20, "desc": [10, 20], "direct": 20, "asc": [10, 20], "on_artifact_not_found": 20, "unfavorite_album": 20, "artisttyp": [20, 26], "artistrol": [20, 26], "categoryid": [20, 26], "artist_mix": [20, 26], "subset": 20, "epsandsingl": 20, "get_artist_video": 20, "imagepath": 20, "imageid": 20, "adsurl": 20, "adsprepaywallonli": 20, "get_artist_mix_id": 20, "mix_id": 20, "000ec0b01da1ddd752ec5dee553d48": 20, "get_artist_radio": 20, "inspir": 20, "ident": [10, 20], "get_mix_item": 20, "get_artist_biographi": 20, "biograph": 20, "get_artist_link": 20, "link": 20, "websit": [10, 20], "sitenam": 20, "banner": 20, "relationtyp": 20, "similar_artist": 20, "get_favorite_artist": [20, 29], "unfavorite_artist": 20, "get_blocked_artist": 20, "block_artist": 20, "radio": 20, "unblock_artist": 20, "unblock": 20, "get_country_cod": 20, "get_imag": 20, "uuid": [20, 26, 29], "anim": 20, "d3c4372b": 20, "a652": 20, "40e0": 20, "bdb1": 20, "fc8d032708f6": 20, "userprofil": 20, "get_favorite_mix": 20, "datead": 20, "mixtyp": 20, "subtitletextinfo": 20, "detailimag": 20, "master": [10, 20], "titletextinfo": 20, "lastmodifiedat": 20, "favorite_mix": 20, "000dd748ceabd5508947c6a5d3880a": 20, "unfavorite_mix": 20, "get_album_pag": 20, "device_typ": 20, "phone": 20, "mobil": [10, 20], "smart": 20, "submodul": 20, "get_artist_pag": 20, "get_mix_pag": 20, "get_video_pag": 20, "playlist_uuid": 20, "36ea71a8": 20, "445e": 20, "41a4": 20, "82ab": 20, "6628c581535d": 20, "creator": [20, 26], "publicplaylist": 20, "squareimag": [20, 26], "promotedartist": [20, 26], "lastitemaddedat": [20, 26], "get_playlist_etag": 20, "etag": 20, "1698984074453": 20, "get_playlist_recommend": 20, "folder_id": 20, "root": 20, "4261748a": 20, "4287": 20, "4758": 20, "aaab": 20, "6d5be3e99e52": 20, "folder": 20, "place": 20, "under": 20, "move_playlist": 20, "e09ab9c": 20, "2e87": 20, "41b8": 20, "b404": 20, "3cd712bf706e": 20, "contentbehavior": [20, 26], "sharinglevel": [20, 26], "trn": [20, 26], "followinfo": [20, 26], "nroffollow": [20, 26], "tidalresourcenam": [20, 26], "followtyp": [20, 26], "userid": 20, "get_personal_playlist": [17, 20], "folder_uuid": 20, "itemtyp": 20, "addedat": 20, "parent": [20, 26, 27, 28], "readi": [20, 26], "set_playlist_privaci": [20, 26], "from_playlist_uuid": 20, "on_dupl": 20, "move_playlist_item": 20, "from_index": 20, "to_index": 20, "delete_playlist_item": 20, "get_personal_playlist_fold": 20, "flatten": 20, "include_onli": 20, "date_upd": 20, "createdat": 20, "create_playlist_fold": 20, "delete_playlist_fold": 20, "92b3c1ea": 20, "245a": 20, "4e5a": 20, "a5a4": 20, "c215f7a65b9f": 20, "tophit": 20, "collection_id": 20, "audio_qu": 20, "video_qu": 20, "max_resolut": 20, "2160": 20, "playback_mod": 20, "asset_present": 20, "streaming_session_id": 20, "immers": 20, "hifi": 20, "plan": 20, "price": 20, "dolbi": 20, "atmo": 20, "64": [20, 26], "1411": 20, "9216": 20, "mqa": 20, "audio_onli": 20, "vertic": 20, "offlin": 20, "asset": [20, 26, 28], "present": 20, "30": [20, 27], "get_video_stream": 20, "tommi": 20, "wright": 20, "kelman": 20, "duran": 20, "teriu": 20, "dream": 20, "de": [20, 26], "diamant": 20, "mike": [20, 28], "dean": 20, "trackid": [20, 26], "lyricsprovid": 20, "providercommontrackid": 20, "isrighttoleft": 20, "get_track_mix_id": 20, "tidal_id": 20, "0017159e6a1f34ae3d981792d72ecf": 20, "get_track_playback_info": 20, "hc": 20, "en": 20, "360004255778": 20, "info": 20, "assetpresent": 20, "manifestmimetyp": 20, "manifesthash": 20, "manifest": 20, "albumreplaygain": 20, "albumpeakamplitud": 20, "trackreplaygain": 20, "trackpeakamplitud": 20, "get_track_recommend": 20, "suggested_track": 20, "get_favorite_track": 20, "unfavorite_track": 20, "countrycod": 20, "fullnam": 20, "nicknam": 20, "citi": 20, "postalcod": 20, "usstat": 20, "phonenumb": 20, "birthdai": 20, "channelid": 20, "parentid": 20, "acceptedeula": 20, "facebookuid": 20, "appleuid": 20, "googleuid": 20, "accountlinkcr": 20, "emailverifi": 20, "newus": 20, "get_sess": 20, "sessionid": 20, "partnerid": 20, "authorizedforofflin": 20, "authorizedforofflined": 20, "get_favorite_id": 20, "172311284": 20, "numberoffollow": 20, "prompt": [20, 26], "primari": [20, 22], "secondari": 20, "updatedtim": 20, "supportedcontenttyp": 20, "profiletyp": 20, "get_user_follow": 20, "peopl": [20, 29], "imfollow": 20, "follow_us": 20, "unfollow_us": 20, "get_blocked_us": 20, "block_us": 20, "unblock_us": 20, "get_video_playback_info": 20, "videoid": 20, "streamtyp": 20, "videoqu": 20, "get_favorite_video": 20, "favorite_video": 20, "unfavorite_video": 20, "util": [22, 23, 24, 27], "ndarrai": [23, 24], "levenshtein": [24, 27], "ratio": [23, 24, 27], "measur": [23, 24], "compar": [23, 24], "numpi": [23, 24, 27], "instal": [23, 24], "otherwis": [23, 24, 27], "lightweight": 25, "3": [10, 25, 26, 27, 28], "packag": 26, "pip": 26, "come": [26, 28], "pypi": 26, "conda": 26, "forg": 26, "onc": 26, "pep": 26, "541": 26, "resolv": [26, 27], "grab": 26, "repositori": 26, "git": 26, "clone": 26, "github": 26, "bbye98": 26, "enter": [26, 27], "directori": [26, 27], "virtual": 26, "prevent": 26, "conflict": 26, "requirements_minim": 26, "txt": 26, "env": 26, "f": [26, 27, 28, 29], "yml": 26, "venv": 26, "bin": 26, "posix": 26, "bash": 26, "zsh": 26, "script": 26, "bat": 26, "cmd": 26, "ex": 26, "ps1": 26, "powershel": 26, "alongsid": [10, 26], "step": [26, 29], "r": [26, 27], "virtualenv": 26, "linux": 26, "done": 26, "try": [10, 26, 29], "import": [26, 27, 28, 29], "error": 26, "modulenotfounderror": 26, "No": 26, "rais": 26, "successfulli": 26, "out": [10, 26, 27, 28], "box": 26, "few": 26, "addit": [26, 29], "prerequisit": 26, "cach": 26, "client_itun": [26, 27], "client_qobuz": [26, 29], "protect": 26, "qobuz_email": 26, "qobuz_password": 26, "post": 26, "spawn": 26, "normal": 26, "launch": 26, "find": [10, 26, 28, 29], "chromium": 26, "f12": 26, "devtool": 26, "navig": 26, "firefox": 26, "shift": 26, "f9": 26, "inspector": 26, "nagiv": 26, "client_spotify_lyr": 26, "choic": [26, 28], "spotify_port": 26, "client_spotifi": [26, 27, 28, 29], "scope": [26, 28, 29], "get_authorization_scop": 26, "autom": 26, "click": 26, "agre": 26, "jot": 26, "client_tid": [26, 27, 28, 29], "client_tidal_priv": 26, "proxi": 26, "tool": 26, "intercept": 26, "instruct": 26, "consol": 26, "edm": 26, "group": 26, "galanti": [26, 28], "musicartist": 26, "wrappertyp": 26, "artistnam": [26, 27], "artistlinkurl": 26, "543322169": 26, "uo": 26, "artistid": 26, "amgartistid": 26, "2616267": 26, "primarygenrenam": 26, "danc": 26, "primarygenreid": 26, "17": 26, "static": 26, "8dcf30e5c8e30281ecbb13b0886426c8": 26, "127": 26, "865362": 26, "4stqvofp9vemcemlw50sbu": 26, "3382444": [], "pop": 26, "v1": 26, "640": 26, "scdn": 26, "ab6761610000e5eb7bda087d6fb48d481efd3344": 26, "ab676161000051747bda087d6fb48d481efd3344": 26, "160": 26, "ab6761610000f1787bda087d6fb48d481efd3344": 26, "67": [], "4676988": 26, "a627e21c": 26, "60f7": 26, "4e90": 26, "b2bb": 26, "e50b178c4f0b": 26, "1024x256": 26, "1024": 26, "1080x720": 26, "1080": 26, "720": 26, "160x107": 26, "107": 26, "160x160": 26, "320x214": 26, "214": 26, "320x320": 26, "480x480": 26, "480": 26, "640x428": 26, "428": 26, "750x500": 26, "750": 26, "750x750": 26, "www": [10, 26], "72": 26, "11": [26, 27], "engin": 26, "team": 26, "000202a7e72fd90d0c0df2ed56ddea": 26, "everybodi": 26, "talk": 26, "neon": 26, "tree": 26, "kind": 26, "315816847": [], "collectionid": [26, 27], "578054990": [], "578054997": [], "glee": [], "cast": [], "collectionnam": 26, "season": [], "vol": 26, "tracknam": [26, 27], "collectioncensorednam": 26, "trackcensorednam": 26, "artistviewurl": 26, "collectionviewurl": 26, "trackviewurl": 26, "previewurl": 26, "ssl": 26, "audiopreview125": [], "v4": 26, "86": [], "4b": [], "3f": [], "864b3f23": [], "9155": [], "9ce8": [], "c1c0": [], "fc115a8af80a": [], "mzaf_13828074306318913858": [], "p": 26, "artworkurl30": 26, "is1": 26, "mzstatic": 26, "thumb": [10, 26], "music115": [], "57": [], "6d": [], "4e": [], "576d4e7a": [], "7860": [], "595a": [], "5ccd": [], "05e965413df5": [], "886443746404": [], "30x30bb": 26, "artworkurl60": 26, "60x60bb": 26, "artworkurl100": 26, "100x100bb": 26, "collectionpric": 26, "99": 26, "trackpric": 26, "29": 26, "2012": 26, "05t12": [], "00z": [26, 27], "collectionexplicit": 26, "notexplicit": 26, "trackexplicit": 26, "disccount": 26, "discnumb": 26, "trackcount": 26, "tracktimemilli": 26, "179280": [], "usa": 26, "currenc": [10, 26], "usd": [10, 26], "isstream": 26, "track_qobuz": 26, "2022": [26, 27], "arko": 26, "boom": 26, "todd": 26, "15899504": 26, "fc": 26, "7v": 26, "ilfmuz10e7vfc_230": 26, "ilfmuz10e7vfc_50": 26, "ilfmuz10e7vfc_600": 26, "0859766309663": 26, "1665180000": 26, "4026379": 26, "95": 26, "speedi": 26, "178369185": 26, "536": 26, "133": 26, "0070ef": 26, "hip": 26, "hop": 26, "rap": 26, "ilfmuz10e7vfc": 26, "1689231600": 26, "08": 26, "15899505": 26, "tcagm2280786": 26, "178369187": 26, "track_spotifi": 26, "0rpddszuhfncuwnjxkosji": 26, "au": 26, "AT": 26, "BE": 26, "bo": 26, "bg": 26, "cl": 26, "cr": 26, "cy": 26, "cz": 26, "dk": 26, "ec": 26, "ee": 26, "sv": 26, "fi": 26, "fr": 26, "gr": 26, "gt": 26, "hn": 26, "hk": 26, "hu": 26, "ie": 26, "lv": 26, "lt": 26, "lu": 26, "mt": 26, "nl": 26, "nz": 26, "ni": 26, "NO": 26, "pa": 26, "py": 26, "pe": 26, "ph": 26, "pl": 26, "pt": 26, "sg": 26, "sk": 26, "ch": 26, "tw": 26, "tr": 26, "ui": 26, "gb": 26, "li": [26, 29], "mc": 26, "th": 26, "ro": 26, "il": 26, "za": 26, "sa": 26, "ae": 26, "bh": 26, "qa": 26, "om": 26, "kw": 26, "eg": 26, "tn": 26, "lb": 26, "jo": 26, "IN": 26, "BY": 26, "kz": 26, "md": 26, "ua": 26, "al": 26, "ba": 26, "hr": 26, "mk": 26, "si": 26, "kr": 26, "bd": 26, "pk": 26, "lk": 26, "gh": 26, "ke": 26, "ng": 26, "tz": 26, "ug": 26, "bb": 26, "bz": 26, "bt": 26, "bw": 26, "bf": 26, "cv": 26, "cw": 26, "dm": 26, "fj": 26, "gm": 26, "gd": 26, "gw": 26, "gy": 26, "ht": 26, "jm": 26, "ki": 26, "l": 26, "lr": 26, "mw": 26, "mv": 26, "ml": 26, "mh": 26, "fm": 26, "na": 26, "nr": 26, "ne": 26, "pw": 26, "pg": 26, "w": 26, "st": 26, "sn": 26, "sc": 26, "sl": 26, "sb": 26, "kn": 26, "lc": 26, "vc": 26, "sr": 26, "tl": 26, "TO": 26, "tt": 26, "az": 26, "bn": 26, "bi": 26, "kh": 26, "cm": 26, "td": 26, "km": 26, "gq": 26, "ga": 26, "gn": 26, "kg": 26, "la": 26, "mo": 26, "mr": 26, "mn": 26, "np": [26, 27], "rw": 26, "tg": 26, "uz": 26, "zw": 26, "bj": 26, "mg": 26, "mu": 26, "mz": 26, "ao": 26, "ci": 26, "dj": 26, "zm": 26, "cg": 26, "iq": 26, "tj": 26, "ve": 26, "xk": 26, "0urfz92jmjwdbzbb7hebir": 26, "ab67616d0000b2734a6c0376235e5aa44e59d2c2": 26, "300": 26, "ab67616d00001e024a6c0376235e5aa44e59d2c2": 26, "ab67616d000048514a6c0376235e5aa44e59d2c2": 26, "01": 26, "177280": 26, "usum71119189": 26, "2iumqdfgzchihs3b9e9ewq": 26, "81": [], "14492425": 26, "451": 26, "due": 26, "demand": 26, "right": [26, 29], "holder": 26, "prohibit": 26, "track_tidal_priv": 26, "177": 26, "999969": 26, "17t00": 26, "0000": 26, "55": 26, "mercuri": 26, "2011": 26, "umg": 26, "inc": 26, "stereo": 26, "3665225": 26, "e6f17398": 26, "759e": 26, "45a0": 26, "9673": 26, "6ded6811e199": 26, "14492422": 26, "1c2d7c90": 26, "034e": 26, "485a": 26, "be1f": 26, "24a669c7e6e": 26, "f8af88": 26, "0019768c833a193c29829e5bf473fc": 26, "we": [26, 27, 28, 29], "playlist_qobuz": 26, "ilfmuz10e7vfc_150": 26, "1701053442": [], "ilfmuz10e7vfc_300": 26, "1701053443": [], "18171379": [], "52": [], "3865979203": [], "playlist_spotifi": 26, "3vsxl8ftlyoqgewazcz5d": [], "primary_color": 26, "myw0ndk1ngnlmze0m2e1otbkmtg0otdkn2m4mgi1nmi3zji5ymmxytgz": [], "2023": [26, 27, 28, 29], "27t02": [], "45z": [], "video_thumbnail": 26, "playlist_tidal_priv": 26, "e9f6aff1": [], "f39e": [], "462b": [], "90c4": [], "41686877a555": [], "unrestrict": 26, "8e75fac4": [], "cf24": [], "45c8": [], "8bd2": [], "98ab69f7f74b": [], "eefe947a": [], "5cdb": [], "40ee": [], "8057": [], "213941ff48d5": [], "45": [], "504": [], "46": [], "085": [], "mutagen": 26, "common": 26, "test": [26, 27], "middle_c": 26, "notat": 26, "getattr": 26, "attr": 26, "print": [26, 27], "capit": [26, 27], "middl": 26, "squar": 26, "game": 26, "similarli": 26, "setattr": 26, "261": 26, "63": 26, "forget": [26, 27], "convers": [26, 27], "middle_c_alac": 26, "116kb": 26, "02": [], "930": [], "3kbit": [], "speed": [26, 27], "177x": [], "point": [26, 27], "novemb": [27, 28, 29], "glob": 27, "audio_fil": 27, "suffix": 27, "dive": 27, "def": 27, "print_metadata": 27, "__dict__": 27, "startswith": 27, "upper": 27, "els": 27, "below": [27, 29], "highlight": 27, "involv": [10, 27], "spektrem_shin": 27, "0x7fb5cdaeb790": [], "let": [10, 27], "spektrem": 27, "shine": 27, "count": [10, 27], "1030107": 27, "44100": 27, "had": 27, "pull": 27, "At": 27, "yet": 27, "written": 27, "compat": 27, "1032kb": 27, "09": [], "280": [], "9kbit": [], "68": 26, "5x": [], "With": 27, "280593": 27, "persist": 27, "typic": 27, "accur": 27, "good": [10, 27], "idea": 27, "select": [27, 28, 29], "closest": 27, "choos": 27, "distanc": 27, "levenshtein_ratio": 27, "lower": 27, "itunes_result": 27, "itunes_track": 27, "argmax": 27, "itunes_album": 27, "2013": 27, "gfted": 27, "06t12": 27, "electron": 27, "fill": 27, "By": [10, 27], "set_metadata_us": 27, "spotify_result": 27, "spotify_track": [27, 29], "gb2ld0901581": 27, "128": 27, "correct": [27, 29], "get_track_compo": 27, "tidal_result": 27, "tidal_track": [27, 29], "tidal_compos": 27, "tidal_lyr": 27, "did": 27, "sometim": [27, 29], "tobu_back_to_y": 27, "0x7fb6744afdd0": [], "tobu": 27, "tom": 27, "burkovski": 27, "nc": 27, "06t07": 27, "hous": [27, 28], "gb2ld2210368": 27, "1104053": 27, "poorli": 27, "miss": 27, "fix": 27, "three": 27, "25t12": 27, "98": 27, "voil\u00e0": 27, "twice": 27, "becaus": 27, "There": 27, "eleg": 27, "solut": 27, "problem": 27, "unfortun": [27, 29], "19": [28, 29], "help": 28, "discov": 28, "leverag": 28, "suggest": 28, "b64encod": 28, "random": 28, "ipython": 28, "html": 28, "ifram": 28, "ipywidget": 28, "gridspeclayout": 28, "sure": 28, "0jz9tvoltzjagqiyc4hyzx": 28, "avicii": 28, "0bmb3nzquhbfi6nm4setvu": 28, "cash": 28, "surrend": 28, "1pq8ywty9v2ivzwj7gyxxb": 28, "mako": 28, "our": 28, "70iflb5egla8wufwgxborz": 28, "william": 28, "fallin": 28, "6jspbxzld2yemjtjz2gqot": 28, "passion": 28, "pit": 28, "76b6ljxtolasgxlanjnndr": 28, "sick": 28, "individu": 28, "2v65y3px4dkrhy1djlxd9p": 28, "swedish": 28, "mafia": 28, "worri": 28, "child": 28, "feat": 28, "john": 28, "martin": 28, "1gpf8iwqqj8qoevjhfiidu": 28, "zedd": 28, "matthew": 28, "koma": 28, "miriam": 28, "bryant": 28, "randomli": 28, "recommended_track": 28, "k": 28, "spotify_playlist": [28, 29], "global": 28, "_dh": 28, "minim_mix_smal": 28, "rb": 28, "nifti": 28, "emb": [10, 28], "grid": 28, "len": 28, "enumer": 28, "framebord": 28, "lazi": 28, "152": 28, "510": 28, "divmod": 28, "procedur": [28, 29], "51073951": 28, "62082351": 28, "32553484": 28, "147258423": 28, "109273852": 28, "237059212": 28, "17271290": 28, "27171015": 28, "similar_track": 28, "div": 28, "pad": 28, "bottom": 28, "overflow": 28, "hidden": 28, "max": 28, "src": 28, "layout": 28, "gridifi": 28, "allowfullscreen": 28, "absolut": 28, "left": 28, "1px": 28, "min": 28, "margin": 28, "auto": 28, "tunemymus": 29, "assum": 29, "destin": 29, "challeng": 29, "often": 29, "difficult": 29, "barebon": 29, "pair": [10, 29], "fine": 29, "tune": 29, "complex": 29, "those": 29, "remix": 29, "qobuz_playlist_id": 29, "17865119": 29, "qobuz_playlist": 29, "new_spotify_playlist": 29, "equival": 29, "simpl": 29, "spotify_track_uri": 29, "qobuz_track": 29, "new_tidal_playlist": 29, "confirm": 29, "tidal_track_id": 29, "spotify_playlist_id": 29, "3rw9qy60ceh6dfjauwdxmh": 29, "new_qobuz_playlist": 29, "thankfulli": 29, "qobuz_track_id": 29, "tidal_playlist_uuid": 29, "40052e73": 29, "58d4": 29, "4abb": 29, "bc1c": 29, "abace76d2f15": 29, "tidal_playlist": 29, "tidal_playlist_item": 29, "qobuz_favorit": 29, "qobuz_favorite_album": 29, "qobuz_favorite_artist": 29, "align": 29, "spotify_album_id": 29, "qobuz_album": 29, "spotify_album": 29, "indexerror": 29, "break": 29, "follow_artist": 29, "spotify_artist_id": 29, "qobuz_artist": 29, "spotify_artist": 29, "tidal_album_id": 29, "tidal_album": 29, "lstrip": 29, "tidal_artist_id": 29, "tidal_artist": 29, "spotify_favorite_album": 29, "spotify_favorite_artist": 29, "qobuz_album_id": 29, "qobuz_artist_id": 29, "tidal_favorite_album": 29, "tidal_favorite_artist": 29, "gestalt": 23, "ratcliff": 23, "obershelp": 23, "keyerror": [], "traceback": [], "cell": [], "mnt": [], "benjamin": [], "700": [], "__init__": [], "self": [], "693": [], "config": [], "_name": [], "fallback": [], "695": [], "696": [], "697": [], "698": [], "699": [], "701": [], "1036": [], "1029": [], "_expiri": [], "1030": [], "strptime": [], "1031": [], "isinst": [], "1032": [], "1034": [], "_flow": [], "1035": [], "_sp_dc": [], "_user_id": [], "9108": [], "9054": [], "9055": [], "9056": [], "9103": [], "9104": [], "9106": [], "_check_scop": [], "_get_json": [], "843": [], "823": [], "825": [], "826": [], "827": [], "respons": 10, "840": [], "841": [], "_request": [], "912": [], "retri": [], "887": [], "888": [], "construct": [], "889": [], "908": [], "909": [], "911": [], "_refresh_access_token": [], "914": [], "915": [], "299": [], "867": [], "855": [], "client_b64": [], "urlsafe_b64encod": [], "856": [], "_client_id": [], "_client_secret": [], "857": [], "decod": [], "858": [], "859": [], "860": [], "864": [], "basic": 10, "865": [], "bearer": [], "868": [], "_refresh_token": [], "869": [], "870": [], "timedelta": [], "expires_in": [], "126": 26, "3375748": [], "350172836": [], "1443469527": [], "1443469581": [], "audiopreview122": [], "5c": [], "5c29bf6b": [], "ca2c": [], "4e8b": [], "2be6": [], "c51a282c7da": [], "mzaf_1255557534804450018": [], "e3": [], "80e39565": [], "35f9": [], "2496": [], "c6f8": [], "6572490c4a7b": [], "12umgim12509": [], "rgb": [], "19t12": [], "contentadvisoryr": [], "justin": [], "meldal": [], "johnsen": [], "guitar": [], "keyboard": [], "percuss": [], "programm": [], "associatedperform": [], "tim": [], "pagnotta": [], "greg": [], "collin": [], "studiopersonnel": [], "weslei": [], "seidman": [], "asst": [], "tyler": [], "glenn": [], "matt": [], "wigger": [], "bill": [], "bush": [], "470727": [], "42": [], "54": [], "0060252795442_230": [], "0060252795442_50": [], "0060252795442_600": [], "0060252795442": [], "1325372400": [], "17487": [], "774": [], "5653617": [], "2785": [], "112": [], "119": [], "113": [], "indi": [], "alternatif": [], "et": [], "ind": [], "1683529200": [], "583118": [], "5653620": [], "1683702000": [], "0060252795442_150": [], "1699766986": [], "0060252795442_300": [], "1699766987": [], "17864724": [], "31": [], "3775088385": [], "193pq0l1m0ykfekbrb4c1v": [], "myxhzgzkzdk4m2m0ogy2zwvmytuxyweymjawm2mzmde5nze5ndq4ode0": [], "12t05": [], "49z": [], "771dc2db": [], "c763": [], "4e71": [], "9c87": [], "f5d82bfa4153": [], "9412a3c1": [], "7d10": [], "40b3": [], "b9b4": [], "96f0791dee9c": [], "74d8c599": [], "cfbd": [], "464f": [], "8e70": [], "80d51a6482bd": [], "155": 26, "740": [], "161x": [], "0x7f126c60b150": [], "0kb": [26, 27], "1891": [], "2kbit": [], "813x": [], "256kb": [], "89": [], "150": [], "768kb": [], "28": [], "222": [], "1x": 27, "281": 27, "1kbit": 27, "28x": [], "attributeerror": [], "8": [], "0x7efd3873e650": [], "3363420": [], "112115157": 26, "583394431": 26, "583394802": 26, "workout": 26, "35": 26, "unmix": 26, "gym": 26, "jog": 26, "run": 26, "cycl": 26, "cardio": 26, "fit": 26, "audiopreview115": 26, "c4": 26, "8d": 26, "c4fc8d9a": 26, "0b75": 26, "55fb": 26, "6413": 26, "6bdbf7d17e65": 26, "mzaf_7998633680287936907": 26, "music114": 26, "b4": 26, "a7": 26, "dc": 26, "b4a7dc27": 26, "6fcd": 26, "22ba": 26, "c9a6": 26, "564166a4c43d": 26, "35tophitswom3_2400": 26, "03t12": 26, "34": 26, "179055": 26, "79": 26, "1703541258": [], "1703541259": [], "18794965": [], "4056401760": [], "0nnctudbv2hxvrsbtw9uvd": [], "miwyywm2ywywymm2otmzmjfiogu1mdi5odjmzwrlndgwn2y5zjazzjyi": [], "25t21": [], "21z": [], "4d1dc535": [], "556c": [], "4368": [], "a6cc": [], "2fa0e373e4da": [], "af52f4df": [], "06f8": [], "40ad": [], "9ebd": [], "4ad993523c39": [], "7b203db1": [], "e8f4": [], "4fbc": [], "a87f": [], "a5032bcdcbd7": [], "21": [], "876": [], "633": [], "577014": [], "32": 26, "77": [], "0kbit": [], "92": 26, "1023": 26, "4kbit": 26, "163x": [], "0x7fb2b0648090": [], "652x": [], "83": [], "141": [], "6x": [], "1024kb": [], "279": [], "7kbit": 27, "1703541385": [], "1703541386": [], "18794976": [], "4056413118": [], "3r7m5jqsbyhqraljwmxop5": [], "miwymjgwzmy1ngnhnmeymdcynme4oda0nwfkmmmwzdvjyzjimdq5odc0": [], "56": [], "28z": [], "999521e8": [], "cc89": [], "40e2": [], "b5e4": [], "feef8fc55e2b": [], "9e9beafc": [], "fe9e": [], "41b5": [], "a3e2": [], "2165c7eb9ea5": [], "7be303ac": [], "90c3": [], "461a": [], "9e9c": [], "29b2e9737a93": [], "025": [], "411": [], "143x": [], "0x7f2a63fc6090": [], "773x": [], "146": [], "5kbit": [], "4x": [], "58": [], "228": [], "2x": [], "0x7f2a63fc5150": [], "1703541443": [], "1703541444": [], "18794997": [], "4056419200": [], "6lsdixcynk4tviweun0r2x": [], "miw1zdi0njy3zjzkoddkndm0mjcwyjnkywe4ntk2m2mwymm4nti4yjy4": [], "25z": [], "f7db0333": [], "9032": [], "4410": [], "8092": [], "33e2fd57a9a0": [], "dd039132": [], "45a2": [], "a7cc": [], "0c5a6de9b202": [], "c951760e": [], "df32": [], "469e": [], "9022": [], "a0f96adbbd51": [], "26": 26, "548": [], "131": [], "158x": [], "0x7fa51e606090": [], "746x": [], "223": [], "0x7fa5e9463ed0": [], "1703542953": [], "1703542954": [], "18795217": [], "4056566210": [], "05nxuuwubqkvqkokwts9sf": [], "miwzmwjizdyyzdg3mwizyzmyogq2ogqzmwi5zdc5yta5nmm4y2ywmgjh": [], "25t22": [], "36z": [], "b32ca39": [], "fc75": [], "41e8": [], "8983": [], "ac2c60a343b6": [], "add565f1": [], "aa6d": [], "4ba6": [], "9add": [], "b79766ffebff": [], "320db6de": [], "97ae": [], "499f": [], "bd6f": [], "d5fafed56818": [], "36": [], "519": [], "169x": [], "0x7f3ad3cea410": [], "71x": [], "94": [], "140": [], "221": [], "0x7f3ad38bdb50": [], "1703543032": [], "1703543033": [], "18795231": [], "4056571639": [], "6utaldny4jas8p62xkuob1": [], "miw1ytnmngyxnzblndnmy2fhyzcwnjdinmu4ngjmzgzmmdhmotmxm2rm": [], "23": [], "55z": [], "5ad15881": [], "d24a": [], "431d": [], "8842": [], "e984b14acddd": [], "b51cac5": [], "afda": [], "412e": [], "b776": [], "157cdf14ce72": [], "d8ce78a4": [], "6e66": [], "45b2": [], "b642": [], "3d8ad94ab51a": [], "288": [], "621": [], "151x": [], "0x7f3120028710": [], "688x": [], "62": 27, "143": [], "0x7f311f41c450": [], "1703543101": [], "1703543102": [], "18795240": [], "4056579211": [], "7byelnhlxdpl1suxbohdxc": [], "miximge3nmzkztjmnjhimzk3ogfimtcxmgfiowjhyjdkzmnin2qwzgi3": [], "04z": [], "72822fee": [], "3bd8": [], "4e6a": [], "8919": [], "6209622dbfee": [], "b9692a2e": [], "b994": [], "4add": [], "8cd8": [], "d55f713c9d2a": [], "db6c068e": [], "f503": [], "4564": [], "b13f": [], "de4ea788ca77": [], "276": [], "756": [], "157x": [], "0x7f31c2b320d0": [], "872x": [], "0x7f31c2b2e050": [], "1703543295": [], "1703543296": [], "18795266": [], "4056598057": [], "2hevunznshidx5g69qb6zo": [], "mixjmjm2owzkztlkmjaxotq3ytg3mgezy2zknwe3mjvingu1ywfjmwri": [], "17z": [], "19cbbd20": [], "a52a": [], "8a8f": [], "f61363ae06bf": [], "3ee9a69b": [], "8be3": [], "432e": [], "8797": [], "2f37410cfd60": [], "e9540028": [], "d848": [], "4ad4": [], "962d": [], "c15c46517dec": [], "18": [], "304": [], "782": [], "0x7fa22b87db10": [], "895x": [], "149": [], "8kbit": [], "8x": [], "7x": [], "0x7fa22b88ba10": [], "1703543445": [], "18795289": [], "4056613633": [], "519yixsucuo8znb1pid8gr": [], "miw5ntlhyjdjm2y1mtdjyzzhm2u4nwq0ymy3ywziyzjimzvhotlkyji1": [], "48z": [], "635c228f": [], "c946": [], "4243": [], "be68": [], "b26e3f48f64c": [], "5feae44a": [], "9961": [], "4173": [], "a4af": [], "7cdc80a43e95": [], "fbb4cf4e": [], "1268": [], "4adf": [], "be9c": [], "5a0fc14ba600": [], "48": [], "732": [], "49": [], "203": [], "154x": [], "0x7f0bf74f2710": [], "653x": [], "0x7f0bf6ab9510": [], "1703543491": [], "1703543492": [], "18795302": [], "4056619241": [], "65jzri70liabjp3vvmknvc": [], "miwzngy4mwzjody4ymiyyzg0ztixmznlzjvjotvkowrknzu1mtqxmwnh": [], "34z": [], "b464d4a7": [], "4e66": [], "4cc4": [], "aefd": [], "16ab91c81039": [], "21bdd5bd": [], "3daa": [], "45ba": [], "949a": [], "c82b37eeb088": [], "d0198e9e": [], "4fe2": [], "4285": [], "ba25": [], "f77658438440": [], "924": [], "291": [], "146x": [], "0x7fc1867c9710": [], "804x": [], "144": [], "0x7fc185d9d750": [], "1703543652": [], "18795317": [], "4056634586": [], "25thystgggzlzqfhklecqx": [], "mixln2m1m2yyndu1zge1ndmxodeyzgvhyzy1nznimdk1ztgwyzvjmtnh": [], "14z": [], "532c3063": [], "45aa": [], "8781": [], "07f88e6e371b": [], "3bd94903": [], "8ecf": [], "4ac9": [], "8698": [], "9c8ce41fe5dd": [], "319f5bf4": [], "4417": [], "8909": [], "3a532fb33d12": [], "15": [], "008": [], "490": [], "0x7f5d7dc6f710": [], "675x": [], "153": [], "0x7f5e47f61650": [], "discog": 10, "consumer_kei": 10, "consumer_secret": 10, "web_framework": [10, 17, 29], "access_token_secret": 10, "rest": 10, "wantlist": 10, "marketplac": 10, "home": 10, "least": 10, "enjoi": 10, "higher": 10, "consum": 10, "discogs_consumer_kei": 10, "discogs_consumer_secret": 10, "registr": 10, "0a": 10, "view": 10, "discogs_personal_access_token": [], "undergo": 10, "attach": 10, "access_token_url": 10, "request_token_url": 10, "get_ident": 10, "doubl": 10, "saniti": 10, "correctli": 10, "resource_url": 10, "consumer_nam": 10, "visibl": 10, "num_list": 10, "num_collect": 10, "num_wantlist": 10, "rodneyfool": 10, "wantlist_url": 10, "rank": 10, "num_pend": 10, "num_for_sal": 10, "home_pag": 10, "locat": 10, "collection_folders_url": 10, "collection_fields_url": 10, "releases_contribut": 10, "rating_avg": 10, "releases_r": 10, "inventory_url": 10, "avatar_url": 10, "banner_url": 10, "buyer_r": 10, "buyer_rating_star": 10, "buyer_num_r": 10, "seller_r": 10, "seller_rating_star": 10, "seller_num_r": 10, "curr_abbr": 10, "edit_profil": 10, "real": 10, "nicola": 10, "cage": 10, "geograph": 10, "portland": 10, "biolog": 10, "abbrevi": 10, "gbp": 10, "eur": 10, "cad": 10, "aud": 10, "jpy": 10, "chf": 10, "mxn": 10, "brl": 10, "nzd": 10, "sek": 10, "zar": 10, "get_user_submiss": 10, "per_pag": 10, "get_user_contribut": 10, "sort_ord": 10, "708": [], "703": [], "704": [], "705": [], "706": [], "707": [], "709": [], "1044": [], "1037": [], "1038": [], "1039": [], "1040": [], "1042": [], "1043": [], "9116": [], "9062": [], "9063": [], "9064": [], "9111": [], "9112": [], "9114": [], "851": [], "831": [], "833": [], "834": [], "835": [], "848": [], "849": [], "920": [], "895": [], "896": [], "897": [], "916": [], "917": [], "919": [], "922": [], "923": [], "875": [], "863": [], "866": [], "872": [], "873": [], "877": [], "878": [], "0x7f3294a0e750": [], "1898": 27, "268x": [], "512kb": [], "265": [], "41": [], "0x7f320db6c290": [], "typeerror": [], "got": [], "unexpect": [], "3360776": [], "1703640723": [], "1703640724": [], "18814004": [], "4066997546": [], "6qcocfmdcnfktgmv2ujar": [], "miw2yzfhyjnhnmqzmge3mdzlmgy2zge0mzi5mmrlm2i5ote0mmywymu0": [], "27t01": [], "06z": [], "7c0572d8": [], "6a94": [], "4a56": [], "a26": [], "7b7fa6087bca": [], "8b359656": [], "544a": [], "46ec": [], "87eb": [], "0be478d31615": [], "b87d83bd": [], "b77a": [], "45f5": [], "a294": [], "c2dfd542c695": [], "357": [], "518": [], "90": [], "0x7f3937f2ced0": [], "733x": [], "3x": [], "0x7f393734cb90": [], "1703640810": [], "1703640811": [], "18814014": [], "4067006648": [], "1bs3bkyqi6g6qbvj4skpkc": [], "mswxnmnmy2u5ogy4odk4nmrimzlhmda0nzbjnzc4m2rhnju2nmm3mgvm": [], "33": 26, "32z": 26, "e02223ff": [], "d067": [], "41b2": [], "aa44": [], "ea5bd0bb14d1": [], "dc385d5b": [], "dc19": [], "4257": [], "a1a8": [], "8f3e5d7fa050": [], "42b6e4c7": [], "92d7": [], "80f7": [], "3199018785bd": [], "157": [], "318": [], "82": [], "0x7f4b180a9cd0": [], "566x": 27, "59": [], "9x": [], "0x7f4ab6deacd0": [], "submiss": 10, "fetch": 10, "shooezgirl": 10, "data_qu": 10, "namevari": 10, "releases_url": 10, "anv": 10, "averag": 10, "submitt": 10, "compani": 10, "date_ad": 10, "date_chang": 10, "estimated_weight": 10, "format_quant": 10, "qty": 10, "uri150": 10, "catno": 10, "entity_typ": 10, "master_id": 10, "master_url": 10, "note": 10, "released_format": 10, "seri": 10, "contribut": 10, "0x7f32a73529d0": [], "285x": [], "0x7f32a7353450": [], "3360524": 26, "1703696805": [], "1703696806": [], "18825699": [], "4072825591": [], "3xgm65vvklhkb1wvr6hhb6": [], "mswzzjk5zdnhmgrmmmnkyjm5nta0mgiyotnhyjm3ymzknzmwzmrjnjm5": [], "27t17": [], "cf693fb2": [], "7e90": [], "41a7": [], "92e7": [], "9f45179d6b6a": [], "2cad7241": [], "6d60": [], "4f7e": [], "aaa4": [], "a38677f91bb8": [], "2ee97ca": [], "dcb6": [], "40ec": [], "9f07": [], "7031e7ee0d83": [], "702": [], "387": [], "0x7f06d4ff2390": [], "471x": [], "226": [], "0x7f06d50b8250": [], "0x7f3b70212ad0": [], "553x": [], "58x": [], "0x7f3b70bb81d0": [], "1703712390": 26, "18831593": 26, "4074552535": 26, "2nijcg6e6ze8qv7aeckwnz": 26, "miw4ote4m2fkyznlzjlhmdjhywvinwnkmzuxyzawymmwyju2mgq1y2zl": 26, "27t21": 26, "c133107f": 26, "bf42": 26, "4fa0": 26, "8f7f": 26, "48b2fee31ec2": 26, "33dc107d": 26, "321e": 26, "4127": 26, "a0": 26, "9ed7723d1d60": 26, "f1293b2d": 26, "b657": 26, "40af": 26, "8961": 26, "0865891ac3cb": 26, "986": 26, "147": 26, "70x": 26, "0x7fa4c8389e50": 27, "0x7fa4c8433ed0": 27, "get_releas": 10, "release_id": 10, "databas": 10, "physic": 10, "249504": 10, "entity_type_nam": 10, "extraartist": 10, "lowest_pric": 10, "tracklist": 10, "type_": 10, "get_release_user_r": [], "memori": 10, "update_release_user_r": [], "get_user_release_r": 10, "update_user_release_r": 10, "delete_user_release_r": 10, "get_community_release_r": 10, "get_release_stat": 10, "stat": 10, "is_offens": 10, "num_hav": 10, "num_want": 10, "get_master_releas": 10, "1000": 10, "master_releas": 10, "main_releas": 10, "main_release_url": 10, "versions_url": 10, "get_master_release_vers": 10, "belgium": 10, "vinyl": 10, "scorpio": 10, "1992": 10, "in_collect": 10, "in_wantlist": 10, "major_format": 10, "108713": 10, "member": 10, "get_artist_releas": 10, "studio": 10, "locxat": 10, "contact_info": 10, "sublabel": 10, "get_label_releas": 10, "release_titl": 10, "issu": 10, "nirvana": 10, "nevermind": 10, "kurt": 10, "variat": 10, "dgc": 10, "rock": 10, "grung": 10, "1991": 10, "dgcd": 10, "24425": 10, "720642442524": 10, "smell": 10, "teen": 10, "spirit": 10, "milkt": 10, "jerome99": 10}, "objects": {"": [[1, 0, 0, "-", "minim"]], "minim": [[2, 0, 0, "-", "audio"], [9, 0, 0, "-", "discogs"], [11, 0, 0, "-", "itunes"], [13, 0, 0, "-", "qobuz"], [15, 0, 0, "-", "spotify"], [18, 0, 0, "-", "tidal"], [21, 0, 0, "-", "utility"]], "minim.audio": [[3, 1, 1, "", "Audio"], [4, 1, 1, "", "FLACAudio"], [5, 1, 1, "", "MP3Audio"], [6, 1, 1, "", "MP4Audio"], [7, 1, 1, "", "OggAudio"], [8, 1, 1, "", "WAVEAudio"]], "minim.audio.Audio": [[3, 2, 1, "", "convert"], [3, 2, 1, "", "set_metadata_using_itunes"], [3, 2, 1, "", "set_metadata_using_qobuz"], [3, 2, 1, "", "set_metadata_using_spotify"], [3, 2, 1, "", "set_metadata_using_tidal"]], "minim.audio.FLACAudio": [[4, 2, 1, "", "convert"], [4, 2, 1, "", "set_metadata_using_itunes"], [4, 2, 1, "", "set_metadata_using_qobuz"], [4, 2, 1, "", "set_metadata_using_spotify"], [4, 2, 1, "", "set_metadata_using_tidal"], [4, 2, 1, "", "write_metadata"]], "minim.audio.MP3Audio": [[5, 2, 1, "", "convert"], [5, 2, 1, "", "set_metadata_using_itunes"], [5, 2, 1, "", "set_metadata_using_qobuz"], [5, 2, 1, "", "set_metadata_using_spotify"], [5, 2, 1, "", "set_metadata_using_tidal"], [5, 2, 1, "", "write_metadata"]], "minim.audio.MP4Audio": [[6, 2, 1, "", "convert"], [6, 2, 1, "", "set_metadata_using_itunes"], [6, 2, 1, "", "set_metadata_using_qobuz"], [6, 2, 1, "", "set_metadata_using_spotify"], [6, 2, 1, "", "set_metadata_using_tidal"], [6, 2, 1, "", "write_metadata"]], "minim.audio.OggAudio": [[7, 2, 1, "", "convert"], [7, 2, 1, "", "set_metadata_using_itunes"], [7, 2, 1, "", "set_metadata_using_qobuz"], [7, 2, 1, "", "set_metadata_using_spotify"], [7, 2, 1, "", "set_metadata_using_tidal"], [7, 2, 1, "", "write_metadata"]], "minim.audio.WAVEAudio": [[8, 2, 1, "", "convert"], [8, 2, 1, "", "set_metadata_using_itunes"], [8, 2, 1, "", "set_metadata_using_qobuz"], [8, 2, 1, "", "set_metadata_using_spotify"], [8, 2, 1, "", "set_metadata_using_tidal"], [8, 2, 1, "", "write_metadata"]], "minim.discogs": [[10, 1, 1, "", "API"]], "minim.discogs.API": [[10, 2, 1, "", "delete_user_release_rating"], [10, 2, 1, "", "edit_profile"], [10, 2, 1, "", "get_artist"], [10, 2, 1, "", "get_artist_releases"], [10, 2, 1, "", "get_community_release_rating"], [10, 2, 1, "", "get_identity"], [10, 2, 1, "", "get_label"], [10, 2, 1, "", "get_label_releases"], [10, 2, 1, "", "get_master_release"], [10, 2, 1, "", "get_master_release_versions"], [10, 2, 1, "", "get_profile"], [10, 2, 1, "", "get_release"], [10, 2, 1, "", "get_release_stats"], [10, 2, 1, "", "get_user_contributions"], [10, 2, 1, "", "get_user_release_rating"], [10, 2, 1, "", "get_user_submissions"], [10, 2, 1, "", "search"], [10, 2, 1, "", "set_access_token"], [10, 2, 1, "", "set_flow"], [10, 2, 1, "", "update_user_release_rating"]], "minim.itunes": [[12, 1, 1, "", "SearchAPI"]], "minim.itunes.SearchAPI": [[12, 2, 1, "", "lookup"], [12, 2, 1, "", "search"]], "minim.qobuz": [[14, 1, 1, "", "PrivateAPI"]], "minim.qobuz.PrivateAPI": [[14, 2, 1, "", "add_playlist_tracks"], [14, 2, 1, "", "create_playlist"], [14, 2, 1, "", "delete_playlist"], [14, 2, 1, "", "delete_playlist_tracks"], [14, 2, 1, "", "favorite_items"], [14, 2, 1, "", "favorite_playlist"], [14, 2, 1, "", "get_album"], [14, 2, 1, "", "get_artist"], [14, 2, 1, "", "get_collection_streams"], [14, 2, 1, "", "get_curated_tracks"], [14, 2, 1, "", "get_favorites"], [14, 2, 1, "", "get_featured_albums"], [14, 2, 1, "", "get_featured_playlists"], [14, 2, 1, "", "get_label"], [14, 2, 1, "", "get_playlist"], [14, 2, 1, "", "get_profile"], [14, 2, 1, "", "get_purchases"], [14, 2, 1, "", "get_track"], [14, 2, 1, "", "get_track_file_url"], [14, 2, 1, "", "get_track_performers"], [14, 2, 1, "", "get_track_stream"], [14, 2, 1, "", "get_user_playlists"], [14, 2, 1, "", "move_playlist_tracks"], [14, 2, 1, "", "search"], [14, 2, 1, "", "set_auth_token"], [14, 2, 1, "", "set_flow"], [14, 2, 1, "", "unfavorite_items"], [14, 2, 1, "", "unfavorite_playlist"], [14, 2, 1, "", "update_playlist"], [14, 2, 1, "", "update_playlist_position"]], "minim.spotify": [[16, 1, 1, "", "PrivateLyricsService"], [17, 1, 1, "", "WebAPI"]], "minim.spotify.PrivateLyricsService": [[16, 2, 1, "", "get_lyrics"], [16, 2, 1, "", "set_access_token"], [16, 2, 1, "", "set_sp_dc"]], "minim.spotify.WebAPI": [[17, 2, 1, "", "add_playlist_cover_image"], [17, 2, 1, "", "add_playlist_items"], [17, 2, 1, "", "add_to_queue"], [17, 2, 1, "", "change_playlist_details"], [17, 2, 1, "", "check_followed_people"], [17, 2, 1, "", "check_playlist_followers"], [17, 2, 1, "", "check_saved_albums"], [17, 2, 1, "", "check_saved_audiobooks"], [17, 2, 1, "", "check_saved_episodes"], [17, 2, 1, "", "check_saved_shows"], [17, 2, 1, "", "check_saved_tracks"], [17, 2, 1, "", "create_playlist"], [17, 2, 1, "", "follow_people"], [17, 2, 1, "", "follow_playlist"], [17, 2, 1, "", "get_album"], [17, 2, 1, "", "get_album_tracks"], [17, 2, 1, "", "get_albums"], [17, 2, 1, "", "get_artist"], [17, 2, 1, "", "get_artist_albums"], [17, 2, 1, "", "get_artist_top_tracks"], [17, 2, 1, "", "get_artists"], [17, 2, 1, "", "get_audiobook"], [17, 2, 1, "", "get_audiobook_chapters"], [17, 2, 1, "", "get_audiobooks"], [17, 2, 1, "", "get_categories"], [17, 2, 1, "", "get_category"], [17, 2, 1, "", "get_category_playlists"], [17, 2, 1, "", "get_chapter"], [17, 2, 1, "", "get_chapters"], [17, 2, 1, "", "get_currently_playing"], [17, 2, 1, "", "get_devices"], [17, 2, 1, "", "get_episode"], [17, 2, 1, "", "get_episodes"], [17, 2, 1, "", "get_featured_playlists"], [17, 2, 1, "", "get_followed_artists"], [17, 2, 1, "", "get_genre_seeds"], [17, 2, 1, "", "get_markets"], [17, 2, 1, "", "get_new_albums"], [17, 2, 1, "", "get_personal_playlists"], [17, 2, 1, "", "get_playback_state"], [17, 2, 1, "", "get_playlist"], [17, 2, 1, "", "get_playlist_cover_image"], [17, 2, 1, "", "get_playlist_items"], [17, 2, 1, "", "get_profile"], [17, 2, 1, "", "get_queue"], [17, 2, 1, "", "get_recently_played"], [17, 2, 1, "", "get_recommendations"], [17, 2, 1, "", "get_related_artists"], [17, 2, 1, "", "get_saved_albums"], [17, 2, 1, "", "get_saved_audiobooks"], [17, 2, 1, "", "get_saved_episodes"], [17, 2, 1, "", "get_saved_shows"], [17, 2, 1, "", "get_saved_tracks"], [17, 2, 1, "", "get_scopes"], [17, 2, 1, "", "get_show"], [17, 2, 1, "", "get_show_episodes"], [17, 2, 1, "", "get_shows"], [17, 2, 1, "", "get_top_items"], [17, 2, 1, "", "get_track"], [17, 2, 1, "", "get_track_audio_analysis"], [17, 2, 1, "", "get_track_audio_features"], [17, 2, 1, "", "get_tracks"], [17, 2, 1, "", "get_tracks_audio_features"], [17, 2, 1, "", "get_user_playlists"], [17, 2, 1, "", "get_user_profile"], [17, 2, 1, "", "pause_playback"], [17, 2, 1, "", "remove_playlist_items"], [17, 2, 1, "", "remove_saved_albums"], [17, 2, 1, "", "remove_saved_audiobooks"], [17, 2, 1, "", "remove_saved_episodes"], [17, 2, 1, "", "remove_saved_shows"], [17, 2, 1, "", "remove_saved_tracks"], [17, 2, 1, "", "save_albums"], [17, 2, 1, "", "save_audiobooks"], [17, 2, 1, "", "save_episodes"], [17, 2, 1, "", "save_shows"], [17, 2, 1, "", "save_tracks"], [17, 2, 1, "", "search"], [17, 2, 1, "", "seek_to_position"], [17, 2, 1, "", "set_access_token"], [17, 2, 1, "", "set_flow"], [17, 2, 1, "", "set_playback_volume"], [17, 2, 1, "", "set_repeat_mode"], [17, 2, 1, "", "skip_to_next"], [17, 2, 1, "", "skip_to_previous"], [17, 2, 1, "", "start_playback"], [17, 2, 1, "", "toggle_playback_shuffle"], [17, 2, 1, "", "transfer_playback"], [17, 2, 1, "", "unfollow_people"], [17, 2, 1, "", "unfollow_playlist"], [17, 2, 1, "", "update_playlist_items"]], "minim.tidal": [[19, 1, 1, "", "API"], [20, 1, 1, "", "PrivateAPI"]], "minim.tidal.API": [[19, 2, 1, "", "get_album"], [19, 2, 1, "", "get_album_by_barcode_id"], [19, 2, 1, "", "get_album_items"], [19, 2, 1, "", "get_albums"], [19, 2, 1, "", "get_artist"], [19, 2, 1, "", "get_artist_albums"], [19, 2, 1, "", "get_artists"], [19, 2, 1, "", "get_similar_albums"], [19, 2, 1, "", "get_similar_artists"], [19, 2, 1, "", "get_similar_tracks"], [19, 2, 1, "", "get_track"], [19, 2, 1, "", "get_track_by_isrc"], [19, 2, 1, "", "get_tracks"], [19, 2, 1, "", "get_video"], [19, 2, 1, "", "get_videos"], [19, 2, 1, "", "search"], [19, 2, 1, "", "set_access_token"], [19, 2, 1, "", "set_flow"]], "minim.tidal.PrivateAPI": [[20, 2, 1, "", "add_playlist_items"], [20, 2, 1, "", "block_artist"], [20, 2, 1, "", "block_user"], [20, 2, 1, "", "create_playlist"], [20, 2, 1, "", "create_playlist_folder"], [20, 2, 1, "", "delete_playlist"], [20, 2, 1, "", "delete_playlist_folder"], [20, 2, 1, "", "delete_playlist_item"], [20, 2, 1, "", "favorite_albums"], [20, 2, 1, "", "favorite_artists"], [20, 2, 1, "", "favorite_mixes"], [20, 2, 1, "", "favorite_playlists"], [20, 2, 1, "", "favorite_tracks"], [20, 2, 1, "", "favorite_videos"], [20, 2, 1, "", "follow_user"], [20, 2, 1, "", "get_album"], [20, 2, 1, "", "get_album_credits"], [20, 2, 1, "", "get_album_items"], [20, 2, 1, "", "get_album_page"], [20, 2, 1, "", "get_album_review"], [20, 2, 1, "", "get_artist"], [20, 2, 1, "", "get_artist_albums"], [20, 2, 1, "", "get_artist_biography"], [20, 2, 1, "", "get_artist_links"], [20, 2, 1, "", "get_artist_mix_id"], [20, 2, 1, "", "get_artist_page"], [20, 2, 1, "", "get_artist_radio"], [20, 2, 1, "", "get_artist_top_tracks"], [20, 2, 1, "", "get_artist_videos"], [20, 2, 1, "", "get_blocked_artists"], [20, 2, 1, "", "get_blocked_users"], [20, 2, 1, "", "get_collection_streams"], [20, 2, 1, "", "get_country_code"], [20, 2, 1, "", "get_favorite_albums"], [20, 2, 1, "", "get_favorite_artists"], [20, 2, 1, "", "get_favorite_ids"], [20, 2, 1, "", "get_favorite_mixes"], [20, 2, 1, "", "get_favorite_tracks"], [20, 2, 1, "", "get_favorite_videos"], [20, 2, 1, "", "get_image"], [20, 2, 1, "", "get_mix_items"], [20, 2, 1, "", "get_mix_page"], [20, 2, 1, "", "get_personal_playlist_folders"], [20, 2, 1, "", "get_personal_playlists"], [20, 2, 1, "", "get_playlist"], [20, 2, 1, "", "get_playlist_etag"], [20, 2, 1, "", "get_playlist_items"], [20, 2, 1, "", "get_playlist_recommendations"], [20, 2, 1, "", "get_profile"], [20, 2, 1, "", "get_session"], [20, 2, 1, "", "get_similar_albums"], [20, 2, 1, "", "get_similar_artists"], [20, 2, 1, "", "get_track"], [20, 2, 1, "", "get_track_composers"], [20, 2, 1, "", "get_track_contributors"], [20, 2, 1, "", "get_track_credits"], [20, 2, 1, "", "get_track_lyrics"], [20, 2, 1, "", "get_track_mix_id"], [20, 2, 1, "", "get_track_playback_info"], [20, 2, 1, "", "get_track_recommendations"], [20, 2, 1, "", "get_track_stream"], [20, 2, 1, "", "get_user_followers"], [20, 2, 1, "", "get_user_following"], [20, 2, 1, "", "get_user_playlist"], [20, 2, 1, "", "get_user_playlists"], [20, 2, 1, "", "get_user_profile"], [20, 2, 1, "", "get_video"], [20, 2, 1, "", "get_video_page"], [20, 2, 1, "", "get_video_playback_info"], [20, 2, 1, "", "get_video_stream"], [20, 2, 1, "", "move_playlist"], [20, 2, 1, "", "move_playlist_item"], [20, 2, 1, "", "search"], [20, 2, 1, "", "set_access_token"], [20, 2, 1, "", "set_flow"], [20, 2, 1, "", "set_playlist_privacy"], [20, 2, 1, "", "unblock_artist"], [20, 2, 1, "", "unblock_user"], [20, 2, 1, "", "unfavorite_albums"], [20, 2, 1, "", "unfavorite_artists"], [20, 2, 1, "", "unfavorite_mixes"], [20, 2, 1, "", "unfavorite_playlist"], [20, 2, 1, "", "unfavorite_tracks"], [20, 2, 1, "", "unfavorite_videos"], [20, 2, 1, "", "unfollow_user"], [20, 2, 1, "", "update_playlist"]], "minim.utility": [[22, 3, 1, "", "format_multivalue"], [23, 3, 1, "", "gestalt_ratio"], [24, 3, 1, "", "levenshtein_ratio"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"minim": [1, 25, 26], "audio": [2, 3, 26, 27], "file": [2, 26, 27], "object": 2, "softwar": [3, 4, 5, 6, 7, 8], "depend": [3, 4, 5, 6, 7, 8], "flacaudio": 4, "mp3audio": 5, "mp4audio": 6, "oggaudio": 7, "waveaudio": 8, "itun": [11, 26], "searchapi": [12, 26], "qobuz": [13, 26, 29], "privateapi": [14, 20, 26], "sampl": [10, 14, 16, 17, 19, 20], "respons": [14, 16, 17, 19, 20], "user": [10, 14, 20, 30], "authent": [10, 14, 20], "subscript": [14, 20], "spotifi": [15, 26, 28, 29], "privatelyricsservic": [16, 26], "webapi": [17, 26], "author": [17, 20], "scope": [17, 20], "tidal": [18, 26, 28, 29], "api": [10, 19, 26, 27], "util": 21, "function": [21, 27], "levenshtein_ratio": 24, "multivalue_formatt": [], "get": [26, 28], "start": 26, "instal": 26, "usag": 26, "music": [26, 29], "servic": 26, "search": 26, "privat": 26, "lyric": 26, "web": 26, "exampl": 26, "artist": 26, "track": 26, "creat": 26, "modifi": 26, "delet": 26, "person": 26, "playlist": [26, 29], "handler": 26, "load": 26, "edit": [26, 27], "convert": [26, 27], "between": 26, "format": 26, "metadata": 27, "setup": 27, "instanti": 27, "client": 27, "find": 27, "defin": 27, "helper": 27, "tag": 27, "an": 27, "exist": 27, "recommend": 28, "transfer": 29, "librari": 29, "prerequisit": 29, "move": 29, "from": 29, "To": 29, "synchron": 29, "favorit": 29, "guid": 30, "format_multivalu": 22, "gestalt_ratio": 23, "discog": 9}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"audio": [[2, "module-minim.audio"]], "Audio file objects": [[2, "audio-file-objects"]], "User Guide": [[30, "user-guide"]], "itunes": [[11, "module-minim.itunes"]], "iTunes": [[11, "id1"]], "MP4Audio": [[6, "mp4audio"]], "Software dependency": [[6, null], [8, null], [7, null], [3, null], [4, null], [5, null]], "WAVEAudio": [[8, "waveaudio"]], "OggAudio": [[7, "oggaudio"]], "Audio": [[3, "audio"]], "FLACAudio": [[4, "flacaudio"]], "MP3Audio": [[5, "mp3audio"]], "SearchAPI": [[12, "searchapi"]], "Minim": [[25, "minim"]], "Getting Started": [[26, "getting-started"]], "Installation": [[26, "installation"]], "Usage": [[26, "usage"]], "Music service APIs": [[26, "music-service-apis"]], "iTunes Search API (minim.itunes.SearchAPI)": [[26, "itunes-search-api-minim-itunes-searchapi"]], "Private Qobuz API (minim.qobuz.PrivateAPI)": [[26, "private-qobuz-api-minim-qobuz-privateapi"]], "Private Spotify Lyrics Service (minim.spotify.PrivateLyricsService)": [[26, "private-spotify-lyrics-service-minim-spotify-privatelyricsservice"]], "Spotify Web API (minim.spotify.WebAPI)": [[26, "spotify-web-api-minim-spotify-webapi"]], "TIDAL API (minim.tidal.API)": [[26, "tidal-api-minim-tidal-api"]], "Private TIDAL API (minim.tidal.PrivateAPI)": [[26, "private-tidal-api-minim-tidal-privateapi"]], "Examples": [[26, "examples"], [26, "id9"]], "Searching for artists": [[26, "searching-for-artists"]], "iTunes Search API": [[26, "itunes-search-api"], [26, "id1"]], "Private Qobuz API": [[26, "private-qobuz-api"], [26, "id2"], [26, "id6"]], "Spotify Web API": [[26, "spotify-web-api"], [26, "id3"], [26, "id7"]], "TIDAL API": [[26, "tidal-api"], [26, "id4"]], "Private TIDAL API": [[26, "private-tidal-api"], [26, "id5"], [26, "id8"]], "Searching for tracks": [[26, "searching-for-tracks"]], "Creating, modifying, and deleting a personal playlist": [[26, "creating-modifying-and-deleting-a-personal-playlist"]], "Audio file handlers": [[26, "audio-file-handlers"]], "Loading and editing audio files": [[26, "loading-and-editing-audio-files"]], "Converting between audio formats": [[26, "converting-between-audio-formats"]], "Editing Audio Metadata": [[27, "editing-audio-metadata"]], "Setup": [[27, "setup"]], "Instantiating API clients": [[27, "instantiating-api-clients"]], "Finding audio files": [[27, "finding-audio-files"]], "Defining helper functions": [[27, "defining-helper-functions"]], "Converting and tagging an audio file with no metadata": [[27, "converting-and-tagging-an-audio-file-with-no-metadata"]], "Tagging an audio file with existing metadata": [[27, "tagging-an-audio-file-with-existing-metadata"]], "TIDAL": [[28, "tidal"], [18, "id1"]], "Spotify": [[28, "spotify"], [15, "id1"]], "Getting Recommendations": [[28, "getting-recommendations"]], "Transferring Music Libraries": [[29, "transferring-music-libraries"]], "Prerequisites": [[29, "prerequisites"]], "Moving playlists": [[29, "moving-playlists"]], "From Qobuz": [[29, "from-qobuz"], [29, "id4"]], "To Spotify": [[29, "to-spotify"], [29, "id3"], [29, "id5"], [29, "id12"]], "To TIDAL": [[29, "to-tidal"], [29, "id1"], [29, "id6"], [29, "id9"]], "From Spotify": [[29, "from-spotify"], [29, "id7"]], "To Qobuz": [[29, "to-qobuz"], [29, "id2"], [29, "id8"], [29, "id11"]], "From TIDAL": [[29, "from-tidal"], [29, "id10"]], "Synchronizing favorites": [[29, "synchronizing-favorites"]], "minim": [[1, "module-minim"]], "qobuz": [[13, "module-minim.qobuz"]], "Qobuz": [[13, "id1"]], "User authentication": [[14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [20, null], [10, null], [10, null], [10, null], [10, null]], "PrivateAPI": [[14, "privateapi"], [20, "privateapi"]], "Sample response": [[14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [14, null], [16, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [19, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null]], "Subscription": [[14, null], [14, null], [14, null]], "spotify": [[15, "module-minim.spotify"]], "PrivateLyricsService": [[16, "privatelyricsservice"]], "levenshtein_ratio": [[24, "levenshtein-ratio"]], "gestalt_ratio": [[23, "gestalt-ratio"]], "format_multivalue": [[22, "format-multivalue"]], "utility": [[21, "module-minim.utility"]], "Utility functions": [[21, "utility-functions"]], "API": [[19, "api"], [10, "api"]], "tidal": [[18, "module-minim.tidal"]], "Sample": [[17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null], [10, null]], "WebAPI": [[17, "webapi"]], "Authorization scope": [[17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [17, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null]], "User authentication and authorization scope": [[20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null], [20, null]], "User authentication, authorization scope, and\n subscription": [[20, null], [20, null], [20, null], [20, null], [20, null]], "User authentication and subscription": [[20, null]], "discogs": [[9, "module-minim.discogs"]], "Discogs": [[9, "id1"]], "Authentication": [[10, null]]}, "indexentries": {"minim": [[1, "module-minim"]], "module": [[1, "module-minim"], [9, "module-minim.discogs"]], "minim.discogs": [[9, "module-minim.discogs"]], "api (class in minim.discogs)": [[10, "minim.discogs.API"]], "delete_user_release_rating() (minim.discogs.api method)": [[10, "minim.discogs.API.delete_user_release_rating"]], "edit_profile() (minim.discogs.api method)": [[10, "minim.discogs.API.edit_profile"]], "get_artist() (minim.discogs.api method)": [[10, "minim.discogs.API.get_artist"]], "get_artist_releases() (minim.discogs.api method)": [[10, "minim.discogs.API.get_artist_releases"]], "get_community_release_rating() (minim.discogs.api method)": [[10, "minim.discogs.API.get_community_release_rating"]], "get_identity() (minim.discogs.api method)": [[10, "minim.discogs.API.get_identity"]], "get_label() (minim.discogs.api method)": [[10, "minim.discogs.API.get_label"]], "get_label_releases() (minim.discogs.api method)": [[10, "minim.discogs.API.get_label_releases"]], "get_master_release() (minim.discogs.api method)": [[10, "minim.discogs.API.get_master_release"]], "get_master_release_versions() (minim.discogs.api method)": [[10, "minim.discogs.API.get_master_release_versions"]], "get_profile() (minim.discogs.api method)": [[10, "minim.discogs.API.get_profile"]], "get_release() (minim.discogs.api method)": [[10, "minim.discogs.API.get_release"]], "get_release_stats() (minim.discogs.api method)": [[10, "minim.discogs.API.get_release_stats"]], "get_user_contributions() (minim.discogs.api method)": [[10, "minim.discogs.API.get_user_contributions"]], "get_user_release_rating() (minim.discogs.api method)": [[10, "minim.discogs.API.get_user_release_rating"]], "get_user_submissions() (minim.discogs.api method)": [[10, "minim.discogs.API.get_user_submissions"]], "search() (minim.discogs.api method)": [[10, "minim.discogs.API.search"]], "set_access_token() (minim.discogs.api method)": [[10, "minim.discogs.API.set_access_token"]], "set_flow() (minim.discogs.api method)": [[10, "minim.discogs.API.set_flow"]], "update_user_release_rating() (minim.discogs.api method)": [[10, "minim.discogs.API.update_user_release_rating"]]}}) \ No newline at end of file diff --git a/docs/source/api/minim.discogs.API.rst b/docs/source/api/minim.discogs.API.rst index 98a28e6..aa3309f 100644 --- a/docs/source/api/minim.discogs.API.rst +++ b/docs/source/api/minim.discogs.API.rst @@ -16,10 +16,11 @@ .. autosummary:: :nosignatures: - ~API.delete_release_user_rating + ~API.delete_user_release_rating ~API.edit_profile ~API.get_artist ~API.get_artist_releases + ~API.get_community_release_rating ~API.get_identity ~API.get_label ~API.get_label_releases @@ -27,14 +28,13 @@ ~API.get_master_release_versions ~API.get_profile ~API.get_release - ~API.get_release_community_rating ~API.get_release_stats - ~API.get_release_user_rating ~API.get_user_contributions + ~API.get_user_release_rating ~API.get_user_submissions ~API.search ~API.set_access_token ~API.set_flow - ~API.update_release_user_rating + ~API.update_user_release_rating \ No newline at end of file diff --git a/environment.yml b/environment.yml index dc6ef29..2bcadea 100644 --- a/environment.yml +++ b/environment.yml @@ -14,6 +14,7 @@ dependencies: - numpy - playwright # DEVELOPMENT DEPENDENCIES + - coverage - pytest - ruff # DOCUMENTATION DEPENDENCIES diff --git a/requirements.txt b/requirements.txt index a317743..f8f2266 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,6 +10,7 @@ numpy pytest-playwright # DEVELOPMENT DEPENDENCIES +coverage pytest ruff diff --git a/src/minim/__init__.py b/src/minim/__init__.py index 69ffa45..c7aa4fe 100644 --- a/src/minim/__init__.py +++ b/src/minim/__init__.py @@ -1,58 +1,48 @@ import configparser +from importlib.util import find_spec import pathlib +import shutil import subprocess import tempfile import warnings -try: - from flask import Flask, request - FOUND_FLASK = True -except ModuleNotFoundError: - FOUND_FLASK = False -try: - from playwright.sync_api import sync_playwright - FOUND_PLAYWRIGHT = True -except ModuleNotFoundError: - FOUND_PLAYWRIGHT = False +FOUND_FFMPEG = shutil.which("ffmpeg") is not None +FOUND_FLASK = find_spec("flask") is not None +FOUND_PLAYWRIGHT = find_spec("playwright") is not None + +VERSION = "1.0.0" +REPOSITORY_URL = "https://github.com/bbye98/minim" -_ = subprocess.run(["ffmpeg", "-version"], capture_output=True) -FOUND_FFMPEG = _.returncode == 0 -FFMPEG_CODECS = {} if FOUND_FFMPEG: - FFMPEG_CODECS["aac"] = ( - "libfdk_aac" if FOUND_FFMPEG and b"--enable-libfdk-aac" in _.stdout - else "aac" - ) - FFMPEG_CODECS["vorbis"] = ( - "libvorbis" if FOUND_FFMPEG and b"--enable-libvorbis" in _.stdout - else "vorbis -strict experimental" - ) + _ = subprocess.run(["ffmpeg", "-version"], capture_output=True) + FFMPEG_CODECS = { + "aac": "libfdk_aac" if b"--enable-libfdk-aac" in _.stdout + else "aac", + "vorbis": "libvorbis" if b"--enable-libvorbis" in _.stdout + else "vorbis -strict experimental" + } else: wmsg = ("FFmpeg was not found, so certain key features in Minim " "are unavailable. To install FFmpeg, visit " - "https://ffmpeg.org/download.html.") + "https://ffmpeg.org/download.html or use " + "'conda install ffmpeg' if Conda is available.") warnings.warn(wmsg) -VERSION = "1.0.0" -REPOSITORY_URL = "https://github.com/bbye98/minim" - DIR_HOME = pathlib.Path.home() DIR_TEMP = pathlib.Path(tempfile.gettempdir()) - ILLEGAL_CHARACTERS = {ord(c): '_' for c in '<>:"/\\|?*'} -config = configparser.ConfigParser() -config.read(DIR_HOME / "minim.cfg") -if not config.has_section("minim"): - config["minim"] = {"version": VERSION} +_config = configparser.ConfigParser() +_config.read(DIR_HOME / "minim.cfg") +if not _config.has_section("minim"): + _config["minim"] = {"version": VERSION} with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) from . import audio, itunes, qobuz, spotify, tidal, utility # noqa: E402 __all__ = [ "audio", "itunes", "qobuz", "spotify", "tidal", "utility", "FOUND_FFMPEG", "FFMPEG_CODECS", "FOUND_FLASK", "FOUND_PLAYWRIGHT", - "VERSION", "REPOSITORY_URL", "DIR_HOME", "DIR_TEMP", "ILLEGAL_CHARACTERS", - "config" + "VERSION", "REPOSITORY_URL", "DIR_HOME", "DIR_TEMP", "ILLEGAL_CHARACTERS" ] \ No newline at end of file diff --git a/src/minim/discogs.py b/src/minim/discogs.py index c784fce..ecc12fd 100644 --- a/src/minim/discogs.py +++ b/src/minim/discogs.py @@ -20,11 +20,11 @@ import requests from . import (FOUND_FLASK, FOUND_PLAYWRIGHT, VERSION, REPOSITORY_URL, - DIR_HOME, DIR_TEMP, config) + DIR_HOME, DIR_TEMP, _config) if FOUND_FLASK: - from . import Flask, request + from flask import Flask, request if FOUND_PLAYWRIGHT: - from . import sync_playwright + from playwright.sync_api import sync_playwright __all__ = ["API"] @@ -227,13 +227,13 @@ def __init__( self.session = requests.Session() self.session.headers["User-Agent"] = f"Minim/{VERSION} +{REPOSITORY_URL}" - if (access_token is None and config.has_section(self._NAME) + if (access_token is None and _config.has_section(self._NAME) and not overwrite): - 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") + 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") elif flow is None and access_token is not None: flow = "discogs" if access_token_secret is None else "oauth" @@ -395,8 +395,8 @@ def set_access_token( oauth |= dict( urllib.parse.parse_qsl( urllib.parse.urlparse( - re.search(f'{self._redirect_uri}\?(.*?)"', - f.read()).group(0) + re.search(fr'{self._redirect_uri}\?(.*?)"', + f.read()).group(0) ).query ) ) @@ -465,7 +465,7 @@ def _callback() -> str: dict(urllib.parse.parse_qsl(r.text)).values() if self._save: - config[self._NAME] = { + _config[self._NAME] = { "flow": self._flow, "access_token": access_token, "access_token_secret": access_token_secret, @@ -473,7 +473,7 @@ def _callback() -> str: "consumer_secret": self._consumer_secret } with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) self._oauth |= { "oauth_token": access_token, @@ -525,6 +525,54 @@ def set_flow( * :code:`"oauth"` for the OAuth 1.0a flow. 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. + + 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. + + save : `bool`, keyword-only, default: :code:`True` + Determines whether newly obtained access tokens and their + associated properties are stored to the Minim configuration + file. """ if flow and flow not in self._FLOWS: @@ -544,8 +592,8 @@ def set_flow( if redirect_uri: self._redirect_uri = redirect_uri if "localhost" in redirect_uri: - self._port = re.search("localhost:(\d+)", - redirect_uri).group(1) + self._port = re.search(r"localhost:(\d+)", + redirect_uri).group(1) elif web_framework: wmsg = ("The redirect URI is not on localhost, " "so automatic authorization code " @@ -753,7 +801,7 @@ def get_release( params={"curr_abbr": curr_abbr} ) - def get_release_user_rating( + def get_user_release_rating( self, release_id: Union[int, str], username: str = None ) -> dict[str, Any]: @@ -804,7 +852,7 @@ def get_release_user_rating( f"{self.API_URL}/releases/{release_id}/rating/{username}" ) - def update_release_user_rating( + def update_user_release_rating( self, release_id: Union[int, str], rating: int, username: str = None) -> dict[str, Any]: @@ -854,7 +902,7 @@ def update_release_user_rating( } """ - self._check_authentication("update_release_rating") + self._check_authentication("update_user_release_rating") if username is None: if hasattr(self, "_username"): @@ -868,23 +916,220 @@ def update_release_user_rating( json={"rating": rating} ) - def delete_release_user_rating( + def delete_user_release_rating( self, release_id: Union[int, str], username: str = None) -> None: + + """ + `Database > Release Rating By User > Delete Release Rating By + User `_: + Deletes the release's rating for a given user. + + .. admonition:: User authentication + :class: warning + + Requires user authentication with a personal access token or + via the OAuth 1.0a flow. + + Parameters + ---------- + release_id : `int` or `str` + The release ID. + + **Example**: :code:`249504`. + + username : `str`, optional + The username of the user whose rating you are requesting. If + not specified, the username of the authenticated user is + used. + + **Example**: :code:`"memory"`. + """ + + self._check_authentication("delete_user_release_rating") - raise NotImplementedError + if username is None: + if hasattr(self, "_username"): + username = self._username + else: + raise ValueError("No username provided.") + + return self._request( + "delete", + f"{self.API_URL}/releases/{release_id}/rating/{username}" + ) + + def get_community_release_rating( + self, release_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Community Release Rating `_: Retrieves the + community release rating average and count. + + Parameters + ---------- + release_id : `int` or `str` + The release ID. + + **Example**: :code:`249504`. + + Returns + ------- + rating : `dict` + Community release rating average and count. - def get_release_community_rating( - self, release_id: Union[int, str]) -> dict[str, Any]: + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "rating": { + "count": , + "average": + }, + "release_id": + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/releases/{release_id}/rating") def get_release_stats(self, release_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Release Stats `_: Retrieves + the release's "have" and "want" counts. + + .. attention:: + + This endpoint does not appear to be working correctly. + Currently, the response will be of the form + + .. code:: + + { + "is_offense": + } + + Parameters + ---------- + release_id : `int` or `str` + The release ID. + + **Example**: :code:`249504`. + + Returns + ------- + stats : `dict` + Release "have" and "want" counts. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "num_have": , + "num_want": + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/releases/{release_id}/stats") def get_master_release(self, master_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Master Release `_: Get a + master release. + + Parameters + ---------- + master_id : `int` or `str` + The master release ID. + + **Example**: :code:`1000`. + + Returns + ------- + master_release : `dict` + Discogs database information for a single master release. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "styles": [], + "genres": [], + "videos": [ + { + "duration": , + "description": , + "embed": , + "uri": , + "title": + } + ], + "title": , + "main_release": , + "main_release_url": , + "uri": , + "artists": [ + { + "join": , + "name": , + "anv": , + "tracks": , + "role": , + "resource_url": , + "id": + } + ], + "versions_url": , + "year": , + "images": [ + { + "height": , + "resource_url": , + "type": , + "uri": , + "uri150": , + "width": + } + ], + "resource_url": , + "tracklist": [ + { + "duration": , + "position": , + "type_": , + "extraartists": [ + { + "join": , + "name": , + "anv": , + "tracks": , + "role": , + "resource_url": , + "id": + } + ], + "title": + } + ], + "id": , + "num_for_sale": , + "lowest_price": , + "data_quality": + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/masters/{master_id}") def get_master_release_versions( self, master_id: Union[int, str], *, country: str = None, @@ -892,38 +1137,568 @@ def get_master_release_versions( page: int = None, per_page: int = None, sort: str = None, sort_order: str = None) -> dict[str, Any]: - raise NotImplementedError + """ + `Database > Master Release Versions `_: Retrieves a list of + all releases that are versions of this master. + + Parameters + ---------- + master_id : `int` or `str` + The master release ID. + + **Example**: :code:`1000`. + + country : `str`, keyword-only, optional + The country to filter for. + + **Example**: :code:`"Belgium"`. + + format : `str`, keyword-only, optional + The format to filter for. + + **Example**: :code:`"Vinyl"`. + + label : `str`, keyword-only, optional + The label to filter for. + + **Example**: :code:`"Scorpio Music"`. + + released : `str`, keyword-only, optional + The release year to filter for. + + **Example**: :code:`"1992"`. + + page : `int`, keyword-only, optional + The page you want to request. + + **Example**: :code:`3`. + + per_page : `int`, keyword-only, optional + The number of items per page. + + **Example**: :code:`25`. + + sort : `str`, keyword-only, optional + Sort items by this field. + + **Valid values**: :code:`"released"`, :code:`"title"`, + :code:`"format"`, :code:`"label"`, :code:`"catno"`, + and :code:`"country"`. + + sort_order : `str`, keyword-only, optional + Sort items in a particular order. + + **Valid values**: :code:`"asc"` and :code:`"desc"`. + + Returns + ------- + versions : `dict` + Discogs database information for all releases that are + versions of the specified master. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": , + "page": , + "pages": , + "per_page": , + "urls": { + "last": , + "next": + } + }, + "versions": [ + { + "status": , + "stats": { + "user": { + "in_collection": , + "in_wantlist": + }, + "community": { + "in_collection": , + "in_wantlist": + } + }, + "thumb": , + "format": , + "country": , + "title": , + "label": , + "released": , + "major_formats": [], + "catno": , + "resource_url": , + "id": + } + ] + } + """ + + return self._get_json( + f"{self.API_URL}/masters/{master_id}/versions", + params={ + "country": country, + "format": format, + "label": label, + "released": released, + "page": page, + "per_page": per_page, + "sort": sort, + "sort_order": sort_order + }, + ) def get_artist(self, artist_id: Union[int, str]) -> dict[str, Any]: + + """ + `Database > Artist `_: Get an artist. + + Parameters + ---------- + artist_id : `int` or `str` + The artist ID. + + **Example**: :code:`108713`. + + Returns + ------- + artist : `dict` + Discogs database information for a single artist. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "namevariations": [], + "profile": , + "releases_url": , + "resource_url": , + "uri": , + "urls": [], + "data_quality": , + "id": , + "images": [ + { + "height": , + "resource_url": , + "type": , + "uri": , + "uri150": , + "width": + } + ], + "members": [ + { + "active": , + "id": , + "name": , + "resource_url": + } + ] + } + """ - raise NotImplementedError + return self._get_json(f"{self.API_URL}/artists/{artist_id}") def get_artist_releases( - self, artist_id: Union[int, str], *, sort: str = None, - sort_order: str = None) -> dict[str, Any]: + self, artist_id: Union[int, str], *, page: int = None, + per_page: int = None, sort: str = None, sort_order: str = None + ) -> dict[str, Any]: + + """ + `Database > Artist Releases `_: Get an + artist's releases and masters. + + Parameters + ---------- + artist_id : `int` or `str` + The artist ID. + + **Example**: :code:`108713`. + + page : `int`, keyword-only, optional + Page of results to fetch. + + per_page : `int`, keyword-only, optional + Number of results per page. + + sort : `str`, keyword-only, optional + Sort results by this field. + + **Valid values**: :code:`"year"`, :code:`"title"`, and + :code:`"format"`. + + sort_order : `str`, keyword-only, optional + Sort results in a particular order. + + **Valid values**: :code:`"asc"` and :code:`"desc"`. + + Returns + ------- + releases : `dict` + Discogs database information for all releases by the + specified artist. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": , + "page": , + "pages": , + "per_page": , + "urls": { + "last": , + "next": + } + }, + "releases": [ + { + "artist": , + "id": , + "main_release": , + "resource_url": , + "role": , + "thumb": , + "title": , + "type": , + "year": + } + ] + } + """ - raise NotImplementedError + return self._get_json( + f"{self.API_URL}/artists/{artist_id}/releases", + params={ + "page": page, + "per_page": per_page, + "sort": sort, + "sort_order": sort_order + } + ) def get_label(self, label_id: Union[int, str]) -> dict[str, Any]: - raise NotImplementedError + """ + `Database > Label `_: Get a label, + company, recording studio, locxation, or other entity involved + with artists and releases. + + Parameters + ---------- + label_id : `int` or `str` + The label ID. + + **Example**: :code:`1`. + + Returns + ------- + label : `dict` + Discogs database information for a single label. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "profile": , + "releases_url": , + "name": , + "contact_info": , + "uri": , + "sublabels": [ + { + "resource_url": , + "id": , + "name": + } + ], + "urls": [], + "images": [ + { + "height": , + "resource_url": , + "type": , + "uri": , + "uri150": , + "width": + } + ], + "resource_url": , + "id": , + "data_quality": + } + """ + + return self._get_json(f"{self.API_URL}/labels/{label_id}") def get_label_releases( self, label_id: Union[int, str], *, page: int = None, per_page: int = None) -> dict[str, Any]: + + """ + `Database > Label Releases `_: Get a + list of releases associated with the label. + + Parameters + ---------- + label_id : `int` or `str` + The label ID. + + **Example**: :code:`1`. + + page : `int`, keyword-only, optional + Page of results to fetch. + + per_page : `int`, keyword-only, optional + Number of results per page. + + Returns + ------- + releases : `dict` + Discogs database information for all releases by the + specified label. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": , + "page": , + "pages": , + "per_page": , + "urls": { + "last": , + "next": + } + }, + "releases": [ + { + "artist": , + "catno": , + "format": , + "id": , + "resource_url": , + "status": , + "thumb": , + "title": , + "year": + } + ] + } + """ - raise NotImplementedError + return self._get_json( + f"{self.API_URL}/labels/{label_id}/releases", + params={"page": page, "per_page": per_page} + ) def search( - self, query: str, *, type: str = None, title: str = None, + self, query: str = None, *, type: str = None, title: str = None, release_title: str = None, credit: str = None, artist: str = None, anv: str = None, label: str = None, genre: str = None, style: str = None, country: str = None, year: str = None, format: str = None, catno: str = None, barcode: str = None, track: str = None, submitter: str = None, - contributor: str = None): + contributor: str = None) -> dict[str, Any]: - raise NotImplementedError + """ + `Database > Search `_: Issue a search + query to the Discogs database. + + .. admonition:: Authentication + :class: warning + + Requires authentication with consumer credentials, with a + personal access token, or via the OAuth 1.0a flow. + + Parameters + ---------- + query : `str`, optional + The search query. + + **Example**: :code:`"Nirvana"`. + + type : `str`, keyword-only, optional + The type of item to search for. + + **Valid values**: :code:`"release"`, :code:`"master"`, + :code:`"artist"`, and :code:`"label"`. + + title : `str`, keyword-only, optional + Search by combined :code:`" - "` + title field. + + **Example**: :code:`"Nirvana - Nevermind"`. + + release_title : `str`, keyword-only, optional + Search release titles. + + **Example**: :code:`"Nevermind"`. + + credit : `str`, keyword-only, optional + Search release credits. + + **Example**: :code:`"Kurt"`. + + artist : `str`, keyword-only, optional + Search artist names. + + **Example**: :code:`"Nirvana"`. + + anv : `str`, keyword-only, optional + Search artist name variations (ANV). + + **Example**: :code:`"Nirvana"`. + + label : `str`, keyword-only, optional + Search labels. + + **Example**: :code:`"DGC"`. + + genre : `str`, keyword-only, optional + Search genres. + + **Example**: :code:`"Rock"`. + + style : `str`, keyword-only, optional + Search styles. + + **Example**: :code:`"Grunge"`. + + country : `str`, keyword-only, optional + Search release country. + + **Example**: :code:`"Canada"`. + + year : `str`, keyword-only, optional + Search release year. + + **Example**: :code:`"1991"`. + + format : `str`, keyword-only, optional + Search formats. + + **Example**: :code:`"Album"`. + + catno : `str`, keyword-only, optional + Search catalog number. + + **Example**: :code:`"DGCD-24425"`. + + barcode : `str`, keyword-only, optional + Search barcode. + + **Example**: :code:`"720642442524"`. + + track : `str`, keyword-only, optional + Search track. + + **Example**: :code:`"Smells Like Teen Spirit"`. + + submitter : `str`, keyword-only, optional + Search submitter username. + + **Example**: :code:`"milKt"`. + + contributor : `str`, keyword-only, optional + Search contributor username. + + **Example**: :code:`"jerome99"`. + + Returns + ------- + results : `dict` + Search results. + + .. admonition:: Sample + :class: dropdown + + .. code:: + + { + "pagination": { + "items": , + "page": , + "pages": , + "per_page": , + "urls": { + "last": , + "next": + } + }, + "results": [ + { + "style": [], + "thumb": , + "title": , + "country": , + "format": [], + "uri": , + "community": { + "want": , + "have": + }, + "label": [], + "catno": , + "year": , + "genre": [], + "resource_url": , + "type": , + "id": + } + ] + } + """ + + self._check_authentication("search", False) + + return self._get_json( + f"{self.API_URL}/database/search", + params={ + "q": query, + "type": type, + "title": title, + "release_title": release_title, + "credit": credit, + "artist": artist, + "anv": anv, + "label": label, + "genre": genre, + "style": style, + "country": country, + "year": year, + "format": format, + "catno": catno, + "barcode": barcode, + "track": track, + "submitter": submitter, + "contributor": contributor + } + ) ### MARKETPLACE ########################################################### @@ -964,7 +1739,7 @@ def get_identity(self) -> dict[str, Any]: .. code:: { - "id": , + "id": , "username": , "resource_url": , "consumer_name": @@ -1015,7 +1790,7 @@ def get_profile(self, username: str = None) -> dict[str, Any]: "wantlist_url": , "rank": , "num_pending": , - "id": , + "id": , "num_for_sale": , "home_page": , "location": , @@ -1208,7 +1983,10 @@ def get_user_submissions( "page": , "pages": , "per_page": , - "urls": {} + "urls": { + "last": , + "next": + } }, "submissions": { "artists": [ @@ -1384,7 +2162,10 @@ def get_user_contributions( "page": , "pages": , "per_page": , - "urls": {} + "urls": { + "last": , + "next": + } }, "contributions": [ { @@ -1489,8 +2270,12 @@ def get_user_contributions( return self._get_json( f"{self.API_URL}/users/{username}/contributions", - params={"page": page, "per_page": per_page, "sort": sort, - "sort_order": sort_order} + params={ + "page": page, + "per_page": per_page, + "sort": sort, + "sort_order": sort_order + } ) ### USER COLLECTION ####################################################### diff --git a/src/minim/qobuz.py b/src/minim/qobuz.py index 3dff0c1..ce71406 100644 --- a/src/minim/qobuz.py +++ b/src/minim/qobuz.py @@ -16,9 +16,9 @@ import requests -from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, config +from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, _config if FOUND_PLAYWRIGHT: - from . import sync_playwright + from playwright.sync_api import sync_playwright __all__ = ["PrivateAPI"] @@ -211,12 +211,12 @@ def __init__( if user_agent: self.session.headers["User-Agent"] = user_agent - if (auth_token is None and config.has_section(self._NAME) + if (auth_token is None and _config.has_section(self._NAME) and not overwrite): - flow = config.get(self._NAME, "flow") or None - auth_token = config.get(self._NAME, "auth_token") - app_id = config.get(self._NAME, "app_id") - app_secret = config.get(self._NAME, "app_secret") + flow = _config.get(self._NAME, "flow") or None + auth_token = _config.get(self._NAME, "auth_token") + app_id = _config.get(self._NAME, "app_id") + app_secret = _config.get(self._NAME, "app_secret") self.set_flow(flow, app_id=app_id, app_secret=app_secret, auth_token=auth_token, browser=browser, save=save) @@ -379,14 +379,14 @@ def set_auth_token( auth_token = r["user_auth_token"] if self._save: - config[self._NAME] = { + _config[self._NAME] = { "flow": self._flow, "auth_token": auth_token, "app_id": self.session.headers["X-App-Id"], "app_secret": self._app_secret } with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) self.session.headers["X-User-Auth-Token"] = auth_token diff --git a/src/minim/spotify.py b/src/minim/spotify.py index 6f8a8d9..5b0d096 100644 --- a/src/minim/spotify.py +++ b/src/minim/spotify.py @@ -26,11 +26,11 @@ import requests -from . import FOUND_FLASK, FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, config +from . import FOUND_FLASK, FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, _config if FOUND_FLASK: - from . import Flask, request + from flask import Flask, request if FOUND_PLAYWRIGHT: - from . import sync_playwright + from playwright.sync_api import sync_playwright __all__ = ["PrivateLyricsService", "WebAPI"] @@ -161,10 +161,10 @@ def __init__( self.session = requests.Session() self.session.headers["App-Platform"] = "WebPlayer" - if access_token is None and config.has_section(self._NAME): - sp_dc = config.get(self._NAME, "sp_dc") - access_token = config.get(self._NAME, "access_token") - expiry = config.get(self._NAME, "expiry") + if access_token is None and _config.has_section(self._NAME): + sp_dc = _config.get(self._NAME, "sp_dc") + access_token = _config.get(self._NAME, "access_token") + expiry = _config.get(self._NAME, "expiry") self.set_sp_dc(sp_dc, save=save) self.set_access_token(access_token=access_token, expiry=expiry) @@ -289,13 +289,13 @@ def set_access_token( ) if self._save: - config[self._NAME] = { + _config[self._NAME] = { "sp_dc": self._sp_dc, "access_token": access_token, "expiry": expiry.strftime("%Y-%m-%dT%H:%M:%SZ") } with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) self.session.headers["Authorization"] = f"Bearer {access_token}" self._expiry = ( @@ -685,20 +685,20 @@ def __init__( self.session = requests.Session() - if (access_token is None and config.has_section(self._NAME) + if (access_token is None and _config.has_section(self._NAME) and not overwrite): - flow = config.get(self._NAME, "flow") - access_token = config.get(self._NAME, "access_token") - refresh_token = config.get(self._NAME, "refresh_token", + flow = _config.get(self._NAME, "flow") + access_token = _config.get(self._NAME, "access_token") + refresh_token = _config.get(self._NAME, "refresh_token", fallback=None) - expiry = config.get(self._NAME, "expiry", fallback=None) - client_id = config.get(self._NAME, "client_id") - client_secret = config.get(self._NAME, "client_secret", + expiry = _config.get(self._NAME, "expiry", fallback=None) + client_id = _config.get(self._NAME, "client_id") + client_secret = _config.get(self._NAME, "client_secret", fallback=None) - redirect_uri = config.get(self._NAME, "redirect_uri", + redirect_uri = _config.get(self._NAME, "redirect_uri", fallback=None) - scopes = config.get(self._NAME, "scopes") - sp_dc = config.get(self._NAME, "sp_dc", fallback=None) + scopes = _config.get(self._NAME, "scopes") + sp_dc = _config.get(self._NAME, "sp_dc", fallback=None) self.set_flow( flow, client_id=client_id, client_secret=client_secret, @@ -879,14 +879,14 @@ def _refresh_access_token(self) -> None: self._scopes = r["scope"] if self._save: - config[self._NAME].update({ + _config[self._NAME].update({ "access_token": r["access_token"], "refresh_token": self._refresh_token, "expiry": self._expiry.strftime("%Y-%m-%dT%H:%M:%SZ"), "scopes": self._scopes }) with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) def _request( self, method: str, url: str, retry: bool = True, **kwargs @@ -1015,7 +1015,7 @@ def set_access_token( + datetime.timedelta(0, r["expires_in"])) if self._save: - config[self._NAME] = { + _config[self._NAME] = { "flow": self._flow, "client_id": self._client_id, "access_token": access_token, @@ -1023,14 +1023,14 @@ def set_access_token( "scopes": self._scopes } if refresh_token: - config[self._NAME]["refresh_token"] \ + _config[self._NAME]["refresh_token"] \ = refresh_token for attr in ("client_secret", "redirect_uri", "sp_dc"): if hasattr(self, f"_{attr}"): - config[self._NAME][attr] \ + _config[self._NAME][attr] \ = getattr(self, f"_{attr}") or "" with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) self.session.headers["Authorization"] = f"Bearer {access_token}" self._refresh_token = refresh_token diff --git a/src/minim/tidal.py b/src/minim/tidal.py index dc09d61..5016724 100644 --- a/src/minim/tidal.py +++ b/src/minim/tidal.py @@ -27,9 +27,9 @@ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes import requests -from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, config +from . import FOUND_PLAYWRIGHT, DIR_HOME, DIR_TEMP, _config if FOUND_PLAYWRIGHT: - from . import sync_playwright + from playwright.sync_api import sync_playwright __all__ = ["API", "PrivateAPI"] @@ -156,13 +156,13 @@ def __init__( self.session = requests.Session() self.session.headers["Content-Type"] = "application/vnd.tidal.v1+json" - if (access_token is None and config.has_section(self._NAME) + if (access_token is None and _config.has_section(self._NAME) and not overwrite): - flow = config.get(self._NAME, "flow") - access_token = config.get(self._NAME, "access_token") - expiry = config.get(self._NAME, "expiry") - client_id = config.get(self._NAME, "client_id") - client_secret = config.get(self._NAME, "client_secret") + flow = _config.get(self._NAME, "flow") + access_token = _config.get(self._NAME, "access_token") + expiry = _config.get(self._NAME, "expiry") + client_id = _config.get(self._NAME, "client_id") + client_secret = _config.get(self._NAME, "client_secret") self.set_flow(flow, client_id=client_id, client_secret=client_secret, save=save) @@ -263,7 +263,7 @@ def set_access_token( + datetime.timedelta(0, r["expires_in"])) if self._save: - config[self._NAME] = { + _config[self._NAME] = { "flow": self._flow, "client_id": self._client_id, "client_secret": self._client_secret, @@ -271,7 +271,7 @@ def set_access_token( "expiry": expiry.strftime("%Y-%m-%dT%H:%M:%SZ") } with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) self.session.headers["Authorization"] = f"Bearer {access_token}" self._expiry = ( @@ -2015,15 +2015,15 @@ def __init__( if user_agent: self.session.headers["User-Agent"] = user_agent - if (access_token is None and config.has_section(self._NAME) + if (access_token is None and _config.has_section(self._NAME) and not overwrite): - flow = config.get(self._NAME, "flow") - access_token = config.get(self._NAME, "access_token") - refresh_token = config.get(self._NAME, "refresh_token") - expiry = config.get(self._NAME, "expiry") - client_id = config.get(self._NAME, "client_id") - client_secret = config.get(self._NAME, "client_secret") - scopes = config.get(self._NAME, "scopes") + flow = _config.get(self._NAME, "flow") + access_token = _config.get(self._NAME, "access_token") + refresh_token = _config.get(self._NAME, "refresh_token") + expiry = _config.get(self._NAME, "expiry") + client_id = _config.get(self._NAME, "client_id") + client_secret = _config.get(self._NAME, "client_secret") + scopes = _config.get(self._NAME, "scopes") self.set_flow(flow, client_id=client_id, client_secret=client_secret, browser=browser, scopes=scopes, save=save) @@ -2224,13 +2224,13 @@ def _refresh_access_token(self) -> None: self._scopes = r["scope"] if self._save: - config[self._NAME].update({ + _config[self._NAME].update({ "access_token": r["access_token"], "expiry": self._expiry.strftime("%Y-%m-%dT%H:%M:%SZ"), "scopes": self._scopes }) with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) def _request( self, method: str, url: str, retry: bool = True, **kwargs @@ -2381,7 +2381,7 @@ def set_access_token( + datetime.timedelta(0, r["expires_in"])) if self._save: - config[self._NAME] = { + _config[self._NAME] = { "flow": self._flow, "client_id": self._client_id, "access_token": access_token, @@ -2390,10 +2390,10 @@ def set_access_token( "scopes": self._scopes } if hasattr(self, "_client_secret"): - config[self._NAME]["client_secret"] \ + _config[self._NAME]["client_secret"] \ = self._client_secret with open(DIR_HOME / "minim.cfg", "w") as f: - config.write(f) + _config.write(f) self.session.headers["Authorization"] = f"Bearer {access_token}" self._refresh_token = refresh_token diff --git a/src/minim/utility.py b/src/minim/utility.py index 8ad2591..7343d3a 100644 --- a/src/minim/utility.py +++ b/src/minim/utility.py @@ -20,7 +20,7 @@ except ModuleNotFoundError: FOUND_NUMPY = False -__all__ = ["format_multivalue", "gestalt_ratios", "levenshtein_ratios"] +__all__ = ["format_multivalue", "gestalt_ratio", "levenshtein_ratio"] def format_multivalue( value: Any, multivalue: bool, *, primary: bool = False, diff --git a/tests/data/samples/middle_c.flac b/tests/data/samples/middle_c.flac index ad24392..e45f8fb 100644 Binary files a/tests/data/samples/middle_c.flac and b/tests/data/samples/middle_c.flac differ diff --git a/tests/data/samples/middle_c.mp3 b/tests/data/samples/middle_c.mp3 index b90450e..1ad0c8c 100644 Binary files a/tests/data/samples/middle_c.mp3 and b/tests/data/samples/middle_c.mp3 differ diff --git a/tests/data/samples/middle_c_16bit.wav b/tests/data/samples/middle_c_16bit.wav index 1cd39d6..942f6d2 100644 Binary files a/tests/data/samples/middle_c_16bit.wav and b/tests/data/samples/middle_c_16bit.wav differ diff --git a/tests/data/samples/middle_c_aac.m4a b/tests/data/samples/middle_c_aac.m4a index b4a3b41..a96563b 100644 Binary files a/tests/data/samples/middle_c_aac.m4a and b/tests/data/samples/middle_c_aac.m4a differ diff --git a/tests/data/samples/middle_c_alac.m4a b/tests/data/samples/middle_c_alac.m4a index 0995e21..5c3b6a7 100644 Binary files a/tests/data/samples/middle_c_alac.m4a and b/tests/data/samples/middle_c_alac.m4a differ diff --git a/tests/data/samples/middle_c_flac.ogg b/tests/data/samples/middle_c_flac.ogg index 2f78b49..5ef710d 100644 Binary files a/tests/data/samples/middle_c_flac.ogg and b/tests/data/samples/middle_c_flac.ogg differ diff --git a/tests/data/samples/middle_c_opus.ogg b/tests/data/samples/middle_c_opus.ogg index 1bd54f7..7ac9053 100644 Binary files a/tests/data/samples/middle_c_opus.ogg and b/tests/data/samples/middle_c_opus.ogg differ diff --git a/tests/data/samples/middle_c_vorbis.ogg b/tests/data/samples/middle_c_vorbis.ogg index c0a6219..4359c5c 100644 Binary files a/tests/data/samples/middle_c_vorbis.ogg and b/tests/data/samples/middle_c_vorbis.ogg differ diff --git a/tests/test_discogs.py b/tests/test_discogs.py index 7121885..4e85fda 100644 --- a/tests/test_discogs.py +++ b/tests/test_discogs.py @@ -6,6 +6,55 @@ class TestAPI: + ARTIST_ID = 108713 + LABEL_ID = 1 + MASTER_RELEASE_ID = 1000 + RELEASE_ID = 249504 + USERNAME = "bbye98" + @classmethod def setup_class(cls): - cls.obj = discogs.API() \ No newline at end of file + cls.obj = discogs.API() + + def test_get_release(self): + assert self.obj.get_release(self.RELEASE_ID)["id"] == self.RELEASE_ID + + def test_get_user_release_rating(self): + assert self.obj.get_user_release_rating( + self.RELEASE_ID, + self.USERNAME + )["release_id"] == self.RELEASE_ID + + def test_get_community_release_rating(self): + assert self.obj.get_community_release_rating( + self.RELEASE_ID + )["release_id"] == self.RELEASE_ID + + # def test_get_release_stats(self): + # r = self.obj.get_release_stats(self.RELEASE_ID) + # assert "num_have" in r and "num_want" in r + + def test_get_master_release(self): + assert self.obj.get_master_release( + self.MASTER_RELEASE_ID + )["id"] == self.MASTER_RELEASE_ID + + def test_get_master_release_versions(self): + assert "versions" in self.obj.get_master_release_versions( + self.MASTER_RELEASE_ID + ) + + def test_get_artist(self): + assert self.obj.get_artist(self.ARTIST_ID)["id"] == self.ARTIST_ID + + def test_get_artist_releases(self): + assert "releases" in self.obj.get_artist_releases(self.ARTIST_ID) + + def test_get_label(self): + assert self.obj.get_label(self.LABEL_ID)["id"] == self.LABEL_ID + + def test_get_label_releases(self): + assert "releases" in self.obj.get_label_releases(self.LABEL_ID) + + def test_search(self): + assert "results" in self.obj.search(title="Nirvana - Nevermind") \ No newline at end of file diff --git a/tests/test_qobuz.py b/tests/test_qobuz.py index 8020dfb..bbc996b 100644 --- a/tests/test_qobuz.py +++ b/tests/test_qobuz.py @@ -43,4 +43,7 @@ def test_get_track(self): assert self.obj.get_track(self.TRACK_ID)["id"] == self.TRACK_ID def test_get_track_performers(self): - assert isinstance(self.obj.get_track_performers(self.TRACK_ID), dict) \ No newline at end of file + assert isinstance(self.obj.get_track_performers(self.TRACK_ID), dict) + + def search(self): + pass \ No newline at end of file