Album downloads working

This commit is contained in:
Nathan Thomas 2023-10-31 12:51:44 -07:00
parent 837e934476
commit 89f76b7f58
20 changed files with 338 additions and 125 deletions

View file

@ -1,14 +1,13 @@
import asyncio
import logging
from click import secho
from .client import Client
from .config import Config
from .console import console
from .media import Media, Pending
from .progress import clear_progress
from .prompter import get_prompter
from .qobuz_client import QobuzClient
from .thread_pool import AsyncThreadPool
from .universal_url import parse_url
logger = logging.getLogger("streamrip")
@ -26,7 +25,8 @@ class Main:
def __init__(self, config: Config):
# Pipeline:
# input URL -> (URL) -> (Pending) -> (Media) -> (Downloadable) -> downloaded audio file
# input URL -> (URL) -> (Pending) -> (Media) -> (Downloadable)
# -> downloaded audio file
self.pending: list[Pending] = []
self.media: list[Media] = []
@ -42,11 +42,11 @@ class Main:
async def add(self, url: str):
parsed = parse_url(url)
if parsed is None:
secho(f"Unable to parse url {url}", fg="red")
raise Exception
raise Exception(f"Unable to parse url {url}")
client = await self.get_logged_in_client(parsed.source)
self.pending.append(await parsed.into_pending(client, self.config))
logger.debug("Added url=%s", url)
async def get_logged_in_client(self, source: str):
client = self.clients[source]
@ -57,30 +57,25 @@ class Main:
await prompter.prompt_and_login()
prompter.save()
else:
# Log into client using credentials from config
await client.login()
with console.status(f"[cyan]Logging into {source}", spinner="dots"):
# Log into client using credentials from config
await client.login()
assert client.logged_in
return client
async def resolve(self):
logger.info(f"Resolving {len(self.pending)} items")
assert len(self.pending) != 0
coros = [p.resolve() for p in self.pending]
new_media: list[Media] = await asyncio.gather(*coros)
with console.status("Resolving URLs...", spinner="dots"):
coros = [p.resolve() for p in self.pending]
new_media: list[Media] = await asyncio.gather(*coros)
self.media.extend(new_media)
self.pending.clear()
assert len(self.pending) == 0
async def rip(self):
c = self.config.session.downloads
if c.concurrency:
max_connections = c.max_connections if c.max_connections > 0 else 9999
else:
max_connections = 1
async with AsyncThreadPool(max_connections) as pool:
await pool.gather([item.rip() for item in self.media])
await asyncio.gather(*[item.rip() for item in self.media])
for client in self.clients.values():
await client.session.close()
clear_progress()