Create disc subdirectories; fix #29 #17

This commit is contained in:
nathom 2021-04-07 11:00:54 -07:00
parent 7e14479403
commit 117fadb7e5
4 changed files with 36 additions and 15 deletions

View file

@ -73,6 +73,7 @@ __MP4_KEYS = (
"trkn", "trkn",
"disk", "disk",
None, None,
None,
) )
__MP3_KEYS = ( __MP3_KEYS = (
@ -95,6 +96,7 @@ __MP3_KEYS = (
id3.TRCK, id3.TRCK,
id3.TPOS, id3.TPOS,
None, None,
None,
) )
__METADATA_TYPES = ( __METADATA_TYPES = (
@ -117,6 +119,7 @@ __METADATA_TYPES = (
"tracknumber", "tracknumber",
"discnumber", "discnumber",
"tracktotal", "tracktotal",
"disctotal",
) )

View file

@ -748,9 +748,10 @@ class Album(Tracklist):
"id": resp.get("id"), "id": resp.get("id"),
"title": resp.get("title"), "title": resp.get("title"),
"_artist": resp.get("artist") or resp.get("performer"), "_artist": resp.get("artist") or resp.get("performer"),
"albumartist": resp.get("artist", {}).get("name"), "albumartist": safe_get(resp, "artist", "name"),
"year": str(resp.get("release_date_original"))[:4], "year": str(resp.get("release_date_original"))[:4],
"version": resp.get("version"), "version": resp.get("version"),
"composer": safe_get(resp, "composer", "name"),
"release_type": resp.get("release_type", "album"), "release_type": resp.get("release_type", "album"),
"cover_urls": resp.get("image"), "cover_urls": resp.get("image"),
"streamable": resp.get("streamable"), "streamable": resp.get("streamable"),
@ -760,6 +761,10 @@ class Album(Tracklist):
"bit_depth": resp.get("maximum_bit_depth"), "bit_depth": resp.get("maximum_bit_depth"),
"sampling_rate": sampling_rate, "sampling_rate": sampling_rate,
"tracktotal": resp.get("tracks_count"), "tracktotal": resp.get("tracks_count"),
"description": resp.get("description"),
"disctotal": max(
track.get("media_number", 1) for track in resp["tracks"]["items"]
),
} }
elif client.source == "tidal": elif client.source == "tidal":
return { return {
@ -778,6 +783,7 @@ class Album(Tracklist):
"bit_depth": 24 if resp.get("audioQuality") == "HI_RES" else 16, "bit_depth": 24 if resp.get("audioQuality") == "HI_RES" else 16,
"sampling_rate": 44100, # always 44.1 kHz "sampling_rate": 44100, # always 44.1 kHz
"tracktotal": resp.get("numberOfTracks"), "tracktotal": resp.get("numberOfTracks"),
"disctotal": 1,
} }
elif client.source == "deezer": elif client.source == "deezer":
if resp.get("release_date", False): if resp.get("release_date", False):
@ -804,6 +810,7 @@ class Album(Tracklist):
"bit_depth": 16, "bit_depth": 16,
"sampling_rate": 44100, "sampling_rate": 44100,
"tracktotal": resp.get("track_total") or resp.get("nb_tracks"), "tracktotal": resp.get("track_total") or resp.get("nb_tracks"),
"disctotal": max(track['disk_number'] for track in resp['tracks']),
} }
raise InvalidSourceError(client.source) raise InvalidSourceError(client.source)
@ -907,15 +914,21 @@ class Album(Tracklist):
if self.client.source != "deezer" and embed_cover: if self.client.source != "deezer" and embed_cover:
cover = self.get_cover_obj(cover_path, quality) cover = self.get_cover_obj(cover_path, quality)
download_args = {
'quality': quality,
'parent_folder': folder,
'progress_bar': kwargs.get("progress_bar", True),
'database': database,
'track_format': kwargs.get("track_format", TRACK_FORMAT),
}
for track in self: for track in self:
logger.debug("Downloading track to %s", folder) logger.debug("Downloading track to %s", folder)
track.download( if self.disctotal > 1:
quality, disc_folder = os.path.join(folder, f"Disc {track.meta.discnumber}")
folder, download_args['parent_folder'] = disc_folder
kwargs.get("progress_bar", True),
database=database, track.download(**download_args)
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, embed_cover=embed_cover) track.tag(cover=cover, embed_cover=embed_cover)
@ -923,7 +936,7 @@ class Album(Tracklist):
logger.debug(f"Removing cover at {cover_path}") logger.debug(f"Removing cover at {cover_path}")
try: try:
os.remove(cover_path) os.remove(cover_path)
os.remove(large_cover_path) os.remove(dl_cover_path)
except Exception as e: except Exception as e:
logger.debug(e) logger.debug(e)

View file

@ -1,6 +1,8 @@
import json import json
import logging import logging
import re import re
import sys
from pprint import pprint
from typing import Generator, Optional, Tuple, Union from typing import Generator, Optional, Tuple, Union
from .constants import ( from .constants import (
@ -83,7 +85,7 @@ class TrackMetadata:
"""Parse the metadata from an resp dict returned by the """Parse the metadata from an resp dict returned by the
Qobuz API. Qobuz API.
:param dict resp: from the Qobuz API :param dict resp: from API
""" """
if self.__source == "qobuz": if self.__source == "qobuz":
self.album = resp.get("title") self.album = resp.get("title")
@ -93,6 +95,10 @@ class TrackMetadata:
self.copyright = resp.get("copyright") self.copyright = resp.get("copyright")
self.albumartist = resp.get("artist", {}).get("name") self.albumartist = resp.get("artist", {}).get("name")
self.label = resp.get("label") self.label = resp.get("label")
self.description = resp.get("description")
self.disctotal = max(
track.get("media_number", 1) for track in resp["tracks"]["items"]
)
if isinstance(self.label, dict): if isinstance(self.label, dict):
self.label = self.label.get("name") self.label = self.label.get("name")
@ -114,7 +120,7 @@ class TrackMetadata:
self.albumartist = resp.get("artist", {}).get("name") self.albumartist = resp.get("artist", {}).get("name")
self.label = resp.get("label") self.label = resp.get("label")
elif self.__source == "soundcloud": elif self.__source == "soundcloud":
raise Exception raise NotImplementedError
else: else:
raise ValueError(self.__source) raise ValueError(self.__source)
@ -336,7 +342,7 @@ class TrackMetadata:
if k == "tracknumber": if k == "tracknumber":
text = f"{self.tracknumber}/{self.tracktotal}" text = f"{self.tracknumber}/{self.tracktotal}"
elif k == "discnumber": elif k == "discnumber":
text = str(self.discnumber) text = f"{self.discnumber}/{self.get('disctotal', 1)}"
else: else:
text = getattr(self, k) text = getattr(self, k)

View file

@ -173,7 +173,7 @@ def init_log(
""" """
if not path: if not path:
os.makedirs(LOG_DIR, exist_ok=True) os.makedirs(LOG_DIR, exist_ok=True)
path = os.path.join(LOG_DIR, "qobuz_dl.log") path = os.path.join(LOG_DIR, "streamrip")
logger = logging.getLogger() logger = logging.getLogger()
level = logging.getLevelName(level) level = logging.getLevelName(level)
@ -193,8 +193,7 @@ def init_log(
logger.addHandler(printable) logger.addHandler(printable)
logger.addHandler(rotable) logger.addHandler(rotable)
logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.DEBUG)
logging.getLogger("tidal_api").setLevel(logging.WARNING)
def capitalize(s: str) -> str: def capitalize(s: str) -> str: