Add option to delete cover after download

Also download largest possible covers from qobuz
This commit is contained in:
nathom 2021-03-29 16:03:36 -07:00
parent fc06d9149c
commit 3a2480f0f8
2 changed files with 36 additions and 23 deletions

View file

@ -71,6 +71,7 @@ class Config:
"default_comment": None, "default_comment": None,
"remove_extra_tags": False, "remove_extra_tags": False,
}, },
"keep_cover": True,
"path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT}, "path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT},
} }

View file

@ -3,7 +3,6 @@ import os
import re import re
import shutil import shutil
# import sys # import sys
from abc import ABC, abstractmethod
from pprint import pformat from pprint import pformat
# from pprint import pprint # from pprint import pprint
from tempfile import gettempdir from tempfile import gettempdir
@ -488,7 +487,7 @@ class Track:
return f"{self['artist']} - {self['title']}" return f"{self['artist']} - {self['title']}"
class Tracklist(list, ABC): class Tracklist(list):
"""A base class for tracklist-like objects. """A base class for tracklist-like objects.
Implements methods to give it dict-like behavior. If a Tracklist Implements methods to give it dict-like behavior. If a Tracklist
@ -597,12 +596,10 @@ class Tracklist(list, ABC):
return cover_obj return cover_obj
@abstractmethod
@staticmethod @staticmethod
def _parse_get_resp(item, client): def _parse_get_resp(item, client):
pass pass
@abstractmethod
def download(self, **kwargs): def download(self, **kwargs):
pass pass
@ -782,11 +779,9 @@ class Album(Tracklist):
def download( def download(
self, self,
quality: int = 7, quality: int = 7,
parent_folder: Union[str, os.PathLike] = "Downloads", parent_folder: Union[str, os.PathLike] = "StreamripDownloads",
progress_bar: bool = True,
tag_tracks: bool = True,
cover_key: str = "large",
database: MusicDB = None, database: MusicDB = None,
**kwargs,
): ):
"""Download all of the tracks in the album. """Download all of the tracks in the album.
@ -796,6 +791,11 @@ class Album(Tracklist):
:type parent_folder: Union[str, os.PathLike] :type parent_folder: Union[str, os.PathLike]
:param progress_bar: turn on/off a tqdm progress bar :param progress_bar: turn on/off a tqdm progress bar
:type progress_bar: bool :type progress_bar: bool
:param large_cover: Download the large cover. This may fail when
embedding covers.
:param tag_tracks: Tag the tracks after downloading, True by default
:param keep_cover: Keep the cover art image after downloading.
True by default.
""" """
folder = self._get_formatted_folder(parent_folder) folder = self._get_formatted_folder(parent_folder)
@ -808,21 +808,24 @@ class Album(Tracklist):
if os.path.isfile(cover_path): if os.path.isfile(cover_path):
logger.debug("Cover already downloaded: %s. Skipping", cover_path) logger.debug("Cover already downloaded: %s. Skipping", cover_path)
else: else:
if self.cover_urls: if kwargs.get("large_cover", False):
cover_url = self.cover_urls.get(cover_key) cover_url = self.cover_urls.get("large")
if self.client.source == 'qobuz':
tqdm_download(cover_url.replace('600', 'org'), cover_path)
else:
tqdm_download(cover_url, cover_path)
img = requests.head(cover_url) if os.path.getsize(cover_path) > FLAC_MAX_BLOCKSIZE: # 16.7 MB
click.secho(
if int(img.headers["Content-Length"]) > FLAC_MAX_BLOCKSIZE: # 16.7 MB "Large cover is too large to embed, embedding small cover instead.",
logger.info( fg="yellow",
f"{cover_key} cover size is too large to "
"embed. Using small cover instead"
) )
cover_url = self.cover_urls.get("small") large_cover_path = cover_path.replace(".jpg", "_large") + ".jpg"
shutil.move(cover_path, large_cover_path)
tqdm_download(cover_url, cover_path) tqdm_download(self.cover_urls["small"], cover_path)
else:
tqdm_download(self.cover_urls['small'], cover_path)
if self.client.source != "deezer": if self.client.source != "deezer":
cover = self.get_cover_obj(cover_path, quality) cover = self.get_cover_obj(cover_path, quality)
@ -830,11 +833,17 @@ class Album(Tracklist):
for track in self: for track in self:
logger.debug("Downloading track to %s", folder) logger.debug("Downloading track to %s", folder)
track.download(quality, folder, progress_bar, database=database) track.download(quality, folder, kwargs.get("progress_bar", True), database=database)
if tag_tracks and self.client.source != "deezer": if kwargs.get("tag_tracks", True) and self.client.source != "deezer":
track.tag(cover=cover) track.tag(cover=cover)
logger.debug("Final album folder: %s", folder) if not kwargs.get("keep_cover", True):
logger.debug(f"Removing cover at {cover_path}")
try:
os.remove(cover_path)
os.remove(large_cover_path)
except Exception as e:
logger.debug(e)
self.downloaded = True self.downloaded = True
@ -887,6 +896,9 @@ class Album(Tracklist):
""" """
return f"{self['albumartist']} - {self['title']}" return f"{self['albumartist']} - {self['title']}"
def __len__(self) -> int:
return self.tracktotal
class Playlist(Tracklist): class Playlist(Tracklist):
"""Represents a downloadable playlist. """Represents a downloadable playlist.