Formatting

This commit is contained in:
nathom 2021-04-09 17:39:24 -07:00
parent 9301757c10
commit b00f5278c4
4 changed files with 32 additions and 31 deletions

View file

@ -276,7 +276,7 @@ class MusicDL(list):
pl.append(track) pl.append(track)
pl.loaded = True pl.loaded = True
click.secho(f"{tracks_not_found} tracks not found.", fg='yellow') click.secho(f"{tracks_not_found} tracks not found.", fg="yellow")
self.append(pl) self.append(pl)
def handle_txt(self, filepath: Union[str, os.PathLike]): def handle_txt(self, filepath: Union[str, os.PathLike]):

View file

@ -3,8 +3,7 @@ import os
import re import re
import shutil import shutil
import subprocess import subprocess
import sys from pprint import pformat
from pprint import pformat, 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
@ -33,11 +32,11 @@ from .metadata import TrackMetadata
from .utils import ( from .utils import (
clean_format, clean_format,
decrypt_mqa_file, decrypt_mqa_file,
ext,
get_quality_id, get_quality_id,
safe_get, safe_get,
tidal_cover_url, tidal_cover_url,
tqdm_download, tqdm_download,
ext,
) )
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -314,9 +313,8 @@ class Track:
formatter = self.meta.get_formatter() formatter = self.meta.get_formatter()
logger.debug("Track meta formatter %s", pformat(formatter)) logger.debug("Track meta formatter %s", pformat(formatter))
filename = clean_format(self.file_format, formatter) filename = clean_format(self.file_format, formatter)
self.final_path = ( self.final_path = os.path.join(self.folder, filename)[:250].strip() + ext(
os.path.join(self.folder, filename)[:250].strip() self.quality, self.client.source
+ ext(self.quality, self.client.source)
) )
logger.debug("Formatted path: %s", self.final_path) logger.debug("Formatted path: %s", self.final_path)
@ -404,11 +402,11 @@ class Track:
logger.debug("Tagging file with %s container", self.container) logger.debug("Tagging file with %s container", self.container)
audio = FLAC(self.final_path) audio = FLAC(self.final_path)
elif self.quality <= 1: elif self.quality <= 1:
if self.client.source == 'tidal': if self.client.source == "tidal":
self.container = 'AAC' self.container = "AAC"
audio = MP4(self.final_path) audio = MP4(self.final_path)
else: else:
self.container = 'MP3' self.container = "MP3"
try: try:
audio = ID3(self.final_path) audio = ID3(self.final_path)
except ID3NoHeaderError: except ID3NoHeaderError:
@ -425,7 +423,9 @@ class Track:
if embed_cover and cover is None: if embed_cover and cover is None:
assert hasattr(self, "cover_path") assert hasattr(self, "cover_path")
cover = Tracklist.get_cover_obj(self.cover_path, self.quality, self.client.source) cover = Tracklist.get_cover_obj(
self.cover_path, self.quality, self.client.source
)
if isinstance(audio, FLAC): if isinstance(audio, FLAC):
if embed_cover: if embed_cover:
@ -436,7 +436,7 @@ class Track:
audio.add(cover) audio.add(cover)
audio.save(self.final_path, "v2_version=3") audio.save(self.final_path, "v2_version=3")
elif isinstance(audio, MP4): elif isinstance(audio, MP4):
audio['covr'] = [cover] audio["covr"] = [cover]
audio.save() audio.save()
else: else:
raise ValueError(f"Unknown container type: {audio}") raise ValueError(f"Unknown container type: {audio}")
@ -616,7 +616,9 @@ class Tracklist(list):
return cls(client=client, **info) return cls(client=client, **info)
@staticmethod @staticmethod
def get_cover_obj(cover_path: str, quality: int, source: str) -> Union[Picture, APIC]: def get_cover_obj(
cover_path: str, quality: int, source: str
) -> Union[Picture, APIC]:
"""Given the path to an image and a quality id, return an initialized """Given the path to an image and a quality id, return an initialized
cover object that can be used for every track in the album. cover object that can be used for every track in the album.
@ -626,6 +628,7 @@ class Tracklist(list):
:type quality: int :type quality: int
:rtype: Union[Picture, APIC] :rtype: Union[Picture, APIC]
""" """
def flac_mp3_cover_obj(cover): def flac_mp3_cover_obj(cover):
cover_obj = cover() cover_obj = cover()
cover_obj.type = 3 cover_obj.type = 3
@ -637,7 +640,7 @@ class Tracklist(list):
if quality > 1: if quality > 1:
cover = Picture cover = Picture
elif source == 'tidal': elif source == "tidal":
cover = MP4Cover cover = MP4Cover
else: else:
cover = APIC cover = APIC
@ -654,7 +657,7 @@ class Tracklist(list):
return flac_mp3_cover_obj(cover) return flac_mp3_cover_obj(cover)
elif cover is MP4Cover: elif cover is MP4Cover:
with open(cover_path, 'rb') as img: with open(cover_path, "rb") as img:
return cover(img.read(), imageformat=MP4Cover.FORMAT_JPEG) return cover(img.read(), imageformat=MP4Cover.FORMAT_JPEG)
raise InvalidQuality(f"Quality {quality} not allowed") raise InvalidQuality(f"Quality {quality} not allowed")

View file

@ -1,8 +1,6 @@
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 (
@ -124,7 +122,7 @@ class TrackMetadata:
self.year = self.date[:4] self.year = self.date[:4]
self.copyright = resp.get("copyright") self.copyright = resp.get("copyright")
self.albumartist = safe_get(resp, 'artist', 'name') self.albumartist = safe_get(resp, "artist", "name")
self.disctotal = resp.get("numberOfVolumes") self.disctotal = resp.get("numberOfVolumes")
self.isrc = resp.get("isrc") self.isrc = resp.get("isrc")
self.explicit = resp.get("explicit", False) self.explicit = resp.get("explicit", False)
@ -133,9 +131,9 @@ class TrackMetadata:
elif self.__source == "deezer": elif self.__source == "deezer":
self.album = resp.get("title") self.album = resp.get("title")
self.tracktotal = resp.get("track_total") self.tracktotal = resp.get("track_total")
self.genre = safe_get(resp, 'genres', 'data') self.genre = safe_get(resp, "genres", "data")
self.date = resp.get("release_date") self.date = resp.get("release_date")
self.albumartist = safe_get(resp, 'artist', 'name') self.albumartist = safe_get(resp, "artist", "name")
self.label = resp.get("label") self.label = resp.get("label")
# either 0 or 1 # either 0 or 1
self.explicit = bool(resp.get("parental_warning")) self.explicit = bool(resp.get("parental_warning"))
@ -156,23 +154,23 @@ class TrackMetadata:
self._mod_title(track.get("version"), track.get("work")) self._mod_title(track.get("version"), track.get("work"))
self.composer = track.get("composer", {}).get("name") self.composer = track.get("composer", {}).get("name")
self.tracknumber = track.get('track_number', 1) self.tracknumber = track.get("track_number", 1)
self.discnumber = track.get("media_number", 1) self.discnumber = track.get("media_number", 1)
self.artist = safe_get(track, 'performer', 'name') self.artist = safe_get(track, "performer", "name")
if self.artist is None: if self.artist is None:
self.artist = self.get('albumartist') self.artist = self.get("albumartist")
elif self.__source == "tidal": elif self.__source == "tidal":
self.title = track.get("title").strip() self.title = track.get("title").strip()
self._mod_title(track.get("version"), None) self._mod_title(track.get("version"), None)
self.tracknumber = track.get('trackNumber', 1) self.tracknumber = track.get("trackNumber", 1)
self.discnumber = track.get("volumeNumber") self.discnumber = track.get("volumeNumber")
self.artist = track.get("artist", {}).get("name") self.artist = track.get("artist", {}).get("name")
elif self.__source == "deezer": elif self.__source == "deezer":
self.title = track.get("title").strip() self.title = track.get("title").strip()
self._mod_title(track.get("version"), None) self._mod_title(track.get("version"), None)
self.tracknumber = track.get('track_position', 1) self.tracknumber = track.get("track_position", 1)
self.discnumber = track.get("disk_number") self.discnumber = track.get("disk_number")
self.artist = track.get("artist", {}).get("name") self.artist = track.get("artist", {}).get("name")
@ -377,8 +375,8 @@ class TrackMetadata:
for k, v in MP4_KEY.items(): for k, v in MP4_KEY.items():
if k == "tracknumber": if k == "tracknumber":
text = [(self.tracknumber, self.tracktotal)] text = [(self.tracknumber, self.tracktotal)]
elif k == 'discnumber': elif k == "discnumber":
text = [(self.discnumber, self.get('disctotal', 1))] text = [(self.discnumber, self.get("disctotal", 1))]
else: else:
text = getattr(self, k) text = getattr(self, k)

View file

@ -210,9 +210,9 @@ def decrypt_mqa_file(in_path, out_path, encryption_key):
def ext(quality: int, source: str): def ext(quality: int, source: str):
if quality <= 1: if quality <= 1:
if source == 'tidal': if source == "tidal":
return '.m4a' return ".m4a"
else: else:
return '.mp3' return ".mp3"
else: else:
return '.flac' return ".flac"