wip: make metadata optional

Dustin 2024-01-12 21:38:01 -06:00
parent 2b43b2e3af
commit 0b84b8dbcf
2 changed files with 24 additions and 13 deletions

View File

@ -64,7 +64,10 @@ class Status:
return Text('Done!') return Text('Done!')
def format_release(release: Release) -> str: def format_release(release: Optional[Release]) -> str:
if release is None:
return '[bright_yellow]Unknown Artist - Unknown Album[/bright_yellow]'
more_info = [ more_info = [
'[bright_blue]{} disc(s)[/bright_blue]'.format( '[bright_blue]{} disc(s)[/bright_blue]'.format(
len(release.medium_list) len(release.medium_list)
@ -106,13 +109,14 @@ def prompt_menu(console: Console, choices: Iterable[Any]) -> int:
console.print(f'[red]Invalid selection: {i}[/red]') console.print(f'[red]Invalid selection: {i}[/red]')
continue continue
return i - 1 return i - 1
assert False, 'unreachable'
def prompt_release(console: Console, drive: DiscDrive) -> Release: def prompt_release(console: Console, drive: DiscDrive) -> Optional[Release]:
releases = get_releases_from_disc(drive.get_disc()).release_list releases = get_releases_from_disc(drive.get_disc()).release_list
if not releases: if not releases:
console.print('[red]Could not find a matching MusicBrainz release') console.print('[red]Could not find a matching MusicBrainz release')
raise SystemExit(1) return None
if len(releases) == 1: if len(releases) == 1:
return releases[0] return releases[0]
console.print( console.print(
@ -181,12 +185,12 @@ def run(
release = get_release_by_id(mbid) release = get_release_by_id(mbid)
else: else:
release = prompt_release(console, dev) release = prompt_release(console, dev)
if not sys.stdout.isatty(): if release and not sys.stdout.isatty():
print(f'{release.artist_credit_phrase} - {release.title}') print(f'{release.artist_credit_phrase} - {release.title}')
console.print(f'Ripping {format_release(release)}') console.print(f'Ripping {format_release(release)}')
if release and len(release.medium_list) > 1:
num_discs = len(release.medium_list) num_discs = len(release.medium_list)
if len(release.medium_list) > 1:
discno = prompt_select_disc(console, num_discs) discno = prompt_select_disc(console, num_discs)
else: else:
discno = 0 discno = 0

View File

@ -179,7 +179,7 @@ class ProcessThread(threading.Thread):
class EncodeThread(threading.Thread): class EncodeThread(threading.Thread):
def __init__(self, release: Release, discno: int, q: ProcessQueue) -> None: def __init__(self, release: Optional[Release], discno: int, q: ProcessQueue) -> None:
super().__init__(name='EncodeThread') super().__init__(name='EncodeThread')
self.release = release self.release = release
self.discno = discno self.discno = discno
@ -213,11 +213,15 @@ class EncodeThread(threading.Thread):
log.info('Adding tags to %s', filename) log.info('Adding tags to %s', filename)
trackno = int(filename[5:7]) trackno = int(filename[5:7])
if not self.release:
log.warning('Cannot tag track %d: no release metadata', trackno)
return
artist = self.release.artist_credit[0].artist artist = self.release.artist_credit[0].artist
album = self.release.title album = self.release.title
medium = self.release.medium_list[self.discno] medium = self.release.medium_list[self.discno]
track = medium.track_list[trackno - 1] track = medium.track_list[trackno - 1]
tags = mutagen.File(filename, easy=True) tags = mutagen.File(filename, easy=True)
assert tags
tags['tracknumber'] = str(trackno) tags['tracknumber'] = str(trackno)
tags['artist'] = tags['albumartist'] = artist.name tags['artist'] = tags['albumartist'] = artist.name
tags['album'] = album tags['album'] = album
@ -264,7 +268,7 @@ class Ripper:
def __init__( def __init__(
self, self,
device: DiscDrive, device: DiscDrive,
release: Release, release: Optional[Release],
discno: int, discno: int,
tracks: Optional[TrackList] = None, tracks: Optional[TrackList] = None,
use_libcdio: bool = False, use_libcdio: bool = False,
@ -299,14 +303,17 @@ class Ripper:
def rip(self) -> Iterable[StatusMessage]: def rip(self) -> Iterable[StatusMessage]:
start = time.monotonic() start = time.monotonic()
if self.release:
dirname = safe_name( dirname = safe_name(
f'{self.release.artist_credit_phrase} - {self.release.title}' f'{self.release.artist_credit_phrase} - {self.release.title}'
) )
else:
dirname = 'Unknown Artist - Unknown Album'
if not os.path.isdir(dirname): if not os.path.isdir(dirname):
log.info('Creating directory: %s', dirname) log.info('Creating directory: %s', dirname)
os.mkdir(dirname) os.mkdir(dirname)
os.chdir(dirname) os.chdir(dirname)
if len(self.release.medium_list) > 1: if self.release and len(self.release.medium_list) > 1:
subdirname = f'Disc {self.discno + 1}' subdirname = f'Disc {self.discno + 1}'
if not os.path.isdir(subdirname): if not os.path.isdir(subdirname):
log.info('Creating directory: %s', subdirname) log.info('Creating directory: %s', subdirname)
@ -316,7 +323,7 @@ class Ripper:
for filename in glob.glob('track*.cdda.wav'): for filename in glob.glob('track*.cdda.wav'):
os.unlink(filename) os.unlink(filename)
if Image is not None: if self.release and Image is not None:
threading.Thread(target=self.fetch_album_art).start() threading.Thread(target=self.fetch_album_art).start()
self._process_thread.start() self._process_thread.start()
self._encode_thread.start() self._encode_thread.start()