From 8dc5e692e829d00a8556eac2d2193804743bb70f 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 | 19 +++++++++++++------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/rupert/main.py b/src/rupert/main.py index 20aa17a..2b2360d 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[/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 3360d17..015c286 100644 --- a/src/rupert/ripper.py +++ b/src/rupert/ripper.py @@ -173,7 +173,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 @@ -207,11 +207,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 @@ -258,7 +262,7 @@ class Ripper: def __init__( self, device: DiscDrive, - release: Release, + release: Optional[Release], discno: int, tracks: Optional[TrackList] = None, use_libcdio: bool = False, @@ -293,14 +297,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)