mirror of https://github.com/nathom/streamrip.git
76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
import asyncio
|
|
import logging
|
|
import os
|
|
from dataclasses import dataclass
|
|
|
|
from .artwork import download_artwork
|
|
from .client import Client
|
|
from .config import Config
|
|
from .console import console
|
|
from .media import Media, Pending
|
|
from .metadata import AlbumMetadata, get_album_track_ids
|
|
from .track import PendingTrack, Track
|
|
|
|
logger = logging.getLogger("streamrip")
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class Album(Media):
|
|
meta: AlbumMetadata
|
|
tracks: list[PendingTrack]
|
|
config: Config
|
|
# folder where the tracks will be downloaded
|
|
folder: str
|
|
|
|
async def preprocess(self):
|
|
if self.config.session.cli.text_output:
|
|
console.print(
|
|
f"[cyan]Downloading {self.meta.album} by {self.meta.albumartist}"
|
|
)
|
|
|
|
async def download(self):
|
|
async def _resolve_and_download(pending):
|
|
track = await pending.resolve()
|
|
await track.rip()
|
|
|
|
await asyncio.gather(*[_resolve_and_download(p) for p in self.tracks])
|
|
|
|
async def postprocess(self):
|
|
pass
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class PendingAlbum(Pending):
|
|
id: str
|
|
client: Client
|
|
config: Config
|
|
|
|
async def resolve(self):
|
|
resp = await self.client.get_metadata(self.id, "album")
|
|
meta = AlbumMetadata.from_resp(resp, self.client.source)
|
|
tracklist = get_album_track_ids(self.client.source, resp)
|
|
folder = self.config.session.downloads.folder
|
|
album_folder = self._album_folder(folder, meta)
|
|
os.makedirs(album_folder, exist_ok=True)
|
|
embed_cover, _ = await download_artwork(
|
|
self.client.session, album_folder, meta.covers, self.config.session.artwork
|
|
)
|
|
pending_tracks = [
|
|
PendingTrack(
|
|
id=id,
|
|
album=meta,
|
|
client=self.client,
|
|
config=self.config,
|
|
folder=album_folder,
|
|
cover_path=embed_cover,
|
|
)
|
|
for id in tracklist
|
|
]
|
|
logger.debug("Pending tracks: %s", pending_tracks)
|
|
return Album(meta, pending_tracks, self.config, album_folder)
|
|
|
|
def _album_folder(self, parent: str, meta: AlbumMetadata) -> str:
|
|
formatter = self.config.session.filepaths.folder_format
|
|
folder = meta.format_folder_path(formatter)
|
|
return os.path.join(parent, folder)
|