wip: make metadata optional
parent
2b43b2e3af
commit
0b84b8dbcf
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue