Fixed bug where single tracks don’t get tagged

This commit is contained in:
nathom 2021-03-25 22:17:08 -07:00
parent c74b4b655a
commit a1905aeee2
4 changed files with 41 additions and 20 deletions

View File

@ -14,7 +14,7 @@ requirements = read_file("requirements.txt").strip().split()
# https://github.com/pypa/sampleproject/blob/main/setup.py
setup(
name=pkg_name,
version="0.1",
version="0.1.1",
author='Nathan',
author_email='nathanthomas707@gmail.com',
keywords='lossless, hi-res, qobuz, tidal, deezer, audio, convert',

View File

@ -4,6 +4,7 @@ import shutil
import subprocess
from tempfile import gettempdir
from typing import Optional
from mutagen.flac import FLAC as FLAC_META
from .exceptions import ConversionError
@ -110,7 +111,7 @@ class Converter:
if self.lossless:
if isinstance(self.sampling_rate, int):
audio = FLAC(self.filename)
audio = FLAC_META(self.filename)
old_sr = audio.info.sample_rate
command.extend(["-ar", str(min(old_sr, self.sampling_rate))])
elif self.sampling_rate is not None:

View File

@ -99,6 +99,7 @@ class MusicDL(list):
source, url_type, item_id = self.parse_urls(url)[0]
if item_id in self.db:
logger.info(f"{url} already downloaded, use --no-db to override.")
click.secho(f"{url} already downloaded, use --no-db to override.", fg='magenta')
return
self.handle_item(source, url_type, item_id)
@ -116,7 +117,8 @@ class MusicDL(list):
"database": self.db,
"parent_folder": self.config.session["downloads"]["folder"],
"quality": self.config.session["downloads"]["quality"],
"embed_cover": self.config.session["metadata"]["embed_cover"],
# TODO: fully implement this
# "embed_cover": self.config.session["metadata"]["embed_cover"],
}
logger.debug("Arguments from config: %s", arguments)
for item in self:
@ -129,7 +131,13 @@ class MusicDL(list):
item.load_meta()
click.secho(f"Downloading {item!s}", fg="bright_green")
item.download(**arguments)
if isinstance(item, Track):
# track.download doesn't automatically tag
item.download(**arguments, tag=True)
else:
item.download(**arguments)
if self.config.session["conversion"]["enabled"]:
click.secho(
f"Converting {item!s} to {self.config.session['conversion']['codec']}",

View File

@ -2,7 +2,6 @@ import logging
import os
import re
import shutil
import sys
from abc import ABC, abstractmethod
from pprint import pformat, pprint
from tempfile import gettempdir
@ -124,6 +123,18 @@ class Track:
self.meta = TrackMetadata(
track=track_meta, source=self.client.source
) # meta dict -> TrackMetadata object
try:
if self.client.source == "qobuz":
self.cover_url = track_meta["album"]["image"]["small"]
elif self.client.source == "tidal":
self.cover_url = tidal_cover_url(track_meta["album"]["cover"], 320)
elif self.client.source == "deezer":
self.cover_url = track_meta["album"]["cover_medium"]
else:
raise InvalidSourceError(self.client.source)
except KeyError:
logger.debug("No cover found")
self.cover_url = None
@staticmethod
def _get_tracklist(resp, source):
@ -140,6 +151,7 @@ class Track:
parent_folder: str = "Downloads",
progress_bar: bool = True,
database: MusicDB = None,
tag: bool = False,
):
"""
Download the track.
@ -224,6 +236,10 @@ class Track:
logger.debug("Downloaded: %s -> %s", temp_file, self.final_path)
self._is_downloaded = True
if tag:
self.tag()
return True
def download_cover(self):
@ -289,6 +305,7 @@ class Track:
else:
raise InvalidSourceError(client.source)
except KeyError:
logger.debug("No cover found")
cover_url = None
return cls(
@ -352,17 +369,15 @@ class Track:
for k, v in self.meta.tags(self.container):
audio[k] = v
if cover is None and embed_cover:
if cover is None:
assert hasattr(self, "cover")
cover = self.cover
if isinstance(audio, FLAC):
if embed_cover:
audio.add_picture(cover)
audio.add_picture(cover)
audio.save()
elif isinstance(audio, ID3):
if embed_cover:
audio.add(cover)
audio.add(cover)
audio.save(self.final_path, "v2_version=3")
else:
raise ValueError(f"Unknown container type: {audio}")
@ -416,6 +431,7 @@ class Track:
sampling_rate=kwargs.get("sampling_rate"),
remove_source=kwargs.get("remove_source", True),
)
click.secho(f"Converting {self!s}", fg='blue')
engine.convert()
def get(self, *keys, default=None):
@ -764,7 +780,6 @@ class Album(Tracklist):
progress_bar: bool = True,
tag_tracks: bool = True,
cover_key: str = "large",
embed_cover: bool = False,
database: MusicDB = None,
):
"""Download all of the tracks in the album.
@ -803,7 +818,7 @@ class Album(Tracklist):
tqdm_download(cover_url, cover_path)
if self.client.source != "deezer" and embed_cover:
if self.client.source != "deezer":
cover = self.get_cover_obj(cover_path, quality)
for track in self:
@ -811,7 +826,7 @@ class Album(Tracklist):
track.download(quality, folder, progress_bar, database=database)
if tag_tracks and self.client.source != "deezer":
track.tag(cover=cover, embed_cover=embed_cover)
track.tag(cover=cover)
logger.debug("Final album folder: %s", folder)
@ -964,7 +979,7 @@ class Playlist(Tracklist):
# inside of a library folder
meta = TrackMetadata(**meta_args(track))
if new_tracknumbers:
meta["tracknumber"] = f"{i:02}"
meta["tracknumber"] = str(i + 1)
self.append(
Track(
@ -982,7 +997,6 @@ class Playlist(Tracklist):
parent_folder: str = "Downloads",
quality: int = 6,
filters: Callable = None,
embed_cover: bool = False,
database: MusicDB = None,
):
"""Download and tag all of the tracks.
@ -1000,7 +1014,7 @@ class Playlist(Tracklist):
for track in self:
track.download(parent_folder=folder, quality=quality, database=database)
if self.client.source != "deezer":
track.tag(embed_cover=embed_cover)
track.tag()
@staticmethod
def _parse_get_resp(item: dict, client: ClientInterface):
@ -1077,10 +1091,10 @@ class Artist(Tracklist):
def load_meta(self):
"""Send an API call to get album info based on id."""
self.meta = self.client.get(self.id, media_type="artist")
# TODO find better fix for this
self.name = self.meta['items'][0]['artist']['name']
self._load_albums()
self.name = self.meta.get("name")
def _load_albums(self):
"""From the discography returned by client.get(query, 'artist'),
generate album objects and append them to self.
@ -1107,7 +1121,6 @@ class Artist(Tracklist):
filters: Optional[Tuple] = None,
no_repeats: bool = False,
quality: int = 6,
embed_cover: bool = False,
database: MusicDB = None,
):
"""Download all albums in the discography.
@ -1153,7 +1166,6 @@ class Artist(Tracklist):
album.download(
parent_folder=folder,
quality=quality,
embed_cover=embed_cover,
database=database,
)