From 0b84b8dbcff799cc45cd5aa358e93a0f67827025 Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Fri, 12 Jan 2024 21:38:01 -0600 Subject: [PATCH] wip: make metadata optional --- src/rupert/main.py | 16 ++++++++++------ src/rupert/ripper.py | 21 ++++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/rupert/main.py b/src/rupert/main.py index 20aa17a..23649b8 100644 --- a/src/rupert/main.py +++ b/src/rupert/main.py @@ -64,7 +64,10 @@ class Status: 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 = [ '[bright_blue]{} disc(s)[/bright_blue]'.format( 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]') continue 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 if not releases: console.print('[red]Could not find a matching MusicBrainz release') - raise SystemExit(1) + return None if len(releases) == 1: return releases[0] console.print( @@ -181,12 +185,12 @@ def run( release = get_release_by_id(mbid) else: 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}') console.print(f'Ripping {format_release(release)}') - num_discs = len(release.medium_list) - if len(release.medium_list) > 1: + if release and len(release.medium_list) > 1: + num_discs = len(release.medium_list) discno = prompt_select_disc(console, num_discs) else: discno = 0 diff --git a/src/rupert/ripper.py b/src/rupert/ripper.py index 08366c2..89e66eb 100644 --- a/src/rupert/ripper.py +++ b/src/rupert/ripper.py @@ -179,7 +179,7 @@ class ProcessThread(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') self.release = release self.discno = discno @@ -213,11 +213,15 @@ class EncodeThread(threading.Thread): log.info('Adding tags to %s', filename) 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 album = self.release.title medium = self.release.medium_list[self.discno] track = medium.track_list[trackno - 1] tags = mutagen.File(filename, easy=True) + assert tags tags['tracknumber'] = str(trackno) tags['artist'] = tags['albumartist'] = artist.name tags['album'] = album @@ -264,7 +268,7 @@ class Ripper: def __init__( self, device: DiscDrive, - release: Release, + release: Optional[Release], discno: int, tracks: Optional[TrackList] = None, use_libcdio: bool = False, @@ -299,14 +303,17 @@ class Ripper: def rip(self) -> Iterable[StatusMessage]: start = time.monotonic() - dirname = safe_name( - f'{self.release.artist_credit_phrase} - {self.release.title}' - ) + if self.release: + dirname = safe_name( + f'{self.release.artist_credit_phrase} - {self.release.title}' + ) + else: + dirname = 'Unknown Artist - Unknown Album' if not os.path.isdir(dirname): log.info('Creating directory: %s', dirname) os.mkdir(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}' if not os.path.isdir(subdirname): log.info('Creating directory: %s', subdirname) @@ -316,7 +323,7 @@ class Ripper: for filename in glob.glob('track*.cdda.wav'): os.unlink(filename) - if Image is not None: + if self.release and Image is not None: threading.Thread(target=self.fetch_album_art).start() self._process_thread.start() self._encode_thread.start()