Threaded lastfm search

Also fix source_subdirectory option
This commit is contained in:
nathom 2021-04-12 13:06:55 -07:00
parent f06076fbfc
commit 73e1eeeb6b
2 changed files with 36 additions and 28 deletions

View file

@ -1,8 +1,8 @@
import asyncio
import logging import logging
import os import os
import re import re
import sys import sys
import threading
from getpass import getpass from getpass import getpass
from hashlib import md5 from hashlib import md5
from string import Formatter from string import Formatter
@ -172,11 +172,12 @@ class MusicDL(list):
], ],
} }
logger.debug("Arguments from config: %s", arguments) logger.debug("Arguments from config: %s", arguments)
source_subdirs = self.config.session['downloads']['source_subdirectories']
for item in self: for item in self:
if self.config.session["downloads"]["source_subdirectories"]:
arguments["parent_folder"] = os.path.join( if source_subdirs:
arguments["parent_folder"], capitalize(item.client.source) arguments['parent_folder'] = self.__get_source_subdir(item.client.source)
)
arguments["quality"] = self.config.session[item.client.source]["quality"] arguments["quality"] = self.config.session[item.client.source]["quality"]
if isinstance(item, Artist): if isinstance(item, Artist):
@ -269,24 +270,36 @@ class MusicDL(list):
def handle_lastfm_urls(self, urls): def handle_lastfm_urls(self, urls):
lastfm_urls = self.lastfm_url_parse.findall(urls) lastfm_urls = self.lastfm_url_parse.findall(urls)
lastfm_source = self.config.session["lastfm"]["source"] lastfm_source = self.config.session["lastfm"]["source"]
tracks_not_found = 0
def search_query(query: str, playlist: Playlist):
global tracks_not_found
try:
track = next(self.search(lastfm_source, query, media_type="track"))
playlist.append(track)
except NoResultsFound:
tracks_not_found += 1
return
for purl in lastfm_urls: for purl in lastfm_urls:
click.secho(f"Fetching playlist at {purl}", fg="blue") click.secho(f"Fetching playlist at {purl}", fg="blue")
title, queries = self.get_lastfm_playlist(purl) title, queries = self.get_lastfm_playlist(purl)
pl = Playlist(client=self.clients[lastfm_source], name=title) pl = Playlist(client=self.get_client(lastfm_source), name=title)
tracks_not_found = 0 processes = []
for title, artist in tqdm(queries, unit="tracks", desc="Searching"):
for title, artist in queries:
query = f"{title} {artist}" query = f"{title} {artist}"
proc = threading.Thread(
target=search_query, args=(query, pl), daemon=True
)
proc.start()
processes.append(proc)
try: for proc in tqdm(processes, unit="tracks", desc="Searching"):
track = next(self.search(lastfm_source, query, media_type="track")) proc.join()
except NoResultsFound:
tracks_not_found += 1
continue
pl.append(track)
pl.loaded = True pl.loaded = True
click.secho(f"{tracks_not_found} tracks not found.", fg="yellow") click.secho(f"{tracks_not_found} tracks not found.", fg="yellow")
self.append(pl) self.append(pl)
@ -471,3 +484,7 @@ class MusicDL(list):
remaining_tracks -= 50 remaining_tracks -= 50
return playlist_title, info return playlist_title, info
def __get_source_subdir(self, source: str) -> str:
path = self.config.session['parent_folder']
return os.path.join(path, capitalize(source))

View file

@ -1230,11 +1230,7 @@ class Playlist(Tracklist):
logger.debug(f"Loaded {len(self)} tracks from playlist {self.name}") logger.debug(f"Loaded {len(self)} tracks from playlist {self.name}")
def _prepare_download( def _prepare_download(self, parent_folder: str = "StreamripDownloads", **kwargs):
self,
parent_folder: str = "StreamripDownloads",
**kwargs,
):
fname = sanitize_filename(self.name) fname = sanitize_filename(self.name)
self.folder = os.path.join(parent_folder, fname) self.folder = os.path.join(parent_folder, fname)
@ -1245,7 +1241,7 @@ class Playlist(Tracklist):
if self.client.source == "soundcloud": if self.client.source == "soundcloud":
item.load_meta() item.load_meta()
if kwargs.get("set_playlist_to_album", False) and hasattr(self, "image"): if kwargs.get("set_playlist_to_album", False):
item["album"] = self.name item["album"] = self.name
item["albumartist"] = self.creator item["albumartist"] = self.creator
@ -1253,12 +1249,7 @@ class Playlist(Tracklist):
item.meta["tracknumber"] = str(self.__download_index) item.meta["tracknumber"] = str(self.__download_index)
self.__download_index += 1 self.__download_index += 1
self.downloaded = item.download( self.downloaded = item.download(**kwargs)
parent_folder=kwargs["parent_folder"],
quality=kwargs.get("quality", 3),
database=kwargs.get("database"),
**kwargs,
)
if self.downloaded and self.client.source != "deezer": if self.downloaded and self.client.source != "deezer":
item.tag(embed_cover=kwargs.get("embed_cover", True)) item.tag(embed_cover=kwargs.get("embed_cover", True))