From ab14fd15f4b04f9db08cedb136173dd509e44f0f Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Sun, 4 Nov 2018 11:51:52 -0600 Subject: [PATCH] Handle different release date formats Some release entries in the MusicBrainz database have different formats for the date field. In particular, a few have only a year value, while others have a year and month. This commit introduces a new `parse_date` function that attempts to parse a string into a date using one of the known formats. The `release_year` function uses this new function to parse the date and extract the year, but now also returns `None` if the date could not be parsed or was not present in the record. --- ripcd.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/ripcd.py b/ripcd.py index e584f2e..64bb382 100755 --- a/ripcd.py +++ b/ripcd.py @@ -28,6 +28,13 @@ log = logging.getLogger('ripcd2') filesystemencoding = sys.getfilesystemencoding() +DATE_FMTS = [ + '%Y-%m-%d', + '%Y-%m', + '%Y', +] + + DRIVE_OFFSETS = { 'ASUS_BW-12B1ST_a': 6, 'ATAPI_iHES212_3': 702, @@ -254,6 +261,16 @@ def get_release_list_from_device(device): return res['release-list'] +def parse_date(datestr): + for fmt in DATE_FMTS: + try: + return datetime.datetime.strptime(datestr, fmt) + except ValueError: + continue + else: + raise ValueError('Could not parse date string "{}"'.format(datestr)) + + def prompt(text, validate=None): while True: try: @@ -299,7 +316,10 @@ def prompt_select_release(release_list): def release_year(release): - return datetime.datetime.strptime(release['date'], '%Y-%m-%d').year + try: + return parse_date(release['date']).year + except (KeyError, ValueError): + return None def safe_name(name):