Add ability to choose whether to embed cover

This commit is contained in:
nathom 2021-04-01 17:43:26 -07:00
parent b9274a7039
commit 4c82858b57
2 changed files with 27 additions and 16 deletions

View file

@ -128,9 +128,8 @@ class MusicDL(list):
"keep_cover": self.config.session["keep_cover"], "keep_cover": self.config.session["keep_cover"],
"large_cover": self.config.session["metadata"]["large_cover"], "large_cover": self.config.session["metadata"]["large_cover"],
"folder_format": self.config.session["path_format"]["folder"], "folder_format": self.config.session["path_format"]["folder"],
"track_format": self.config.session["path_format"]["track"] "track_format": self.config.session["path_format"]["track"],
# TODO: fully implement this "embed_cover": self.config.session["metadata"]["embed_cover"],
# "embed_cover": self.config.session["metadata"]["embed_cover"],
} }
logger.debug("Arguments from config: %s", arguments) logger.debug("Arguments from config: %s", arguments)
for item in self: for item in self:

View file

@ -2,9 +2,7 @@ import logging
import os import os
import re import re
import shutil import shutil
# import sys
from pprint import pformat from pprint import pformat
# from pprint import pprint
from tempfile import gettempdir from tempfile import gettempdir
from typing import Any, Callable, Optional, Tuple, Union from typing import Any, Callable, Optional, Tuple, Union
@ -251,8 +249,10 @@ class Track:
assert hasattr(self, "cover_url"), "must set cover_url attribute" assert hasattr(self, "cover_url"), "must set cover_url attribute"
self.cover_path = os.path.join(self.folder, f"cover{hash(self.id)}.jpg") self.cover_path = os.path.join(self.folder, f"cover{hash(self.meta.album)}.jpg")
logger.debug(f"Downloading cover from {self.cover_url}") logger.debug(f"Downloading cover from {self.cover_url}")
click.secho(f"\nDownloading cover art for {self!s}", fg='blue')
if not os.path.exists(self.cover_path): if not os.path.exists(self.cover_path):
tqdm_download(self.cover_url, self.cover_path) tqdm_download(self.cover_url, self.cover_path)
else: else:
@ -324,7 +324,7 @@ class Track:
self, self,
album_meta: dict = None, album_meta: dict = None,
cover: Union[Picture, APIC] = None, cover: Union[Picture, APIC] = None,
embed_cover: bool = False, embed_cover: bool = True,
): ):
"""Tag the track using the stored metadata. """Tag the track using the stored metadata.
@ -336,6 +336,8 @@ class Track:
:type album_meta: dict :type album_meta: dict
:param cover: initialized mutagen cover object :param cover: initialized mutagen cover object
:type cover: Union[Picture, APIC] :type cover: Union[Picture, APIC]
:param embed_cover: Embed cover art into file
:type embed_cover: bool
""" """
assert isinstance(self.meta, TrackMetadata), "meta must be TrackMetadata" assert isinstance(self.meta, TrackMetadata), "meta must be TrackMetadata"
if not self._is_downloaded: if not self._is_downloaded:
@ -374,15 +376,17 @@ class Track:
for k, v in self.meta.tags(self.container): for k, v in self.meta.tags(self.container):
audio[k] = v audio[k] = v
if cover is None: if embed_cover and cover is None:
assert hasattr(self, "cover") assert hasattr(self, "cover")
cover = self.cover cover = self.cover
if isinstance(audio, FLAC): if isinstance(audio, FLAC):
audio.add_picture(cover) if embed_cover:
audio.add_picture(cover)
audio.save() audio.save()
elif isinstance(audio, ID3): elif isinstance(audio, ID3):
audio.add(cover) if embed_cover:
audio.add(cover)
audio.save(self.final_path, "v2_version=3") audio.save(self.final_path, "v2_version=3")
else: else:
raise ValueError(f"Unknown container type: {audio}") raise ValueError(f"Unknown container type: {audio}")
@ -843,7 +847,8 @@ class Album(Tracklist):
else: else:
tqdm_download(self.cover_urls["small"], cover_path) tqdm_download(self.cover_urls["small"], cover_path)
if self.client.source != "deezer": embed_cover = kwargs.get('embed_cover', True) # embed by default
if self.client.source != "deezer" and embed_cover:
cover = self.get_cover_obj(cover_path, quality) cover = self.get_cover_obj(cover_path, quality)
for track in self: for track in self:
@ -856,7 +861,7 @@ class Album(Tracklist):
track_format=kwargs.get("track_format", TRACK_FORMAT), track_format=kwargs.get("track_format", TRACK_FORMAT),
) )
if kwargs.get("tag_tracks", True) and self.client.source != "deezer": if kwargs.get("tag_tracks", True) and self.client.source != "deezer":
track.tag(cover=cover) track.tag(cover=cover, embed_cover=embed_cover)
if not kwargs.get("keep_cover", True): if not kwargs.get("keep_cover", True):
logger.debug(f"Removing cover at {cover_path}") logger.debug(f"Removing cover at {cover_path}")
@ -969,7 +974,6 @@ class Playlist(Tracklist):
:param kwargs: :param kwargs:
""" """
self.meta = self.client.get(self.id, "playlist") self.meta = self.client.get(self.id, "playlist")
self.name = self.meta.get("title")
self._load_tracks(**kwargs) self._load_tracks(**kwargs)
def _load_tracks(self, new_tracknumbers: bool = True): def _load_tracks(self, new_tracknumbers: bool = True):
@ -979,6 +983,7 @@ class Playlist(Tracklist):
:type new_tracknumbers: bool :type new_tracknumbers: bool
""" """
if self.client.source == "qobuz": if self.client.source == "qobuz":
self.name = self.meta['name']
tracklist = self.meta["tracks"]["items"] tracklist = self.meta["tracks"]["items"]
def gen_cover(track): # ? def gen_cover(track): # ?
@ -988,6 +993,7 @@ class Playlist(Tracklist):
return {"track": track, "album": track["album"]} return {"track": track, "album": track["album"]}
elif self.client.source == "tidal": elif self.client.source == "tidal":
self.name = self.meta['title']
tracklist = self.meta["tracks"] tracklist = self.meta["tracks"]
def gen_cover(track): def gen_cover(track):
@ -1001,6 +1007,7 @@ class Playlist(Tracklist):
} }
elif self.client.source == "deezer": elif self.client.source == "deezer":
self.name = self.meta['title']
tracklist = self.meta["tracks"] tracklist = self.meta["tracks"]
def gen_cover(track): def gen_cover(track):
@ -1056,7 +1063,7 @@ class Playlist(Tracklist):
for track in self: for track in self:
track.download(parent_folder=folder, quality=quality, database=database) track.download(parent_folder=folder, quality=quality, database=database)
if self.client.source != "deezer": if self.client.source != "deezer":
track.tag() track.tag(embed_cover=kwargs.get('embed_cover', True))
@staticmethod @staticmethod
def _parse_get_resp(item: dict, client: ClientInterface): def _parse_get_resp(item: dict, client: ClientInterface):
@ -1068,10 +1075,11 @@ class Playlist(Tracklist):
:param client: :param client:
:type client: ClientInterface :type client: ClientInterface
""" """
print(item.keys())
if client.source == "qobuz": if client.source == "qobuz":
return { return {
"name": item.get("name"), "name": item["name"],
"id": item.get("id"), "id": item['id'],
} }
elif client.source == "tidal": elif client.source == "tidal":
return { return {
@ -1086,6 +1094,10 @@ class Playlist(Tracklist):
raise InvalidSourceError(client.source) raise InvalidSourceError(client.source)
@property
def title(self):
return self.name
def __repr__(self) -> str: def __repr__(self) -> str:
"""Return a string representation of this Playlist object. """Return a string representation of this Playlist object.
Useful for pprint and json.dumps. Useful for pprint and json.dumps.