From e6d9838148bf7836643e62566cabd0d96f8db3dd Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 13:32:02 +0000 Subject: [PATCH 1/8] Enable %B (barcode) and %C (catalog number) template variables Already included but were not allowed. Improved documentation. Signed-off-by: JoeLametta --- man/whipper-cd-rip.rst | 2 ++ whipper/command/cd.py | 2 ++ whipper/common/common.py | 4 ++-- whipper/common/mbngs.py | 4 ++++ whipper/common/program.py | 2 ++ 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/man/whipper-cd-rip.rst b/man/whipper-cd-rip.rst index 2b8447b..af2a0b9 100644 --- a/man/whipper-cd-rip.rst +++ b/man/whipper-cd-rip.rst @@ -94,6 +94,8 @@ Template schemes | - %A: release artist | - %S: release sort name +| - %B: release barcode +| - %C: release catalog number | - %d: disc title | - %y: release year | - %r: release type, lowercase diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 205e650..32f95f7 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -54,6 +54,8 @@ filling in the variables and adding the file extension. Variables for both disc and track template are: - %A: release artist - %S: release sort name + - %B: release barcode + - %C: release catalog number - %d: disc title - %y: release year - %r: release type, lowercase diff --git a/whipper/common/common.py b/whipper/common/common.py index 9a5f523..f41704c 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -277,9 +277,9 @@ def getRelativePath(targetPath, collectionPath): def validate_template(template, kind): """Raise exception if disc/track template includes invalid variables.""" if kind == 'disc': - matches = re.findall(r'%[^ARSXdrxy]', template) + matches = re.findall(r'%[^ABCRSXdrxy]', template) elif kind == 'track': - matches = re.findall(r'%[^ARSXadnrstxy]', template) + matches = re.findall(r'%[^ABCRSXadnrstxy]', template) if '%' in template and matches: raise ValueError(kind + ' template string contains invalid ' 'variable(s): {}'.format(', '.join(matches))) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index a36f536..507defe 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -71,6 +71,10 @@ class DiscMetadata: :vartype tracks: list of :any:`TrackMetadata` :cvar countries: MusicBrainz release countries :vartype countries: list or None + :cvar catalogNumber: release catalog number + :vartype catalogNumber: str or None + :cvar barcode: release barcode + :vartype barcode: str or None """ artist = None diff --git a/whipper/common/program.py b/whipper/common/program.py index c953287..60a375f 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -176,6 +176,8 @@ class Program: * ``%A``: release artist * ``%S``: release artist sort name + * ``%B``: release barcode + * ``%C``: release catalog number * ``%d``: disc title * ``%y``: release year * ``%r``: release type, lowercase From e4645dfdd3b221aee54f81919dbbc228b135e6ae Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 14:03:28 +0000 Subject: [PATCH 2/8] Swap 'title' and 'releaseTitle' meaning - Trasparent change: now it makes more sense. - Updated tests to reflect 'title', 'releaseTitle' meaning swap. - Improved documentation. Signed-off-by: JoeLametta --- man/whipper-cd-rip.rst | 3 ++- whipper/command/cd.py | 5 +++-- whipper/command/mblookup.py | 2 +- whipper/common/mbngs.py | 18 ++++++++++-------- whipper/common/program.py | 26 ++++++++++++++------------ whipper/test/test_common_program.py | 4 ++-- 6 files changed, 32 insertions(+), 26 deletions(-) diff --git a/man/whipper-cd-rip.rst b/man/whipper-cd-rip.rst index af2a0b9..d85417f 100644 --- a/man/whipper-cd-rip.rst +++ b/man/whipper-cd-rip.rst @@ -96,7 +96,8 @@ Template schemes | - %S: release sort name | - %B: release barcode | - %C: release catalog number -| - %d: disc title +| - %d: release title (with disambiguation) +| - %D: disc title (without disambiguation) | - %y: release year | - %r: release type, lowercase | - %R: release type, normal case diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 32f95f7..f8bd3e5 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -56,7 +56,8 @@ disc and track template are: - %S: release sort name - %B: release barcode - %C: release catalog number - - %d: disc title + - %d: release title (with disambiguation) + - %D: disc title (without disambiguation) - %y: release year - %r: release type, lowercase - %R: release type, normal case @@ -187,7 +188,7 @@ class _CD(BaseCommand): and self.program.metadata.artist \ or 'Unknown Artist' self.program.result.title = self.program.metadata \ - and self.program.metadata.title \ + and self.program.metadata.releaseTitle \ or 'Unknown Title' _, self.program.result.vendor, self.program.result.model, \ self.program.result.release = \ diff --git a/whipper/command/mblookup.py b/whipper/command/mblookup.py index 967a699..89d2473 100644 --- a/whipper/command/mblookup.py +++ b/whipper/command/mblookup.py @@ -26,7 +26,7 @@ Example Disc ID: KnpGsLhvH.lPrNc1PBL21lb9Bg4-""" :type md: `DiscMetadata` """ print(' Artist: %s' % md.artist.encode('utf-8')) - print(' Title: %s' % md.title.encode('utf-8')) + print(' Title: %s' % md.releaseTitle.encode('utf-8')) print(' Type: %s' % str(md.releaseType).encode('utf-8')) print(' URL: %s' % md.url) print(' Tracks: %d' % len(md.tracks)) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 507defe..850b15a 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -66,8 +66,10 @@ class DiscMetadata: :cvar sortName: release artist sort name :cvar release: earliest release date, in YYYY-MM-DD :vartype release: str - :cvar title: title of the disc (with disambiguation) - :cvar releaseTitle: title of the release (without disambiguation) + :cvar title: title of the disc (without disambiguation) + :vartype title: str or None + :cvar releaseTitle: title of the release (with disambiguation) + :vartype releasetitle: str or None :vartype tracks: list of :any:`TrackMetadata` :cvar countries: MusicBrainz release countries :vartype countries: list or None @@ -285,17 +287,17 @@ def _getMetadata(release, discid=None, country=None): for medium in release['medium-list']: for disc in medium['disc-list']: if discid is None or disc['id'] == discid: - title = release['title'] - discMD.releaseTitle = title + discMD.title = release['title'] + discMD.releaseTitle = releaseTitle = discMD.title if 'disambiguation' in release: - title += " (%s)" % release['disambiguation'] + releaseTitle += " (%s)" % release['disambiguation'] count = len(release['medium-list']) if count > 1: - title += ' (Disc %d of %d)' % ( + releaseTitle += ' (Disc %d of %d)' % ( int(medium['position']), count) if 'title' in medium: - title += ": %s" % medium['title'] - discMD.title = title + releaseTitle += ": %s" % medium['title'] + discMD.releaseTitle = releaseTitle for t in medium['track-list']: track = TrackMetadata() trackCredit = _Credit( diff --git a/whipper/common/program.py b/whipper/common/program.py index 60a375f..9d14d57 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -178,7 +178,8 @@ class Program: * ``%S``: release artist sort name * ``%B``: release barcode * ``%C``: release catalog number - * ``%d``: disc title + * ``%d``: release title (with disambiguation) + * ``%D``: disc title (without disambiguation) * ``%y``: release year * ``%r``: release type, lowercase * ``%R``: release type, normal case @@ -189,7 +190,7 @@ class Program: assert isinstance(template, str), "%r is not str" % template v = {} v['A'] = 'Unknown Artist' - v['d'] = mbdiscid # fallback for title + v['d'] = v['D'] = mbdiscid # fallback for title v['r'] = 'unknown' v['R'] = 'Unknown' v['B'] = '' # barcode @@ -210,7 +211,8 @@ class Program: v['y'] = release[:4] v['A'] = metadata.artist v['S'] = metadata.sortName - v['d'] = metadata.title + v['d'] = metadata.releaseTitle + v['D'] = metadata.title v['B'] = metadata.barcode v['C'] = metadata.catalogNumber if metadata.releaseType: @@ -318,7 +320,7 @@ class Program: for metadata in metadatas: print('\nArtist : %s' % metadata.artist) - print('Title : %s' % metadata.title) + print('Title : %s' % metadata.releaseTitle) print('Duration: %s' % common.formatTime( metadata.duration / 1000.0)) print('URL : %s' % metadata.url) @@ -358,7 +360,7 @@ class Program: if len(metadatas) == 1: logger.info('picked requested release id %s', release) print('Artist: %s' % metadatas[0].artist) - print('Title : %s' % metadatas[0].title) + print('Title : %s' % metadatas[0].releaseTitle) elif not metadatas: logger.warning("requested release id '%s', but none of " "the found releases match", release) @@ -370,16 +372,16 @@ class Program: # If we have multiple, make sure they match if len(metadatas) > 1: artist = metadatas[0].artist - releaseTitle = metadatas[0].releaseTitle + discTitle = metadatas[0].title for i, metadata in enumerate(metadatas): if not artist == metadata.artist: logger.warning("artist 0: %r and artist %d: %r are " "not the same", artist, i, metadata.artist) - if not releaseTitle == metadata.releaseTitle: + if not discTitle == metadata.title: logger.warning("title 0: %r and title %d: %r are " - "not the same", releaseTitle, i, - metadata.releaseTitle) + "not the same", discTitle, i, + metadata.title) if not release and len(list(deltas)) > 1: logger.warning('picked closest match in duration. ' @@ -409,13 +411,13 @@ class Program: """ trackArtist = 'Unknown Artist' releaseArtist = 'Unknown Artist' - disc = 'Unknown Disc' + album = 'Unknown Album' title = 'Unknown Track' if self.metadata: trackArtist = self.metadata.artist releaseArtist = self.metadata.artist - disc = self.metadata.title + album = self.metadata.title # No disambiguation is proper here mbidRelease = self.metadata.mbid mbidReleaseGroup = self.metadata.mbidReleaseGroup mbidReleaseArtist = self.metadata.mbidArtist @@ -447,7 +449,7 @@ class Program: tags['ALBUMARTIST'] = releaseArtist tags['ARTIST'] = trackArtist tags['TITLE'] = title - tags['ALBUM'] = disc + tags['ALBUM'] = album tags['TRACKNUMBER'] = '%s' % number diff --git a/whipper/test/test_common_program.py b/whipper/test/test_common_program.py index 7856f55..1bc07a2 100644 --- a/whipper/test/test_common_program.py +++ b/whipper/test/test_common_program.py @@ -25,7 +25,7 @@ class PathTestCase(unittest.TestCase): prog = program.Program(config.Config()) md = mbngs.DiscMetadata() md.artist = md.sortName = 'Jeff Buckley' - md.title = 'Grace' + md.releaseTitle = 'Grace' path = prog.getPath('/tmp', DEFAULT_DISC_TEMPLATE, 'mbdiscid', md, 0) @@ -36,7 +36,7 @@ class PathTestCase(unittest.TestCase): prog = program.Program(config.Config()) md = mbngs.DiscMetadata() md.artist = md.sortName = 'Jeff Buckley' - md.title = 'Grace' + md.releaseTitle = 'Grace' path = prog.getPath('/tmp', '%A/%d', 'mbdiscid', md, 0) self.assertEqual(path, From a97820b5784d81f4bf84a00887237287c93983ea Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 14:11:59 +0000 Subject: [PATCH 3/8] Add %D (disc title without disambiguation) to allowed template variables Signed-off-by: JoeLametta --- whipper/common/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/whipper/common/common.py b/whipper/common/common.py index f41704c..5e99609 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -277,9 +277,9 @@ def getRelativePath(targetPath, collectionPath): def validate_template(template, kind): """Raise exception if disc/track template includes invalid variables.""" if kind == 'disc': - matches = re.findall(r'%[^ABCRSXdrxy]', template) + matches = re.findall(r'%[^ABCDRSXdrxy]', template) elif kind == 'track': - matches = re.findall(r'%[^ABCRSXadnrstxy]', template) + matches = re.findall(r'%[^ABCDRSXadnrstxy]', template) if '%' in template and matches: raise ValueError(kind + ' template string contains invalid ' 'variable(s): {}'.format(', '.join(matches))) From bff5c91fa3f63abea55fab900e5ca9ba97d38225 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 14:17:16 +0000 Subject: [PATCH 4/8] Introduce %I (MusicBrainz Disc ID) template variable Signed-off-by: JoeLametta --- man/whipper-cd-rip.rst | 1 + whipper/command/cd.py | 1 + whipper/common/common.py | 4 ++-- whipper/common/program.py | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/man/whipper-cd-rip.rst b/man/whipper-cd-rip.rst index d85417f..1b7ec56 100644 --- a/man/whipper-cd-rip.rst +++ b/man/whipper-cd-rip.rst @@ -98,6 +98,7 @@ Template schemes | - %C: release catalog number | - %d: release title (with disambiguation) | - %D: disc title (without disambiguation) +| - %I: MusicBrainz Disc ID | - %y: release year | - %r: release type, lowercase | - %R: release type, normal case diff --git a/whipper/command/cd.py b/whipper/command/cd.py index f8bd3e5..a36386e 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -58,6 +58,7 @@ disc and track template are: - %C: release catalog number - %d: release title (with disambiguation) - %D: disc title (without disambiguation) + - %I: MusicBrainz Disc ID - %y: release year - %r: release type, lowercase - %R: release type, normal case diff --git a/whipper/common/common.py b/whipper/common/common.py index 5e99609..da41250 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -277,9 +277,9 @@ def getRelativePath(targetPath, collectionPath): def validate_template(template, kind): """Raise exception if disc/track template includes invalid variables.""" if kind == 'disc': - matches = re.findall(r'%[^ABCDRSXdrxy]', template) + matches = re.findall(r'%[^ABCDIRSXdrxy]', template) elif kind == 'track': - matches = re.findall(r'%[^ABCDRSXadnrstxy]', template) + matches = re.findall(r'%[^ABCDIRSXadnrstxy]', template) if '%' in template and matches: raise ValueError(kind + ' template string contains invalid ' 'variable(s): {}'.format(', '.join(matches))) diff --git a/whipper/common/program.py b/whipper/common/program.py index 9d14d57..75b5732 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -180,6 +180,7 @@ class Program: * ``%C``: release catalog number * ``%d``: release title (with disambiguation) * ``%D``: disc title (without disambiguation) + * ``%I``: MusicBrainz Disc ID * ``%y``: release year * ``%r``: release type, lowercase * ``%R``: release type, normal case @@ -190,7 +191,7 @@ class Program: assert isinstance(template, str), "%r is not str" % template v = {} v['A'] = 'Unknown Artist' - v['d'] = v['D'] = mbdiscid # fallback for title + v['I'] = v['d'] = v['D'] = mbdiscid # fallback for title v['r'] = 'unknown' v['R'] = 'Unknown' v['B'] = '' # barcode From e6ad23f1193793f571e2807dd9000e8611ca6d52 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 16:37:16 +0000 Subject: [PATCH 5/8] Introduce %c (release disambiguation comment) template variable Signed-off-by: JoeLametta --- man/whipper-cd-rip.rst | 1 + whipper/command/cd.py | 1 + whipper/common/common.py | 4 ++-- whipper/common/mbngs.py | 4 ++++ whipper/common/program.py | 2 ++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/man/whipper-cd-rip.rst b/man/whipper-cd-rip.rst index 1b7ec56..4f1e57e 100644 --- a/man/whipper-cd-rip.rst +++ b/man/whipper-cd-rip.rst @@ -96,6 +96,7 @@ Template schemes | - %S: release sort name | - %B: release barcode | - %C: release catalog number +| - %c: release disambiguation comment | - %d: release title (with disambiguation) | - %D: disc title (without disambiguation) | - %I: MusicBrainz Disc ID diff --git a/whipper/command/cd.py b/whipper/command/cd.py index a36386e..a3e3b37 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -56,6 +56,7 @@ disc and track template are: - %S: release sort name - %B: release barcode - %C: release catalog number + - %c: release disambiguation comment - %d: release title (with disambiguation) - %D: disc title (without disambiguation) - %I: MusicBrainz Disc ID diff --git a/whipper/common/common.py b/whipper/common/common.py index da41250..76f1155 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -277,9 +277,9 @@ def getRelativePath(targetPath, collectionPath): def validate_template(template, kind): """Raise exception if disc/track template includes invalid variables.""" if kind == 'disc': - matches = re.findall(r'%[^ABCDIRSXdrxy]', template) + matches = re.findall(r'%[^ABCDIRSXcdrxy]', template) elif kind == 'track': - matches = re.findall(r'%[^ABCDIRSXadnrstxy]', template) + matches = re.findall(r'%[^ABCDIRSXacdnrstxy]', template) if '%' in template and matches: raise ValueError(kind + ' template string contains invalid ' 'variable(s): {}'.format(', '.join(matches))) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 850b15a..b785ea3 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -70,6 +70,8 @@ class DiscMetadata: :vartype title: str or None :cvar releaseTitle: title of the release (with disambiguation) :vartype releasetitle: str or None + :cvar releaseDisambCmt: release disambiguation comment + :vartype releaseDisambCmt: str or None :vartype tracks: list of :any:`TrackMetadata` :cvar countries: MusicBrainz release countries :vartype countries: list or None @@ -87,6 +89,7 @@ class DiscMetadata: release = None releaseTitle = None + releaseDisambCmt = None releaseType = None mbid = None @@ -290,6 +293,7 @@ def _getMetadata(release, discid=None, country=None): discMD.title = release['title'] discMD.releaseTitle = releaseTitle = discMD.title if 'disambiguation' in release: + discMD.releaseDisambCmt = release['disambiguation'] releaseTitle += " (%s)" % release['disambiguation'] count = len(release['medium-list']) if count > 1: diff --git a/whipper/common/program.py b/whipper/common/program.py index 75b5732..4f3ec44 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -178,6 +178,7 @@ class Program: * ``%S``: release artist sort name * ``%B``: release barcode * ``%C``: release catalog number + * ``%c``: release disambiguation comment * ``%d``: release title (with disambiguation) * ``%D``: disc title (without disambiguation) * ``%I``: MusicBrainz Disc ID @@ -216,6 +217,7 @@ class Program: v['D'] = metadata.title v['B'] = metadata.barcode v['C'] = metadata.catalogNumber + v['c'] = metadata.releaseDisambCmt if metadata.releaseType: v['R'] = metadata.releaseType v['r'] = metadata.releaseType.lower() From 76b8004b8f478fbb7d5dcc1904129c6a9686f988 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 16:39:49 +0000 Subject: [PATCH 6/8] Introduce %T (medium title) template variable Signed-off-by: JoeLametta --- man/whipper-cd-rip.rst | 1 + whipper/command/cd.py | 1 + whipper/common/common.py | 4 ++-- whipper/common/mbngs.py | 4 ++++ whipper/common/program.py | 2 ++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/man/whipper-cd-rip.rst b/man/whipper-cd-rip.rst index 4f1e57e..b4706db 100644 --- a/man/whipper-cd-rip.rst +++ b/man/whipper-cd-rip.rst @@ -100,6 +100,7 @@ Template schemes | - %d: release title (with disambiguation) | - %D: disc title (without disambiguation) | - %I: MusicBrainz Disc ID +| - %T: medium title | - %y: release year | - %r: release type, lowercase | - %R: release type, normal case diff --git a/whipper/command/cd.py b/whipper/command/cd.py index a3e3b37..f6bc2d6 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -60,6 +60,7 @@ disc and track template are: - %d: release title (with disambiguation) - %D: disc title (without disambiguation) - %I: MusicBrainz Disc ID + - %T: medium title - %y: release year - %r: release type, lowercase - %R: release type, normal case diff --git a/whipper/common/common.py b/whipper/common/common.py index 76f1155..21a5f3c 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -277,9 +277,9 @@ def getRelativePath(targetPath, collectionPath): def validate_template(template, kind): """Raise exception if disc/track template includes invalid variables.""" if kind == 'disc': - matches = re.findall(r'%[^ABCDIRSXcdrxy]', template) + matches = re.findall(r'%[^ABCDIRSTXcdrxy]', template) elif kind == 'track': - matches = re.findall(r'%[^ABCDIRSXacdnrstxy]', template) + matches = re.findall(r'%[^ABCDIRSTXacdnrstxy]', template) if '%' in template and matches: raise ValueError(kind + ' template string contains invalid ' 'variable(s): {}'.format(', '.join(matches))) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index b785ea3..0a35f82 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -72,6 +72,8 @@ class DiscMetadata: :vartype releasetitle: str or None :cvar releaseDisambCmt: release disambiguation comment :vartype releaseDisambCmt: str or None + :cvar mediumTitle: title of the medium + :vartype mediumTitle: str or None :vartype tracks: list of :any:`TrackMetadata` :cvar countries: MusicBrainz release countries :vartype countries: list or None @@ -100,6 +102,7 @@ class DiscMetadata: catalogNumber = None barcode = None countries = None + mediumTitle = None def __init__(self): self.tracks = [] @@ -300,6 +303,7 @@ def _getMetadata(release, discid=None, country=None): releaseTitle += ' (Disc %d of %d)' % ( int(medium['position']), count) if 'title' in medium: + discMD.mediumTitle = medium['title'] releaseTitle += ": %s" % medium['title'] discMD.releaseTitle = releaseTitle for t in medium['track-list']: diff --git a/whipper/common/program.py b/whipper/common/program.py index 4f3ec44..3015162 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -182,6 +182,7 @@ class Program: * ``%d``: release title (with disambiguation) * ``%D``: disc title (without disambiguation) * ``%I``: MusicBrainz Disc ID + * ``%T``: medium title * ``%y``: release year * ``%r``: release type, lowercase * ``%R``: release type, normal case @@ -218,6 +219,7 @@ class Program: v['B'] = metadata.barcode v['C'] = metadata.catalogNumber v['c'] = metadata.releaseDisambCmt + v['T'] = metadata.mediumTitle if metadata.releaseType: v['R'] = metadata.releaseType v['r'] = metadata.releaseType.lower() From 1edd3657ba0303aef512e61c701ff67a16f6eaaf Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 16:40:29 +0000 Subject: [PATCH 7/8] Introduce %M, %N template variables - %M: total number of discs in the chosen release - %N: number of current disc Signed-off-by: JoeLametta --- man/whipper-cd-rip.rst | 2 ++ whipper/command/cd.py | 2 ++ whipper/common/common.py | 4 ++-- whipper/common/mbngs.py | 13 ++++++++++--- whipper/common/program.py | 4 ++++ 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/man/whipper-cd-rip.rst b/man/whipper-cd-rip.rst index b4706db..01319e2 100644 --- a/man/whipper-cd-rip.rst +++ b/man/whipper-cd-rip.rst @@ -100,6 +100,8 @@ Template schemes | - %d: release title (with disambiguation) | - %D: disc title (without disambiguation) | - %I: MusicBrainz Disc ID +| - %M: total number of discs in the chosen release +| - %N: number of current disc | - %T: medium title | - %y: release year | - %r: release type, lowercase diff --git a/whipper/command/cd.py b/whipper/command/cd.py index f6bc2d6..68b6d42 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -60,6 +60,8 @@ disc and track template are: - %d: release title (with disambiguation) - %D: disc title (without disambiguation) - %I: MusicBrainz Disc ID + - %M: total number of discs in the chosen release + - %N: number of current disc - %T: medium title - %y: release year - %r: release type, lowercase diff --git a/whipper/common/common.py b/whipper/common/common.py index 21a5f3c..bdbb9ac 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -277,9 +277,9 @@ def getRelativePath(targetPath, collectionPath): def validate_template(template, kind): """Raise exception if disc/track template includes invalid variables.""" if kind == 'disc': - matches = re.findall(r'%[^ABCDIRSTXcdrxy]', template) + matches = re.findall(r'%[^ABCDIMNRSTXcdrxy]', template) elif kind == 'track': - matches = re.findall(r'%[^ABCDIRSTXacdnrstxy]', template) + matches = re.findall(r'%[^ABCDIMNRSTXacdnrstxy]', template) if '%' in template and matches: raise ValueError(kind + ' template string contains invalid ' 'variable(s): {}'.format(', '.join(matches))) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 0a35f82..c6a2aaa 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -77,6 +77,10 @@ class DiscMetadata: :vartype tracks: list of :any:`TrackMetadata` :cvar countries: MusicBrainz release countries :vartype countries: list or None + :cvar discNumber: number of current disc + :vartype discNumber: int or None + :cvar discTotal: total number of discs in the chosen release + :vartype discTotal: int or None :cvar catalogNumber: release catalog number :vartype catalogNumber: str or None :cvar barcode: release barcode @@ -102,6 +106,8 @@ class DiscMetadata: catalogNumber = None barcode = None countries = None + discNumber = None + discTotal = None mediumTitle = None def __init__(self): @@ -298,10 +304,11 @@ def _getMetadata(release, discid=None, country=None): if 'disambiguation' in release: discMD.releaseDisambCmt = release['disambiguation'] releaseTitle += " (%s)" % release['disambiguation'] - count = len(release['medium-list']) - if count > 1: + discMD.discNumber = int(medium['position']) + discMD.discTotal = len(release['medium-list']) + if discMD.discTotal > 1: releaseTitle += ' (Disc %d of %d)' % ( - int(medium['position']), count) + discMD.discNumber, discMD.discTotal) if 'title' in medium: discMD.mediumTitle = medium['title'] releaseTitle += ": %s" % medium['title'] diff --git a/whipper/common/program.py b/whipper/common/program.py index 3015162..3cc49e6 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -182,6 +182,8 @@ class Program: * ``%d``: release title (with disambiguation) * ``%D``: disc title (without disambiguation) * ``%I``: MusicBrainz Disc ID + * ``%M``: total number of discs in the chosen release + * ``%N``: number of current disc * ``%T``: medium title * ``%y``: release year * ``%r``: release type, lowercase @@ -219,6 +221,8 @@ class Program: v['B'] = metadata.barcode v['C'] = metadata.catalogNumber v['c'] = metadata.releaseDisambCmt + v['M'] = metadata.discTotal + v['N'] = metadata.discNumber v['T'] = metadata.mediumTitle if metadata.releaseType: v['R'] = metadata.releaseType From 9d67144087883f713097d8d185388cd1598365bd Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 15 May 2021 14:53:49 +0000 Subject: [PATCH 8/8] Add 'TRACKTOTAL', 'DISCTOTAL', 'DISCNUMBER' metatada to audio tracks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Máximo Castañeda Signed-off-by: JoeLametta --- whipper/common/program.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/whipper/common/program.py b/whipper/common/program.py index 3cc49e6..2ee4146 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -465,6 +465,12 @@ class Program: if self.metadata: if self.metadata.release is not None: tags['DATE'] = self.metadata.release + if self.metadata.tracks: + tags['TRACKTOTAL'] = str(len(self.metadata.tracks)) + if self.metadata.discTotal is not None: + tags['DISCTOTAL'] = str(self.metadata.discTotal) + if self.metadata.discNumber is not None: + tags['DISCNUMBER'] = str(self.metadata.discNumber) if number > 0: tags['MUSICBRAINZ_RELEASETRACKID'] = mbidTrack