Formatting

This commit is contained in:
Nathan Thomas 2021-09-16 18:48:27 -07:00
parent 1f3b24e5b7
commit 35c8932ffb
12 changed files with 151 additions and 363 deletions

View file

@ -112,18 +112,14 @@ class RipCore(list):
else:
self.config = config
if (
theme := self.config.file["theme"]["progress_bar"]
) != TQDM_DEFAULT_THEME:
if (theme := self.config.file["theme"]["progress_bar"]) != TQDM_DEFAULT_THEME:
set_progress_bar_theme(theme.lower())
def get_db(db_type: str) -> db.Database:
db_settings = self.config.session["database"]
db_class = db.CLASS_MAP[db_type]
if db_settings[db_type]["enabled"] and db_settings.get(
"enabled", True
):
if db_settings[db_type]["enabled"] and db_settings.get("enabled", True):
default_db_path = DB_PATH_MAP[db_type]
path = db_settings[db_type]["path"]
@ -218,8 +214,7 @@ class RipCore(list):
logger.debug(session)
# So that the dictionary isn't searched for the same keys multiple times
artwork, conversion, filepaths, metadata = (
session[key]
for key in ("artwork", "conversion", "filepaths", "metadata")
session[key] for key in ("artwork", "conversion", "filepaths", "metadata")
)
concurrency = session["downloads"]["concurrency"]
return {
@ -265,9 +260,7 @@ class RipCore(list):
)
exit()
for counter, (source, media_type, item_id) in enumerate(
self.failed_db
):
for counter, (source, media_type, item_id) in enumerate(self.failed_db):
if counter >= max_items:
break
@ -290,9 +283,7 @@ class RipCore(list):
logger.debug("Arguments from config: %s", arguments)
source_subdirs = self.config.session["downloads"][
"source_subdirectories"
]
source_subdirs = self.config.session["downloads"]["source_subdirectories"]
for item in self:
# Item already checked in database in handle_urls
if source_subdirs:
@ -304,26 +295,20 @@ class RipCore(list):
item.download(**arguments)
continue
arguments["quality"] = self.config.session[item.client.source][
"quality"
]
arguments["quality"] = self.config.session[item.client.source]["quality"]
if isinstance(item, Artist):
filters_ = tuple(
k for k, v in self.config.session["filters"].items() if v
)
arguments["filters"] = filters_
logger.debug(
"Added filter argument for artist/label: %s", filters_
)
logger.debug("Added filter argument for artist/label: %s", filters_)
if not isinstance(item, Tracklist) or not item.loaded:
logger.debug("Loading metadata")
try:
item.load_meta(**arguments)
except NonStreamable:
self.failed_db.add(
(item.client.source, item.type, item.id)
)
self.failed_db.add((item.client.source, item.type, item.id))
secho(f"{item!s} is not available, skipping.", fg="red")
continue
@ -360,9 +345,7 @@ class RipCore(list):
:param featured_list: The name of the list. See `rip discover --help`.
:type featured_list: str
"""
self.extend(
self.search("qobuz", featured_list, "featured", limit=max_items)
)
self.extend(self.search("qobuz", featured_list, "featured", limit=max_items))
def get_client(self, source: str) -> Client:
"""Get a client given the source and log in.
@ -427,6 +410,17 @@ class RipCore(list):
self.config.file["qobuz"]["secrets"],
) = client.get_tokens()
self.config.save()
elif (
client.source == "soundcloud"
and not creds.get("client_id")
and not creds.get("app_version")
):
(
self.config.file["soundcloud"]["client_id"],
self.config.file["soundcloud"]["app_version"],
) = client.get_tokens()
self.config.save()
elif client.source == "tidal":
self.config.file["tidal"].update(client.get_tokens())
self.config.save() # only for the expiry stamp
@ -435,14 +429,14 @@ class RipCore(list):
"""Return the type of the url and the id.
Compatible with urls of the form:
https://www.qobuz.com/us-en/{type}/{name}/{id}
https://open.qobuz.com/{type}/{id}
https://play.qobuz.com/{type}/{id}
https://www.qobuz.com/us-en/type/name/id
https://open.qobuz.com/type/id
https://play.qobuz.com/type/id
https://www.deezer.com/us/{type}/{id}
https://tidal.com/browse/{type}/{id}
https://www.deezer.com/us/type/id
https://tidal.com/browse/type/id
:raises exceptions.ParsingError
:raises exceptions.ParsingError:
"""
parsed: List[Tuple[str, str, str]] = []
@ -468,20 +462,25 @@ class RipCore(list):
fg="yellow",
)
parsed.extend(
("deezer", *extract_deezer_dynamic_link(url))
for url in dynamic_urls
("deezer", *extract_deezer_dynamic_link(url)) for url in dynamic_urls
)
parsed.extend(URL_REGEX.findall(url)) # Qobuz, Tidal, Dezer
parsed.extend(URL_REGEX.findall(url)) # Qobuz, Tidal, Deezer
soundcloud_urls = SOUNDCLOUD_URL_REGEX.findall(url)
soundcloud_items = [
self.clients["soundcloud"].get(u) for u in soundcloud_urls
]
parsed.extend(
("soundcloud", item["kind"], url)
for item, url in zip(soundcloud_items, soundcloud_urls)
)
if soundcloud_urls:
soundcloud_client = self.get_client("soundcloud")
assert isinstance(soundcloud_client, SoundCloudClient) # for typing
# TODO: Make this async
soundcloud_items = (
soundcloud_client.resolve_url(u) for u in soundcloud_urls
)
parsed.extend(
("soundcloud", item["kind"], str(item["id"]))
for item in soundcloud_items
)
logger.debug("Parsed urls: %s", parsed)
@ -507,15 +506,11 @@ class RipCore(list):
# For testing:
# https://www.last.fm/user/nathan3895/playlists/12058911
user_regex = re.compile(
r"https://www\.last\.fm/user/([^/]+)/playlists/\d+"
)
user_regex = re.compile(r"https://www\.last\.fm/user/([^/]+)/playlists/\d+")
lastfm_urls = LASTFM_URL_REGEX.findall(urls)
try:
lastfm_source = self.config.session["lastfm"]["source"]
lastfm_fallback_source = self.config.session["lastfm"][
"fallback_source"
]
lastfm_fallback_source = self.config.session["lastfm"]["fallback_source"]
except KeyError:
self._config_updating_message()
self.config.update()
@ -549,16 +544,12 @@ class RipCore(list):
)
query_is_clean = banned_words_plain.search(query) is None
search_results = self.search(
source, query, media_type="track"
)
search_results = self.search(source, query, media_type="track")
track = next(search_results)
if query_is_clean:
while banned_words.search(track["title"]) is not None:
logger.debug(
"Track title banned for query=%s", query
)
logger.debug("Track title banned for query=%s", query)
track = next(search_results)
# Because the track is searched as a single we need to set
@ -568,9 +559,7 @@ class RipCore(list):
except (NoResultsFound, StopIteration):
return None
track = try_search(lastfm_source) or try_search(
lastfm_fallback_source
)
track = try_search(lastfm_source) or try_search(lastfm_fallback_source)
if track is None:
return False
@ -594,9 +583,7 @@ class RipCore(list):
pl.creator = creator_match.group(1)
tracks_not_found = 0
with concurrent.futures.ThreadPoolExecutor(
max_workers=15
) as executor:
with concurrent.futures.ThreadPoolExecutor(max_workers=15) as executor:
futures = [
executor.submit(search_query, title, artist, pl)
for title, artist in queries
@ -725,9 +712,7 @@ class RipCore(list):
raise NotImplementedError
fields = (fname for _, fname, _, _ in Formatter().parse(fmt) if fname)
ret = fmt.format(
**{k: media.get(k, default="Unknown") for k in fields}
)
ret = fmt.format(**{k: media.get(k, default="Unknown") for k in fields})
return ret
def interactive_search(
@ -865,9 +850,7 @@ class RipCore(list):
playlist_title = html.unescape(playlist_title_match.group(1))
if remaining_tracks > 0:
with concurrent.futures.ThreadPoolExecutor(
max_workers=15
) as executor:
with concurrent.futures.ThreadPoolExecutor(max_workers=15) as executor:
last_page = int(remaining_tracks // 50) + int(
remaining_tracks % 50 != 0
)
@ -922,9 +905,7 @@ class RipCore(list):
fg="blue",
)
self.config.file["deezer"]["arl"] = input(
style("ARL: ", fg="green")
)
self.config.file["deezer"]["arl"] = input(style("ARL: ", fg="green"))
self.config.save()
secho(
f'Credentials saved to config file at "{self.config._path}"',