Fix soundcloud error for interactive search

This commit is contained in:
Nathan Thomas 2023-12-22 23:25:22 -08:00
parent 4c84257fc1
commit 8c9673a067

View file

@ -6,7 +6,17 @@ from .. import db
from ..client import Client, DeezerClient, QobuzClient, SoundcloudClient, TidalClient from ..client import Client, DeezerClient, QobuzClient, SoundcloudClient, TidalClient
from ..config import Config from ..config import Config
from ..console import console from ..console import console
from ..media import Media, Pending, PendingLastfmPlaylist, remove_artwork_tempdirs from ..media import (
Media,
Pending,
PendingAlbum,
PendingArtist,
PendingLabel,
PendingLastfmPlaylist,
PendingPlaylist,
PendingSingle,
remove_artwork_tempdirs,
)
from ..metadata import SearchResults from ..metadata import SearchResults
from ..progress import clear_progress from ..progress import clear_progress
from .parse_url import parse_url from .parse_url import parse_url
@ -21,6 +31,7 @@ class Main:
* Logs in to Clients and prompts for credentials * Logs in to Clients and prompts for credentials
* Handles output logging * Handles output logging
* Handles downloading Media * Handles downloading Media
* Handles interactive search
User input (urls) -> Main --> Download files & Output messages to terminal User input (urls) -> Main --> Download files & Output messages to terminal
""" """
@ -68,6 +79,32 @@ class Main:
) )
logger.debug("Added url=%s", url) logger.debug("Added url=%s", url)
async def add_by_id(self, source: str, media_type: str, id: str):
client = await self.get_logged_in_client(source)
self._add_by_id_client(client, media_type, id)
async def add_all_by_id(self, info: list[tuple[str, str, str]]):
sources = set(s for s, _, _ in info)
clients = {s: await self.get_logged_in_client(s) for s in sources}
for source, media_type, id in info:
self._add_by_id_client(clients[source], media_type, id)
def _add_by_id_client(self, client: Client, media_type: str, id: str):
if media_type == "track":
item = PendingSingle(id, client, self.config, self.database)
elif media_type == "album":
item = PendingAlbum(id, client, self.config, self.database)
elif media_type == "playlist":
item = PendingPlaylist(id, client, self.config, self.database)
elif media_type == "label":
item = PendingLabel(id, client, self.config, self.database)
elif media_type == "artist":
item = PendingArtist(id, client, self.config, self.database)
else:
raise Exception(media_type)
self.pending.append(item)
async def add_all(self, urls: list[str]): async def add_all(self, urls: list[str]):
"""Add multiple urls concurrently as pending items.""" """Add multiple urls concurrently as pending items."""
parsed = [parse_url(url) for url in urls] parsed = [parse_url(url) for url in urls]
@ -105,7 +142,6 @@ class Main:
with console.status(f"[cyan]Logging into {source}", spinner="dots"): with console.status(f"[cyan]Logging into {source}", spinner="dots"):
# Log into client using credentials from config # Log into client using credentials from config
await client.login() await client.login()
# await client.login()
assert client.logged_in assert client.logged_in
return client return client
@ -149,8 +185,8 @@ class Main:
) )
assert isinstance(choices, list) assert isinstance(choices, list)
await self.add_all( await self.add_all_by_id(
[f"http://{source}.com/{media_type}/{item.id}" for item, i in choices], [(source, media_type, item.id) for item, _ in choices],
) )
else: else:
@ -173,11 +209,8 @@ class Main:
console.print("[yellow]No items chosen. Exiting.") console.print("[yellow]No items chosen. Exiting.")
else: else:
choices = search_results.get_choices(chosen_ind) choices = search_results.get_choices(chosen_ind)
await self.add_all( await self.add_all_by_id(
[ [(source, item.media_type(), item.id) for item in choices],
f"http://{source}.com/{item.media_type()}/{item.id}"
for item in choices
],
) )
async def search_take_first(self, source: str, media_type: str, query: str): async def search_take_first(self, source: str, media_type: str, query: str):
@ -229,6 +262,3 @@ class Main:
# may be able to share downloaded artwork in the same `rip` session # may be able to share downloaded artwork in the same `rip` session
# We don't know that a cover will not be used again until end of execution # We don't know that a cover will not be used again until end of execution
remove_artwork_tempdirs() remove_artwork_tempdirs()
async def add_by_id(self, source: str, media_type: str, id: str):
await self.add(f"http://{source}.com/{media_type}/{id}")