From f99ffd77fd364fdd7d4e5dcfb93d613438b65a14 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Fri, 18 Jan 2019 12:05:12 +0100 Subject: [PATCH 01/79] Require Developer Certificate of Origin sign-off --- README.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/README.md b/README.md index ec68d988..6966bdf5 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ In order to track whipper's latest changes it's advised to check its commit hist - [Logger plugins](#logger-plugins) - [License](#license) - [Contributing](#contributing) + - [Developer Certificate of Origin (DCO)](#developer-certificate-of-origin-dco) + - [DCO Sign-Off Methods](#dco-sign-off-methods) - [Bug reports & feature requests](#bug-reports--feature-requests) - [Credits](#credits) - [Links](#links) @@ -328,6 +330,65 @@ repository](https://github.com/whipper-team/whipper). Where possible, please include tests for new or changed functionality. You can run tests with `python -m unittest discover` from your source checkout. +### Developer Certificate of Origin (DCO) + +To make a good faith effort to ensure licensing criteria are met, this project requires the Developer Certificate of Origin (DCO) process to be followed. + +The Developer Certificate of Origin (DCO) is a document that certifies you own and/or have the right to contribute the work and license it appropriately. The DCO is used instead of a _much more annoying_ +[CLA (Contributor License Agreement)](https://en.wikipedia.org/wiki/Contributor_License_Agreement). With the DCO, you retain copyright of your own work :). The DCO originated in the Linux community, and is used by other projects like Git and Docker. + +The DCO agreement is shown below and it's also available online: [HERE](https://developercertificate.org/). + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +1 Letterman Drive +Suite D4700 +San Francisco, CA, 94129 + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +#### DCO Sign-Off Methods + +The DCO requires a sign-off message in the following format appear on each commit in the pull request: + +``` +Signed-off-by: Full Name +``` + +The DCO text can either be manually added to your commit body, or you can add either `-s` or `--signoff` to your usual Git commit commands. If you forget to add the sign-off you can also amend a previous commit with the sign-off by running `git commit --amend -s`. + ### Bug reports & feature requests Please use the [issue tracker](https://github.com/whipper-team/whipper/issues) to report any bugs or to file feature requests. From 3e79032b63d25d7f2d66a73ad31f9c2db91d390c Mon Sep 17 00:00:00 2001 From: JTL Date: Sat, 2 Feb 2019 09:36:03 -0800 Subject: [PATCH 02/79] WIP: Refactor cdrdao toc/table functions into Task and provide progress output (#345) * Begin work on moving cdrdao to a task * Add code to start cdrdao task * Allow cdrdao output to be asynchronously parsable * Provide progress of cdrdao read toc/table to console * Flake8 fixes, Freso's advices --- whipper/command/cd.py | 1 - whipper/common/program.py | 53 ++++------ whipper/program/cdrdao.py | 199 +++++++++++++++++++++++++++----------- 3 files changed, 163 insertions(+), 90 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index e47b80ef..f8d68247 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -94,7 +94,6 @@ def do(self): utils.unmount_device(self.device) # first, read the normal TOC, which is fast - logger.info("reading TOC...") self.ittoc = self.program.getFastToc(self.runner, self.device) # already show us some info based on this diff --git a/whipper/common/program.py b/whipper/common/program.py index c4a53e19..ad468a21 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -27,11 +27,12 @@ import os import time -from whipper.common import accurip, cache, checksum, common, mbngs, path +from whipper.common import accurip, checksum, common, mbngs, path from whipper.program import cdrdao, cdparanoia from whipper.image import image from whipper.extern import freedb from whipper.extern.task import task +from whipper.result import result import logging logger = logging.getLogger(__name__) @@ -63,7 +64,6 @@ def __init__(self, config, record=False): @param record: whether to record results of API calls for playback. """ self._record = record - self._cache = cache.ResultCache() self._config = config d = {} @@ -95,42 +95,31 @@ def getFastToc(self, runner, device): if V(version) < V('1.2.3rc2'): logger.warning('cdrdao older than 1.2.3 has a pre-gap length bug.' ' See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=102171') # noqa: E501 - toc = cdrdao.ReadTOCTask(device).table + + t = cdrdao.ReadTOC_Task(device) + runner.run(t) + toc = t.toc.table + assert toc.hasTOC() return toc def getTable(self, runner, cddbdiscid, mbdiscid, device, offset, - out_path): + toc_path): """ - Retrieve the Table either from the cache or the drive. + Retrieve the Table from the drive. @rtype: L{table.Table} """ - tcache = cache.TableCache() - ptable = tcache.get(cddbdiscid, mbdiscid) itable = None tdict = {} - # Ignore old cache, since we do not know what offset it used. - if isinstance(ptable.object, dict): - tdict = ptable.object - - if offset in tdict: - itable = tdict[offset] - - if not itable: - logger.debug('getTable: cddbdiscid %s, mbdiscid %s not in cache ' - 'for offset %s, reading table', cddbdiscid, mbdiscid, - offset) - t = cdrdao.ReadTableTask(device, out_path) - itable = t.table - tdict[offset] = itable - ptable.persist(tdict) - logger.debug('getTable: read table %r', itable) - else: - logger.debug('getTable: cddbdiscid %s, mbdiscid %s in cache ' - 'for offset %s', cddbdiscid, mbdiscid, offset) - logger.debug('getTable: loaded table %r', itable) + t = cdrdao.ReadTOC_Task(device) + t.description = "Reading table" + t.toc_path = toc_path + runner.run(t) + itable = t.toc.table + tdict[offset] = itable + logger.debug('getTable: read table %r' % itable) assert itable.hasTOC() @@ -142,21 +131,15 @@ def getTable(self, runner, cddbdiscid, mbdiscid, device, offset, def getRipResult(self, cddbdiscid): """ - Retrieve the persistable RipResult either from our cache (from a - previous, possibly aborted rip), or return a new one. + Return a RipResult object. @rtype: L{result.RipResult} """ assert self.result is None - - self._presult = self._cache.getRipResult(cddbdiscid) - self.result = self._presult.object + self.result = result.RipResult() return self.result - def saveRipResult(self): - self._presult.persist() - def addDisambiguation(self, template_part, metadata): "Add disambiguation to template path part string." if metadata.catalogNumber: diff --git a/whipper/program/cdrdao.py b/whipper/program/cdrdao.py index 148c9aaf..acaebd9f 100644 --- a/whipper/program/cdrdao.py +++ b/whipper/program/cdrdao.py @@ -2,58 +2,163 @@ import re import shutil import tempfile +import subprocess from subprocess import Popen, PIPE -from whipper.common.common import EjectError, truncate_filename +from whipper.common.common import truncate_filename from whipper.image.toc import TocFile +from whipper.extern.task import task +from whipper.extern import asyncsub import logging logger = logging.getLogger(__name__) CDRDAO = 'cdrdao' +_TRACK_RE = re.compile(r"^Analyzing track (?P[0-9]*) \(AUDIO\): start (?P[0-9]*:[0-9]*:[0-9]*), length (?P[0-9]*:[0-9]*:[0-9]*)") # noqa: E501 +_CRC_RE = re.compile( + r"Found (?P[0-9]*) Q sub-channels with CRC errors") +_BEGIN_CDRDAO_RE = re.compile(r"-" * 60) +_LAST_TRACK_RE = re.compile(r"^(?P[0-9]*)") +_LEADOUT_RE = re.compile( + r"^Leadout AUDIO\s*[0-9]\s*[0-9]*:[0-9]*:[0-9]*\([0-9]*\)") -def read_toc(device, fast_toc=False, toc_path=None): + +class ProgressParser: + tracks = 0 + currentTrack = 0 + oldline = '' # for leadout/final track number detection + + def parse(self, line): + cdrdao_m = _BEGIN_CDRDAO_RE.match(line) + + if cdrdao_m: + logger.debug("RE: Begin cdrdao toc-read") + + leadout_m = _LEADOUT_RE.match(line) + + if leadout_m: + logger.debug("RE: Reached leadout") + last_track_m = _LAST_TRACK_RE.match(self.oldline) + if last_track_m: + self.tracks = last_track_m.group('track') + + track_s = _TRACK_RE.search(line) + if track_s: + logger.debug("RE: Began reading track: %d", + int(track_s.group('track'))) + self.currentTrack = int(track_s.group('track')) + + crc_s = _CRC_RE.search(line) + if crc_s: + print("Track %d finished, " + "found %d Q sub-channels with CRC errors" % + (self.currentTrack, int(crc_s.group('channels')))) + + self.oldline = line + + +class ReadTOCTask(task.Task): """ - Return cdrdao-generated table of contents for 'device'. + Task that reads the TOC of the disc using cdrdao """ - # cdrdao MUST be passed a non-existing filename as its last argument - # to write the TOC to; it does not support writing to stdout or - # overwriting an existing file, nor does linux seem to support - # locking a non-existant file. Thus, this race-condition introducing - # hack is carried from morituri to whipper and will be removed when - # cdrdao is fixed. - fd, tocfile = tempfile.mkstemp(suffix=u'.cdrdao.read-toc.whipper') - os.close(fd) - os.unlink(tocfile) - - cmd = [CDRDAO, 'read-toc'] + (['--fast-toc'] if fast_toc else []) + [ - '--device', device, tocfile] - # PIPE is the closest to >/dev/null we can get - logger.debug("executing %r", cmd) - p = Popen(cmd, stdout=PIPE, stderr=PIPE) - _, stderr = p.communicate() - if p.returncode != 0: - msg = 'cdrdao read-toc failed: return code is non-zero: ' + \ - str(p.returncode) - logger.critical(msg) - # Gracefully handle missing disc - if "ERROR: Unit not ready, giving up." in stderr: - raise EjectError(device, "no disc detected") - raise IOError(msg) - - toc = TocFile(tocfile) - toc.parse() - if toc_path is not None: - t_comp = os.path.abspath(toc_path).split(os.sep) - t_dirn = os.sep.join(t_comp[:-1]) - # If the output path doesn't exist, make it recursively - if not os.path.isdir(t_dirn): - os.makedirs(t_dirn) - t_dst = truncate_filename(os.path.join(t_dirn, t_comp[-1] + '.toc')) - shutil.copy(tocfile, os.path.join(t_dirn, t_dst)) - os.unlink(tocfile) - return toc + description = "Reading TOC" + toc = None + + def __init__(self, device, fast_toc=False, toc_path=None): + """ + Read the TOC for 'device'. + + @param device: block device to read TOC from + @type device: str + @param fast_toc: If to use fast-toc cdrdao mode + @type fast_toc: bool + @param toc_path: Where to save TOC if wanted. + @type toc_path: str + """ + + self.device = device + self.fast_toc = fast_toc + self.toc_path = toc_path + self._buffer = "" # accumulate characters + self._parser = ProgressParser() + + self.fd, self.tocfile = tempfile.mkstemp( + suffix=u'.cdrdao.read-toc.whipper.task') + + def start(self, runner): + task.Task.start(self, runner) + os.close(self.fd) + os.unlink(self.tocfile) + + cmd = ([CDRDAO, 'read-toc'] + + (['--fast-toc'] if self.fast_toc else []) + + ['--device', self.device, self.tocfile]) + + self._popen = asyncsub.Popen(cmd, + bufsize=1024, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True) + + self.schedule(0.01, self._read, runner) + + def _read(self, runner): + ret = self._popen.recv_err() + if not ret: + if self._popen.poll() is not None: + self._done() + return + self.schedule(0.01, self._read, runner) + return + self._buffer += ret + + # parse buffer into lines if possible, and parse them + if "\n" in self._buffer: + lines = self._buffer.split('\n') + if lines[-1] != "\n": + # last line didn't end yet + self._buffer = lines[-1] + del lines[-1] + else: + self._buffer = "" + for line in lines: + self._parser.parse(line) + if (self._parser.currentTrack is not 0 and + self._parser.tracks is not 0): + progress = (float('%d' % self._parser.currentTrack) / + float(self._parser.tracks)) + if progress < 1.0: + self.setProgress(progress) + + # 0 does not give us output before we complete, 1.0 gives us output + # too late + self.schedule(0.01, self._read, runner) + + def _poll(self, runner): + if self._popen.poll() is None: + self.schedule(1.0, self._poll, runner) + return + + self._done() + + def _done(self): + self.setProgress(1.0) + self.toc = TocFile(self.tocfile) + self.toc.parse() + if self.toc_path is not None: + t_comp = os.path.abspath(self.toc_path).split(os.sep) + t_dirn = os.sep.join(t_comp[:-1]) + # If the output path doesn't exist, make it recursively + if not os.path.isdir(t_dirn): + os.makedirs(t_dirn) + t_dst = truncate_filename( + os.path.join(t_dirn, t_comp[-1] + '.toc')) + shutil.copy(self.tocfile, os.path.join(t_dirn, t_dst)) + os.unlink(self.tocfile) + self.stop() + return def DetectCdr(device): @@ -88,20 +193,6 @@ def version(): return m.group('version') -def ReadTOCTask(device): - """ - stopgap morituri-insanity compatibility layer - """ - return read_toc(device, fast_toc=True) - - -def ReadTableTask(device, toc_path=None): - """ - stopgap morituri-insanity compatibility layer - """ - return read_toc(device, toc_path=toc_path) - - def getCDRDAOVersion(): """ stopgap morituri-insanity compatibility layer From 8dfcc5b5ec28263fc7a7555acb1c2900091161f3 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Wed, 16 Jan 2019 19:57:32 +0000 Subject: [PATCH 03/79] Improve regular expressions - Remove redundant escape - Remove erroneous character - Remove duplicate character --- whipper/common/common.py | 4 ++-- whipper/common/path.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/whipper/common/common.py b/whipper/common/common.py index 1b46d4e8..675b021c 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -285,9 +285,9 @@ def validate_template(template, kind): Raise exception if disc/track template includes invalid variables """ if kind == 'disc': - matches = re.findall(r'%[^A,R,S,X,d,r,x,y]', template) + matches = re.findall(r'%[^ARSXdrxy]', template) elif kind == 'track': - matches = re.findall(r'%[^A,R,S,X,a,d,n,r,s,t,x,y]', template) + matches = re.findall(r'%[^ARSXadnrstxy]', template) if '%' in template and matches: raise ValueError(kind + ' template string contains invalid ' 'variable(s): {}'.format(', '.join(matches))) diff --git a/whipper/common/path.py b/whipper/common/path.py index a5d0eb4b..268b3379 100644 --- a/whipper/common/path.py +++ b/whipper/common/path.py @@ -45,7 +45,7 @@ def filter(self, path): def separators(path): # replace separators with a space-hyphen or hyphen path = re.sub(r'[:]', ' -', path, re.UNICODE) - path = re.sub(r'[\|]', '-', path, re.UNICODE) + path = re.sub(r'[|]', '-', path, re.UNICODE) return path # change all fancy single/double quotes to normal quotes @@ -56,12 +56,12 @@ def separators(path): if self._special: path = separators(path) - path = re.sub(r'[\*\?&!\'\"\$\(\)`{}\[\]<>]', + path = re.sub(r'[*?&!\'\"$()`{}\[\]<>]', '_', path, re.UNICODE) if self._fat: path = separators(path) # : and | already gone, but leave them here for reference - path = re.sub(r'[:\*\?"<>|"]', '_', path, re.UNICODE) + path = re.sub(r'[:*?"<>|]', '_', path, re.UNICODE) return path From 0e17b32740d1a161c54df419c587a6fc46ccd02c Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Wed, 16 Jan 2019 20:40:55 +0000 Subject: [PATCH 04/79] Various stylistic fixes - Fix PEP8's line too long warning - Remove useless parentheses - Use triple quotes for docstring - Address pylint's 'inconsistent-return-statements' - Specify string format arguments as logging function parameters - Comment out already disabled block of code - Remove useless else (after return) - Remove useless statement - Do not import already imported module --- whipper/command/basecommand.py | 2 +- whipper/command/cd.py | 2 ++ whipper/command/main.py | 10 +++++----- whipper/command/mblookup.py | 2 ++ whipper/command/offset.py | 6 ++++-- whipper/common/cache.py | 5 ++--- whipper/common/common.py | 15 +++++++-------- whipper/common/drive.py | 2 +- whipper/common/mbngs.py | 4 +--- whipper/common/program.py | 8 ++++---- whipper/common/renamer.py | 4 +--- whipper/extern/freedb.py | 2 +- whipper/image/image.py | 1 - whipper/image/table.py | 2 +- whipper/program/cdparanoia.py | 10 ++++------ whipper/program/cdrdao.py | 4 ++-- whipper/program/utils.py | 2 +- whipper/test/common.py | 2 +- 18 files changed, 40 insertions(+), 43 deletions(-) diff --git a/whipper/command/basecommand.py b/whipper/command/basecommand.py index 4a81af25..5ad49f3a 100644 --- a/whipper/command/basecommand.py +++ b/whipper/command/basecommand.py @@ -25,7 +25,7 @@ # options) to the child command. -class BaseCommand(): +class BaseCommand: """ Register and handle whipper command arguments with ArgumentParser. diff --git a/whipper/command/cd.py b/whipper/command/cd.py index f8d68247..aed96d8a 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -191,6 +191,8 @@ def do(self): if self.options.eject in ('success', 'always'): utils.eject_device(self.device) + return None + def doCommand(self): pass diff --git a/whipper/command/main.py b/whipper/command/main.py index adaec7b0..651f748e 100644 --- a/whipper/command/main.py +++ b/whipper/command/main.py @@ -74,11 +74,11 @@ def main(): class Whipper(BaseCommand): - description = """whipper is a CD ripping utility focusing on accuracy over speed. - -whipper gives you a tree of subcommands to work with. -You can get help on subcommands by using the -h option to the subcommand. -""" + description = ( + "whipper is a CD ripping utility focusing on accuracy over speed.\n\n" + "whipper gives you a tree of subcommands to work with.\n" + "You can get help on subcommands by using the -h option " + "to the subcommand.\n") no_add_help = True subcommands = { 'accurip': accurip.AccuRip, diff --git a/whipper/command/mblookup.py b/whipper/command/mblookup.py index 53f8b19c..e8e7c601 100644 --- a/whipper/command/mblookup.py +++ b/whipper/command/mblookup.py @@ -42,3 +42,5 @@ def do(self): j + 1, track.artist.encode('utf-8'), track.title.encode('utf-8') )) + + return None diff --git a/whipper/command/offset.py b/whipper/command/offset.py index 9fe620cb..300d90f9 100644 --- a/whipper/command/offset.py +++ b/whipper/command/offset.py @@ -94,7 +94,7 @@ def do(self): except accurip.EntryNotFound: logger.warning("AccurateRip entry not found: drive offset " "can't be determined, try again with another disc") - return + return None if responses: logger.debug('%d AccurateRip responses found.', len(responses)) @@ -170,6 +170,8 @@ def match(archecksums, track, responses): logger.error('no matching offset found. ' 'Consider trying again with a different disc') + return None + def _arcs(self, runner, table, track, offset): # rips the track with the given offset, return the arcs checksums logger.debug('ripping track %r with offset %d...', track, offset) @@ -196,7 +198,7 @@ def _arcs(self, runner, table, track, offset): ) os.unlink(path) - return ("%08x" % v1, "%08x" % v2) + return "%08x" % v1, "%08x" % v2 def _foundOffset(self, device, offset): print('\nRead offset of device is: %d.' % offset) diff --git a/whipper/common/cache.py b/whipper/common/cache.py index 5305ed3d..18fe6b3f 100644 --- a/whipper/common/cache.py +++ b/whipper/common/cache.py @@ -93,10 +93,10 @@ def _unpickle(self, default=None): self.object = default if not self._path: - return None + return if not os.path.exists(self._path): - return None + return handle = open(self._path) import pickle @@ -109,7 +109,6 @@ def _unpickle(self, default=None): # can fail for various reasons; in that case, pretend we didn't # load it logger.debug(e) - pass def delete(self): self.object = None diff --git a/whipper/common/common.py b/whipper/common/common.py index 675b021c..b81395bf 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -116,7 +116,7 @@ def formatTime(seconds, fractional=3): chunks = [] if seconds < 0: - chunks.append(('-')) + chunks.append('-') seconds = -seconds hour = 60 * 60 @@ -271,13 +271,12 @@ def getRelativePath(targetPath, collectionPath): if targetDir == collectionDir: logger.debug('getRelativePath: target and collection in same dir') return os.path.basename(targetPath) - else: - rel = os.path.relpath( - targetDir + os.path.sep, - collectionDir + os.path.sep) - logger.debug('getRelativePath: target and collection ' - 'in different dir, %r', rel) - return os.path.join(rel, os.path.basename(targetPath)) + rel = os.path.relpath( + targetDir + os.path.sep, + collectionDir + os.path.sep) + logger.debug('getRelativePath: target and collection ' + 'in different dir, %r', rel) + return os.path.join(rel, os.path.basename(targetPath)) def validate_template(template, kind): diff --git a/whipper/common/drive.py b/whipper/common/drive.py index 37950fd0..226e04dd 100644 --- a/whipper/common/drive.py +++ b/whipper/common/drive.py @@ -68,4 +68,4 @@ def getDeviceInfo(path): device = cdio.Device(path) ok, vendor, model, release = device.get_hwinfo() - return (vendor, model, release) + return vendor, model, release diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index aaab4c16..c16d529e 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -317,6 +317,4 @@ def musicbrainz(discid, country=None, record=False): return ret elif result.get('cdstub'): logger.debug('query returned cdstub: ignored') - return None - else: - return None + return None diff --git a/whipper/common/program.py b/whipper/common/program.py index ad468a21..383ffccb 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -141,7 +141,7 @@ def getRipResult(self, cddbdiscid): return self.result def addDisambiguation(self, template_part, metadata): - "Add disambiguation to template path part string." + """Add disambiguation to template path part string.""" if metadata.catalogNumber: template_part += ' (%s)' % metadata.catalogNumber elif metadata.barcode: @@ -327,7 +327,7 @@ def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, elif not metadatas: logger.warning("requested release id '%s', but none of " "the found releases match", release) - return + return None else: if lowest: metadatas = deltas[lowest] @@ -346,7 +346,7 @@ def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, "not the same", releaseTitle, i, metadata.releaseTitle) - if (not release and len(list(deltas)) > 1): + if not release and len(list(deltas)) > 1: logger.warning('picked closest match in duration. ' 'Others may be wrong in MusicBrainz, ' 'please correct') @@ -438,7 +438,7 @@ def getHTOA(self): start = index.absolute stop = track.getIndex(1).absolute - 1 - return (start, stop) + return start, stop def verifyTrack(self, runner, trackResult): is_wave = not trackResult.filename.endswith('.flac') diff --git a/whipper/common/renamer.py b/whipper/common/renamer.py index 8db09a44..0f24c364 100644 --- a/whipper/common/renamer.py +++ b/whipper/common/renamer.py @@ -21,9 +21,7 @@ import os import tempfile -""" -Rename files on file system and inside metafiles in a resumable way. -""" +"""Rename files on file system and inside metafiles in a resumable way.""" class Operator(object): diff --git a/whipper/extern/freedb.py b/whipper/extern/freedb.py index 48a3deb5..d08fcb7a 100644 --- a/whipper/extern/freedb.py +++ b/whipper/extern/freedb.py @@ -145,7 +145,7 @@ def perform_lookup(disc_id, freedb_server, freedb_port): response = RESPONSE.match(next(query)) if response is not None: - # FIXME - check response code here + # FIXME: check response code here freedb = {} line = next(query) while not line.startswith(u"."): diff --git a/whipper/image/image.py b/whipper/image/image.py index 93120cca..0d058934 100644 --- a/whipper/image/image.py +++ b/whipper/image/image.py @@ -205,7 +205,6 @@ def add(index): add(htoa) except (KeyError, IndexError): logger.debug('no HTOA track') - pass for trackIndex, track in enumerate(cue.table.tracks): logger.debug('encoding track %d', trackIndex + 1) diff --git a/whipper/image/table.py b/whipper/image/table.py index 1d03f964..64050ab8 100644 --- a/whipper/image/table.py +++ b/whipper/image/table.py @@ -824,7 +824,7 @@ def accuraterip_ids(self): discId1 &= 0xffffffff discId2 &= 0xffffffff - return ("%08x" % discId1, "%08x" % discId2) + return "%08x" % discId1, "%08x" % discId2 def accuraterip_path(self): discId1, discId2 = self.accuraterip_ids() diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index 74871a4a..6fe475a5 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -159,11 +159,10 @@ def _parse_read(self, wordOffset): markEnd = frameOffset # FIXME: doing this is way too slow even for a testcase, so disable - if False: - for frame in range(markStart, markEnd): - if frame not in list(self._reads.keys()): - self._reads[frame] = 0 - self._reads[frame] += 1 + # for frame in range(markStart, markEnd): + # if frame not in list(self._reads.keys()): + # self._reads[frame] = 0 + # self._reads[frame] += 1 # cdparanoia reads quite a bit beyond the current track before it # goes back to verify; don't count those @@ -300,7 +299,6 @@ def start(self, runner): stderr=subprocess.PIPE, close_fds=True) except OSError as e: - import errno if e.errno == errno.ENOENT: raise common.MissingDependencyException('cd-paranoia') diff --git a/whipper/program/cdrdao.py b/whipper/program/cdrdao.py index acaebd9f..36a0f899 100644 --- a/whipper/program/cdrdao.py +++ b/whipper/program/cdrdao.py @@ -125,8 +125,8 @@ def _read(self, runner): self._buffer = "" for line in lines: self._parser.parse(line) - if (self._parser.currentTrack is not 0 and - self._parser.tracks is not 0): + if (self._parser.currentTrack != 0 and + self._parser.tracks != 0): progress = (float('%d' % self._parser.currentTrack) / float(self._parser.tracks)) if progress < 1.0: diff --git a/whipper/program/utils.py b/whipper/program/utils.py index f332738c..e4133a62 100644 --- a/whipper/program/utils.py +++ b/whipper/program/utils.py @@ -28,7 +28,7 @@ def unmount_device(device): If the given device is a symlink, the target will be checked. """ device = os.path.realpath(device) - logger.debug('possibly unmount real path %r' % device) + logger.debug('possibly unmount real path %r', device) proc = open('/proc/mounts').read() if device in proc: print('Device %s is mounted, unmounting' % device) diff --git a/whipper/test/common.py b/whipper/test/common.py index ad2c084c..49cf1093 100644 --- a/whipper/test/common.py +++ b/whipper/test/common.py @@ -71,7 +71,7 @@ def readCue(self, name): ret = open(cuefile).read().decode('utf-8') ret = re.sub( 'REM COMMENT "whipper.*', - 'REM COMMENT "whipper %s"' % (whipper.__version__), + 'REM COMMENT "whipper %s"' % whipper.__version__, ret, re.MULTILINE) return ret From fef79731134c5af26f700b49c08bb9e4a58e22c7 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Wed, 16 Jan 2019 21:08:43 +0000 Subject: [PATCH 05/79] Modernize code for easier Python 3 port - Replace print statement with function call - Replace except ..., ...: syntax with except ... as ...: - Simplify obsolete try ... except ... code block - Replace some unicode calls with u-prefixed strings - Do not use `len(SEQUENCE)` to determine if a sequence is empty - Replace dictionary creation - Drop support for GObject static bindings --- misc/offsets.py | 2 +- whipper/command/accurip.py | 4 +--- whipper/extern/asyncsub.py | 8 ++++---- whipper/extern/task/task.py | 13 +++++-------- whipper/image/table.py | 8 ++------ whipper/test/test_common_program.py | 10 ++++------ 6 files changed, 17 insertions(+), 28 deletions(-) diff --git a/misc/offsets.py b/misc/offsets.py index 53b36ea8..626f9252 100644 --- a/misc/offsets.py +++ b/misc/offsets.py @@ -64,4 +64,4 @@ line = line[:-2] + '"' lines.append(line) -print "\n".join(lines) +print("\n".join(lines)) diff --git a/whipper/command/accurip.py b/whipper/command/accurip.py index e12f6c8c..8ea666b7 100644 --- a/whipper/command/accurip.py +++ b/whipper/command/accurip.py @@ -59,9 +59,7 @@ def do(self): assert len(r.checksums) == r.num_tracks assert len(r.confidences) == r.num_tracks - entry = {} - entry["confidence"] = r.confidences[track] - entry["response"] = i + 1 + entry = {"confidence": r.confidences[track], "response": i + 1} checksum = r.checksums[track] if checksum in checksums: checksums[checksum].append(entry) diff --git a/whipper/extern/asyncsub.py b/whipper/extern/asyncsub.py index 3ee0fef4..76b1e0dc 100644 --- a/whipper/extern/asyncsub.py +++ b/whipper/extern/asyncsub.py @@ -53,7 +53,7 @@ def send(self, input): (errCode, written) = WriteFile(x, input) except ValueError: return self._close('stdin') - except (subprocess.pywintypes.error, Exception), why: + except (subprocess.pywintypes.error, Exception) as why: if why.args[0] in (109, errno.ESHUTDOWN): return self._close('stdin') raise @@ -74,7 +74,7 @@ def _recv(self, which, maxsize): (errCode, read) = ReadFile(x, nAvail, None) except ValueError: return self._close(which) - except (subprocess.pywintypes.error, Exception), why: + except (subprocess.pywintypes.error, Exception) as why: if why.args[0] in (109, errno.ESHUTDOWN): return self._close(which) raise @@ -94,7 +94,7 @@ def send(self, input): try: written = os.write(self.stdin.fileno(), input) - except OSError, why: + except OSError as why: if why.args[0] == errno.EPIPE: # broken pipe return self._close('stdin') raise @@ -153,7 +153,7 @@ def recv_some(p, t=.1, e=1, tr=5, stderr=0): def send_all(p, data): - while len(data): + while data: sent = p.send(data) if sent is None: raise Exception(message) diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index 250ccd63..c3f86f7f 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -22,10 +22,7 @@ import logging import sys -try: - from gi.repository import GLib as gobject -except ImportError: - import gobject +from gi.repository import GLib as GLib logger = logging.getLogger(__name__) @@ -463,7 +460,7 @@ def schedule(self, delta, callable, *args, **kwargs): class SyncRunner(TaskRunner, ITaskListener): """ - I run the task synchronously in a gobject MainLoop. + I run the task synchronously in a GObject MainLoop. """ def __init__(self, verbose=True): @@ -478,11 +475,11 @@ def run(self, task, verbose=None, skip=False): self._verboseRun = verbose self._skip = skip - self._loop = gobject.MainLoop() + self._loop = GLib.MainLoop() self._task.addListener(self) # only start the task after going into the mainloop, # otherwise the task might complete before we are in it - gobject.timeout_add(0L, self._startWrap, self._task) + GLib.timeout_add(0L, self._startWrap, self._task) self.debug('run loop') self._loop.run() @@ -526,7 +523,7 @@ def c(): self.debug('schedule: scheduling %r(*args=%r, **kwargs=%r)', callable, args, kwargs) - gobject.timeout_add(int(delta * 1000L), c) + GLib.timeout_add(int(delta * 1000L), c) # ITaskListener methods def progressed(self, task, value): diff --git a/whipper/image/table.py b/whipper/image/table.py index 64050ab8..2cd6ba7c 100644 --- a/whipper/image/table.py +++ b/whipper/image/table.py @@ -339,13 +339,9 @@ def getMusicBrainzDiscId(self): values = self._getMusicBrainzValues() # MusicBrainz disc id does not take into account data tracks - # P2.3 - try: - import hashlib - sha1 = hashlib.sha1 - except ImportError: - from sha import sha as sha1 import base64 + import hashlib + sha1 = hashlib.sha1 sha = sha1() diff --git a/whipper/test/test_common_program.py b/whipper/test/test_common_program.py index ef7ca0b4..4fba9874 100644 --- a/whipper/test/test_common_program.py +++ b/whipper/test/test_common_program.py @@ -15,9 +15,8 @@ def testStandardTemplateEmpty(self): path = prog.getPath(u'/tmp', DEFAULT_DISC_TEMPLATE, 'mbdiscid', None) - self.assertEqual(path, - unicode('/tmp/unknown/Unknown Artist - mbdiscid/' - 'Unknown Artist - mbdiscid')) + self.assertEqual(path, (u'/tmp/unknown/Unknown Artist - mbdiscid/' + u'Unknown Artist - mbdiscid')) def testStandardTemplateFilled(self): prog = program.Program(config.Config()) @@ -27,9 +26,8 @@ def testStandardTemplateFilled(self): path = prog.getPath(u'/tmp', DEFAULT_DISC_TEMPLATE, 'mbdiscid', md, 0) - self.assertEqual(path, - unicode('/tmp/unknown/Jeff Buckley - Grace/' - 'Jeff Buckley - Grace')) + self.assertEqual(path, (u'/tmp/unknown/Jeff Buckley - Grace/' + u'Jeff Buckley - Grace')) def testIssue66TemplateFilled(self): prog = program.Program(config.Config()) From 5311727572abb05fb3bf3326fb0a4ce332593c29 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Wed, 16 Jan 2019 21:21:21 +0000 Subject: [PATCH 06/79] Avoid shadowing built-ins/variables --- whipper/common/program.py | 4 ++-- whipper/common/task.py | 4 ++-- whipper/extern/asyncsub.py | 12 ++++++------ whipper/extern/task/task.py | 16 ++++++++-------- whipper/image/cue.py | 4 ++-- whipper/program/cdparanoia.py | 4 ++-- whipper/program/soxi.py | 8 ++++---- whipper/test/test_program_cdparanoia.py | 4 ++-- 8 files changed, 28 insertions(+), 28 deletions(-) diff --git a/whipper/common/program.py b/whipper/common/program.py index 383ffccb..f1f932d4 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -572,10 +572,10 @@ def writeCue(self, discName): return cuePath - def writeLog(self, discName, logger): + def writeLog(self, discName, txt_logger): logPath = common.truncate_filename(discName + '.log') handle = open(logPath, 'w') - log = logger.log(self.result) + log = txt_logger.log(self.result) handle.write(log.encode('utf-8')) handle.close() diff --git a/whipper/common/task.py b/whipper/common/task.py index 5e619334..d58fcea3 100644 --- a/whipper/common/task.py +++ b/whipper/common/task.py @@ -115,13 +115,13 @@ def abort(self): os.kill(self._popen.pid, signal.SIGTERM) # self.stop() - def readbytesout(self, bytes): + def readbytesout(self, bytes_stdout): """ Called when bytes have been read from stdout. """ pass - def readbyteserr(self, bytes): + def readbyteserr(self, bytes_stderr): """ Called when bytes have been read from stderr. """ diff --git a/whipper/extern/asyncsub.py b/whipper/extern/asyncsub.py index 76b1e0dc..4e4f9a8c 100644 --- a/whipper/extern/asyncsub.py +++ b/whipper/extern/asyncsub.py @@ -28,8 +28,8 @@ def recv(self, maxsize=None): def recv_err(self, maxsize=None): return self._recv('stderr', maxsize) - def send_recv(self, input='', maxsize=None): - return self.send(input), self.recv(maxsize), self.recv_err(maxsize) + def send_recv(self, in_put='', maxsize=None): + return self.send(in_put), self.recv(maxsize), self.recv_err(maxsize) def get_conn_maxsize(self, which, maxsize): if maxsize is None: @@ -44,13 +44,13 @@ def _close(self, which): if subprocess.mswindows: - def send(self, input): + def send(self, in_put): if not self.stdin: return None try: x = msvcrt.get_osfhandle(self.stdin.fileno()) - (errCode, written) = WriteFile(x, input) + (errCode, written) = WriteFile(x, in_put) except ValueError: return self._close('stdin') except (subprocess.pywintypes.error, Exception) as why: @@ -85,7 +85,7 @@ def _recv(self, which, maxsize): else: - def send(self, input): + def send(self, in_put): if not self.stdin: return None @@ -93,7 +93,7 @@ def send(self, input): return 0 try: - written = os.write(self.stdin.fileno(), input) + written = os.write(self.stdin.fileno(), in_put) except OSError as why: if why.args[0] == errno.EPIPE: # broken pipe return self._close('stdin') diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index c3f86f7f..9c51771e 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -210,13 +210,13 @@ def setException(self, exception): self.debug('set exception, %r, %r' % ( exception, self.exceptionMessage)) - def schedule(self, delta, callable, *args, **kwargs): + def schedule(self, delta, callable_task, *args, **kwargs): if not self.runner: print("ERROR: scheduling on a task that's altready stopped") import traceback traceback.print_stack() return - self.runner.schedule(self, delta, callable, *args, **kwargs) + self.runner.schedule(self, delta, callable_task, *args, **kwargs) def addListener(self, listener): """ @@ -446,7 +446,7 @@ def run(self, task): raise NotImplementedError # methods for tasks to call - def schedule(self, delta, callable, *args, **kwargs): + def schedule(self, delta, callable_task, *args, **kwargs): """ Schedule a single future call. @@ -507,21 +507,21 @@ def _startWrap(self, task): self.debug('exception during start: %r', task.exceptionMessage) self.stopped(task) - def schedule(self, task, delta, callable, *args, **kwargs): + def schedule(self, task, delta, callable_task, *args, **kwargs): def c(): try: self.debug('schedule: calling %r(*args=%r, **kwargs=%r)', - callable, args, kwargs) - callable(*args, **kwargs) + callable_task, args, kwargs) + callable_task(*args, **kwargs) return False except Exception as e: self.debug('exception when calling scheduled callable %r', - callable) + callable_task) task.setException(e) self.stopped(task) raise self.debug('schedule: scheduling %r(*args=%r, **kwargs=%r)', - callable, args, kwargs) + callable_task, args, kwargs) GLib.timeout_add(int(delta * 1000L), c) diff --git a/whipper/image/cue.py b/whipper/image/cue.py index 4088c140..b7aa268b 100644 --- a/whipper/image/cue.py +++ b/whipper/image/cue.py @@ -192,14 +192,14 @@ class File: I represent a FILE line in a cue file. """ - def __init__(self, path, format): + def __init__(self, path, file_format): """ @type path: unicode """ assert isinstance(path, unicode), "%r is not unicode" % path self.path = path - self.format = format + self.format = file_format def __repr__(self): return '' % (self.path, self.format) diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index 6fe475a5..e5332909 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -590,8 +590,8 @@ def __init__(self, device=None): def commandMissing(self): raise common.MissingDependencyException('cd-paranoia') - def readbyteserr(self, bytes): - self._output.append(bytes) + def readbyteserr(self, bytes_stderr): + self._output.append(bytes_stderr) def done(self): if self.cwd: diff --git a/whipper/program/soxi.py b/whipper/program/soxi.py index 72f0caac..07b8f9a5 100644 --- a/whipper/program/soxi.py +++ b/whipper/program/soxi.py @@ -35,11 +35,11 @@ def __init__(self, path): def commandMissing(self): raise common.MissingDependencyException('soxi') - def readbytesout(self, bytes): - self._output.append(bytes) + def readbytesout(self, bytes_stdout): + self._output.append(bytes_stdout) - def readbyteserr(self, bytes): - self._error.append(bytes) + def readbyteserr(self, bytes_stderr): + self._error.append(bytes_stderr) def failed(self): self.setException(Exception("soxi failed: %s" % "".join(self._error))) diff --git a/whipper/test/test_program_cdparanoia.py b/whipper/test/test_program_cdparanoia.py index 4025469d..108b9e40 100644 --- a/whipper/test/test_program_cdparanoia.py +++ b/whipper/test/test_program_cdparanoia.py @@ -75,8 +75,8 @@ class AnalyzeFileTask(cdparanoia.AnalyzeTask): def __init__(self, path): self.command = ['cat', path] - def readbytesout(self, bytes): - self.readbyteserr(bytes) + def readbytesout(self, bytes_stdout): + self.readbyteserr(bytes_stdout) class CacheTestCase(common.TestCase): From af90c1c3381d9654779b80f25dd178f8785d5d02 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 08:42:24 +0000 Subject: [PATCH 07/79] Fix unresolved reference --- whipper/test/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/test/common.py b/whipper/test/common.py index 49cf1093..2df9f232 100644 --- a/whipper/test/common.py +++ b/whipper/test/common.py @@ -53,7 +53,7 @@ def failUnlessRaises(self, exception, f, *args, **kwargs): return inst except exception as e: raise Exception('%s raised instead of %s:\n %s' % - (sys.exec_info()[0], exception.__name__, str(e)) + (sys.exc_info()[0], exception.__name__, str(e)) ) else: raise Exception('%s not raised (%r returned)' % From 16b0d8dc295d8576f863c39cffc9009d20a63937 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 09:34:30 +0000 Subject: [PATCH 08/79] Make methods static --- whipper/command/offset.py | 3 ++- whipper/common/program.py | 15 +++++++++++---- whipper/extern/task/task.py | 9 ++++++--- whipper/image/table.py | 6 ++++-- whipper/result/result.py | 3 ++- whipper/test/common.py | 3 ++- whipper/test/test_image_cue.py | 3 ++- whipper/test/test_image_toc.py | 3 ++- 8 files changed, 31 insertions(+), 14 deletions(-) diff --git a/whipper/command/offset.py b/whipper/command/offset.py index 300d90f9..444c6848 100644 --- a/whipper/command/offset.py +++ b/whipper/command/offset.py @@ -200,7 +200,8 @@ def _arcs(self, runner, table, track, offset): os.unlink(path) return "%08x" % v1, "%08x" % v2 - def _foundOffset(self, device, offset): + @staticmethod + def _foundOffset(device, offset): print('\nRead offset of device is: %d.' % offset) info = drive.getDeviceInfo(device) diff --git a/whipper/common/program.py b/whipper/common/program.py index f1f932d4..1cee7287 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -81,7 +81,8 @@ def __init__(self, config, record=False): self._filter = path.PathFilter(**d) - def setWorkingDirectory(self, workingDirectory): + @staticmethod + def setWorkingDirectory(workingDirectory): if workingDirectory: logger.info('changing to working directory %s', workingDirectory) os.chdir(workingDirectory) @@ -140,7 +141,11 @@ def getRipResult(self, cddbdiscid): return self.result - def addDisambiguation(self, template_part, metadata): + def saveRipResult(self): + self._presult.persist() + + @staticmethod + def addDisambiguation(template_part, metadata): """Add disambiguation to template path part string.""" if metadata.catalogNumber: template_part += ' (%s)' % metadata.catalogNumber @@ -218,7 +223,8 @@ def getPath(self, outdir, template, mbdiscid, metadata, track_number=None): template = re.sub(r'%(\w)', r'%(\1)s', template) return os.path.join(outdir, template % v) - def getCDDB(self, cddbdiscid): + @staticmethod + def getCDDB(cddbdiscid): """ @param cddbdiscid: list of id, tracks, offsets, seconds @@ -440,7 +446,8 @@ def getHTOA(self): stop = track.getIndex(1).absolute - 1 return start, stop - def verifyTrack(self, runner, trackResult): + @staticmethod + def verifyTrack(runner, trackResult): is_wave = not trackResult.filename.endswith('.flac') t = checksum.CRC32Task(trackResult.filename, is_wave=is_wave) diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index 9c51771e..3761f16e 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -74,13 +74,16 @@ class LogStub(object): I am a stub for a log interface. """ - def log(self, message, *args): + @staticmethod + def log(message, *args): logger.info(message, *args) - def debug(self, message, *args): + @staticmethod + def debug(message, *args): logger.debug(message, *args) - def warning(self, message, *args): + @staticmethod + def warning(message, *args): logger.warning(message, *args) diff --git a/whipper/image/table.py b/whipper/image/table.py index 2cd6ba7c..0b32d4dc 100644 --- a/whipper/image/table.py +++ b/whipper/image/table.py @@ -249,7 +249,8 @@ def hasDataTracks(self): """ return len([t for t in self.tracks if not t.audio]) > 0 - def _cddbSum(self, i): + @staticmethod + def _cddbSum(i): ret = 0 while i > 0: ret += (i % 10) @@ -728,7 +729,8 @@ def merge(self, other, session=2): self.leadout += other.leadout + gap # FIXME logger.debug('fixing leadout, now %d', self.leadout) - def _getSessionGap(self, session): + @staticmethod + def _getSessionGap(session): # From cdrecord multi-session info: # For the first additional session this is 11250 sectors # lead-out/lead-in overhead + 150 sectors for the pre-gap of the first diff --git a/whipper/result/result.py b/whipper/result/result.py index fbde6b27..265514ce 100644 --- a/whipper/result/result.py +++ b/whipper/result/result.py @@ -140,7 +140,8 @@ def log(self, ripResult, epoch=time.time()): class EntryPoint(object): name = 'whipper' - def load(self): + @staticmethod + def load(): from whipper.result import logger return logger.WhipperLogger diff --git a/whipper/test/common.py b/whipper/test/common.py index 2df9f232..b42ffc71 100644 --- a/whipper/test/common.py +++ b/whipper/test/common.py @@ -62,7 +62,8 @@ def failUnlessRaises(self, exception, f, *args, **kwargs): assertRaises = failUnlessRaises - def readCue(self, name): + @staticmethod + def readCue(name): """ Read a .cue file, and replace the version comment with the current version so we can use it in comparisons. diff --git a/whipper/test/test_image_cue.py b/whipper/test/test_image_cue.py index 3bdbc66e..d73333fe 100644 --- a/whipper/test/test_image_cue.py +++ b/whipper/test/test_image_cue.py @@ -59,7 +59,8 @@ def testGetTrackLength(self): class WriteCueFileTestCase(unittest.TestCase): - def testWrite(self): + @staticmethod + def testWrite(): fd, path = tempfile.mkstemp(suffix=u'.whipper.test.cue') os.close(fd) diff --git a/whipper/test/test_image_toc.py b/whipper/test/test_image_toc.py index e7c55969..a51b256c 100644 --- a/whipper/test/test_image_toc.py +++ b/whipper/test/test_image_toc.py @@ -353,7 +353,8 @@ def testIndexes(self): 'strokes-someday.eac.cue')).read()).decode('utf-8') common.diffStrings(ref, cue) - def _filterCue(self, output): + @staticmethod + def _filterCue(output): # helper to be able to compare our generated .cue with the # EAC-extracted one discard = ['TITLE', 'PERFORMER', 'FLAGS', 'REM'] From e7bfc34c0eb770caf0ef8ff4efc557dd22039195 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 09:57:12 +0000 Subject: [PATCH 09/79] Rename 'throwaway' variables to single underscore Also removed unused ones --- whipper/command/main.py | 2 +- whipper/command/offset.py | 1 - whipper/common/accurip.py | 2 +- whipper/common/checksum.py | 2 +- whipper/common/config.py | 1 - whipper/common/drive.py | 2 +- whipper/common/program.py | 2 -- whipper/extern/freedb.py | 2 +- whipper/image/image.py | 2 +- whipper/image/toc.py | 8 ++++---- whipper/program/arc.py | 2 +- whipper/program/cdparanoia.py | 2 +- whipper/program/cdrdao.py | 2 +- whipper/program/sox.py | 2 +- 14 files changed, 14 insertions(+), 18 deletions(-) diff --git a/whipper/command/main.py b/whipper/command/main.py index 651f748e..81f171ab 100644 --- a/whipper/command/main.py +++ b/whipper/command/main.py @@ -52,7 +52,7 @@ def main(): return 1 except KeyboardInterrupt: return 2 - except ImportError as e: + except ImportError: raise except task.TaskException as e: if isinstance(e.exception, ImportError): diff --git a/whipper/command/offset.py b/whipper/command/offset.py index 444c6848..5745b8f2 100644 --- a/whipper/command/offset.py +++ b/whipper/command/offset.py @@ -88,7 +88,6 @@ def do(self): table = t.table logger.debug("CDDB disc id: %r", table.getCDDBDiscId()) - responses = None try: responses = accurip.get_db_entry(table.accuraterip_path()) except accurip.EntryNotFound: diff --git a/whipper/common/accurip.py b/whipper/common/accurip.py index 9085bd55..40199a6a 100644 --- a/whipper/common/accurip.py +++ b/whipper/common/accurip.py @@ -236,7 +236,7 @@ def print_report(result): """ Print AccurateRip verification results. """ - for i, track in enumerate(result.tracks): + for _, track in enumerate(result.tracks): status = 'rip NOT accurate' conf = '(not found)' db = 'notfound' diff --git a/whipper/common/checksum.py b/whipper/common/checksum.py index 68ac12b0..0891c294 100644 --- a/whipper/common/checksum.py +++ b/whipper/common/checksum.py @@ -47,7 +47,7 @@ def start(self, runner): def _crc32(self): if not self.is_wave: - fd, tmpf = tempfile.mkstemp() + _, tmpf = tempfile.mkstemp() try: subprocess.check_call(['flac', '-d', self.path, '-fo', tmpf]) diff --git a/whipper/common/config.py b/whipper/common/config.py index 8d109354..9ca386ad 100644 --- a/whipper/common/config.py +++ b/whipper/common/config.py @@ -156,7 +156,6 @@ def _findOrCreateDriveSection(self, vendor, model, release): section = 'drive:' + urllib.quote('%s:%s:%s' % ( vendor, model, release)) self._parser.add_section(section) - __pychecker__ = 'no-local' for key in ['vendor', 'model', 'release']: self._parser.set(section, key, locals()[key].strip()) diff --git a/whipper/common/drive.py b/whipper/common/drive.py index 226e04dd..21d02ff4 100644 --- a/whipper/common/drive.py +++ b/whipper/common/drive.py @@ -66,6 +66,6 @@ def getDeviceInfo(path): except ImportError: return None device = cdio.Device(path) - ok, vendor, model, release = device.get_hwinfo() + _, vendor, model, release = device.get_hwinfo() return vendor, model, release diff --git a/whipper/common/program.py b/whipper/common/program.py index 1cee7287..79ad105d 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -259,10 +259,8 @@ def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, ittoc.getAudioTracks())) logger.debug('MusicBrainz submit url: %r', ittoc.getMusicBrainzSubmitURL()) - ret = None metadatas = None - e = None for _ in range(0, 4): try: diff --git a/whipper/extern/freedb.py b/whipper/extern/freedb.py index d08fcb7a..1e719013 100644 --- a/whipper/extern/freedb.py +++ b/whipper/extern/freedb.py @@ -134,7 +134,7 @@ def perform_lookup(disc_id, freedb_server, freedb_port): if len(matches) > 0: # for each result, query FreeDB for XMCD file data - for (category, disc_id, title) in matches: + for (category, disc_id, _) in matches: sleep(1) # add a slight delay to keep the server happy query = freedb_command(freedb_server, diff --git a/whipper/image/image.py b/whipper/image/image.py index 0d058934..a499285b 100644 --- a/whipper/image/image.py +++ b/whipper/image/image.py @@ -192,7 +192,7 @@ def add(index): path = image.getRealPath(index.path) assert isinstance(path, unicode), "%r is not unicode" % path logger.debug('schedule encode of %r', path) - root, ext = os.path.splitext(os.path.basename(path)) + root, _ = os.path.splitext(os.path.basename(path)) outpath = os.path.join(outdir, root + '.' + 'flac') logger.debug('schedule encode to %r', outpath) taskk = encode.FlacEncodeTask( diff --git a/whipper/image/toc.py b/whipper/image/toc.py index be5e521a..3d03d137 100644 --- a/whipper/image/toc.py +++ b/whipper/image/toc.py @@ -117,7 +117,7 @@ def get(self, offset): """ Retrieve the source used at the given offset. """ - for i, (c, o, s) in enumerate(self._sources): + for i, (_, o, _) in enumerate(self._sources): if offset < o: return self._sources[i - 1] @@ -127,7 +127,7 @@ def getCounterStart(self, counter): """ Retrieve the absolute offset of the first source for this counter """ - for i, (c, o, s) in enumerate(self._sources): + for i, (c, _, _) in enumerate(self._sources): if c == counter: return self._sources[i][1] @@ -151,7 +151,7 @@ def __init__(self, path): def _index(self, currentTrack, i, absoluteOffset, trackOffset): absolute = absoluteOffset + trackOffset # this may be in a new source, so calculate relative - c, o, s = self._sources.get(absolute) + c, _, s = self._sources.get(absolute) logger.debug('at abs offset %d, we are in source %r', absolute, s) counterStart = self._sources.getCounterStart(c) @@ -341,7 +341,7 @@ def parse(self): continue length = common.msfToFrames(m.group('length')) - c, o, s = self._sources.get(absoluteOffset) + c, _, s = self._sources.get(absoluteOffset) logger.debug('at abs offset %d, we are in source %r', absoluteOffset, s) counterStart = self._sources.getCounterStart(c) diff --git a/whipper/program/arc.py b/whipper/program/arc.py index e112d315..46b8fdf2 100644 --- a/whipper/program/arc.py +++ b/whipper/program/arc.py @@ -31,7 +31,7 @@ def accuraterip_checksum(f, track_number, total_tracks, wave=False, v2=False): if not wave: flac.stdout.close() - out, err = arc.communicate() + out, _ = arc.communicate() if not wave: flac.wait() diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index e5332909..254e0990 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -263,7 +263,7 @@ def start(self, runner): stopTrack = 0 stopOffset = self._stop - for i, t in enumerate(self._table.tracks): + for i, _ in enumerate(self._table.tracks): if self._table.getTrackStart(i + 1) <= self._start: startTrack = i + 1 startOffset = self._start - self._table.getTrackStart(i + 1) diff --git a/whipper/program/cdrdao.py b/whipper/program/cdrdao.py index 36a0f899..d76882ab 100644 --- a/whipper/program/cdrdao.py +++ b/whipper/program/cdrdao.py @@ -179,7 +179,7 @@ def version(): Return cdrdao version as a string. """ cdrdao = Popen(CDRDAO, stderr=PIPE) - out, err = cdrdao.communicate() + _, err = cdrdao.communicate() if cdrdao.returncode != 1: logger.warning("cdrdao version detection failed: " "return code is %s", cdrdao.returncode) diff --git a/whipper/program/sox.py b/whipper/program/sox.py index 1ec54d3e..51955d99 100644 --- a/whipper/program/sox.py +++ b/whipper/program/sox.py @@ -18,7 +18,7 @@ def peak_level(track_path): logger.warning("SoX peak detection failed: file not found") return None sox = Popen([SOX, track_path, "-n", "stats", "-b", "16"], stderr=PIPE) - out, err = sox.communicate() + _, err = sox.communicate() if sox.returncode: logger.warning("SoX peak detection failed: %s", sox.returncode) return None From 6bb585e1a547d0b41e0e596c3eda2ee88a089677 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 10:42:48 +0000 Subject: [PATCH 10/79] Replace if ... else ... with simpler statement --- whipper/program/cdparanoia.py | 5 +---- whipper/program/cdrdao.py | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index 254e0990..465ffd15 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -598,10 +598,7 @@ def done(self): shutil.rmtree(self.cwd) output = "".join(self._output) m = _OK_RE.search(output) - if m: - self.defeatsCache = True - else: - self.defeatsCache = False + self.defeatsCache = bool(m) def failed(self): # cdparanoia exits with return code 1 if it can't determine diff --git a/whipper/program/cdrdao.py b/whipper/program/cdrdao.py index d76882ab..8bfad7f6 100644 --- a/whipper/program/cdrdao.py +++ b/whipper/program/cdrdao.py @@ -168,10 +168,7 @@ def DetectCdr(device): cmd = [CDRDAO, 'disk-info', '-v1', '--device', device] logger.debug("executing %r", cmd) p = Popen(cmd, stdout=PIPE, stderr=PIPE) - if 'CD-R medium : n/a' in p.stdout.read(): - return False - else: - return True + return 'CD-R medium : n/a' not in p.stdout.read() def version(): From ad66af900f2ed5466e1802612d8353e02ee61a12 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 11:21:33 +0000 Subject: [PATCH 11/79] Remove erroneous extra format argument --- whipper/command/offset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/command/offset.py b/whipper/command/offset.py index 5745b8f2..8dace363 100644 --- a/whipper/command/offset.py +++ b/whipper/command/offset.py @@ -132,7 +132,7 @@ def match(archecksums, track, responses): logger.warning('cannot rip with offset %d...', offset) continue - logger.debug('AR checksums calculated: %s %s', archecksums) + logger.debug('AR checksums calculated: %s', archecksums) c, i = match(archecksums, 1, responses) if c: From fe3624173038290ba6c5c682cc8f0923b35bd04d Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 11:24:08 +0000 Subject: [PATCH 12/79] Don't assign the result of a function that returns no value --- whipper/common/encode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/common/encode.py b/whipper/common/encode.py index 23af8081..237daa99 100644 --- a/whipper/common/encode.py +++ b/whipper/common/encode.py @@ -60,7 +60,7 @@ def start(self, runner): self.schedule(0.0, self._flac_encode) def _flac_encode(self): - self.new_path = flac.encode(self.track_path, self.track_out_path) + flac.encode(self.track_path, self.track_out_path) self.stop() From cf923cc9ccbcdabac783a1222357ff56f8dcf1d9 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 11:25:16 +0000 Subject: [PATCH 13/79] Review existing comments and add new ones Also clarified a statement --- whipper/command/cd.py | 5 ++++- whipper/command/main.py | 1 + whipper/common/cache.py | 4 ++-- whipper/common/program.py | 1 + whipper/common/task.py | 1 + whipper/extern/freedb.py | 1 + whipper/extern/task/task.py | 3 +++ whipper/image/image.py | 2 ++ whipper/program/cdparanoia.py | 2 ++ whipper/result/logger.py | 2 -- whipper/test/common.py | 1 + 11 files changed, 18 insertions(+), 5 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index aed96d8a..38aad2e4 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -66,6 +66,7 @@ class _CD(BaseCommand): eject = True + # XXX: Pylint, parameters differ from overridden 'add_arguments' method @staticmethod def add_arguments(parser): parser.add_argument('-R', '--release-id', @@ -205,6 +206,7 @@ class Info(_CD): # Requires opts.device + # XXX: Pylint, parameters differ from overridden 'add_arguments' method def add_arguments(self): _CD.add_arguments(self.parser) @@ -228,6 +230,7 @@ class Rip(_CD): # Requires opts.record # Requires opts.device + # XXX: Pylint, parameters differ from overridden 'add_arguments' method def add_arguments(self): loggers = list(result.getLoggers()) default_offset = None @@ -246,7 +249,6 @@ def add_arguments(self): default='whipper', help=("logger to use (choose from: '%s" % "', '".join(loggers) + "')")) - # FIXME: get from config self.parser.add_argument('-o', '--offset', action="store", dest="offset", default=default_offset, @@ -415,6 +417,7 @@ def _ripIfNotRipped(number): len(self.itable.tracks), extra)) break + # FIXME: catching too general exception (Exception) except Exception as e: logger.debug('got exception %r on try %d', e, tries) diff --git a/whipper/command/main.py b/whipper/command/main.py index 81f171ab..e6ced3c1 100644 --- a/whipper/command/main.py +++ b/whipper/command/main.py @@ -45,6 +45,7 @@ def main(): logger.critical("SystemError: %s", e) if (isinstance(e, common.EjectError) and cmd.options.eject in ('failure', 'always')): + # XXX: Pylint, instance of 'SystemError' has no 'device' member eject_device(e.device) return 255 except RuntimeError as e: diff --git a/whipper/common/cache.py b/whipper/common/cache.py index 18fe6b3f..cf311a69 100644 --- a/whipper/common/cache.py +++ b/whipper/common/cache.py @@ -104,8 +104,8 @@ def _unpickle(self, default=None): try: self.object = pickle.load(handle) logger.debug('loaded persisted object from %r', self._path) + # FIXME: catching too general exception (Exception) except Exception as e: - # TODO: restrict kind of caught exceptions? # can fail for various reasons; in that case, pretend we didn't # load it logger.debug(e) @@ -127,7 +127,7 @@ def __init__(self, path): try: os.makedirs(self.path) except OSError as e: - if e.errno != 17: # FIXME + if e.errno != os.errno.EEXIST: # FIXME: errno 17 is 'File Exists' raise def _getPath(self, key): diff --git a/whipper/common/program.py b/whipper/common/program.py index 79ad105d..6906ef13 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -297,6 +297,7 @@ def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, print('Type : %s' % metadata.releaseType) if metadata.barcode: print("Barcode : %s" % metadata.barcode) + # TODO: Add test for non ASCII catalog numbers: see issue #215 if metadata.catalogNumber: print("Cat no : %s" % metadata.catalogNumber.encode('utf-8')) diff --git a/whipper/common/task.py b/whipper/common/task.py index d58fcea3..1c3501fe 100644 --- a/whipper/common/task.py +++ b/whipper/common/task.py @@ -87,6 +87,7 @@ def _read(self, runner): return self._done() + # FIXME: catching too general exception (Exception) except Exception as e: logger.debug('exception during _read(): %s', e) self.setException(e) diff --git a/whipper/extern/freedb.py b/whipper/extern/freedb.py index 1e719013..6359a912 100644 --- a/whipper/extern/freedb.py +++ b/whipper/extern/freedb.py @@ -134,6 +134,7 @@ def perform_lookup(disc_id, freedb_server, freedb_port): if len(matches) > 0: # for each result, query FreeDB for XMCD file data + # XXX: Pylint, redefining argument with the local name 'disc_id' for (category, disc_id, _) in matches: sleep(1) # add a slight delay to keep the server happy diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index 3761f16e..77c0bccb 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -238,6 +238,7 @@ def _notifyListeners(self, methodName, *args, **kwargs): method = getattr(l, methodName) try: method(self, *args, **kwargs) + # FIXME: catching too general exception (Exception) except Exception as e: self.setException(e) @@ -350,6 +351,7 @@ def next(self): task.start(self.runner) self.debug('BaseMultiTask.next(): started task %d of %d: %r', self._task, len(self.tasks), task) + # FIXME: catching too general exception (Exception) except Exception as e: self.setException(e) self.debug('Got exception during next: %r', self.exceptionMessage) @@ -503,6 +505,7 @@ def _startWrap(self, task): try: self.debug('start task %r' % task) task.start(self) + # FIXME: catching too general exception (Exception) except Exception as e: # getExceptionMessage uses global exception state that doesn't # hang around, so store the message diff --git a/whipper/image/image.py b/whipper/image/image.py index a499285b..e57ad3cd 100644 --- a/whipper/image/image.py +++ b/whipper/image/image.py @@ -121,6 +121,7 @@ def __init__(self, image): task.MultiSeparateTask.__init__(self) self._image = image + # XXX: Pylint, redefining name 'cue' from outer scope (import) cue = image.cue self._tasks = [] self.lengths = {} @@ -183,6 +184,7 @@ def __init__(self, image, outdir): task.MultiSeparateTask.__init__(self) self._image = image + # XXX: Pylint, redefining name 'cue' from outer scope (import) cue = image.cue self._tasks = [] self.lengths = {} diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index 465ffd15..29d21760 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -538,6 +538,7 @@ def stop(self): try: logger.debug('moving to final path %r', self.path) os.rename(self._tmppath, self.path) + # FIXME: catching too general exception (Exception) except Exception as e: logger.debug('exception while moving to final ' 'path %r: %s', self.path, e) @@ -546,6 +547,7 @@ def stop(self): os.unlink(self._tmppath) else: logger.debug('stop: exception %r', self.exception) + # FIXME: catching too general exception (Exception) except Exception as e: print('WARNING: unhandled exception %r' % (e, )) diff --git a/whipper/result/logger.py b/whipper/result/logger.py index eda4af05..6da9f524 100644 --- a/whipper/result/logger.py +++ b/whipper/result/logger.py @@ -98,8 +98,6 @@ def logRip(self, ripResult, epoch): # For every track include information in the TOC for t in table.tracks: - # FIXME: what happens to a track start over 60 minutes ? - # Answer: tested empirically, everything seems OK start = t.getIndex(1).absolute length = table.getTrackLength(t.number) end = table.getTrackEnd(t.number) diff --git a/whipper/test/common.py b/whipper/test/common.py index b42ffc71..a35b96e5 100644 --- a/whipper/test/common.py +++ b/whipper/test/common.py @@ -46,6 +46,7 @@ class TestCase(unittest.TestCase): # and we'd like to check for the actual exception under TaskException, # so override the way twisted.trial.unittest does, without failure + # XXX: Pylint, method could be a function (no-self-use) def failUnlessRaises(self, exception, f, *args, **kwargs): try: result = f(*args, **kwargs) From f79fb32340de450a519e848ec50d35b6c5028687 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 14:13:04 +0000 Subject: [PATCH 14/79] Remove broken assertion --- whipper/command/cd.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 38aad2e4..f3ce6613 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -157,10 +157,6 @@ def do(self): "full table's mb id %s differs from toc id mb %s" % ( self.itable.getMusicBrainzDiscId(), self.ittoc.getMusicBrainzDiscId()) - assert self.itable.accuraterip_path() == \ - self.ittoc.accuraterip_path(), \ - "full table's AR URL %s differs from toc AR URL %s" % ( - self.itable.accuraterip_url(), self.ittoc.accuraterip_url()) if self.program.metadata: self.program.metadata.discid = self.ittoc.getMusicBrainzDiscId() From 9dc5702e193948f1772174089572121675c6005f Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 17 Jan 2019 14:17:38 +0000 Subject: [PATCH 15/79] Fix string concatenation bug --- whipper/extern/task/task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index 77c0bccb..b7e8d6ff 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -191,8 +191,8 @@ def setExceptionAndTraceback(self, exception): # for now if str(exception): msg = ": %s" % str(exception) - line = "exception %(exc)s at %(filename)s:%(line)s: " - "%(func)s()%(msg)s" % locals() + line = ("exception %(exc)s at %(filename)s:%(line)s: " + "%(func)s()%(msg)s" % locals()) self.exception = exception self.exceptionMessage = line From fabd50dfb721ae1848f82accff896f953c083c3c Mon Sep 17 00:00:00 2001 From: leo-bogert Date: Mon, 11 Feb 2019 18:26:10 +0100 Subject: [PATCH 16/79] Update accuraterip-checksum to v1.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/leo-bogert/accuraterip-checksum/releases/tag/version1.5 Signed-off-by: Frederik “Freso” S. Olesen --- src/README.md | 59 ++++++++++++++++++++++++-------------- src/accuraterip-checksum.c | 14 ++++----- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/README.md b/src/README.md index c2617719..9b004613 100644 --- a/src/README.md +++ b/src/README.md @@ -1,43 +1,60 @@ -accuraterip-checksum -==================== +# accuraterip-checksum -# Description: -A C99 commandline program to compute the AccurateRip checksum of singletrack WAV files. -Implemented according to +## Description +A C99 command line program to compute the [AccurateRip](http://accuraterip.com/) checksum of single track WAV files, i.e. WAV files which contain only a single track of an audio CD. +Such files can for example be generated by [Exact Audio Copy](http://exactaudiocopy.de/) and various other CD ripping programs, as listed e.g. [here](http://accuraterip.com/software.htm) and [here](https://wiki.hydrogenaud.io/index.php?title=AccurateRip). - http://www.hydrogenaudio.org/forums/index.php?showtopic=97603 +Implemented according to [this thread on HydrogenAudio](http://www.hydrogenaudio.org/forums/index.php?showtopic=97603). -# Syntax: - accuraterip-checksum [--version / --accuraterip-v1 / --accuraterip-v2 (default)] filename track_number total_tracks +## Usage +Calculate AccurateRip v2 checksum of track number ```TRACK``` which is contained in WAV file ```TRACK_FILE```, and which was ripped from a disc with a total track count of ```TOTAL_TRACKS```: -# Output: -By default, the V2 (AccurateRip version 2) checksum will be printed. -You can also obtain the V1 checksum with the "--accuraterip-v1" parameter. + accuraterip-checksum TRACK_FILE TRACK TOTAL_TRACKS -You can obtain the version of accuraterip-checksum using the "--version" parameter. This is not to be confused with the AccurateRip version! +Explicitly choose AccurateRip checksum version, where ```VERSION``` is 1 or 2: -The version of accuraterip-checksum should be added to audio files which are tagged using the output of accuraterip-checksum. If any severe bugs are ever found in accuraterip-checksum, this will allow you to identify files which were tagged using affected version. + accuraterip-checksum --accuraterip-vVERSION TRACK_FILE TRACK TOTAL_TRACKS +Show accuraterip-checksum program version (this is **not** the AccurateRip checksum version!): -# Compiling: + accuraterip-checksum --version + +The version of accuraterip-checksum should be added to the tags of audio files which were processed using the output of accuraterip-checksum: +If any severe bugs are ever found in accuraterip-checksum this will allow you to identify files which were tagged using affected version. + +## Dependencies libsndfile is used for reading the WAV files. -Therefore, on Ubuntu 12.04, make sure you have the following packages installed: +Therefore, on Ubuntu, make sure you have the following packages installed: + + libsndfile1 + +For compiling you need: - libsndfile1 (should be installed by default) libsndfile1-dev +## Compiling + +### Using GNU Make +```shell +make clean +make +``` + +### Using Eclipse The configuration files of an Eclipse project are included. You can use "EGit" (Eclipse git) to import the whole repository. It should as well ask you to import the project configuration then. -# Author: +The Eclipse configuration is currently unmaintained, using GNU Make is preferred. + +## Author Leo Bogert (http://leo.bogert.de) -# Version: -1.4 +## Version +1.5 -# Donations: +## Donations bitcoin:14kPd2QWsri3y2irVFX6wC33vv7FqTaEBh -# License: +## License GPLv3 diff --git a/src/accuraterip-checksum.c b/src/accuraterip-checksum.c index 5d7b4765..68c9dd59 100644 --- a/src/accuraterip-checksum.c +++ b/src/accuraterip-checksum.c @@ -2,9 +2,9 @@ ============================================================================ Name : accuraterip-checksum.c Author : Leo Bogert (http://leo.bogert.de) - Git : http://leo.bogert.de/accuraterip-checksum + Git : https://github.com/leo-bogert/accuraterip-checksum Version : See global variable "version" - Copyright : GPL + Copyright : GPLv3 Description : A C99 commandline program to compute the AccurateRip checksum of singletrack WAV files. Implemented according to http://www.hydrogenaudio.org/forums/index.php?showtopic=97603 ============================================================================ @@ -18,7 +18,7 @@ #include #include -const char *const version = "1.4"; +const char *const version = "1.5"; bool check_fileformat(const SF_INFO* sfinfo) { #ifdef DEBUG @@ -91,7 +91,7 @@ uint32_t compute_v1_checksum(const uint32_t* audio_data, const size_t audio_data uint32_t compute_v2_checksum(const uint32_t* audio_data, const size_t audio_data_size, const int track_number, const int total_tracks) { #define DWORD uint32_t -#define __int64 uint64_t +#define QWORD uint64_t const DWORD *pAudioData = audio_data; // this should point entire track audio data int DataSize = audio_data_size; // size of the data @@ -117,9 +117,9 @@ uint32_t compute_v2_checksum(const uint32_t* audio_data, const size_t audio_data { DWORD Value = pAudioData[i]; - uint64_t CalcCRCNEW = (uint64_t)Value * (uint64_t)MulBy; - DWORD LOCalcCRCNEW = (DWORD)(CalcCRCNEW & (uint64_t)0xFFFFFFFF); - DWORD HICalcCRCNEW = (DWORD)(CalcCRCNEW / (uint64_t)0x100000000); + QWORD CalcCRCNEW = (QWORD)Value * (QWORD)MulBy; + DWORD LOCalcCRCNEW = (DWORD)(CalcCRCNEW & (QWORD)0xFFFFFFFF); + DWORD HICalcCRCNEW = (DWORD)(CalcCRCNEW / (QWORD)0x100000000); AC_CRCNEW+=HICalcCRCNEW; AC_CRCNEW+=LOCalcCRCNEW; } From e91fe2720b3bebd31df829dbd2a3f0fe4562fec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 14:35:34 +0100 Subject: [PATCH 17/79] command.mblookup: Fix misaligned output. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only three spaces before "Barcode" instead of four. Signed-off-by: Frederik “Freso” S. Olesen --- whipper/command/mblookup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/command/mblookup.py b/whipper/command/mblookup.py index e8e7c601..c72e9385 100644 --- a/whipper/command/mblookup.py +++ b/whipper/command/mblookup.py @@ -35,7 +35,7 @@ def do(self): if md.catalogNumber: print(' Cat no: %s' % md.catalogNumber) if md.barcode: - print(' Barcode: %s' % md.barcode) + print(' Barcode: %s' % md.barcode) for j, track in enumerate(md.tracks): print(' Track %2d: %s - %s' % ( From 75c5646d1ef100c2f24ec3e08b11606f7ffb6a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 14:46:16 +0100 Subject: [PATCH 18/79] =?UTF-8?q?Fix=20MusicBrainz=20nomenclature:=20album?= =?UTF-8?q?=20=E2=86=92=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In general, "albums" in everyday usage is what on MusicBrainz would be considered a release group[1] while as far as I can tell, every single instance of it being used in whipper is referring to a single "edition" of an album, which is what would be called a "release" in MusicBrainz terminology[2]. [1] https://musicbrainz.org/doc/Release_Group [2] https://musicbrainz.org/doc/Release Signed-off-by: Frederik “Freso” S. Olesen --- TODO | 4 ++-- whipper/command/cd.py | 4 ++-- whipper/common/mbngs.py | 6 +++--- whipper/common/program.py | 18 +++++++++--------- whipper/result/logger.py | 3 ++- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/TODO b/TODO index 3e2b835d..d472f59e 100644 --- a/TODO +++ b/TODO @@ -56,7 +56,7 @@ HARD - write xbmc/plex plugin -SPECIFIC ALBUMS ISSUES +SPECIFIC RELEASES ISSUES - on ana, Goldfrapp tells me I have offset 0! @@ -67,7 +67,7 @@ SPECIFIC ALBUMS ISSUES NO DECISION YET -- possibly figure out how to name albums with credited artist; look at gorky and spiritualized electric mainline +- possibly figure out how to name releases with credited artist; look at gorky and spiritualized electric mainline - check if cdda2wav or icedax analyze pregaps correctly diff --git a/whipper/command/cd.py b/whipper/command/cd.py index f3ce6613..917e9b15 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -51,8 +51,8 @@ Disc files (.cue, .log, .m3u) are named according to the disc template, filling in the variables and adding the file extension. Variables for both disc and track template are: - - %A: album artist - - %S: album sort name + - %A: release artist + - %S: release sort name - %d: disc title - %y: release year - %r: release type, lowercase diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index c16d529e..3400e93a 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -57,7 +57,7 @@ class TrackMetadata(object): class DiscMetadata(object): """ @param artist: artist(s) name - @param sortName: album artist sort name + @param sortName: release artist sort name @param release: earliest release date, in YYYY-MM-DD @type release: unicode @param title: title of the disc (with disambiguation) @@ -176,10 +176,10 @@ def _getMetadata(releaseShort, release, discid, country=None): if len(discCredit) > 1: logger.debug('artist-credit more than 1: %r', discCredit) - albumArtistName = discCredit.getName() + releaseArtistName = discCredit.getName() # getUniqueName gets disambiguating names like Muse (UK rock band) - discMD.artist = albumArtistName + discMD.artist = releaseArtistName discMD.sortName = discCredit.getSortName() if 'date' not in release: logger.warning("release with ID '%s' (%s - %s) does not have a date", diff --git a/whipper/common/program.py b/whipper/common/program.py index 6906ef13..d07df5cc 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -169,8 +169,8 @@ def getPath(self, outdir, template, mbdiscid, metadata, track_number=None): Disc files (.cue, .log, .m3u) are named according to the disc template, filling in the variables and adding the file extension. Variables for both disc and track template are: - - %A: album artist - - %S: album artist sort name + - %A: release artist + - %S: release artist sort name - %d: disc title - %y: release year - %r: release type, lowercase @@ -377,16 +377,16 @@ def getTagList(self, number, mbdiscid): @rtype: dict """ trackArtist = u'Unknown Artist' - albumArtist = u'Unknown Artist' + releaseArtist = u'Unknown Artist' disc = u'Unknown Disc' title = u'Unknown Track' if self.metadata: trackArtist = self.metadata.artist - albumArtist = self.metadata.artist + releaseArtist = self.metadata.artist disc = self.metadata.title - mbidAlbum = self.metadata.mbid - mbidTrackAlbum = self.metadata.mbidArtist + mbidRelease = self.metadata.mbid + mbidReleaseArtist = self.metadata.mbidArtist if number > 0: try: @@ -408,7 +408,7 @@ def getTagList(self, number, mbdiscid): tags['MUSICBRAINZ_DISCID'] = mbdiscid if self.metadata and not self.metadata.various: - tags['ALBUMARTIST'] = albumArtist + tags['ALBUMARTIST'] = releaseArtist tags['ARTIST'] = trackArtist tags['TITLE'] = title tags['ALBUM'] = disc @@ -422,8 +422,8 @@ def getTagList(self, number, mbdiscid): if number > 0: tags['MUSICBRAINZ_TRACKID'] = mbidTrack tags['MUSICBRAINZ_ARTISTID'] = mbidTrackArtist - tags['MUSICBRAINZ_ALBUMID'] = mbidAlbum - tags['MUSICBRAINZ_ALBUMARTISTID'] = mbidTrackAlbum + tags['MUSICBRAINZ_ALBUMID'] = mbidRelease + tags['MUSICBRAINZ_ALBUMARTISTID'] = mbidReleaseArtist # TODO/FIXME: ISRC tag diff --git a/whipper/result/logger.py b/whipper/result/logger.py index 6da9f524..5858b59a 100644 --- a/whipper/result/logger.py +++ b/whipper/result/logger.py @@ -65,7 +65,8 @@ def logRip(self, ripResult, epoch): # CD metadata lines.append("CD metadata:") - lines.append(" Album: %s - %s" % (ripResult.artist, ripResult.title)) + lines.append(" Release: %s - %s" % + (ripResult.artist, ripResult.title)) lines.append(" CDDB Disc ID: %s" % ripResult. table.getCDDBDiscId()) lines.append(" MusicBrainz Disc ID: %s" % ripResult. table.getMusicBrainzDiscId()) From 2c464bc7322f4a8f42fec62ff4486963f19bcc49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 15:03:31 +0100 Subject: [PATCH 19/79] Fix MusicBrainz nomenclature: track vs. recording MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For historical reasons there is some confusion between Tracks[1] and Recordings[2] in MusicBrainz. Essentially what should be saved to `MUSICBRAINZ_TRACKID` is the Recording MBID—which is what whipper is correctly doing, but the value storing this value was called `mbidTrack` rather than `mbidRecording`, which could potentially cause confusion. [1] https://musicbrainz.org/doc/Track [2] https://musicbrainz.org/doc/Recording Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/program.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/whipper/common/program.py b/whipper/common/program.py index d07df5cc..1cb67b13 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -393,7 +393,7 @@ def getTagList(self, number, mbdiscid): track = self.metadata.tracks[number - 1] trackArtist = track.artist title = track.title - mbidTrack = track.mbid + mbidRecording = track.mbid mbidTrackArtist = track.mbidArtist except IndexError as e: logger.error('no track %d found, %r', number, e) @@ -420,7 +420,7 @@ def getTagList(self, number, mbdiscid): tags['DATE'] = self.metadata.release if number > 0: - tags['MUSICBRAINZ_TRACKID'] = mbidTrack + tags['MUSICBRAINZ_TRACKID'] = mbidRecording tags['MUSICBRAINZ_ARTISTID'] = mbidTrackArtist tags['MUSICBRAINZ_ALBUMID'] = mbidRelease tags['MUSICBRAINZ_ALBUMARTISTID'] = mbidReleaseArtist From a08bbeea6a84f3ca685c194dc91fa4b4b673e284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 16:47:01 +0100 Subject: [PATCH 20/79] Refresh MusicBrainz JSON dumps used for testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some of these dumps predate when MusicBrainz had (re)introduced track MBIDs, so some tests for the code for issue #200 would fail since the JSON dumps didn't contain those IDs. Signed-off-by: Frederik “Freso” S. Olesen --- .../whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json | 2 +- .../whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json | 2 +- .../whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json | 2 +- .../whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json | 1 + .../whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json | 2 +- .../whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json | 2 +- .../whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json diff --git a/whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json b/whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json index b8a0da36..700a9592 100644 --- a/whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json +++ b/whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "text-representation": {"language": "eng", "script": "Latn"}, "title": "Everybody Here Wants You", "artist-credit-phrase": "Jeff Buckley", "quality": "normal", "id": "3451f29c-9bb8-4cc5-bfcc-bd50104b94f8", "medium-list": [{"disc-list": [{"id": "C6N7.QADBQ968Qr8OOjxfQlGtA8-", "sectors": "122983"}, {"id": "wbjbST2jUHRZaB1inCyxxsL7Eqc-", "sectors": "122833"}], "position": "1", "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "286920", "artist-credit-phrase": "Jeff Buckley", "id": "8f8c284b-6818-4a66-a517-37dc8c04a881", "title": "Everybody Here Wants You"}, "position": "1"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "204746", "artist-credit-phrase": "Jeff Buckley", "id": "7d939d14-06a2-478e-b279-ebe20fae8b2f", "title": "Thousand Fold"}, "position": "2"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "288466", "artist-credit-phrase": "Jeff Buckley", "id": "54323c4c-e0f6-4a81-8b80-e1c0b822a3f7", "title": "Eternal Life (road version)"}, "position": "3"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "574026", "artist-credit-phrase": "Jeff Buckley", "id": "4dda67d1-8123-4545-9a78-7b4232089e96", "title": "Hallelujah (live)"}, "position": "4"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "284000", "artist-credit-phrase": "Jeff Buckley", "id": "5db42013-aa5c-4eb4-a549-46ca721990cf", "title": "Last Goodbye (live from Sydney)"}, "position": "5"}], "format": "CD"}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "barcode": "9399700053173", "asin": "B00000891P", "label-info-count": 1, "label-info-list": [{"catalog-number": "665848.2", "label": {"label-code": "162", "sort-name": "Columbia", "disambiguation": "imprint owned by CBS between 1938\u20131990 within US/CA/MX; owned worldwide by Sony Music Entertainment since 1991 except in JP", "id": "011d1192-6f65-45bd-85c4-0400dd45693e", "name": "Columbia"}}], "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "release-event-list": [{"date": "1998", "area": {"sort-name": "Australia", "iso-3166-1-code-list": ["AU"], "id": "106e0bec-b638-3b37-b731-f53d507dc00e", "name": "Australia"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "1998", "quality": "normal", "id": "3451f29c-9bb8-4cc5-bfcc-bd50104b94f8", "release-event-count": 1, "title": "Everybody Here Wants You", "country": "AU", "medium-count": 1, "artist-credit-phrase": "Jeff Buckley", "medium-list": [{"position": "1", "track-count": 5, "format": "CD", "disc-list": [{"offset-list": [150, 21640, 36996, 58631, 101683], "id": "C6N7.QADBQ968Qr8OOjxfQlGtA8-", "sectors": "122983", "offset-count": 5}, {"offset-list": [150, 21640, 36996, 58631, 101683], "id": "wbjbST2jUHRZaB1inCyxxsL7Eqc-", "sectors": "122833", "offset-count": 5}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "1", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "285480", "artist-credit-phrase": "Jeff Buckley", "id": "8f8c284b-6818-4a66-a517-37dc8c04a881", "title": "Everybody Here Wants You"}, "length": "286533", "position": "1", "id": "0e611773-a7f2-3dfb-82f9-7f7915d3406e", "track_or_recording_length": "286533"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "2", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "204746", "artist-credit-phrase": "Jeff Buckley", "id": "7d939d14-06a2-478e-b279-ebe20fae8b2f", "title": "Thousand Fold"}, "length": "204746", "position": "2", "id": "1f2c5c05-c364-33f9-8845-5c14b1893bba", "track_or_recording_length": "204746"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "3", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "288466", "artist-credit-phrase": "Jeff Buckley", "id": "54323c4c-e0f6-4a81-8b80-e1c0b822a3f7", "title": "Eternal Life (road version)"}, "length": "288466", "position": "3", "id": "5158457a-091e-3923-b1c3-8b37038234ad", "track_or_recording_length": "288466"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "4", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "574026", "artist-credit-phrase": "Jeff Buckley", "id": "4dda67d1-8123-4545-9a78-7b4232089e96", "title": "Hallelujah (live)"}, "length": "574026", "position": "4", "id": "200de0b9-9221-351f-8109-8e53fc289fd5", "track_or_recording_length": "574026"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "5", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "284000", "artist-credit-phrase": "Jeff Buckley", "id": "5db42013-aa5c-4eb4-a549-46ca721990cf", "title": "Last Goodbye (live from Sydney)"}, "length": "284000", "position": "5", "id": "8ad80590-99d6-3c13-bf6b-8cc7f3b4998d", "track_or_recording_length": "284000"}], "disc-count": 2}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json b/whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json index 5ba9564e..d05fba3a 100644 --- a/whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json +++ b/whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json @@ -1 +1 @@ -{"release": {"status": "Promotion", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [], "title": "Northern Gateway", "release-event-count": 1, "medium-count": 1, "cover-art-archive": {"count": "3", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2010", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "medium-list": [{"position": "1", "track-count": 10, "format": "CD", "disc-list": [{"offset-list": [150, 31869, 65080, 100394, 137049, 176151, 205976, 236876, 269301, 301592], "id": "rzGHHqfPWIq1GsOLhhlBcZuqo.I-", "sectors": "333836", "offset-count": 10}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Bubble", "disambiguation": "Psytrance duo consisting of Guy Sernat and Karen Bagdasarov", "id": "4b136bbc-0bd1-4cb9-be8e-c251cf3666d4", "name": "Bubble"}}], "number": "1", "artist-credit-phrase": "Bubble", "recording": {"artist-credit": [{"artist": {"sort-name": "Bubble", "disambiguation": "Psytrance duo consisting of Guy Sernat and Karen Bagdasarov", "id": "4b136bbc-0bd1-4cb9-be8e-c251cf3666d4", "name": "Bubble"}}], "length": "422920", "artist-credit-phrase": "Bubble", "id": "b8eb2826-20ef-42f0-9df1-f66d8bac9f0f", "title": "Different Story"}, "length": "422920", "position": "1", "id": "33eabef0-24be-4d98-bb6a-aa5499854bd1", "track_or_recording_length": "422920"}, {"artist-credit": [{"artist": {"sort-name": "Twisted Reaction", "id": "4f69f624-73ea-4a16-b822-bd2ca58032bf", "name": "Twisted Reaction"}}, " feat. ", {"name": "Danielle", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "number": "2", "artist-credit-phrase": "Twisted Reaction feat. Danielle", "recording": {"artist-credit": [{"artist": {"sort-name": "Twisted Reaction", "id": "4f69f624-73ea-4a16-b822-bd2ca58032bf", "name": "Twisted Reaction"}}, " feat. ", {"name": "Danielle", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "length": "442813", "artist-credit-phrase": "Twisted Reaction feat. Danielle", "id": "ac52c692-6b13-401f-810b-d9b733b6594e", "title": "New Generation of Science"}, "length": "442813", "position": "2", "id": "ef43e443-f305-4085-b51c-db75ee1bdbfd", "track_or_recording_length": "442813"}, {"artist-credit": [{"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}, " & ", {"name": "Chris", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "number": "3", "artist-credit-phrase": "Painkiller & Chris", "recording": {"artist-credit": [{"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}, " & ", {"name": "Chris", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "length": "470853", "artist-credit-phrase": "Painkiller & Chris", "id": "311ffad5-9877-4c6a-9b48-160412835607", "title": "Purest Form"}, "length": "470853", "position": "3", "id": "098f0417-5449-4046-b006-08eefad21839", "track_or_recording_length": "470853"}, {"artist-credit": [{"name": "BioGenesis", "artist": {"sort-name": "Bio Genesis", "disambiguation": "Spanish psy-trance project", "id": "dd61b86c-c015-43e1-9a28-58fceb0975c8", "name": "Bio Genesis"}}], "number": "4", "artist-credit-phrase": "BioGenesis", "recording": {"artist-credit": [{"name": "BioGenesis", "artist": {"sort-name": "Bio Genesis", "disambiguation": "Spanish psy-trance project", "id": "dd61b86c-c015-43e1-9a28-58fceb0975c8", "name": "Bio Genesis"}}], "length": "488733", "artist-credit-phrase": "BioGenesis", "id": "b1c99a56-e802-4a34-919c-b754fa056a8f", "title": "Ride the Wave"}, "length": "488733", "position": "4", "id": "be9cac8e-d770-47cd-bc13-6189eac14e17", "track_or_recording_length": "488733"}, {"artist-credit": [{"name": "R.E.V.", "artist": {"sort-name": "Rev", "disambiguation": "psytrance artist Troy Leidich", "id": "d7f9d566-4341-4b19-8219-e3f2e84cf7a7", "name": "Rev"}}], "number": "5", "artist-credit-phrase": "R.E.V.", "recording": {"artist-credit": [{"name": "R.E.V.", "artist": {"sort-name": "Rev", "disambiguation": "psytrance artist Troy Leidich", "id": "d7f9d566-4341-4b19-8219-e3f2e84cf7a7", "name": "Rev"}}], "length": "521360", "artist-credit-phrase": "R.E.V.", "id": "8fe058dc-1cea-43ca-81b3-e2613ed315e4", "title": "PU 329"}, "length": "521360", "position": "5", "id": "6525bbd7-fdc4-45a2-b0d9-c8a7e723cfab", "track_or_recording_length": "521360"}, {"artist-credit": [{"artist": {"sort-name": "Schatzhauser", "disambiguation": "Psychedelic trance artist from Rostock,Germany", "id": "75110376-62a8-427e-a53c-67ad6adb06b1", "name": "Schatzhauser"}}], "number": "6", "artist-credit-phrase": "Schatzhauser", "recording": {"artist-credit": [{"artist": {"sort-name": "Schatzhauser", "disambiguation": "Psychedelic trance artist from Rostock,Germany", "id": "75110376-62a8-427e-a53c-67ad6adb06b1", "name": "Schatzhauser"}}], "length": "397666", "artist-credit-phrase": "Schatzhauser", "id": "c8aa0332-d0fd-428b-93ce-f14df73cb962", "title": "Wet Dreams"}, "length": "397666", "position": "6", "id": "00ab6a04-14d0-491f-9997-046339ee79fc", "track_or_recording_length": "397666"}, {"artist-credit": [{"artist": {"sort-name": "Audio Hijack", "id": "f4edc6b9-adea-436e-b855-f4463d34c77f", "name": "Audio Hijack"}}, " & ", {"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}], "number": "7", "artist-credit-phrase": "Audio Hijack & Painkiller", "recording": {"artist-credit": [{"artist": {"sort-name": "Audio Hijack", "id": "f4edc6b9-adea-436e-b855-f4463d34c77f", "name": "Audio Hijack"}}, " & ", {"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}], "length": "412000", "artist-credit-phrase": "Audio Hijack & Painkiller", "id": "707305b1-fdb2-48df-8fc4-85955cdab049", "title": "Flying Oscillator"}, "length": "412000", "position": "7", "id": "9604b6d8-ccf4-465e-9b90-f8f463542b1c", "track_or_recording_length": "412000"}, {"artist-credit": [{"artist": {"sort-name": "Members of Mayday", "id": "620efc10-77da-428f-9d78-2ebc75760f46", "name": "Members of Mayday"}}], "number": "8", "artist-credit-phrase": "Members of Mayday", "recording": {"artist-credit": [{"artist": {"sort-name": "Members of Mayday", "id": "620efc10-77da-428f-9d78-2ebc75760f46", "name": "Members of Mayday"}}], "length": "432333", "artist-credit-phrase": "Members of Mayday", "id": "89225fc3-c062-4fa9-a858-3eebe3b276e0", "title": "Sonic Empire (SynSUN remix)"}, "length": "432333", "position": "8", "id": "9472e2af-47e1-422c-8ebd-046154347f16", "track_or_recording_length": "432333"}, {"artist-credit": [{"artist": {"sort-name": "DNA", "disambiguation": "Psy-Trance artists A-tan Injection & Zeev Kardonsky", "id": "97113e01-3faf-495e-9140-0f5913aa32fb", "name": "DNA"}}], "number": "9", "artist-credit-phrase": "DNA", "recording": {"artist-credit": [{"artist": {"sort-name": "DNA", "disambiguation": "Psy-Trance artists A-tan Injection & Zeev Kardonsky", "id": "97113e01-3faf-495e-9140-0f5913aa32fb", "name": "DNA"}}], "length": "430546", "artist-credit-phrase": "DNA", "id": "ccd46826-4306-4795-8db1-2e500b8fdfd3", "title": "Signal 5"}, "length": "430546", "position": "9", "id": "39e389b4-e649-4222-857c-0fc471b8989c", "track_or_recording_length": "430546"}, {"artist-credit": [{"artist": {"sort-name": "Mekkanikka", "id": "41b8ca73-8460-4aaa-8dd8-5484c714dfdc", "name": "Mekkanikka"}}], "number": "10", "artist-credit-phrase": "Mekkanikka", "recording": {"artist-credit": [{"artist": {"sort-name": "Mekkanikka", "id": "41b8ca73-8460-4aaa-8dd8-5484c714dfdc", "name": "Mekkanikka"}}], "length": "429920", "artist-credit-phrase": "Mekkanikka", "id": "76290178-6b32-469f-945a-8ef28b3269f7", "title": "Hawain Snow"}, "length": "429920", "position": "10", "id": "07b79fd2-4da8-4331-946d-de08f50d1d9a", "track_or_recording_length": "429920"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "label-info-count": 0, "country": "DE", "date": "2010", "artist-credit-phrase": "Various Artists", "quality": "normal", "id": "38b05c7d-65fe-4dc0-9c10-33a391b86703"}} \ No newline at end of file +{"release": {"status": "Promotion", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [], "title": "Northern Gateway", "release-event-count": 1, "medium-count": 1, "cover-art-archive": {"count": "3", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2010", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "medium-list": [{"position": "1", "track-count": 10, "format": "CD", "disc-list": [{"offset-list": [150, 31869, 65080, 100394, 137049, 176151, 205976, 236876, 269301, 301592], "id": "rzGHHqfPWIq1GsOLhhlBcZuqo.I-", "sectors": "333836", "offset-count": 10}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Bubble", "disambiguation": "Psytrance duo consisting of Guy Sernat and Karen Bagdasarov", "id": "4b136bbc-0bd1-4cb9-be8e-c251cf3666d4", "name": "Bubble"}}], "number": "1", "artist-credit-phrase": "Bubble", "recording": {"artist-credit": [{"artist": {"sort-name": "Bubble", "disambiguation": "Psytrance duo consisting of Guy Sernat and Karen Bagdasarov", "id": "4b136bbc-0bd1-4cb9-be8e-c251cf3666d4", "name": "Bubble"}}], "length": "422920", "artist-credit-phrase": "Bubble", "id": "b8eb2826-20ef-42f0-9df1-f66d8bac9f0f", "title": "Different Story"}, "length": "422920", "position": "1", "id": "33eabef0-24be-4d98-bb6a-aa5499854bd1", "track_or_recording_length": "422920"}, {"artist-credit": [{"artist": {"sort-name": "Twisted Reaction", "id": "4f69f624-73ea-4a16-b822-bd2ca58032bf", "name": "Twisted Reaction"}}, " feat. ", {"artist": {"sort-name": "Danielle", "disambiguation": "featured on \"New Generation of Science\" by Twisted Reaction", "id": "47ed312b-db38-4df5-ae82-cdc44850b0b6", "name": "Danielle"}}], "number": "2", "artist-credit-phrase": "Twisted Reaction feat. Danielle", "recording": {"artist-credit": [{"artist": {"sort-name": "Twisted Reaction", "id": "4f69f624-73ea-4a16-b822-bd2ca58032bf", "name": "Twisted Reaction"}}, " feat. ", {"artist": {"sort-name": "Danielle", "disambiguation": "featured on \"New Generation of Science\" by Twisted Reaction", "id": "47ed312b-db38-4df5-ae82-cdc44850b0b6", "name": "Danielle"}}], "length": "442813", "artist-credit-phrase": "Twisted Reaction feat. Danielle", "id": "ac52c692-6b13-401f-810b-d9b733b6594e", "title": "New Generation of Science"}, "length": "442813", "position": "2", "id": "ef43e443-f305-4085-b51c-db75ee1bdbfd", "track_or_recording_length": "442813"}, {"artist-credit": [{"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}, " & ", {"artist": {"sort-name": "Chris", "disambiguation": "has song \"Purest Form\" with Painkiller", "id": "1eee00df-9ca1-41eb-bb0c-889fff35293f", "name": "Chris"}}], "number": "3", "artist-credit-phrase": "Painkiller & Chris", "recording": {"artist-credit": [{"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}, " & ", {"artist": {"sort-name": "Chris", "disambiguation": "has song \"Purest Form\" with Painkiller", "id": "1eee00df-9ca1-41eb-bb0c-889fff35293f", "name": "Chris"}}], "length": "470853", "artist-credit-phrase": "Painkiller & Chris", "id": "311ffad5-9877-4c6a-9b48-160412835607", "title": "Purest Form"}, "length": "470853", "position": "3", "id": "098f0417-5449-4046-b006-08eefad21839", "track_or_recording_length": "470853"}, {"artist-credit": [{"name": "BioGenesis", "artist": {"sort-name": "Bio Genesis", "disambiguation": "Spanish psy-trance project", "id": "dd61b86c-c015-43e1-9a28-58fceb0975c8", "name": "Bio Genesis"}}], "number": "4", "artist-credit-phrase": "BioGenesis", "recording": {"artist-credit": [{"name": "BioGenesis", "artist": {"sort-name": "Bio Genesis", "disambiguation": "Spanish psy-trance project", "id": "dd61b86c-c015-43e1-9a28-58fceb0975c8", "name": "Bio Genesis"}}], "length": "488733", "artist-credit-phrase": "BioGenesis", "id": "b1c99a56-e802-4a34-919c-b754fa056a8f", "title": "Ride the Wave"}, "length": "488733", "position": "4", "id": "be9cac8e-d770-47cd-bc13-6189eac14e17", "track_or_recording_length": "488733"}, {"artist-credit": [{"name": "R.E.V.", "artist": {"sort-name": "Rev", "disambiguation": "psytrance artist Troy Leidich", "id": "d7f9d566-4341-4b19-8219-e3f2e84cf7a7", "name": "Rev"}}], "number": "5", "artist-credit-phrase": "R.E.V.", "recording": {"artist-credit": [{"name": "R.E.V.", "artist": {"sort-name": "Rev", "disambiguation": "psytrance artist Troy Leidich", "id": "d7f9d566-4341-4b19-8219-e3f2e84cf7a7", "name": "Rev"}}], "length": "521360", "artist-credit-phrase": "R.E.V.", "id": "8fe058dc-1cea-43ca-81b3-e2613ed315e4", "title": "PU 329"}, "length": "521360", "position": "5", "id": "6525bbd7-fdc4-45a2-b0d9-c8a7e723cfab", "track_or_recording_length": "521360"}, {"artist-credit": [{"artist": {"sort-name": "Schatzhauser", "disambiguation": "Psychedelic trance artist from Rostock,Germany", "id": "75110376-62a8-427e-a53c-67ad6adb06b1", "name": "Schatzhauser"}}], "number": "6", "artist-credit-phrase": "Schatzhauser", "recording": {"artist-credit": [{"artist": {"sort-name": "Schatzhauser", "disambiguation": "Psychedelic trance artist from Rostock,Germany", "id": "75110376-62a8-427e-a53c-67ad6adb06b1", "name": "Schatzhauser"}}], "length": "397666", "artist-credit-phrase": "Schatzhauser", "id": "c8aa0332-d0fd-428b-93ce-f14df73cb962", "title": "Wet Dreams"}, "length": "397666", "position": "6", "id": "00ab6a04-14d0-491f-9997-046339ee79fc", "track_or_recording_length": "397666"}, {"artist-credit": [{"artist": {"sort-name": "Audio Hijack", "id": "f4edc6b9-adea-436e-b855-f4463d34c77f", "name": "Audio Hijack"}}, " & ", {"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}], "number": "7", "artist-credit-phrase": "Audio Hijack & Painkiller", "recording": {"artist-credit": [{"artist": {"sort-name": "Audio Hijack", "id": "f4edc6b9-adea-436e-b855-f4463d34c77f", "name": "Audio Hijack"}}, " & ", {"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}], "length": "412000", "artist-credit-phrase": "Audio Hijack & Painkiller", "id": "707305b1-fdb2-48df-8fc4-85955cdab049", "title": "Flying Oscillator"}, "length": "412000", "position": "7", "id": "9604b6d8-ccf4-465e-9b90-f8f463542b1c", "track_or_recording_length": "412000"}, {"artist-credit": [{"artist": {"sort-name": "Members of Mayday", "id": "620efc10-77da-428f-9d78-2ebc75760f46", "name": "Members of Mayday"}}], "number": "8", "artist-credit-phrase": "Members of Mayday", "recording": {"artist-credit": [{"artist": {"sort-name": "Members of Mayday", "id": "620efc10-77da-428f-9d78-2ebc75760f46", "name": "Members of Mayday"}}], "length": "432333", "artist-credit-phrase": "Members of Mayday", "id": "89225fc3-c062-4fa9-a858-3eebe3b276e0", "title": "Sonic Empire (SynSUN remix)"}, "length": "432333", "position": "8", "id": "9472e2af-47e1-422c-8ebd-046154347f16", "track_or_recording_length": "432333"}, {"artist-credit": [{"artist": {"sort-name": "DNA", "disambiguation": "Psy-Trance artists A-tan Injection & Zeev Kardonsky", "id": "97113e01-3faf-495e-9140-0f5913aa32fb", "name": "DNA"}}], "number": "9", "artist-credit-phrase": "DNA", "recording": {"artist-credit": [{"artist": {"sort-name": "DNA", "disambiguation": "Psy-Trance artists A-tan Injection & Zeev Kardonsky", "id": "97113e01-3faf-495e-9140-0f5913aa32fb", "name": "DNA"}}], "length": "430546", "artist-credit-phrase": "DNA", "id": "ccd46826-4306-4795-8db1-2e500b8fdfd3", "title": "Signal 5"}, "length": "430546", "position": "9", "id": "39e389b4-e649-4222-857c-0fc471b8989c", "track_or_recording_length": "430546"}, {"artist-credit": [{"artist": {"sort-name": "Mekkanikka", "disambiguation": "Psychedelic trance artist [Nicolas Oesch]", "id": "41b8ca73-8460-4aaa-8dd8-5484c714dfdc", "name": "Mekkanikka"}}], "number": "10", "artist-credit-phrase": "Mekkanikka", "recording": {"artist-credit": [{"artist": {"sort-name": "Mekkanikka", "disambiguation": "Psychedelic trance artist [Nicolas Oesch]", "id": "41b8ca73-8460-4aaa-8dd8-5484c714dfdc", "name": "Mekkanikka"}}], "length": "429920", "artist-credit-phrase": "Mekkanikka", "id": "76290178-6b32-469f-945a-8ef28b3269f7", "title": "Hawain Snow"}, "length": "429920", "position": "10", "id": "07b79fd2-4da8-4331-946d-de08f50d1d9a", "track_or_recording_length": "429920"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "label-info-count": 0, "country": "DE", "date": "2010", "artist-credit-phrase": "Various Artists", "quality": "normal", "id": "38b05c7d-65fe-4dc0-9c10-33a391b86703"}} \ No newline at end of file diff --git a/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json b/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json index de8f5d84..121283c6 100644 --- a/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json +++ b/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json @@ -1 +1 @@ -{"release": {"status": "Official", "asin": "B008R78K1Y", "label-info-list": [{"label": {"sort-name": "Brownswood Recordings", "id": "6483a614-d00f-42b0-af39-a602b3ce5daa", "name": "Brownswood Recordings"}, "catalog-number": "BWOOD090CD"}], "title": "Mala in Cuba", "country": "GB", "barcode": "5060180321505", "artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "medium-list": [{"disc-list": [{"id": "u0aKVpO.59JBy6eQRX2vYcoqQZ0-", "sectors": "257868"}], "position": "1", "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "155000", "artist-credit-phrase": "Mala", "id": "3fa9c442-6ae7-4242-ae3b-0150a3002da4", "title": "Introduction"}, "position": "1"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "195626", "artist-credit-phrase": "Mala", "id": "983ad5e0-c52e-459d-8828-85718ceff2cc", "title": "Mulata"}, "position": "2"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "242826", "artist-credit-phrase": "Mala", "id": "6855abf0-32a3-4fe2-a3fb-858f3157d42b", "title": "Tribal"}, "position": "3"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "263760", "artist-credit-phrase": "Mala", "id": "2f938885-94ad-4b11-b251-f18c3a2a5fa9", "title": "Changuito"}, "position": "4"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "274520", "artist-credit-phrase": "Mala", "id": "a5ecfa15-06d0-44cf-a28e-c748e8270488", "title": "Revolution"}, "position": "5"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Dreiser", "id": "ec07a209-55ff-4084-bc41-9d4d1764e075", "name": "Dreiser"}}, " & ", {"artist": {"sort-name": "Sexto Sentido", "id": "f626b92e-07b1-4a19-ad13-c09d690db66c", "name": "Sexto Sentido"}}], "length": "227800", "artist-credit-phrase": "Mala feat. Dreiser & Sexto Sentido", "id": "cfb3ddaf-584c-4c86-b58c-752c63977bb8", "title": "Como como"}, "position": "6"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "276693", "artist-credit-phrase": "Mala", "id": "90da8ada-21e2-4e7b-ab46-ff04004a3d84", "title": "Cuba Electronic"}, "position": "7"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "267973", "artist-credit-phrase": "Mala", "id": "2bf67b46-30f5-4746-ab91-4c9675221a21", "title": "The Tunnel"}, "position": "8"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "246000", "artist-credit-phrase": "Mala", "id": "0cd61fa9-a97a-41e3-b3c3-db36f633b611", "title": "Ghost"}, "position": "9"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "250000", "artist-credit-phrase": "Mala", "id": "136989e9-f24f-4872-9026-1487869cc8de", "title": "Curfew"}, "position": "10"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "174000", "artist-credit-phrase": "Mala", "id": "26b6fd89-7021-4239-b6a7-76eca8c0515a", "title": "The Tourist"}, "position": "11"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "270733", "artist-credit-phrase": "Mala", "id": "62f7a892-f63b-4a2b-866f-db2a36533f8c", "title": "Change"}, "position": "12"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "251853", "artist-credit-phrase": "Mala", "id": "4395c91a-d5e9-4fe4-92d2-deee3e0ebb5a", "title": "Calle F"}, "position": "13"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Suarez, Danay", "id": "82f04998-7da8-4259-aa7f-d623e6ea2b91", "name": "Danay Suarez"}}], "length": "338000", "artist-credit-phrase": "Mala feat. Danay Suarez", "id": "e47a4fd9-8359-4a33-add8-e8c690e59055", "title": "Noche sue\u00f1os"}, "position": "14"}], "format": "CD"}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2012-09-17", "artist-credit-phrase": "Mala", "quality": "normal", "id": "61c6fd9b-18f8-4a45-963a-ba3c5d990cae"}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "barcode": "5060180321505", "asin": "B008R78K1Y", "label-info-count": 1, "label-info-list": [{"catalog-number": "BWOOD090CD", "label": {"sort-name": "Brownswood Recordings", "disambiguation": "London-based indie founded by Gilles Peterson", "id": "6483a614-d00f-42b0-af39-a602b3ce5daa", "name": "Brownswood Recordings"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2012-09-17", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2012-09-17", "quality": "normal", "id": "61c6fd9b-18f8-4a45-963a-ba3c5d990cae", "release-event-count": 1, "title": "Mala in Cuba", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Mala", "medium-list": [{"position": "1", "track-count": 14, "format": "CD", "disc-list": [{"offset-list": [150, 11805, 26477, 44689, 64471, 85060, 102145, 122897, 142995, 161481, 180255, 193305, 213610, 232499], "id": "u0aKVpO.59JBy6eQRX2vYcoqQZ0-", "sectors": "257868", "offset-count": 14}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "1", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "155400", "artist-credit-phrase": "Mala", "id": "3fa9c442-6ae7-4242-ae3b-0150a3002da4", "title": "Introduction"}, "length": "155400", "position": "1", "id": "fda06ef7-6d59-3af1-a897-4852575d1add", "track_or_recording_length": "155400"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "2", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "195626", "artist-credit-phrase": "Mala", "id": "983ad5e0-c52e-459d-8828-85718ceff2cc", "title": "Mulata"}, "length": "195626", "position": "2", "id": "6618aa8c-911d-3ab4-922c-a5405e0b77c4", "track_or_recording_length": "195626"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "3", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "242826", "artist-credit-phrase": "Mala", "id": "6855abf0-32a3-4fe2-a3fb-858f3157d42b", "title": "Tribal"}, "length": "242826", "position": "3", "id": "96ed49dc-94d4-3198-8436-cd1b1c947cf9", "track_or_recording_length": "242826"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "4", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "263760", "artist-credit-phrase": "Mala", "id": "2f938885-94ad-4b11-b251-f18c3a2a5fa9", "title": "Changuito"}, "length": "263760", "position": "4", "id": "119b9624-b2b8-3adb-a1a9-f229c69457a4", "track_or_recording_length": "263760"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "5", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "274520", "artist-credit-phrase": "Mala", "id": "a5ecfa15-06d0-44cf-a28e-c748e8270488", "title": "Revolution"}, "length": "274520", "position": "5", "id": "6abb43f7-e192-3fe2-bd9a-c2e3fadfb98d", "track_or_recording_length": "274520"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Dreiser", "id": "ec07a209-55ff-4084-bc41-9d4d1764e075", "name": "Dreiser"}}, " & ", {"artist": {"sort-name": "Sexto Sentido", "id": "f626b92e-07b1-4a19-ad13-c09d690db66c", "name": "Sexto Sentido"}}], "number": "6", "artist-credit-phrase": "Mala feat. Dreiser & Sexto Sentido", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Dreiser", "id": "ec07a209-55ff-4084-bc41-9d4d1764e075", "name": "Dreiser"}}, " & ", {"artist": {"sort-name": "Sexto Sentido", "id": "f626b92e-07b1-4a19-ad13-c09d690db66c", "name": "Sexto Sentido"}}], "length": "227800", "artist-credit-phrase": "Mala feat. Dreiser & Sexto Sentido", "id": "cfb3ddaf-584c-4c86-b58c-752c63977bb8", "title": "Como como"}, "length": "227800", "position": "6", "id": "78e43595-6dff-3bb5-a5af-7f5cd9bbee27", "track_or_recording_length": "227800"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "7", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "276693", "artist-credit-phrase": "Mala", "id": "90da8ada-21e2-4e7b-ab46-ff04004a3d84", "title": "Cuba Electronic"}, "length": "276693", "position": "7", "id": "5edaa191-ecb5-3b88-ae04-3d42b42b5cf4", "track_or_recording_length": "276693"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "8", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "267973", "artist-credit-phrase": "Mala", "id": "2bf67b46-30f5-4746-ab91-4c9675221a21", "title": "The Tunnel"}, "length": "267973", "position": "8", "id": "8b6940ac-7dde-312e-b1bb-573ff8905711", "track_or_recording_length": "267973"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "9", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "246480", "artist-credit-phrase": "Mala", "id": "0cd61fa9-a97a-41e3-b3c3-db36f633b611", "title": "Ghost"}, "length": "246480", "position": "9", "id": "ae5ef0e1-c72a-302c-8e30-c012e50a042c", "track_or_recording_length": "246480"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "10", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "250320", "artist-credit-phrase": "Mala", "id": "136989e9-f24f-4872-9026-1487869cc8de", "title": "Curfew"}, "length": "250320", "position": "10", "id": "172a577a-0f9d-3f20-815c-a24285ad315f", "track_or_recording_length": "250320"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "11", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "174000", "artist-credit-phrase": "Mala", "id": "26b6fd89-7021-4239-b6a7-76eca8c0515a", "title": "The Tourist"}, "length": "174000", "position": "11", "id": "9d670bd5-dc8e-365f-9324-4eac9a719d0c", "track_or_recording_length": "174000"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "12", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "270733", "artist-credit-phrase": "Mala", "id": "62f7a892-f63b-4a2b-866f-db2a36533f8c", "title": "Change"}, "length": "270733", "position": "12", "id": "cb00f633-aafd-3989-84be-17ce08503827", "track_or_recording_length": "270733"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "13", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "251854", "artist-credit-phrase": "Mala", "id": "4395c91a-d5e9-4fe4-92d2-deee3e0ebb5a", "title": "Calle F"}, "length": "251853", "position": "13", "id": "30e2f1b6-b91f-3087-acb2-e1ca4ef1c571", "track_or_recording_length": "251853"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"name": "Danay Suarez", "artist": {"sort-name": "Su\u00e1rez, Danay", "id": "82f04998-7da8-4259-aa7f-d623e6ea2b91", "name": "Danay Su\u00e1rez"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Su\u00e1rez, Danay", "id": "82f04998-7da8-4259-aa7f-d623e6ea2b91", "name": "Danay Su\u00e1rez"}}], "length": "338253", "artist-credit-phrase": "Mala feat. Danay Su\u00e1rez", "id": "e47a4fd9-8359-4a33-add8-e8c690e59055", "title": "Noche sue\u00f1os"}, "length": "338253", "position": "14", "artist-credit-phrase": "Mala feat. Danay Suarez", "track_or_recording_length": "338253", "id": "316baa17-37d5-357d-be8a-1d88c7e83876", "number": "14"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json b/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json new file mode 100644 index 00000000..e7f6d3cf --- /dev/null +++ b/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json @@ -0,0 +1 @@ +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "638812730329", "asin": "B000E6GBVW", "label-info-count": 1, "label-info-list": [{"catalog-number": "63881-27303-2", "label": {"sort-name": "V2 Records International", "disambiguation": "possibly bogus, please refer to \"V2\" or \"V2 Records\" instead", "id": "947c12a1-cf28-4380-a695-a944ad15e387", "name": "V2 Records International"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2006", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006", "quality": "normal", "id": "8a457e97-ed59-31f1-8b1c-41f24e9a7183", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "US", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "15be8cfd-dff8-3dac-8924-8f564f7aff3c", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "70aeb069-b711-3586-9c47-d5b82f482a7f", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "48afa45e-a3a2-3e56-a93c-5a9afb5895af", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2e6d0fb6-c246-30f3-8572-5a121c001078", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "ba671d1c-d7b8-3a36-8b2e-f02665e3cd5d", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "7a806384-da3a-3cc7-8b92-5699ff68cd60", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "7c23d3cf-8cbb-3530-bef6-e532bf127212", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "ac0a2d96-e85c-3516-9833-8e87066eb11f", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "32ceb242-8ea0-3e82-975e-965014fbdc20", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "5e6a4c53-396c-3699-a682-7923919cbc87", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "fa108d5a-e6c2-3c6f-afcc-9b6b48cd5c2a", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "3319fd26-9891-3761-8de3-786fa7e6493f", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json b/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json index b7390a91..9b7604b0 100644 --- a/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json +++ b/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Various Artists", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "title": "2 Meter Sessies, Volume 10", "label-info-list": [], "medium-list": [{"disc-list": [{"id": "f7XO36a7n1LCCskkCiulReWbwZA-", "sectors": "317128"}], "position": "1", "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "length": "265200", "artist-credit-phrase": "Coldplay", "id": "06813123-5047-4c94-88bf-6a300540e954", "title": "Trouble"}, "position": "1"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Live", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "Live"}}], "length": "264466", "artist-credit-phrase": "Live", "id": "7b57b108-35bb-4fcb-9046-06228fb7e5f7", "title": "Run to the Water"}, "position": "2"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Beck", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "length": "384440", "artist-credit-phrase": "Beck", "id": "cfbfb04e-ccfd-4316-a5eb-5e4daa670905", "title": "Debra"}, "position": "3"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "length": "261746", "artist-credit-phrase": "The Jayhawks", "id": "d7b84a3f-628d-49f3-ae2f-b34d5630ee45", "title": "Mr. Wilson"}, "position": "4"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "length": "239080", "artist-credit-phrase": "De Dijk", "id": "2bb1a0ca-399a-4488-8a53-bb0ca9ece5ea", "title": "Wie het niet weet"}, "position": "5"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "length": "209800", "artist-credit-phrase": "Emil\u00edana Torrini", "id": "3e6433da-9af5-41b0-9210-6dbef13c630c", "title": "Summer Breeze"}, "position": "6"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "length": "159600", "artist-credit-phrase": "John Hiatt", "id": "ce684ade-741f-47f7-ac1c-0d7d206da8a3", "title": "What Do We Do Now"}, "position": "7"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "length": "184800", "artist-credit-phrase": "Barry Hay & Barking Dogs", "id": "56b1b506-64cd-4c2f-be6d-044e3888dabd", "title": "Happiness Is a Warm Gun"}, "position": "8"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "length": "231640", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "id": "4d1c6a29-dd96-4af6-a594-622d70e214ac", "title": "I'm Your Puppet"}, "position": "9"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "length": "211800", "artist-credit-phrase": "Angie Stone", "id": "cb0447fc-3ad3-4dea-a94d-517179a6d68c", "title": "Everyday"}, "position": "10"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "length": "249693", "artist-credit-phrase": "Tom Helsen", "id": "2f6501f8-262a-4f02-a782-ed365621e100", "title": "When Marvin Calls"}, "position": "11"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "K's Choice", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "length": "210666", "artist-credit-phrase": "K\u2019s Choice", "id": "e3ef3fa1-3155-464d-a5e0-4096e9cc63ad", "title": "Almost Happy"}, "position": "12"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "length": "191000", "artist-credit-phrase": "Paddy Casey", "id": "c419e7a6-cbe7-44c9-a45e-08e0721695dd", "title": "Can't Take That Away"}, "position": "13"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "length": "267933", "artist-credit-phrase": "Joe Jackson", "id": "ebb7083f-4db2-4daa-a67d-2993887b67ad", "title": "Stranger Than You"}, "position": "14"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "length": "325466", "artist-credit-phrase": "My Morning Jacket", "id": "62594b12-5907-42b6-b7d9-03ad5b0ddd35", "title": "Old September Blues"}, "position": "15"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "length": "193973", "artist-credit-phrase": "Tom Jones & Stereophonics", "id": "ba50a1c7-9e23-4c3e-b7aa-12e23eea6d19", "title": "Mama Told Me Not to Come"}, "position": "16"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "length": "223333", "artist-credit-phrase": "Ben Christophers", "id": "c0cfc4cb-8c80-4516-b500-2df010418697", "title": "Sunday"}, "position": "17"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "length": "151733", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "id": "e423a1d7-3ae1-4540-b267-d873c50043e7", "title": "Magnolia"}, "position": "18"}], "format": "CD"}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2001-10-15", "artist-credit-phrase": "Various Artists", "quality": "normal", "id": "a76714e0-32b1-4ed4-b28e-f86d99642193"}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [{"catalog-number": "585 625-2", "label": {"sort-name": "Universal TV", "disambiguation": "Netherlands & Belgium", "id": "48500332-aa67-44d1-9901-18d1e6ab27a2", "name": "Universal TV"}}], "title": "2 Meter Sessies, Volume 10", "release-event-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2001-10-15", "area": {"sort-name": "Netherlands", "iso-3166-1-code-list": ["NL"], "id": "ef1b7cc0-cd26-36f4-8ea0-04d9623786c7", "name": "Netherlands"}}], "medium-list": [{"position": "1", "track-count": 18, "format": "CD", "disc-list": [{"offset-list": [150, 20040, 39875, 68708, 88339, 106270, 122005, 133975, 147835, 165208, 181093, 199820, 215620, 229945, 250040, 274450, 288998, 305748], "id": "f7XO36a7n1LCCskkCiulReWbwZA-", "sectors": "317128", "offset-count": 18}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "number": "1", "artist-credit-phrase": "Coldplay", "recording": {"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "length": "265200", "artist-credit-phrase": "Coldplay", "id": "06813123-5047-4c94-88bf-6a300540e954", "title": "Trouble"}, "length": "265200", "position": "1", "id": "73b03043-36e9-3a92-9ce7-c1ad2d887fa3", "track_or_recording_length": "265200"}, {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "number": "2", "artist-credit-phrase": "L\u012aVE", "recording": {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "length": "264466", "artist-credit-phrase": "L\u012aVE", "id": "7b57b108-35bb-4fcb-9046-06228fb7e5f7", "title": "Run to the Water"}, "length": "264466", "position": "2", "id": "7485aa70-7159-3dfd-aa74-514994f88789", "track_or_recording_length": "264466"}, {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "number": "3", "artist-credit-phrase": "Beck", "recording": {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "length": "384440", "artist-credit-phrase": "Beck", "id": "cfbfb04e-ccfd-4316-a5eb-5e4daa670905", "title": "Debra"}, "length": "384440", "position": "3", "id": "17d52b51-42da-3a80-afb4-3d03cd99e339", "track_or_recording_length": "384440"}, {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "number": "4", "artist-credit-phrase": "The Jayhawks", "recording": {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "length": "261746", "artist-credit-phrase": "The Jayhawks", "id": "d7b84a3f-628d-49f3-ae2f-b34d5630ee45", "title": "Mr. Wilson"}, "length": "261746", "position": "4", "id": "44b79128-b98c-36fe-8f25-b1b8b7b97309", "track_or_recording_length": "261746"}, {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "number": "5", "artist-credit-phrase": "De Dijk", "recording": {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "length": "239080", "artist-credit-phrase": "De Dijk", "id": "2bb1a0ca-399a-4488-8a53-bb0ca9ece5ea", "title": "Wie het niet weet"}, "length": "239080", "position": "5", "id": "9b76ae87-6b45-3b31-8466-64579d8d2cb0", "track_or_recording_length": "239080"}, {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "number": "6", "artist-credit-phrase": "Emil\u00edana Torrini", "recording": {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "length": "209800", "artist-credit-phrase": "Emil\u00edana Torrini", "id": "3e6433da-9af5-41b0-9210-6dbef13c630c", "title": "Summer Breeze"}, "length": "209800", "position": "6", "id": "addd247f-f664-3457-9040-3b9dc56a6b1c", "track_or_recording_length": "209800"}, {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "number": "7", "artist-credit-phrase": "John Hiatt", "recording": {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "length": "158000", "artist-credit-phrase": "John Hiatt", "id": "ce684ade-741f-47f7-ac1c-0d7d206da8a3", "title": "What Do We Do Now"}, "length": "159600", "position": "7", "id": "7f48a5cb-1370-3c2e-8b8f-9f20029c71cb", "track_or_recording_length": "159600"}, {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "number": "8", "artist-credit-phrase": "Barry Hay & Barking Dogs", "recording": {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "length": "184800", "artist-credit-phrase": "Barry Hay & Barking Dogs", "id": "56b1b506-64cd-4c2f-be6d-044e3888dabd", "title": "Happiness Is a Warm Gun"}, "length": "184800", "position": "8", "id": "9fae06e7-f2d2-34fc-a095-52565fe99225", "track_or_recording_length": "184800"}, {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "number": "9", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "recording": {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "length": "231640", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "id": "4d1c6a29-dd96-4af6-a594-622d70e214ac", "title": "I'm Your Puppet"}, "length": "231640", "position": "9", "id": "0024f07d-2864-3085-8aff-aa0440446f8e", "track_or_recording_length": "231640"}, {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "number": "10", "artist-credit-phrase": "Angie Stone", "recording": {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "length": "211800", "artist-credit-phrase": "Angie Stone", "id": "cb0447fc-3ad3-4dea-a94d-517179a6d68c", "title": "Everyday"}, "length": "211800", "position": "10", "id": "34ff18f9-cbeb-3da0-bb7b-a6908ca0e8e3", "track_or_recording_length": "211800"}, {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "number": "11", "artist-credit-phrase": "Tom Helsen", "recording": {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "length": "249693", "artist-credit-phrase": "Tom Helsen", "id": "2f6501f8-262a-4f02-a782-ed365621e100", "title": "When Marvin Calls"}, "length": "249693", "position": "11", "id": "1da99d43-f845-35e7-8e07-3c3cb38f9a82", "track_or_recording_length": "249693"}, {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "number": "12", "artist-credit-phrase": "K\u2019s Choice", "recording": {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "length": "210666", "artist-credit-phrase": "K\u2019s Choice", "id": "e3ef3fa1-3155-464d-a5e0-4096e9cc63ad", "title": "Almost Happy"}, "length": "210666", "position": "12", "id": "e2a95209-9240-3e4f-86a6-270771ee4fe3", "track_or_recording_length": "210666"}, {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "number": "13", "artist-credit-phrase": "Paddy Casey", "recording": {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "length": "191000", "artist-credit-phrase": "Paddy Casey", "id": "c419e7a6-cbe7-44c9-a45e-08e0721695dd", "title": "Can't Take That Away"}, "length": "191000", "position": "13", "id": "682ad823-6721-37c2-9af2-633789144183", "track_or_recording_length": "191000"}, {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "number": "14", "artist-credit-phrase": "Joe Jackson", "recording": {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "length": "267933", "artist-credit-phrase": "Joe Jackson", "id": "ebb7083f-4db2-4daa-a67d-2993887b67ad", "title": "Stranger Than You"}, "length": "267933", "position": "14", "id": "6895798b-33eb-3380-86ea-d0ba04321b0b", "track_or_recording_length": "267933"}, {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "number": "15", "artist-credit-phrase": "My Morning Jacket", "recording": {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "length": "325466", "artist-credit-phrase": "My Morning Jacket", "id": "62594b12-5907-42b6-b7d9-03ad5b0ddd35", "title": "Old September Blues"}, "length": "325466", "position": "15", "id": "795fa05c-33d4-32dc-bdbe-e79a2d4cc0d1", "track_or_recording_length": "325466"}, {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "number": "16", "artist-credit-phrase": "Tom Jones & Stereophonics", "recording": {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "length": "193973", "artist-credit-phrase": "Tom Jones & Stereophonics", "id": "ba50a1c7-9e23-4c3e-b7aa-12e23eea6d19", "title": "Mama Told Me Not to Come"}, "length": "193973", "position": "16", "id": "bb0171cf-dda7-36c6-9282-742f431fb5a0", "track_or_recording_length": "193973"}, {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "number": "17", "artist-credit-phrase": "Ben Christophers", "recording": {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "length": "223333", "artist-credit-phrase": "Ben Christophers", "id": "c0cfc4cb-8c80-4516-b500-2df010418697", "title": "Sunday"}, "length": "223333", "position": "17", "id": "c3db0bfb-a303-31a6-b113-1ecaac9242f1", "track_or_recording_length": "223333"}, {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "number": "18", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "recording": {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "length": "151733", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "id": "e423a1d7-3ae1-4540-b267-d873c50043e7", "title": "Magnolia"}, "length": "151733", "position": "18", "id": "c96be4bd-cc11-3a49-882f-60d2664068ec", "track_or_recording_length": "151733"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "label-info-count": 1, "country": "NL", "date": "2001-10-15", "artist-credit-phrase": "Various Artists", "quality": "normal", "id": "a76714e0-32b1-4ed4-b28e-f86d99642193"}} \ No newline at end of file diff --git a/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json b/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json index e5bb8879..f9b2014e 100644 --- a/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json +++ b/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json @@ -1 +1 @@ -{"release": {"status": "Official", "asin": "B000CNEQ64", "label-info-list": [{"label": {"sort-name": "V2 Records International", "id": "947c12a1-cf28-4380-a695-a944ad15e387", "name": "V2 Records International"}, "catalog-number": "VVR1035822"}], "title": "Ballad of the Broken Seas", "country": "GB", "barcode": "5033197358222", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "medium-list": [{"disc-list": [{"id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868"}], "position": "1", "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "position": "1"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "position": "2"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "position": "3"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "position": "4"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "position": "5"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "position": "6"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "position": "7"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "position": "8"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "position": "9"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "position": "10"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "position": "11"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "position": "12"}], "format": "CD"}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006-01-30", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "quality": "normal", "id": "e32ae79a-336e-4d33-945c-8c5e8206dbd3"}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "5033197358222", "asin": "B000CNEQ64", "label-info-count": 1, "label-info-list": [{"catalog-number": "VVR1035822", "label": {"label-code": "1801", "sort-name": "V2", "disambiguation": "imprint of V2 Music Ltd. and its international subsidiaries", "id": "dc2f5993-7a3d-4c59-bba0-0a77bf9d7416", "name": "V2"}}], "cover-art-archive": {"count": "10", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2006-01-30", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006-01-30", "quality": "normal", "id": "e32ae79a-336e-4d33-945c-8c5e8206dbd3", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "60f05f29-4949-3902-a525-b3d24b0029f4", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "978ab42b-043c-394b-a144-ee1e00db9bab", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "7a70fbf6-69e3-3ce0-9a85-53e6ded2f5ea", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2ae31462-4fb2-350f-9778-2104d6c2dd3b", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "cf8778eb-8b07-36f1-b24b-2d71af06fa29", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "a2cb63ac-606a-3721-a196-6f55c38694f8", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "9bf96f8b-8e04-31bb-a42c-1a24d2b5bc0a", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "6179abe2-cdb3-365a-95e4-4d1f0c3f1b9c", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "68c1a96c-bcb1-3d9a-ad86-e2a5db5b0291", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "431aeb0c-25d0-3f9a-9fb3-b391929de5e1", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "65750cb3-a552-33f6-acb2-a77c68638976", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "6afbb338-d9fd-37ce-a212-1f5d491b6cf4", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json b/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json index 37709b37..e1ec3494 100644 --- a/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json +++ b/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "barcode": "5050466625021", "asin": "B000095K86", "label-info-count": 1, "label-info-list": [{"catalog-number": "5050466-6250-2-1", "label": {"sort-name": "Warner Strategic Marketing (Germany)", "id": "29910c68-a655-4054-b933-da75d8f82bdf", "name": "Warner Strategic Marketing (Germany)"}}], "cover-art-archive": {"count": "2", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2003-05-19", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "packaging": "Slim Jewel Case", "text-representation": {"language": "deu", "script": "Latn"}, "date": "2003-05-19", "quality": "normal", "id": "f484a9fc-db21-4106-9408-bcd105c90047", "release-event-count": 1, "title": "Anyplace, Anywhere, Anytime", "country": "DE", "medium-count": 1, "artist-credit-phrase": "Nena & Kim Wilde", "medium-list": [{"position": "1", "track-count": 4, "format": "CD", "disc-list": [{"offset-list": [150, 17037, 35418, 53803], "id": "X2c2IQ5vUy5x6Jh7Xi_DGHtA1X8-", "sectors": "66872", "offset-count": 4}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "1", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "223480", "artist-credit-phrase": "Nena & Kim Wilde", "id": "fde5622c-ce23-4ebb-975d-51d4a926f901", "title": "Anyplace, Anywhere, Anytime (radio version)"}, "length": "225160", "position": "1", "id": "1cc96e78-28ed-3820-b0b6-614c35b121ac", "track_or_recording_length": "225160"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " mit ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "244000", "artist-credit-phrase": "Nena mit Kim Wilde", "id": "5f19758e-7421-4c71-a599-9a9575d8e1b0", "title": "Anyplace, Anywhere, Anytime (new version)"}, "length": "245080", "position": "2", "artist-credit-phrase": "Nena & Kim Wilde", "track_or_recording_length": "245080", "id": "f16db4bf-9a34-3d5a-a975-c9375ab7a2ca", "number": "2"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "3", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "245133", "artist-credit-phrase": "Nena & Kim Wilde", "id": "0620f76f-faa0-4931-95f8-aacb9cdbe469", "title": "Irgendwie, irgendwo, irgendwann (new version)"}, "length": "245133", "position": "3", "id": "ce2c4edd-6eab-36c8-8f84-e8c85f197a88", "track_or_recording_length": "245133"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "4", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "173627", "artist-credit-phrase": "Nena & Kim Wilde", "id": "1e266d6e-44c7-4fdb-a064-23167a4af473", "title": "Nur getr\u00e4umt (new version)"}, "length": "173627", "position": "4", "id": "6e178989-7d8e-3c33-9628-50bdda7c4483", "track_or_recording_length": "173627"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "barcode": "5050466625021", "asin": "B000095K86", "label-info-count": 1, "label-info-list": [{"catalog-number": "5050466-6250-2-1", "label": {"sort-name": "Warner Strategic Marketing", "label-code": "2828", "id": "640ea9b1-3811-4c06-8897-5918c16f9fe1", "name": "Warner Strategic Marketing"}}], "cover-art-archive": {"count": "2", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2003-05-19", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "packaging": "Slim Jewel Case", "text-representation": {"language": "deu", "script": "Latn"}, "date": "2003-05-19", "quality": "normal", "id": "f484a9fc-db21-4106-9408-bcd105c90047", "release-event-count": 1, "title": "Anyplace, Anywhere, Anytime", "country": "DE", "medium-count": 1, "artist-credit-phrase": "Nena & Kim Wilde", "medium-list": [{"position": "1", "track-count": 4, "format": "CD", "disc-list": [{"offset-list": [150, 17037, 35418, 53803], "id": "X2c2IQ5vUy5x6Jh7Xi_DGHtA1X8-", "sectors": "66872", "offset-count": 4}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "1", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "223000", "artist-credit-phrase": "Nena & Kim Wilde", "id": "fde5622c-ce23-4ebb-975d-51d4a926f901", "title": "Anyplace, Anywhere, Anytime (radio version)"}, "length": "225160", "position": "1", "id": "1cc96e78-28ed-3820-b0b6-614c35b121ac", "track_or_recording_length": "225160"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " mit ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "243453", "artist-credit-phrase": "Nena mit Kim Wilde", "id": "5f19758e-7421-4c71-a599-9a9575d8e1b0", "title": "Anyplace, Anywhere, Anytime (new version)"}, "length": "245080", "position": "2", "artist-credit-phrase": "Nena & Kim Wilde", "track_or_recording_length": "245080", "id": "f16db4bf-9a34-3d5a-a975-c9375ab7a2ca", "number": "2"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "3", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "243266", "artist-credit-phrase": "Nena", "id": "32706323-1a08-4c7e-bf21-9a44934498ba", "title": "Irgendwie, irgendwo, irgendwann (new version)"}, "length": "245133", "position": "3", "id": "ce2c4edd-6eab-36c8-8f84-e8c85f197a88", "track_or_recording_length": "245133"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "4", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "175440", "artist-credit-phrase": "Nena", "id": "ea70231c-cc03-4900-9a5a-43afb18ed638", "title": "Nur getr\u00e4umt (new version)"}, "length": "173627", "position": "4", "id": "6e178989-7d8e-3c33-9628-50bdda7c4483", "track_or_recording_length": "173627"}], "disc-count": 1}]}} \ No newline at end of file From 6d3f44ba9637535872efe304f5f744956121c606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 17:01:29 +0100 Subject: [PATCH 21/79] Change release used for testing missing release date MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous release has gotten a release date added since it was originally dumped from MusicBrainz. Signed-off-by: Frederik “Freso” S. Olesen --- whipper/test/test_common_mbngs.py | 8 +++++--- ...pper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json | 1 - ...pper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json create mode 100644 whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index 231fba77..aa5b01bf 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -12,13 +12,15 @@ class MetadataTestCase(unittest.TestCase): # Generated with rip -R cd info - def testJeffEverybodySingle(self): - filename = 'whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json' + def testMissingReleaseDate(self): + # Using: The KLF - Space & Chill Out + # https://musicbrainz.org/release/c56ff16e-1d81-47de-926f-ba22891bd2bd + filename = 'whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json' path = os.path.join(os.path.dirname(__file__), filename) handle = open(path, "rb") response = json.loads(handle.read()) handle.close() - discid = "wbjbST2jUHRZaB1inCyxxsL7Eqc-" + discid = "b.yqPuCBdsV5hrzDvYrw52iK_jE-" metadata = mbngs._getMetadata({}, response['release'], discid) diff --git a/whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json b/whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json deleted file mode 100644 index 700a9592..00000000 --- a/whipper/test/whipper.release.3451f29c-9bb8-4cc5-bfcc-bd50104b94f8.json +++ /dev/null @@ -1 +0,0 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "barcode": "9399700053173", "asin": "B00000891P", "label-info-count": 1, "label-info-list": [{"catalog-number": "665848.2", "label": {"label-code": "162", "sort-name": "Columbia", "disambiguation": "imprint owned by CBS between 1938\u20131990 within US/CA/MX; owned worldwide by Sony Music Entertainment since 1991 except in JP", "id": "011d1192-6f65-45bd-85c4-0400dd45693e", "name": "Columbia"}}], "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "release-event-list": [{"date": "1998", "area": {"sort-name": "Australia", "iso-3166-1-code-list": ["AU"], "id": "106e0bec-b638-3b37-b731-f53d507dc00e", "name": "Australia"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "1998", "quality": "normal", "id": "3451f29c-9bb8-4cc5-bfcc-bd50104b94f8", "release-event-count": 1, "title": "Everybody Here Wants You", "country": "AU", "medium-count": 1, "artist-credit-phrase": "Jeff Buckley", "medium-list": [{"position": "1", "track-count": 5, "format": "CD", "disc-list": [{"offset-list": [150, 21640, 36996, 58631, 101683], "id": "C6N7.QADBQ968Qr8OOjxfQlGtA8-", "sectors": "122983", "offset-count": 5}, {"offset-list": [150, 21640, 36996, 58631, 101683], "id": "wbjbST2jUHRZaB1inCyxxsL7Eqc-", "sectors": "122833", "offset-count": 5}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "1", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "285480", "artist-credit-phrase": "Jeff Buckley", "id": "8f8c284b-6818-4a66-a517-37dc8c04a881", "title": "Everybody Here Wants You"}, "length": "286533", "position": "1", "id": "0e611773-a7f2-3dfb-82f9-7f7915d3406e", "track_or_recording_length": "286533"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "2", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "204746", "artist-credit-phrase": "Jeff Buckley", "id": "7d939d14-06a2-478e-b279-ebe20fae8b2f", "title": "Thousand Fold"}, "length": "204746", "position": "2", "id": "1f2c5c05-c364-33f9-8845-5c14b1893bba", "track_or_recording_length": "204746"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "3", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "288466", "artist-credit-phrase": "Jeff Buckley", "id": "54323c4c-e0f6-4a81-8b80-e1c0b822a3f7", "title": "Eternal Life (road version)"}, "length": "288466", "position": "3", "id": "5158457a-091e-3923-b1c3-8b37038234ad", "track_or_recording_length": "288466"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "4", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "574026", "artist-credit-phrase": "Jeff Buckley", "id": "4dda67d1-8123-4545-9a78-7b4232089e96", "title": "Hallelujah (live)"}, "length": "574026", "position": "4", "id": "200de0b9-9221-351f-8109-8e53fc289fd5", "track_or_recording_length": "574026"}, {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "number": "5", "artist-credit-phrase": "Jeff Buckley", "recording": {"artist-credit": [{"artist": {"sort-name": "Buckley, Jeff", "id": "e6e879c0-3d56-4f12-b3c5-3ce459661a8e", "name": "Jeff Buckley"}}], "length": "284000", "artist-credit-phrase": "Jeff Buckley", "id": "5db42013-aa5c-4eb4-a549-46ca721990cf", "title": "Last Goodbye (live from Sydney)"}, "length": "284000", "position": "5", "id": "8ad80590-99d6-3c13-bf6b-8cc7f3b4998d", "track_or_recording_length": "284000"}], "disc-count": 2}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json b/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json new file mode 100644 index 00000000..09f5b838 --- /dev/null +++ b/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json @@ -0,0 +1 @@ +{"release": {"status": "Bootleg", "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "label-info-list": [], "title": "Space & Chill Out", "label-info-count": 0, "medium-count": 1, "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [182, 8067, 14985, 28407, 39920, 74532, 79825, 93370, 135732, 162415, 168137, 182882], "id": "b.yqPuCBdsV5hrzDvYrw52iK_jE-", "sectors": "355532", "offset-count": 12}], "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "107066", "artist-credit-phrase": "The KLF", "id": "254c95dd-71e2-4a38-8267-bdbe046c5ace", "title": "Brownsville Turnaround on the Tex-Mex Border"}, "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "105133", "title": "Brownsville Turnaround", "position": "1", "artist-credit-phrase": "The KLF", "track_or_recording_length": "105133", "id": "1f417f2b-e049-3ff1-9a08-d787dfd47b19", "number": "1"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "2", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "89000", "artist-credit-phrase": "The KLF", "id": "cfe7f2bb-ce37-434f-9d26-b0d523cd8e6e", "title": "Pulling Out of Ricardo and the Dusk Is Falling Fast"}, "length": "92240", "position": "2", "id": "2b6c44dc-e1bd-3feb-b889-746c0bb22eb9", "track_or_recording_length": "92240"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "3", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181040", "artist-credit-phrase": "The KLF", "id": "b8fcd38a-59df-4f1c-a944-f836e8592b94", "title": "Six Hours to Louisiana, Black Coffee Going Cold"}, "length": "178960", "position": "3", "id": "13639dfc-3332-31c6-8fb5-4d0241e81dde", "track_or_recording_length": "178960"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "4", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "155333", "artist-credit-phrase": "The KLF", "id": "20a3421a-36cd-4b60-8dfb-118caef8c6d8", "title": "Dream Time in Lake Jackson"}, "length": "153506", "position": "4", "id": "1b222630-1cc6-3f7e-9dc8-14d0d88ac054", "track_or_recording_length": "153506"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "5", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "460866", "artist-credit-phrase": "The KLF", "id": "bd90d2bf-fff9-4aaa-9c3f-7bacbc9d5421", "title": "Madrugada Eterna"}, "length": "461493", "position": "5", "id": "576a010d-1ea7-3525-a32b-2dce207d0ce3", "track_or_recording_length": "461493"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "6", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "68560", "artist-credit-phrase": "The KLF", "id": "5ea8a91d-5425-49ae-90f6-6acfefda4a59", "title": "Justified and Ancient Seems a Long Time Ago"}, "length": "70573", "position": "6", "id": "9e29c06a-c74b-3b0f-a170-98a1c0ea51d9", "track_or_recording_length": "70573"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "7", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181440", "artist-credit-phrase": "The KLF", "id": "f246f658-49c4-4efe-840e-c624b7850bc9", "title": "Elvis on the Radio, Steel Guitar in My Soul"}, "length": "180600", "position": "7", "id": "cdd8ed03-4b32-3c39-81f6-cd513369225e", "track_or_recording_length": "180600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "8", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "564933", "artist-credit-phrase": "The KLF", "id": "a173d428-4e12-4513-8df2-eb7f098e6364", "title": "3 A.M. Somewhere Out of Beaumont"}, "length": "564826", "position": "8", "id": "58a8cbf9-10a1-32c8-8cd7-f6893c5050ab", "track_or_recording_length": "564826"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "9", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "356000", "artist-credit-phrase": "The KLF", "id": "b7bc1dc2-a468-4948-b628-e03fc9265d41", "title": "Wichita Lineman Was a Song I Once Heard"}, "length": "355773", "position": "9", "id": "42679959-2e1a-3085-842a-a443ebc37733", "track_or_recording_length": "355773"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "10", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "76026", "artist-credit-phrase": "The KLF", "id": "035e349d-b581-4c0e-818f-ae14e10bc26f", "title": "Trancentral Lost in My Mind"}, "length": "76293", "position": "10", "id": "716fe2c9-47b8-3719-8586-e4ed47694a10", "track_or_recording_length": "76293"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "11", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "214266", "artist-credit-phrase": "The KLF", "id": "d9dd3bc7-ae2a-4b62-a545-8a60f5704a7d", "title": "The Lights of Baton Rouge Pass By"}, "length": "196600", "position": "11", "id": "3220c725-d7cb-3d81-8fb9-91e5a2f94cc9", "track_or_recording_length": "196600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Space", "disambiguation": "Jimmy Cauty's ambient off-shoot of The Orb/The KLF", "id": "22240df3-8dcc-4272-9294-d127442e7f36", "name": "Space"}}], "length": "2302560", "artist-credit-phrase": "Space", "id": "42391d00-df70-4014-83f8-e980a6b695b3", "title": "Mercury / Venus / Mars / Jupiter / Saturn / Uranus / Neptune / Pluto"}, "length": "2302000", "title": "Space", "position": "12", "artist-credit-phrase": "The KLF", "track_or_recording_length": "2302000", "id": "b65aa927-6edf-340b-82b4-fbc34a5f5a0b", "number": "12"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "artist-credit-phrase": "The KLF", "quality": "normal", "id": "c56ff16e-1d81-47de-926f-ba22891bd2bd"}} \ No newline at end of file From fce00f492efd42df0e6bedaf5e78c94799c3404e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 17:16:15 +0100 Subject: [PATCH 22/79] Change release used for testing [unknown] artist credits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previously used release has since had its [unknown] artist credit resolved since the data was originally taken from MusicBrainz. Using data from this release now: https://musicbrainz.org/release/8478d4da-0cda-4e46-ae8c-1eeacfa5cf37 Specifically: https://musicbrainz.org/track/a04ee451-46c3-3ad6-a815-d7bb8449d605 Signed-off-by: Frederik “Freso” S. Olesen --- whipper/test/test_common_mbngs.py | 41 ++++++++++--------- ....38b05c7d-65fe-4dc0-9c10-33a391b86703.json | 1 - ....8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json | 1 + 3 files changed, 22 insertions(+), 21 deletions(-) delete mode 100644 whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json create mode 100644 whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index aa5b01bf..5e472388 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -114,44 +114,45 @@ def testMalaInCuba(self): ';ec07a209-55ff-4084-bc41-9d4d1764e075' ';f626b92e-07b1-4a19-ad13-c09d690db66c') - def testNorthernGateway(self): + def testUnknownArtist(self): """ check the received metadata for artists tagged with [unknown] and artists tagged with an alias in MusicBrainz see https://github.com/whipper-team/whipper/issues/155 """ - filename = 'whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json' + # Using: CunninLynguists - Sloppy Seconds, Volume 1 + # https://musicbrainz.org/release/8478d4da-0cda-4e46-ae8c-1eeacfa5cf37 + filename = 'whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json' path = os.path.join(os.path.dirname(__file__), filename) handle = open(path, "rb") response = json.loads(handle.read()) handle.close() - discid = "rzGHHqfPWIq1GsOLhhlBcZuqo.I-" + discid = "RhrwgVb0hZNkabQCw1dZIhdbMFg-" metadata = mbngs._getMetadata({}, response['release'], discid) - self.assertEqual(metadata.artist, u'Various Artists') - self.assertEqual(metadata.release, u'2010') + self.assertEqual(metadata.artist, u'CunninLynguists') + self.assertEqual(metadata.release, u'2003') self.assertEqual(metadata.mbidArtist, - u'89ad4ac3-39f7-470e-963a-56509c546377') + u'69c4cc43-8163-41c5-ac81-30946d27bb69') - self.assertEqual(len(metadata.tracks), 10) + self.assertEqual(len(metadata.tracks), 30) - track2 = metadata.tracks[1] + track8 = metadata.tracks[7] - self.assertEqual(track2.artist, u'Twisted Reaction feat. Danielle') - self.assertEqual(track2.sortName, - u'Twisted Reaction feat. [unknown]') - self.assertEqual(track2.mbidArtist, - u'4f69f624-73ea-4a16-b822-bd2ca58032bf' - ';125ec42a-7229-4250-afc5-e057484327fe') + self.assertEqual(track8.artist, u'???') + self.assertEqual(track8.sortName, u'[unknown]') + self.assertEqual(track8.mbidArtist, + u'125ec42a-7229-4250-afc5-e057484327fe') - track4 = metadata.tracks[3] + track9 = metadata.tracks[8] - self.assertEqual(track4.artist, u'BioGenesis') - self.assertEqual(track4.sortName, - u'Bio Genesis') - self.assertEqual(track4.mbidArtist, - u'dd61b86c-c015-43e1-9a28-58fceb0975c8') + self.assertEqual(track9.artist, u'CunninLynguists feat. Tonedeff') + self.assertEqual(track9.sortName, + u'CunninLynguists feat. Tonedeff') + self.assertEqual(track9.mbidArtist, + u'69c4cc43-8163-41c5-ac81-30946d27bb69' + ';b3869d83-9fb5-4eac-b5ca-2d155fcbee12') def testNenaAndKimWildSingle(self): """ diff --git a/whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json b/whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json deleted file mode 100644 index d05fba3a..00000000 --- a/whipper/test/whipper.release.38b05c7d-65fe-4dc0-9c10-33a391b86703.json +++ /dev/null @@ -1 +0,0 @@ -{"release": {"status": "Promotion", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [], "title": "Northern Gateway", "release-event-count": 1, "medium-count": 1, "cover-art-archive": {"count": "3", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2010", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "medium-list": [{"position": "1", "track-count": 10, "format": "CD", "disc-list": [{"offset-list": [150, 31869, 65080, 100394, 137049, 176151, 205976, 236876, 269301, 301592], "id": "rzGHHqfPWIq1GsOLhhlBcZuqo.I-", "sectors": "333836", "offset-count": 10}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Bubble", "disambiguation": "Psytrance duo consisting of Guy Sernat and Karen Bagdasarov", "id": "4b136bbc-0bd1-4cb9-be8e-c251cf3666d4", "name": "Bubble"}}], "number": "1", "artist-credit-phrase": "Bubble", "recording": {"artist-credit": [{"artist": {"sort-name": "Bubble", "disambiguation": "Psytrance duo consisting of Guy Sernat and Karen Bagdasarov", "id": "4b136bbc-0bd1-4cb9-be8e-c251cf3666d4", "name": "Bubble"}}], "length": "422920", "artist-credit-phrase": "Bubble", "id": "b8eb2826-20ef-42f0-9df1-f66d8bac9f0f", "title": "Different Story"}, "length": "422920", "position": "1", "id": "33eabef0-24be-4d98-bb6a-aa5499854bd1", "track_or_recording_length": "422920"}, {"artist-credit": [{"artist": {"sort-name": "Twisted Reaction", "id": "4f69f624-73ea-4a16-b822-bd2ca58032bf", "name": "Twisted Reaction"}}, " feat. ", {"artist": {"sort-name": "Danielle", "disambiguation": "featured on \"New Generation of Science\" by Twisted Reaction", "id": "47ed312b-db38-4df5-ae82-cdc44850b0b6", "name": "Danielle"}}], "number": "2", "artist-credit-phrase": "Twisted Reaction feat. Danielle", "recording": {"artist-credit": [{"artist": {"sort-name": "Twisted Reaction", "id": "4f69f624-73ea-4a16-b822-bd2ca58032bf", "name": "Twisted Reaction"}}, " feat. ", {"artist": {"sort-name": "Danielle", "disambiguation": "featured on \"New Generation of Science\" by Twisted Reaction", "id": "47ed312b-db38-4df5-ae82-cdc44850b0b6", "name": "Danielle"}}], "length": "442813", "artist-credit-phrase": "Twisted Reaction feat. Danielle", "id": "ac52c692-6b13-401f-810b-d9b733b6594e", "title": "New Generation of Science"}, "length": "442813", "position": "2", "id": "ef43e443-f305-4085-b51c-db75ee1bdbfd", "track_or_recording_length": "442813"}, {"artist-credit": [{"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}, " & ", {"artist": {"sort-name": "Chris", "disambiguation": "has song \"Purest Form\" with Painkiller", "id": "1eee00df-9ca1-41eb-bb0c-889fff35293f", "name": "Chris"}}], "number": "3", "artist-credit-phrase": "Painkiller & Chris", "recording": {"artist-credit": [{"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}, " & ", {"artist": {"sort-name": "Chris", "disambiguation": "has song \"Purest Form\" with Painkiller", "id": "1eee00df-9ca1-41eb-bb0c-889fff35293f", "name": "Chris"}}], "length": "470853", "artist-credit-phrase": "Painkiller & Chris", "id": "311ffad5-9877-4c6a-9b48-160412835607", "title": "Purest Form"}, "length": "470853", "position": "3", "id": "098f0417-5449-4046-b006-08eefad21839", "track_or_recording_length": "470853"}, {"artist-credit": [{"name": "BioGenesis", "artist": {"sort-name": "Bio Genesis", "disambiguation": "Spanish psy-trance project", "id": "dd61b86c-c015-43e1-9a28-58fceb0975c8", "name": "Bio Genesis"}}], "number": "4", "artist-credit-phrase": "BioGenesis", "recording": {"artist-credit": [{"name": "BioGenesis", "artist": {"sort-name": "Bio Genesis", "disambiguation": "Spanish psy-trance project", "id": "dd61b86c-c015-43e1-9a28-58fceb0975c8", "name": "Bio Genesis"}}], "length": "488733", "artist-credit-phrase": "BioGenesis", "id": "b1c99a56-e802-4a34-919c-b754fa056a8f", "title": "Ride the Wave"}, "length": "488733", "position": "4", "id": "be9cac8e-d770-47cd-bc13-6189eac14e17", "track_or_recording_length": "488733"}, {"artist-credit": [{"name": "R.E.V.", "artist": {"sort-name": "Rev", "disambiguation": "psytrance artist Troy Leidich", "id": "d7f9d566-4341-4b19-8219-e3f2e84cf7a7", "name": "Rev"}}], "number": "5", "artist-credit-phrase": "R.E.V.", "recording": {"artist-credit": [{"name": "R.E.V.", "artist": {"sort-name": "Rev", "disambiguation": "psytrance artist Troy Leidich", "id": "d7f9d566-4341-4b19-8219-e3f2e84cf7a7", "name": "Rev"}}], "length": "521360", "artist-credit-phrase": "R.E.V.", "id": "8fe058dc-1cea-43ca-81b3-e2613ed315e4", "title": "PU 329"}, "length": "521360", "position": "5", "id": "6525bbd7-fdc4-45a2-b0d9-c8a7e723cfab", "track_or_recording_length": "521360"}, {"artist-credit": [{"artist": {"sort-name": "Schatzhauser", "disambiguation": "Psychedelic trance artist from Rostock,Germany", "id": "75110376-62a8-427e-a53c-67ad6adb06b1", "name": "Schatzhauser"}}], "number": "6", "artist-credit-phrase": "Schatzhauser", "recording": {"artist-credit": [{"artist": {"sort-name": "Schatzhauser", "disambiguation": "Psychedelic trance artist from Rostock,Germany", "id": "75110376-62a8-427e-a53c-67ad6adb06b1", "name": "Schatzhauser"}}], "length": "397666", "artist-credit-phrase": "Schatzhauser", "id": "c8aa0332-d0fd-428b-93ce-f14df73cb962", "title": "Wet Dreams"}, "length": "397666", "position": "6", "id": "00ab6a04-14d0-491f-9997-046339ee79fc", "track_or_recording_length": "397666"}, {"artist-credit": [{"artist": {"sort-name": "Audio Hijack", "id": "f4edc6b9-adea-436e-b855-f4463d34c77f", "name": "Audio Hijack"}}, " & ", {"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}], "number": "7", "artist-credit-phrase": "Audio Hijack & Painkiller", "recording": {"artist-credit": [{"artist": {"sort-name": "Audio Hijack", "id": "f4edc6b9-adea-436e-b855-f4463d34c77f", "name": "Audio Hijack"}}, " & ", {"artist": {"sort-name": "Painkiller", "disambiguation": "Psytrance artist based in Barcelona, Spain.", "id": "06391f11-b2a5-4168-8296-c0ed1b0fbe26", "name": "Painkiller"}}], "length": "412000", "artist-credit-phrase": "Audio Hijack & Painkiller", "id": "707305b1-fdb2-48df-8fc4-85955cdab049", "title": "Flying Oscillator"}, "length": "412000", "position": "7", "id": "9604b6d8-ccf4-465e-9b90-f8f463542b1c", "track_or_recording_length": "412000"}, {"artist-credit": [{"artist": {"sort-name": "Members of Mayday", "id": "620efc10-77da-428f-9d78-2ebc75760f46", "name": "Members of Mayday"}}], "number": "8", "artist-credit-phrase": "Members of Mayday", "recording": {"artist-credit": [{"artist": {"sort-name": "Members of Mayday", "id": "620efc10-77da-428f-9d78-2ebc75760f46", "name": "Members of Mayday"}}], "length": "432333", "artist-credit-phrase": "Members of Mayday", "id": "89225fc3-c062-4fa9-a858-3eebe3b276e0", "title": "Sonic Empire (SynSUN remix)"}, "length": "432333", "position": "8", "id": "9472e2af-47e1-422c-8ebd-046154347f16", "track_or_recording_length": "432333"}, {"artist-credit": [{"artist": {"sort-name": "DNA", "disambiguation": "Psy-Trance artists A-tan Injection & Zeev Kardonsky", "id": "97113e01-3faf-495e-9140-0f5913aa32fb", "name": "DNA"}}], "number": "9", "artist-credit-phrase": "DNA", "recording": {"artist-credit": [{"artist": {"sort-name": "DNA", "disambiguation": "Psy-Trance artists A-tan Injection & Zeev Kardonsky", "id": "97113e01-3faf-495e-9140-0f5913aa32fb", "name": "DNA"}}], "length": "430546", "artist-credit-phrase": "DNA", "id": "ccd46826-4306-4795-8db1-2e500b8fdfd3", "title": "Signal 5"}, "length": "430546", "position": "9", "id": "39e389b4-e649-4222-857c-0fc471b8989c", "track_or_recording_length": "430546"}, {"artist-credit": [{"artist": {"sort-name": "Mekkanikka", "disambiguation": "Psychedelic trance artist [Nicolas Oesch]", "id": "41b8ca73-8460-4aaa-8dd8-5484c714dfdc", "name": "Mekkanikka"}}], "number": "10", "artist-credit-phrase": "Mekkanikka", "recording": {"artist-credit": [{"artist": {"sort-name": "Mekkanikka", "disambiguation": "Psychedelic trance artist [Nicolas Oesch]", "id": "41b8ca73-8460-4aaa-8dd8-5484c714dfdc", "name": "Mekkanikka"}}], "length": "429920", "artist-credit-phrase": "Mekkanikka", "id": "76290178-6b32-469f-945a-8ef28b3269f7", "title": "Hawain Snow"}, "length": "429920", "position": "10", "id": "07b79fd2-4da8-4331-946d-de08f50d1d9a", "track_or_recording_length": "429920"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "label-info-count": 0, "country": "DE", "date": "2010", "artist-credit-phrase": "Various Artists", "quality": "normal", "id": "38b05c7d-65fe-4dc0-9c10-33a391b86703"}} \ No newline at end of file diff --git a/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json b/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json new file mode 100644 index 00000000..961de26a --- /dev/null +++ b/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json @@ -0,0 +1 @@ +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "label-info-list": [{"catalog-number": "BP723-2", "label": {"sort-name": "Freshchest", "id": "fcd792aa-7fd4-4438-9ce3-35dceb156b83", "name": "Freshchest"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2003", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2003", "quality": "normal", "id": "8478d4da-0cda-4e46-ae8c-1eeacfa5cf37", "release-event-count": 1, "title": "Sloppy Seconds, Volume 1", "country": "US", "artist-credit-phrase": "CunninLynguists", "medium-list": [{"position": "1", "track-count": 30, "format": "CD", "disc-list": [{"offset-list": [150, 16982, 29710, 38768, 58738, 70167, 78721, 81844, 86334, 102549, 105097, 114494, 128067, 142341, 149139, 170938, 188766, 200610, 217291, 223081, 231298, 240204, 253311, 269573, 282860, 296839, 310659, 314148, 328990, 331951], "id": "RhrwgVb0hZNkabQCw1dZIhdbMFg-", "sectors": "350674", "offset-count": 30}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "number": "1", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "224426", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "2b2b9382-3097-44ac-b79f-82d9e3d23ede", "title": "We're From the Internet (skit)"}, "length": "224426", "position": "1", "id": "9bee2534-0184-32e9-90b4-cd437a2d71ca", "track_or_recording_length": "224426"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "2", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "169706", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "id": "b8cc8672-8bdd-4007-82e0-ca3641816ca9", "title": "Pump It Up Freestyle"}, "length": "169706", "position": "2", "id": "2997a739-6f10-344e-a3c3-5d0037ee6e51", "track_or_recording_length": "169706"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "3", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "120773", "artist-credit-phrase": "Deacon the Villain", "id": "86cf3e45-3649-4cba-a9e8-2d5016971d2d", "title": "Watch Yo Mowf"}, "length": "120773", "position": "3", "id": "4fae0fab-544d-31e1-a861-549bcd700570", "track_or_recording_length": "120773"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "4", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "266266", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "id": "aef41bb9-0fbf-4439-b3c4-acf0c67d7095", "title": "Over the Hills"}, "length": "266266", "position": "4", "id": "a9c177ea-2f8b-39b5-880c-72e506e15946", "track_or_recording_length": "266266"}, {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "number": "5", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "recording": {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "length": "152386", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "id": "54549fd0-f79c-45f5-89d8-f5a21d115e2e", "title": "P.T.A."}, "length": "152386", "position": "5", "id": "43740b12-fc31-32d3-95e2-e9eb6ddb1113", "track_or_recording_length": "152386"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "6", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "114053", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "5eb21493-6e55-4c91-a36d-a7fbfd46333c", "title": "Skew It on the Bar-B Freestyle"}, "length": "114053", "position": "6", "id": "f74fcf48-30b8-3ef7-9dac-72ae1f86ebbc", "track_or_recording_length": "114053"}, {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "number": "7", "artist-credit-phrase": "Chico & the Man", "recording": {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "length": "41640", "artist-credit-phrase": "Chico & the Man", "id": "377ac3ee-397a-41ce-a80c-64883f6b6f0d", "title": "Chico and the Man LP Drop"}, "length": "41640", "position": "7", "id": "efc7987f-6e34-3105-8a34-64bf3c244664", "track_or_recording_length": "41640"}, {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "number": "8", "artist-credit-phrase": "???", "recording": {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "length": "59866", "artist-credit-phrase": "???", "id": "931863f4-05e1-46a5-b81e-4c0417a88fd6", "title": "???"}, "length": "59866", "position": "8", "id": "a04ee451-46c3-3ad6-a815-d7bb8449d605", "track_or_recording_length": "59866"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "212333", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "f2dc4fa7-f7a5-4c60-9819-e80adfe1f3de", "title": "Love Ain\u2019t (remix)"}, "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "216200", "title": "Love Ain't (remix)", "position": "9", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "track_or_recording_length": "216200", "id": "f5ef38ad-b7ba-3152-8ffb-de63146e58e0", "number": "9"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "10", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "33973", "artist-credit-phrase": "Deacon the Villain", "id": "548dec24-bf29-4615-bcd9-93d423368c08", "title": "Deacon the Villain LP Drop"}, "length": "33973", "position": "10", "id": "15b88810-680e-36dc-a937-969582d864b1", "track_or_recording_length": "33973"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "11", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "125293", "artist-credit-phrase": "Deacon the Villain", "id": "4c97aed9-9200-482f-a35e-60a17d0ab764", "title": "Affirmative Action Freestyle"}, "length": "125293", "position": "11", "id": "9ddd49a6-c2f1-327d-bcb2-4abd645a66cd", "track_or_recording_length": "125293"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "12", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "180973", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "id": "4b1f0c69-4956-4d91-8ee6-b6e8bd95a70f", "title": "Sticky Green"}, "length": "180973", "position": "12", "id": "85066330-eefd-3e45-8640-4949fcd9bd24", "track_or_recording_length": "180973"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "13", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "190320", "artist-credit-phrase": "Mr. SOS", "id": "61105c6b-fc5e-4507-9b82-31e9ae620422", "title": "Earth's Essence"}, "length": "190320", "position": "13", "id": "d5dc3651-dffc-3cba-a30e-9d9411dbd0f0", "track_or_recording_length": "190320"}, {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "number": "14", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "recording": {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "length": "90640", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "id": "68b76219-e5dd-4b93-bf33-39e7d76ceaa3", "title": "If U Only Knew"}, "length": "90640", "position": "14", "id": "5266bddc-cbca-3310-af98-0a4531c8c150", "track_or_recording_length": "90640"}, {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "15", "artist-credit-phrase": "J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "290653", "artist-credit-phrase": "J. Bully", "id": "4f584807-328c-466d-8ed9-cd999c3ef17b", "title": "Off the Chain"}, "length": "290653", "position": "15", "id": "1499cc7a-a6b4-3b35-bd55-99616cea0c03", "track_or_recording_length": "290653"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "number": "16", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "length": "237706", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "id": "ffd83bc9-9344-4c1d-a96f-81e43a4e2729", "title": "Mic Like a Memory (remix)"}, "length": "237706", "position": "16", "id": "09b26577-5004-3f97-837c-4f2566b720e0", "track_or_recording_length": "237706"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "number": "17", "artist-credit-phrase": "CunninLynguists", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "length": "157920", "artist-credit-phrase": "CunninLynguists", "id": "585963b2-de5a-44d1-9241-f046cf93b50f", "title": "The Fellationelles (skit)"}, "length": "157920", "position": "17", "id": "4f22deb8-1ef3-3ba5-9b1b-0fd04d2156bc", "track_or_recording_length": "157920"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "18", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "222413", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "id": "8043db30-f208-442e-96e2-ddbd3031e1b9", "title": "Nasty Filthy (remix)"}, "length": "222413", "position": "18", "id": "210a235b-848e-3bce-b1bd-cead7161d4d4", "track_or_recording_length": "222413"}, {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "19", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "77200", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "id": "cf465ac5-6b42-4ce3-b982-f46558e1b369", "title": "Irrational"}, "length": "77200", "position": "19", "id": "fe48d5e1-3664-33b0-9bb1-e50fa4cdd000", "track_or_recording_length": "77200"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "20", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "109560", "artist-credit-phrase": "Mr. SOS", "id": "fed3eae2-a991-4e01-abae-8deb024020d2", "title": "Dem Thangs Freestyle"}, "length": "109560", "position": "20", "id": "0414ac89-51c8-3891-baad-a54eb89ca8f3", "track_or_recording_length": "109560"}, {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "21", "artist-credit-phrase": "Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "118746", "artist-credit-phrase": "Kno", "id": "fc1a987d-27fd-4f44-8968-9da3f9b223df", "title": "Never Scared Freestyle (Philaflava Drop remix)"}, "length": "118746", "position": "21", "id": "d1441885-ef76-32ae-979e-b54d63846447", "track_or_recording_length": "118746"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "22", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "174760", "artist-credit-phrase": "Deacon the Villain", "id": "0d06dddc-a851-4fb5-a20d-36b550825415", "title": "Lay Low Freestyle (Philaflava Drop)"}, "length": "174760", "position": "22", "id": "b4f61c9d-f08a-3477-addf-f4db497ad786", "track_or_recording_length": "174760"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "number": "23", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "length": "216826", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "id": "b0932e20-4172-4e37-bf4b-00f4e0984764", "title": "Seasons (remix)"}, "length": "216826", "position": "23", "id": "36bc053e-1b5d-3b20-b187-045cbbb5c1e6", "track_or_recording_length": "216826"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "24", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "177160", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "964be293-f5bf-4918-9a7f-05f410311f8c", "title": "Made You Look Freestyle"}, "length": "177160", "position": "24", "id": "4daaeae0-7328-381d-9cff-68c9d609189e", "track_or_recording_length": "177160"}, {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "25", "artist-credit-phrase": "Chapter 13 feat. Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "186386", "artist-credit-phrase": "Chapter 13 feat. Kno", "id": "23dc2d05-96d8-4f4d-bb89-48cf67d6ba9a", "title": "Rock Stars"}, "length": "186386", "position": "25", "id": "296183bf-d3ae-35c8-8540-6b5afd26ecd8", "track_or_recording_length": "186386"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "26", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "184266", "artist-credit-phrase": "Deacon the Villain", "id": "9fff281c-36a3-4bfc-9d3c-ca5686d46729", "title": "Welcome to NY Freestyle"}, "length": "184266", "position": "26", "id": "3a5c05c5-06d9-3680-883e-82698bb48fb5", "track_or_recording_length": "184266"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "27", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "46520", "artist-credit-phrase": "Mr. SOS", "id": "6af81f1f-e096-4e46-a8ef-19c5c1f20ca5", "title": "Mr. SOS LP Drop"}, "length": "46520", "position": "27", "id": "3757cce8-1db3-39be-b961-49594a6f5acb", "track_or_recording_length": "46520"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "28", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "197893", "artist-credit-phrase": "Mr. SOS", "id": "c56910c3-e3c6-47d5-b0f5-f2d3eb5f94b7", "title": "Rap Name Freestyle"}, "length": "197893", "position": "28", "id": "8bae4909-52f5-3449-a25d-94839cef4d98", "track_or_recording_length": "197893"}, {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "number": "29", "artist-credit-phrase": "Cashmere The PRO", "recording": {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "length": "39480", "artist-credit-phrase": "Cashmere The PRO", "id": "2dac6cd1-d417-4f56-ac6a-2f1649db7973", "title": "Cashmere the PRO LP Drop"}, "length": "39480", "position": "29", "id": "53a3c755-b1ec-37af-abee-ab786f916495", "track_or_recording_length": "39480"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "number": "30", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "length": "248987", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "id": "e0e01c45-9f38-4cf5-aba9-b3bab76d8e9e", "title": "Magic Stick Freestyle"}, "length": "248987", "position": "30", "id": "399d05a4-71d7-3fcc-83c0-5403ab42ec4f", "track_or_recording_length": "248987"}], "disc-count": 1}]}} \ No newline at end of file From 41b1b1feff75672b4f9a009f803af1b4e465d27d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 17:56:39 +0100 Subject: [PATCH 23/79] Add Track MBIDs to ripped files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://musicbrainz.org/doc/Track First part of https://github.com/whipper-team/whipper/issues/200 Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 4 +++- whipper/common/program.py | 4 +++- whipper/test/test_common_mbngs.py | 8 ++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 3400e93a..4165f8aa 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -52,6 +52,7 @@ class TrackMetadata(object): mbid = None sortName = None mbidArtist = None + mbidRecording = None class DiscMetadata(object): @@ -229,7 +230,8 @@ def _getMetadata(releaseShort, release, discid, country=None): track.mbidArtist = trackCredit.getIds() track.title = t['recording']['title'] - track.mbid = t['recording']['id'] + track.mbid = t['id'] + track.mbidRecording = t['recording']['id'] # FIXME: unit of duration ? track.duration = int(t['recording'].get('length', 0)) diff --git a/whipper/common/program.py b/whipper/common/program.py index 1cb67b13..98228ea0 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -393,7 +393,8 @@ def getTagList(self, number, mbdiscid): track = self.metadata.tracks[number - 1] trackArtist = track.artist title = track.title - mbidRecording = track.mbid + mbidRecording = track.mbidRecording + mbidTrack = track.mbid mbidTrackArtist = track.mbidArtist except IndexError as e: logger.error('no track %d found, %r', number, e) @@ -420,6 +421,7 @@ def getTagList(self, number, mbdiscid): tags['DATE'] = self.metadata.release if number > 0: + tags['MUSICBRAINZ_RELEASETRACKID'] = mbidTrack tags['MUSICBRAINZ_TRACKID'] = mbidRecording tags['MUSICBRAINZ_ARTISTID'] = mbidTrackArtist tags['MUSICBRAINZ_ALBUMID'] = mbidRelease diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index 5e472388..a75da35b 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -182,6 +182,10 @@ def testNenaAndKimWildSingle(self): self.assertEqual(track1.mbidArtist, u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76' ';4b462375-c508-432a-8c88-ceeec38b16ae') + self.assertEqual(track1.mbid, + u'1cc96e78-28ed-3820-b0b6-614c35b121ac') + self.assertEqual(track1.mbidRecording, + u'fde5622c-ce23-4ebb-975d-51d4a926f901') track2 = metadata.tracks[1] @@ -190,3 +194,7 @@ def testNenaAndKimWildSingle(self): self.assertEqual(track2.mbidArtist, u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76' ';4b462375-c508-432a-8c88-ceeec38b16ae') + self.assertEqual(track2.mbid, + u'f16db4bf-9a34-3d5a-a975-c9375ab7a2ca') + self.assertEqual(track2.mbidRecording, + u'5f19758e-7421-4c71-a599-9a9575d8e1b0') From c963b0173ba44d1701f59eceeaa7c2db5a79633e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 19:03:15 +0100 Subject: [PATCH 24/79] Add Release Group MBIDs to ripped files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://musicbrainz.org/doc/Release_Group Second part of https://github.com/whipper-team/whipper/issues/200 (MusicBrainz JSON test data dumps needed to be refreshed due to the new `includes` in the MusicBrainz web service call.) Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 5 ++++- whipper/common/program.py | 2 ++ ...whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json | 2 +- ...whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json | 2 +- ...whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json | 2 +- ...whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json | 2 +- ...whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json | 2 +- ...whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json | 2 +- ...whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json | 2 +- 9 files changed, 13 insertions(+), 8 deletions(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 4165f8aa..25d3c029 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -76,6 +76,7 @@ class DiscMetadata(object): releaseType = None mbid = None + mbidReleaseGroup = None mbidArtist = None url = None @@ -189,6 +190,7 @@ def _getMetadata(releaseShort, release, discid, country=None): discMD.release = release['date'] discMD.mbid = release['id'] + discMD.mbidReleaseGroup = release['release-group']['id'] discMD.mbidArtist = discCredit.getIds() discMD.url = 'https://musicbrainz.org/release/' + release['id'] @@ -305,7 +307,8 @@ def musicbrainz(discid, country=None, record=False): res = musicbrainzngs.get_release_by_id( release['id'], includes=["artists", "artist-credits", - "recordings", "discids", "labels"]) + "recordings", "discids", "labels", + "release-groups"]) _record(record, 'release', release['id'], res) releaseDetail = res['release'] formatted = json.dumps(releaseDetail, sort_keys=False, indent=4) diff --git a/whipper/common/program.py b/whipper/common/program.py index 98228ea0..283e1a8f 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -386,6 +386,7 @@ def getTagList(self, number, mbdiscid): releaseArtist = self.metadata.artist disc = self.metadata.title mbidRelease = self.metadata.mbid + mbidReleaseGroup = self.metadata.mbidReleaseGroup mbidReleaseArtist = self.metadata.mbidArtist if number > 0: @@ -425,6 +426,7 @@ def getTagList(self, number, mbdiscid): tags['MUSICBRAINZ_TRACKID'] = mbidRecording tags['MUSICBRAINZ_ARTISTID'] = mbidTrackArtist tags['MUSICBRAINZ_ALBUMID'] = mbidRelease + tags['MUSICBRAINZ_RELEASEGROUPID'] = mbidReleaseGroup tags['MUSICBRAINZ_ALBUMARTISTID'] = mbidReleaseArtist # TODO/FIXME: ISRC tag diff --git a/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json b/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json index 121283c6..d0cf1132 100644 --- a/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json +++ b/whipper/test/whipper.release.61c6fd9b-18f8-4a45-963a-ba3c5d990cae.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "barcode": "5060180321505", "asin": "B008R78K1Y", "label-info-count": 1, "label-info-list": [{"catalog-number": "BWOOD090CD", "label": {"sort-name": "Brownswood Recordings", "disambiguation": "London-based indie founded by Gilles Peterson", "id": "6483a614-d00f-42b0-af39-a602b3ce5daa", "name": "Brownswood Recordings"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2012-09-17", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2012-09-17", "quality": "normal", "id": "61c6fd9b-18f8-4a45-963a-ba3c5d990cae", "release-event-count": 1, "title": "Mala in Cuba", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Mala", "medium-list": [{"position": "1", "track-count": 14, "format": "CD", "disc-list": [{"offset-list": [150, 11805, 26477, 44689, 64471, 85060, 102145, 122897, 142995, 161481, 180255, 193305, 213610, 232499], "id": "u0aKVpO.59JBy6eQRX2vYcoqQZ0-", "sectors": "257868", "offset-count": 14}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "1", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "155400", "artist-credit-phrase": "Mala", "id": "3fa9c442-6ae7-4242-ae3b-0150a3002da4", "title": "Introduction"}, "length": "155400", "position": "1", "id": "fda06ef7-6d59-3af1-a897-4852575d1add", "track_or_recording_length": "155400"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "2", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "195626", "artist-credit-phrase": "Mala", "id": "983ad5e0-c52e-459d-8828-85718ceff2cc", "title": "Mulata"}, "length": "195626", "position": "2", "id": "6618aa8c-911d-3ab4-922c-a5405e0b77c4", "track_or_recording_length": "195626"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "3", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "242826", "artist-credit-phrase": "Mala", "id": "6855abf0-32a3-4fe2-a3fb-858f3157d42b", "title": "Tribal"}, "length": "242826", "position": "3", "id": "96ed49dc-94d4-3198-8436-cd1b1c947cf9", "track_or_recording_length": "242826"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "4", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "263760", "artist-credit-phrase": "Mala", "id": "2f938885-94ad-4b11-b251-f18c3a2a5fa9", "title": "Changuito"}, "length": "263760", "position": "4", "id": "119b9624-b2b8-3adb-a1a9-f229c69457a4", "track_or_recording_length": "263760"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "5", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "274520", "artist-credit-phrase": "Mala", "id": "a5ecfa15-06d0-44cf-a28e-c748e8270488", "title": "Revolution"}, "length": "274520", "position": "5", "id": "6abb43f7-e192-3fe2-bd9a-c2e3fadfb98d", "track_or_recording_length": "274520"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Dreiser", "id": "ec07a209-55ff-4084-bc41-9d4d1764e075", "name": "Dreiser"}}, " & ", {"artist": {"sort-name": "Sexto Sentido", "id": "f626b92e-07b1-4a19-ad13-c09d690db66c", "name": "Sexto Sentido"}}], "number": "6", "artist-credit-phrase": "Mala feat. Dreiser & Sexto Sentido", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Dreiser", "id": "ec07a209-55ff-4084-bc41-9d4d1764e075", "name": "Dreiser"}}, " & ", {"artist": {"sort-name": "Sexto Sentido", "id": "f626b92e-07b1-4a19-ad13-c09d690db66c", "name": "Sexto Sentido"}}], "length": "227800", "artist-credit-phrase": "Mala feat. Dreiser & Sexto Sentido", "id": "cfb3ddaf-584c-4c86-b58c-752c63977bb8", "title": "Como como"}, "length": "227800", "position": "6", "id": "78e43595-6dff-3bb5-a5af-7f5cd9bbee27", "track_or_recording_length": "227800"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "7", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "276693", "artist-credit-phrase": "Mala", "id": "90da8ada-21e2-4e7b-ab46-ff04004a3d84", "title": "Cuba Electronic"}, "length": "276693", "position": "7", "id": "5edaa191-ecb5-3b88-ae04-3d42b42b5cf4", "track_or_recording_length": "276693"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "8", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "267973", "artist-credit-phrase": "Mala", "id": "2bf67b46-30f5-4746-ab91-4c9675221a21", "title": "The Tunnel"}, "length": "267973", "position": "8", "id": "8b6940ac-7dde-312e-b1bb-573ff8905711", "track_or_recording_length": "267973"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "9", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "246480", "artist-credit-phrase": "Mala", "id": "0cd61fa9-a97a-41e3-b3c3-db36f633b611", "title": "Ghost"}, "length": "246480", "position": "9", "id": "ae5ef0e1-c72a-302c-8e30-c012e50a042c", "track_or_recording_length": "246480"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "10", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "250320", "artist-credit-phrase": "Mala", "id": "136989e9-f24f-4872-9026-1487869cc8de", "title": "Curfew"}, "length": "250320", "position": "10", "id": "172a577a-0f9d-3f20-815c-a24285ad315f", "track_or_recording_length": "250320"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "11", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "174000", "artist-credit-phrase": "Mala", "id": "26b6fd89-7021-4239-b6a7-76eca8c0515a", "title": "The Tourist"}, "length": "174000", "position": "11", "id": "9d670bd5-dc8e-365f-9324-4eac9a719d0c", "track_or_recording_length": "174000"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "12", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "270733", "artist-credit-phrase": "Mala", "id": "62f7a892-f63b-4a2b-866f-db2a36533f8c", "title": "Change"}, "length": "270733", "position": "12", "id": "cb00f633-aafd-3989-84be-17ce08503827", "track_or_recording_length": "270733"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "13", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "251854", "artist-credit-phrase": "Mala", "id": "4395c91a-d5e9-4fe4-92d2-deee3e0ebb5a", "title": "Calle F"}, "length": "251853", "position": "13", "id": "30e2f1b6-b91f-3087-acb2-e1ca4ef1c571", "track_or_recording_length": "251853"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"name": "Danay Suarez", "artist": {"sort-name": "Su\u00e1rez, Danay", "id": "82f04998-7da8-4259-aa7f-d623e6ea2b91", "name": "Danay Su\u00e1rez"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Su\u00e1rez, Danay", "id": "82f04998-7da8-4259-aa7f-d623e6ea2b91", "name": "Danay Su\u00e1rez"}}], "length": "338253", "artist-credit-phrase": "Mala feat. Danay Su\u00e1rez", "id": "e47a4fd9-8359-4a33-add8-e8c690e59055", "title": "Noche sue\u00f1os"}, "length": "338253", "position": "14", "artist-credit-phrase": "Mala feat. Danay Suarez", "track_or_recording_length": "338253", "id": "316baa17-37d5-357d-be8a-1d88c7e83876", "number": "14"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "barcode": "5060180321505", "asin": "B008R78K1Y", "label-info-count": 1, "label-info-list": [{"catalog-number": "BWOOD090CD", "label": {"sort-name": "Brownswood Recordings", "disambiguation": "London-based indie founded by Gilles Peterson", "id": "6483a614-d00f-42b0-af39-a602b3ce5daa", "name": "Brownswood Recordings"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2012-09-17", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2012-09-17", "quality": "normal", "id": "61c6fd9b-18f8-4a45-963a-ba3c5d990cae", "release-event-count": 1, "title": "Mala in Cuba", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Mala", "release-group": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "first-release-date": "2012-09-17", "primary-type": "Album", "title": "Mala in Cuba", "type": "Album", "id": "bf671d21-7e75-498a-80cd-1a83456a897f", "artist-credit-phrase": "Mala"}, "medium-list": [{"position": "1", "track-count": 14, "format": "CD", "disc-list": [{"offset-list": [150, 11805, 26477, 44689, 64471, 85060, 102145, 122897, 142995, 161481, 180255, 193305, 213610, 232499], "id": "u0aKVpO.59JBy6eQRX2vYcoqQZ0-", "sectors": "257868", "offset-count": 14}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "1", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "155400", "artist-credit-phrase": "Mala", "id": "3fa9c442-6ae7-4242-ae3b-0150a3002da4", "title": "Introduction"}, "length": "155400", "position": "1", "id": "fda06ef7-6d59-3af1-a897-4852575d1add", "track_or_recording_length": "155400"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "2", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "195626", "artist-credit-phrase": "Mala", "id": "983ad5e0-c52e-459d-8828-85718ceff2cc", "title": "Mulata"}, "length": "195626", "position": "2", "id": "6618aa8c-911d-3ab4-922c-a5405e0b77c4", "track_or_recording_length": "195626"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "3", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "242826", "artist-credit-phrase": "Mala", "id": "6855abf0-32a3-4fe2-a3fb-858f3157d42b", "title": "Tribal"}, "length": "242826", "position": "3", "id": "96ed49dc-94d4-3198-8436-cd1b1c947cf9", "track_or_recording_length": "242826"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "4", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "263760", "artist-credit-phrase": "Mala", "id": "2f938885-94ad-4b11-b251-f18c3a2a5fa9", "title": "Changuito"}, "length": "263760", "position": "4", "id": "119b9624-b2b8-3adb-a1a9-f229c69457a4", "track_or_recording_length": "263760"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "5", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "274520", "artist-credit-phrase": "Mala", "id": "a5ecfa15-06d0-44cf-a28e-c748e8270488", "title": "Revolution"}, "length": "274520", "position": "5", "id": "6abb43f7-e192-3fe2-bd9a-c2e3fadfb98d", "track_or_recording_length": "274520"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Dreiser", "id": "ec07a209-55ff-4084-bc41-9d4d1764e075", "name": "Dreiser"}}, " & ", {"artist": {"sort-name": "Sexto Sentido", "id": "f626b92e-07b1-4a19-ad13-c09d690db66c", "name": "Sexto Sentido"}}], "number": "6", "artist-credit-phrase": "Mala feat. Dreiser & Sexto Sentido", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Dreiser", "id": "ec07a209-55ff-4084-bc41-9d4d1764e075", "name": "Dreiser"}}, " & ", {"artist": {"sort-name": "Sexto Sentido", "id": "f626b92e-07b1-4a19-ad13-c09d690db66c", "name": "Sexto Sentido"}}], "length": "227800", "artist-credit-phrase": "Mala feat. Dreiser & Sexto Sentido", "id": "cfb3ddaf-584c-4c86-b58c-752c63977bb8", "title": "Como como"}, "length": "227800", "position": "6", "id": "78e43595-6dff-3bb5-a5af-7f5cd9bbee27", "track_or_recording_length": "227800"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "7", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "276693", "artist-credit-phrase": "Mala", "id": "90da8ada-21e2-4e7b-ab46-ff04004a3d84", "title": "Cuba Electronic"}, "length": "276693", "position": "7", "id": "5edaa191-ecb5-3b88-ae04-3d42b42b5cf4", "track_or_recording_length": "276693"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "8", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "267973", "artist-credit-phrase": "Mala", "id": "2bf67b46-30f5-4746-ab91-4c9675221a21", "title": "The Tunnel"}, "length": "267973", "position": "8", "id": "8b6940ac-7dde-312e-b1bb-573ff8905711", "track_or_recording_length": "267973"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "9", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "246480", "artist-credit-phrase": "Mala", "id": "0cd61fa9-a97a-41e3-b3c3-db36f633b611", "title": "Ghost"}, "length": "246480", "position": "9", "id": "ae5ef0e1-c72a-302c-8e30-c012e50a042c", "track_or_recording_length": "246480"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "10", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "250320", "artist-credit-phrase": "Mala", "id": "136989e9-f24f-4872-9026-1487869cc8de", "title": "Curfew"}, "length": "250320", "position": "10", "id": "172a577a-0f9d-3f20-815c-a24285ad315f", "track_or_recording_length": "250320"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "11", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "174000", "artist-credit-phrase": "Mala", "id": "26b6fd89-7021-4239-b6a7-76eca8c0515a", "title": "The Tourist"}, "length": "174000", "position": "11", "id": "9d670bd5-dc8e-365f-9324-4eac9a719d0c", "track_or_recording_length": "174000"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "12", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "270733", "artist-credit-phrase": "Mala", "id": "62f7a892-f63b-4a2b-866f-db2a36533f8c", "title": "Change"}, "length": "270733", "position": "12", "id": "cb00f633-aafd-3989-84be-17ce08503827", "track_or_recording_length": "270733"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "number": "13", "artist-credit-phrase": "Mala", "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}], "length": "251854", "artist-credit-phrase": "Mala", "id": "4395c91a-d5e9-4fe4-92d2-deee3e0ebb5a", "title": "Calle F"}, "length": "251853", "position": "13", "id": "30e2f1b6-b91f-3087-acb2-e1ca4ef1c571", "track_or_recording_length": "251853"}, {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"name": "Danay Suarez", "artist": {"sort-name": "Su\u00e1rez, Danay", "id": "82f04998-7da8-4259-aa7f-d623e6ea2b91", "name": "Danay Su\u00e1rez"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Mala", "disambiguation": "dubstep artist Mark Lawrence", "id": "09f221eb-c97e-4da5-ac22-d7ab7c555bbb", "name": "Mala"}}, " feat. ", {"artist": {"sort-name": "Su\u00e1rez, Danay", "id": "82f04998-7da8-4259-aa7f-d623e6ea2b91", "name": "Danay Su\u00e1rez"}}], "length": "338253", "artist-credit-phrase": "Mala feat. Danay Su\u00e1rez", "id": "e47a4fd9-8359-4a33-add8-e8c690e59055", "title": "Noche sue\u00f1os"}, "length": "338253", "position": "14", "artist-credit-phrase": "Mala feat. Danay Suarez", "track_or_recording_length": "338253", "id": "316baa17-37d5-357d-be8a-1d88c7e83876", "number": "14"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json b/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json index 961de26a..b5a7de88 100644 --- a/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json +++ b/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "label-info-list": [{"catalog-number": "BP723-2", "label": {"sort-name": "Freshchest", "id": "fcd792aa-7fd4-4438-9ce3-35dceb156b83", "name": "Freshchest"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2003", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2003", "quality": "normal", "id": "8478d4da-0cda-4e46-ae8c-1eeacfa5cf37", "release-event-count": 1, "title": "Sloppy Seconds, Volume 1", "country": "US", "artist-credit-phrase": "CunninLynguists", "medium-list": [{"position": "1", "track-count": 30, "format": "CD", "disc-list": [{"offset-list": [150, 16982, 29710, 38768, 58738, 70167, 78721, 81844, 86334, 102549, 105097, 114494, 128067, 142341, 149139, 170938, 188766, 200610, 217291, 223081, 231298, 240204, 253311, 269573, 282860, 296839, 310659, 314148, 328990, 331951], "id": "RhrwgVb0hZNkabQCw1dZIhdbMFg-", "sectors": "350674", "offset-count": 30}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "number": "1", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "224426", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "2b2b9382-3097-44ac-b79f-82d9e3d23ede", "title": "We're From the Internet (skit)"}, "length": "224426", "position": "1", "id": "9bee2534-0184-32e9-90b4-cd437a2d71ca", "track_or_recording_length": "224426"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "2", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "169706", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "id": "b8cc8672-8bdd-4007-82e0-ca3641816ca9", "title": "Pump It Up Freestyle"}, "length": "169706", "position": "2", "id": "2997a739-6f10-344e-a3c3-5d0037ee6e51", "track_or_recording_length": "169706"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "3", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "120773", "artist-credit-phrase": "Deacon the Villain", "id": "86cf3e45-3649-4cba-a9e8-2d5016971d2d", "title": "Watch Yo Mowf"}, "length": "120773", "position": "3", "id": "4fae0fab-544d-31e1-a861-549bcd700570", "track_or_recording_length": "120773"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "4", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "266266", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "id": "aef41bb9-0fbf-4439-b3c4-acf0c67d7095", "title": "Over the Hills"}, "length": "266266", "position": "4", "id": "a9c177ea-2f8b-39b5-880c-72e506e15946", "track_or_recording_length": "266266"}, {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "number": "5", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "recording": {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "length": "152386", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "id": "54549fd0-f79c-45f5-89d8-f5a21d115e2e", "title": "P.T.A."}, "length": "152386", "position": "5", "id": "43740b12-fc31-32d3-95e2-e9eb6ddb1113", "track_or_recording_length": "152386"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "6", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "114053", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "5eb21493-6e55-4c91-a36d-a7fbfd46333c", "title": "Skew It on the Bar-B Freestyle"}, "length": "114053", "position": "6", "id": "f74fcf48-30b8-3ef7-9dac-72ae1f86ebbc", "track_or_recording_length": "114053"}, {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "number": "7", "artist-credit-phrase": "Chico & the Man", "recording": {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "length": "41640", "artist-credit-phrase": "Chico & the Man", "id": "377ac3ee-397a-41ce-a80c-64883f6b6f0d", "title": "Chico and the Man LP Drop"}, "length": "41640", "position": "7", "id": "efc7987f-6e34-3105-8a34-64bf3c244664", "track_or_recording_length": "41640"}, {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "number": "8", "artist-credit-phrase": "???", "recording": {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "length": "59866", "artist-credit-phrase": "???", "id": "931863f4-05e1-46a5-b81e-4c0417a88fd6", "title": "???"}, "length": "59866", "position": "8", "id": "a04ee451-46c3-3ad6-a815-d7bb8449d605", "track_or_recording_length": "59866"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "212333", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "f2dc4fa7-f7a5-4c60-9819-e80adfe1f3de", "title": "Love Ain\u2019t (remix)"}, "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "216200", "title": "Love Ain't (remix)", "position": "9", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "track_or_recording_length": "216200", "id": "f5ef38ad-b7ba-3152-8ffb-de63146e58e0", "number": "9"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "10", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "33973", "artist-credit-phrase": "Deacon the Villain", "id": "548dec24-bf29-4615-bcd9-93d423368c08", "title": "Deacon the Villain LP Drop"}, "length": "33973", "position": "10", "id": "15b88810-680e-36dc-a937-969582d864b1", "track_or_recording_length": "33973"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "11", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "125293", "artist-credit-phrase": "Deacon the Villain", "id": "4c97aed9-9200-482f-a35e-60a17d0ab764", "title": "Affirmative Action Freestyle"}, "length": "125293", "position": "11", "id": "9ddd49a6-c2f1-327d-bcb2-4abd645a66cd", "track_or_recording_length": "125293"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "12", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "180973", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "id": "4b1f0c69-4956-4d91-8ee6-b6e8bd95a70f", "title": "Sticky Green"}, "length": "180973", "position": "12", "id": "85066330-eefd-3e45-8640-4949fcd9bd24", "track_or_recording_length": "180973"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "13", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "190320", "artist-credit-phrase": "Mr. SOS", "id": "61105c6b-fc5e-4507-9b82-31e9ae620422", "title": "Earth's Essence"}, "length": "190320", "position": "13", "id": "d5dc3651-dffc-3cba-a30e-9d9411dbd0f0", "track_or_recording_length": "190320"}, {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "number": "14", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "recording": {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "length": "90640", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "id": "68b76219-e5dd-4b93-bf33-39e7d76ceaa3", "title": "If U Only Knew"}, "length": "90640", "position": "14", "id": "5266bddc-cbca-3310-af98-0a4531c8c150", "track_or_recording_length": "90640"}, {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "15", "artist-credit-phrase": "J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "290653", "artist-credit-phrase": "J. Bully", "id": "4f584807-328c-466d-8ed9-cd999c3ef17b", "title": "Off the Chain"}, "length": "290653", "position": "15", "id": "1499cc7a-a6b4-3b35-bd55-99616cea0c03", "track_or_recording_length": "290653"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "number": "16", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "length": "237706", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "id": "ffd83bc9-9344-4c1d-a96f-81e43a4e2729", "title": "Mic Like a Memory (remix)"}, "length": "237706", "position": "16", "id": "09b26577-5004-3f97-837c-4f2566b720e0", "track_or_recording_length": "237706"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "number": "17", "artist-credit-phrase": "CunninLynguists", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "length": "157920", "artist-credit-phrase": "CunninLynguists", "id": "585963b2-de5a-44d1-9241-f046cf93b50f", "title": "The Fellationelles (skit)"}, "length": "157920", "position": "17", "id": "4f22deb8-1ef3-3ba5-9b1b-0fd04d2156bc", "track_or_recording_length": "157920"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "18", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "222413", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "id": "8043db30-f208-442e-96e2-ddbd3031e1b9", "title": "Nasty Filthy (remix)"}, "length": "222413", "position": "18", "id": "210a235b-848e-3bce-b1bd-cead7161d4d4", "track_or_recording_length": "222413"}, {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "19", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "77200", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "id": "cf465ac5-6b42-4ce3-b982-f46558e1b369", "title": "Irrational"}, "length": "77200", "position": "19", "id": "fe48d5e1-3664-33b0-9bb1-e50fa4cdd000", "track_or_recording_length": "77200"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "20", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "109560", "artist-credit-phrase": "Mr. SOS", "id": "fed3eae2-a991-4e01-abae-8deb024020d2", "title": "Dem Thangs Freestyle"}, "length": "109560", "position": "20", "id": "0414ac89-51c8-3891-baad-a54eb89ca8f3", "track_or_recording_length": "109560"}, {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "21", "artist-credit-phrase": "Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "118746", "artist-credit-phrase": "Kno", "id": "fc1a987d-27fd-4f44-8968-9da3f9b223df", "title": "Never Scared Freestyle (Philaflava Drop remix)"}, "length": "118746", "position": "21", "id": "d1441885-ef76-32ae-979e-b54d63846447", "track_or_recording_length": "118746"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "22", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "174760", "artist-credit-phrase": "Deacon the Villain", "id": "0d06dddc-a851-4fb5-a20d-36b550825415", "title": "Lay Low Freestyle (Philaflava Drop)"}, "length": "174760", "position": "22", "id": "b4f61c9d-f08a-3477-addf-f4db497ad786", "track_or_recording_length": "174760"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "number": "23", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "length": "216826", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "id": "b0932e20-4172-4e37-bf4b-00f4e0984764", "title": "Seasons (remix)"}, "length": "216826", "position": "23", "id": "36bc053e-1b5d-3b20-b187-045cbbb5c1e6", "track_or_recording_length": "216826"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "24", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "177160", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "964be293-f5bf-4918-9a7f-05f410311f8c", "title": "Made You Look Freestyle"}, "length": "177160", "position": "24", "id": "4daaeae0-7328-381d-9cff-68c9d609189e", "track_or_recording_length": "177160"}, {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "25", "artist-credit-phrase": "Chapter 13 feat. Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "186386", "artist-credit-phrase": "Chapter 13 feat. Kno", "id": "23dc2d05-96d8-4f4d-bb89-48cf67d6ba9a", "title": "Rock Stars"}, "length": "186386", "position": "25", "id": "296183bf-d3ae-35c8-8540-6b5afd26ecd8", "track_or_recording_length": "186386"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "26", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "184266", "artist-credit-phrase": "Deacon the Villain", "id": "9fff281c-36a3-4bfc-9d3c-ca5686d46729", "title": "Welcome to NY Freestyle"}, "length": "184266", "position": "26", "id": "3a5c05c5-06d9-3680-883e-82698bb48fb5", "track_or_recording_length": "184266"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "27", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "46520", "artist-credit-phrase": "Mr. SOS", "id": "6af81f1f-e096-4e46-a8ef-19c5c1f20ca5", "title": "Mr. SOS LP Drop"}, "length": "46520", "position": "27", "id": "3757cce8-1db3-39be-b961-49594a6f5acb", "track_or_recording_length": "46520"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "28", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "197893", "artist-credit-phrase": "Mr. SOS", "id": "c56910c3-e3c6-47d5-b0f5-f2d3eb5f94b7", "title": "Rap Name Freestyle"}, "length": "197893", "position": "28", "id": "8bae4909-52f5-3449-a25d-94839cef4d98", "track_or_recording_length": "197893"}, {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "number": "29", "artist-credit-phrase": "Cashmere The PRO", "recording": {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "length": "39480", "artist-credit-phrase": "Cashmere The PRO", "id": "2dac6cd1-d417-4f56-ac6a-2f1649db7973", "title": "Cashmere the PRO LP Drop"}, "length": "39480", "position": "29", "id": "53a3c755-b1ec-37af-abee-ab786f916495", "track_or_recording_length": "39480"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "number": "30", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "length": "248987", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "id": "e0e01c45-9f38-4cf5-aba9-b3bab76d8e9e", "title": "Magic Stick Freestyle"}, "length": "248987", "position": "30", "id": "399d05a4-71d7-3fcc-83c0-5403ab42ec4f", "track_or_recording_length": "248987"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "label-info-list": [{"catalog-number": "BP723-2", "label": {"sort-name": "Freshchest", "id": "fcd792aa-7fd4-4438-9ce3-35dceb156b83", "name": "Freshchest"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2003", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2003", "quality": "normal", "id": "8478d4da-0cda-4e46-ae8c-1eeacfa5cf37", "release-event-count": 1, "title": "Sloppy Seconds, Volume 1", "country": "US", "artist-credit-phrase": "CunninLynguists", "release-group": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "first-release-date": "2003", "secondary-type-list": ["Mixtape/Street"], "primary-type": "Album", "title": "Sloppy Seconds, Volume 1", "type": "Album", "id": "00693d76-b056-314f-aa6d-16aa5106e223", "artist-credit-phrase": "CunninLynguists"}, "medium-list": [{"position": "1", "track-count": 30, "format": "CD", "disc-list": [{"offset-list": [150, 16982, 29710, 38768, 58738, 70167, 78721, 81844, 86334, 102549, 105097, 114494, 128067, 142341, 149139, 170938, 188766, 200610, 217291, 223081, 231298, 240204, 253311, 269573, 282860, 296839, 310659, 314148, 328990, 331951], "id": "RhrwgVb0hZNkabQCw1dZIhdbMFg-", "sectors": "350674", "offset-count": 30}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "number": "1", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "224426", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "2b2b9382-3097-44ac-b79f-82d9e3d23ede", "title": "We're From the Internet (skit)"}, "length": "224426", "position": "1", "id": "9bee2534-0184-32e9-90b4-cd437a2d71ca", "track_or_recording_length": "224426"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "2", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "169706", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "id": "b8cc8672-8bdd-4007-82e0-ca3641816ca9", "title": "Pump It Up Freestyle"}, "length": "169706", "position": "2", "id": "2997a739-6f10-344e-a3c3-5d0037ee6e51", "track_or_recording_length": "169706"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "3", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "120773", "artist-credit-phrase": "Deacon the Villain", "id": "86cf3e45-3649-4cba-a9e8-2d5016971d2d", "title": "Watch Yo Mowf"}, "length": "120773", "position": "3", "id": "4fae0fab-544d-31e1-a861-549bcd700570", "track_or_recording_length": "120773"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "4", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "266266", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "id": "aef41bb9-0fbf-4439-b3c4-acf0c67d7095", "title": "Over the Hills"}, "length": "266266", "position": "4", "id": "a9c177ea-2f8b-39b5-880c-72e506e15946", "track_or_recording_length": "266266"}, {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "number": "5", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "recording": {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "length": "152386", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "id": "54549fd0-f79c-45f5-89d8-f5a21d115e2e", "title": "P.T.A."}, "length": "152386", "position": "5", "id": "43740b12-fc31-32d3-95e2-e9eb6ddb1113", "track_or_recording_length": "152386"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "6", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "114053", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "5eb21493-6e55-4c91-a36d-a7fbfd46333c", "title": "Skew It on the Bar-B Freestyle"}, "length": "114053", "position": "6", "id": "f74fcf48-30b8-3ef7-9dac-72ae1f86ebbc", "track_or_recording_length": "114053"}, {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "number": "7", "artist-credit-phrase": "Chico & the Man", "recording": {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "length": "41640", "artist-credit-phrase": "Chico & the Man", "id": "377ac3ee-397a-41ce-a80c-64883f6b6f0d", "title": "Chico and the Man LP Drop"}, "length": "41640", "position": "7", "id": "efc7987f-6e34-3105-8a34-64bf3c244664", "track_or_recording_length": "41640"}, {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "number": "8", "artist-credit-phrase": "???", "recording": {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "length": "59866", "artist-credit-phrase": "???", "id": "931863f4-05e1-46a5-b81e-4c0417a88fd6", "title": "???"}, "length": "59866", "position": "8", "id": "a04ee451-46c3-3ad6-a815-d7bb8449d605", "track_or_recording_length": "59866"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "212333", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "f2dc4fa7-f7a5-4c60-9819-e80adfe1f3de", "title": "Love Ain\u2019t (remix)"}, "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "216200", "title": "Love Ain't (remix)", "position": "9", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "track_or_recording_length": "216200", "id": "f5ef38ad-b7ba-3152-8ffb-de63146e58e0", "number": "9"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "10", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "33973", "artist-credit-phrase": "Deacon the Villain", "id": "548dec24-bf29-4615-bcd9-93d423368c08", "title": "Deacon the Villain LP Drop"}, "length": "33973", "position": "10", "id": "15b88810-680e-36dc-a937-969582d864b1", "track_or_recording_length": "33973"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "11", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "125293", "artist-credit-phrase": "Deacon the Villain", "id": "4c97aed9-9200-482f-a35e-60a17d0ab764", "title": "Affirmative Action Freestyle"}, "length": "125293", "position": "11", "id": "9ddd49a6-c2f1-327d-bcb2-4abd645a66cd", "track_or_recording_length": "125293"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "12", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "180973", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "id": "4b1f0c69-4956-4d91-8ee6-b6e8bd95a70f", "title": "Sticky Green"}, "length": "180973", "position": "12", "id": "85066330-eefd-3e45-8640-4949fcd9bd24", "track_or_recording_length": "180973"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "13", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "190320", "artist-credit-phrase": "Mr. SOS", "id": "61105c6b-fc5e-4507-9b82-31e9ae620422", "title": "Earth's Essence"}, "length": "190320", "position": "13", "id": "d5dc3651-dffc-3cba-a30e-9d9411dbd0f0", "track_or_recording_length": "190320"}, {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "number": "14", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "recording": {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "length": "90640", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "id": "68b76219-e5dd-4b93-bf33-39e7d76ceaa3", "title": "If U Only Knew"}, "length": "90640", "position": "14", "id": "5266bddc-cbca-3310-af98-0a4531c8c150", "track_or_recording_length": "90640"}, {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "15", "artist-credit-phrase": "J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "290653", "artist-credit-phrase": "J. Bully", "id": "4f584807-328c-466d-8ed9-cd999c3ef17b", "title": "Off the Chain"}, "length": "290653", "position": "15", "id": "1499cc7a-a6b4-3b35-bd55-99616cea0c03", "track_or_recording_length": "290653"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "number": "16", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "length": "237706", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "id": "ffd83bc9-9344-4c1d-a96f-81e43a4e2729", "title": "Mic Like a Memory (remix)"}, "length": "237706", "position": "16", "id": "09b26577-5004-3f97-837c-4f2566b720e0", "track_or_recording_length": "237706"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "number": "17", "artist-credit-phrase": "CunninLynguists", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "length": "157920", "artist-credit-phrase": "CunninLynguists", "id": "585963b2-de5a-44d1-9241-f046cf93b50f", "title": "The Fellationelles (skit)"}, "length": "157920", "position": "17", "id": "4f22deb8-1ef3-3ba5-9b1b-0fd04d2156bc", "track_or_recording_length": "157920"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "18", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "222413", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "id": "8043db30-f208-442e-96e2-ddbd3031e1b9", "title": "Nasty Filthy (remix)"}, "length": "222413", "position": "18", "id": "210a235b-848e-3bce-b1bd-cead7161d4d4", "track_or_recording_length": "222413"}, {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "19", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "77200", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "id": "cf465ac5-6b42-4ce3-b982-f46558e1b369", "title": "Irrational"}, "length": "77200", "position": "19", "id": "fe48d5e1-3664-33b0-9bb1-e50fa4cdd000", "track_or_recording_length": "77200"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "20", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "109560", "artist-credit-phrase": "Mr. SOS", "id": "fed3eae2-a991-4e01-abae-8deb024020d2", "title": "Dem Thangs Freestyle"}, "length": "109560", "position": "20", "id": "0414ac89-51c8-3891-baad-a54eb89ca8f3", "track_or_recording_length": "109560"}, {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "21", "artist-credit-phrase": "Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "118746", "artist-credit-phrase": "Kno", "id": "fc1a987d-27fd-4f44-8968-9da3f9b223df", "title": "Never Scared Freestyle (Philaflava Drop remix)"}, "length": "118746", "position": "21", "id": "d1441885-ef76-32ae-979e-b54d63846447", "track_or_recording_length": "118746"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "22", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "174760", "artist-credit-phrase": "Deacon the Villain", "id": "0d06dddc-a851-4fb5-a20d-36b550825415", "title": "Lay Low Freestyle (Philaflava Drop)"}, "length": "174760", "position": "22", "id": "b4f61c9d-f08a-3477-addf-f4db497ad786", "track_or_recording_length": "174760"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "number": "23", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "length": "216826", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "id": "b0932e20-4172-4e37-bf4b-00f4e0984764", "title": "Seasons (remix)"}, "length": "216826", "position": "23", "id": "36bc053e-1b5d-3b20-b187-045cbbb5c1e6", "track_or_recording_length": "216826"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "24", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "177160", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "964be293-f5bf-4918-9a7f-05f410311f8c", "title": "Made You Look Freestyle"}, "length": "177160", "position": "24", "id": "4daaeae0-7328-381d-9cff-68c9d609189e", "track_or_recording_length": "177160"}, {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "25", "artist-credit-phrase": "Chapter 13 feat. Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "186386", "artist-credit-phrase": "Chapter 13 feat. Kno", "id": "23dc2d05-96d8-4f4d-bb89-48cf67d6ba9a", "title": "Rock Stars"}, "length": "186386", "position": "25", "id": "296183bf-d3ae-35c8-8540-6b5afd26ecd8", "track_or_recording_length": "186386"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "26", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "184266", "artist-credit-phrase": "Deacon the Villain", "id": "9fff281c-36a3-4bfc-9d3c-ca5686d46729", "title": "Welcome to NY Freestyle"}, "length": "184266", "position": "26", "id": "3a5c05c5-06d9-3680-883e-82698bb48fb5", "track_or_recording_length": "184266"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "27", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "46520", "artist-credit-phrase": "Mr. SOS", "id": "6af81f1f-e096-4e46-a8ef-19c5c1f20ca5", "title": "Mr. SOS LP Drop"}, "length": "46520", "position": "27", "id": "3757cce8-1db3-39be-b961-49594a6f5acb", "track_or_recording_length": "46520"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "28", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "197893", "artist-credit-phrase": "Mr. SOS", "id": "c56910c3-e3c6-47d5-b0f5-f2d3eb5f94b7", "title": "Rap Name Freestyle"}, "length": "197893", "position": "28", "id": "8bae4909-52f5-3449-a25d-94839cef4d98", "track_or_recording_length": "197893"}, {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "number": "29", "artist-credit-phrase": "Cashmere The PRO", "recording": {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "length": "39480", "artist-credit-phrase": "Cashmere The PRO", "id": "2dac6cd1-d417-4f56-ac6a-2f1649db7973", "title": "Cashmere the PRO LP Drop"}, "length": "39480", "position": "29", "id": "53a3c755-b1ec-37af-abee-ab786f916495", "track_or_recording_length": "39480"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "number": "30", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "length": "248987", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "id": "e0e01c45-9f38-4cf5-aba9-b3bab76d8e9e", "title": "Magic Stick Freestyle"}, "length": "248987", "position": "30", "id": "399d05a4-71d7-3fcc-83c0-5403ab42ec4f", "track_or_recording_length": "248987"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json b/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json index e7f6d3cf..fc265c66 100644 --- a/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json +++ b/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "638812730329", "asin": "B000E6GBVW", "label-info-count": 1, "label-info-list": [{"catalog-number": "63881-27303-2", "label": {"sort-name": "V2 Records International", "disambiguation": "possibly bogus, please refer to \"V2\" or \"V2 Records\" instead", "id": "947c12a1-cf28-4380-a695-a944ad15e387", "name": "V2 Records International"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2006", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006", "quality": "normal", "id": "8a457e97-ed59-31f1-8b1c-41f24e9a7183", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "US", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "15be8cfd-dff8-3dac-8924-8f564f7aff3c", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "70aeb069-b711-3586-9c47-d5b82f482a7f", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "48afa45e-a3a2-3e56-a93c-5a9afb5895af", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2e6d0fb6-c246-30f3-8572-5a121c001078", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "ba671d1c-d7b8-3a36-8b2e-f02665e3cd5d", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "7a806384-da3a-3cc7-8b92-5699ff68cd60", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "7c23d3cf-8cbb-3530-bef6-e532bf127212", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "ac0a2d96-e85c-3516-9833-8e87066eb11f", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "32ceb242-8ea0-3e82-975e-965014fbdc20", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "5e6a4c53-396c-3699-a682-7923919cbc87", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "fa108d5a-e6c2-3c6f-afcc-9b6b48cd5c2a", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "3319fd26-9891-3761-8de3-786fa7e6493f", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "638812730329", "asin": "B000E6GBVW", "label-info-count": 1, "label-info-list": [{"catalog-number": "63881-27303-2", "label": {"sort-name": "V2 Records International", "disambiguation": "possibly bogus, please refer to \"V2\" or \"V2 Records\" instead", "id": "947c12a1-cf28-4380-a695-a944ad15e387", "name": "V2 Records International"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2006", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006", "quality": "normal", "id": "8a457e97-ed59-31f1-8b1c-41f24e9a7183", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "US", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "release-group": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "first-release-date": "2006-01-30", "primary-type": "Album", "title": "Ballad of the Broken Seas", "type": "Album", "id": "994cdad1-0365-3439-89ed-6686bd563503", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "15be8cfd-dff8-3dac-8924-8f564f7aff3c", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "70aeb069-b711-3586-9c47-d5b82f482a7f", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "48afa45e-a3a2-3e56-a93c-5a9afb5895af", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2e6d0fb6-c246-30f3-8572-5a121c001078", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "ba671d1c-d7b8-3a36-8b2e-f02665e3cd5d", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "7a806384-da3a-3cc7-8b92-5699ff68cd60", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "7c23d3cf-8cbb-3530-bef6-e532bf127212", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "ac0a2d96-e85c-3516-9833-8e87066eb11f", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "32ceb242-8ea0-3e82-975e-965014fbdc20", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "5e6a4c53-396c-3699-a682-7923919cbc87", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "fa108d5a-e6c2-3c6f-afcc-9b6b48cd5c2a", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "3319fd26-9891-3761-8de3-786fa7e6493f", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json b/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json index 9b7604b0..bae96cf2 100644 --- a/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json +++ b/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [{"catalog-number": "585 625-2", "label": {"sort-name": "Universal TV", "disambiguation": "Netherlands & Belgium", "id": "48500332-aa67-44d1-9901-18d1e6ab27a2", "name": "Universal TV"}}], "title": "2 Meter Sessies, Volume 10", "release-event-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2001-10-15", "area": {"sort-name": "Netherlands", "iso-3166-1-code-list": ["NL"], "id": "ef1b7cc0-cd26-36f4-8ea0-04d9623786c7", "name": "Netherlands"}}], "medium-list": [{"position": "1", "track-count": 18, "format": "CD", "disc-list": [{"offset-list": [150, 20040, 39875, 68708, 88339, 106270, 122005, 133975, 147835, 165208, 181093, 199820, 215620, 229945, 250040, 274450, 288998, 305748], "id": "f7XO36a7n1LCCskkCiulReWbwZA-", "sectors": "317128", "offset-count": 18}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "number": "1", "artist-credit-phrase": "Coldplay", "recording": {"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "length": "265200", "artist-credit-phrase": "Coldplay", "id": "06813123-5047-4c94-88bf-6a300540e954", "title": "Trouble"}, "length": "265200", "position": "1", "id": "73b03043-36e9-3a92-9ce7-c1ad2d887fa3", "track_or_recording_length": "265200"}, {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "number": "2", "artist-credit-phrase": "L\u012aVE", "recording": {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "length": "264466", "artist-credit-phrase": "L\u012aVE", "id": "7b57b108-35bb-4fcb-9046-06228fb7e5f7", "title": "Run to the Water"}, "length": "264466", "position": "2", "id": "7485aa70-7159-3dfd-aa74-514994f88789", "track_or_recording_length": "264466"}, {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "number": "3", "artist-credit-phrase": "Beck", "recording": {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "length": "384440", "artist-credit-phrase": "Beck", "id": "cfbfb04e-ccfd-4316-a5eb-5e4daa670905", "title": "Debra"}, "length": "384440", "position": "3", "id": "17d52b51-42da-3a80-afb4-3d03cd99e339", "track_or_recording_length": "384440"}, {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "number": "4", "artist-credit-phrase": "The Jayhawks", "recording": {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "length": "261746", "artist-credit-phrase": "The Jayhawks", "id": "d7b84a3f-628d-49f3-ae2f-b34d5630ee45", "title": "Mr. Wilson"}, "length": "261746", "position": "4", "id": "44b79128-b98c-36fe-8f25-b1b8b7b97309", "track_or_recording_length": "261746"}, {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "number": "5", "artist-credit-phrase": "De Dijk", "recording": {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "length": "239080", "artist-credit-phrase": "De Dijk", "id": "2bb1a0ca-399a-4488-8a53-bb0ca9ece5ea", "title": "Wie het niet weet"}, "length": "239080", "position": "5", "id": "9b76ae87-6b45-3b31-8466-64579d8d2cb0", "track_or_recording_length": "239080"}, {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "number": "6", "artist-credit-phrase": "Emil\u00edana Torrini", "recording": {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "length": "209800", "artist-credit-phrase": "Emil\u00edana Torrini", "id": "3e6433da-9af5-41b0-9210-6dbef13c630c", "title": "Summer Breeze"}, "length": "209800", "position": "6", "id": "addd247f-f664-3457-9040-3b9dc56a6b1c", "track_or_recording_length": "209800"}, {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "number": "7", "artist-credit-phrase": "John Hiatt", "recording": {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "length": "158000", "artist-credit-phrase": "John Hiatt", "id": "ce684ade-741f-47f7-ac1c-0d7d206da8a3", "title": "What Do We Do Now"}, "length": "159600", "position": "7", "id": "7f48a5cb-1370-3c2e-8b8f-9f20029c71cb", "track_or_recording_length": "159600"}, {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "number": "8", "artist-credit-phrase": "Barry Hay & Barking Dogs", "recording": {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "length": "184800", "artist-credit-phrase": "Barry Hay & Barking Dogs", "id": "56b1b506-64cd-4c2f-be6d-044e3888dabd", "title": "Happiness Is a Warm Gun"}, "length": "184800", "position": "8", "id": "9fae06e7-f2d2-34fc-a095-52565fe99225", "track_or_recording_length": "184800"}, {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "number": "9", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "recording": {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "length": "231640", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "id": "4d1c6a29-dd96-4af6-a594-622d70e214ac", "title": "I'm Your Puppet"}, "length": "231640", "position": "9", "id": "0024f07d-2864-3085-8aff-aa0440446f8e", "track_or_recording_length": "231640"}, {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "number": "10", "artist-credit-phrase": "Angie Stone", "recording": {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "length": "211800", "artist-credit-phrase": "Angie Stone", "id": "cb0447fc-3ad3-4dea-a94d-517179a6d68c", "title": "Everyday"}, "length": "211800", "position": "10", "id": "34ff18f9-cbeb-3da0-bb7b-a6908ca0e8e3", "track_or_recording_length": "211800"}, {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "number": "11", "artist-credit-phrase": "Tom Helsen", "recording": {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "length": "249693", "artist-credit-phrase": "Tom Helsen", "id": "2f6501f8-262a-4f02-a782-ed365621e100", "title": "When Marvin Calls"}, "length": "249693", "position": "11", "id": "1da99d43-f845-35e7-8e07-3c3cb38f9a82", "track_or_recording_length": "249693"}, {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "number": "12", "artist-credit-phrase": "K\u2019s Choice", "recording": {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "length": "210666", "artist-credit-phrase": "K\u2019s Choice", "id": "e3ef3fa1-3155-464d-a5e0-4096e9cc63ad", "title": "Almost Happy"}, "length": "210666", "position": "12", "id": "e2a95209-9240-3e4f-86a6-270771ee4fe3", "track_or_recording_length": "210666"}, {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "number": "13", "artist-credit-phrase": "Paddy Casey", "recording": {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "length": "191000", "artist-credit-phrase": "Paddy Casey", "id": "c419e7a6-cbe7-44c9-a45e-08e0721695dd", "title": "Can't Take That Away"}, "length": "191000", "position": "13", "id": "682ad823-6721-37c2-9af2-633789144183", "track_or_recording_length": "191000"}, {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "number": "14", "artist-credit-phrase": "Joe Jackson", "recording": {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "length": "267933", "artist-credit-phrase": "Joe Jackson", "id": "ebb7083f-4db2-4daa-a67d-2993887b67ad", "title": "Stranger Than You"}, "length": "267933", "position": "14", "id": "6895798b-33eb-3380-86ea-d0ba04321b0b", "track_or_recording_length": "267933"}, {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "number": "15", "artist-credit-phrase": "My Morning Jacket", "recording": {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "length": "325466", "artist-credit-phrase": "My Morning Jacket", "id": "62594b12-5907-42b6-b7d9-03ad5b0ddd35", "title": "Old September Blues"}, "length": "325466", "position": "15", "id": "795fa05c-33d4-32dc-bdbe-e79a2d4cc0d1", "track_or_recording_length": "325466"}, {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "number": "16", "artist-credit-phrase": "Tom Jones & Stereophonics", "recording": {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "length": "193973", "artist-credit-phrase": "Tom Jones & Stereophonics", "id": "ba50a1c7-9e23-4c3e-b7aa-12e23eea6d19", "title": "Mama Told Me Not to Come"}, "length": "193973", "position": "16", "id": "bb0171cf-dda7-36c6-9282-742f431fb5a0", "track_or_recording_length": "193973"}, {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "number": "17", "artist-credit-phrase": "Ben Christophers", "recording": {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "length": "223333", "artist-credit-phrase": "Ben Christophers", "id": "c0cfc4cb-8c80-4516-b500-2df010418697", "title": "Sunday"}, "length": "223333", "position": "17", "id": "c3db0bfb-a303-31a6-b113-1ecaac9242f1", "track_or_recording_length": "223333"}, {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "number": "18", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "recording": {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "length": "151733", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "id": "e423a1d7-3ae1-4540-b267-d873c50043e7", "title": "Magnolia"}, "length": "151733", "position": "18", "id": "c96be4bd-cc11-3a49-882f-60d2664068ec", "track_or_recording_length": "151733"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "label-info-count": 1, "country": "NL", "date": "2001-10-15", "artist-credit-phrase": "Various Artists", "quality": "normal", "id": "a76714e0-32b1-4ed4-b28e-f86d99642193"}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [{"catalog-number": "585 625-2", "label": {"sort-name": "Universal TV", "disambiguation": "Netherlands & Belgium", "id": "48500332-aa67-44d1-9901-18d1e6ab27a2", "name": "Universal TV"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2001-10-15", "area": {"sort-name": "Netherlands", "iso-3166-1-code-list": ["NL"], "id": "ef1b7cc0-cd26-36f4-8ea0-04d9623786c7", "name": "Netherlands"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2001-10-15", "quality": "normal", "id": "a76714e0-32b1-4ed4-b28e-f86d99642193", "release-event-count": 1, "title": "2 Meter Sessies, Volume 10", "country": "NL", "artist-credit-phrase": "Various Artists", "release-group": {"artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "first-release-date": "2001-10-15", "secondary-type-list": ["Live"], "primary-type": "Album", "title": "2 Meter Sessies, Volume 10", "type": "Live", "id": "6fff6ff3-fcb7-3c4e-80e7-9f28d50871ae", "artist-credit-phrase": "Various Artists"}, "medium-list": [{"position": "1", "track-count": 18, "format": "CD", "disc-list": [{"offset-list": [150, 20040, 39875, 68708, 88339, 106270, 122005, 133975, 147835, 165208, 181093, 199820, 215620, 229945, 250040, 274450, 288998, 305748], "id": "f7XO36a7n1LCCskkCiulReWbwZA-", "sectors": "317128", "offset-count": 18}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "number": "1", "artist-credit-phrase": "Coldplay", "recording": {"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "length": "265200", "artist-credit-phrase": "Coldplay", "id": "06813123-5047-4c94-88bf-6a300540e954", "title": "Trouble"}, "length": "265200", "position": "1", "id": "73b03043-36e9-3a92-9ce7-c1ad2d887fa3", "track_or_recording_length": "265200"}, {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "number": "2", "artist-credit-phrase": "L\u012aVE", "recording": {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "length": "264466", "artist-credit-phrase": "L\u012aVE", "id": "7b57b108-35bb-4fcb-9046-06228fb7e5f7", "title": "Run to the Water"}, "length": "264466", "position": "2", "id": "7485aa70-7159-3dfd-aa74-514994f88789", "track_or_recording_length": "264466"}, {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "number": "3", "artist-credit-phrase": "Beck", "recording": {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "length": "384440", "artist-credit-phrase": "Beck", "id": "cfbfb04e-ccfd-4316-a5eb-5e4daa670905", "title": "Debra"}, "length": "384440", "position": "3", "id": "17d52b51-42da-3a80-afb4-3d03cd99e339", "track_or_recording_length": "384440"}, {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "number": "4", "artist-credit-phrase": "The Jayhawks", "recording": {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "length": "261746", "artist-credit-phrase": "The Jayhawks", "id": "d7b84a3f-628d-49f3-ae2f-b34d5630ee45", "title": "Mr. Wilson"}, "length": "261746", "position": "4", "id": "44b79128-b98c-36fe-8f25-b1b8b7b97309", "track_or_recording_length": "261746"}, {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "number": "5", "artist-credit-phrase": "De Dijk", "recording": {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "length": "239080", "artist-credit-phrase": "De Dijk", "id": "2bb1a0ca-399a-4488-8a53-bb0ca9ece5ea", "title": "Wie het niet weet"}, "length": "239080", "position": "5", "id": "9b76ae87-6b45-3b31-8466-64579d8d2cb0", "track_or_recording_length": "239080"}, {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "number": "6", "artist-credit-phrase": "Emil\u00edana Torrini", "recording": {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "length": "209800", "artist-credit-phrase": "Emil\u00edana Torrini", "id": "3e6433da-9af5-41b0-9210-6dbef13c630c", "title": "Summer Breeze"}, "length": "209800", "position": "6", "id": "addd247f-f664-3457-9040-3b9dc56a6b1c", "track_or_recording_length": "209800"}, {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "number": "7", "artist-credit-phrase": "John Hiatt", "recording": {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "length": "158000", "artist-credit-phrase": "John Hiatt", "id": "ce684ade-741f-47f7-ac1c-0d7d206da8a3", "title": "What Do We Do Now"}, "length": "159600", "position": "7", "id": "7f48a5cb-1370-3c2e-8b8f-9f20029c71cb", "track_or_recording_length": "159600"}, {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "number": "8", "artist-credit-phrase": "Barry Hay & Barking Dogs", "recording": {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "length": "184800", "artist-credit-phrase": "Barry Hay & Barking Dogs", "id": "56b1b506-64cd-4c2f-be6d-044e3888dabd", "title": "Happiness Is a Warm Gun"}, "length": "184800", "position": "8", "id": "9fae06e7-f2d2-34fc-a095-52565fe99225", "track_or_recording_length": "184800"}, {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "number": "9", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "recording": {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "length": "231640", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "id": "4d1c6a29-dd96-4af6-a594-622d70e214ac", "title": "I'm Your Puppet"}, "length": "231640", "position": "9", "id": "0024f07d-2864-3085-8aff-aa0440446f8e", "track_or_recording_length": "231640"}, {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "number": "10", "artist-credit-phrase": "Angie Stone", "recording": {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "length": "211800", "artist-credit-phrase": "Angie Stone", "id": "cb0447fc-3ad3-4dea-a94d-517179a6d68c", "title": "Everyday"}, "length": "211800", "position": "10", "id": "34ff18f9-cbeb-3da0-bb7b-a6908ca0e8e3", "track_or_recording_length": "211800"}, {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "number": "11", "artist-credit-phrase": "Tom Helsen", "recording": {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "length": "249693", "artist-credit-phrase": "Tom Helsen", "id": "2f6501f8-262a-4f02-a782-ed365621e100", "title": "When Marvin Calls"}, "length": "249693", "position": "11", "id": "1da99d43-f845-35e7-8e07-3c3cb38f9a82", "track_or_recording_length": "249693"}, {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "number": "12", "artist-credit-phrase": "K\u2019s Choice", "recording": {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "length": "210666", "artist-credit-phrase": "K\u2019s Choice", "id": "e3ef3fa1-3155-464d-a5e0-4096e9cc63ad", "title": "Almost Happy"}, "length": "210666", "position": "12", "id": "e2a95209-9240-3e4f-86a6-270771ee4fe3", "track_or_recording_length": "210666"}, {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "number": "13", "artist-credit-phrase": "Paddy Casey", "recording": {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "length": "191000", "artist-credit-phrase": "Paddy Casey", "id": "c419e7a6-cbe7-44c9-a45e-08e0721695dd", "title": "Can't Take That Away"}, "length": "191000", "position": "13", "id": "682ad823-6721-37c2-9af2-633789144183", "track_or_recording_length": "191000"}, {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "number": "14", "artist-credit-phrase": "Joe Jackson", "recording": {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "length": "267933", "artist-credit-phrase": "Joe Jackson", "id": "ebb7083f-4db2-4daa-a67d-2993887b67ad", "title": "Stranger Than You"}, "length": "267933", "position": "14", "id": "6895798b-33eb-3380-86ea-d0ba04321b0b", "track_or_recording_length": "267933"}, {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "number": "15", "artist-credit-phrase": "My Morning Jacket", "recording": {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "length": "325466", "artist-credit-phrase": "My Morning Jacket", "id": "62594b12-5907-42b6-b7d9-03ad5b0ddd35", "title": "Old September Blues"}, "length": "325466", "position": "15", "id": "795fa05c-33d4-32dc-bdbe-e79a2d4cc0d1", "track_or_recording_length": "325466"}, {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "number": "16", "artist-credit-phrase": "Tom Jones & Stereophonics", "recording": {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "length": "193973", "artist-credit-phrase": "Tom Jones & Stereophonics", "id": "ba50a1c7-9e23-4c3e-b7aa-12e23eea6d19", "title": "Mama Told Me Not to Come"}, "length": "193973", "position": "16", "id": "bb0171cf-dda7-36c6-9282-742f431fb5a0", "track_or_recording_length": "193973"}, {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "number": "17", "artist-credit-phrase": "Ben Christophers", "recording": {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "length": "223333", "artist-credit-phrase": "Ben Christophers", "id": "c0cfc4cb-8c80-4516-b500-2df010418697", "title": "Sunday"}, "length": "223333", "position": "17", "id": "c3db0bfb-a303-31a6-b113-1ecaac9242f1", "track_or_recording_length": "223333"}, {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "number": "18", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "recording": {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "length": "151733", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "id": "e423a1d7-3ae1-4540-b267-d873c50043e7", "title": "Magnolia"}, "length": "151733", "position": "18", "id": "c96be4bd-cc11-3a49-882f-60d2664068ec", "track_or_recording_length": "151733"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json b/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json index 09f5b838..1ca11afd 100644 --- a/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json +++ b/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json @@ -1 +1 @@ -{"release": {"status": "Bootleg", "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "label-info-list": [], "title": "Space & Chill Out", "label-info-count": 0, "medium-count": 1, "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [182, 8067, 14985, 28407, 39920, 74532, 79825, 93370, 135732, 162415, 168137, 182882], "id": "b.yqPuCBdsV5hrzDvYrw52iK_jE-", "sectors": "355532", "offset-count": 12}], "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "107066", "artist-credit-phrase": "The KLF", "id": "254c95dd-71e2-4a38-8267-bdbe046c5ace", "title": "Brownsville Turnaround on the Tex-Mex Border"}, "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "105133", "title": "Brownsville Turnaround", "position": "1", "artist-credit-phrase": "The KLF", "track_or_recording_length": "105133", "id": "1f417f2b-e049-3ff1-9a08-d787dfd47b19", "number": "1"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "2", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "89000", "artist-credit-phrase": "The KLF", "id": "cfe7f2bb-ce37-434f-9d26-b0d523cd8e6e", "title": "Pulling Out of Ricardo and the Dusk Is Falling Fast"}, "length": "92240", "position": "2", "id": "2b6c44dc-e1bd-3feb-b889-746c0bb22eb9", "track_or_recording_length": "92240"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "3", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181040", "artist-credit-phrase": "The KLF", "id": "b8fcd38a-59df-4f1c-a944-f836e8592b94", "title": "Six Hours to Louisiana, Black Coffee Going Cold"}, "length": "178960", "position": "3", "id": "13639dfc-3332-31c6-8fb5-4d0241e81dde", "track_or_recording_length": "178960"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "4", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "155333", "artist-credit-phrase": "The KLF", "id": "20a3421a-36cd-4b60-8dfb-118caef8c6d8", "title": "Dream Time in Lake Jackson"}, "length": "153506", "position": "4", "id": "1b222630-1cc6-3f7e-9dc8-14d0d88ac054", "track_or_recording_length": "153506"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "5", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "460866", "artist-credit-phrase": "The KLF", "id": "bd90d2bf-fff9-4aaa-9c3f-7bacbc9d5421", "title": "Madrugada Eterna"}, "length": "461493", "position": "5", "id": "576a010d-1ea7-3525-a32b-2dce207d0ce3", "track_or_recording_length": "461493"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "6", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "68560", "artist-credit-phrase": "The KLF", "id": "5ea8a91d-5425-49ae-90f6-6acfefda4a59", "title": "Justified and Ancient Seems a Long Time Ago"}, "length": "70573", "position": "6", "id": "9e29c06a-c74b-3b0f-a170-98a1c0ea51d9", "track_or_recording_length": "70573"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "7", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181440", "artist-credit-phrase": "The KLF", "id": "f246f658-49c4-4efe-840e-c624b7850bc9", "title": "Elvis on the Radio, Steel Guitar in My Soul"}, "length": "180600", "position": "7", "id": "cdd8ed03-4b32-3c39-81f6-cd513369225e", "track_or_recording_length": "180600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "8", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "564933", "artist-credit-phrase": "The KLF", "id": "a173d428-4e12-4513-8df2-eb7f098e6364", "title": "3 A.M. Somewhere Out of Beaumont"}, "length": "564826", "position": "8", "id": "58a8cbf9-10a1-32c8-8cd7-f6893c5050ab", "track_or_recording_length": "564826"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "9", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "356000", "artist-credit-phrase": "The KLF", "id": "b7bc1dc2-a468-4948-b628-e03fc9265d41", "title": "Wichita Lineman Was a Song I Once Heard"}, "length": "355773", "position": "9", "id": "42679959-2e1a-3085-842a-a443ebc37733", "track_or_recording_length": "355773"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "10", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "76026", "artist-credit-phrase": "The KLF", "id": "035e349d-b581-4c0e-818f-ae14e10bc26f", "title": "Trancentral Lost in My Mind"}, "length": "76293", "position": "10", "id": "716fe2c9-47b8-3719-8586-e4ed47694a10", "track_or_recording_length": "76293"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "11", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "214266", "artist-credit-phrase": "The KLF", "id": "d9dd3bc7-ae2a-4b62-a545-8a60f5704a7d", "title": "The Lights of Baton Rouge Pass By"}, "length": "196600", "position": "11", "id": "3220c725-d7cb-3d81-8fb9-91e5a2f94cc9", "track_or_recording_length": "196600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Space", "disambiguation": "Jimmy Cauty's ambient off-shoot of The Orb/The KLF", "id": "22240df3-8dcc-4272-9294-d127442e7f36", "name": "Space"}}], "length": "2302560", "artist-credit-phrase": "Space", "id": "42391d00-df70-4014-83f8-e980a6b695b3", "title": "Mercury / Venus / Mars / Jupiter / Saturn / Uranus / Neptune / Pluto"}, "length": "2302000", "title": "Space", "position": "12", "artist-credit-phrase": "The KLF", "track_or_recording_length": "2302000", "id": "b65aa927-6edf-340b-82b4-fbc34a5f5a0b", "number": "12"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "artist-credit-phrase": "The KLF", "quality": "normal", "id": "c56ff16e-1d81-47de-926f-ba22891bd2bd"}} \ No newline at end of file +{"release": {"status": "Bootleg", "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "label-info-list": [], "quality": "normal", "title": "Space & Chill Out", "label-info-count": 0, "medium-count": 1, "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [182, 8067, 14985, 28407, 39920, 74532, 79825, 93370, 135732, 162415, 168137, 182882], "id": "b.yqPuCBdsV5hrzDvYrw52iK_jE-", "sectors": "355532", "offset-count": 12}], "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "107066", "artist-credit-phrase": "The KLF", "id": "254c95dd-71e2-4a38-8267-bdbe046c5ace", "title": "Brownsville Turnaround on the Tex-Mex Border"}, "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "105133", "title": "Brownsville Turnaround", "position": "1", "artist-credit-phrase": "The KLF", "track_or_recording_length": "105133", "id": "1f417f2b-e049-3ff1-9a08-d787dfd47b19", "number": "1"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "2", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "89000", "artist-credit-phrase": "The KLF", "id": "cfe7f2bb-ce37-434f-9d26-b0d523cd8e6e", "title": "Pulling Out of Ricardo and the Dusk Is Falling Fast"}, "length": "92240", "position": "2", "id": "2b6c44dc-e1bd-3feb-b889-746c0bb22eb9", "track_or_recording_length": "92240"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "3", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181040", "artist-credit-phrase": "The KLF", "id": "b8fcd38a-59df-4f1c-a944-f836e8592b94", "title": "Six Hours to Louisiana, Black Coffee Going Cold"}, "length": "178960", "position": "3", "id": "13639dfc-3332-31c6-8fb5-4d0241e81dde", "track_or_recording_length": "178960"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "4", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "155333", "artist-credit-phrase": "The KLF", "id": "20a3421a-36cd-4b60-8dfb-118caef8c6d8", "title": "Dream Time in Lake Jackson"}, "length": "153506", "position": "4", "id": "1b222630-1cc6-3f7e-9dc8-14d0d88ac054", "track_or_recording_length": "153506"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "5", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "460866", "artist-credit-phrase": "The KLF", "id": "bd90d2bf-fff9-4aaa-9c3f-7bacbc9d5421", "title": "Madrugada Eterna"}, "length": "461493", "position": "5", "id": "576a010d-1ea7-3525-a32b-2dce207d0ce3", "track_or_recording_length": "461493"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "6", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "68560", "artist-credit-phrase": "The KLF", "id": "5ea8a91d-5425-49ae-90f6-6acfefda4a59", "title": "Justified and Ancient Seems a Long Time Ago"}, "length": "70573", "position": "6", "id": "9e29c06a-c74b-3b0f-a170-98a1c0ea51d9", "track_or_recording_length": "70573"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "7", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181440", "artist-credit-phrase": "The KLF", "id": "f246f658-49c4-4efe-840e-c624b7850bc9", "title": "Elvis on the Radio, Steel Guitar in My Soul"}, "length": "180600", "position": "7", "id": "cdd8ed03-4b32-3c39-81f6-cd513369225e", "track_or_recording_length": "180600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "8", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "564933", "artist-credit-phrase": "The KLF", "id": "a173d428-4e12-4513-8df2-eb7f098e6364", "title": "3 A.M. Somewhere Out of Beaumont"}, "length": "564826", "position": "8", "id": "58a8cbf9-10a1-32c8-8cd7-f6893c5050ab", "track_or_recording_length": "564826"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "9", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "356000", "artist-credit-phrase": "The KLF", "id": "b7bc1dc2-a468-4948-b628-e03fc9265d41", "title": "Wichita Lineman Was a Song I Once Heard"}, "length": "355773", "position": "9", "id": "42679959-2e1a-3085-842a-a443ebc37733", "track_or_recording_length": "355773"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "10", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "76026", "artist-credit-phrase": "The KLF", "id": "035e349d-b581-4c0e-818f-ae14e10bc26f", "title": "Trancentral Lost in My Mind"}, "length": "76293", "position": "10", "id": "716fe2c9-47b8-3719-8586-e4ed47694a10", "track_or_recording_length": "76293"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "11", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "214266", "artist-credit-phrase": "The KLF", "id": "d9dd3bc7-ae2a-4b62-a545-8a60f5704a7d", "title": "The Lights of Baton Rouge Pass By"}, "length": "196600", "position": "11", "id": "3220c725-d7cb-3d81-8fb9-91e5a2f94cc9", "track_or_recording_length": "196600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Space", "disambiguation": "Jimmy Cauty's ambient off-shoot of The Orb/The KLF", "id": "22240df3-8dcc-4272-9294-d127442e7f36", "name": "Space"}}], "length": "2302560", "artist-credit-phrase": "Space", "id": "42391d00-df70-4014-83f8-e980a6b695b3", "title": "Mercury / Venus / Mars / Jupiter / Saturn / Uranus / Neptune / Pluto"}, "length": "2302000", "title": "Space", "position": "12", "artist-credit-phrase": "The KLF", "track_or_recording_length": "2302000", "id": "b65aa927-6edf-340b-82b4-fbc34a5f5a0b", "number": "12"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "artist-credit-phrase": "The KLF", "release-group": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "first-release-date": "", "secondary-type-list": ["Compilation"], "primary-type": "Album", "title": "Space & Chill Out", "type": "Compilation", "id": "0b5e666a-b5d8-3dea-b6fc-9ab9c35b96ce", "artist-credit-phrase": "The KLF"}, "id": "c56ff16e-1d81-47de-926f-ba22891bd2bd"}} \ No newline at end of file diff --git a/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json b/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json index f9b2014e..e4ee5600 100644 --- a/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json +++ b/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "5033197358222", "asin": "B000CNEQ64", "label-info-count": 1, "label-info-list": [{"catalog-number": "VVR1035822", "label": {"label-code": "1801", "sort-name": "V2", "disambiguation": "imprint of V2 Music Ltd. and its international subsidiaries", "id": "dc2f5993-7a3d-4c59-bba0-0a77bf9d7416", "name": "V2"}}], "cover-art-archive": {"count": "10", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2006-01-30", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006-01-30", "quality": "normal", "id": "e32ae79a-336e-4d33-945c-8c5e8206dbd3", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "60f05f29-4949-3902-a525-b3d24b0029f4", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "978ab42b-043c-394b-a144-ee1e00db9bab", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "7a70fbf6-69e3-3ce0-9a85-53e6ded2f5ea", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2ae31462-4fb2-350f-9778-2104d6c2dd3b", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "cf8778eb-8b07-36f1-b24b-2d71af06fa29", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "a2cb63ac-606a-3721-a196-6f55c38694f8", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "9bf96f8b-8e04-31bb-a42c-1a24d2b5bc0a", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "6179abe2-cdb3-365a-95e4-4d1f0c3f1b9c", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "68c1a96c-bcb1-3d9a-ad86-e2a5db5b0291", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "431aeb0c-25d0-3f9a-9fb3-b391929de5e1", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "65750cb3-a552-33f6-acb2-a77c68638976", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "6afbb338-d9fd-37ce-a212-1f5d491b6cf4", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "5033197358222", "asin": "B000CNEQ64", "label-info-count": 1, "label-info-list": [{"catalog-number": "VVR1035822", "label": {"label-code": "1801", "sort-name": "V2", "disambiguation": "imprint of V2 Music Ltd. and its international subsidiaries", "id": "dc2f5993-7a3d-4c59-bba0-0a77bf9d7416", "name": "V2"}}], "cover-art-archive": {"count": "10", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2006-01-30", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006-01-30", "quality": "normal", "id": "e32ae79a-336e-4d33-945c-8c5e8206dbd3", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "release-group": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "first-release-date": "2006-01-30", "primary-type": "Album", "title": "Ballad of the Broken Seas", "type": "Album", "id": "994cdad1-0365-3439-89ed-6686bd563503", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "60f05f29-4949-3902-a525-b3d24b0029f4", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "978ab42b-043c-394b-a144-ee1e00db9bab", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "7a70fbf6-69e3-3ce0-9a85-53e6ded2f5ea", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2ae31462-4fb2-350f-9778-2104d6c2dd3b", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "cf8778eb-8b07-36f1-b24b-2d71af06fa29", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "a2cb63ac-606a-3721-a196-6f55c38694f8", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "9bf96f8b-8e04-31bb-a42c-1a24d2b5bc0a", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "6179abe2-cdb3-365a-95e4-4d1f0c3f1b9c", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "68c1a96c-bcb1-3d9a-ad86-e2a5db5b0291", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "431aeb0c-25d0-3f9a-9fb3-b391929de5e1", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "65750cb3-a552-33f6-acb2-a77c68638976", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "6afbb338-d9fd-37ce-a212-1f5d491b6cf4", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json b/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json index e1ec3494..d9fd47f7 100644 --- a/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json +++ b/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "barcode": "5050466625021", "asin": "B000095K86", "label-info-count": 1, "label-info-list": [{"catalog-number": "5050466-6250-2-1", "label": {"sort-name": "Warner Strategic Marketing", "label-code": "2828", "id": "640ea9b1-3811-4c06-8897-5918c16f9fe1", "name": "Warner Strategic Marketing"}}], "cover-art-archive": {"count": "2", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2003-05-19", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "packaging": "Slim Jewel Case", "text-representation": {"language": "deu", "script": "Latn"}, "date": "2003-05-19", "quality": "normal", "id": "f484a9fc-db21-4106-9408-bcd105c90047", "release-event-count": 1, "title": "Anyplace, Anywhere, Anytime", "country": "DE", "medium-count": 1, "artist-credit-phrase": "Nena & Kim Wilde", "medium-list": [{"position": "1", "track-count": 4, "format": "CD", "disc-list": [{"offset-list": [150, 17037, 35418, 53803], "id": "X2c2IQ5vUy5x6Jh7Xi_DGHtA1X8-", "sectors": "66872", "offset-count": 4}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "1", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "223000", "artist-credit-phrase": "Nena & Kim Wilde", "id": "fde5622c-ce23-4ebb-975d-51d4a926f901", "title": "Anyplace, Anywhere, Anytime (radio version)"}, "length": "225160", "position": "1", "id": "1cc96e78-28ed-3820-b0b6-614c35b121ac", "track_or_recording_length": "225160"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " mit ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "243453", "artist-credit-phrase": "Nena mit Kim Wilde", "id": "5f19758e-7421-4c71-a599-9a9575d8e1b0", "title": "Anyplace, Anywhere, Anytime (new version)"}, "length": "245080", "position": "2", "artist-credit-phrase": "Nena & Kim Wilde", "track_or_recording_length": "245080", "id": "f16db4bf-9a34-3d5a-a975-c9375ab7a2ca", "number": "2"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "3", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "243266", "artist-credit-phrase": "Nena", "id": "32706323-1a08-4c7e-bf21-9a44934498ba", "title": "Irgendwie, irgendwo, irgendwann (new version)"}, "length": "245133", "position": "3", "id": "ce2c4edd-6eab-36c8-8f84-e8c85f197a88", "track_or_recording_length": "245133"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "4", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "175440", "artist-credit-phrase": "Nena", "id": "ea70231c-cc03-4900-9a5a-43afb18ed638", "title": "Nur getr\u00e4umt (new version)"}, "length": "173627", "position": "4", "id": "6e178989-7d8e-3c33-9628-50bdda7c4483", "track_or_recording_length": "173627"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "barcode": "5050466625021", "asin": "B000095K86", "label-info-count": 1, "label-info-list": [{"catalog-number": "5050466-6250-2-1", "label": {"sort-name": "Warner Strategic Marketing", "label-code": "2828", "id": "640ea9b1-3811-4c06-8897-5918c16f9fe1", "name": "Warner Strategic Marketing"}}], "cover-art-archive": {"count": "2", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2003-05-19", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "packaging": "Slim Jewel Case", "text-representation": {"language": "deu", "script": "Latn"}, "date": "2003-05-19", "quality": "normal", "id": "f484a9fc-db21-4106-9408-bcd105c90047", "release-event-count": 1, "title": "Anyplace, Anywhere, Anytime", "country": "DE", "medium-count": 1, "artist-credit-phrase": "Nena & Kim Wilde", "release-group": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "first-release-date": "2003-05-19", "primary-type": "Single", "title": "Anyplace, Anywhere, Anytime", "type": "Single", "id": "3bbf5f32-dbef-3fe8-b4b4-c52d63abf282", "artist-credit-phrase": "Nena & Kim Wilde"}, "medium-list": [{"position": "1", "track-count": 4, "format": "CD", "disc-list": [{"offset-list": [150, 17037, 35418, 53803], "id": "X2c2IQ5vUy5x6Jh7Xi_DGHtA1X8-", "sectors": "66872", "offset-count": 4}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "1", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "223000", "artist-credit-phrase": "Nena & Kim Wilde", "id": "fde5622c-ce23-4ebb-975d-51d4a926f901", "title": "Anyplace, Anywhere, Anytime (radio version)"}, "length": "225160", "position": "1", "id": "1cc96e78-28ed-3820-b0b6-614c35b121ac", "track_or_recording_length": "225160"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " mit ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "243453", "artist-credit-phrase": "Nena mit Kim Wilde", "id": "5f19758e-7421-4c71-a599-9a9575d8e1b0", "title": "Anyplace, Anywhere, Anytime (new version)"}, "length": "245080", "position": "2", "artist-credit-phrase": "Nena & Kim Wilde", "track_or_recording_length": "245080", "id": "f16db4bf-9a34-3d5a-a975-c9375ab7a2ca", "number": "2"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "3", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "243266", "artist-credit-phrase": "Nena", "id": "32706323-1a08-4c7e-bf21-9a44934498ba", "title": "Irgendwie, irgendwo, irgendwann (new version)"}, "length": "245133", "position": "3", "id": "ce2c4edd-6eab-36c8-8f84-e8c85f197a88", "track_or_recording_length": "245133"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "4", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "175440", "artist-credit-phrase": "Nena", "id": "ea70231c-cc03-4900-9a5a-43afb18ed638", "title": "Nur getr\u00e4umt (new version)"}, "length": "173627", "position": "4", "id": "6e178989-7d8e-3c33-9628-50bdda7c4483", "track_or_recording_length": "173627"}], "disc-count": 1}]}} \ No newline at end of file From fa5add0309e8fde6acdea1ec3e2aa14fcca4320e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 19:51:30 +0100 Subject: [PATCH 25/79] Simplify setting release type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We pull in the Release Group information now directly in the original MusicBrainz web service request, so no need to do further processing to get it. Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 25d3c029..bee0ecfd 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -167,7 +167,7 @@ def _getMetadata(releaseShort, release, discid, country=None): discMD = DiscMetadata() - discMD.releaseType = releaseShort.get('release-group', {}).get('type') + discMD.releaseType = release['release-group']['type'] discCredit = _Credit(release['artist-credit']) # FIXME: is there a better way to check for VA ? From 266a272e3cd26627ccfe5a9acf09c831d7423908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 19:54:15 +0100 Subject: [PATCH 26/79] Add testcase to check all release and track metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this bits and pieces of release and track metadata would be tested in the other test cases, but no test cases included all of them. Signed-off-by: Frederik “Freso” S. Olesen --- whipper/test/test_common_mbngs.py | 45 +++++++++++++++++++ ....6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json | 1 + 2 files changed, 46 insertions(+) create mode 100644 whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index a75da35b..52b45352 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -198,3 +198,48 @@ def testNenaAndKimWildSingle(self): u'f16db4bf-9a34-3d5a-a975-c9375ab7a2ca') self.assertEqual(track2.mbidRecording, u'5f19758e-7421-4c71-a599-9a9575d8e1b0') + + def testAllAvailableMetadata(self): + """Check that all possible metadata gets assigned.""" + # Using: David Rovics - The Other Side + # https://musicbrainz.org/release/6109ceed-7e21-490b-b5ad-3a66b4e4cfbb + filename = 'whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json' + path = os.path.join(os.path.dirname(__file__), filename) + handle = open(path, "rb") + response = json.loads(handle.read()) + handle.close() + discid = "cHW1Uutl_kyWNaLJsLmTGTe4rnE-" + + metadata = mbngs._getMetadata({}, response['release'], discid) + self.assertEqual(metadata.artist, u'David Rovics') + self.assertEqual(metadata.sortName, u'Rovics, David') + self.assertFalse(metadata.various) + self.assertIsInstance(metadata.tracks, list) + self.assertEqual(metadata.release, u'2015') + self.assertEqual(metadata.releaseTitle, u'The Other Side') + self.assertEqual(metadata.releaseType, u'Album') + self.assertEqual(metadata.mbid, + u'6109ceed-7e21-490b-b5ad-3a66b4e4cfbb') + self.assertEqual(metadata.mbidReleaseGroup, + u'99850b41-a06e-4fb8-992c-75c191a77803') + self.assertEqual(metadata.mbidArtist, + u'4d56eb9f-13b3-4f05-9db7-50195378d49f') + self.assertEqual(metadata.url, + u'https://musicbrainz.org/release' + '/6109ceed-7e21-490b-b5ad-3a66b4e4cfbb') + self.assertEqual(metadata.catalogNumber, u'[none]') + self.assertEqual(metadata.barcode, u'700261430249') + + self.assertEqual(len(metadata.tracks), 16) + + track1 = metadata.tracks[0] + self.assertEqual(track1.artist, u'David Rovics') + self.assertEqual(track1.title, u'Waiting for the Hurricane') + self.assertEqual(track1.duration, 176320) + self.assertEqual(track1.mbid, + u'4116eea3-b9c2-452a-8d63-92f1e585b225') + self.assertEqual(track1.sortName, u'Rovics, David') + self.assertEqual(track1.mbidArtist, + u'4d56eb9f-13b3-4f05-9db7-50195378d49f') + self.assertEqual(track1.mbidRecording, + u'b191794d-b7c6-4d6f-971e-0a543959b5ad') diff --git a/whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json b/whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json new file mode 100644 index 00000000..55cb9502 --- /dev/null +++ b/whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json @@ -0,0 +1 @@ +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "barcode": "700261430249", "label-info-count": 1, "label-info-list": [{"catalog-number": "[none]", "label": {"sort-name": "[no label]", "disambiguation": "Special purpose label \u2013 white labels, self-published releases and other \u201cno label\u201d releases", "id": "157afde4-4bf5-4039-8ad2-5a15acc85176", "name": "[no label]"}}], "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "release-event-list": [{"date": "2015"}], "packaging": "Cardboard/Paper Sleeve", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2015", "quality": "normal", "id": "6109ceed-7e21-490b-b5ad-3a66b4e4cfbb", "release-event-count": 1, "title": "The Other Side", "medium-count": 1, "artist-credit-phrase": "David Rovics", "release-group": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "first-release-date": "2015-08-31", "primary-type": "Album", "title": "The Other Side", "type": "Album", "id": "99850b41-a06e-4fb8-992c-75c191a77803", "artist-credit-phrase": "David Rovics"}, "medium-list": [{"position": "1", "track-count": 16, "format": "CD", "disc-list": [{"offset-list": [150, 13374, 24544, 40029, 53948, 64717, 75840, 92284, 113387, 128033, 144752, 156524, 173552, 189058, 201726, 214559], "id": "cHW1Uutl_kyWNaLJsLmTGTe4rnE-", "sectors": "224238", "offset-count": 16}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "1", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "176320", "artist-credit-phrase": "David Rovics", "id": "b191794d-b7c6-4d6f-971e-0a543959b5ad", "title": "Waiting for the Hurricane"}, "length": "176320", "position": "1", "id": "4116eea3-b9c2-452a-8d63-92f1e585b225", "track_or_recording_length": "176320"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "2", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "148933", "artist-credit-phrase": "David Rovics", "id": "b570d899-c107-4656-8121-354c7d929d86", "title": "I Can\u2019t Breathe"}, "length": "148933", "position": "2", "id": "82c61a0f-9535-4170-86e9-46c2e5ca81f1", "track_or_recording_length": "148933"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "3", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "206466", "artist-credit-phrase": "David Rovics", "id": "5139256f-687a-4243-947c-e6da432f6c0c", "title": "Liberty and Justice for All"}, "length": "206466", "position": "3", "id": "60d8d1d9-541c-44c9-ab4a-958ae273e2fc", "track_or_recording_length": "206466"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "4", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "185586", "artist-credit-phrase": "David Rovics", "id": "985ed49c-2062-43cd-ab51-46adcd83669c", "title": "Before the War Came Home"}, "length": "185586", "position": "4", "id": "4fd2c3d8-f2af-47dd-b7e6-a37d995679ed", "track_or_recording_length": "185586"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "5", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "143586", "artist-credit-phrase": "David Rovics", "id": "f489a7e5-58a4-4082-9bbc-5d2d431cce53", "title": "Denmark, 1943"}, "length": "143586", "position": "5", "id": "bf53215d-a1b8-411d-af5a-314e1317bf88", "track_or_recording_length": "143586"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "6", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "148306", "artist-credit-phrase": "David Rovics", "id": "cff3765a-83ec-4c5b-8624-a4b8a8d385bb", "title": "Angry White American Man"}, "length": "148306", "position": "6", "id": "0d46a053-5fe7-4220-84c0-e9111334aeb0", "track_or_recording_length": "148306"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "7", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "219243", "artist-credit-phrase": "David Rovics", "id": "804aea02-1708-4cd9-be97-1b31965209e7", "title": "State House Lawn"}, "length": "219253", "position": "7", "id": "a6b07cf7-6332-4d38-9eb6-de14930a1262", "track_or_recording_length": "219253"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "8", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "281373", "artist-credit-phrase": "David Rovics", "id": "79e854da-382e-411c-a78a-c38de78a935a", "title": "They All Sang the Internationale"}, "length": "281373", "position": "8", "id": "d8937d7d-0515-4afe-b0bd-7251661ac9b5", "track_or_recording_length": "281373"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "9", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "195280", "artist-credit-phrase": "David Rovics", "id": "d825d000-3b02-4c6f-81cf-2fbbe0a00286", "title": "Kobane"}, "length": "195280", "position": "9", "id": "b3e4fc3e-c658-402c-92e0-10c0a5935937", "track_or_recording_length": "195280"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "10", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "222920", "artist-credit-phrase": "David Rovics", "id": "d0a9700b-c042-4235-b7c9-4e0030e7b84c", "title": "Joe Hill"}, "length": "222920", "position": "10", "id": "36c07599-a382-4535-bf2d-72e48713f69b", "track_or_recording_length": "222920"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "11", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "156960", "artist-credit-phrase": "David Rovics", "id": "ce3ddc86-a908-4a6e-8fae-30ee8edcbc6d", "title": "Facebook Song"}, "length": "156960", "position": "11", "id": "1e1c16bd-4050-4068-b57d-0a23c91d64fa", "track_or_recording_length": "156960"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "12", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "227040", "artist-credit-phrase": "David Rovics", "id": "be7a4e96-9fcb-433c-a218-74e15a0629fc", "title": "Douglas MacLeod"}, "length": "227040", "position": "12", "id": "4279831f-738c-49fd-a91d-741d2ee05c54", "track_or_recording_length": "227040"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "13", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "206746", "artist-credit-phrase": "David Rovics", "id": "edc58634-8767-4863-b0d9-ec622c7cce64", "title": "Frieden und Freiheit"}, "length": "206746", "position": "13", "id": "b858ae08-21bb-43fe-b8e8-79efaee637dc", "track_or_recording_length": "206746"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "168902", "artist-credit-phrase": "David Rovics", "id": "b81b7edd-1a25-4615-85af-722c9012016c", "title": "Ballad of CeCe McDonald"}, "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "168906", "title": "Ballad of Cece McDonald", "position": "14", "artist-credit-phrase": "David Rovics", "track_or_recording_length": "168906", "id": "48710b96-63b6-44e7-bc8d-2feb1c0a5c67", "number": "14"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "15", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "171106", "artist-credit-phrase": "David Rovics", "id": "3b6afc48-f6e3-47cf-8a0b-d8f2bad86134", "title": "Christmas in a Tent"}, "length": "171106", "position": "15", "id": "1c912678-17ea-4839-9540-71cbd0732913", "track_or_recording_length": "171106"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "129053", "artist-credit-phrase": "David Rovics", "id": "516f6326-0728-46e8-8a26-8ecc8c2fc4f1", "title": "The Ball is Round"}, "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "129053", "title": "The Ball Is Round", "position": "16", "artist-credit-phrase": "David Rovics", "track_or_recording_length": "129053", "id": "e607239f-fc8f-4983-a0cf-7c69d8effa96", "number": "16"}], "disc-count": 1}]}} \ No newline at end of file From 87b94606399c7b6292b6e42244994526086c0a9b Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Wed, 13 Feb 2019 20:13:09 +0100 Subject: [PATCH 27/79] Change musicbrainzngs logging level to WARNING The default log level is INFO. Needed to silence harmless messages like: ', uncaught attribute type-id'. Signed-off-by: JoeLametta --- whipper/common/mbngs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 3400e93a..a03e251f 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -268,6 +268,7 @@ def musicbrainz(discid, country=None, record=False): logger.debug('looking up results for discid %r', discid) import musicbrainzngs + logging.getLogger("musicbrainzngs").setLevel(logging.WARNING) musicbrainzngs.set_useragent("whipper", whipper.__version__, "https://github.com/whipper-team/whipper") ret = [] From 364f024c0802a68d0868409e0305358a1cdb3efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 20:53:07 +0100 Subject: [PATCH 28/79] Add Work MBIDs to ripped files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://musicbrainz.org/doc/Work Third and final and thus closes https://github.com/whipper-team/whipper/issues/200 Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 16 ++++++++++++++++ whipper/common/program.py | 3 +++ whipper/test/test_common_mbngs.py | 2 ++ ...ase.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json | 2 +- ...ase.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json | 2 +- ...ase.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json | 2 +- ...ase.a76714e0-32b1-4ed4-b28e-f86d99642193.json | 2 +- ...ase.c56ff16e-1d81-47de-926f-ba22891bd2bd.json | 2 +- ...ase.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json | 2 +- ...ase.f484a9fc-db21-4106-9408-bcd105c90047.json | 2 +- 10 files changed, 28 insertions(+), 7 deletions(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index bee0ecfd..c667f31c 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -53,6 +53,7 @@ class TrackMetadata(object): sortName = None mbidArtist = None mbidRecording = None + mbidWorks = [] class DiscMetadata(object): @@ -146,6 +147,19 @@ def getIds(self): joinString=";") +def _getWorks(recording): + """Get "performance of" works out of a recording.""" + works = [] + valid_work_rel_types = [ + u'a3005666-a872-32c3-ad06-98af558e99b0', # "Performance" + ] + if 'work-relation-list' in recording: + for work in recording['work-relation-list']: + if work['type-id'] in valid_work_rel_types: + works.append(work['work']['id']) + return works + + def _getMetadata(releaseShort, release, discid, country=None): """ @type release: C{dict} @@ -234,6 +248,7 @@ def _getMetadata(releaseShort, release, discid, country=None): track.title = t['recording']['title'] track.mbid = t['id'] track.mbidRecording = t['recording']['id'] + track.mbidWorks = _getWorks(t['recording']) # FIXME: unit of duration ? track.duration = int(t['recording'].get('length', 0)) @@ -308,6 +323,7 @@ def musicbrainz(discid, country=None, record=False): res = musicbrainzngs.get_release_by_id( release['id'], includes=["artists", "artist-credits", "recordings", "discids", "labels", + "recording-level-rels", "work-rels", "release-groups"]) _record(record, 'release', release['id'], res) releaseDetail = res['release'] diff --git a/whipper/common/program.py b/whipper/common/program.py index 283e1a8f..3d55e6b0 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -397,6 +397,7 @@ def getTagList(self, number, mbdiscid): mbidRecording = track.mbidRecording mbidTrack = track.mbid mbidTrackArtist = track.mbidArtist + mbidWorks = track.mbidWorks except IndexError as e: logger.error('no track %d found, %r', number, e) raise @@ -428,6 +429,8 @@ def getTagList(self, number, mbdiscid): tags['MUSICBRAINZ_ALBUMID'] = mbidRelease tags['MUSICBRAINZ_RELEASEGROUPID'] = mbidReleaseGroup tags['MUSICBRAINZ_ALBUMARTISTID'] = mbidReleaseArtist + if len(mbidWorks) > 0: + tags['MUSICBRAINZ_WORKID'] = mbidWorks # TODO/FIXME: ISRC tag diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index 52b45352..da80fd90 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -243,3 +243,5 @@ def testAllAvailableMetadata(self): u'4d56eb9f-13b3-4f05-9db7-50195378d49f') self.assertEqual(track1.mbidRecording, u'b191794d-b7c6-4d6f-971e-0a543959b5ad') + self.assertEqual(track1.mbidWorks, + [u'90d5be68-0b29-45a3-ba01-c27ad78e3625']) diff --git a/whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json b/whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json index 55cb9502..9c840196 100644 --- a/whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json +++ b/whipper/test/whipper.release.6109ceed-7e21-490b-b5ad-3a66b4e4cfbb.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "barcode": "700261430249", "label-info-count": 1, "label-info-list": [{"catalog-number": "[none]", "label": {"sort-name": "[no label]", "disambiguation": "Special purpose label \u2013 white labels, self-published releases and other \u201cno label\u201d releases", "id": "157afde4-4bf5-4039-8ad2-5a15acc85176", "name": "[no label]"}}], "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "release-event-list": [{"date": "2015"}], "packaging": "Cardboard/Paper Sleeve", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2015", "quality": "normal", "id": "6109ceed-7e21-490b-b5ad-3a66b4e4cfbb", "release-event-count": 1, "title": "The Other Side", "medium-count": 1, "artist-credit-phrase": "David Rovics", "release-group": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "first-release-date": "2015-08-31", "primary-type": "Album", "title": "The Other Side", "type": "Album", "id": "99850b41-a06e-4fb8-992c-75c191a77803", "artist-credit-phrase": "David Rovics"}, "medium-list": [{"position": "1", "track-count": 16, "format": "CD", "disc-list": [{"offset-list": [150, 13374, 24544, 40029, 53948, 64717, 75840, 92284, 113387, 128033, 144752, 156524, 173552, 189058, 201726, 214559], "id": "cHW1Uutl_kyWNaLJsLmTGTe4rnE-", "sectors": "224238", "offset-count": 16}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "1", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "176320", "artist-credit-phrase": "David Rovics", "id": "b191794d-b7c6-4d6f-971e-0a543959b5ad", "title": "Waiting for the Hurricane"}, "length": "176320", "position": "1", "id": "4116eea3-b9c2-452a-8d63-92f1e585b225", "track_or_recording_length": "176320"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "2", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "148933", "artist-credit-phrase": "David Rovics", "id": "b570d899-c107-4656-8121-354c7d929d86", "title": "I Can\u2019t Breathe"}, "length": "148933", "position": "2", "id": "82c61a0f-9535-4170-86e9-46c2e5ca81f1", "track_or_recording_length": "148933"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "3", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "206466", "artist-credit-phrase": "David Rovics", "id": "5139256f-687a-4243-947c-e6da432f6c0c", "title": "Liberty and Justice for All"}, "length": "206466", "position": "3", "id": "60d8d1d9-541c-44c9-ab4a-958ae273e2fc", "track_or_recording_length": "206466"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "4", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "185586", "artist-credit-phrase": "David Rovics", "id": "985ed49c-2062-43cd-ab51-46adcd83669c", "title": "Before the War Came Home"}, "length": "185586", "position": "4", "id": "4fd2c3d8-f2af-47dd-b7e6-a37d995679ed", "track_or_recording_length": "185586"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "5", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "143586", "artist-credit-phrase": "David Rovics", "id": "f489a7e5-58a4-4082-9bbc-5d2d431cce53", "title": "Denmark, 1943"}, "length": "143586", "position": "5", "id": "bf53215d-a1b8-411d-af5a-314e1317bf88", "track_or_recording_length": "143586"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "6", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "148306", "artist-credit-phrase": "David Rovics", "id": "cff3765a-83ec-4c5b-8624-a4b8a8d385bb", "title": "Angry White American Man"}, "length": "148306", "position": "6", "id": "0d46a053-5fe7-4220-84c0-e9111334aeb0", "track_or_recording_length": "148306"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "7", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "219243", "artist-credit-phrase": "David Rovics", "id": "804aea02-1708-4cd9-be97-1b31965209e7", "title": "State House Lawn"}, "length": "219253", "position": "7", "id": "a6b07cf7-6332-4d38-9eb6-de14930a1262", "track_or_recording_length": "219253"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "8", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "281373", "artist-credit-phrase": "David Rovics", "id": "79e854da-382e-411c-a78a-c38de78a935a", "title": "They All Sang the Internationale"}, "length": "281373", "position": "8", "id": "d8937d7d-0515-4afe-b0bd-7251661ac9b5", "track_or_recording_length": "281373"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "9", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "195280", "artist-credit-phrase": "David Rovics", "id": "d825d000-3b02-4c6f-81cf-2fbbe0a00286", "title": "Kobane"}, "length": "195280", "position": "9", "id": "b3e4fc3e-c658-402c-92e0-10c0a5935937", "track_or_recording_length": "195280"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "10", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "222920", "artist-credit-phrase": "David Rovics", "id": "d0a9700b-c042-4235-b7c9-4e0030e7b84c", "title": "Joe Hill"}, "length": "222920", "position": "10", "id": "36c07599-a382-4535-bf2d-72e48713f69b", "track_or_recording_length": "222920"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "11", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "156960", "artist-credit-phrase": "David Rovics", "id": "ce3ddc86-a908-4a6e-8fae-30ee8edcbc6d", "title": "Facebook Song"}, "length": "156960", "position": "11", "id": "1e1c16bd-4050-4068-b57d-0a23c91d64fa", "track_or_recording_length": "156960"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "12", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "227040", "artist-credit-phrase": "David Rovics", "id": "be7a4e96-9fcb-433c-a218-74e15a0629fc", "title": "Douglas MacLeod"}, "length": "227040", "position": "12", "id": "4279831f-738c-49fd-a91d-741d2ee05c54", "track_or_recording_length": "227040"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "13", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "206746", "artist-credit-phrase": "David Rovics", "id": "edc58634-8767-4863-b0d9-ec622c7cce64", "title": "Frieden und Freiheit"}, "length": "206746", "position": "13", "id": "b858ae08-21bb-43fe-b8e8-79efaee637dc", "track_or_recording_length": "206746"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "168902", "artist-credit-phrase": "David Rovics", "id": "b81b7edd-1a25-4615-85af-722c9012016c", "title": "Ballad of CeCe McDonald"}, "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "168906", "title": "Ballad of Cece McDonald", "position": "14", "artist-credit-phrase": "David Rovics", "track_or_recording_length": "168906", "id": "48710b96-63b6-44e7-bc8d-2feb1c0a5c67", "number": "14"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "15", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "171106", "artist-credit-phrase": "David Rovics", "id": "3b6afc48-f6e3-47cf-8a0b-d8f2bad86134", "title": "Christmas in a Tent"}, "length": "171106", "position": "15", "id": "1c912678-17ea-4839-9540-71cbd0732913", "track_or_recording_length": "171106"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "129053", "artist-credit-phrase": "David Rovics", "id": "516f6326-0728-46e8-8a26-8ecc8c2fc4f1", "title": "The Ball is Round"}, "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "129053", "title": "The Ball Is Round", "position": "16", "artist-credit-phrase": "David Rovics", "track_or_recording_length": "129053", "id": "e607239f-fc8f-4983-a0cf-7c69d8effa96", "number": "16"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "barcode": "700261430249", "label-info-count": 1, "label-info-list": [{"catalog-number": "[none]", "label": {"sort-name": "[no label]", "disambiguation": "Special purpose label \u2013 white labels, self-published releases and other \u201cno label\u201d releases", "id": "157afde4-4bf5-4039-8ad2-5a15acc85176", "name": "[no label]"}}], "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "release-event-list": [{"date": "2015"}], "packaging": "Cardboard/Paper Sleeve", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2015", "quality": "normal", "id": "6109ceed-7e21-490b-b5ad-3a66b4e4cfbb", "release-event-count": 1, "title": "The Other Side", "medium-count": 1, "artist-credit-phrase": "David Rovics", "release-group": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "first-release-date": "2015-08-31", "primary-type": "Album", "title": "The Other Side", "type": "Album", "id": "99850b41-a06e-4fb8-992c-75c191a77803", "artist-credit-phrase": "David Rovics"}, "medium-list": [{"position": "1", "track-count": 16, "format": "CD", "disc-list": [{"offset-list": [150, 13374, 24544, 40029, 53948, 64717, 75840, 92284, 113387, 128033, 144752, 156524, 173552, 189058, 201726, 214559], "id": "cHW1Uutl_kyWNaLJsLmTGTe4rnE-", "sectors": "224238", "offset-count": 16}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "1", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Waiting for the Hurricane", "id": "b191794d-b7c6-4d6f-971e-0a543959b5ad", "length": "176320", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "90d5be68-0b29-45a3-ba01-c27ad78e3625", "language": "eng", "title": "Waiting for the Hurricane"}, "type": "performance", "target": "90d5be68-0b29-45a3-ba01-c27ad78e3625"}], "artist-credit-phrase": "David Rovics"}, "length": "176320", "position": "1", "id": "4116eea3-b9c2-452a-8d63-92f1e585b225", "track_or_recording_length": "176320"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "2", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "I Can\u2019t Breathe", "id": "b570d899-c107-4656-8121-354c7d929d86", "length": "148933", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "3d66960f-843b-4af4-a7e6-ed38823ec7e7", "language": "eng", "title": "I Can\u2019t Breathe"}, "type": "performance", "target": "3d66960f-843b-4af4-a7e6-ed38823ec7e7"}], "artist-credit-phrase": "David Rovics"}, "length": "148933", "position": "2", "id": "82c61a0f-9535-4170-86e9-46c2e5ca81f1", "track_or_recording_length": "148933"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "3", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Liberty and Justice for All", "id": "5139256f-687a-4243-947c-e6da432f6c0c", "length": "206466", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "e3462279-6d87-4a87-8160-7a9db8cec17b", "language": "eng", "title": "Liberty and Justice for All"}, "type": "performance", "target": "e3462279-6d87-4a87-8160-7a9db8cec17b"}], "artist-credit-phrase": "David Rovics"}, "length": "206466", "position": "3", "id": "60d8d1d9-541c-44c9-ab4a-958ae273e2fc", "track_or_recording_length": "206466"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "4", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Before the War Came Home", "id": "985ed49c-2062-43cd-ab51-46adcd83669c", "length": "185586", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "e840e64e-87ae-4ab7-81e7-22f4c649faab", "language": "eng", "title": "Before the War Came Home"}, "type": "performance", "target": "e840e64e-87ae-4ab7-81e7-22f4c649faab"}], "artist-credit-phrase": "David Rovics"}, "length": "185586", "position": "4", "id": "4fd2c3d8-f2af-47dd-b7e6-a37d995679ed", "track_or_recording_length": "185586"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "5", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Denmark, 1943", "id": "f489a7e5-58a4-4082-9bbc-5d2d431cce53", "length": "143586", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "f651f2a5-35ec-4b15-baba-6d50b4a13871", "language": "eng", "title": "Denmark, 1943"}, "type": "performance", "target": "f651f2a5-35ec-4b15-baba-6d50b4a13871"}], "artist-credit-phrase": "David Rovics"}, "length": "143586", "position": "5", "id": "bf53215d-a1b8-411d-af5a-314e1317bf88", "track_or_recording_length": "143586"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "6", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Angry White American Man", "id": "cff3765a-83ec-4c5b-8624-a4b8a8d385bb", "length": "148306", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "2ba53ef4-672c-48ad-81e6-dc77c2fcd564", "language": "eng", "title": "Angry White American Man"}, "type": "performance", "target": "2ba53ef4-672c-48ad-81e6-dc77c2fcd564"}], "artist-credit-phrase": "David Rovics"}, "length": "148306", "position": "6", "id": "0d46a053-5fe7-4220-84c0-e9111334aeb0", "track_or_recording_length": "148306"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "7", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "State House Lawn", "id": "804aea02-1708-4cd9-be97-1b31965209e7", "length": "219243", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "dd41f2c4-370e-4225-9128-a7ba45406a1f", "language": "eng", "title": "State House Lawn"}, "type": "performance", "target": "dd41f2c4-370e-4225-9128-a7ba45406a1f"}], "artist-credit-phrase": "David Rovics"}, "length": "219253", "position": "7", "id": "a6b07cf7-6332-4d38-9eb6-de14930a1262", "track_or_recording_length": "219253"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "8", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "They All Sang the Internationale", "id": "79e854da-382e-411c-a78a-c38de78a935a", "length": "281373", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "8983d287-0b10-44c1-b478-3a1db89af889", "language": "eng", "title": "They All Sang the Internationale"}, "type": "performance", "target": "8983d287-0b10-44c1-b478-3a1db89af889"}], "artist-credit-phrase": "David Rovics"}, "length": "281373", "position": "8", "id": "d8937d7d-0515-4afe-b0bd-7251661ac9b5", "track_or_recording_length": "281373"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "9", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Kobane", "id": "d825d000-3b02-4c6f-81cf-2fbbe0a00286", "length": "195280", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "42e3a294-6536-431d-8053-7e1e89c5f392", "language": "eng", "title": "Kobane"}, "type": "performance", "target": "42e3a294-6536-431d-8053-7e1e89c5f392"}], "artist-credit-phrase": "David Rovics"}, "length": "195280", "position": "9", "id": "b3e4fc3e-c658-402c-92e0-10c0a5935937", "track_or_recording_length": "195280"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "10", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Joe Hill", "id": "d0a9700b-c042-4235-b7c9-4e0030e7b84c", "length": "222920", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "2ddf7b60-f9a1-4186-91dc-7d5f67dd5a5f", "language": "eng", "title": "Joe Hill"}, "type": "performance", "target": "2ddf7b60-f9a1-4186-91dc-7d5f67dd5a5f"}], "artist-credit-phrase": "David Rovics"}, "length": "222920", "position": "10", "id": "36c07599-a382-4535-bf2d-72e48713f69b", "track_or_recording_length": "222920"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "11", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Facebook Song", "id": "ce3ddc86-a908-4a6e-8fae-30ee8edcbc6d", "length": "156960", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "951c967d-c2da-42f4-b453-5d7ac1e6e0a2", "language": "eng", "title": "Facebook Song"}, "type": "performance", "target": "951c967d-c2da-42f4-b453-5d7ac1e6e0a2"}], "artist-credit-phrase": "David Rovics"}, "length": "156960", "position": "11", "id": "1e1c16bd-4050-4068-b57d-0a23c91d64fa", "track_or_recording_length": "156960"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "12", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Douglas MacLeod", "id": "be7a4e96-9fcb-433c-a218-74e15a0629fc", "length": "227040", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "28317334-e67e-45bd-a6ca-1004b563aa8c", "language": "eng", "title": "Douglas MacLeod"}, "type": "performance", "target": "28317334-e67e-45bd-a6ca-1004b563aa8c"}], "artist-credit-phrase": "David Rovics"}, "length": "227040", "position": "12", "id": "4279831f-738c-49fd-a91d-741d2ee05c54", "track_or_recording_length": "227040"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "13", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Frieden und Freiheit", "id": "edc58634-8767-4863-b0d9-ec622c7cce64", "length": "206746", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "6a3e45eb-3bd9-4149-85d0-0d3c8ef2f3d6", "language": "eng", "title": "Frieden und Freiheit"}, "type": "performance", "target": "6a3e45eb-3bd9-4149-85d0-0d3c8ef2f3d6"}], "artist-credit-phrase": "David Rovics"}, "length": "206746", "position": "13", "id": "b858ae08-21bb-43fe-b8e8-79efaee637dc", "track_or_recording_length": "206746"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Ballad of CeCe McDonald", "id": "b81b7edd-1a25-4615-85af-722c9012016c", "length": "168902", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "337f1ce9-a284-4edb-86b9-befd64f9718f", "language": "eng", "title": "Ballad of Cece McDonald"}, "type": "performance", "target": "337f1ce9-a284-4edb-86b9-befd64f9718f"}], "artist-credit-phrase": "David Rovics"}, "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "168906", "title": "Ballad of Cece McDonald", "position": "14", "artist-credit-phrase": "David Rovics", "track_or_recording_length": "168906", "id": "48710b96-63b6-44e7-bc8d-2feb1c0a5c67", "number": "14"}, {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "number": "15", "artist-credit-phrase": "David Rovics", "recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "Christmas in a Tent", "id": "3b6afc48-f6e3-47cf-8a0b-d8f2bad86134", "length": "171106", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "90e77381-32c0-44fa-b809-2147c847f5e8", "language": "eng", "title": "Christmas in a Tent"}, "type": "performance", "target": "90e77381-32c0-44fa-b809-2147c847f5e8"}], "artist-credit-phrase": "David Rovics"}, "length": "171106", "position": "15", "id": "1c912678-17ea-4839-9540-71cbd0732913", "track_or_recording_length": "171106"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "title": "The Ball is Round", "id": "516f6326-0728-46e8-8a26-8ecc8c2fc4f1", "length": "129053", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "23e1e6b0-47f6-40e9-9680-c1a65617986e", "language": "eng", "title": "The Ball Is Round"}, "type": "performance", "target": "23e1e6b0-47f6-40e9-9680-c1a65617986e"}], "artist-credit-phrase": "David Rovics"}, "artist-credit": [{"artist": {"sort-name": "Rovics, David", "id": "4d56eb9f-13b3-4f05-9db7-50195378d49f", "name": "David Rovics"}}], "length": "129053", "title": "The Ball Is Round", "position": "16", "artist-credit-phrase": "David Rovics", "track_or_recording_length": "129053", "id": "e607239f-fc8f-4983-a0cf-7c69d8effa96", "number": "16"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json b/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json index b5a7de88..5d76080e 100644 --- a/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json +++ b/whipper/test/whipper.release.8478d4da-0cda-4e46-ae8c-1eeacfa5cf37.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "label-info-list": [{"catalog-number": "BP723-2", "label": {"sort-name": "Freshchest", "id": "fcd792aa-7fd4-4438-9ce3-35dceb156b83", "name": "Freshchest"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2003", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2003", "quality": "normal", "id": "8478d4da-0cda-4e46-ae8c-1eeacfa5cf37", "release-event-count": 1, "title": "Sloppy Seconds, Volume 1", "country": "US", "artist-credit-phrase": "CunninLynguists", "release-group": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "first-release-date": "2003", "secondary-type-list": ["Mixtape/Street"], "primary-type": "Album", "title": "Sloppy Seconds, Volume 1", "type": "Album", "id": "00693d76-b056-314f-aa6d-16aa5106e223", "artist-credit-phrase": "CunninLynguists"}, "medium-list": [{"position": "1", "track-count": 30, "format": "CD", "disc-list": [{"offset-list": [150, 16982, 29710, 38768, 58738, 70167, 78721, 81844, 86334, 102549, 105097, 114494, 128067, 142341, 149139, 170938, 188766, 200610, 217291, 223081, 231298, 240204, 253311, 269573, 282860, 296839, 310659, 314148, 328990, 331951], "id": "RhrwgVb0hZNkabQCw1dZIhdbMFg-", "sectors": "350674", "offset-count": 30}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "number": "1", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "224426", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "2b2b9382-3097-44ac-b79f-82d9e3d23ede", "title": "We're From the Internet (skit)"}, "length": "224426", "position": "1", "id": "9bee2534-0184-32e9-90b4-cd437a2d71ca", "track_or_recording_length": "224426"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "2", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "169706", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "id": "b8cc8672-8bdd-4007-82e0-ca3641816ca9", "title": "Pump It Up Freestyle"}, "length": "169706", "position": "2", "id": "2997a739-6f10-344e-a3c3-5d0037ee6e51", "track_or_recording_length": "169706"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "3", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "120773", "artist-credit-phrase": "Deacon the Villain", "id": "86cf3e45-3649-4cba-a9e8-2d5016971d2d", "title": "Watch Yo Mowf"}, "length": "120773", "position": "3", "id": "4fae0fab-544d-31e1-a861-549bcd700570", "track_or_recording_length": "120773"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "4", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "length": "266266", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "id": "aef41bb9-0fbf-4439-b3c4-acf0c67d7095", "title": "Over the Hills"}, "length": "266266", "position": "4", "id": "a9c177ea-2f8b-39b5-880c-72e506e15946", "track_or_recording_length": "266266"}, {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "number": "5", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "recording": {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "length": "152386", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "id": "54549fd0-f79c-45f5-89d8-f5a21d115e2e", "title": "P.T.A."}, "length": "152386", "position": "5", "id": "43740b12-fc31-32d3-95e2-e9eb6ddb1113", "track_or_recording_length": "152386"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "6", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "114053", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "5eb21493-6e55-4c91-a36d-a7fbfd46333c", "title": "Skew It on the Bar-B Freestyle"}, "length": "114053", "position": "6", "id": "f74fcf48-30b8-3ef7-9dac-72ae1f86ebbc", "track_or_recording_length": "114053"}, {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "number": "7", "artist-credit-phrase": "Chico & the Man", "recording": {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "length": "41640", "artist-credit-phrase": "Chico & the Man", "id": "377ac3ee-397a-41ce-a80c-64883f6b6f0d", "title": "Chico and the Man LP Drop"}, "length": "41640", "position": "7", "id": "efc7987f-6e34-3105-8a34-64bf3c244664", "track_or_recording_length": "41640"}, {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "number": "8", "artist-credit-phrase": "???", "recording": {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "length": "59866", "artist-credit-phrase": "???", "id": "931863f4-05e1-46a5-b81e-4c0417a88fd6", "title": "???"}, "length": "59866", "position": "8", "id": "a04ee451-46c3-3ad6-a815-d7bb8449d605", "track_or_recording_length": "59866"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "212333", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "id": "f2dc4fa7-f7a5-4c60-9819-e80adfe1f3de", "title": "Love Ain\u2019t (remix)"}, "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "216200", "title": "Love Ain't (remix)", "position": "9", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "track_or_recording_length": "216200", "id": "f5ef38ad-b7ba-3152-8ffb-de63146e58e0", "number": "9"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "10", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "33973", "artist-credit-phrase": "Deacon the Villain", "id": "548dec24-bf29-4615-bcd9-93d423368c08", "title": "Deacon the Villain LP Drop"}, "length": "33973", "position": "10", "id": "15b88810-680e-36dc-a937-969582d864b1", "track_or_recording_length": "33973"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "11", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "125293", "artist-credit-phrase": "Deacon the Villain", "id": "4c97aed9-9200-482f-a35e-60a17d0ab764", "title": "Affirmative Action Freestyle"}, "length": "125293", "position": "11", "id": "9ddd49a6-c2f1-327d-bcb2-4abd645a66cd", "track_or_recording_length": "125293"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "12", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "180973", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "id": "4b1f0c69-4956-4d91-8ee6-b6e8bd95a70f", "title": "Sticky Green"}, "length": "180973", "position": "12", "id": "85066330-eefd-3e45-8640-4949fcd9bd24", "track_or_recording_length": "180973"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "13", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "190320", "artist-credit-phrase": "Mr. SOS", "id": "61105c6b-fc5e-4507-9b82-31e9ae620422", "title": "Earth's Essence"}, "length": "190320", "position": "13", "id": "d5dc3651-dffc-3cba-a30e-9d9411dbd0f0", "track_or_recording_length": "190320"}, {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "number": "14", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "recording": {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "length": "90640", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "id": "68b76219-e5dd-4b93-bf33-39e7d76ceaa3", "title": "If U Only Knew"}, "length": "90640", "position": "14", "id": "5266bddc-cbca-3310-af98-0a4531c8c150", "track_or_recording_length": "90640"}, {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "15", "artist-credit-phrase": "J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "290653", "artist-credit-phrase": "J. Bully", "id": "4f584807-328c-466d-8ed9-cd999c3ef17b", "title": "Off the Chain"}, "length": "290653", "position": "15", "id": "1499cc7a-a6b4-3b35-bd55-99616cea0c03", "track_or_recording_length": "290653"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "number": "16", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "length": "237706", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "id": "ffd83bc9-9344-4c1d-a96f-81e43a4e2729", "title": "Mic Like a Memory (remix)"}, "length": "237706", "position": "16", "id": "09b26577-5004-3f97-837c-4f2566b720e0", "track_or_recording_length": "237706"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "number": "17", "artist-credit-phrase": "CunninLynguists", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "length": "157920", "artist-credit-phrase": "CunninLynguists", "id": "585963b2-de5a-44d1-9241-f046cf93b50f", "title": "The Fellationelles (skit)"}, "length": "157920", "position": "17", "id": "4f22deb8-1ef3-3ba5-9b1b-0fd04d2156bc", "track_or_recording_length": "157920"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "18", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "length": "222413", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "id": "8043db30-f208-442e-96e2-ddbd3031e1b9", "title": "Nasty Filthy (remix)"}, "length": "222413", "position": "18", "id": "210a235b-848e-3bce-b1bd-cead7161d4d4", "track_or_recording_length": "222413"}, {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "19", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "77200", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "id": "cf465ac5-6b42-4ce3-b982-f46558e1b369", "title": "Irrational"}, "length": "77200", "position": "19", "id": "fe48d5e1-3664-33b0-9bb1-e50fa4cdd000", "track_or_recording_length": "77200"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "20", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "109560", "artist-credit-phrase": "Mr. SOS", "id": "fed3eae2-a991-4e01-abae-8deb024020d2", "title": "Dem Thangs Freestyle"}, "length": "109560", "position": "20", "id": "0414ac89-51c8-3891-baad-a54eb89ca8f3", "track_or_recording_length": "109560"}, {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "21", "artist-credit-phrase": "Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "118746", "artist-credit-phrase": "Kno", "id": "fc1a987d-27fd-4f44-8968-9da3f9b223df", "title": "Never Scared Freestyle (Philaflava Drop remix)"}, "length": "118746", "position": "21", "id": "d1441885-ef76-32ae-979e-b54d63846447", "track_or_recording_length": "118746"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "22", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "174760", "artist-credit-phrase": "Deacon the Villain", "id": "0d06dddc-a851-4fb5-a20d-36b550825415", "title": "Lay Low Freestyle (Philaflava Drop)"}, "length": "174760", "position": "22", "id": "b4f61c9d-f08a-3477-addf-f4db497ad786", "track_or_recording_length": "174760"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "number": "23", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "length": "216826", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "id": "b0932e20-4172-4e37-bf4b-00f4e0984764", "title": "Seasons (remix)"}, "length": "216826", "position": "23", "id": "36bc053e-1b5d-3b20-b187-045cbbb5c1e6", "track_or_recording_length": "216826"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "24", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "177160", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "id": "964be293-f5bf-4918-9a7f-05f410311f8c", "title": "Made You Look Freestyle"}, "length": "177160", "position": "24", "id": "4daaeae0-7328-381d-9cff-68c9d609189e", "track_or_recording_length": "177160"}, {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "25", "artist-credit-phrase": "Chapter 13 feat. Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "length": "186386", "artist-credit-phrase": "Chapter 13 feat. Kno", "id": "23dc2d05-96d8-4f4d-bb89-48cf67d6ba9a", "title": "Rock Stars"}, "length": "186386", "position": "25", "id": "296183bf-d3ae-35c8-8540-6b5afd26ecd8", "track_or_recording_length": "186386"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "26", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "length": "184266", "artist-credit-phrase": "Deacon the Villain", "id": "9fff281c-36a3-4bfc-9d3c-ca5686d46729", "title": "Welcome to NY Freestyle"}, "length": "184266", "position": "26", "id": "3a5c05c5-06d9-3680-883e-82698bb48fb5", "track_or_recording_length": "184266"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "27", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "46520", "artist-credit-phrase": "Mr. SOS", "id": "6af81f1f-e096-4e46-a8ef-19c5c1f20ca5", "title": "Mr. SOS LP Drop"}, "length": "46520", "position": "27", "id": "3757cce8-1db3-39be-b961-49594a6f5acb", "track_or_recording_length": "46520"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "28", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "length": "197893", "artist-credit-phrase": "Mr. SOS", "id": "c56910c3-e3c6-47d5-b0f5-f2d3eb5f94b7", "title": "Rap Name Freestyle"}, "length": "197893", "position": "28", "id": "8bae4909-52f5-3449-a25d-94839cef4d98", "track_or_recording_length": "197893"}, {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "number": "29", "artist-credit-phrase": "Cashmere The PRO", "recording": {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "length": "39480", "artist-credit-phrase": "Cashmere The PRO", "id": "2dac6cd1-d417-4f56-ac6a-2f1649db7973", "title": "Cashmere the PRO LP Drop"}, "length": "39480", "position": "29", "id": "53a3c755-b1ec-37af-abee-ab786f916495", "track_or_recording_length": "39480"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "number": "30", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "length": "248987", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "id": "e0e01c45-9f38-4cf5-aba9-b3bab76d8e9e", "title": "Magic Stick Freestyle"}, "length": "248987", "position": "30", "id": "399d05a4-71d7-3fcc-83c0-5403ab42ec4f", "track_or_recording_length": "248987"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "label-info-list": [{"catalog-number": "BP723-2", "label": {"sort-name": "Freshchest", "id": "fcd792aa-7fd4-4438-9ce3-35dceb156b83", "name": "Freshchest"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2003", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2003", "quality": "normal", "id": "8478d4da-0cda-4e46-ae8c-1eeacfa5cf37", "release-event-count": 1, "title": "Sloppy Seconds, Volume 1", "country": "US", "artist-credit-phrase": "CunninLynguists", "release-group": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "first-release-date": "2003", "secondary-type-list": ["Mixtape/Street"], "primary-type": "Album", "title": "Sloppy Seconds, Volume 1", "type": "Album", "id": "00693d76-b056-314f-aa6d-16aa5106e223", "artist-credit-phrase": "CunninLynguists"}, "medium-list": [{"position": "1", "track-count": 30, "format": "CD", "disc-list": [{"offset-list": [150, 16982, 29710, 38768, 58738, 70167, 78721, 81844, 86334, 102549, 105097, 114494, 128067, 142341, 149139, 170938, 188766, 200610, 217291, 223081, 231298, 240204, 253311, 269573, 282860, 296839, 310659, 314148, 328990, 331951], "id": "RhrwgVb0hZNkabQCw1dZIhdbMFg-", "sectors": "350674", "offset-count": 30}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "number": "1", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "title": "We're From the Internet (skit)", "id": "2b2b9382-3097-44ac-b79f-82d9e3d23ede", "length": "224426", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "c9810aae-ed74-4c9e-b0a7-a3cf0783e5b3", "language": "eng", "title": "We're From the Internet (skit)"}, "type": "performance", "target": "c9810aae-ed74-4c9e-b0a7-a3cf0783e5b3"}], "artist-credit-phrase": "CunninLynguists feat. Tonedeff"}, "length": "224426", "position": "1", "id": "9bee2534-0184-32e9-90b4-cd437a2d71ca", "track_or_recording_length": "224426"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "2", "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "title": "Pump It Up Freestyle", "id": "b8cc8672-8bdd-4007-82e0-ca3641816ca9", "length": "169706", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "b20ab537-1635-48d3-a745-84596cb29116", "language": "eng", "title": "Pump It Up Freestyle"}, "type": "performance", "target": "b20ab537-1635-48d3-a745-84596cb29116"}], "artist-credit-phrase": "Mr. SOS & Deacon the Villain feat. Natti"}, "length": "169706", "position": "2", "id": "2997a739-6f10-344e-a3c3-5d0037ee6e51", "track_or_recording_length": "169706"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "3", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Watch Yo Mowf", "id": "86cf3e45-3649-4cba-a9e8-2d5016971d2d", "length": "120773", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "dff6dd64-442b-4863-8eba-0a7ec26c6805", "language": "eng", "title": "Watch Yo Mowf"}, "type": "performance", "target": "dff6dd64-442b-4863-8eba-0a7ec26c6805"}], "artist-credit-phrase": "Deacon the Villain"}, "length": "120773", "position": "3", "id": "4fae0fab-544d-31e1-a861-549bcd700570", "track_or_recording_length": "120773"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "number": "4", "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}, " feat. ", {"artist": {"sort-name": "Bonified Circle", "id": "832b7f0d-5f6c-4068-9315-383bf03344b1", "name": "Bonified Circle"}}, " & ", {"artist": {"sort-name": "Natti", "disambiguation": "US rapper Garrett Bush of CunninLynguists", "id": "2f237389-5603-45eb-9024-dbc05d2c840a", "name": "Natti"}}], "title": "Over the Hills", "id": "aef41bb9-0fbf-4439-b3c4-acf0c67d7095", "length": "266266", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "0f678111-3083-4a3e-96ab-80560b99cd18", "language": "eng", "title": "Over the Hills"}, "type": "performance", "target": "0f678111-3083-4a3e-96ab-80560b99cd18"}], "artist-credit-phrase": "Deacon the Villain feat. Bonified Circle & Natti"}, "length": "266266", "position": "4", "id": "a9c177ea-2f8b-39b5-880c-72e506e15946", "track_or_recording_length": "266266"}, {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "number": "5", "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro", "recording": {"artist-credit": [{"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}, " feat. ", {"artist": {"sort-name": "King Tee", "id": "7ec04edc-59ce-4fc4-8c0a-f519f38be4fd", "name": "King Tee"}}, " & ", {"artist": {"sort-name": "J\u2010Ro", "id": "1ed0e74d-cc70-45cd-9687-87851cfcaf25", "name": "J\u2010Ro"}}], "title": "P.T.A.", "id": "54549fd0-f79c-45f5-89d8-f5a21d115e2e", "length": "152386", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "f728a8e5-1165-4f10-9935-e5ed2385cb2c", "language": "eng", "title": "P.T.A."}, "type": "performance", "target": "f728a8e5-1165-4f10-9935-e5ed2385cb2c"}], "artist-credit-phrase": "Masta Ace feat. King Tee & J\u2010Ro"}, "length": "152386", "position": "5", "id": "43740b12-fc31-32d3-95e2-e9eb6ddb1113", "track_or_recording_length": "152386"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "6", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Skew It on the Bar-B Freestyle", "id": "5eb21493-6e55-4c91-a36d-a7fbfd46333c", "length": "114053", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "898ea93d-8ead-46fb-aefc-6c4365f01cef", "language": "eng", "title": "Skew It on the Bar-B Freestyle"}, "type": "performance", "target": "898ea93d-8ead-46fb-aefc-6c4365f01cef"}], "artist-credit-phrase": "Mr. SOS & Deacon the Villain"}, "length": "114053", "position": "6", "id": "f74fcf48-30b8-3ef7-9dac-72ae1f86ebbc", "track_or_recording_length": "114053"}, {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "number": "7", "artist-credit-phrase": "Chico & the Man", "recording": {"artist-credit": [{"name": "Chico & the Man", "artist": {"sort-name": "Chico and the Man", "id": "0b986f78-14e4-41a9-8fef-ee6668043f91", "name": "Chico and the Man"}}], "title": "Chico and the Man LP Drop", "id": "377ac3ee-397a-41ce-a80c-64883f6b6f0d", "length": "41640", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "ee7d3fb7-953c-4c90-9f3e-18b268cbc2bb", "language": "eng", "title": "Chico and the Man LP Drop"}, "type": "performance", "target": "ee7d3fb7-953c-4c90-9f3e-18b268cbc2bb"}], "artist-credit-phrase": "Chico & the Man"}, "length": "41640", "position": "7", "id": "efc7987f-6e34-3105-8a34-64bf3c244664", "track_or_recording_length": "41640"}, {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "number": "8", "artist-credit-phrase": "???", "recording": {"artist-credit": [{"name": "???", "artist": {"sort-name": "[unknown]", "disambiguation": "Special Purpose Artist - Do not add releases here, if possible.", "id": "125ec42a-7229-4250-afc5-e057484327fe", "name": "[unknown]"}}], "length": "59866", "artist-credit-phrase": "???", "id": "931863f4-05e1-46a5-b81e-4c0417a88fd6", "title": "???"}, "length": "59866", "position": "8", "id": "a04ee451-46c3-3ad6-a815-d7bb8449d605", "track_or_recording_length": "59866"}, {"recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "title": "Love Ain\u2019t (remix)", "id": "f2dc4fa7-f7a5-4c60-9819-e80adfe1f3de", "length": "212333", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "579e3858-28cf-47e0-a52d-3e369bd7318a", "language": "eng", "title": "Love Ain\u2019t (remix)"}, "type": "performance", "target": "579e3858-28cf-47e0-a52d-3e369bd7318a"}], "artist-credit-phrase": "CunninLynguists feat. Tonedeff"}, "artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Tonedeff", "id": "b3869d83-9fb5-4eac-b5ca-2d155fcbee12", "name": "Tonedeff"}}], "length": "216200", "title": "Love Ain't (remix)", "position": "9", "artist-credit-phrase": "CunninLynguists feat. Tonedeff", "track_or_recording_length": "216200", "id": "f5ef38ad-b7ba-3152-8ffb-de63146e58e0", "number": "9"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "10", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Deacon the Villain LP Drop", "id": "548dec24-bf29-4615-bcd9-93d423368c08", "length": "33973", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "3e719dda-8bfd-440a-94a5-ae23b1b9f20c", "language": "eng", "title": "Deacon the Villain LP Drop"}, "type": "performance", "target": "3e719dda-8bfd-440a-94a5-ae23b1b9f20c"}], "artist-credit-phrase": "Deacon the Villain"}, "length": "33973", "position": "10", "id": "15b88810-680e-36dc-a937-969582d864b1", "track_or_recording_length": "33973"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "11", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Affirmative Action Freestyle", "id": "4c97aed9-9200-482f-a35e-60a17d0ab764", "length": "125293", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "89fda8ab-69eb-4236-b72e-7ba28a192bf0", "language": "eng", "title": "Affirmative Action Freestyle"}, "type": "performance", "target": "89fda8ab-69eb-4236-b72e-7ba28a192bf0"}], "artist-credit-phrase": "Deacon the Villain"}, "length": "125293", "position": "11", "id": "9ddd49a6-c2f1-327d-bcb2-4abd645a66cd", "track_or_recording_length": "125293"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "12", "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " feat. ", {"artist": {"sort-name": "Showtime", "disambiguation": "US rapper", "id": "d57d1d07-0ee0-446a-9891-981da27a1145", "name": "Showtime"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Sticky Green", "id": "4b1f0c69-4956-4d91-8ee6-b6e8bd95a70f", "length": "180973", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "d26d573e-fa7f-494c-a693-91a662d530ea", "language": "eng", "title": "Sticky Green"}, "type": "performance", "target": "d26d573e-fa7f-494c-a693-91a662d530ea"}], "artist-credit-phrase": "Mr. SOS feat. Showtime & Deacon the Villain"}, "length": "180973", "position": "12", "id": "85066330-eefd-3e45-8640-4949fcd9bd24", "track_or_recording_length": "180973"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "13", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "title": "Earth's Essence", "id": "61105c6b-fc5e-4507-9b82-31e9ae620422", "length": "190320", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "33ba1c90-cc29-4627-ae71-74c2158b0a5c", "language": "eng", "title": "Earth's Essence"}, "type": "performance", "target": "33ba1c90-cc29-4627-ae71-74c2158b0a5c"}], "artist-credit-phrase": "Mr. SOS"}, "length": "190320", "position": "13", "id": "d5dc3651-dffc-3cba-a30e-9d9411dbd0f0", "track_or_recording_length": "190320"}, {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "number": "14", "artist-credit-phrase": "KRS\u2010One feat. Anetra", "recording": {"artist-credit": [{"artist": {"sort-name": "KRS\u2010One", "id": "fc4568b6-cbe3-4a3d-8409-28510c19e3e2", "name": "KRS\u2010One"}}, " feat. ", {"artist": {"sort-name": "Anetra", "id": "0a1d4d49-6a4f-49c0-9d5f-434c54c89cf8", "name": "Anetra"}}], "title": "If U Only Knew", "id": "68b76219-e5dd-4b93-bf33-39e7d76ceaa3", "length": "90640", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "32847fdf-44c7-4c62-ab8a-fa3c9a4cc9b5", "language": "eng", "title": "If U Only Knew"}, "type": "performance", "target": "32847fdf-44c7-4c62-ab8a-fa3c9a4cc9b5"}], "artist-credit-phrase": "KRS\u2010One feat. Anetra"}, "length": "90640", "position": "14", "id": "5266bddc-cbca-3310-af98-0a4531c8c150", "track_or_recording_length": "90640"}, {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "15", "artist-credit-phrase": "J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "title": "Off the Chain", "id": "4f584807-328c-466d-8ed9-cd999c3ef17b", "length": "290653", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "c65a9a38-ebdd-49d0-9001-297a7ab4a219", "language": "eng", "title": "Off the Chain"}, "type": "performance", "target": "c65a9a38-ebdd-49d0-9001-297a7ab4a219"}], "artist-credit-phrase": "J. Bully"}, "length": "290653", "position": "15", "id": "1499cc7a-a6b4-3b35-bd55-99616cea0c03", "track_or_recording_length": "290653"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "number": "16", "artist-credit-phrase": "CunninLynguists feat. Kory Calico", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Calico, Kory", "id": "fc9d18aa-d756-4563-82aa-0b9975fb7f84", "name": "Kory Calico"}}], "title": "Mic Like a Memory (remix)", "id": "ffd83bc9-9344-4c1d-a96f-81e43a4e2729", "length": "237706", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "c775ae2f-c08d-48cb-855b-360392ed77cb", "language": "eng", "title": "Mic Like a Memory (remix)"}, "type": "performance", "target": "c775ae2f-c08d-48cb-855b-360392ed77cb"}], "artist-credit-phrase": "CunninLynguists feat. Kory Calico"}, "length": "237706", "position": "16", "id": "09b26577-5004-3f97-837c-4f2566b720e0", "track_or_recording_length": "237706"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "number": "17", "artist-credit-phrase": "CunninLynguists", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}], "length": "157920", "artist-credit-phrase": "CunninLynguists", "id": "585963b2-de5a-44d1-9241-f046cf93b50f", "title": "The Fellationelles (skit)"}, "length": "157920", "position": "17", "id": "4f22deb8-1ef3-3ba5-9b1b-0fd04d2156bc", "track_or_recording_length": "157920"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "number": "18", "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Substantial", "disambiguation": "US rapper Stan Robinson", "id": "38cdd71c-344b-4c54-bac2-19709da7140d", "name": "Substantial"}}, " & ", {"artist": {"sort-name": "J. Bully", "id": "453bcab2-d50e-4108-9eb0-555868d5c250", "name": "J. Bully"}}], "title": "Nasty Filthy (remix)", "id": "8043db30-f208-442e-96e2-ddbd3031e1b9", "length": "222413", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "cae50d02-59b4-4f91-ada6-5e8049119051", "language": "eng", "title": "Nasty Filthy (remix)"}, "type": "performance", "target": "cae50d02-59b4-4f91-ada6-5e8049119051"}], "artist-credit-phrase": "CunninLynguists feat. Substantial & J. Bully"}, "length": "222413", "position": "18", "id": "210a235b-848e-3bce-b1bd-cead7161d4d4", "track_or_recording_length": "222413"}, {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "19", "artist-credit-phrase": "Sean Price feat. Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Price, Sean", "disambiguation": "US rapper, Boot Camp Clik/Heltah Skeltah", "id": "c659f049-6d66-4b4e-b33e-f0991f287d34", "name": "Sean Price"}}, " feat. ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Irrational", "id": "cf465ac5-6b42-4ce3-b982-f46558e1b369", "length": "77200", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "ceddac83-4ba5-4a33-85df-e7dda450ccec", "language": "eng", "title": "Irrational"}, "type": "performance", "target": "ceddac83-4ba5-4a33-85df-e7dda450ccec"}], "artist-credit-phrase": "Sean Price feat. Deacon the Villain"}, "length": "77200", "position": "19", "id": "fe48d5e1-3664-33b0-9bb1-e50fa4cdd000", "track_or_recording_length": "77200"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "20", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "title": "Dem Thangs Freestyle", "id": "fed3eae2-a991-4e01-abae-8deb024020d2", "length": "109560", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "f07a88b8-dcd5-43de-b148-9a32737df88d", "language": "eng", "title": "Dem Thangs Freestyle"}, "type": "performance", "target": "f07a88b8-dcd5-43de-b148-9a32737df88d"}], "artist-credit-phrase": "Mr. SOS"}, "length": "109560", "position": "20", "id": "0414ac89-51c8-3891-baad-a54eb89ca8f3", "track_or_recording_length": "109560"}, {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "21", "artist-credit-phrase": "Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "title": "Never Scared Freestyle (Philaflava Drop remix)", "id": "fc1a987d-27fd-4f44-8968-9da3f9b223df", "length": "118746", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "a6de2894-fc57-4845-82ad-c7db0171804a", "language": "eng", "title": "Never Scared Freestyle (Philaflava Drop remix)"}, "type": "performance", "target": "a6de2894-fc57-4845-82ad-c7db0171804a"}], "artist-credit-phrase": "Kno"}, "length": "118746", "position": "21", "id": "d1441885-ef76-32ae-979e-b54d63846447", "track_or_recording_length": "118746"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "22", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Lay Low Freestyle (Philaflava Drop)", "id": "0d06dddc-a851-4fb5-a20d-36b550825415", "length": "174760", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "20df4996-c994-491f-9275-04f5d8e407ef", "language": "eng", "title": "Lay Low Freestyle (Philaflava Drop)"}, "type": "performance", "target": "20df4996-c994-491f-9275-04f5d8e407ef"}], "artist-credit-phrase": "Deacon the Villain"}, "length": "174760", "position": "22", "id": "b4f61c9d-f08a-3477-addf-f4db497ad786", "track_or_recording_length": "174760"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "number": "23", "artist-credit-phrase": "CunninLynguists feat. Masta Ace", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Masta Ace", "disambiguation": "the person, US rapper", "id": "ceef10f5-324d-4a04-8db7-1a4181e19ab3", "name": "Masta Ace"}}], "title": "Seasons (remix)", "id": "b0932e20-4172-4e37-bf4b-00f4e0984764", "length": "216826", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "2d442b07-b1e3-4cf7-af24-7eb5b2f5e16f", "language": "eng", "title": "Seasons (remix)"}, "type": "performance", "target": "2d442b07-b1e3-4cf7-af24-7eb5b2f5e16f"}], "artist-credit-phrase": "CunninLynguists feat. Masta Ace"}, "length": "216826", "position": "23", "id": "36bc053e-1b5d-3b20-b187-045cbbb5c1e6", "track_or_recording_length": "216826"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "24", "artist-credit-phrase": "Mr. SOS & Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}, " & ", {"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Made You Look Freestyle", "id": "964be293-f5bf-4918-9a7f-05f410311f8c", "length": "177160", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "5d172855-ea58-4865-8828-bb424a61b2b7", "language": "eng", "title": "Made You Look Freestyle"}, "type": "performance", "target": "5d172855-ea58-4865-8828-bb424a61b2b7"}], "artist-credit-phrase": "Mr. SOS & Deacon the Villain"}, "length": "177160", "position": "24", "id": "4daaeae0-7328-381d-9cff-68c9d609189e", "track_or_recording_length": "177160"}, {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "number": "25", "artist-credit-phrase": "Chapter 13 feat. Kno", "recording": {"artist-credit": [{"artist": {"sort-name": "Chapter 13", "id": "a838411c-9f74-4a06-8f43-3cb971bd1fbe", "name": "Chapter 13"}}, " feat. ", {"artist": {"sort-name": "Kno", "disambiguation": "US hip-hop producer Ryan Wisler, member of CunninLynguists", "id": "8e346269-5371-468b-9d4d-6f8daa278bc3", "name": "Kno"}}], "title": "Rock Stars", "id": "23dc2d05-96d8-4f4d-bb89-48cf67d6ba9a", "length": "186386", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "f65de28a-4598-422f-a114-4ba4115ecfe7", "language": "eng", "title": "Rock Stars"}, "type": "performance", "target": "f65de28a-4598-422f-a114-4ba4115ecfe7"}], "artist-credit-phrase": "Chapter 13 feat. Kno"}, "length": "186386", "position": "25", "id": "296183bf-d3ae-35c8-8540-6b5afd26ecd8", "track_or_recording_length": "186386"}, {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "number": "26", "artist-credit-phrase": "Deacon the Villain", "recording": {"artist-credit": [{"artist": {"sort-name": "Deacon the Villain", "disambiguation": "US rapper of Cunninlynguists", "id": "0f94a853-225e-469c-a352-a68f4f22c103", "name": "Deacon the Villain"}}], "title": "Welcome to NY Freestyle", "id": "9fff281c-36a3-4bfc-9d3c-ca5686d46729", "length": "184266", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "caf20e54-9daf-447f-813e-7f0292c9fb67", "language": "eng", "title": "Welcome to NY Freestyle"}, "type": "performance", "target": "caf20e54-9daf-447f-813e-7f0292c9fb67"}], "artist-credit-phrase": "Deacon the Villain"}, "length": "184266", "position": "26", "id": "3a5c05c5-06d9-3680-883e-82698bb48fb5", "track_or_recording_length": "184266"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "27", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "title": "Mr. SOS LP Drop", "id": "6af81f1f-e096-4e46-a8ef-19c5c1f20ca5", "length": "46520", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "fa786d63-6c13-45c5-a564-a410068b59a3", "language": "eng", "title": "Mr. SOS LP Drop"}, "type": "performance", "target": "fa786d63-6c13-45c5-a564-a410068b59a3"}], "artist-credit-phrase": "Mr. SOS"}, "length": "46520", "position": "27", "id": "3757cce8-1db3-39be-b961-49594a6f5acb", "track_or_recording_length": "46520"}, {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "number": "28", "artist-credit-phrase": "Mr. SOS", "recording": {"artist-credit": [{"artist": {"sort-name": "SOS, Mr.", "disambiguation": "US rapper & producer", "id": "a84881c2-0702-4e98-8dbb-1db840f1aa6b", "name": "Mr. SOS"}}], "title": "Rap Name Freestyle", "id": "c56910c3-e3c6-47d5-b0f5-f2d3eb5f94b7", "length": "197893", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "1be9faa7-1ae2-4724-864e-30ba2cca8d1f", "language": "eng", "title": "Rap Name Freestyle"}, "type": "performance", "target": "1be9faa7-1ae2-4724-864e-30ba2cca8d1f"}], "artist-credit-phrase": "Mr. SOS"}, "length": "197893", "position": "28", "id": "8bae4909-52f5-3449-a25d-94839cef4d98", "track_or_recording_length": "197893"}, {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "number": "29", "artist-credit-phrase": "Cashmere The PRO", "recording": {"artist-credit": [{"artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}], "title": "Cashmere the PRO LP Drop", "id": "2dac6cd1-d417-4f56-ac6a-2f1649db7973", "length": "39480", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "e8673e8a-41f5-43bd-acd0-e789e68c67d1", "language": "eng", "title": "Cashmere the PRO LP Drop"}, "type": "performance", "target": "e8673e8a-41f5-43bd-acd0-e789e68c67d1"}], "artist-credit-phrase": "Cashmere The PRO"}, "length": "39480", "position": "29", "id": "53a3c755-b1ec-37af-abee-ab786f916495", "track_or_recording_length": "39480"}, {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "number": "30", "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal", "recording": {"artist-credit": [{"artist": {"sort-name": "CunninLynguists", "disambiguation": "Kentucky hip hop group", "id": "69c4cc43-8163-41c5-ac81-30946d27bb69", "name": "CunninLynguists"}}, " feat. ", {"artist": {"sort-name": "Nuke", "disambiguation": "hip-hop", "id": "b43b4c2e-02aa-4d3e-8d28-10d03b31b09d", "name": "Nuke"}}, ", ", {"name": "Cashmere the PRO", "artist": {"sort-name": "Cashmere The PRO", "id": "714f63e2-fc27-494a-9e7f-ea4f2d177f84", "name": "Cashmere The PRO"}}, " & ", {"artist": {"sort-name": "Mac Lethal", "id": "a3c7ec74-66e2-4f19-b651-5855d7eeae75", "name": "Mac Lethal"}}], "title": "Magic Stick Freestyle", "id": "e0e01c45-9f38-4cf5-aba9-b3bab76d8e9e", "length": "248987", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "65ef0bc9-780e-4f53-8d61-ed2185969292", "language": "eng", "title": "Magic Stick Freestyle"}, "type": "performance", "target": "65ef0bc9-780e-4f53-8d61-ed2185969292"}], "artist-credit-phrase": "CunninLynguists feat. Nuke, Cashmere the PRO & Mac Lethal"}, "length": "248987", "position": "30", "id": "399d05a4-71d7-3fcc-83c0-5403ab42ec4f", "track_or_recording_length": "248987"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json b/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json index fc265c66..5e5cbb36 100644 --- a/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json +++ b/whipper/test/whipper.release.8a457e97-ed59-31f1-8b1c-41f24e9a7183.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "638812730329", "asin": "B000E6GBVW", "label-info-count": 1, "label-info-list": [{"catalog-number": "63881-27303-2", "label": {"sort-name": "V2 Records International", "disambiguation": "possibly bogus, please refer to \"V2\" or \"V2 Records\" instead", "id": "947c12a1-cf28-4380-a695-a944ad15e387", "name": "V2 Records International"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2006", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006", "quality": "normal", "id": "8a457e97-ed59-31f1-8b1c-41f24e9a7183", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "US", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "release-group": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "first-release-date": "2006-01-30", "primary-type": "Album", "title": "Ballad of the Broken Seas", "type": "Album", "id": "994cdad1-0365-3439-89ed-6686bd563503", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "15be8cfd-dff8-3dac-8924-8f564f7aff3c", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "70aeb069-b711-3586-9c47-d5b82f482a7f", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "48afa45e-a3a2-3e56-a93c-5a9afb5895af", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2e6d0fb6-c246-30f3-8572-5a121c001078", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "ba671d1c-d7b8-3a36-8b2e-f02665e3cd5d", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "7a806384-da3a-3cc7-8b92-5699ff68cd60", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "7c23d3cf-8cbb-3530-bef6-e532bf127212", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "ac0a2d96-e85c-3516-9833-8e87066eb11f", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "32ceb242-8ea0-3e82-975e-965014fbdc20", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "5e6a4c53-396c-3699-a682-7923919cbc87", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "fa108d5a-e6c2-3c6f-afcc-9b6b48cd5c2a", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "3319fd26-9891-3761-8de3-786fa7e6493f", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "638812730329", "asin": "B000E6GBVW", "label-info-count": 1, "label-info-list": [{"catalog-number": "63881-27303-2", "label": {"sort-name": "V2 Records International", "disambiguation": "possibly bogus, please refer to \"V2\" or \"V2 Records\" instead", "id": "947c12a1-cf28-4380-a695-a944ad15e387", "name": "V2 Records International"}}], "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2006", "area": {"sort-name": "United States", "iso-3166-1-code-list": ["US"], "id": "489ce91b-6658-3307-9877-795b68554c98", "name": "United States"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006", "quality": "normal", "id": "8a457e97-ed59-31f1-8b1c-41f24e9a7183", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "US", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "release-group": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "first-release-date": "2006-01-30", "primary-type": "Album", "title": "Ballad of the Broken Seas", "type": "Album", "id": "994cdad1-0365-3439-89ed-6686bd563503", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Deus Ibi Est", "id": "4fe44724-1d7e-4275-9693-b889864de750", "length": "171613", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "3063b439-66b0-303f-919d-d260aa77272a", "title": "Deus Ibi Est"}, "type": "performance", "target": "3063b439-66b0-303f-919d-d260aa77272a"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "171613", "position": "1", "id": "15be8cfd-dff8-3dac-8924-8f564f7aff3c", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Black Mountain", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "length": "190120", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "092c8e4d-e032-354e-b619-1229e70c315d", "title": "Black Mountain"}, "type": "performance", "target": "092c8e4d-e032-354e-b619-1229e70c315d"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "190120", "position": "2", "id": "70aeb069-b711-3586-9c47-d5b82f482a7f", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "The False Husband", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "length": "233880", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "db132d56-a235-3d92-9fee-955e33f2ee89", "title": "The False Husband"}, "type": "performance", "target": "db132d56-a235-3d92-9fee-955e33f2ee89"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "233880", "position": "3", "id": "48afa45e-a3a2-3e56-a93c-5a9afb5895af", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Ballad of the Broken Seas", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "length": "162386", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "771fbfd8-301b-37ec-a715-f26f7ce06e26", "title": "Ballad of the Broken Seas"}, "type": "performance", "target": "771fbfd8-301b-37ec-a715-f26f7ce06e26"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "162386", "position": "4", "id": "2e6d0fb6-c246-30f3-8572-5a121c001078", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Revolver", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "length": "160680", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "5eadf9d4-ce7e-3964-bb63-5c9ca17b05b3", "title": "Revolver"}, "type": "performance", "target": "5eadf9d4-ce7e-3964-bb63-5c9ca17b05b3"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "160680", "position": "5", "id": "ba671d1c-d7b8-3a36-8b2e-f02665e3cd5d", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Ramblin' Man", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "length": "209066", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "attribute-list": ["cover"], "target": "c74f2f61-3734-3c61-a721-7ebf26ce6137", "attributes": [{"type-id": "1e8536bd-6eda-3822-8e78-1c0f4d3d2113", "attribute": "cover"}], "work": {"iswc-list": ["T-070.243.087-2"], "iswc": "T-070.243.087-2", "id": "c74f2f61-3734-3c61-a721-7ebf26ce6137", "language": "eng", "title": "Ramblin\u2019 Man"}, "type": "performance"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "209066", "position": "6", "id": "7a806384-da3a-3cc7-8b92-5699ff68cd60", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "(Do You Wanna) Come Walk With Me?", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "length": "207133", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "9d64f4f3-77e0-38c8-a94f-b4c82ff127b5", "title": "(Do You Wanna) Come Walk With Me?"}, "type": "performance", "target": "9d64f4f3-77e0-38c8-a94f-b4c82ff127b5"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "207133", "position": "7", "id": "7c23d3cf-8cbb-3530-bef6-e532bf127212", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Saturday's Gone", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "length": "277186", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "861734ac-a1c3-3a6a-a27e-be62501f3646", "title": "Saturday's Gone"}, "type": "performance", "target": "861734ac-a1c3-3a6a-a27e-be62501f3646"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "277186", "position": "8", "id": "ac0a2d96-e85c-3516-9833-8e87066eb11f", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "It's Hard to Kill a Bad Thing", "id": "61ac7fad-d396-4467-93a9-a25472561008", "length": "173640", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "505c8f91-cafd-375e-81c0-dce3f2eb3678", "title": "It's Hard to Kill a Bad Thing"}, "type": "performance", "target": "505c8f91-cafd-375e-81c0-dce3f2eb3678"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "173640", "position": "9", "id": "32ceb242-8ea0-3e82-975e-965014fbdc20", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Honey Child What Can I Do?", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "length": "224173", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "8349a573-da22-370d-9165-c8897fd16ce2", "language": "eng", "title": "Honey Child What Can I Do?"}, "type": "performance", "target": "8349a573-da22-370d-9165-c8897fd16ce2"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "224173", "position": "10", "id": "5e6a4c53-396c-3699-a682-7923919cbc87", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Dusty Wreath", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "length": "224560", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "11b1502f-706a-3b4f-a226-c7889415daf9", "title": "Dusty Wreath"}, "type": "performance", "target": "11b1502f-706a-3b4f-a226-c7889415daf9"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "224560", "position": "11", "id": "fa108d5a-e6c2-3c6f-afcc-9b6b48cd5c2a", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "The Circus Is Leaving Town", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "length": "335133", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "f1205928-5646-3b55-9be9-c3e4be31f087", "title": "The Circus Is Leaving Town"}, "type": "performance", "target": "f1205928-5646-3b55-9be9-c3e4be31f087"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "335133", "position": "12", "id": "3319fd26-9891-3761-8de3-786fa7e6493f", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json b/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json index bae96cf2..01a2d830 100644 --- a/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json +++ b/whipper/test/whipper.release.a76714e0-32b1-4ed4-b28e-f86d99642193.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [{"catalog-number": "585 625-2", "label": {"sort-name": "Universal TV", "disambiguation": "Netherlands & Belgium", "id": "48500332-aa67-44d1-9901-18d1e6ab27a2", "name": "Universal TV"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2001-10-15", "area": {"sort-name": "Netherlands", "iso-3166-1-code-list": ["NL"], "id": "ef1b7cc0-cd26-36f4-8ea0-04d9623786c7", "name": "Netherlands"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2001-10-15", "quality": "normal", "id": "a76714e0-32b1-4ed4-b28e-f86d99642193", "release-event-count": 1, "title": "2 Meter Sessies, Volume 10", "country": "NL", "artist-credit-phrase": "Various Artists", "release-group": {"artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "first-release-date": "2001-10-15", "secondary-type-list": ["Live"], "primary-type": "Album", "title": "2 Meter Sessies, Volume 10", "type": "Live", "id": "6fff6ff3-fcb7-3c4e-80e7-9f28d50871ae", "artist-credit-phrase": "Various Artists"}, "medium-list": [{"position": "1", "track-count": 18, "format": "CD", "disc-list": [{"offset-list": [150, 20040, 39875, 68708, 88339, 106270, 122005, 133975, 147835, 165208, 181093, 199820, 215620, 229945, 250040, 274450, 288998, 305748], "id": "f7XO36a7n1LCCskkCiulReWbwZA-", "sectors": "317128", "offset-count": 18}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "number": "1", "artist-credit-phrase": "Coldplay", "recording": {"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "length": "265200", "artist-credit-phrase": "Coldplay", "id": "06813123-5047-4c94-88bf-6a300540e954", "title": "Trouble"}, "length": "265200", "position": "1", "id": "73b03043-36e9-3a92-9ce7-c1ad2d887fa3", "track_or_recording_length": "265200"}, {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "number": "2", "artist-credit-phrase": "L\u012aVE", "recording": {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "length": "264466", "artist-credit-phrase": "L\u012aVE", "id": "7b57b108-35bb-4fcb-9046-06228fb7e5f7", "title": "Run to the Water"}, "length": "264466", "position": "2", "id": "7485aa70-7159-3dfd-aa74-514994f88789", "track_or_recording_length": "264466"}, {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "number": "3", "artist-credit-phrase": "Beck", "recording": {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "length": "384440", "artist-credit-phrase": "Beck", "id": "cfbfb04e-ccfd-4316-a5eb-5e4daa670905", "title": "Debra"}, "length": "384440", "position": "3", "id": "17d52b51-42da-3a80-afb4-3d03cd99e339", "track_or_recording_length": "384440"}, {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "number": "4", "artist-credit-phrase": "The Jayhawks", "recording": {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "length": "261746", "artist-credit-phrase": "The Jayhawks", "id": "d7b84a3f-628d-49f3-ae2f-b34d5630ee45", "title": "Mr. Wilson"}, "length": "261746", "position": "4", "id": "44b79128-b98c-36fe-8f25-b1b8b7b97309", "track_or_recording_length": "261746"}, {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "number": "5", "artist-credit-phrase": "De Dijk", "recording": {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "length": "239080", "artist-credit-phrase": "De Dijk", "id": "2bb1a0ca-399a-4488-8a53-bb0ca9ece5ea", "title": "Wie het niet weet"}, "length": "239080", "position": "5", "id": "9b76ae87-6b45-3b31-8466-64579d8d2cb0", "track_or_recording_length": "239080"}, {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "number": "6", "artist-credit-phrase": "Emil\u00edana Torrini", "recording": {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "length": "209800", "artist-credit-phrase": "Emil\u00edana Torrini", "id": "3e6433da-9af5-41b0-9210-6dbef13c630c", "title": "Summer Breeze"}, "length": "209800", "position": "6", "id": "addd247f-f664-3457-9040-3b9dc56a6b1c", "track_or_recording_length": "209800"}, {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "number": "7", "artist-credit-phrase": "John Hiatt", "recording": {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "length": "158000", "artist-credit-phrase": "John Hiatt", "id": "ce684ade-741f-47f7-ac1c-0d7d206da8a3", "title": "What Do We Do Now"}, "length": "159600", "position": "7", "id": "7f48a5cb-1370-3c2e-8b8f-9f20029c71cb", "track_or_recording_length": "159600"}, {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "number": "8", "artist-credit-phrase": "Barry Hay & Barking Dogs", "recording": {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "length": "184800", "artist-credit-phrase": "Barry Hay & Barking Dogs", "id": "56b1b506-64cd-4c2f-be6d-044e3888dabd", "title": "Happiness Is a Warm Gun"}, "length": "184800", "position": "8", "id": "9fae06e7-f2d2-34fc-a095-52565fe99225", "track_or_recording_length": "184800"}, {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "number": "9", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "recording": {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "length": "231640", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "id": "4d1c6a29-dd96-4af6-a594-622d70e214ac", "title": "I'm Your Puppet"}, "length": "231640", "position": "9", "id": "0024f07d-2864-3085-8aff-aa0440446f8e", "track_or_recording_length": "231640"}, {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "number": "10", "artist-credit-phrase": "Angie Stone", "recording": {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "length": "211800", "artist-credit-phrase": "Angie Stone", "id": "cb0447fc-3ad3-4dea-a94d-517179a6d68c", "title": "Everyday"}, "length": "211800", "position": "10", "id": "34ff18f9-cbeb-3da0-bb7b-a6908ca0e8e3", "track_or_recording_length": "211800"}, {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "number": "11", "artist-credit-phrase": "Tom Helsen", "recording": {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "length": "249693", "artist-credit-phrase": "Tom Helsen", "id": "2f6501f8-262a-4f02-a782-ed365621e100", "title": "When Marvin Calls"}, "length": "249693", "position": "11", "id": "1da99d43-f845-35e7-8e07-3c3cb38f9a82", "track_or_recording_length": "249693"}, {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "number": "12", "artist-credit-phrase": "K\u2019s Choice", "recording": {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "length": "210666", "artist-credit-phrase": "K\u2019s Choice", "id": "e3ef3fa1-3155-464d-a5e0-4096e9cc63ad", "title": "Almost Happy"}, "length": "210666", "position": "12", "id": "e2a95209-9240-3e4f-86a6-270771ee4fe3", "track_or_recording_length": "210666"}, {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "number": "13", "artist-credit-phrase": "Paddy Casey", "recording": {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "length": "191000", "artist-credit-phrase": "Paddy Casey", "id": "c419e7a6-cbe7-44c9-a45e-08e0721695dd", "title": "Can't Take That Away"}, "length": "191000", "position": "13", "id": "682ad823-6721-37c2-9af2-633789144183", "track_or_recording_length": "191000"}, {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "number": "14", "artist-credit-phrase": "Joe Jackson", "recording": {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "length": "267933", "artist-credit-phrase": "Joe Jackson", "id": "ebb7083f-4db2-4daa-a67d-2993887b67ad", "title": "Stranger Than You"}, "length": "267933", "position": "14", "id": "6895798b-33eb-3380-86ea-d0ba04321b0b", "track_or_recording_length": "267933"}, {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "number": "15", "artist-credit-phrase": "My Morning Jacket", "recording": {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "length": "325466", "artist-credit-phrase": "My Morning Jacket", "id": "62594b12-5907-42b6-b7d9-03ad5b0ddd35", "title": "Old September Blues"}, "length": "325466", "position": "15", "id": "795fa05c-33d4-32dc-bdbe-e79a2d4cc0d1", "track_or_recording_length": "325466"}, {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "number": "16", "artist-credit-phrase": "Tom Jones & Stereophonics", "recording": {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "length": "193973", "artist-credit-phrase": "Tom Jones & Stereophonics", "id": "ba50a1c7-9e23-4c3e-b7aa-12e23eea6d19", "title": "Mama Told Me Not to Come"}, "length": "193973", "position": "16", "id": "bb0171cf-dda7-36c6-9282-742f431fb5a0", "track_or_recording_length": "193973"}, {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "number": "17", "artist-credit-phrase": "Ben Christophers", "recording": {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "length": "223333", "artist-credit-phrase": "Ben Christophers", "id": "c0cfc4cb-8c80-4516-b500-2df010418697", "title": "Sunday"}, "length": "223333", "position": "17", "id": "c3db0bfb-a303-31a6-b113-1ecaac9242f1", "track_or_recording_length": "223333"}, {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "number": "18", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "recording": {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "length": "151733", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "id": "e423a1d7-3ae1-4540-b267-d873c50043e7", "title": "Magnolia"}, "length": "151733", "position": "18", "id": "c96be4bd-cc11-3a49-882f-60d2664068ec", "track_or_recording_length": "151733"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "label-info-list": [{"catalog-number": "585 625-2", "label": {"sort-name": "Universal TV", "disambiguation": "Netherlands & Belgium", "id": "48500332-aa67-44d1-9901-18d1e6ab27a2", "name": "Universal TV"}}], "label-info-count": 1, "medium-count": 1, "cover-art-archive": {"count": "1", "front": "true", "back": "false", "artwork": "true"}, "release-event-list": [{"date": "2001-10-15", "area": {"sort-name": "Netherlands", "iso-3166-1-code-list": ["NL"], "id": "ef1b7cc0-cd26-36f4-8ea0-04d9623786c7", "name": "Netherlands"}}], "text-representation": {"language": "eng", "script": "Latn"}, "date": "2001-10-15", "quality": "normal", "id": "a76714e0-32b1-4ed4-b28e-f86d99642193", "release-event-count": 1, "title": "2 Meter Sessies, Volume 10", "country": "NL", "artist-credit-phrase": "Various Artists", "release-group": {"artist-credit": [{"artist": {"sort-name": "Various Artists", "disambiguation": "add compilations to this artist", "id": "89ad4ac3-39f7-470e-963a-56509c546377", "name": "Various Artists"}}], "first-release-date": "2001-10-15", "secondary-type-list": ["Live"], "primary-type": "Album", "title": "2 Meter Sessies, Volume 10", "type": "Live", "id": "6fff6ff3-fcb7-3c4e-80e7-9f28d50871ae", "artist-credit-phrase": "Various Artists"}, "medium-list": [{"position": "1", "track-count": 18, "format": "CD", "disc-list": [{"offset-list": [150, 20040, 39875, 68708, 88339, 106270, 122005, 133975, 147835, 165208, 181093, 199820, 215620, 229945, 250040, 274450, 288998, 305748], "id": "f7XO36a7n1LCCskkCiulReWbwZA-", "sectors": "317128", "offset-count": 18}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "number": "1", "artist-credit-phrase": "Coldplay", "recording": {"artist-credit": [{"artist": {"sort-name": "Coldplay", "id": "cc197bad-dc9c-440d-a5b5-d52ba2e14234", "name": "Coldplay"}}], "title": "Trouble", "id": "06813123-5047-4c94-88bf-6a300540e954", "length": "265200", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "attribute-list": ["live"], "target": "ae256069-b3b1-34a4-88f5-3f2298139c5c", "attributes": [{"type-id": "70007db6-a8bc-46d7-a770-80e6a0bb551a", "attribute": "live"}], "work": {"iswc-list": ["T-010.387.704-8"], "iswc": "T-010.387.704-8", "id": "ae256069-b3b1-34a4-88f5-3f2298139c5c", "language": "eng", "title": "Trouble"}, "type": "performance"}], "artist-credit-phrase": "Coldplay"}, "length": "265200", "position": "1", "id": "73b03043-36e9-3a92-9ce7-c1ad2d887fa3", "track_or_recording_length": "265200"}, {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "number": "2", "artist-credit-phrase": "L\u012aVE", "recording": {"artist-credit": [{"artist": {"sort-name": "Live", "disambiguation": "US alt rock band", "id": "cba77ba2-862d-4cee-a8f6-d3f9daf7211c", "name": "L\u012aVE"}}], "length": "264466", "artist-credit-phrase": "L\u012aVE", "id": "7b57b108-35bb-4fcb-9046-06228fb7e5f7", "title": "Run to the Water"}, "length": "264466", "position": "2", "id": "7485aa70-7159-3dfd-aa74-514994f88789", "track_or_recording_length": "264466"}, {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "number": "3", "artist-credit-phrase": "Beck", "recording": {"artist-credit": [{"artist": {"sort-name": "Beck", "disambiguation": "alt rock, multi-instrumentalist Beck Hansen", "id": "309c62ba-7a22-4277-9f67-4a162526d18a", "name": "Beck"}}], "title": "Debra", "id": "cfbfb04e-ccfd-4316-a5eb-5e4daa670905", "length": "384440", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "attribute-list": ["live"], "target": "2199092a-c98a-3c19-819f-86e687484964", "attributes": [{"type-id": "70007db6-a8bc-46d7-a770-80e6a0bb551a", "attribute": "live"}], "work": {"iswc-list": ["T-071.060.311-4"], "iswc": "T-071.060.311-4", "id": "2199092a-c98a-3c19-819f-86e687484964", "language": "eng", "title": "Debra"}, "type": "performance"}], "artist-credit-phrase": "Beck"}, "length": "384440", "position": "3", "id": "17d52b51-42da-3a80-afb4-3d03cd99e339", "track_or_recording_length": "384440"}, {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "number": "4", "artist-credit-phrase": "The Jayhawks", "recording": {"artist-credit": [{"artist": {"sort-name": "Jayhawks, The", "disambiguation": "alternative country/country rock", "id": "24ed5b09-02b1-47fe-bd83-6fa5270039b0", "name": "The Jayhawks"}}], "length": "261746", "artist-credit-phrase": "The Jayhawks", "id": "d7b84a3f-628d-49f3-ae2f-b34d5630ee45", "title": "Mr. Wilson"}, "length": "261746", "position": "4", "id": "44b79128-b98c-36fe-8f25-b1b8b7b97309", "track_or_recording_length": "261746"}, {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "number": "5", "artist-credit-phrase": "De Dijk", "recording": {"artist-credit": [{"artist": {"sort-name": "Dijk, De", "id": "d7a55e92-a14c-4543-8152-de2163af06bb", "name": "De Dijk"}}], "length": "239080", "artist-credit-phrase": "De Dijk", "id": "2bb1a0ca-399a-4488-8a53-bb0ca9ece5ea", "title": "Wie het niet weet"}, "length": "239080", "position": "5", "id": "9b76ae87-6b45-3b31-8466-64579d8d2cb0", "track_or_recording_length": "239080"}, {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "number": "6", "artist-credit-phrase": "Emil\u00edana Torrini", "recording": {"artist-credit": [{"artist": {"sort-name": "Torrini, Emil\u00edana", "id": "b2a9731b-9e13-4ff9-af21-5e694a5663e8", "name": "Emil\u00edana Torrini"}}], "length": "209800", "artist-credit-phrase": "Emil\u00edana Torrini", "id": "3e6433da-9af5-41b0-9210-6dbef13c630c", "title": "Summer Breeze"}, "length": "209800", "position": "6", "id": "addd247f-f664-3457-9040-3b9dc56a6b1c", "track_or_recording_length": "209800"}, {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "number": "7", "artist-credit-phrase": "John Hiatt", "recording": {"artist-credit": [{"artist": {"sort-name": "Hiatt, John", "id": "e78202c9-7717-435c-9aac-dd5ebc4e64d5", "name": "John Hiatt"}}], "length": "158000", "artist-credit-phrase": "John Hiatt", "id": "ce684ade-741f-47f7-ac1c-0d7d206da8a3", "title": "What Do We Do Now"}, "length": "159600", "position": "7", "id": "7f48a5cb-1370-3c2e-8b8f-9f20029c71cb", "track_or_recording_length": "159600"}, {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "number": "8", "artist-credit-phrase": "Barry Hay & Barking Dogs", "recording": {"artist-credit": [{"artist": {"sort-name": "Hay, Barry & Barking Dogs", "id": "dc11b420-0e21-4e05-aca7-273f58c8bcce", "name": "Barry Hay & Barking Dogs"}}], "length": "184800", "artist-credit-phrase": "Barry Hay & Barking Dogs", "id": "56b1b506-64cd-4c2f-be6d-044e3888dabd", "title": "Happiness Is a Warm Gun"}, "length": "184800", "position": "8", "id": "9fae06e7-f2d2-34fc-a095-52565fe99225", "track_or_recording_length": "184800"}, {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "number": "9", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "recording": {"artist-credit": [{"artist": {"sort-name": "Penn, Dan", "id": "cc54ec8d-ba66-4051-970d-6b3c24cd9e8b", "name": "Dan Penn"}}, " & ", {"artist": {"sort-name": "Oldham, Spooner", "id": "ba170eca-541b-4ee5-b332-54ff954b75ea", "name": "Spooner Oldham"}}], "length": "231640", "artist-credit-phrase": "Dan Penn & Spooner Oldham", "id": "4d1c6a29-dd96-4af6-a594-622d70e214ac", "title": "I'm Your Puppet"}, "length": "231640", "position": "9", "id": "0024f07d-2864-3085-8aff-aa0440446f8e", "track_or_recording_length": "231640"}, {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "number": "10", "artist-credit-phrase": "Angie Stone", "recording": {"artist-credit": [{"artist": {"sort-name": "Stone, Angie", "id": "82f8dd22-0319-4f35-953c-358b3f883027", "name": "Angie Stone"}}], "length": "211800", "artist-credit-phrase": "Angie Stone", "id": "cb0447fc-3ad3-4dea-a94d-517179a6d68c", "title": "Everyday"}, "length": "211800", "position": "10", "id": "34ff18f9-cbeb-3da0-bb7b-a6908ca0e8e3", "track_or_recording_length": "211800"}, {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "number": "11", "artist-credit-phrase": "Tom Helsen", "recording": {"artist-credit": [{"artist": {"sort-name": "Helsen, Tom", "disambiguation": "Belgian singer & songwriter", "id": "0a5fe43b-ace7-407b-bfc2-be4851e7d3f2", "name": "Tom Helsen"}}], "length": "249693", "artist-credit-phrase": "Tom Helsen", "id": "2f6501f8-262a-4f02-a782-ed365621e100", "title": "When Marvin Calls"}, "length": "249693", "position": "11", "id": "1da99d43-f845-35e7-8e07-3c3cb38f9a82", "track_or_recording_length": "249693"}, {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "number": "12", "artist-credit-phrase": "K\u2019s Choice", "recording": {"artist-credit": [{"artist": {"sort-name": "K\u2019s Choice", "disambiguation": "Belgian indierock band", "id": "9bd1e632-b17b-4842-b520-ddfce3b538b9", "name": "K\u2019s Choice"}}], "length": "210666", "artist-credit-phrase": "K\u2019s Choice", "id": "e3ef3fa1-3155-464d-a5e0-4096e9cc63ad", "title": "Almost Happy"}, "length": "210666", "position": "12", "id": "e2a95209-9240-3e4f-86a6-270771ee4fe3", "track_or_recording_length": "210666"}, {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "number": "13", "artist-credit-phrase": "Paddy Casey", "recording": {"artist-credit": [{"artist": {"sort-name": "Casey, Paddy", "id": "d36a3897-f76d-4227-be80-d0d7282ff12a", "name": "Paddy Casey"}}], "length": "191000", "artist-credit-phrase": "Paddy Casey", "id": "c419e7a6-cbe7-44c9-a45e-08e0721695dd", "title": "Can't Take That Away"}, "length": "191000", "position": "13", "id": "682ad823-6721-37c2-9af2-633789144183", "track_or_recording_length": "191000"}, {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "number": "14", "artist-credit-phrase": "Joe Jackson", "recording": {"artist-credit": [{"artist": {"sort-name": "Jackson, Joe", "disambiguation": "English musician", "id": "07f6d469-38f3-46da-9cfa-2f532422b84e", "name": "Joe Jackson"}}], "length": "267933", "artist-credit-phrase": "Joe Jackson", "id": "ebb7083f-4db2-4daa-a67d-2993887b67ad", "title": "Stranger Than You"}, "length": "267933", "position": "14", "id": "6895798b-33eb-3380-86ea-d0ba04321b0b", "track_or_recording_length": "267933"}, {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "number": "15", "artist-credit-phrase": "My Morning Jacket", "recording": {"artist-credit": [{"artist": {"sort-name": "My Morning Jacket", "id": "ea5883b7-68ce-48b3-b115-61746ea53b8c", "name": "My Morning Jacket"}}], "length": "325466", "artist-credit-phrase": "My Morning Jacket", "id": "62594b12-5907-42b6-b7d9-03ad5b0ddd35", "title": "Old September Blues"}, "length": "325466", "position": "15", "id": "795fa05c-33d4-32dc-bdbe-e79a2d4cc0d1", "track_or_recording_length": "325466"}, {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "number": "16", "artist-credit-phrase": "Tom Jones & Stereophonics", "recording": {"artist-credit": [{"artist": {"sort-name": "Jones, Tom", "disambiguation": "Welsh pop singer", "id": "57c6f649-6cde-48a7-8114-2a200247601a", "name": "Tom Jones"}}, " & ", {"artist": {"sort-name": "Stereophonics", "id": "0bfba3d3-6a04-4779-bb0a-df07df5b0558", "name": "Stereophonics"}}], "length": "193973", "artist-credit-phrase": "Tom Jones & Stereophonics", "id": "ba50a1c7-9e23-4c3e-b7aa-12e23eea6d19", "title": "Mama Told Me Not to Come"}, "length": "193973", "position": "16", "id": "bb0171cf-dda7-36c6-9282-742f431fb5a0", "track_or_recording_length": "193973"}, {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "number": "17", "artist-credit-phrase": "Ben Christophers", "recording": {"artist-credit": [{"artist": {"sort-name": "Christophers, Ben", "id": "1a5b4ad0-593a-4069-a77d-dae722a5f0ac", "name": "Ben Christophers"}}], "length": "223333", "artist-credit-phrase": "Ben Christophers", "id": "c0cfc4cb-8c80-4516-b500-2df010418697", "title": "Sunday"}, "length": "223333", "position": "17", "id": "c3db0bfb-a303-31a6-b113-1ecaac9242f1", "track_or_recording_length": "223333"}, {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "number": "18", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "recording": {"artist-credit": [{"artist": {"sort-name": "Barman, Tom", "disambiguation": "Belgian musician", "id": "a9be8bc0-47a4-4a0b-af5f-feac18d3bc43", "name": "Tom Barman"}}, " & ", {"artist": {"sort-name": "Nueten, Van, Guy", "disambiguation": "Belgian pianist", "id": "8779d2fd-3fc8-4c1e-a37d-2edf66b07c4e", "name": "Guy Van Nueten"}}], "length": "151733", "artist-credit-phrase": "Tom Barman & Guy Van Nueten", "id": "e423a1d7-3ae1-4540-b267-d873c50043e7", "title": "Magnolia"}, "length": "151733", "position": "18", "id": "c96be4bd-cc11-3a49-882f-60d2664068ec", "track_or_recording_length": "151733"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json b/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json index 1ca11afd..fd162bd3 100644 --- a/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json +++ b/whipper/test/whipper.release.c56ff16e-1d81-47de-926f-ba22891bd2bd.json @@ -1 +1 @@ -{"release": {"status": "Bootleg", "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "label-info-list": [], "quality": "normal", "title": "Space & Chill Out", "label-info-count": 0, "medium-count": 1, "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [182, 8067, 14985, 28407, 39920, 74532, 79825, 93370, 135732, 162415, 168137, 182882], "id": "b.yqPuCBdsV5hrzDvYrw52iK_jE-", "sectors": "355532", "offset-count": 12}], "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "107066", "artist-credit-phrase": "The KLF", "id": "254c95dd-71e2-4a38-8267-bdbe046c5ace", "title": "Brownsville Turnaround on the Tex-Mex Border"}, "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "105133", "title": "Brownsville Turnaround", "position": "1", "artist-credit-phrase": "The KLF", "track_or_recording_length": "105133", "id": "1f417f2b-e049-3ff1-9a08-d787dfd47b19", "number": "1"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "2", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "89000", "artist-credit-phrase": "The KLF", "id": "cfe7f2bb-ce37-434f-9d26-b0d523cd8e6e", "title": "Pulling Out of Ricardo and the Dusk Is Falling Fast"}, "length": "92240", "position": "2", "id": "2b6c44dc-e1bd-3feb-b889-746c0bb22eb9", "track_or_recording_length": "92240"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "3", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181040", "artist-credit-phrase": "The KLF", "id": "b8fcd38a-59df-4f1c-a944-f836e8592b94", "title": "Six Hours to Louisiana, Black Coffee Going Cold"}, "length": "178960", "position": "3", "id": "13639dfc-3332-31c6-8fb5-4d0241e81dde", "track_or_recording_length": "178960"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "4", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "155333", "artist-credit-phrase": "The KLF", "id": "20a3421a-36cd-4b60-8dfb-118caef8c6d8", "title": "Dream Time in Lake Jackson"}, "length": "153506", "position": "4", "id": "1b222630-1cc6-3f7e-9dc8-14d0d88ac054", "track_or_recording_length": "153506"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "5", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "460866", "artist-credit-phrase": "The KLF", "id": "bd90d2bf-fff9-4aaa-9c3f-7bacbc9d5421", "title": "Madrugada Eterna"}, "length": "461493", "position": "5", "id": "576a010d-1ea7-3525-a32b-2dce207d0ce3", "track_or_recording_length": "461493"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "6", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "68560", "artist-credit-phrase": "The KLF", "id": "5ea8a91d-5425-49ae-90f6-6acfefda4a59", "title": "Justified and Ancient Seems a Long Time Ago"}, "length": "70573", "position": "6", "id": "9e29c06a-c74b-3b0f-a170-98a1c0ea51d9", "track_or_recording_length": "70573"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "7", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181440", "artist-credit-phrase": "The KLF", "id": "f246f658-49c4-4efe-840e-c624b7850bc9", "title": "Elvis on the Radio, Steel Guitar in My Soul"}, "length": "180600", "position": "7", "id": "cdd8ed03-4b32-3c39-81f6-cd513369225e", "track_or_recording_length": "180600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "8", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "564933", "artist-credit-phrase": "The KLF", "id": "a173d428-4e12-4513-8df2-eb7f098e6364", "title": "3 A.M. Somewhere Out of Beaumont"}, "length": "564826", "position": "8", "id": "58a8cbf9-10a1-32c8-8cd7-f6893c5050ab", "track_or_recording_length": "564826"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "9", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "356000", "artist-credit-phrase": "The KLF", "id": "b7bc1dc2-a468-4948-b628-e03fc9265d41", "title": "Wichita Lineman Was a Song I Once Heard"}, "length": "355773", "position": "9", "id": "42679959-2e1a-3085-842a-a443ebc37733", "track_or_recording_length": "355773"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "10", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "76026", "artist-credit-phrase": "The KLF", "id": "035e349d-b581-4c0e-818f-ae14e10bc26f", "title": "Trancentral Lost in My Mind"}, "length": "76293", "position": "10", "id": "716fe2c9-47b8-3719-8586-e4ed47694a10", "track_or_recording_length": "76293"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "11", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "214266", "artist-credit-phrase": "The KLF", "id": "d9dd3bc7-ae2a-4b62-a545-8a60f5704a7d", "title": "The Lights of Baton Rouge Pass By"}, "length": "196600", "position": "11", "id": "3220c725-d7cb-3d81-8fb9-91e5a2f94cc9", "track_or_recording_length": "196600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Space", "disambiguation": "Jimmy Cauty's ambient off-shoot of The Orb/The KLF", "id": "22240df3-8dcc-4272-9294-d127442e7f36", "name": "Space"}}], "length": "2302560", "artist-credit-phrase": "Space", "id": "42391d00-df70-4014-83f8-e980a6b695b3", "title": "Mercury / Venus / Mars / Jupiter / Saturn / Uranus / Neptune / Pluto"}, "length": "2302000", "title": "Space", "position": "12", "artist-credit-phrase": "The KLF", "track_or_recording_length": "2302000", "id": "b65aa927-6edf-340b-82b4-fbc34a5f5a0b", "number": "12"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "artist-credit-phrase": "The KLF", "release-group": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "first-release-date": "", "secondary-type-list": ["Compilation"], "primary-type": "Album", "title": "Space & Chill Out", "type": "Compilation", "id": "0b5e666a-b5d8-3dea-b6fc-9ab9c35b96ce", "artist-credit-phrase": "The KLF"}, "id": "c56ff16e-1d81-47de-926f-ba22891bd2bd"}} \ No newline at end of file +{"release": {"status": "Bootleg", "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "label-info-list": [], "quality": "normal", "title": "Space & Chill Out", "label-info-count": 0, "medium-count": 1, "cover-art-archive": {"count": "0", "front": "false", "back": "false", "artwork": "false"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [182, 8067, 14985, 28407, 39920, 74532, 79825, 93370, 135732, 162415, 168137, 182882], "id": "b.yqPuCBdsV5hrzDvYrw52iK_jE-", "sectors": "355532", "offset-count": 12}], "track-list": [{"recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "107066", "artist-credit-phrase": "The KLF", "id": "254c95dd-71e2-4a38-8267-bdbe046c5ace", "title": "Brownsville Turnaround on the Tex-Mex Border"}, "artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "105133", "title": "Brownsville Turnaround", "position": "1", "artist-credit-phrase": "The KLF", "track_or_recording_length": "105133", "id": "1f417f2b-e049-3ff1-9a08-d787dfd47b19", "number": "1"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "2", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "89000", "artist-credit-phrase": "The KLF", "id": "cfe7f2bb-ce37-434f-9d26-b0d523cd8e6e", "title": "Pulling Out of Ricardo and the Dusk Is Falling Fast"}, "length": "92240", "position": "2", "id": "2b6c44dc-e1bd-3feb-b889-746c0bb22eb9", "track_or_recording_length": "92240"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "3", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "181040", "artist-credit-phrase": "The KLF", "id": "b8fcd38a-59df-4f1c-a944-f836e8592b94", "title": "Six Hours to Louisiana, Black Coffee Going Cold"}, "length": "178960", "position": "3", "id": "13639dfc-3332-31c6-8fb5-4d0241e81dde", "track_or_recording_length": "178960"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "4", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "155333", "artist-credit-phrase": "The KLF", "id": "20a3421a-36cd-4b60-8dfb-118caef8c6d8", "title": "Dream Time in Lake Jackson"}, "length": "153506", "position": "4", "id": "1b222630-1cc6-3f7e-9dc8-14d0d88ac054", "track_or_recording_length": "153506"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "5", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "title": "Madrugada Eterna", "id": "bd90d2bf-fff9-4aaa-9c3f-7bacbc9d5421", "length": "460866", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "691f5809-7a7f-44ba-89da-ac2f084eadeb", "title": "Madrugada Eterna"}, "type": "performance", "target": "691f5809-7a7f-44ba-89da-ac2f084eadeb"}], "artist-credit-phrase": "The KLF"}, "length": "461493", "position": "5", "id": "576a010d-1ea7-3525-a32b-2dce207d0ce3", "track_or_recording_length": "461493"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "6", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "68560", "artist-credit-phrase": "The KLF", "id": "5ea8a91d-5425-49ae-90f6-6acfefda4a59", "title": "Justified and Ancient Seems a Long Time Ago"}, "length": "70573", "position": "6", "id": "9e29c06a-c74b-3b0f-a170-98a1c0ea51d9", "track_or_recording_length": "70573"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "7", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "title": "Elvis on the Radio, Steel Guitar in My Soul", "id": "f246f658-49c4-4efe-840e-c624b7850bc9", "length": "181440", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "12fb5389-63f4-3310-b2ae-f728189e48e7", "title": "Elvis on the Radio, Steel Guitar in My Soul"}, "type": "performance", "target": "12fb5389-63f4-3310-b2ae-f728189e48e7"}], "artist-credit-phrase": "The KLF"}, "length": "180600", "position": "7", "id": "cdd8ed03-4b32-3c39-81f6-cd513369225e", "track_or_recording_length": "180600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "8", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "title": "3 A.M. Somewhere Out of Beaumont", "id": "a173d428-4e12-4513-8df2-eb7f098e6364", "length": "564933", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "cbb4fdeb-d774-3b89-95be-f8c8f6f5ba41", "title": "3 A.M. Somewhere Out of Beaumont"}, "type": "performance", "target": "cbb4fdeb-d774-3b89-95be-f8c8f6f5ba41"}], "artist-credit-phrase": "The KLF"}, "length": "564826", "position": "8", "id": "58a8cbf9-10a1-32c8-8cd7-f6893c5050ab", "track_or_recording_length": "564826"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "9", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "356000", "artist-credit-phrase": "The KLF", "id": "b7bc1dc2-a468-4948-b628-e03fc9265d41", "title": "Wichita Lineman Was a Song I Once Heard"}, "length": "355773", "position": "9", "id": "42679959-2e1a-3085-842a-a443ebc37733", "track_or_recording_length": "355773"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "10", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "76026", "artist-credit-phrase": "The KLF", "id": "035e349d-b581-4c0e-818f-ae14e10bc26f", "title": "Trancentral Lost in My Mind"}, "length": "76293", "position": "10", "id": "716fe2c9-47b8-3719-8586-e4ed47694a10", "track_or_recording_length": "76293"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "number": "11", "artist-credit-phrase": "The KLF", "recording": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "length": "214266", "artist-credit-phrase": "The KLF", "id": "d9dd3bc7-ae2a-4b62-a545-8a60f5704a7d", "title": "The Lights of Baton Rouge Pass By"}, "length": "196600", "position": "11", "id": "3220c725-d7cb-3d81-8fb9-91e5a2f94cc9", "track_or_recording_length": "196600"}, {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Space", "disambiguation": "Jimmy Cauty's ambient off-shoot of The Orb/The KLF", "id": "22240df3-8dcc-4272-9294-d127442e7f36", "name": "Space"}}], "length": "2302560", "artist-credit-phrase": "Space", "id": "42391d00-df70-4014-83f8-e980a6b695b3", "title": "Mercury / Venus / Mars / Jupiter / Saturn / Uranus / Neptune / Pluto"}, "length": "2302000", "title": "Space", "position": "12", "artist-credit-phrase": "The KLF", "track_or_recording_length": "2302000", "id": "b65aa927-6edf-340b-82b4-fbc34a5f5a0b", "number": "12"}], "disc-count": 1}], "text-representation": {"language": "eng", "script": "Latn"}, "artist-credit-phrase": "The KLF", "release-group": {"artist-credit": [{"artist": {"sort-name": "KLF, The", "disambiguation": "British electronic band", "id": "8092b8b7-235e-4844-9f72-95a9d5a73dbf", "name": "The KLF"}}], "first-release-date": "", "secondary-type-list": ["Compilation"], "primary-type": "Album", "title": "Space & Chill Out", "type": "Compilation", "id": "0b5e666a-b5d8-3dea-b6fc-9ab9c35b96ce", "artist-credit-phrase": "The KLF"}, "id": "c56ff16e-1d81-47de-926f-ba22891bd2bd"}} \ No newline at end of file diff --git a/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json b/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json index e4ee5600..b4d4edb6 100644 --- a/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json +++ b/whipper/test/whipper.release.e32ae79a-336e-4d33-945c-8c5e8206dbd3.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "5033197358222", "asin": "B000CNEQ64", "label-info-count": 1, "label-info-list": [{"catalog-number": "VVR1035822", "label": {"label-code": "1801", "sort-name": "V2", "disambiguation": "imprint of V2 Music Ltd. and its international subsidiaries", "id": "dc2f5993-7a3d-4c59-bba0-0a77bf9d7416", "name": "V2"}}], "cover-art-archive": {"count": "10", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2006-01-30", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006-01-30", "quality": "normal", "id": "e32ae79a-336e-4d33-945c-8c5e8206dbd3", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "release-group": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "first-release-date": "2006-01-30", "primary-type": "Album", "title": "Ballad of the Broken Seas", "type": "Album", "id": "994cdad1-0365-3439-89ed-6686bd563503", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "171613", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "4fe44724-1d7e-4275-9693-b889864de750", "title": "Deus Ibi Est"}, "length": "171613", "position": "1", "id": "60f05f29-4949-3902-a525-b3d24b0029f4", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "190120", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "title": "Black Mountain"}, "length": "190120", "position": "2", "id": "978ab42b-043c-394b-a144-ee1e00db9bab", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "233880", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "title": "The False Husband"}, "length": "233880", "position": "3", "id": "7a70fbf6-69e3-3ce0-9a85-53e6ded2f5ea", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "162386", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "title": "Ballad of the Broken Seas"}, "length": "162386", "position": "4", "id": "2ae31462-4fb2-350f-9778-2104d6c2dd3b", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "160680", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "title": "Revolver"}, "length": "160680", "position": "5", "id": "cf8778eb-8b07-36f1-b24b-2d71af06fa29", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "209066", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "title": "Ramblin' Man"}, "length": "209066", "position": "6", "id": "a2cb63ac-606a-3721-a196-6f55c38694f8", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "207133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "title": "(Do You Wanna) Come Walk With Me?"}, "length": "207133", "position": "7", "id": "9bf96f8b-8e04-31bb-a42c-1a24d2b5bc0a", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "277186", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "title": "Saturday's Gone"}, "length": "277186", "position": "8", "id": "6179abe2-cdb3-365a-95e4-4d1f0c3f1b9c", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "173640", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "61ac7fad-d396-4467-93a9-a25472561008", "title": "It's Hard to Kill a Bad Thing"}, "length": "173640", "position": "9", "id": "68c1a96c-bcb1-3d9a-ad86-e2a5db5b0291", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224173", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "title": "Honey Child What Can I Do?"}, "length": "224173", "position": "10", "id": "431aeb0c-25d0-3f9a-9fb3-b391929de5e1", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "224560", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "title": "Dusty Wreath"}, "length": "224560", "position": "11", "id": "65750cb3-a552-33f6-acb2-a77c68638976", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "length": "335133", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "title": "The Circus Is Leaving Town"}, "length": "335133", "position": "12", "id": "6afbb338-d9fd-37ce-a212-1f5d491b6cf4", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "barcode": "5033197358222", "asin": "B000CNEQ64", "label-info-count": 1, "label-info-list": [{"catalog-number": "VVR1035822", "label": {"label-code": "1801", "sort-name": "V2", "disambiguation": "imprint of V2 Music Ltd. and its international subsidiaries", "id": "dc2f5993-7a3d-4c59-bba0-0a77bf9d7416", "name": "V2"}}], "cover-art-archive": {"count": "10", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2006-01-30", "area": {"sort-name": "United Kingdom", "iso-3166-1-code-list": ["GB"], "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", "name": "United Kingdom"}}], "packaging": "Jewel Case", "text-representation": {"language": "eng", "script": "Latn"}, "date": "2006-01-30", "quality": "normal", "id": "e32ae79a-336e-4d33-945c-8c5e8206dbd3", "release-event-count": 1, "title": "Ballad of the Broken Seas", "country": "GB", "medium-count": 1, "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "release-group": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "first-release-date": "2006-01-30", "primary-type": "Album", "title": "Ballad of the Broken Seas", "type": "Album", "id": "994cdad1-0365-3439-89ed-6686bd563503", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "medium-list": [{"position": "1", "track-count": 12, "format": "CD", "disc-list": [{"offset-list": [150, 13021, 27280, 44821, 57000, 69051, 84731, 100266, 121055, 134078, 150891, 167733], "id": "xAq8L4ELMW14.6wI6tt7QAcxiDI-", "sectors": "192868", "offset-count": 12}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "1", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Deus Ibi Est", "id": "4fe44724-1d7e-4275-9693-b889864de750", "length": "171613", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "3063b439-66b0-303f-919d-d260aa77272a", "title": "Deus Ibi Est"}, "type": "performance", "target": "3063b439-66b0-303f-919d-d260aa77272a"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "171613", "position": "1", "id": "60f05f29-4949-3902-a525-b3d24b0029f4", "track_or_recording_length": "171613"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "2", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Black Mountain", "id": "32047729-7ad9-42ae-8d9e-c256ef9251ec", "length": "190120", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "092c8e4d-e032-354e-b619-1229e70c315d", "title": "Black Mountain"}, "type": "performance", "target": "092c8e4d-e032-354e-b619-1229e70c315d"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "190120", "position": "2", "id": "978ab42b-043c-394b-a144-ee1e00db9bab", "track_or_recording_length": "190120"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "3", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "The False Husband", "id": "0c71631a-5862-4834-ae8f-257b64bca745", "length": "233880", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "db132d56-a235-3d92-9fee-955e33f2ee89", "title": "The False Husband"}, "type": "performance", "target": "db132d56-a235-3d92-9fee-955e33f2ee89"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "233880", "position": "3", "id": "7a70fbf6-69e3-3ce0-9a85-53e6ded2f5ea", "track_or_recording_length": "233880"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "4", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Ballad of the Broken Seas", "id": "afc9e785-60fd-4942-a23c-3653633f4783", "length": "162386", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "771fbfd8-301b-37ec-a715-f26f7ce06e26", "title": "Ballad of the Broken Seas"}, "type": "performance", "target": "771fbfd8-301b-37ec-a715-f26f7ce06e26"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "162386", "position": "4", "id": "2ae31462-4fb2-350f-9778-2104d6c2dd3b", "track_or_recording_length": "162386"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "5", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Revolver", "id": "048932de-992d-4b08-ab4f-b5d735ea323e", "length": "160680", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "5eadf9d4-ce7e-3964-bb63-5c9ca17b05b3", "title": "Revolver"}, "type": "performance", "target": "5eadf9d4-ce7e-3964-bb63-5c9ca17b05b3"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "160680", "position": "5", "id": "cf8778eb-8b07-36f1-b24b-2d71af06fa29", "track_or_recording_length": "160680"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "6", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Ramblin' Man", "id": "42c0e096-6c48-43cf-b6d4-700903727418", "length": "209066", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "attribute-list": ["cover"], "target": "c74f2f61-3734-3c61-a721-7ebf26ce6137", "attributes": [{"type-id": "1e8536bd-6eda-3822-8e78-1c0f4d3d2113", "attribute": "cover"}], "work": {"iswc-list": ["T-070.243.087-2"], "iswc": "T-070.243.087-2", "id": "c74f2f61-3734-3c61-a721-7ebf26ce6137", "language": "eng", "title": "Ramblin\u2019 Man"}, "type": "performance"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "209066", "position": "6", "id": "a2cb63ac-606a-3721-a196-6f55c38694f8", "track_or_recording_length": "209066"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "7", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "(Do You Wanna) Come Walk With Me?", "id": "ef599a4c-8163-4829-9332-8dfe8c79219a", "length": "207133", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "9d64f4f3-77e0-38c8-a94f-b4c82ff127b5", "title": "(Do You Wanna) Come Walk With Me?"}, "type": "performance", "target": "9d64f4f3-77e0-38c8-a94f-b4c82ff127b5"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "207133", "position": "7", "id": "9bf96f8b-8e04-31bb-a42c-1a24d2b5bc0a", "track_or_recording_length": "207133"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "8", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Saturday's Gone", "id": "765fc7cc-2055-4066-a5b2-f1afbd1fd1f8", "length": "277186", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "861734ac-a1c3-3a6a-a27e-be62501f3646", "title": "Saturday's Gone"}, "type": "performance", "target": "861734ac-a1c3-3a6a-a27e-be62501f3646"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "277186", "position": "8", "id": "6179abe2-cdb3-365a-95e4-4d1f0c3f1b9c", "track_or_recording_length": "277186"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "9", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "It's Hard to Kill a Bad Thing", "id": "61ac7fad-d396-4467-93a9-a25472561008", "length": "173640", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "505c8f91-cafd-375e-81c0-dce3f2eb3678", "title": "It's Hard to Kill a Bad Thing"}, "type": "performance", "target": "505c8f91-cafd-375e-81c0-dce3f2eb3678"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "173640", "position": "9", "id": "68c1a96c-bcb1-3d9a-ad86-e2a5db5b0291", "track_or_recording_length": "173640"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "10", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Honey Child What Can I Do?", "id": "2fed65ae-3297-40d6-8f54-0d55f8ed7287", "length": "224173", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "8349a573-da22-370d-9165-c8897fd16ce2", "language": "eng", "title": "Honey Child What Can I Do?"}, "type": "performance", "target": "8349a573-da22-370d-9165-c8897fd16ce2"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "224173", "position": "10", "id": "431aeb0c-25d0-3f9a-9fb3-b391929de5e1", "track_or_recording_length": "224173"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "11", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "Dusty Wreath", "id": "33ce6721-b148-45ad-9a1e-1a4b1ea6912e", "length": "224560", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "11b1502f-706a-3b4f-a226-c7889415daf9", "title": "Dusty Wreath"}, "type": "performance", "target": "11b1502f-706a-3b4f-a226-c7889415daf9"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "224560", "position": "11", "id": "65750cb3-a552-33f6-acb2-a77c68638976", "track_or_recording_length": "224560"}, {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "number": "12", "artist-credit-phrase": "Isobel Campbell & Mark Lanegan", "recording": {"artist-credit": [{"artist": {"sort-name": "Campbell, Isobel", "id": "d51f3a15-12a2-41a0-acfa-33b5eae71164", "name": "Isobel Campbell"}}, " & ", {"artist": {"sort-name": "Lanegan, Mark", "id": "a9126556-f555-4920-9617-6e013f8228a7", "name": "Mark Lanegan"}}], "title": "The Circus Is Leaving Town", "id": "6cdb184d-12a0-4ba8-b50b-3325e0664f9e", "length": "335133", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "work": {"id": "f1205928-5646-3b55-9be9-c3e4be31f087", "title": "The Circus Is Leaving Town"}, "type": "performance", "target": "f1205928-5646-3b55-9be9-c3e4be31f087"}], "artist-credit-phrase": "Isobel Campbell & Mark Lanegan"}, "length": "335133", "position": "12", "id": "6afbb338-d9fd-37ce-a212-1f5d491b6cf4", "track_or_recording_length": "335133"}], "disc-count": 1}]}} \ No newline at end of file diff --git a/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json b/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json index d9fd47f7..c1f12604 100644 --- a/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json +++ b/whipper/test/whipper.release.f484a9fc-db21-4106-9408-bcd105c90047.json @@ -1 +1 @@ -{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "barcode": "5050466625021", "asin": "B000095K86", "label-info-count": 1, "label-info-list": [{"catalog-number": "5050466-6250-2-1", "label": {"sort-name": "Warner Strategic Marketing", "label-code": "2828", "id": "640ea9b1-3811-4c06-8897-5918c16f9fe1", "name": "Warner Strategic Marketing"}}], "cover-art-archive": {"count": "2", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2003-05-19", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "packaging": "Slim Jewel Case", "text-representation": {"language": "deu", "script": "Latn"}, "date": "2003-05-19", "quality": "normal", "id": "f484a9fc-db21-4106-9408-bcd105c90047", "release-event-count": 1, "title": "Anyplace, Anywhere, Anytime", "country": "DE", "medium-count": 1, "artist-credit-phrase": "Nena & Kim Wilde", "release-group": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "first-release-date": "2003-05-19", "primary-type": "Single", "title": "Anyplace, Anywhere, Anytime", "type": "Single", "id": "3bbf5f32-dbef-3fe8-b4b4-c52d63abf282", "artist-credit-phrase": "Nena & Kim Wilde"}, "medium-list": [{"position": "1", "track-count": 4, "format": "CD", "disc-list": [{"offset-list": [150, 17037, 35418, 53803], "id": "X2c2IQ5vUy5x6Jh7Xi_DGHtA1X8-", "sectors": "66872", "offset-count": 4}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "1", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "223000", "artist-credit-phrase": "Nena & Kim Wilde", "id": "fde5622c-ce23-4ebb-975d-51d4a926f901", "title": "Anyplace, Anywhere, Anytime (radio version)"}, "length": "225160", "position": "1", "id": "1cc96e78-28ed-3820-b0b6-614c35b121ac", "track_or_recording_length": "225160"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " mit ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "length": "243453", "artist-credit-phrase": "Nena mit Kim Wilde", "id": "5f19758e-7421-4c71-a599-9a9575d8e1b0", "title": "Anyplace, Anywhere, Anytime (new version)"}, "length": "245080", "position": "2", "artist-credit-phrase": "Nena & Kim Wilde", "track_or_recording_length": "245080", "id": "f16db4bf-9a34-3d5a-a975-c9375ab7a2ca", "number": "2"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "3", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "243266", "artist-credit-phrase": "Nena", "id": "32706323-1a08-4c7e-bf21-9a44934498ba", "title": "Irgendwie, irgendwo, irgendwann (new version)"}, "length": "245133", "position": "3", "id": "ce2c4edd-6eab-36c8-8f84-e8c85f197a88", "track_or_recording_length": "245133"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "4", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "length": "175440", "artist-credit-phrase": "Nena", "id": "ea70231c-cc03-4900-9a5a-43afb18ed638", "title": "Nur getr\u00e4umt (new version)"}, "length": "173627", "position": "4", "id": "6e178989-7d8e-3c33-9628-50bdda7c4483", "track_or_recording_length": "173627"}], "disc-count": 1}]}} \ No newline at end of file +{"release": {"status": "Official", "artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "barcode": "5050466625021", "asin": "B000095K86", "label-info-count": 1, "label-info-list": [{"catalog-number": "5050466-6250-2-1", "label": {"sort-name": "Warner Strategic Marketing", "label-code": "2828", "id": "640ea9b1-3811-4c06-8897-5918c16f9fe1", "name": "Warner Strategic Marketing"}}], "cover-art-archive": {"count": "2", "front": "true", "back": "true", "artwork": "true"}, "release-event-list": [{"date": "2003-05-19", "area": {"sort-name": "Germany", "iso-3166-1-code-list": ["DE"], "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", "name": "Germany"}}], "packaging": "Slim Jewel Case", "text-representation": {"language": "deu", "script": "Latn"}, "date": "2003-05-19", "quality": "normal", "id": "f484a9fc-db21-4106-9408-bcd105c90047", "release-event-count": 1, "title": "Anyplace, Anywhere, Anytime", "country": "DE", "medium-count": 1, "artist-credit-phrase": "Nena & Kim Wilde", "release-group": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "first-release-date": "2003-05-19", "primary-type": "Single", "title": "Anyplace, Anywhere, Anytime", "type": "Single", "id": "3bbf5f32-dbef-3fe8-b4b4-c52d63abf282", "artist-credit-phrase": "Nena & Kim Wilde"}, "medium-list": [{"position": "1", "track-count": 4, "format": "CD", "disc-list": [{"offset-list": [150, 17037, 35418, 53803], "id": "X2c2IQ5vUy5x6Jh7Xi_DGHtA1X8-", "sectors": "66872", "offset-count": 4}], "track-list": [{"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "number": "1", "artist-credit-phrase": "Nena & Kim Wilde", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "title": "Anyplace, Anywhere, Anytime (radio version)", "id": "fde5622c-ce23-4ebb-975d-51d4a926f901", "length": "223000", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "begin": "2002", "end": "2002", "target": "698711ac-5a4c-4a7d-acf2-20db141fe6cf", "ended": "true", "work": {"iswc-list": ["T-801.590.647-6"], "language": "mul", "title": "Anyplace, Anywhere, Anytime", "iswc": "T-801.590.647-6", "disambiguation": "English/German version", "id": "698711ac-5a4c-4a7d-acf2-20db141fe6cf"}, "type": "performance"}], "artist-credit-phrase": "Nena & Kim Wilde"}, "length": "225160", "position": "1", "id": "1cc96e78-28ed-3820-b0b6-614c35b121ac", "track_or_recording_length": "225160"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " & ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}, " mit ", {"artist": {"sort-name": "Wilde, Kim", "id": "4b462375-c508-432a-8c88-ceeec38b16ae", "name": "Kim Wilde"}}], "title": "Anyplace, Anywhere, Anytime (new version)", "id": "5f19758e-7421-4c71-a599-9a9575d8e1b0", "length": "243453", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "begin": "2002", "end": "2002", "target": "698711ac-5a4c-4a7d-acf2-20db141fe6cf", "ended": "true", "work": {"iswc-list": ["T-801.590.647-6"], "language": "mul", "title": "Anyplace, Anywhere, Anytime", "iswc": "T-801.590.647-6", "disambiguation": "English/German version", "id": "698711ac-5a4c-4a7d-acf2-20db141fe6cf"}, "type": "performance"}], "artist-credit-phrase": "Nena mit Kim Wilde"}, "length": "245080", "position": "2", "artist-credit-phrase": "Nena & Kim Wilde", "track_or_recording_length": "245080", "id": "f16db4bf-9a34-3d5a-a975-c9375ab7a2ca", "number": "2"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "3", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "title": "Irgendwie, irgendwo, irgendwann (new version)", "id": "32706323-1a08-4c7e-bf21-9a44934498ba", "length": "243266", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "begin": "2002", "end": "2002", "target": "4a749840-079e-3f60-9434-6edee2a9fc35", "ended": "true", "work": {"iswc-list": ["T-800.784.016-7"], "iswc": "T-800.784.016-7", "id": "4a749840-079e-3f60-9434-6edee2a9fc35", "language": "deu", "title": "Irgendwie, irgendwo, irgendwann"}, "type": "performance"}], "artist-credit-phrase": "Nena"}, "length": "245133", "position": "3", "id": "ce2c4edd-6eab-36c8-8f84-e8c85f197a88", "track_or_recording_length": "245133"}, {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "number": "4", "artist-credit-phrase": "Nena", "recording": {"artist-credit": [{"artist": {"sort-name": "Nena", "disambiguation": "the person, performing solo since 1987", "id": "38bfaa7f-ee98-48cb-acd0-946d7aeecd76", "name": "Nena"}}], "title": "Nur getr\u00e4umt (new version)", "id": "ea70231c-cc03-4900-9a5a-43afb18ed638", "length": "175440", "work-relation-list": [{"type-id": "a3005666-a872-32c3-ad06-98af558e99b0", "begin": "2002", "end": "2002", "target": "67937009-cb54-3ce6-804f-30f990099782", "ended": "true", "work": {"iswc-list": ["T-800.033.809-1"], "iswc": "T-800.033.809-1", "id": "67937009-cb54-3ce6-804f-30f990099782", "language": "deu", "title": "Nur getr\u00e4umt"}, "type": "performance"}], "artist-credit-phrase": "Nena"}, "length": "173627", "position": "4", "id": "6e178989-7d8e-3c33-9628-50bdda7c4483", "track_or_recording_length": "173627"}], "disc-count": 1}]}} \ No newline at end of file From 42e7a77645f40ca7036325e28331173c1492563b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 22:07:59 +0100 Subject: [PATCH 29/79] =?UTF-8?q?Remove=20unused=20argument=20for=20?= =?UTF-8?q?=E2=80=A6.mbngs.=5FgetMetadata()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 4 ++-- whipper/test/test_common_mbngs.py | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 2147abc6..3395155d 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -160,7 +160,7 @@ def _getWorks(recording): return works -def _getMetadata(releaseShort, release, discid, country=None): +def _getMetadata(release, discid, country=None): """ @type release: C{dict} @param release: a release dict as returned in the value for key release @@ -331,7 +331,7 @@ def musicbrainz(discid, country=None, record=False): formatted = json.dumps(releaseDetail, sort_keys=False, indent=4) logger.debug('release %s', formatted) - md = _getMetadata(release, releaseDetail, discid, country) + md = _getMetadata(releaseDetail, discid, country) if md: logger.debug('duration %r', md.duration) ret.append(md) diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index da80fd90..fdeb5ca7 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -22,7 +22,7 @@ def testMissingReleaseDate(self): handle.close() discid = "b.yqPuCBdsV5hrzDvYrw52iK_jE-" - metadata = mbngs._getMetadata({}, response['release'], discid) + metadata = mbngs._getMetadata(response['release'], discid) self.assertFalse(metadata.release) @@ -35,7 +35,7 @@ def test2MeterSessies10(self): handle.close() discid = "f7XO36a7n1LCCskkCiulReWbwZA-" - metadata = mbngs._getMetadata({}, response['release'], discid) + metadata = mbngs._getMetadata(response['release'], discid) self.assertEqual(metadata.artist, u'Various Artists') self.assertEqual(metadata.release, u'2001-10-15') @@ -62,7 +62,7 @@ def testBalladOfTheBrokenSeas(self): handle.close() discid = "xAq8L4ELMW14.6wI6tt7QAcxiDI-" - metadata = mbngs._getMetadata({}, response['release'], discid) + metadata = mbngs._getMetadata(response['release'], discid) self.assertEqual(metadata.artist, u'Isobel Campbell & Mark Lanegan') self.assertEqual(metadata.sortName, @@ -94,7 +94,7 @@ def testMalaInCuba(self): handle.close() discid = "u0aKVpO.59JBy6eQRX2vYcoqQZ0-" - metadata = mbngs._getMetadata({}, response['release'], discid) + metadata = mbngs._getMetadata(response['release'], discid) self.assertEqual(metadata.artist, u'Mala') self.assertEqual(metadata.sortName, u'Mala') @@ -130,7 +130,7 @@ def testUnknownArtist(self): handle.close() discid = "RhrwgVb0hZNkabQCw1dZIhdbMFg-" - metadata = mbngs._getMetadata({}, response['release'], discid) + metadata = mbngs._getMetadata(response['release'], discid) self.assertEqual(metadata.artist, u'CunninLynguists') self.assertEqual(metadata.release, u'2003') self.assertEqual(metadata.mbidArtist, @@ -166,7 +166,7 @@ def testNenaAndKimWildSingle(self): handle.close() discid = "X2c2IQ5vUy5x6Jh7Xi_DGHtA1X8-" - metadata = mbngs._getMetadata({}, response['release'], discid) + metadata = mbngs._getMetadata(response['release'], discid) self.assertEqual(metadata.artist, u'Nena & Kim Wilde') self.assertEqual(metadata.release, u'2003-05-19') self.assertEqual(metadata.mbidArtist, @@ -210,7 +210,7 @@ def testAllAvailableMetadata(self): handle.close() discid = "cHW1Uutl_kyWNaLJsLmTGTe4rnE-" - metadata = mbngs._getMetadata({}, response['release'], discid) + metadata = mbngs._getMetadata(response['release'], discid) self.assertEqual(metadata.artist, u'David Rovics') self.assertEqual(metadata.sortName, u'Rovics, David') self.assertFalse(metadata.various) From 14aa8b7f7c1230f393ed19fcc4ee329ba6563c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 22:59:58 +0100 Subject: [PATCH 30/79] Handle artist MBIDs as multivalue tags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of joining artist MBIDs with a ';' save them as multiple values to the tag. (This is how Picard saves that tag.) Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 3 +- whipper/test/test_common_mbngs.py | 70 +++++++++++++++++-------------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 3395155d..661c735c 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -143,8 +143,9 @@ def getName(self): i.get('artist').get('name', None))) def getIds(self): + # split()'s the joined string so we get a proper list of MBIDs return self.joiner(lambda i: i.get('artist').get('id', None), - joinString=";") + joinString=";").split(';') def _getWorks(recording): diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index fdeb5ca7..a98b4c3c 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -40,16 +40,17 @@ def test2MeterSessies10(self): self.assertEqual(metadata.artist, u'Various Artists') self.assertEqual(metadata.release, u'2001-10-15') self.assertEqual(metadata.mbidArtist, - u'89ad4ac3-39f7-470e-963a-56509c546377') + [u'89ad4ac3-39f7-470e-963a-56509c546377']) self.assertEqual(len(metadata.tracks), 18) track16 = metadata.tracks[15] self.assertEqual(track16.artist, 'Tom Jones & Stereophonics') - self.assertEqual(track16.mbidArtist, - u'57c6f649-6cde-48a7-8114-2a200247601a' - ';0bfba3d3-6a04-4779-bb0a-df07df5b0558') + self.assertEqual(track16.mbidArtist, [ + u'57c6f649-6cde-48a7-8114-2a200247601a', + u'0bfba3d3-6a04-4779-bb0a-df07df5b0558', + ]) self.assertEqual(track16.sortName, u'Jones, Tom & Stereophonics') @@ -68,9 +69,10 @@ def testBalladOfTheBrokenSeas(self): self.assertEqual(metadata.sortName, u'Campbell, Isobel & Lanegan, Mark') self.assertEqual(metadata.release, u'2006-01-30') - self.assertEqual(metadata.mbidArtist, - u'd51f3a15-12a2-41a0-acfa-33b5eae71164;' - 'a9126556-f555-4920-9617-6e013f8228a7') + self.assertEqual(metadata.mbidArtist, [ + u'd51f3a15-12a2-41a0-acfa-33b5eae71164', + u'a9126556-f555-4920-9617-6e013f8228a7', + ]) self.assertEqual(len(metadata.tracks), 12) @@ -80,9 +82,10 @@ def testBalladOfTheBrokenSeas(self): self.assertEqual(track12.sortName, u'Campbell, Isobel' ' & Lanegan, Mark') - self.assertEqual(track12.mbidArtist, - u'd51f3a15-12a2-41a0-acfa-33b5eae71164;' - 'a9126556-f555-4920-9617-6e013f8228a7') + self.assertEqual(track12.mbidArtist, [ + u'd51f3a15-12a2-41a0-acfa-33b5eae71164', + u'a9126556-f555-4920-9617-6e013f8228a7', + ]) def testMalaInCuba(self): # single artist disc, but with multiple artists tracks @@ -100,7 +103,7 @@ def testMalaInCuba(self): self.assertEqual(metadata.sortName, u'Mala') self.assertEqual(metadata.release, u'2012-09-17') self.assertEqual(metadata.mbidArtist, - u'09f221eb-c97e-4da5-ac22-d7ab7c555bbb') + [u'09f221eb-c97e-4da5-ac22-d7ab7c555bbb']) self.assertEqual(len(metadata.tracks), 14) @@ -109,10 +112,11 @@ def testMalaInCuba(self): self.assertEqual(track6.artist, u'Mala feat. Dreiser & Sexto Sentido') self.assertEqual(track6.sortName, u'Mala feat. Dreiser & Sexto Sentido') - self.assertEqual(track6.mbidArtist, - u'09f221eb-c97e-4da5-ac22-d7ab7c555bbb' - ';ec07a209-55ff-4084-bc41-9d4d1764e075' - ';f626b92e-07b1-4a19-ad13-c09d690db66c') + self.assertEqual(track6.mbidArtist, [ + u'09f221eb-c97e-4da5-ac22-d7ab7c555bbb', + u'ec07a209-55ff-4084-bc41-9d4d1764e075', + u'f626b92e-07b1-4a19-ad13-c09d690db66c', + ]) def testUnknownArtist(self): """ @@ -134,7 +138,7 @@ def testUnknownArtist(self): self.assertEqual(metadata.artist, u'CunninLynguists') self.assertEqual(metadata.release, u'2003') self.assertEqual(metadata.mbidArtist, - u'69c4cc43-8163-41c5-ac81-30946d27bb69') + [u'69c4cc43-8163-41c5-ac81-30946d27bb69']) self.assertEqual(len(metadata.tracks), 30) @@ -143,16 +147,17 @@ def testUnknownArtist(self): self.assertEqual(track8.artist, u'???') self.assertEqual(track8.sortName, u'[unknown]') self.assertEqual(track8.mbidArtist, - u'125ec42a-7229-4250-afc5-e057484327fe') + [u'125ec42a-7229-4250-afc5-e057484327fe']) track9 = metadata.tracks[8] self.assertEqual(track9.artist, u'CunninLynguists feat. Tonedeff') self.assertEqual(track9.sortName, u'CunninLynguists feat. Tonedeff') - self.assertEqual(track9.mbidArtist, - u'69c4cc43-8163-41c5-ac81-30946d27bb69' - ';b3869d83-9fb5-4eac-b5ca-2d155fcbee12') + self.assertEqual(track9.mbidArtist, [ + u'69c4cc43-8163-41c5-ac81-30946d27bb69', + u'b3869d83-9fb5-4eac-b5ca-2d155fcbee12' + ]) def testNenaAndKimWildSingle(self): """ @@ -169,9 +174,10 @@ def testNenaAndKimWildSingle(self): metadata = mbngs._getMetadata(response['release'], discid) self.assertEqual(metadata.artist, u'Nena & Kim Wilde') self.assertEqual(metadata.release, u'2003-05-19') - self.assertEqual(metadata.mbidArtist, - u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76' - ';4b462375-c508-432a-8c88-ceeec38b16ae') + self.assertEqual(metadata.mbidArtist, [ + u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76', + u'4b462375-c508-432a-8c88-ceeec38b16ae', + ]) self.assertEqual(len(metadata.tracks), 4) @@ -179,9 +185,10 @@ def testNenaAndKimWildSingle(self): self.assertEqual(track1.artist, u'Nena & Kim Wilde') self.assertEqual(track1.sortName, u'Nena & Wilde, Kim') - self.assertEqual(track1.mbidArtist, - u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76' - ';4b462375-c508-432a-8c88-ceeec38b16ae') + self.assertEqual(track1.mbidArtist, [ + u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76', + u'4b462375-c508-432a-8c88-ceeec38b16ae', + ]) self.assertEqual(track1.mbid, u'1cc96e78-28ed-3820-b0b6-614c35b121ac') self.assertEqual(track1.mbidRecording, @@ -191,9 +198,10 @@ def testNenaAndKimWildSingle(self): self.assertEqual(track2.artist, u'Nena & Kim Wilde') self.assertEqual(track2.sortName, u'Nena & Wilde, Kim') - self.assertEqual(track2.mbidArtist, - u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76' - ';4b462375-c508-432a-8c88-ceeec38b16ae') + self.assertEqual(track2.mbidArtist, [ + u'38bfaa7f-ee98-48cb-acd0-946d7aeecd76', + u'4b462375-c508-432a-8c88-ceeec38b16ae', + ]) self.assertEqual(track2.mbid, u'f16db4bf-9a34-3d5a-a975-c9375ab7a2ca') self.assertEqual(track2.mbidRecording, @@ -223,7 +231,7 @@ def testAllAvailableMetadata(self): self.assertEqual(metadata.mbidReleaseGroup, u'99850b41-a06e-4fb8-992c-75c191a77803') self.assertEqual(metadata.mbidArtist, - u'4d56eb9f-13b3-4f05-9db7-50195378d49f') + [u'4d56eb9f-13b3-4f05-9db7-50195378d49f']) self.assertEqual(metadata.url, u'https://musicbrainz.org/release' '/6109ceed-7e21-490b-b5ad-3a66b4e4cfbb') @@ -240,7 +248,7 @@ def testAllAvailableMetadata(self): u'4116eea3-b9c2-452a-8d63-92f1e585b225') self.assertEqual(track1.sortName, u'Rovics, David') self.assertEqual(track1.mbidArtist, - u'4d56eb9f-13b3-4f05-9db7-50195378d49f') + [u'4d56eb9f-13b3-4f05-9db7-50195378d49f']) self.assertEqual(track1.mbidRecording, u'b191794d-b7c6-4d6f-971e-0a543959b5ad') self.assertEqual(track1.mbidWorks, From 239fc3e6ae6d50145eb9f4209858ec091b5a6249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 23:09:11 +0100 Subject: [PATCH 31/79] Lowercase description of "%R" template variable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All other descriptions are lowercased, except for this one. Signed-off-by: Frederik “Freso” S. Olesen --- whipper/command/cd.py | 2 +- whipper/common/program.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 917e9b15..08438763 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -56,7 +56,7 @@ - %d: disc title - %y: release year - %r: release type, lowercase - - %R: Release type, normal case + - %R: release type, normal case - %x: audio extension, lowercase - %X: audio extension, uppercase diff --git a/whipper/common/program.py b/whipper/common/program.py index 3d55e6b0..ad630895 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -174,7 +174,7 @@ def getPath(self, outdir, template, mbdiscid, metadata, track_number=None): - %d: disc title - %y: release year - %r: release type, lowercase - - %R: Release type, normal case + - %R: release type, normal case - %x: audio extension, lowercase - %X: audio extension, uppercase """ From 787dbb91f6ed3a31ebe813f5393f5f94182604a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 23:55:50 +0100 Subject: [PATCH 32/79] Update copyright statement year range in README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frederik “Freso” S. Olesen --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6966bdf5..9feea5df 100644 --- a/README.md +++ b/README.md @@ -305,7 +305,7 @@ Licensed under the [GNU GPLv3 license](http://www.gnu.org/licenses/gpl-3.0). ```Text Copyright (C) 2009 Thomas Vander Stichele -Copyright (C) 2016-2018 The Whipper Team: JoeLametta, Frederik Olesen, +Copyright (C) 2016-2019 The Whipper Team: JoeLametta, Frederik Olesen, Samantha Baldwin, Merlijn Wajer, et al. This program is free software; you can redistribute it and/or modify From 1a1ddd524a4b1e93282911c1da820011187423d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Wed, 13 Feb 2019 23:57:11 +0100 Subject: [PATCH 33/79] README: Update copyright attribution of my own name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frederik “Freso” S. Olesen --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9feea5df..758b54e1 100644 --- a/README.md +++ b/README.md @@ -305,8 +305,8 @@ Licensed under the [GNU GPLv3 license](http://www.gnu.org/licenses/gpl-3.0). ```Text Copyright (C) 2009 Thomas Vander Stichele -Copyright (C) 2016-2019 The Whipper Team: JoeLametta, Frederik Olesen, - Samantha Baldwin, Merlijn Wajer, et al. +Copyright (C) 2016-2019 The Whipper Team: JoeLametta, Samantha Baldwin, + Merlijn Wajer, Frederik “Freso” S. Olesen, et al. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From 6abd120e4aafca3a415f50c14ccbda2b9aeb21e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Thu, 14 Feb 2019 00:49:02 +0100 Subject: [PATCH 34/79] Fix calls to cdrdao.ReadTOCTask() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/program.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/whipper/common/program.py b/whipper/common/program.py index ad630895..d7f7180d 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -97,7 +97,7 @@ def getFastToc(self, runner, device): logger.warning('cdrdao older than 1.2.3 has a pre-gap length bug.' ' See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=102171') # noqa: E501 - t = cdrdao.ReadTOC_Task(device) + t = cdrdao.ReadTOCTask(device) runner.run(t) toc = t.toc.table @@ -114,7 +114,7 @@ def getTable(self, runner, cddbdiscid, mbdiscid, device, offset, itable = None tdict = {} - t = cdrdao.ReadTOC_Task(device) + t = cdrdao.ReadTOCTask(device) t.description = "Reading table" t.toc_path = toc_path runner.run(t) From af748c55b7dce0db3d74cff9f20f63cd6f7d5df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Thu, 14 Feb 2019 11:25:22 +0100 Subject: [PATCH 35/79] Use git to get whipper's version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This essentially a copy of code from spotify2musicbrainz: https://gitlab.com/Freso/spotify2musicbrainz/commit/59157165c4ca4e7bb1d5d8b081365029ddf55c72 Given that that code is in GPLv3 (and I'm its author :)), it should be fine to use. It is mostly boilerplate from upstream documentation anyway: https://pypi.org/project/setuptools-scm/ Should fix https://github.com/whipper-team/whipper/issues/337 Signed-off-by: Frederik “Freso” S. Olesen --- .travis.yml | 2 +- requirements.txt | 1 + setup.py | 4 ++-- whipper/__init__.py | 9 ++++++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3bccf522..6eb171c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ install: - sudo apt-get -qq update - sudo pip install --upgrade -qq pip - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libiso9660-dev libsndfile1-dev python-cddb python-gi python-musicbrainzngs python-mutagen python-setuptools sox swig libcdio-utils - - sudo pip install pycdio==0.21 requests + - sudo pip install pycdio==0.21 requests setuptools_scm # Testing dependencies - sudo apt-get -qq install python-twisted-core diff --git a/requirements.txt b/requirements.txt index fdd5a635..c62bb6df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ mutagen pycdio>0.20 PyGObject requests +setuptools_scm diff --git a/setup.py b/setup.py index 8d891d39..d81ed30c 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,15 @@ from setuptools import setup, find_packages -from whipper import __version__ as whipper_version setup( name="whipper", - version=whipper_version, + use_scm_version=True, description="a secure cd ripper preferring accuracy over speed", author=['Thomas Vander Stichele', 'The Whipper Team'], maintainer=['The Whipper Team'], url='https://github.com/whipper-team/whipper', license='GPL3', packages=find_packages(), + setup_requires=['setuptools_scm'], entry_points={ 'console_scripts': [ 'whipper = whipper.command.main:main' diff --git a/whipper/__init__.py b/whipper/__init__.py index e06df53f..5291ca62 100644 --- a/whipper/__init__.py +++ b/whipper/__init__.py @@ -2,7 +2,14 @@ import os import sys -__version__ = '0.7.3' +from pkg_resources import (get_distribution, + DistributionNotFound, RequirementParseError) +try: + __version__ = get_distribution(__name__).version +except (DistributionNotFound, RequirementParseError): + # not installed as package or is being run from source/git checkout + from setuptools_scm import get_version + __version__ = get_version() level = logging.INFO if 'WHIPPER_DEBUG' in os.environ: From 2b6b0059aa67646547b652a19c99302dc8834068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Sat, 16 Feb 2019 03:34:17 +0100 Subject: [PATCH 36/79] Remove references to "python-cddb" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The use of this Python package was replaced in commit 542e07144385638e5813148c25cf2d5e9e772412 with another CDDB/FreeDB API implemention, but it was still being installed for Travis CI builds and for Docker containers. Signed-off-by: Frederik “Freso” S. Olesen --- .travis.yml | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6eb171c6..33d3a3c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ install: # Dependencies - sudo apt-get -qq update - sudo pip install --upgrade -qq pip - - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libiso9660-dev libsndfile1-dev python-cddb python-gi python-musicbrainzngs python-mutagen python-setuptools sox swig libcdio-utils + - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libiso9660-dev libsndfile1-dev python-gi python-musicbrainzngs python-mutagen python-setuptools sox swig libcdio-utils - sudo pip install pycdio==0.21 requests setuptools_scm # Testing dependencies diff --git a/Dockerfile b/Dockerfile index ae6509ba..276e2fd8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM debian:buster RUN apt-get update \ && apt-get install -y cdrdao python-gobject-2 python-musicbrainzngs python-mutagen python-setuptools \ - python-cddb python-requests libsndfile1-dev flac sox \ + python-requests libsndfile1-dev flac sox \ libiso9660-dev python-pip swig make pkgconf \ eject locales \ autoconf libtool curl \ From f9884add1bd0af5145c2198d44c013e60e1c0e76 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Mon, 18 Feb 2019 17:32:56 +0100 Subject: [PATCH 37/79] Add git dependency to Dockerfile Required by setuptools_scm. Signed-off-by: JoeLametta --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 276e2fd8..3955cc63 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ FROM debian:buster RUN apt-get update \ - && apt-get install -y cdrdao python-gobject-2 python-musicbrainzngs python-mutagen python-setuptools \ - python-requests libsndfile1-dev flac sox \ + && apt-get install -y cdrdao git python-gobject-2 python-musicbrainzngs python-mutagen \ + python-setuptools python-requests libsndfile1-dev flac sox \ libiso9660-dev python-pip swig make pkgconf \ eject locales \ autoconf libtool curl \ From 8d4f81875407f6883c2c3da29d8929d6f5cc8333 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Fri, 15 Feb 2019 19:07:20 +0100 Subject: [PATCH 38/79] Fix critical regressions introduced in 3e79032 and 16b0d8d Fixes #369. Signed-off-by: JoeLametta --- whipper/common/program.py | 45 ++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/whipper/common/program.py b/whipper/common/program.py index d7f7180d..223ed950 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -27,12 +27,11 @@ import os import time -from whipper.common import accurip, checksum, common, mbngs, path +from whipper.common import accurip, cache, checksum, common, mbngs, path from whipper.program import cdrdao, cdparanoia from whipper.image import image from whipper.extern import freedb from whipper.extern.task import task -from whipper.result import result import logging logger = logging.getLogger(__name__) @@ -64,6 +63,7 @@ def __init__(self, config, record=False): @param record: whether to record results of API calls for playback. """ self._record = record + self._cache = cache.ResultCache() self._config = config d = {} @@ -107,20 +107,38 @@ def getFastToc(self, runner, device): def getTable(self, runner, cddbdiscid, mbdiscid, device, offset, toc_path): """ - Retrieve the Table from the drive. + Retrieve the Table either from the cache or the drive. @rtype: L{table.Table} """ + tcache = cache.TableCache() + ptable = tcache.get(cddbdiscid, mbdiscid) itable = None tdict = {} - t = cdrdao.ReadTOCTask(device) - t.description = "Reading table" - t.toc_path = toc_path - runner.run(t) - itable = t.toc.table - tdict[offset] = itable - logger.debug('getTable: read table %r' % itable) + # Ignore old cache, since we do not know what offset it used. + if isinstance(ptable.object, dict): + tdict = ptable.object + + if offset in tdict: + itable = tdict[offset] + + if not itable: + logger.debug('getTable: cddbdiscid %s, mbdiscid %s not in cache ' + 'for offset %s, reading table', cddbdiscid, mbdiscid, + offset) + t = cdrdao.ReadTOCTask(device) + t.description = "Reading table" + t.toc_path = toc_path + runner.run(t) + itable = t.toc.table + tdict[offset] = itable + ptable.persist(tdict) + logger.debug('getTable: read table %r', itable) + else: + logger.debug('getTable: cddbdiscid %s, mbdiscid %s in cache ' + 'for offset %s', cddbdiscid, mbdiscid, offset) + logger.debug('getTable: loaded table %r', itable) assert itable.hasTOC() @@ -132,12 +150,15 @@ def getTable(self, runner, cddbdiscid, mbdiscid, device, offset, def getRipResult(self, cddbdiscid): """ - Return a RipResult object. + Retrieve the persistable RipResult either from our cache (from a + previous, possibly aborted rip), or return a new one. @rtype: L{result.RipResult} """ assert self.result is None - self.result = result.RipResult() + + self._presult = self._cache.getRipResult(cddbdiscid) + self.result = self._presult.object return self.result From a9bb51a0cf428e4ac1441eff629fc2bc25a85ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Fri, 1 Mar 2019 11:06:45 +0100 Subject: [PATCH 39/79] Specify supported version(s) of Python in setup.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In preparation for dropping Python 2.7 support[1], this specifies versions that *are* compatible with Python 2.7, so anyone installing via pip (if we end up publishing to PyPI) will get the proper version. See https://packaging.python.org/guides/dropping-older-python-versions/ [1] https://github.com/whipper-team/whipper/issues/78 Signed-off-by: Frederik “Freso” S. Olesen --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index d81ed30c..bbcfa0b4 100644 --- a/setup.py +++ b/setup.py @@ -8,6 +8,7 @@ maintainer=['The Whipper Team'], url='https://github.com/whipper-team/whipper', license='GPL3', + python_requires='>=2.7,<3', packages=find_packages(), setup_requires=['setuptools_scm'], entry_points={ From 135cc9ce05f32d537ac53ba1d06b4f9e3c05a97d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Mon, 18 Mar 2019 12:15:28 +0100 Subject: [PATCH 40/79] Include MusicBrainz Release URL in log output (#382) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Include MusicBrainz Release URL in log output This also passes *all* metadata to the `result` object, giving loggers a lot more (release) metadata to work with, in case custom, “3rd party” loggers (or even ourselves in the future!) want to do something more fancy or expansive with the metadata in the log file. Fixes https://github.com/whipper-team/whipper/issues/381 Signed-off-by: Frederik “Freso” S. Olesen * Uppercase "url" in output: "URL" Signed-off-by: Frederik “Freso” S. Olesen --- whipper/command/cd.py | 1 + whipper/result/logger.py | 5 ++++- whipper/result/result.py | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 08438763..f32c115e 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -182,6 +182,7 @@ def do(self): _, self.program.result.vendor, self.program.result.model, \ self.program.result.release = \ cdio.Device(self.device).get_hwinfo() + self.program.result.metadata = self.program.metadata self.doCommand() diff --git a/whipper/result/logger.py b/whipper/result/logger.py index 5858b59a..40c9c84a 100644 --- a/whipper/result/logger.py +++ b/whipper/result/logger.py @@ -70,8 +70,11 @@ def logRip(self, ripResult, epoch): lines.append(" CDDB Disc ID: %s" % ripResult. table.getCDDBDiscId()) lines.append(" MusicBrainz Disc ID: %s" % ripResult. table.getMusicBrainzDiscId()) - lines.append(" MusicBrainz lookup url: %s" % + lines.append(" MusicBrainz lookup URL: %s" % ripResult. table.getMusicBrainzSubmitURL()) + if ripResult.metadata: + lines.append(" MusicBrainz Release URL: %s" % + ripResult.metadata.url) lines.append("") # TOC section diff --git a/whipper/result/result.py b/whipper/result/result.py index 265514ce..35af5804 100644 --- a/whipper/result/result.py +++ b/whipper/result/result.py @@ -72,6 +72,8 @@ class RipResult: @ivar offset: sample read offset @ivar table: the full index table @type table: L{whipper.image.table.Table} + @ivar metadata: disc metadata from MusicBrainz (if available) + @type metadata: L{whipper.common.mbngs.DiscMetadata} @ivar vendor: vendor of the CD drive @ivar model: model of the CD drive @@ -88,6 +90,7 @@ class RipResult: table = None artist = None title = None + metadata = None vendor = None model = None From a977f9b7f6c0ed960b145f673615b882b0414005 Mon Sep 17 00:00:00 2001 From: gorgobacka Date: Wed, 27 Mar 2019 20:10:06 +0100 Subject: [PATCH 41/79] set success as default Signed-off-by: gorgobacka --- whipper/command/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/whipper/command/main.py b/whipper/command/main.py index e6ced3c1..9571eb3f 100644 --- a/whipper/command/main.py +++ b/whipper/command/main.py @@ -102,10 +102,10 @@ def add_arguments(self): help="show this help message and exit") self.parser.add_argument('-e', '--eject', action="store", dest="eject", - default="always", + default="success", choices=('never', 'failure', 'success', 'always'), - help="when to eject disc (default: always)") + help="when to eject disc (default: success)") def handle_arguments(self): if self.options.help: From 1ae6240e638e592534676d0e9d4dcef944774602 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Fri, 29 Mar 2019 13:30:44 +0100 Subject: [PATCH 42/79] Remove useless "stopgap morituri-insanity compatibility layer" Signed-off-by: JoeLametta --- whipper/command/cd.py | 2 +- whipper/common/program.py | 2 +- whipper/program/cdrdao.py | 7 ------- whipper/test/test_program_cdrdao.py | 2 +- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index f32c115e..99cdefbb 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -163,7 +163,7 @@ def do(self): # result - self.program.result.cdrdaoVersion = cdrdao.getCDRDAOVersion() + self.program.result.cdrdaoVersion = cdrdao.version() self.program.result.cdparanoiaVersion = \ cdparanoia.getCdParanoiaVersion() info = drive.getDeviceInfo(self.device) diff --git a/whipper/common/program.py b/whipper/common/program.py index 223ed950..35509a69 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -92,7 +92,7 @@ def getFastToc(self, runner, device): Also warn about buggy cdrdao versions. """ from pkg_resources import parse_version as V - version = cdrdao.getCDRDAOVersion() + version = cdrdao.version() if V(version) < V('1.2.3rc2'): logger.warning('cdrdao older than 1.2.3 has a pre-gap length bug.' ' See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=102171') # noqa: E501 diff --git a/whipper/program/cdrdao.py b/whipper/program/cdrdao.py index 8bfad7f6..b9b36874 100644 --- a/whipper/program/cdrdao.py +++ b/whipper/program/cdrdao.py @@ -188,10 +188,3 @@ def version(): "could not find version") return None return m.group('version') - - -def getCDRDAOVersion(): - """ - stopgap morituri-insanity compatibility layer - """ - return version() diff --git a/whipper/test/test_program_cdrdao.py b/whipper/test/test_program_cdrdao.py index 0655c611..0bbd60cd 100644 --- a/whipper/test/test_program_cdrdao.py +++ b/whipper/test/test_program_cdrdao.py @@ -9,7 +9,7 @@ class VersionTestCase(common.TestCase): def testGetVersion(self): - v = cdrdao.getCDRDAOVersion() + v = cdrdao.version() self.assertTrue(v) # make sure it starts with a digit self.assertTrue(int(v[0])) From 3a61960e5fea0977ad7c1a333058bed7b4671487 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Tue, 2 Apr 2019 15:27:22 +0000 Subject: [PATCH 43/79] Add git/mercurial dependency to the README Building or running whipper uninstalled requires setuptools-scm (since #370): which depends on git (or mercurial) in order to to its job. Fixes #386. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 758b54e1..70da85a2 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,8 @@ Some dependencies aren't available in the PyPI. They can be probably installed u - [libsndfile](http://www.mega-nerd.com/libsndfile/) - [flac](https://xiph.org/flac/) - [sox](http://sox.sourceforge.net/) +- [git](https://git-scm.com/) or [mercurial](https://www.mercurial-scm.org/) + - Required either when running whipper without installing it or when building it from its source code (code cloned from a git/mercurial repository). PyPI installable dependencies are listed in the [requirements.txt](https://github.com/whipper-team/whipper/blob/master/requirements.txt) file and can be installed issuing the following command: From 8209927a795659343160c79bfabce879f3da6a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Thu, 2 May 2019 18:24:13 +0200 Subject: [PATCH 44/79] Add testcase for failure when missing release type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/whipper-team/whipper/issues/396 Signed-off-by: Frederik “Freso” S. Olesen --- whipper/test/test_common_mbngs.py | 16 +++++++++++++++- ...ase.d8e6153a-2c47-4804-9d73-0aac1081c3b1.json | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 whipper/test/whipper.release.d8e6153a-2c47-4804-9d73-0aac1081c3b1.json diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index a98b4c3c..5d2693c0 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -1,5 +1,5 @@ # -*- Mode: Python; test-case-name: whipper.test.test_common_mbngs -*- -# vi:si:et:sw=4:sts=4:ts=4 +# vi:si:et:sw=4:sts=4:ts=4:set fileencoding=utf-8 import os import json @@ -207,6 +207,20 @@ def testNenaAndKimWildSingle(self): self.assertEqual(track2.mbidRecording, u'5f19758e-7421-4c71-a599-9a9575d8e1b0') + def testMissingReleaseGroupType(self): + """Check that whipper doesn't break if there's no type.""" + # Using: Gustafsson, Österberg & Cowle - What's Up? 8 (disc 4) + # https://musicbrainz.org/release/d8e6153a-2c47-4804-9d73-0aac1081c3b1 + filename = 'whipper.release.d8e6153a-2c47-4804-9d73-0aac1081c3b1.json' + path = os.path.join(os.path.dirname(__file__), filename) + handle = open(path, "rb") + response = json.loads(handle.read()) + handle.close() + discid = "xu338_M8WukSRi0J.KTlDoflB8Y-" # disc 4 + + metadata = mbngs._getMetadata(response['release'], discid) + self.assertEqual(metadata.releaseType, u'') + def testAllAvailableMetadata(self): """Check that all possible metadata gets assigned.""" # Using: David Rovics - The Other Side diff --git a/whipper/test/whipper.release.d8e6153a-2c47-4804-9d73-0aac1081c3b1.json b/whipper/test/whipper.release.d8e6153a-2c47-4804-9d73-0aac1081c3b1.json new file mode 100644 index 00000000..2090819b --- /dev/null +++ b/whipper/test/whipper.release.d8e6153a-2c47-4804-9d73-0aac1081c3b1.json @@ -0,0 +1 @@ +{"release": {"id": "d8e6153a-2c47-4804-9d73-0aac1081c3b1", "title": "What\u2019s Up? 8", "status": "Official", "quality": "normal", "packaging": "Fatbox", "text-representation": {"script": "Latn"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "release-group": {"id": "6aa93fc6-6389-414d-a3ed-7ece36bc4931", "title": "What\u2019s Up? 8", "first-release-date": "2008", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "date": "2008", "country": "SE", "release-event-list": [{"date": "2008", "area": {"id": "23d10872-f5ae-3f0c-bf55-332788a16ecb", "name": "Sweden", "sort-name": "Sweden", "iso-3166-1-code-list": ["SE"]}}], "release-event-count": 1, "barcode": "9789162267957", "cover-art-archive": {"artwork": "false", "count": "0", "front": "false", "back": "false"}, "label-info-list": [{"catalog-number": "6795-7", "label": {"id": "c5e2b2fe-9276-47d9-b97c-6023760dbb17", "name": "Bonnier Utbildning", "sort-name": "Bonnier Utbildning"}}], "label-info-count": 1, "medium-list": [{"position": "1", "format": "CD", "disc-list": [{"id": "fCtKwjUN2lHvQ3s8tV8cLqSIGgc-", "sectors": "327185", "offset-list": [150, 16807, 32419, 37876, 47831, 63067, 66976, 87631, 122887, 133971, 147242, 160597, 170107, 186736, 207252, 216523, 225601, 243442, 267854, 305339], "offset-count": 20}], "disc-count": 1, "track-list": [{"id": "c0e19d94-9417-4bc8-9df6-35548f6c9d67", "position": "1", "number": "1", "length": "222093", "recording": {"id": "87d37eb7-3820-4122-b394-7fa5d66ced40", "title": "Starter (sid. 6\u20137)", "length": "222093", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "222093"}, {"id": "d07d4d4e-99ba-4cb9-9c3e-e889cde48f2b", "position": "2", "number": "2", "length": "208160", "recording": {"id": "b5bdd39f-c495-4a27-9d5b-b6ad3fcef644", "title": "(A) Ask her out (sid. 8\u201310)", "length": "208160", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "208160"}, {"id": "5ed03c3c-b4da-4572-a207-fca51500dbb3", "position": "3", "number": "3", "length": "72760", "recording": {"id": "a62145f5-0f1e-470f-accd-bbe589ec7588", "title": "How\u2019s it going? (sid. 8\u20139*)", "length": "72760", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "72760"}, {"id": "b3123321-1f0a-4d15-8666-42cfe0535b76", "position": "4", "number": "4", "length": "132733", "recording": {"id": "b9e7574a-c9c4-470a-8cc8-84fbc4831824", "title": "Poems (sid. 11)", "length": "132733", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "132733"}, {"id": "483df8c0-36a6-4d25-949e-032659f141d5", "position": "5", "number": "5", "length": "203146", "recording": {"id": "cd0ed35a-09f4-4247-a808-c4e2a987c031", "title": "(B) We know where you live (sid. 12\u201313)", "length": "203146", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "203146"}, {"id": "c08901ec-7e2e-4e5d-8353-15e59445b5cb", "position": "6", "number": "6", "length": "52120", "recording": {"id": "ff263f06-0299-4403-a794-890a3487236c", "title": "The real end of the story (sid. 16*)", "length": "52120", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "52120"}, {"id": "905c43b3-5f51-472c-aca0-f41f52d8791b", "position": "7", "number": "7", "length": "275400", "recording": {"id": "f8d4a372-61bc-4373-a09b-3b2b21c2a019", "title": "Just 4 U \u2013 Friends and family Q&A (sid. 14\u201315)", "length": "275400", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "275400"}, {"id": "4dba3442-10fd-4caf-8fff-ac0f2dc36370", "position": "8", "number": "8", "length": "470080", "recording": {"id": "0651bd5b-10b4-4fbd-94a4-c512bcd13f7b", "title": "(C) Goodwill (sid. 16\u201318)", "length": "470080", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "470080"}, {"id": "80d4a5f7-dbc4-4233-94e3-bc8e29dce084", "position": "9", "number": "9", "length": "147786", "recording": {"id": "6e2fcb11-5ba6-4079-b7d5-47b516fd11c7", "title": "Bad company (sid. 21*)", "length": "147786", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "147786"}, {"id": "b0bfca4c-8131-49db-8ffa-233b69f5c8d7", "position": "10", "number": "10", "length": "176946", "recording": {"id": "fe0dc70f-cc55-4aa9-93bf-890f6f4d702e", "title": "You\u2019re my best friend (sid. 19)", "length": "176946", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "176946"}, {"id": "762a1357-2922-4d0c-9801-5f87610a5522", "position": "11", "number": "11", "length": "178066", "recording": {"id": "da0d9e2f-b0bf-4cc3-a2b8-5399a9671add", "title": "Starter (sid. 20\u201321)", "length": "178066", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "178066"}, {"id": "b8bd1f3e-328b-44c1-bd77-6829b417ebef", "position": "12", "number": "12", "length": "126800", "recording": {"id": "f53f57de-2ee7-4607-bd64-5fe893e68ac6", "title": "(A) Careers chat (sid. 22\u201323)", "length": "126800", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "126800"}, {"id": "cca65d36-01a0-4719-ab14-fa8fcb608757", "position": "13", "number": "13", "length": "221720", "recording": {"id": "a87ec803-0b0d-4882-a02d-1f64b38063e6", "title": "It\u2019s all in a day\u2019s work (sid. 27*)", "length": "221720", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "221720"}, {"id": "08520404-54c3-4be5-876f-d399ed35e805", "position": "14", "number": "14", "length": "273546", "recording": {"id": "0a2e02ea-83a5-4f9e-aaa1-1a19ce54e0c2", "title": "(B) Odd jobs (sid. 24\u201325)", "length": "273546", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "273546"}, {"id": "80750e50-5ded-4173-864b-28b49c578e9d", "position": "15", "number": "15", "length": "123613", "recording": {"id": "2971e9bf-fa48-43b8-b9d2-d7900902acb4", "title": "What\u2019s the word (sid. 31*)", "length": "123613", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "123613"}, {"id": "93e0c6d8-c636-4e2d-8da3-8bb168902f28", "position": "16", "number": "16", "length": "121040", "recording": {"id": "fac95aa3-38a5-4284-81ee-f06347748f41", "title": "Just 4 U \u2013 Ding, dong! (sid. 26\u201327)", "length": "121040", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "121040"}, {"id": "a8ba2c06-c7d5-429f-ba18-8b96cd8ac5f4", "position": "17", "number": "17", "length": "237880", "recording": {"id": "19fa6fe0-6978-48e1-b39d-1bb9f0dcc014", "title": "(C) Dream jobs! (sid. 28\u201329)", "length": "237880", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "237880"}, {"id": "13af804e-95db-4871-bf1a-55ac14752a4a", "position": "18", "number": "18", "length": "325493", "recording": {"id": "a51ffbf1-7f03-42ec-8d6e-29456d1d0fa5", "title": "She works hard for the money (sid. 30)", "length": "325493", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "325493"}, {"id": "7bd953fc-095b-4d05-ab3e-b8b1787b499f", "position": "19", "number": "19", "length": "499800", "recording": {"id": "f3875a1a-1e21-430c-a452-cc26f746978c", "title": "Hunger (sid. 32\u201334)", "length": "499800", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "499800"}, {"id": "7d568340-1f74-4c23-8d51-4d3368c5d648", "position": "20", "number": "20", "length": "291280", "recording": {"id": "fa454ac7-0d72-4126-a983-f4b0b640d266", "title": "The year I loved him best (sid. 35\u201336)", "length": "291280", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "291280"}], "track-count": 20}, {"position": "2", "format": "CD", "disc-list": [{"id": "Xu6RInhlajCJO7qolsctKG71COA-", "sectors": "348218", "offset-list": [150, 29067, 80275, 111658, 174193, 200755, 225255, 231017, 239872, 255428, 270009, 277621, 299934, 313634, 327379], "offset-count": 15}], "disc-count": 1, "track-list": [{"id": "9605b7f2-b028-478e-b191-80ef9401bff0", "position": "1", "number": "1", "length": "385560", "recording": {"id": "50971400-3ec2-435c-82df-385ab4ac7fa8", "title": "The curious incident of the dog in the night\u2010time (sid. 37\u201339)", "length": "385560", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "385560"}, {"id": "43d9df78-9df5-4fec-bcc6-972c9f67606a", "position": "2", "number": "2", "length": "682773", "recording": {"id": "d07e268b-5a96-4725-aba2-1bd224bf8f44", "title": "The lion, the witch and the wardrobe (sid. 40\u201344)", "length": "682773", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "682773"}, {"id": "06aa2707-3334-4929-a06d-f00461189b12", "position": "3", "number": "3", "length": "418440", "recording": {"id": "5da60f75-f746-49e7-ab68-35ab59ea8a86", "title": "Baby\u2019s Ears (sid. 45\u201347)", "length": "418440", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "418440"}, {"id": "4991d667-a4e5-4e8b-abd1-6d799414889b", "position": "4", "number": "4", "length": "833800", "recording": {"id": "d94619fb-2065-47e4-9913-d3f7449e9fab", "title": "Gift (sid. 48\u201352)", "length": "833800", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "833800"}, {"id": "d030294a-275b-41cd-a1bd-527d378c60d0", "position": "5", "number": "5", "length": "354160", "recording": {"id": "e86fcd38-1673-4f5c-ba62-e1ff02ba532e", "title": "Those three wishes (sid. 53\u201354)", "length": "354160", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "354160"}, {"id": "b18998a7-1ad3-4be7-9489-fe5336b1fb62", "position": "6", "number": "6", "length": "326666", "recording": {"id": "6aa9052b-03b4-450b-bba9-1ee399c0fb83", "title": "Muffin (sid. 55\u201356)", "length": "326666", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "326666"}, {"id": "6798bda9-3a46-4c13-8ec8-e4f5e13467fb", "position": "7", "number": "7", "length": "76826", "recording": {"id": "6c50c0e7-61da-4672-956b-0a1c21f3858b", "title": "Limericks (sid. 57)", "length": "76826", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "76826"}, {"id": "de6bc35b-0f3d-44c0-b958-bf340ebcb6c4", "position": "8", "number": "8", "length": "118066", "recording": {"id": "2a29cbba-6bba-47b7-8a71-bf114f6dcf36", "title": "Starter (sid. 58\u201359)", "length": "118066", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "118066"}, {"id": "57246785-09f6-46a8-94fd-4ea770baec4b", "position": "9", "number": "9", "length": "207413", "recording": {"id": "a43f2f58-f071-43c2-84e2-2ab2bbeddfbd", "title": "(A) Being a cheerleader (sid. 60\u201361)", "length": "207413", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "207413"}, {"id": "ae8ba5ed-0a6f-4f2b-83ee-744b1a83a129", "position": "10", "number": "10", "length": "194413", "recording": {"id": "6ecdebbd-3c09-4584-ae6a-5e62a3aecb47", "title": "Sailing (sid. 51\u201352*)", "length": "194413", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "194413"}, {"id": "66f0b403-ef39-48c6-9375-64e41c4dadab", "position": "11", "number": "11", "length": "101493", "recording": {"id": "1a8e08b6-aadf-4954-9508-8df084c53087", "title": "What does it spell? (sid. 52*)", "length": "101493", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "101493"}, {"id": "d0ca0cf4-8deb-4d99-9909-55248e90ded4", "position": "12", "number": "12", "length": "297506", "recording": {"id": "9355c174-963d-480f-9bb7-74938b7ed0ec", "title": "(B) Great sporting moments (sid. 62\u201363)", "length": "297506", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "297506"}, {"id": "a74ac19f-a60c-4645-b338-ab32e054b89f", "position": "13", "number": "13", "length": "182666", "recording": {"id": "d26a7233-db91-4a82-acf0-41b6afcdf74a", "title": "Piggy \u2013 a fantastic football player (sid. 60)", "length": "182666", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "182666"}, {"id": "4131c0b4-f5ec-4dee-a86f-cb8604e0c8ed", "position": "14", "number": "14", "length": "183266", "recording": {"id": "c3f95b84-158a-4bdc-b00b-f11a653508b9", "title": "Just 4 U \u2013 Oh my God, what have I just said? (sid. 64\u201365)", "length": "183266", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "183266"}, {"id": "fa4e673c-c477-487b-ae49-e929a582326b", "position": "15", "number": "15", "length": "277853", "recording": {"id": "2388591b-1863-4622-a725-fcb86355963f", "title": "(C) Boxing or ballet \u2013 that is the question \u2026 (sid. 66\u201368)", "length": "277853", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "277853"}], "track-count": 15}, {"position": "3", "format": "CD", "disc-list": [{"id": "yyx4iqzPFKm8c.PF.oKRA35PDn4-", "sectors": "314673", "offset-list": [150, 16358, 28403, 61012, 67673, 88607, 102686, 123662, 136446, 151774, 167010, 192416, 212271, 225927, 237067, 252103, 269094, 290167], "offset-count": 18}], "disc-count": 1, "track-list": [{"id": "7023192c-80fc-4440-a96e-df1a4d41320c", "position": "1", "number": "1", "length": "216106", "recording": {"id": "5633961f-d0ea-427f-98db-8ff8095363b3", "title": "Starter (sid. 70\u201371)", "length": "216106", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "216106"}, {"id": "7452ac91-ab13-499c-b4fe-f53f5ac0c8b7", "position": "2", "number": "2", "length": "160600", "recording": {"id": "d8a55eb1-b872-4df2-985a-8feb2ed4de1c", "title": "(A) Hair today, gone tomorrow (sid. 72\u201373)", "length": "160600", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "160600"}, {"id": "a217cd59-f7cf-4e57-8492-bfb32bcccdde", "position": "3", "number": "3", "length": "434786", "recording": {"id": "e43c6ee1-8f37-443c-9528-e52876313b59", "title": "(B) The children (sid. 74\u201376)", "length": "434786", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "434786"}, {"id": "3cdd3065-8933-457c-b512-0d6186a632c4", "position": "4", "number": "4", "length": "88813", "recording": {"id": "e25cfe4b-8f49-4783-961d-c64e17519238", "title": "What a ride! (sid. 77*)", "length": "88813", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "88813"}, {"id": "2838f707-d198-4758-ab7d-cf32f43cbf9a", "position": "5", "number": "5", "length": "279120", "recording": {"id": "1618acd4-1277-4ccb-b5bb-3f32335c79a2", "title": "Tears in heaven (sid. 77)", "length": "279120", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "279120"}, {"id": "e345e4d3-c307-4024-852b-2f67202f83e0", "position": "6", "number": "6", "length": "187720", "recording": {"id": "4b298240-db6b-44fa-8d8d-3efa06de2b98", "title": "Just 4 U \u2013 Crack a joke! (sid. 78\u201379)", "length": "187720", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "187720"}, {"id": "13cf5033-a253-4694-af52-f4c5c6f10c93", "position": "7", "number": "7", "length": "279680", "recording": {"id": "8cd27395-b0ea-4166-a9cd-621f6c06fe09", "title": "(C) 9/11 \u2013 an eyewitness account (sid. 80\u201381)", "length": "279680", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "279680"}, {"id": "a9e4e8a8-47dd-4562-a876-930e56e3071b", "position": "8", "number": "8", "length": "170453", "recording": {"id": "d7a6a14f-d304-4adf-8a5f-8484360cab90", "title": "Story of survival (sid. 84*)", "length": "170453", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "170453"}, {"id": "bb0cd667-7cff-4980-b4f9-3be957cb90be", "position": "9", "number": "9", "length": "204373", "recording": {"id": "f3f611fa-19cc-4fea-bbd5-6ffc70d0bd0f", "title": "Starter (sid. 82\u201383)", "length": "204373", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "204373"}, {"id": "e3aaeff5-94e4-4f99-815d-8331d9b599cd", "position": "10", "number": "10", "length": "203146", "recording": {"id": "019fee5f-66cc-473d-b8d0-195ce83f562e", "title": "(A) The nutty professor (sid. 84\u201385)", "length": "203146", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "203146"}, {"id": "013be0ad-3e2c-48f4-a7f2-60cec3b15bf5", "position": "11", "number": "11", "length": "338746", "recording": {"id": "1a0caaed-5e11-4d4c-b012-7e68029c1f2e", "title": "(B) Smartest in the world (sid. 86\u201389)", "length": "338746", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "338746"}, {"id": "91bb9d02-8052-40c8-bb09-faef815ffb52", "position": "12", "number": "12", "length": "264733", "recording": {"id": "e15493db-74d6-4a56-85e1-8bca2efdf783", "title": "The smile (sid. 97*)", "length": "264733", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "264733"}, {"id": "ae3efcbf-eccb-4dd0-8920-85c16dc6fceb", "position": "13", "number": "13", "length": "182080", "recording": {"id": "299d4582-17da-4e4e-8789-849aea1eac0e", "title": "(C) Two smart ideas (sid. 92)", "length": "182080", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "182080"}, {"id": "355915ae-b526-4bda-8fbd-f150349e6154", "position": "14", "number": "14", "length": "148533", "recording": {"id": "5797b7b6-4363-4fde-a972-3da77384b906", "title": "(C) Two smart ideas (sid. 93)", "length": "148533", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "148533"}, {"id": "043b26c0-25e1-4637-9767-c6da76d2b7d5", "position": "15", "number": "15", "length": "200480", "recording": {"id": "168df9ce-93e2-4995-a52c-14197cd245d6", "title": "Famous whiz kids (sid. 103*)", "length": "200480", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "200480"}, {"id": "891b75fd-bc0f-4c10-9ac1-71db40b267db", "position": "16", "number": "16", "length": "226546", "recording": {"id": "2556516a-c958-4322-999d-19d5b74d14ee", "title": "Australia (sid. 106\u2013107)", "length": "226546", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "226546"}, {"id": "95d1f2c5-77dd-4d6f-970c-93b89b04c5d9", "position": "17", "number": "17", "length": "280973", "recording": {"id": "8823e60d-f05d-4b40-8b17-eb72b8b255c3", "title": "New Zealand (sid. 108\u2013109)", "length": "280973", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "280973"}, {"id": "be92f5e1-c41b-49f5-8a9b-0ea3ae98afca", "position": "18", "number": "18", "length": "326746", "recording": {"id": "7bfd12fe-034a-4c9d-a5dd-5f6f38ce25c0", "title": "Canada (sid. 110\u2013111)", "length": "326746", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "326746"}], "track-count": 18}, {"position": "4", "format": "CD", "disc-list": [{"id": "xu338_M8WukSRi0J.KTlDoflB8Y-", "sectors": "147674", "offset-list": [150, 6650, 17135, 29982, 37318, 44334, 53648, 60998, 69393, 77732, 96632, 106946, 121362, 137085], "offset-count": 14}], "disc-count": 1, "track-list": [{"id": "f9f6ae81-7d3b-475f-bb66-1dbd09705ca2", "position": "1", "number": "1", "length": "86666", "recording": {"id": "2ed20192-08ae-4852-a05a-b59b9c27f8c0", "title": "Best friends (sid. 96)", "length": "86666", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "86666"}, {"id": "e41896d4-5ab9-41b4-861a-8021370885ce", "position": "2", "number": "2", "length": "139800", "recording": {"id": "314126fa-75a4-4e1c-9bae-4b00253a47e3", "title": "Best friends (sid. 97)", "length": "139800", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "139800"}, {"id": "a58c92f9-84ef-492e-be75-a2482ff5b0cd", "position": "3", "number": "3", "length": "171293", "recording": {"id": "81a572b6-fc21-4f47-b63c-ff42c5b2aa50", "title": "Working life (sid. 98\u201399)", "length": "171293", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "171293"}, {"id": "7701ef4a-2682-4183-990f-2724a7445bb6", "position": "4", "number": "4", "length": "97813", "recording": {"id": "03497930-6681-47a2-b8ba-98b04a51682f", "title": "Pioneers in sport (sid. 100)", "length": "97813", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "97813"}, {"id": "f5c49a53-71d3-487c-96dc-108fcd3a5243", "position": "5", "number": "5", "length": "93546", "recording": {"id": "a0bb30e0-87a8-4598-82ee-ef47ce46b9c5", "title": "Pioneers in sport (sid. 101)", "length": "93546", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "93546"}, {"id": "def7ea86-07d2-41c0-9ae8-562377484188", "position": "6", "number": "6", "length": "124186", "recording": {"id": "54ef6217-6954-4b42-9c1b-8b30d11f4204", "title": "Weird, but true! (sid. 102)", "length": "124186", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "124186"}, {"id": "a7c5c2f8-a9fc-4ebd-8fd4-dc6d200ff794", "position": "7", "number": "7", "length": "98000", "recording": {"id": "e9d8e7bc-8d8e-4d0f-87b0-429066b3bb1a", "title": "Weird, but true! (sid. 103)", "length": "98000", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "98000"}, {"id": "2c9b71c1-7987-4e01-9d3d-d9eae9ea7d04", "position": "8", "number": "8", "length": "111933", "recording": {"id": "c330f9eb-f63d-4f1d-b858-73c3912f5100", "title": "Useful inventions (sid. 104)", "length": "111933", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "111933"}, {"id": "09f7c0fe-165f-4e3d-8eab-0379e3330191", "position": "9", "number": "9", "length": "111186", "recording": {"id": "2fd621a4-575f-4ad3-8beb-4f435f81714e", "title": "Useful inventions (sid. 105)", "length": "111186", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "111186"}, {"id": "80fc7cd1-576d-4e97-b20d-7af146209771", "position": "10", "number": "10", "length": "252000", "recording": {"id": "85300031-cf37-4fee-aac5-2dd4f3302d5d", "title": "Friends or not friends", "length": "252000", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "252000"}, {"id": "47dc69cf-dfe4-4084-a22e-62bfd0cbfc11", "position": "11", "number": "11", "length": "137520", "recording": {"id": "56510ac8-444c-48f4-8b35-86ba3d79a93f", "title": "People at work", "length": "137520", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "137520"}, {"id": "e30daeed-c043-4140-bdf1-182baf9eab16", "position": "12", "number": "12", "length": "192213", "recording": {"id": "51bd9b54-4145-4ab0-8334-ba7bf40160b0", "title": "Sports", "length": "192213", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "192213"}, {"id": "c7e2f93a-7f68-4a1f-9458-a4399803a1b6", "position": "13", "number": "13", "length": "209640", "recording": {"id": "ebc81f6c-9c8e-498a-b622-dc27f450a89a", "title": "Stories to tell", "length": "209640", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "209640"}, {"id": "9871987a-ab2c-4a2f-b4e0-61dafb058540", "position": "14", "number": "14", "length": "141186", "recording": {"id": "e36f3f9d-6bf6-44db-938b-64372b772da5", "title": "Inventions", "length": "141186", "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}, "artist-credit": [{"artist": {"id": "0508d601-375d-419e-b581-8d5f0b43e573", "name": "J\u00f6rgen Gustafsson", "sort-name": "Gustafsson, J\u00f6rgen"}}, ", ", {"artist": {"id": "56309f78-8e31-4362-b875-5bdd4ac2b81f", "name": "Eva \u00d6sterberg", "sort-name": "\u00d6sterberg, Eva", "disambiguation": "language material(?)"}}, " & ", {"artist": {"id": "591599ca-8598-4407-8aa8-bbe7aedd9d24", "name": "Andy Cowle", "sort-name": "Cowle, Andy"}}], "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle", "track_or_recording_length": "141186"}], "track-count": 14}], "medium-count": 4, "artist-credit-phrase": "J\u00f6rgen Gustafsson, Eva \u00d6sterberg & Andy Cowle"}} \ No newline at end of file From 885ad172a859e7b257c6c1581c7621f188f6951b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Thu, 2 May 2019 18:37:51 +0200 Subject: [PATCH 45/79] Set release type to empty string if none is given MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/whipper-team/whipper/issues/396 Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 661c735c..7ded6aa1 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -182,7 +182,10 @@ def _getMetadata(release, discid, country=None): discMD = DiscMetadata() - discMD.releaseType = release['release-group']['type'] + if 'type' in release['release-group']: + discMD.releaseType = release['release-group']['type'] + else: + discMD.releaseType = u'' discCredit = _Credit(release['artist-credit']) # FIXME: is there a better way to check for VA ? From c2459067cea830de07cbb1e7e755b739dc411482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Fri, 3 May 2019 02:32:07 +0200 Subject: [PATCH 46/79] Test mblookup output when release type is missing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frederik “Freso” S. Olesen --- whipper/test/test_command_mblookup.py | 30 + ...discid.xu338_M8WukSRi0J.KTlDoflB8Y-.pickle | 538 ++++++++++++++++++ 2 files changed, 568 insertions(+) create mode 100644 whipper/test/test_command_mblookup.py create mode 100644 whipper/test/whipper.discid.xu338_M8WukSRi0J.KTlDoflB8Y-.pickle diff --git a/whipper/test/test_command_mblookup.py b/whipper/test/test_command_mblookup.py new file mode 100644 index 00000000..c358ca83 --- /dev/null +++ b/whipper/test/test_command_mblookup.py @@ -0,0 +1,30 @@ +# vi:si:et:sw=4:sts=4:ts=4:set fileencoding=utf-8 +u"""Tests for whipper.command.mblookup""" + +import os +import pickle +import unittest + +from whipper.command import mblookup + + +class MBLookupTestCase(unittest.TestCase): + u"""Test cases for whipper.command.mblookup.MBLookup""" + + @staticmethod + def _mock_musicbrainz(discid, country=None, record=False): + u"""Mock function for whipper.common.mbngs.musicbrainz function.""" + filename = u"whipper.discid.{}.pickle".format(discid) + path = os.path.join(os.path.dirname(__file__), filename) + with open(path) as p: + return pickle.load(p) + + def testMissingReleaseType(self): + u"""Test that lookup for release without a type set doesn't fail.""" + # Using: Gustafsson, Österberg & Cowle - What's Up? 8 (disc 4) + # https://musicbrainz.org/release/d8e6153a-2c47-4804-9d73-0aac1081c3b1 + mblookup.musicbrainz = self._mock_musicbrainz + discid = u"xu338_M8WukSRi0J.KTlDoflB8Y-" + # https://musicbrainz.org/cdtoc/xu338_M8WukSRi0J.KTlDoflB8Y- + lookup = mblookup.MBLookup([discid], u'whipper mblookup', None) + lookup.do() diff --git a/whipper/test/whipper.discid.xu338_M8WukSRi0J.KTlDoflB8Y-.pickle b/whipper/test/whipper.discid.xu338_M8WukSRi0J.KTlDoflB8Y-.pickle new file mode 100644 index 00000000..acf79b77 --- /dev/null +++ b/whipper/test/whipper.discid.xu338_M8WukSRi0J.KTlDoflB8Y-.pickle @@ -0,0 +1,538 @@ +(lp0 +ccopy_reg +_reconstructor +p1 +(cwhipper.common.mbngs +DiscMetadata +p2 +c__builtin__ +object +p3 +Ntp4 +Rp5 +(dp6 +S'sortName' +p7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p8 +sS'artist' +p9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p10 +sS'url' +p11 +S'https://musicbrainz.org/release/d8e6153a-2c47-4804-9d73-0aac1081c3b1' +p12 +sS'barcode' +p13 +S'9789162267957' +p14 +sS'tracks' +p15 +(lp16 +g1 +(cwhipper.common.mbngs +TrackMetadata +p17 +g3 +Ntp18 +Rp19 +(dp20 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p21 +sS'mbidRecording' +p22 +S'2ed20192-08ae-4852-a05a-b59b9c27f8c0' +p23 +sS'title' +p24 +S'Best friends (sid. 96)' +p25 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p26 +sS'mbidWorks' +p27 +(lp28 +sS'mbid' +p29 +S'f9f6ae81-7d3b-475f-bb66-1dbd09705ca2' +p30 +sS'duration' +p31 +I86666 +sS'mbidArtist' +p32 +(lp33 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p34 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p35 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p36 +asbag1 +(g17 +g3 +Ntp37 +Rp38 +(dp39 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p40 +sg22 +S'314126fa-75a4-4e1c-9bae-4b00253a47e3' +p41 +sg24 +S'Best friends (sid. 97)' +p42 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p43 +sg27 +(lp44 +sg29 +S'e41896d4-5ab9-41b4-861a-8021370885ce' +p45 +sg31 +I139800 +sg32 +(lp46 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p47 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p48 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p49 +asbag1 +(g17 +g3 +Ntp50 +Rp51 +(dp52 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p53 +sg22 +S'81a572b6-fc21-4f47-b63c-ff42c5b2aa50' +p54 +sg24 +VWorking life (sid. 98\u201399) +p55 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p56 +sg27 +(lp57 +sg29 +S'a58c92f9-84ef-492e-be75-a2482ff5b0cd' +p58 +sg31 +I171293 +sg32 +(lp59 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p60 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p61 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p62 +asbag1 +(g17 +g3 +Ntp63 +Rp64 +(dp65 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p66 +sg22 +S'03497930-6681-47a2-b8ba-98b04a51682f' +p67 +sg24 +S'Pioneers in sport (sid. 100)' +p68 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p69 +sg27 +(lp70 +sg29 +S'7701ef4a-2682-4183-990f-2724a7445bb6' +p71 +sg31 +I97813 +sg32 +(lp72 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p73 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p74 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p75 +asbag1 +(g17 +g3 +Ntp76 +Rp77 +(dp78 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p79 +sg22 +S'a0bb30e0-87a8-4598-82ee-ef47ce46b9c5' +p80 +sg24 +S'Pioneers in sport (sid. 101)' +p81 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p82 +sg27 +(lp83 +sg29 +S'f5c49a53-71d3-487c-96dc-108fcd3a5243' +p84 +sg31 +I93546 +sg32 +(lp85 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p86 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p87 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p88 +asbag1 +(g17 +g3 +Ntp89 +Rp90 +(dp91 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p92 +sg22 +S'54ef6217-6954-4b42-9c1b-8b30d11f4204' +p93 +sg24 +S'Weird, but true! (sid. 102)' +p94 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p95 +sg27 +(lp96 +sg29 +S'def7ea86-07d2-41c0-9ae8-562377484188' +p97 +sg31 +I124186 +sg32 +(lp98 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p99 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p100 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p101 +asbag1 +(g17 +g3 +Ntp102 +Rp103 +(dp104 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p105 +sg22 +S'e9d8e7bc-8d8e-4d0f-87b0-429066b3bb1a' +p106 +sg24 +S'Weird, but true! (sid. 103)' +p107 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p108 +sg27 +(lp109 +sg29 +S'a7c5c2f8-a9fc-4ebd-8fd4-dc6d200ff794' +p110 +sg31 +I98000 +sg32 +(lp111 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p112 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p113 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p114 +asbag1 +(g17 +g3 +Ntp115 +Rp116 +(dp117 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p118 +sg22 +S'c330f9eb-f63d-4f1d-b858-73c3912f5100' +p119 +sg24 +S'Useful inventions (sid. 104)' +p120 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p121 +sg27 +(lp122 +sg29 +S'2c9b71c1-7987-4e01-9d3d-d9eae9ea7d04' +p123 +sg31 +I111933 +sg32 +(lp124 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p125 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p126 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p127 +asbag1 +(g17 +g3 +Ntp128 +Rp129 +(dp130 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p131 +sg22 +S'2fd621a4-575f-4ad3-8beb-4f435f81714e' +p132 +sg24 +S'Useful inventions (sid. 105)' +p133 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p134 +sg27 +(lp135 +sg29 +S'09f7c0fe-165f-4e3d-8eab-0379e3330191' +p136 +sg31 +I111186 +sg32 +(lp137 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p138 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p139 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p140 +asbag1 +(g17 +g3 +Ntp141 +Rp142 +(dp143 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p144 +sg22 +S'85300031-cf37-4fee-aac5-2dd4f3302d5d' +p145 +sg24 +S'Friends or not friends' +p146 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p147 +sg27 +(lp148 +sg29 +S'80fc7cd1-576d-4e97-b20d-7af146209771' +p149 +sg31 +I252000 +sg32 +(lp150 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p151 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p152 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p153 +asbag1 +(g17 +g3 +Ntp154 +Rp155 +(dp156 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p157 +sg22 +S'56510ac8-444c-48f4-8b35-86ba3d79a93f' +p158 +sg24 +S'People at work' +p159 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p160 +sg27 +(lp161 +sg29 +S'47dc69cf-dfe4-4084-a22e-62bfd0cbfc11' +p162 +sg31 +I137520 +sg32 +(lp163 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p164 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p165 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p166 +asbag1 +(g17 +g3 +Ntp167 +Rp168 +(dp169 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p170 +sg22 +S'51bd9b54-4145-4ab0-8334-ba7bf40160b0' +p171 +sg24 +S'Sports' +p172 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p173 +sg27 +(lp174 +sg29 +S'e30daeed-c043-4140-bdf1-182baf9eab16' +p175 +sg31 +I192213 +sg32 +(lp176 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p177 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p178 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p179 +asbag1 +(g17 +g3 +Ntp180 +Rp181 +(dp182 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p183 +sg22 +S'ebc81f6c-9c8e-498a-b622-dc27f450a89a' +p184 +sg24 +S'Stories to tell' +p185 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p186 +sg27 +(lp187 +sg29 +S'c7e2f93a-7f68-4a1f-9458-a4399803a1b6' +p188 +sg31 +I209640 +sg32 +(lp189 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p190 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p191 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p192 +asbag1 +(g17 +g3 +Ntp193 +Rp194 +(dp195 +g7 +VGustafsson, Jrgen, sterberg, Eva & Cowle, Andy +p196 +sg22 +S'e36f3f9d-6bf6-44db-938b-64372b772da5' +p197 +sg24 +S'Inventions' +p198 +sg9 +VJrgen Gustafsson, Eva sterberg & Andy Cowle +p199 +sg27 +(lp200 +sg29 +S'9871987a-ab2c-4a2f-b4e0-61dafb058540' +p201 +sg31 +I141186 +sg32 +(lp202 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p203 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p204 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p205 +asbasg31 +I1966982 +sg29 +S'd8e6153a-2c47-4804-9d73-0aac1081c3b1' +p206 +sS'various' +p207 +I00 +sS'catalogNumber' +p208 +S'6795-7' +p209 +sS'release' +p210 +S'2008' +p211 +sg24 +VWhat\u2019s Up? 8 (Disc 4 of 4) +p212 +sg32 +(lp213 +S'0508d601-375d-419e-b581-8d5f0b43e573' +p214 +aS'56309f78-8e31-4362-b875-5bdd4ac2b81f' +p215 +aS'591599ca-8598-4407-8aa8-bbe7aedd9d24' +p216 +asS'mbidReleaseGroup' +p217 +S'6aa93fc6-6389-414d-a3ed-7ece36bc4931' +p218 +sS'releaseTitle' +p219 +VWhat\u2019s Up? 8 +p220 +sba. \ No newline at end of file From f74455c9f011b2acb345bf38d7d9640205d906d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Fri, 3 May 2019 02:43:31 +0200 Subject: [PATCH 47/79] mblookup: Cast None to unicode before encoding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frederik “Freso” S. Olesen --- whipper/command/mblookup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/command/mblookup.py b/whipper/command/mblookup.py index c72e9385..dc4fcb42 100644 --- a/whipper/command/mblookup.py +++ b/whipper/command/mblookup.py @@ -29,7 +29,7 @@ def do(self): print('- Release %d:' % (i + 1, )) print(' Artist: %s' % md.artist.encode('utf-8')) print(' Title: %s' % md.title.encode('utf-8')) - print(' Type: %s' % md.releaseType.encode('utf-8')) # noqa: E501 + print(' Type: %s' % unicode(md.releaseType).encode('utf-8')) # noqa: E501 print(' URL: %s' % md.url) print(' Tracks: %d' % len(md.tracks)) if md.catalogNumber: From bf8daf186db7dd75b6bb7052dc0f48534d70ef86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Fri, 3 May 2019 02:44:29 +0200 Subject: [PATCH 48/79] mbngs: Let releaseType be None if no type is set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Frederik “Freso” S. Olesen --- whipper/common/mbngs.py | 2 -- whipper/test/test_common_mbngs.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 7ded6aa1..07223ee5 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -184,8 +184,6 @@ def _getMetadata(release, discid, country=None): if 'type' in release['release-group']: discMD.releaseType = release['release-group']['type'] - else: - discMD.releaseType = u'' discCredit = _Credit(release['artist-credit']) # FIXME: is there a better way to check for VA ? diff --git a/whipper/test/test_common_mbngs.py b/whipper/test/test_common_mbngs.py index 5d2693c0..6cc89d8d 100644 --- a/whipper/test/test_common_mbngs.py +++ b/whipper/test/test_common_mbngs.py @@ -219,7 +219,7 @@ def testMissingReleaseGroupType(self): discid = "xu338_M8WukSRi0J.KTlDoflB8Y-" # disc 4 metadata = mbngs._getMetadata(response['release'], discid) - self.assertEqual(metadata.releaseType, u'') + self.assertEqual(metadata.releaseType, None) def testAllAvailableMetadata(self): """Check that all possible metadata gets assigned.""" From 7a92650eff6dec6f5fd56a9577368b45fafdddfc Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Fri, 3 May 2019 10:46:24 +0200 Subject: [PATCH 49/79] Update Docker Hub's repository URL See #395. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 70da85a2..1df703c3 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,11 @@ Whipper still isn't available as an official package in every Linux distribution You can easily install whipper without needing to care about the required dependencies by making use of the automatically built images hosted on Docker Hub: -`docker pull joelametta/whipper` +`docker pull whipperteam/whipper` Alternatively, in case you prefer building Docker images locally, just issue the following command (it relies on the [Dockerfile](https://github.com/whipper-team/whipper/blob/master/Dockerfile) included in whipper's repository): -`docker build -t whipper/whipper` +`docker build -t whipperteam/whipper` It's recommended to create an alias for a convenient usage: @@ -86,7 +86,7 @@ It's recommended to create an alias for a convenient usage: alias whipper="docker run -ti --rm --device=/dev/cdrom \ -v ~/.config/whipper:/home/worker/.config/whipper \ -v ${PWD}/output:/output \ - whipper/whipper" + whipperteam/whipper" ``` You should put this e.g. into your `.bash_aliases`. Also keep in mind to substitute the path definitions to something that fits to your needs (e.g. replace `… -v ${PWD}/output:/output …` with `… -v ${HOME}/ripped:/output \ …`). From bb6a29c5dfc0c945dcf39d6557bef3c37e797374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederik=20=E2=80=9CFreso=E2=80=9D=20S=2E=20Olesen?= Date: Fri, 3 May 2019 11:35:05 +0200 Subject: [PATCH 50/79] Update Travis config for Python specific handling See the Python documentation for more information: https://docs.travis-ci.com/user/languages/python/ Signed-off-by: JoeLametta --- .travis.yml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 33d3a3c0..07289baf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,13 @@ +dist: xenial sudo: required -language: bash +language: python +python: + - "2.7" +virtualenv: + system_site_packages: false + +cache: pip env: - FLAKE8=false @@ -9,13 +16,12 @@ env: install: # Dependencies - sudo apt-get -qq update - - sudo pip install --upgrade -qq pip - - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libiso9660-dev libsndfile1-dev python-gi python-musicbrainzngs python-mutagen python-setuptools sox swig libcdio-utils - - sudo pip install pycdio==0.21 requests setuptools_scm + - pip install --upgrade -qq pip + - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libgirepository1.0-dev libiso9660-dev libsndfile1-dev sox swig libcdio-utils + - pip install musicbrainzngs mutagen pycdio==0.21 PyGObject requests setuptools setuptools_scm # Testing dependencies - - sudo apt-get -qq install python-twisted-core - - sudo pip install flake8 + - pip install twisted flake8 # Build bundled C utils - cd src @@ -23,7 +29,7 @@ install: - cd .. # Installing - - sudo python setup.py install + - python setup.py install script: - if [ ! "$FLAKE8" = true ]; then python -m unittest discover; fi From eff5fee3f42941b49c3fde0e6051b49fbeb8ce1b Mon Sep 17 00:00:00 2001 From: gorgobacka Date: Wed, 27 Mar 2019 22:34:48 +0100 Subject: [PATCH 51/79] use self.eject Signed-off-by: gorgobacka --- whipper/command/cd.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index f32c115e..d8dad420 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -186,7 +186,8 @@ def do(self): self.doCommand() - if self.options.eject in ('success', 'always'): + if (self.options.eject == 'success' and self.eject or + self.options.eject == 'always'): utils.eject_device(self.device) return None From 8db090c9bfec6626a19a2942e2a730a96c06e83d Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Fri, 3 May 2019 19:19:06 +0200 Subject: [PATCH 52/79] Add Freso to whipper's credits Signed-off-by: JoeLametta --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1df703c3..b5376264 100644 --- a/README.md +++ b/README.md @@ -412,8 +412,9 @@ Thanks to: - [Thomas Vander Stichele](https://github.com/thomasvs) - [Joe Lametta](https://github.com/JoeLametta) -- [Merlijn Wajer](https://github.com/MerlijnWajer) - [Samantha Baldwin](https://github.com/RecursiveForest) +- [Frederik “Freso” S. Olesen](https://github.com/Freso) +- [Merlijn Wajer](https://github.com/MerlijnWajer) And to all the [contributors](https://github.com/whipper-team/whipper/graphs/contributors). From 69f8f39c496066aa50aa67803550ae7167fda536 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Fri, 22 Mar 2019 12:43:27 +0000 Subject: [PATCH 53/79] Change documentation from epydoc to reStructuredText Thanks to Freso for all the useful comments! Signed-off-by: JoeLametta --- whipper/common/cache.py | 4 +- whipper/common/common.py | 36 ++++++------- whipper/common/mbngs.py | 24 ++++----- whipper/common/path.py | 8 +-- whipper/common/program.py | 35 ++++++------- whipper/common/renamer.py | 14 ++--- whipper/extern/task/task.py | 24 ++++----- whipper/image/cue.py | 12 ++--- whipper/image/image.py | 10 ++-- whipper/image/table.py | 99 ++++++++++++++++++----------------- whipper/image/toc.py | 20 +++---- whipper/program/cdparanoia.py | 87 +++++++++++++++--------------- whipper/program/cdrdao.py | 12 ++--- whipper/program/soxi.py | 4 +- whipper/result/result.py | 40 +++++++------- 15 files changed, 213 insertions(+), 216 deletions(-) diff --git a/whipper/common/cache.py b/whipper/common/cache.py index cf311a69..19ed0325 100644 --- a/whipper/common/cache.py +++ b/whipper/common/cache.py @@ -39,7 +39,7 @@ class Persister: Call persist to store the object to disk; it will get stored if it changed from the on-disk object. - @ivar object: the persistent object + :ivar object: the persistent object """ def __init__(self, path=None, default=None): @@ -162,7 +162,7 @@ def getRipResult(self, cddbdiscid, create=True): Retrieve the persistable RipResult either from our cache (from a previous, possibly aborted rip), or return a new one. - @rtype: L{Persistable} for L{result.RipResult} + :rtype: :any:`Persistable` for :any:`result.RipResult` """ presult = self._pcache.get(cddbdiscid) diff --git a/whipper/common/common.py b/whipper/common/common.py index b81395bf..b12b1686 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -56,11 +56,11 @@ def msfToFrames(msf): """ Converts a string value in MM:SS:FF to frames. - @param msf: the MM:SS:FF value to convert - @type msf: str + :param msf: the MM:SS:FF value to convert + :type msf: str - @rtype: int - @returns: number of frames + :rtype: int + :returns: number of frames """ if ':' not in msf: return int(msf) @@ -104,14 +104,14 @@ def formatTime(seconds, fractional=3): If it is greater than 0, we will show seconds and fractions of seconds. As a side consequence, there is no way to show seconds without fractions. - @param seconds: the time in seconds to format. - @type seconds: int or float - @param fractional: how many digits to show for the fractional part of + :param seconds: the time in seconds to format. + :type seconds: int or float + :param fractional: how many digits to show for the fractional part of seconds. - @type fractional: int + :type fractional: int - @rtype: string - @returns: a nicely formatted time string. + :rtype: string + :returns: a nicely formatted time string. """ chunks = [] @@ -207,11 +207,11 @@ def getRealPath(refPath, filePath): Does Windows path translation. Will look for the given file name, but with .flac and .wav as extensions. - @param refPath: path to the file from which the track is referenced; + :param refPath: path to the file from which the track is referenced; for example, path to the .cue file in the same directory - @type refPath: unicode + :type refPath: unicode - @type filePath: unicode + :type filePath: unicode """ assert isinstance(filePath, unicode), "%r is not unicode" % filePath @@ -300,11 +300,11 @@ class VersionGetter(object): def __init__(self, dependency, args, regexp, expander): """ - @param dependency: name of the dependency providing the program - @param args: the arguments to invoke to show the version - @type args: list of str - @param regexp: the regular expression to get the version - @param expander: the expansion string for the version using the + :param dependency: name of the dependency providing the program + :param args: the arguments to invoke to show the version + :type args: list of str + :param regexp: the regular expression to get the version + :param expander: the expansion string for the version using the regexp group dict """ diff --git a/whipper/common/mbngs.py b/whipper/common/mbngs.py index 661c735c..4bd23d11 100644 --- a/whipper/common/mbngs.py +++ b/whipper/common/mbngs.py @@ -58,13 +58,13 @@ class TrackMetadata(object): class DiscMetadata(object): """ - @param artist: artist(s) name - @param sortName: release artist sort name - @param release: earliest release date, in YYYY-MM-DD - @type release: unicode - @param title: title of the disc (with disambiguation) - @param releaseTitle: title of the release (without disambiguation) - @type tracks: C{list} of L{TrackMetadata} + :param artist: artist(s) name + :param sortName: release artist sort name + :param release: earliest release date, in YYYY-MM-DD + :type release: unicode + :param title: title of the disc (with disambiguation) + :param releaseTitle: title of the release (without disambiguation) + :type tracks: list of :any:`TrackMetadata` """ artist = None sortName = None @@ -163,11 +163,11 @@ def _getWorks(recording): def _getMetadata(release, discid, country=None): """ - @type release: C{dict} - @param release: a release dict as returned in the value for key release + :type release: dict + :param release: a release dict as returned in the value for key release from get_release_by_id - @rtype: L{DiscMetadata} or None + :rtype: DiscMetadata or None """ logger.debug('getMetadata for release id %r', release['id']) if not release['id']: @@ -281,9 +281,9 @@ def musicbrainz(discid, country=None, record=False): Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4- - @type discid: str + :type discid: str - @rtype: list of L{DiscMetadata} + :rtype: list of :any:`DiscMetadata` """ logger.debug('looking up results for discid %r', discid) import musicbrainzngs diff --git a/whipper/common/path.py b/whipper/common/path.py index 268b3379..8d628fbe 100644 --- a/whipper/common/path.py +++ b/whipper/common/path.py @@ -28,10 +28,10 @@ class PathFilter(object): def __init__(self, slashes=True, quotes=True, fat=True, special=False): """ - @param slashes: whether to convert slashes to dashes - @param quotes: whether to normalize quotes - @param fat: whether to strip characters illegal on FAT filesystems - @param special: whether to strip special characters + :param slashes: whether to convert slashes to dashes + :param quotes: whether to normalize quotes + :param fat: whether to strip characters illegal on FAT filesystems + :param special: whether to strip special characters """ self._slashes = slashes self._quotes = quotes diff --git a/whipper/common/program.py b/whipper/common/program.py index 35509a69..e618a051 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -44,12 +44,11 @@ class Program: """ I maintain program state and functionality. - @ivar metadata: - @type metadata: L{mbngs.DiscMetadata} - @ivar result: the rip's result - @type result: L{result.RipResult} - @type outdir: unicode - @type config: L{whipper.common.config.Config} + :vartype metadata: mbngs.DiscMetadata + :cvar result: the rip's result + :vartype result: result.RipResult + :vartype outdir: unicode + :vartype config: whipper.common.config.Config """ cuePath = None @@ -60,7 +59,7 @@ class Program: def __init__(self, config, record=False): """ - @param record: whether to record results of API calls for playback. + :param record: whether to record results of API calls for playback. """ self._record = record self._cache = cache.ResultCache() @@ -109,7 +108,7 @@ def getTable(self, runner, cddbdiscid, mbdiscid, device, offset, """ Retrieve the Table either from the cache or the drive. - @rtype: L{table.Table} + :rtype: table.Table """ tcache = cache.TableCache() ptable = tcache.get(cddbdiscid, mbdiscid) @@ -153,7 +152,7 @@ def getRipResult(self, cddbdiscid): Retrieve the persistable RipResult either from our cache (from a previous, possibly aborted rip), or return a new one. - @rtype: L{result.RipResult} + :rtype: result.RipResult """ assert self.result is None @@ -247,9 +246,9 @@ def getPath(self, outdir, template, mbdiscid, metadata, track_number=None): @staticmethod def getCDDB(cddbdiscid): """ - @param cddbdiscid: list of id, tracks, offsets, seconds + :param cddbdiscid: list of id, tracks, offsets, seconds - @rtype: str + :rtype: str """ # FIXME: convert to nonblocking? try: @@ -272,7 +271,7 @@ def getCDDB(cddbdiscid): def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, prompt=False): """ - @type ittoc: L{whipper.image.table.Table} + :type ittoc: whipper.image.table.Table """ # look up disc on MusicBrainz print('Disc duration: %s, %d audio tracks' % ( @@ -392,10 +391,10 @@ def getTagList(self, number, mbdiscid): """ Based on the metadata, get a dict of tags for the given track. - @param number: track number (0 for HTOA) - @type number: int + :param number: track number (0 for HTOA) + :type number: int - @rtype: dict + :rtype: dict """ trackArtist = u'Unknown Artist' releaseArtist = u'Unknown Artist' @@ -461,7 +460,7 @@ def getHTOA(self): """ Check if we have hidden track one audio. - @returns: tuple of (start, stop), or None + :returns: tuple of (start, stop), or None """ track = self.result.table.tracks[0] try: @@ -498,8 +497,8 @@ def ripTrack(self, runner, trackResult, offset, device, taglist, Ripping the track may change the track's filename as stored in trackResult. - @param trackResult: the object to store information in. - @type trackResult: L{result.TrackResult} + :param trackResult: the object to store information in. + :type trackResult: result.TrackResult """ if trackResult.number == 0: start, stop = self.getHTOA() diff --git a/whipper/common/renamer.py b/whipper/common/renamer.py index 0f24c364..22be22ad 100644 --- a/whipper/common/renamer.py +++ b/whipper/common/renamer.py @@ -109,10 +109,10 @@ def addRename(self, source, destination): """ Add a rename operation. - @param source: source filename - @type source: str - @param destination: destination filename - @type destination: str + :param source: source filename + :type source: str + :param destination: destination filename + :type destination: str """ @@ -142,16 +142,16 @@ def redo(self): def serialize(self): """ Serialize the operation. - The return value should bu usable with L{deserialize} + The return value should bu usable with :any:`deserialize` - @rtype: str + :rtype: str """ def deserialize(cls, data): """ Deserialize the operation with the given operation data. - @type data: str + :type data: str """ raise NotImplementedError deserialize = classmethod(deserialize) diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index b7e8d6ff..a996d27f 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -97,8 +97,8 @@ class Task(LogStub): stopping myself from running. The listener can then handle the Task.exception. - @ivar description: what am I doing - @ivar exception: set if an exception happened during the task + :cvar description: what am I doing + :cvar exception: set if an exception happened during the task execution. Will be raised through run() at the end. """ logCategory = 'Task' @@ -254,16 +254,16 @@ def progressed(self, task, value): """ Implement me to be informed about progress. - @type value: float - @param value: progress, from 0.0 to 1.0 + :type value: float + :param value: progress, from 0.0 to 1.0 """ def described(self, task, description): """ Implement me to be informed about description changes. - @type description: str - @param description: description + :type description: str + :param description: description """ def started(self, task): @@ -298,8 +298,8 @@ class BaseMultiTask(Task, ITaskListener): """ I perform multiple tasks. - @ivar tasks: the tasks to run - @type tasks: list of L{Task} + :ivar tasks: the tasks to run + :type tasks: list of :any:`Task` """ description = 'Doing various tasks' @@ -313,7 +313,7 @@ def addTask(self, task): """ Add a task. - @type task: L{Task} + :type task: Task """ if self.tasks is None: self.tasks = [] @@ -446,7 +446,7 @@ def run(self, task): """ Run the given task. - @type task: Task + :type task: Task """ raise NotImplementedError @@ -457,8 +457,8 @@ def schedule(self, delta, callable_task, *args, **kwargs): Subclasses should implement this. - @type delta: float - @param delta: time in the future to schedule call for, in seconds. + :type delta: float + :param delta: time in the future to schedule call for, in seconds. """ raise NotImplementedError diff --git a/whipper/image/cue.py b/whipper/image/cue.py index b7aa268b..1a49ca9d 100644 --- a/whipper/image/cue.py +++ b/whipper/image/cue.py @@ -62,14 +62,14 @@ class CueFile(object): """ I represent a .cue file as an object. - @type table: L{table.Table} - @ivar table: the index table. + :vartype table: table.Table + :ivar table: the index table. """ logCategory = 'CueFile' def __init__(self, path): """ - @type path: unicode + :type path: unicode """ assert isinstance(path, unicode), "%r is not unicode" % path @@ -154,7 +154,7 @@ def message(self, number, message): """ Add a message about a given line in the cue file. - @param number: line number, counting from 0. + :param number: line number, counting from 0. """ self._messages.append((number + 1, message)) @@ -182,7 +182,7 @@ def getRealPath(self, path): """ Translate the .cue's FILE to an existing path. - @type path: unicode + :type path: unicode """ return common.getRealPath(self._path, path) @@ -194,7 +194,7 @@ class File: def __init__(self, path, file_format): """ - @type path: unicode + :type path: unicode """ assert isinstance(path, unicode), "%r is not unicode" % path diff --git a/whipper/image/image.py b/whipper/image/image.py index e57ad3cd..83eb4b34 100644 --- a/whipper/image/image.py +++ b/whipper/image/image.py @@ -36,15 +36,15 @@ class Image(object): """ - @ivar table: The Table of Contents for this image. - @type table: L{table.Table} + :ivar table: The Table of Contents for this image. + :vartype table: table.Table """ logCategory = 'Image' def __init__(self, path): """ - @type path: unicode - @param path: .cue path + :type path: unicode + :param path: .cue path """ assert isinstance(path, unicode), "%r is not unicode" % path @@ -60,7 +60,7 @@ def getRealPath(self, path): """ Translate the .cue's FILE to an existing path. - @param path: .cue path + :param path: .cue path """ assert isinstance(path, unicode), "%r is not unicode" % path diff --git a/whipper/image/table.py b/whipper/image/table.py index 0b32d4dc..57377a93 100644 --- a/whipper/image/table.py +++ b/whipper/image/table.py @@ -57,17 +57,18 @@ class Track: """ I represent a track entry in an Table. - @ivar number: track number (1-based) - @type number: int - @ivar audio: whether the track is audio - @type audio: bool - @type indexes: dict of number -> L{Index} - @ivar isrc: ISRC code (12 alphanumeric characters) - @type isrc: str - @ivar cdtext: dictionary of CD Text information; see L{CDTEXT_KEYS}. - @type cdtext: str -> unicode - @ivar pre_emphasis: whether track is pre-emphasised - @type pre_emphasis: bool + :cvar number: track number (1-based) + :vartype number: int + :cvar audio: whether the track is audio + :vartype audio: bool + :vartype indexes: dict of number -> :any:`Index` + :cvar isrc: ISRC code (12 alphanumeric characters) + :vartype isrc: str + :cvar cdtext: dictionary of CD Text information; + :any:`see CDTEXT_KEYS` + :vartype cdtext: str -> unicode + :cvar pre_emphasis: whether track is pre-emphasised + :vartype pre_emphasis: bool """ number = None @@ -90,7 +91,7 @@ def __init__(self, number, audio=True, session=None): def index(self, number, absolute=None, path=None, relative=None, counter=None): """ - @type path: unicode or None + :type path: unicode or None """ if path is not None: assert isinstance(path, unicode), "%r is not unicode" % path @@ -130,9 +131,9 @@ def getPregap(self): class Index: """ - @ivar counter: counter for the index source; distinguishes between + :cvar counter: counter for the index source; distinguishes between the matching FILE lines in .cue files for example - @type path: unicode or None + :vartype path: unicode or None """ number = None absolute = None @@ -161,11 +162,11 @@ class Table(object): """ I represent a table of indexes on a CD. - @ivar tracks: tracks on this CD - @type tracks: list of L{Track} - @ivar catalog: catalog number - @type catalog: str - @type cdtext: dict of str -> str + :cvar tracks: tracks on this CD + :vartype tracks: list of :any:`Track` + :cvar catalog: catalog number + :vartype catalog: str + :vartype cdtext: dict of str -> str """ tracks = None # list of Track @@ -193,22 +194,22 @@ def unpickled(self): def getTrackStart(self, number): """ - @param number: the track number, 1-based - @type number: int + :param number: the track number, 1-based + :type number: int - @returns: the start of the given track number's index 1, in CD frames - @rtype: int + :returns: the start of the given track number's index 1, in CD frames + :rtype: int """ track = self.tracks[number - 1] return track.getIndex(1).absolute def getTrackEnd(self, number): """ - @param number: the track number, 1-based - @type number: int + :param number: the track number, 1-based + :type number: int - @returns: the end of the given track number (ie index 1 of next track) - @rtype: int + :returns: the end of the given track number (ie index 1 of next track) + :rtype: int """ # default to end of disc end = self.leadout - 1 @@ -228,24 +229,24 @@ def getTrackEnd(self, number): def getTrackLength(self, number): """ - @param number: the track number, 1-based - @type number: int + :param number: the track number, 1-based + :type number: int - @returns: the length of the given track number, in CD frames - @rtype: int + :returns: the length of the given track number, in CD frames + :rtype: int """ return self.getTrackEnd(number) - self.getTrackStart(number) + 1 def getAudioTracks(self): """ - @returns: the number of audio tracks on the CD - @rtype: int + :returns: the number of audio tracks on the CD + :rtype: int """ return len([t for t in self.tracks if t.audio]) def hasDataTracks(self): """ - @returns: whether this disc contains data tracks + :returns: whether this disc contains data tracks """ return len([t for t in self.tracks if not t.audio]) > 0 @@ -268,7 +269,7 @@ def getCDDBValues(self): - offset of index 1 of each track - length of disc in seconds (including data track) - @rtype: list of int + :rtype: list of int """ offsets = [] @@ -320,8 +321,8 @@ def getCDDBDiscId(self): """ Calculate the CDDB disc ID. - @rtype: str - @returns: the 8-character hexadecimal disc ID + :rtype: str + :returns: the 8-character hexadecimal disc ID """ values = self.getCDDBValues() return "%08x" % int(values) @@ -330,8 +331,8 @@ def getMusicBrainzDiscId(self): """ Calculate the MusicBrainz disc ID. - @rtype: str - @returns: the 28-character base64-encoded disc ID + :rtype: str + :returns: the 28-character base64-encoded disc ID """ if self.mbdiscid: logger.debug('getMusicBrainzDiscId: returning cached %r', @@ -401,7 +402,7 @@ def getFrameLength(self, data=False): """ Get the length in frames (excluding HTOA) - @param data: whether to include the data tracks in the length + :param data: whether to include the data tracks in the length """ # the 'real' leadout, not offset by 150 frames if data: @@ -431,7 +432,7 @@ def _getMusicBrainzValues(self): - leadout of disc - offset of index 1 of each track - @rtype: list of int + :rtype: list of int """ # MusicBrainz disc id does not take into account data tracks @@ -470,13 +471,13 @@ def _getMusicBrainzValues(self): def cue(self, cuePath='', program='whipper'): """ - @param cuePath: path to the cue file to be written. If empty, + :param cuePath: path to the cue file to be written. If empty, will treat paths as if in current directory. Dump our internal representation to a .cue file content. - @rtype: C{unicode} + :rtype: unicode """ logger.debug('generating .cue for cuePath %r', cuePath) @@ -633,8 +634,8 @@ def setFile(self, track, index, path, length, counter=None): Assumes all indexes have an absolute offset and will raise if not. - @type track: C{int} - @type index: C{int} + :type track: int + :type index: int """ logger.debug('setFile: track %d, index %d, path %r, length %r, ' 'counter %r', track, index, path, length, counter) @@ -704,7 +705,7 @@ def merge(self, other, session=2): The other table is assumed to be from an additional session, - @type other: L{Table} + :type other: Table """ gap = self._getSessionGap(session) @@ -751,11 +752,11 @@ def getNextTrackIndex(self, track, index): """ Return the next track and index. - @param track: track number, 1-based + :param track: track number, 1-based - @raises IndexError: on last index + :raises IndexError: on last index - @rtype: tuple of (int, int) + :rtype: tuple of (int, int) """ t = self.tracks[track - 1] indexes = list(t.indexes) diff --git a/whipper/image/toc.py b/whipper/image/toc.py index 3d03d137..da175c16 100644 --- a/whipper/image/toc.py +++ b/whipper/image/toc.py @@ -104,10 +104,10 @@ def __init__(self): def append(self, counter, offset, source): """ - @param counter: the source counter; updates for each different + :param counter: the source counter; updates for each different data source (silence or different file path) - @type counter: int - @param offset: the absolute disc offset where this source starts + :type counter: int + :param offset: the absolute disc offset where this source starts """ logger.debug('appending source, counter %d, abs offset %d, ' 'source %r', counter, offset, source) @@ -138,7 +138,7 @@ class TocFile(object): def __init__(self, path): """ - @type path: unicode + :type path: unicode """ assert isinstance(path, unicode), "%r is not unicode" % path self._path = path @@ -380,7 +380,7 @@ def message(self, number, message): """ Add a message about a given line in the cue file. - @param number: line number, counting from 0. + :param number: line number, counting from 0. """ self._messages.append((number + 1, message)) @@ -412,7 +412,7 @@ def getRealPath(self, path): """ Translate the .toc's FILE to an existing path. - @type path: unicode + :type path: unicode """ return common.getRealPath(self._path, path) @@ -424,10 +424,10 @@ class File: def __init__(self, path, start, length): """ - @type path: C{unicode} - @type start: C{int} - @param start: starting point for the track in this file, in frames - @param length: length for the track in this file, in frames + :type path: unicode + :type start: int + :param start: starting point for the track in this file, in frames + :param length: length for the track in this file, in frames """ assert isinstance(path, unicode), "%r is not unicode" % path diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index 29d21760..6bc579d2 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -88,10 +88,10 @@ class ProgressParser: def __init__(self, start, stop): """ - @param start: first frame to rip - @type start: int - @param stop: last frame to rip (inclusive) - @type stop: int + :param start: first frame to rip + :type start: int + :param stop: last frame to rip (inclusive) + :type stop: int """ self.start = start self.stop = stop @@ -205,8 +205,6 @@ def getTrackQuality(self): class ReadTrackTask(task.Task): """ I am a task that reads a track using cdparanoia. - - @ivar reads: how many reads were done to rip the track """ description = "Reading track" @@ -221,22 +219,22 @@ def __init__(self, path, table, start, stop, overread, offset=0, """ Read the given track. - @param path: where to store the ripped track - @type path: unicode - @param table: table of contents of CD - @type table: L{table.Table} - @param start: first frame to rip - @type start: int - @param stop: last frame to rip (inclusive); >= start - @type stop: int - @param offset: read offset, in samples - @type offset: int - @param device: the device to rip from - @type device: str - @param action: a string representing the action; e.g. Read/Verify - @type action: str - @param what: a string representing what's being read; e.g. Track - @type what: str + :param path: where to store the ripped track + :type path: unicode + :param table: table of contents of CD + :type table: table.Table + :param start: first frame to rip + :type start: int + :param stop: last frame to rip (inclusive); >= start + :type stop: int + :param offset: read offset, in samples + :type offset: int + :param device: the device to rip from + :type device: str + :param action: a string representing the action; e.g. Read/Verify + :type action: str + :param what: a string representing what's being read; e.g. Track + :type what: str """ assert isinstance(path, unicode), "%r is not unicode" % path @@ -403,17 +401,16 @@ class ReadVerifyTrackTask(task.MultiSeparateTask): The path where the file is stored can be changed if necessary, for example if the file name is too long. - @ivar path: the path where the file is to be stored. - @ivar checksum: the checksum of the track; set if they match. - @ivar testchecksum: the test checksum of the track. - @ivar copychecksum: the copy checksum of the track. - @ivar testspeed: the test speed of the track, as a multiple of + :cvar checksum: the checksum of the track; set if they match. + :cvar testchecksum: the test checksum of the track. + :cvar copychecksum: the copy checksum of the track. + :cvar testspeed: the test speed of the track, as a multiple of track duration. - @ivar copyspeed: the copy speed of the track, as a multiple of + :cvar copyspeed: the copy speed of the track, as a multiple of track duration. - @ivar testduration: the test duration of the track, in seconds. - @ivar copyduration: the copy duration of the track, in seconds. - @ivar peak: the peak level of the track + :cvar testduration: the test duration of the track, in seconds. + :cvar copyduration: the copy duration of the track, in seconds. + :cvar peak: the peak level of the track """ checksum = None @@ -432,20 +429,20 @@ class ReadVerifyTrackTask(task.MultiSeparateTask): def __init__(self, path, table, start, stop, overread, offset=0, device=None, taglist=None, what="track"): """ - @param path: where to store the ripped track - @type path: str - @param table: table of contents of CD - @type table: L{table.Table} - @param start: first frame to rip - @type start: int - @param stop: last frame to rip (inclusive) - @type stop: int - @param offset: read offset, in samples - @type offset: int - @param device: the device to rip from - @type device: str - @param taglist: a dict of tags - @type taglist: dict + :param path: where to store the ripped track + :type path: str + :param table: table of contents of CD + :type table: table.Table + :param start: first frame to rip + :type start: int + :param stop: last frame to rip (inclusive) + :type stop: int + :param offset: read offset, in samples + :type offset: int + :param device: the device to rip from + :type device: str + :param taglist: a dict of tags + :type taglist: dict """ task.MultiSeparateTask.__init__(self) diff --git a/whipper/program/cdrdao.py b/whipper/program/cdrdao.py index b9b36874..f59ed383 100644 --- a/whipper/program/cdrdao.py +++ b/whipper/program/cdrdao.py @@ -69,12 +69,12 @@ def __init__(self, device, fast_toc=False, toc_path=None): """ Read the TOC for 'device'. - @param device: block device to read TOC from - @type device: str - @param fast_toc: If to use fast-toc cdrdao mode - @type fast_toc: bool - @param toc_path: Where to save TOC if wanted. - @type toc_path: str + :param device: block device to read TOC from + :type device: str + :param fast_toc: If to use fast-toc cdrdao mode + :type fast_toc: bool + :param toc_path: Where to save TOC if wanted. + :type toc_path: str """ self.device = device diff --git a/whipper/program/soxi.py b/whipper/program/soxi.py index 07b8f9a5..86a18235 100644 --- a/whipper/program/soxi.py +++ b/whipper/program/soxi.py @@ -13,7 +13,7 @@ class AudioLengthTask(ctask.PopenTask): """ I calculate the length of a track in audio samples. - @ivar length: length of the decoded audio file, in audio samples. + :cvar length: length of the decoded audio file, in audio samples. """ logCategory = 'AudioLengthTask' description = 'Getting length of audio track' @@ -21,7 +21,7 @@ class AudioLengthTask(ctask.PopenTask): def __init__(self, path): """ - @type path: unicode + :type path: unicode """ assert isinstance(path, unicode), "%r is not unicode" % path diff --git a/whipper/result/result.py b/whipper/result/result.py index 35af5804..7947730f 100644 --- a/whipper/result/result.py +++ b/whipper/result/result.py @@ -69,18 +69,18 @@ class RipResult: I hold information about the result for rips. I can be used to write log files. - @ivar offset: sample read offset - @ivar table: the full index table - @type table: L{whipper.image.table.Table} - @ivar metadata: disc metadata from MusicBrainz (if available) - @type metadata: L{whipper.common.mbngs.DiscMetadata} - - @ivar vendor: vendor of the CD drive - @ivar model: model of the CD drive - @ivar release: release of the CD drive - - @ivar cdrdaoVersion: version of cdrdao used for the rip - @ivar cdparanoiaVersion: version of cdparanoia used for the rip + :cvar offset: sample read offset + :cvar table: the full index table + :vartype table: whipper.image.table.Table + :cvar metadata: disc metadata from MusicBrainz (if available) + :vartype metadata: whipper.common.mbngs.DiscMetadata + + :cvar vendor: vendor of the CD drive + :cvar model: model of the CD drive + :cvar release: release of the CD drive + + :cvar cdrdaoVersion: version of cdrdao used for the rip + :cvar cdparanoiaVersion: version of cdparanoia used for the rip """ offset = 0 @@ -107,10 +107,10 @@ def __init__(self): def getTrackResult(self, number): """ - @param number: the track number (0 for HTOA) + :param number: the track number (0 for HTOA) - @type number: int - @rtype: L{TrackResult} + :type number: int + :rtype: TrackResult """ for t in self.tracks: if t.number == number: @@ -128,11 +128,11 @@ def log(self, ripResult, epoch=time.time()): """ Create a log from the given ripresult. - @param epoch: when the log file gets generated - @type epoch: float - @type ripResult: L{RipResult} + :param epoch: when the log file gets generated + :type epoch: float + :type ripResult: RipResult - @rtype: str + :rtype: str """ raise NotImplementedError @@ -153,7 +153,7 @@ def getLoggers(): """ Get all logger plugins with entry point 'whipper.logger'. - @rtype: dict of C{str} -> C{Logger} + :rtype: dict of :class:`str` -> :any:`Logger` """ d = {} From 3a74c60344ffc1ebded498a5a36f513540b20435 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 4 May 2019 10:18:03 +0200 Subject: [PATCH 54/79] Update "required dependencies" section in README Signed-off-by: JoeLametta --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b5376264..60f01858 100644 --- a/README.md +++ b/README.md @@ -119,8 +119,8 @@ If you are building from a source tarball or checkout, you can choose to use whi Whipper relies on the following packages in order to run correctly and provide all the supported features: - [cd-paranoia](https://www.gnu.org/software/libcdio/), for the actual ripping - - To avoid bugs it's advised to use `cd-paranoia` version **10.2+0.94+2-2** - - The package named `libcdio-utils`, available on Debian and Ubuntu, is affected by a bug: it doesn't include the `cd-paranoia` binary (needed by whipper). For more details see: [#888053 (Debian)](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888053), [#1750264 (Ubuntu)](https://bugs.launchpad.net/ubuntu/+source/libcdio/+bug/1750264). + - To avoid bugs it's advised to use `cd-paranoia` versions ≥ **10.2+0.94+2-2** + - The package named `libcdio-utils`, available on Debian and Ubuntu, is affected by a bug: it doesn't include the `cd-paranoia` binary (needed by whipper). For more details see: [#888053 (Debian)](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888053), [#889803 (Debian)](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=889803) and [#1750264 (Ubuntu)](https://bugs.launchpad.net/ubuntu/+source/libcdio/+bug/1750264). - [cdrdao](http://cdrdao.sourceforge.net/), for session, TOC, pre-gap, and ISRC extraction - [GObject Introspection](https://wiki.gnome.org/Projects/GObjectIntrospection), to provide GLib-2.0 methods used by `task.py` - [PyGObject](https://pypi.org/project/PyGObject/), required by `task.py` @@ -129,7 +129,7 @@ Whipper relies on the following packages in order to run correctly and provide a - [python-setuptools](https://pypi.python.org/pypi/setuptools), for installation, plugins support - [python-requests](https://pypi.python.org/pypi/requests), for retrieving AccurateRip database entries - [pycdio](https://pypi.python.org/pypi/pycdio/), for drive identification (required for drive offset and caching behavior to be stored in the configuration file). - - To avoid bugs it's advised to use `pycdio` **0.20** or **0.21** with `libcdio` ≥ **0.90** ≤ **0.94* or `pycdio` **2.0.0** with `libcdio` **2.0.0**. All other combinations won't probably work. + - To avoid bugs it's advised to use `pycdio` **0.20** or **0.21** with `libcdio` ≥ **0.90** ≤ **0.94** or `pycdio` **2.0.0** with `libcdio` **2.0.0**. All other combinations won't probably work. - [libsndfile](http://www.mega-nerd.com/libsndfile/), for reading wav files - [flac](https://xiph.org/flac/), for reading flac files - [sox](http://sox.sourceforge.net/), for track peak detection From 7a4680f2852a7b59b064b465e5cf20b43cb06368 Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Thu, 9 May 2019 09:40:37 +0200 Subject: [PATCH 55/79] Add testcase for Gentlemen: same CDDB ID as Interpol Signed-off-by: JoeLametta --- whipper/test/gentlemen.fast.toc | 91 +++++++++++++++++++++++++++++++++ whipper/test/test_image_toc.py | 14 +++++ 2 files changed, 105 insertions(+) create mode 100644 whipper/test/gentlemen.fast.toc diff --git a/whipper/test/gentlemen.fast.toc b/whipper/test/gentlemen.fast.toc new file mode 100644 index 00000000..59aeebff --- /dev/null +++ b/whipper/test/gentlemen.fast.toc @@ -0,0 +1,91 @@ +CD_DA + +CATALOG "0075596150125" + +// Track 1 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 0 03:05:62 + + +// Track 2 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 03:05:62 03:53:53 + + +// Track 3 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 06:59:40 03:36:70 + + +// Track 4 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 10:36:35 04:14:42 + + +// Track 5 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 14:51:02 05:48:05 + + +// Track 6 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 20:39:07 04:21:23 + + +// Track 7 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 25:00:30 03:30:50 + + +// Track 8 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 28:31:05 05:46:00 + + +// Track 9 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 34:17:05 04:10:22 + + +// Track 10 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 38:27:27 04:51:65 + + +// Track 11 +TRACK AUDIO +NO COPY +NO PRE_EMPHASIS +TWO_CHANNEL_AUDIO +FILE "data.wav" 43:19:17 05:40:03 + diff --git a/whipper/test/test_image_toc.py b/whipper/test/test_image_toc.py index a51b256c..4786662a 100644 --- a/whipper/test/test_image_toc.py +++ b/whipper/test/test_image_toc.py @@ -320,6 +320,20 @@ def testCDDBId(self): self.assertEqual(self.toc.table.getCDDBDiscId(), '810b7b0b') +class GentlemenTestCase(common.TestCase): + + def setUp(self): + self.path = os.path.join(os.path.dirname(__file__), + u'gentlemen.fast.toc') + self.toc = toc.TocFile(self.path) + self.toc.parse() + self.assertEquals(len(self.toc.table.tracks), 11) + + def testCDDBId(self): + self.toc.table.absolutize() + self.assertEquals(self.toc.table.getCDDBDiscId(), '810b7b0b') + + # The Strokes - Someday has a 1 frame SILENCE marked as such in toc From 9cf890a6e29ce371d7cc252018e8af522e7799b7 Mon Sep 17 00:00:00 2001 From: Volker Mische Date: Fri, 5 Jul 2019 00:04:51 +0200 Subject: [PATCH 56/79] Fix offset find command The refactoring of `ReadTOCTask` in commit 3e79032b63d25d7f2d66a73ad31f9c2db91d390c broke the `offset find` command. This commit fixes it again. Signed-off-by: Volker Mische --- whipper/command/offset.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/whipper/command/offset.py b/whipper/command/offset.py index 8dace363..9b59bf6d 100644 --- a/whipper/command/offset.py +++ b/whipper/command/offset.py @@ -85,7 +85,8 @@ def do(self): # first get the Table Of Contents of the CD t = cdrdao.ReadTOCTask(device) - table = t.table + runner.run(t) + table = t.toc.table logger.debug("CDDB disc id: %r", table.getCDDBDiscId()) try: From 4eeb0cddc79f33b0635d3bf1d3fb9641285799a5 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Fri, 5 Jul 2019 08:00:00 +0000 Subject: [PATCH 57/79] Update failing AccurateRipResponse tests --- .../dBAR-002-0000f21c-00027ef8-05021002.bin | Bin 62 -> 62 bytes .../dBAR-011-0010e284-009228a3-9809ff0b.bin | Bin 336 -> 3584 bytes whipper/test/test_common_accurip.py | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/whipper/test/dBAR-002-0000f21c-00027ef8-05021002.bin b/whipper/test/dBAR-002-0000f21c-00027ef8-05021002.bin index 8c804e6e6ebf526ff6a58e6eceacb855a3d2ece6..86588bffde41d99784fd288ec4b4b73612763e39 100644 GIT binary patch delta 23 bcmcDso1i1aw)$uJ9R?s^JA7&ST@V8RUD5|v delta 23 bcmcDso1i1ay837N9R?s^J$z~UT@V8RUAG5S diff --git a/whipper/test/dBAR-011-0010e284-009228a3-9809ff0b.bin b/whipper/test/dBAR-011-0010e284-009228a3-9809ff0b.bin index a1053ca02c73109b5890e98c8617c89e8c9d9cd7..8f5c2af564a1325e2dd311667278ce8b27d245c1 100644 GIT binary patch literal 3584 zcmciBc{J2}AHeZ3-!Wk@mK0+dTe1$>myir{BcntmafM3AQVH3YYj2V4WJxiKROp(y z72-#_DP)_nbnUXMM&x;X{Wa(Goadb9kLUN->wG@HnfILU?>D%Z5k6G0{7n>YgEJGE z9ddP{nX6lE!83%>o+oO5%c&b-z9}7?|r0v?0it$2PJF-2rLKoULd%W}U&>^F&_QU8tx+BR41w z^)ndGKal~+fzLgE#Tz3Hc-xC|&el3ex5~E%4Of_#k>oyN3U|^<1!CT@E)#205`%~d zJz9H0SJpssbp?a)SS1g{*zA6^`-5-JNGE?h`pZMkVb-2vWNanbaKR55Lf49}TaOAM zY&2SEzO^<1*6jmW8Y2G5A zNQFj9%vF;)Hmb7}d(Cd+!wIf3;~WCfEIr*OQR$4%3)?U2+iNkT=!Jo;`X!NqT(KO( z$@-L2o$mv-2~X%d$Yp;>D~a0B=f2}vk)HcVOP?X1m(I=GrmPoGy$!|uhu*AvpSFCi zMKpq}-_qFjdM1%+tLsqSv^T{HM`!6N7u4s zBM&B-;qLpXOs#!CC^2V2BAtrs-%V-uOIMNKc<++o+jE;Fb-;kxGB|#o6isQm#r6kf zgp{mHUH<6k?C^k+gyS}90)?M!WN^J1 z_K|E-`j2o+?snMixXa48f>Z?_%cxyxxa-s?k}SWS3vSVY>f6;EQG?61JQv#hcuxeb zL$_=INZQ!3^sw48qrIGs#rLt<*#l=RcA1^TiuT~OQa^Ve#O^Tfqq_u6PGcA3O5Emr zub5&7^wsbeg=$@}dLg%~28R0zu}e5+DsN_*Id*X|Ev(2J6N|lG)}zxrPx^>0ec0&9 z;KDIkdKlhsKU5sdq-rp=xk`mKVN*nm=4+!?s~<@?3}L-#HSOz4Kc?U1x3yaHSPEvu z{wZ!*F_;JQ{x>%zrzc#27~bbIbp`r9hcO`*OPbW7#Z`Uh;TehAfMlU+b z+EZG#_~?zDjXPs;wr@KLB>UW)3Q zfnBPvB0y%*@%9Oq4xrKoBC?Bz9YZ7!I7$@#0jEosFQ% z%i}ee4+RK@H6i@4HnC zTyi6Pq5@(IfXzS&O+DH{5V-EfJ>@EPUI*nFGj4M3Jk?;Jc{Q!K`3(`E;|2ZNYFrh8 z;scaHOxw&TSpFbgy`)?I0#s!Y#D6O)9cAs!rpbD%xMrLN(u3QdX$^~@LC^U+#^)kw zRzSL4no8J*@PPd6JJja|7HPoK(>g5FcIXIbKNLR3q%R5ryA+1{F1e;+kXk{X4Lxb~ z68LRzQzYbu`~c&R?>s$Ueo2kB7t;A9c=CXgI?!}`8$FP7{v}9j-%GXYY|#Y5w`Y@r ziZB;|!p$qM<~OSCL1ePo08Y^(F#3(khf;^ zr?2wx+RbV>iJJ;t2<9ig6b#3Wa}ww-EoTa1FpOeSmgWH^h*& z$4y_aY8@Y+Yc zfJjcDP0iJxp}@7V<-sM>o#HJKO?{p6J8>Il(at9#hAUf42rE9i5W{BIsvx9! z&SXK*t}0#I1Z(ee5H=XDk0cnUL!6+zKLX)AXgv$DQWWI^AxJ*+2_jCr*$M*1_7)xw z`ldlvD4eVf4(^9g==-d>3D#bq?ffuY$1IVzdXAjGx4?;MIWr8x1~oSb;b0ob1(6lg z>JL#*V6I(hQcXA^bOG1Ah=rc9ztk3U4SnadfYXQ1}7KP|C)o~%qGJ#XYF}x-1Ua*9RIQ7 z5SGfrt`K$@y{)qnsdzaCC(82VFA$Xz$Cwah{h?cLkiRTx>o-wFD$C#sY(HqX36|dG z0A6TZj}m;m=x3I}YMUeUIpGW~i0TTttp~}ewom~l*OD7nAq-d5wjQmom)|m+1i0mH z{T~$N`=YQ}0`iuX=6fIHa R5VN`afAth>by_!j{{r&W|IYvb literal 336 zcmd;Xc_hHFSYr|c_kYeA$|sCo?c3v~J43mUkK^aP#yu^{htIx=+%LsurmVT`)VF!x zN|q}>T>fvOfUA+S@|`ntrC-;}C@SBX&8Q!B=ctpir*_Zw@)O;sm1R}0SudP-LrVF? zvov6rl^fYUrujQ;{^zgRz{K?P-sQSCES$TT%nmhlU*FeZ&y?bF zzgsQd*PQ9qpC8_bDt?wR#kJj1=jr~shDqc9rG!@hB`r*f9@am%?A0-5Y7RIug`Z73 zjj6|C^_SGO-{YB5*fdSwuH$@&VxO2+W9xc}g(j?G516(~n@@kKC&svEPwkhUBL-q3 zE1$Zmv~BJXo4VP6q%yS(IM@ diff --git a/whipper/test/test_common_accurip.py b/whipper/test/test_common_accurip.py index ec6fe8ae..9cb1ef2e 100644 --- a/whipper/test/test_common_accurip.py +++ b/whipper/test/test_common_accurip.py @@ -78,8 +78,8 @@ def test_AccurateRipResponse_parses_correctly(self): self.assertEqual(responses[1].discId1, '0000f21c') self.assertEqual(responses[1].discId2, '00027ef8') self.assertEqual(responses[1].cddbDiscId, '05021002') - self.assertEqual(responses[1].confidences[0], 5) - self.assertEqual(responses[1].confidences[1], 5) + self.assertEqual(responses[1].confidences[0], 6) + self.assertEqual(responses[1].confidences[1], 6) self.assertEqual(responses[1].checksums[0], 'dc77f9ab') self.assertEqual(responses[1].checksums[1], 'dd97d2c3') @@ -203,7 +203,7 @@ def test_stores_accuraterip_results_on_result(self): 'v2': { 'CRC': 'dc77f9ab', 'DBCRC': 'dc77f9ab', - 'DBConfidence': 5, + 'DBConfidence': 6 }, 'DBMaxConfidence': 12, 'DBMaxConfidenceCRC': '284fc705', @@ -217,7 +217,7 @@ def test_stores_accuraterip_results_on_result(self): 'v2': { 'CRC': 'dd97d2c3', 'DBCRC': 'dd97d2c3', - 'DBConfidence': 5, + 'DBConfidence': 6, }, 'DBMaxConfidence': 20, 'DBMaxConfidenceCRC': '9cc1f32e', From 0d692586540af5ccc0baad42e28b407c5f872aba Mon Sep 17 00:00:00 2001 From: it is madness Date: Fri, 14 Jun 2019 22:08:43 -0300 Subject: [PATCH 58/79] Use YAML 1.2 boolean values for booleans Signed-off-by: JoeLametta --- whipper/result/logger.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/whipper/result/logger.py b/whipper/result/logger.py index 40c9c84a..2d8e4e54 100644 --- a/whipper/result/logger.py +++ b/whipper/result/logger.py @@ -40,26 +40,24 @@ def logRip(self, ripResult, epoch): lines.append(" Extraction engine: cdparanoia %s" % ripResult.cdparanoiaVersion) if ripResult.cdparanoiaDefeatsCache is None: - defeat = "Unknown" + defeat = "null" elif ripResult.cdparanoiaDefeatsCache: - defeat = "Yes" + defeat = "true" else: - defeat = "No" + defeat = "false" lines.append(" Defeat audio cache: %s" % defeat) lines.append(" Read offset correction: %+d" % ripResult.offset) # Currently unsupported by the official cdparanoia package - over = "No" + over = "false" # Only implemented in whipper (ripResult.overread) if ripResult.overread: - over = "Yes" + over = "true" lines.append(" Overread into lead-out: %s" % over) # Next one fully works only using the patched cdparanoia package - # lines.append("Fill up missing offset samples with silence: Yes") + # lines.append("Fill up missing offset samples with silence: true") lines.append(" Gap detection: cdrdao %s" % ripResult.cdrdaoVersion) - if ripResult.isCdr: - isCdr = "Yes" - else: - isCdr = "No" + + isCdr = "true" if ripResult.isCdr else "false" lines.append(" CD-R detected: %s" % isCdr) lines.append("") @@ -184,10 +182,7 @@ def trackLog(self, trackResult): # Pre-emphasis status # Only implemented in whipper (trackResult.pre_emphasis) - if trackResult.pre_emphasis: - preEmph = "Yes" - else: - preEmph = "No" + preEmph = "true" if trackResult.pre_emphasis else "false" lines.append(" Pre-emphasis: %s" % preEmph) # Extraction speed From 57d386e82fd36831ad521a1961b6317dd09c75bd Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sun, 7 Jul 2019 10:00:00 +0000 Subject: [PATCH 59/79] Remove too verbose logger statements Related to #278. Signed-off-by: JoeLametta --- whipper/extern/task/task.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index a996d27f..3590c750 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -516,8 +516,6 @@ def _startWrap(self, task): def schedule(self, task, delta, callable_task, *args, **kwargs): def c(): try: - self.debug('schedule: calling %r(*args=%r, **kwargs=%r)', - callable_task, args, kwargs) callable_task(*args, **kwargs) return False except Exception as e: @@ -526,8 +524,6 @@ def c(): task.setException(e) self.stopped(task) raise - self.debug('schedule: scheduling %r(*args=%r, **kwargs=%r)', - callable_task, args, kwargs) GLib.timeout_add(int(delta * 1000L), c) From 048a31e3483792a6ce5984af79e9afa167c5900a Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sun, 7 Jul 2019 10:00:00 +0000 Subject: [PATCH 60/79] Fix erroneous result message for whipper drive analyze If cdparanoia fails to analyze the drive, the drive is now marked as unable to defeat the cache. Fixes #361. Signed-off-by: JoeLametta --- whipper/program/cdparanoia.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index 6bc579d2..de2dfa3b 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -566,6 +566,7 @@ def getCdParanoiaVersion(): _OK_RE = re.compile(r'Drive tests OK with Paranoia.') _WARNING_RE = re.compile(r'WARNING! PARANOIA MAY NOT BE') +_ABORTING_RE = re.compile(r'aborting test\.') class AnalyzeTask(ctask.PopenTask): @@ -604,7 +605,7 @@ def failed(self): # whether it can defeat the audio cache output = "".join(self._output) m = _WARNING_RE.search(output) - if m: + if m or _ABORTING_RE.search(output): self.defeatsCache = False if self.cwd: shutil.rmtree(self.cwd) From e5961ae04cb438badddf3be1be79f273261d14c6 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sun, 7 Jul 2019 12:00:00 +0000 Subject: [PATCH 61/79] Report eject's failures as logger warnings If the eject command exits with an error, the output is logged as a WARNING. I don't think it's a good idea to mask those errors. Closes #354. Signed-off-by: JoeLametta --- whipper/program/utils.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/whipper/program/utils.py b/whipper/program/utils.py index e4133a62..4d40eb40 100644 --- a/whipper/program/utils.py +++ b/whipper/program/utils.py @@ -1,4 +1,5 @@ import os +import subprocess import logging logger = logging.getLogger(__name__) @@ -9,7 +10,12 @@ def eject_device(device): Eject the given device. """ logger.debug("ejecting device %s", device) - os.system('eject %s' % device) + try: + # `eject device` prints nothing to stdout + subprocess.check_output(['eject', device], stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + logger.warning(e.cmd, 'returned with exit code: ', e.returncode, + e.output) def load_device(device): @@ -17,7 +23,13 @@ def load_device(device): Load the given device. """ logger.debug("loading (eject -t) device %s", device) - os.system('eject -t %s' % device) + try: + # `eject -t device` prints nothing to stdout + subprocess.check_output(['eject', '-t', device], + stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + logger.warning(e.cmd, 'returned with exit code: ', e.returncode, + e.output) def unmount_device(device): From 1c6fe42202390983afdbe03d39b141f6ace85313 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sun, 7 Jul 2019 12:00:00 +0000 Subject: [PATCH 62/79] Set FLAC files permissions to 0644 Fixes #284. Signed-off-by: JoeLametta --- whipper/program/cdparanoia.py | 1 + 1 file changed, 1 insertion(+) diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index 6bc579d2..630938a0 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -453,6 +453,7 @@ def __init__(self, path, table, start, stop, overread, offset=0, # FIXME: choose a dir on the same disk/dir as the final path fd, tmppath = tempfile.mkstemp(suffix='.whipper.wav') tmppath = unicode(tmppath) + os.fchmod(fd, 0644) os.close(fd) self._tmpwavpath = tmppath From 635113be9aaa69ce9c4c80003f49db08c7ac3bd1 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Mon, 19 Aug 2019 12:00:00 +0000 Subject: [PATCH 63/79] Fix incorrect frames to MSF conversion Signed-off-by: JoeLametta --- whipper/common/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/common/common.py b/whipper/common/common.py index b12b1686..310c607a 100644 --- a/whipper/common/common.py +++ b/whipper/common/common.py @@ -76,7 +76,7 @@ def framesToMSF(frames, frameDelimiter=':'): f = frames % FRAMES_PER_SECOND frames -= f s = (frames / FRAMES_PER_SECOND) % 60 - frames -= s * 60 + frames -= s * FRAMES_PER_SECOND m = frames / FRAMES_PER_SECOND / 60 return "%02d:%02d%s%02d" % (m, s, frameDelimiter, f) From ab95715efc370e7afe0b2bf34f009b5c17f72dff Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Thu, 10 May 2018 03:14:03 +0200 Subject: [PATCH 64/79] accuraterip-checksum: convert to python C extension * calculate v1 and v2 checksums at once * let libsndfile handle both WAV and FLAC Signed-off-by: Andreas Oberritter --- .travis.yml | 5 - setup.py | 7 +- src/.gitignore | 1 - src/Makefile | 47 ------- src/accuraterip-checksum.c | 246 +++++++++++++------------------------ src/config.mk | 11 -- whipper/command/offset.py | 7 +- whipper/common/accurip.py | 11 +- whipper/program/arc.py | 55 +-------- 9 files changed, 99 insertions(+), 291 deletions(-) delete mode 100644 src/.gitignore delete mode 100644 src/Makefile delete mode 100644 src/config.mk diff --git a/.travis.yml b/.travis.yml index 07289baf..282d5e19 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,11 +23,6 @@ install: # Testing dependencies - pip install twisted flake8 - # Build bundled C utils - - cd src - - sudo make install - - cd .. - # Installing - python setup.py install diff --git a/setup.py b/setup.py index bbcfa0b4..051d0e62 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup, find_packages +from setuptools import setup, find_packages, Extension setup( name="whipper", @@ -11,6 +11,11 @@ python_requires='>=2.7,<3', packages=find_packages(), setup_requires=['setuptools_scm'], + ext_modules=[ + Extension('accuraterip', + libraries=['sndfile'], + sources=['src/accuraterip-checksum.c']) + ], entry_points={ 'console_scripts': [ 'whipper = whipper.command.main:main' diff --git a/src/.gitignore b/src/.gitignore deleted file mode 100644 index 84cb6423..00000000 --- a/src/.gitignore +++ /dev/null @@ -1 +0,0 @@ -accuraterip-checksum diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index f1c6d4a2..00000000 --- a/src/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = accuraterip-checksum.c -OBJ = ${SRC:.c=.o} - -all: options accuraterip-checksum - -options: - @echo accuraterip-checksum build options: - @echo "CFLAGS = ${CFLAGS}" - @echo "LDFLAGS = ${LDFLAGS}" - @echo "CC = ${CC}" - -.c.o: - @echo CC $< - @${CC} -c ${CFLAGS} $< - -accuraterip-checksum: ${OBJ} - @echo CC -o $@ - @${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - @echo cleaning - @rm -f accuraterip-checksum ${OBJ} accuraterip-checksum-${VERSION}.tar.gz - -dist: clean - @echo creating dist tarball - @mkdir -p accuraterip-checksum-${VERSION} - @cp -R Makefile README.md config.mk \ - ${SRC} accuraterip-checksum-${VERSION} - @tar -cf accuraterip-checksum-${VERSION}.tar accuraterip-checksum-${VERSION} - @gzip accuraterip-checksum-${VERSION}.tar - @rm -rf accuraterip-checksum-${VERSION} - -install: all - @echo installing executable file to ${DESTDIR}${PREFIX}/bin - @mkdir -p ${DESTDIR}${PREFIX}/bin - @cp -f accuraterip-checksum ${DESTDIR}${PREFIX}/bin - @chmod 755 ${DESTDIR}${PREFIX}/bin/accuraterip-checksum - -uninstall: - @echo removing executable file from ${DESTDIR}${PREFIX}/bin - @rm -f ${DESTDIR}${PREFIX}/bin/accuraterip-checksum - -.PHONY: all options clean dist install uninstall diff --git a/src/accuraterip-checksum.c b/src/accuraterip-checksum.c index 68c9dd59..ee784d9e 100644 --- a/src/accuraterip-checksum.c +++ b/src/accuraterip-checksum.c @@ -1,12 +1,10 @@ /* ============================================================================ Name : accuraterip-checksum.c - Author : Leo Bogert (http://leo.bogert.de) - Git : https://github.com/leo-bogert/accuraterip-checksum - Version : See global variable "version" - Copyright : GPLv3 - Description : A C99 commandline program to compute the AccurateRip checksum of singletrack WAV files. - Implemented according to http://www.hydrogenaudio.org/forums/index.php?showtopic=97603 + Authors : Leo Bogert (http://leo.bogert.de), Andreas Oberritter + License : GPLv3 + Description : A Python C extension to compute the AccurateRip checksum of WAV or FLAC tracks. + Implemented according to http://www.hydrogenaudio.org/forums/index.php?showtopic=97603 ============================================================================ */ @@ -17,10 +15,10 @@ #include #include #include +#include -const char *const version = "1.5"; - -bool check_fileformat(const SF_INFO* sfinfo) { +static bool check_fileformat(const SF_INFO *sfinfo) +{ #ifdef DEBUG printf("Channels: %i\n", sfinfo->channels); printf("Format: %X\n", sfinfo->format); @@ -30,27 +28,25 @@ bool check_fileformat(const SF_INFO* sfinfo) { printf("Seekable: %i\n", sfinfo->seekable); #endif - if(sfinfo->channels != 2) return false; - if((sfinfo->format & SF_FORMAT_TYPEMASK & SF_FORMAT_WAV) != SF_FORMAT_WAV) return false; - if((sfinfo->format & SF_FORMAT_SUBMASK & SF_FORMAT_PCM_16) != SF_FORMAT_PCM_16) return false; - //if((sfinfo->format & SF_FORMAT_ENDMASK & SF_ENDIAN_LITTLE) != SF_ENDIAN_LITTLE) return false; - if(sfinfo->samplerate != 44100) return false; - - return true; -} + switch (sfinfo->format & SF_FORMAT_TYPEMASK) { + case SF_FORMAT_WAV: + case SF_FORMAT_FLAC: + return (sfinfo->channels == 2) && + (sfinfo->samplerate == 44100) && + ((sfinfo->format & SF_FORMAT_SUBMASK) == SF_FORMAT_PCM_16); + } -size_t get_full_audiodata_size(const SF_INFO* sfinfo) { - // 16bit = samplesize, 8 bit = bitcount in byte - return sfinfo->frames * sfinfo->channels * (16 / 8); + return false; } -uint32_t* load_full_audiodata(SNDFILE* sndfile, const SF_INFO* sfinfo) { - uint32_t* data = (uint32_t*)malloc(get_full_audiodata_size(sfinfo)); +static void *load_full_audiodata(SNDFILE *sndfile, const SF_INFO *sfinfo, size_t size) +{ + void *data = malloc(size); if(data == NULL) return NULL; - if(sf_readf_short(sndfile, (short*)data, sfinfo->frames) != sfinfo->frames) { + if(sf_readf_short(sndfile, data, sfinfo->frames) != sfinfo->frames) { free(data); return NULL; } @@ -58,170 +54,100 @@ uint32_t* load_full_audiodata(SNDFILE* sndfile, const SF_INFO* sfinfo) { return data; } -uint32_t compute_v1_checksum(const uint32_t* audio_data, const size_t audio_data_size, const int track_number, const int total_tracks) { -#define DWORD uint32_t - - const DWORD *pAudioData = audio_data; // this should point entire track audio data - int DataSize = audio_data_size; // size of the data - int TrackNumber = track_number; // actual track number on disc, note that for the first & last track the first and last 5 sectors are skipped - int AudioTrackCount = total_tracks; // CD track count - - //---------AccurateRip CRC checks------------ - DWORD AR_CRC = 0, AR_CRCPosMulti = 1; - DWORD AR_CRCPosCheckFrom = 0; - DWORD AR_CRCPosCheckTo = DataSize / sizeof(DWORD); -#define SectorBytes 2352 // each sector - if (TrackNumber == 1) // first? - AR_CRCPosCheckFrom+= ((SectorBytes * 5) / sizeof(DWORD)); - if (TrackNumber == AudioTrackCount) // last? - AR_CRCPosCheckTo-=((SectorBytes * 5) / sizeof(DWORD)); - - - int DataDWORDSize = DataSize / sizeof(DWORD); - for (int i = 0; i < DataDWORDSize; i++) - { - if (AR_CRCPosMulti >= AR_CRCPosCheckFrom && AR_CRCPosMulti <= AR_CRCPosCheckTo) - AR_CRC+=(AR_CRCPosMulti * pAudioData[i]); - - AR_CRCPosMulti++; - } - - return AR_CRC; -} - -uint32_t compute_v2_checksum(const uint32_t* audio_data, const size_t audio_data_size, const int track_number, const int total_tracks) { -#define DWORD uint32_t -#define QWORD uint64_t - - const DWORD *pAudioData = audio_data; // this should point entire track audio data - int DataSize = audio_data_size; // size of the data - int TrackNumber = track_number; // actual track number on disc, note that for the first & last track the first and last 5 sectors are skipped - int AudioTrackCount = total_tracks; // CD track count - - //---------AccurateRip CRC checks------------ - DWORD AR_CRCPosCheckFrom = 0; - DWORD AR_CRCPosCheckTo = DataSize / sizeof(DWORD); -#define SectorBytes 2352 // each sector - if (TrackNumber == 1) // first? - AR_CRCPosCheckFrom+= ((SectorBytes * 5) / sizeof(DWORD)); - if (TrackNumber == AudioTrackCount) // last? - AR_CRCPosCheckTo-=((SectorBytes * 5) / sizeof(DWORD)); - - int DataDWORDSize = DataSize / sizeof(DWORD); - - DWORD AC_CRCNEW = 0; - DWORD MulBy = 1; - for (int i = 0; i < DataDWORDSize; i++) - { - if (MulBy >= AR_CRCPosCheckFrom && MulBy <= AR_CRCPosCheckTo) - { - DWORD Value = pAudioData[i]; - - QWORD CalcCRCNEW = (QWORD)Value * (QWORD)MulBy; - DWORD LOCalcCRCNEW = (DWORD)(CalcCRCNEW & (QWORD)0xFFFFFFFF); - DWORD HICalcCRCNEW = (DWORD)(CalcCRCNEW / (QWORD)0x100000000); - AC_CRCNEW+=HICalcCRCNEW; - AC_CRCNEW+=LOCalcCRCNEW; +static void compute_checksums(const uint32_t *audio_data, size_t audio_data_size, size_t track_number, size_t total_tracks, uint32_t *v1, uint32_t *v2) +{ + uint32_t csum_hi = 0; + uint32_t csum_lo = 0; + uint32_t AR_CRCPosCheckFrom = 0; + size_t Datauint32_tSize = audio_data_size / sizeof(uint32_t); + uint32_t AR_CRCPosCheckTo = Datauint32_tSize; + const size_t SectorBytes = 2352; // each sector + uint32_t MulBy = 1; + size_t i; + + if (track_number == 1) // first? + AR_CRCPosCheckFrom += ((SectorBytes * 5) / sizeof(uint32_t)); + if (track_number == total_tracks) // last? + AR_CRCPosCheckTo -= ((SectorBytes * 5) / sizeof(uint32_t)); + + for (i = 0; i < Datauint32_tSize; i++) { + if (MulBy >= AR_CRCPosCheckFrom && MulBy <= AR_CRCPosCheckTo) { + uint64_t product = (uint64_t)audio_data[i] * (uint64_t)MulBy; + csum_hi += (uint32_t)(product >> 32); + csum_lo += (uint32_t)(product); } - MulBy++; + MulBy++; } - return AC_CRCNEW; -} - -void print_syntax_to_stderr() { - fprintf(stderr, "Syntax: accuraterip-checksum [--version / --accuraterip-v1 / --accuraterip-v2 (default)] filename track_number total_tracks\n"); + *v1 = csum_lo; + *v2 = csum_lo + csum_hi; } -int main(int argc, const char** argv) { - int arg_offset; - bool use_v1; - - switch(argc) { - case 2: - if(strcmp(argv[1], "--version") != 0) { - print_syntax_to_stderr(); - return EXIT_FAILURE; - } - printf("accuraterip-checksum version %s\n", version); - return EXIT_SUCCESS; - case 4: - arg_offset = 0; - use_v1 = false; - break; - case 5: - arg_offset = 1; - if(!strcmp(argv[1], "--accuraterip-v1")) { - use_v1 = true; - } else if(!strcmp(argv[1], "--accuraterip-v2")) { - use_v1 = false; - } else { - print_syntax_to_stderr(); - return EXIT_FAILURE; - } - break; - default: - print_syntax_to_stderr(); - return EXIT_FAILURE; - } - - const char* filename = argv[1 + arg_offset]; - const char* track_number_string = argv[2 + arg_offset]; - const char* total_tracks_string = argv[3 + arg_offset]; +static PyObject *accuraterip_compute(PyObject *self, PyObject *args) +{ + const char *filename; + unsigned int track_number; + unsigned int total_tracks; + uint32_t v1, v2; + void *audio_data; + size_t size; + SF_INFO sfinfo; + SNDFILE *sndfile = NULL; - const int track_number = atoi(track_number_string); - const int total_tracks = atoi(total_tracks_string); + if (!PyArg_ParseTuple(args, "sII", &filename, &track_number, &total_tracks)) + goto err; - if(track_number < 1 || track_number > total_tracks) { + if (track_number < 1 || track_number > total_tracks) { fprintf(stderr, "Invalid track_number!\n"); - return EXIT_FAILURE; + goto err; } - if(total_tracks < 1 || total_tracks > 99) { + if (total_tracks < 1 || total_tracks > 99) { fprintf(stderr, "Invalid total_tracks!\n"); - return EXIT_FAILURE; + goto err; } #ifdef DEBUG printf("Reading %s\n", filename); #endif - SF_INFO sfinfo; - sfinfo.channels = 0; - sfinfo.format = 0; - sfinfo.frames = 0; - sfinfo.samplerate = 0; - sfinfo.sections = 0; - sfinfo.seekable = 0; - - SNDFILE* sndfile = sf_open(filename, SFM_READ, &sfinfo); - - if(sndfile == NULL) { + memset(&sfinfo, 0, sizeof(sfinfo)); + sndfile = sf_open(filename, SFM_READ, &sfinfo); + if (sndfile == NULL) { fprintf(stderr, "sf_open failed! sf_error==%i\n", sf_error(NULL)); - return EXIT_FAILURE; + goto err; } - if(!check_fileformat(&sfinfo)) { + if (!check_fileformat(&sfinfo)) { fprintf(stderr, "check_fileformat failed!\n"); - sf_close(sndfile); - return EXIT_FAILURE; + goto err; } - uint32_t* audio_data = load_full_audiodata(sndfile, &sfinfo); - if(audio_data == NULL) { + size = sfinfo.frames * sfinfo.channels * sizeof(uint16_t); + audio_data = load_full_audiodata(sndfile, &sfinfo, size); + if (audio_data == NULL) { fprintf(stderr, "load_full_audiodata failed!\n"); - sf_close(sndfile); - return EXIT_FAILURE; + goto err; } - const int checksum = use_v1 ? - compute_v1_checksum(audio_data, get_full_audiodata_size(&sfinfo), track_number, total_tracks) - : compute_v2_checksum(audio_data, get_full_audiodata_size(&sfinfo), track_number, total_tracks); + compute_checksums(audio_data, size, track_number, total_tracks, &v1, &v2); + free(audio_data); + sf_close(sndfile); - printf("%08X\n", checksum); + return Py_BuildValue("II", v1, v2); - sf_close(sndfile); - free(audio_data); +err: + if (sndfile) + sf_close(sndfile); + return Py_BuildValue("OO", Py_None, Py_None); +} + +static PyMethodDef accuraterip_methods[] = { + { "compute", accuraterip_compute, METH_VARARGS, "Compute AccurateRip v1 and v2 checksums" }, + { NULL, NULL, 0, NULL }, +}; - return EXIT_SUCCESS; +PyMODINIT_FUNC initaccuraterip(void) +{ + Py_InitModule("accuraterip", accuraterip_methods); } diff --git a/src/config.mk b/src/config.mk deleted file mode 100644 index 283d7455..00000000 --- a/src/config.mk +++ /dev/null @@ -1,11 +0,0 @@ -VERSION = 1.4 - -# paths -PREFIX = /usr/local - -# flags -CFLAGS = -std=c99 -LDFLAGS = -lsndfile - -# compiler and linker -CC = cc diff --git a/whipper/command/offset.py b/whipper/command/offset.py index 9b59bf6d..9e1f61f6 100644 --- a/whipper/command/offset.py +++ b/whipper/command/offset.py @@ -190,12 +190,7 @@ def _arcs(self, runner, table, track, offset): track, offset) runner.run(t) - v1 = arc.accuraterip_checksum( - path, track, len(table.tracks), wave=True, v2=False - ) - v2 = arc.accuraterip_checksum( - path, track, len(table.tracks), wave=True, v2=True - ) + v1, v2 = arc.accuraterip_checksum(path, track, len(table.tracks)) os.unlink(path) return "%08x" % v1, "%08x" % v2 diff --git a/whipper/common/accurip.py b/whipper/common/accurip.py index 40199a6a..6133ad75 100644 --- a/whipper/common/accurip.py +++ b/whipper/common/accurip.py @@ -110,19 +110,14 @@ def calculate_checksums(track_paths): logger.debug('checksumming %d tracks', track_count) # This is done sequentially because it is very fast. for i, path in enumerate(track_paths): - v1_sum = accuraterip_checksum( - path, i+1, track_count, wave=True, v2=False - ) - if not v1_sum: + v1_sum, v2_sum = accuraterip_checksum(path, i+1, track_count) + if v1_sum is None: logger.error('could not calculate AccurateRip v1 checksum ' 'for track %d %r', i + 1, path) v1_checksums.append(None) else: v1_checksums.append("%08x" % v1_sum) - v2_sum = accuraterip_checksum( - path, i+1, track_count, wave=True, v2=True - ) - if not v2_sum: + if v2_sum is None: logger.error('could not calculate AccurateRip v2 checksum ' 'for track %d %r', i + 1, path) v2_checksums.append(None) diff --git a/whipper/program/arc.py b/whipper/program/arc.py index 46b8fdf2..9e6134a5 100644 --- a/whipper/program/arc.py +++ b/whipper/program/arc.py @@ -1,54 +1,5 @@ -from subprocess import Popen, PIPE +import accuraterip -import logging -logger = logging.getLogger(__name__) -ARB = 'accuraterip-checksum' -FLAC = 'flac' - - -def _execute(cmd, **redirects): - logger.debug('executing %r', cmd) - return Popen(cmd, **redirects) - - -def accuraterip_checksum(f, track_number, total_tracks, wave=False, v2=False): - v = '--accuraterip-v1' - if v2: - v = '--accuraterip-v2' - - track_number, total_tracks = str(track_number), str(total_tracks) - - if wave: - cmd = [ARB, v, f, track_number, total_tracks] - redirects = dict(stdout=PIPE, stderr=PIPE) - else: - flac = _execute([FLAC, '-cds', f], stdout=PIPE) - cmd = [ARB, v, '/dev/stdin', track_number, total_tracks] - redirects = dict(stdin=flac.stdout, stdout=PIPE, stderr=PIPE) - arc = _execute(cmd, **redirects) - - if not wave: - flac.stdout.close() - - out, _ = arc.communicate() - - if not wave: - flac.wait() - if flac.returncode != 0: - logger.warning('ARC calculation failed: flac ' - 'return code is non zero: %r', flac.returncode) - return None - - if arc.returncode != 0: - logger.warning('ARC calculation failed: ' - 'arc return code is non zero: %r', arc.returncode) - return None - - try: - checksum = int('0x%s' % out.strip(), base=16) - logger.debug('returned %r', checksum) - return checksum - except ValueError: - logger.warning('ARC output is not usable') - return None +def accuraterip_checksum(f, track_number, total_tracks): + return accuraterip.compute(f.encode('utf-8'), track_number, total_tracks) From f68b91bc401dbab1a508005a5131721ea559b509 Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Sun, 20 Oct 2019 15:20:35 +0200 Subject: [PATCH 65/79] accuraterip-checksum: Add and install backwards-compatible script Signed-off-by: Andreas Oberritter --- scripts/accuraterip-checksum | 35 +++++++++++++++++++++++++++++++++++ setup.py | 3 +++ 2 files changed, 38 insertions(+) create mode 100644 scripts/accuraterip-checksum diff --git a/scripts/accuraterip-checksum b/scripts/accuraterip-checksum new file mode 100644 index 00000000..9ad3999b --- /dev/null +++ b/scripts/accuraterip-checksum @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: GPL-3.0-only + +import accuraterip +import sys + + +if len(sys.argv) == 2 and sys.argv[1] == '--version': + print('accuraterip-checksum version 2.0') + exit(0) + +use_v1 = None +if len(sys.argv) == 4: + offset = 0 + use_v1 = False +elif len(sys.argv) == 5: + offset = 1 + if sys.argv[1] == '--accuraterip-v1': + use_v1 = True + elif sys.argv[1] == '--accuraterip-v2': + use_v1 = False + +if use_v1 is None: + print('Syntax: accuraterip-checksum [--version / --accuraterip-v1 / --accuraterip-v2 (default)] filename track_number total_tracks') + exit(1) + +filename = sys.argv[offset + 1] +track_number = int(sys.argv[offset + 2]) +total_tracks = int(sys.argv[offset + 3]) + +v1, v2 = accuraterip.compute(filename, track_number, total_tracks) +if use_v1: + print('%08X' % v1) +else: + print('%08X' % v2) diff --git a/setup.py b/setup.py index 051d0e62..d107f264 100644 --- a/setup.py +++ b/setup.py @@ -24,4 +24,7 @@ data_files=[ ('share/metainfo', ['com.github.whipper_team.Whipper.metainfo.xml']), ], + scripts=[ + 'scripts/accuraterip-checksum', + ], ) From 252a2e814156e53833eb3dcd00d6cfce317c06dd Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Sat, 21 Sep 2019 21:35:17 +0200 Subject: [PATCH 66/79] Use ittoc only for CDDB and MusicBrainz lookups The data from itable may be more accurate, because ittoc comes from getFastToc(). Signed-off-by: Andreas Oberritter --- whipper/command/cd.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 1c0130d1..ab10771f 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -443,17 +443,17 @@ def _ripIfNotRipped(number): logger.debug('HTOA peak %r is equal to the SILENT ' 'threshold, disregarding', trackResult.peak) self.itable.setFile(1, 0, None, - self.ittoc.getTrackStart(1), number) + self.itable.getTrackStart(1), number) logger.debug('unlinking %r', trackResult.filename) os.unlink(trackResult.filename) trackResult.filename = None logger.info('HTOA discarded, contains digital silence') else: self.itable.setFile(1, 0, trackResult.filename, - self.ittoc.getTrackStart(1), number) + self.itable.getTrackStart(1), number) else: self.itable.setFile(number, 1, trackResult.filename, - self.ittoc.getTrackLength(number), number) + self.itable.getTrackLength(number), number) self.program.saveRipResult() @@ -482,7 +482,7 @@ def _ripIfNotRipped(number): self.program.write_m3u(discName) try: - self.program.verifyImage(self.runner, self.ittoc) + self.program.verifyImage(self.runner, self.itable) except accurip.EntryNotFound: logger.warning('AccurateRip entry not found') From 342bce9be248cf1ea371c75dcdeba6db683e18da Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Sat, 21 Sep 2019 21:36:38 +0200 Subject: [PATCH 67/79] Make getFastToc() fast again. Broken since #345 was merged. Signed-off-by: Andreas Oberritter --- whipper/common/program.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/common/program.py b/whipper/common/program.py index e618a051..96686b09 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -96,7 +96,7 @@ def getFastToc(self, runner, device): logger.warning('cdrdao older than 1.2.3 has a pre-gap length bug.' ' See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=102171') # noqa: E501 - t = cdrdao.ReadTOCTask(device) + t = cdrdao.ReadTOCTask(device, fast_toc=True) runner.run(t) toc = t.toc.table From abf9a971e7a2f63fc2f021534810e01209c1782a Mon Sep 17 00:00:00 2001 From: Andreas Oberritter Date: Sun, 22 Sep 2019 14:21:50 +0200 Subject: [PATCH 68/79] Fix ripping discs with less than ten tracks Output lines of cdrdao for single digit track numbers start with a whitespace character. Broken since #345 was merged. Signed-off-by: Andreas Oberritter --- whipper/program/cdrdao.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/whipper/program/cdrdao.py b/whipper/program/cdrdao.py index f59ed383..9b36adab 100644 --- a/whipper/program/cdrdao.py +++ b/whipper/program/cdrdao.py @@ -19,7 +19,7 @@ _CRC_RE = re.compile( r"Found (?P[0-9]*) Q sub-channels with CRC errors") _BEGIN_CDRDAO_RE = re.compile(r"-" * 60) -_LAST_TRACK_RE = re.compile(r"^(?P[0-9]*)") +_LAST_TRACK_RE = re.compile(r"^[ ]?(?P[0-9]*)") _LEADOUT_RE = re.compile( r"^Leadout AUDIO\s*[0-9]\s*[0-9]*:[0-9]*:[0-9]*\([0-9]*\)") From 2e966a446d0dc9a7dc8342ef1dd5d33417ca008b Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Mon, 21 Oct 2019 14:00:00 +0000 Subject: [PATCH 69/79] Pass toc_path as argument in program.py Resolves #368. Signed-off-by: JoeLametta --- whipper/common/program.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/whipper/common/program.py b/whipper/common/program.py index 96686b09..5cb1e79d 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -126,9 +126,8 @@ def getTable(self, runner, cddbdiscid, mbdiscid, device, offset, logger.debug('getTable: cddbdiscid %s, mbdiscid %s not in cache ' 'for offset %s, reading table', cddbdiscid, mbdiscid, offset) - t = cdrdao.ReadTOCTask(device) + t = cdrdao.ReadTOCTask(device, toc_path=toc_path) t.description = "Reading table" - t.toc_path = toc_path runner.run(t) itable = t.toc.table tdict[offset] = itable From 948cde79219f58cc2687c14cc3e56e4c7cef5ce2 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Mon, 21 Oct 2019 16:00:00 +0000 Subject: [PATCH 70/79] Update README Signed-off-by: JoeLametta --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 60f01858..6c58e773 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,14 @@ [![GitHub Issues](https://img.shields.io/github/issues/whipper-team/whipper.svg)](https://github.com/whipper-team/whipper/issues) [![GitHub contributors](https://img.shields.io/github/contributors/whipper-team/whipper.svg)](https://github.com/whipper-team/whipper/graphs/contributors) -Whipper is a Python 2.7 CD-DA ripper based on the [morituri project](https://github.com/thomasvs/morituri) (_CDDA ripper for *nix systems aiming for accuracy over speed_). It enhances morituri which development seems to have halted merging old ignored pull requests, improving it with bugfixes and new features. +Whipper is a Python 2.7 CD-DA ripper based on the [morituri project](https://github.com/thomasvs/morituri) (_CDDA ripper for *nix systems aiming for accuracy over speed_). It started just as a fork of morituri - which development seems to have halted - merging old ignored pull requests, improving it with bugfixes and new features. Nowadays whipper's codebase diverges significantly from morituri's one. Whipper is currently developed and tested _only_ on Linux distributions but _may_ work fine on other *nix OSes too. In order to track whipper's latest changes it's advised to check its commit history (README and [CHANGELOG](#changelog) files may not be comprehensive). +We've nearly completed porting the codebase to Python 3 (Python 2 won't be supported anymore in future releases). If you would like to follow the progress of the port e/o help us with it, please check [pull request #411](https://github.com/whipper-team/whipper/pull/411). + ## Table of content - [Rationale](#rationale) @@ -120,7 +122,7 @@ Whipper relies on the following packages in order to run correctly and provide a - [cd-paranoia](https://www.gnu.org/software/libcdio/), for the actual ripping - To avoid bugs it's advised to use `cd-paranoia` versions ≥ **10.2+0.94+2-2** - - The package named `libcdio-utils`, available on Debian and Ubuntu, is affected by a bug: it doesn't include the `cd-paranoia` binary (needed by whipper). For more details see: [#888053 (Debian)](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888053), [#889803 (Debian)](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=889803) and [#1750264 (Ubuntu)](https://bugs.launchpad.net/ubuntu/+source/libcdio/+bug/1750264). + - The package named `libcdio-utils`, available on Debian and Ubuntu, is affected by a bug (except for Debian testing/sid): it doesn't include the `cd-paranoia` binary (needed by whipper). For more details see: [#888053 (Debian)](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888053), [#889803 (Debian)](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=889803) and [#1750264 (Ubuntu)](https://bugs.launchpad.net/ubuntu/+source/libcdio/+bug/1750264). - [cdrdao](http://cdrdao.sourceforge.net/), for session, TOC, pre-gap, and ISRC extraction - [GObject Introspection](https://wiki.gnome.org/Projects/GObjectIntrospection), to provide GLib-2.0 methods used by `task.py` - [PyGObject](https://pypi.org/project/PyGObject/), required by `task.py` @@ -129,7 +131,7 @@ Whipper relies on the following packages in order to run correctly and provide a - [python-setuptools](https://pypi.python.org/pypi/setuptools), for installation, plugins support - [python-requests](https://pypi.python.org/pypi/requests), for retrieving AccurateRip database entries - [pycdio](https://pypi.python.org/pypi/pycdio/), for drive identification (required for drive offset and caching behavior to be stored in the configuration file). - - To avoid bugs it's advised to use `pycdio` **0.20** or **0.21** with `libcdio` ≥ **0.90** ≤ **0.94** or `pycdio` **2.0.0** with `libcdio` **2.0.0**. All other combinations won't probably work. + - To avoid bugs it's advised to use the most recent `pycdio` version with the corresponding `libcdio` release or, if stuck to old pycdio versions, **0.20**/**0.21** with `libcdio` ≥ **0.90** ≤ **0.94**. All other combinations won't probably work. - [libsndfile](http://www.mega-nerd.com/libsndfile/), for reading wav files - [flac](https://xiph.org/flac/), for reading flac files - [sox](http://sox.sourceforge.net/), for track peak detection @@ -429,5 +431,6 @@ You can find us and talk about the project on: - [Redacted thread (official)](https://redacted.ch/forums.php?action=viewthread&threadid=150) Other relevant links: +- [Whipper - Hydrogenaudio Knowledgebase](https://wiki.hydrogenaud.io/index.php?title=Whipper) - [Repology: versions for whipper](https://repology.org/metapackage/whipper/versions) - [Unattended ripping using whipper (by Thomas McWork)](https://github.com/thomas-mc-work/most-possible-unattended-rip) From 35561b51e52b3a862b8f6c8a1f36a4bec04817e8 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Mon, 21 Oct 2019 16:30:00 +0000 Subject: [PATCH 71/79] Dockerfile: build newer libcdio version Signed-off-by: JoeLametta --- Dockerfile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3955cc63..c6d8ca72 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,26 +6,26 @@ RUN apt-get update \ libiso9660-dev python-pip swig make pkgconf \ eject locales \ autoconf libtool curl \ - && pip install pycdio==2.0.0 + && pip install pycdio==2.1.0 # libcdio-paranoia / libcdio-utils are wrongfully packaged in Debian, thus built manually # see https://github.com/whipper-team/whipper/pull/237#issuecomment-367985625 -RUN curl -o - 'https://ftp.gnu.org/gnu/libcdio/libcdio-2.0.0.tar.gz' | tar zxf - \ - && cd libcdio-2.0.0 \ +RUN curl -o - 'https://ftp.gnu.org/gnu/libcdio/libcdio-2.1.0.tar.bz2' | tar jxf - \ + && cd libcdio-2.1.0 \ && autoreconf -fi \ && ./configure --disable-dependency-tracking --disable-cxx --disable-example-progs --disable-static \ && make install \ && cd .. \ - && rm -rf libcdio-2.0.0 + && rm -rf libcdio-2.1.0 # Install cd-paranoia from tarball -RUN curl -o - 'https://ftp.gnu.org/gnu/libcdio/libcdio-paranoia-10.2+0.94+2.tar.gz' | tar zxf - \ - && cd libcdio-paranoia-10.2+0.94+2 \ +RUN curl -o - 'https://ftp.gnu.org/gnu/libcdio/libcdio-paranoia-10.2+2.0.0.tar.bz2' | tar jxf - \ + && cd libcdio-paranoia-10.2+2.0.0 \ && autoreconf -fi \ && ./configure --disable-dependency-tracking --disable-example-progs --disable-static \ && make install \ && cd .. \ - && rm -rf libcdio-paranoia-10.2+0.94+2 + && rm -rf libcdio-paranoia-10.2+2.0.0 RUN ldconfig From 45696443350e99a95965af11eaf1031ea3370208 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Tue, 22 Oct 2019 07:00:00 +0000 Subject: [PATCH 72/79] Separate out Release in log into two value map This allows log parsers to always extract correct information about the "artist" and "title" fields: previously that was a problem if either (or both) of those fields contained a "-" character. Fixes #416. Signed-off-by: JoeLametta --- whipper/result/logger.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/whipper/result/logger.py b/whipper/result/logger.py index 2d8e4e54..abacf72f 100644 --- a/whipper/result/logger.py +++ b/whipper/result/logger.py @@ -63,8 +63,9 @@ def logRip(self, ripResult, epoch): # CD metadata lines.append("CD metadata:") - lines.append(" Release: %s - %s" % - (ripResult.artist, ripResult.title)) + lines.append(" Release:") + lines.append(" Artist: %s" % ripResult.artist) + lines.append(" Title: %s" % ripResult.title) lines.append(" CDDB Disc ID: %s" % ripResult. table.getCDDBDiscId()) lines.append(" MusicBrainz Disc ID: %s" % ripResult. table.getMusicBrainzDiscId()) From 87a477a5d6ac04bb01f9f916eed2ff0b5373bde5 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 26 Oct 2019 08:00:00 +0000 Subject: [PATCH 73/79] Fix wrong logger call Introduced in 048a31e3483792a6ce5984af79e9afa167c5900a. Signed-off-by: JoeLametta --- whipper/program/utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/whipper/program/utils.py b/whipper/program/utils.py index 4d40eb40..dc1ce46a 100644 --- a/whipper/program/utils.py +++ b/whipper/program/utils.py @@ -14,8 +14,8 @@ def eject_device(device): # `eject device` prints nothing to stdout subprocess.check_output(['eject', device], stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: - logger.warning(e.cmd, 'returned with exit code: ', e.returncode, - e.output) + logger.warning("command '%s' returned with exit code '%d' (%s)", + ' '.join(e.cmd), e.returncode, e.output.rstrip()) def load_device(device): @@ -28,8 +28,8 @@ def load_device(device): subprocess.check_output(['eject', '-t', device], stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: - logger.warning(e.cmd, 'returned with exit code: ', e.returncode, - e.output) + logger.warning("command '%s' returned with exit code '%d' (%s)", + ' '.join(e.cmd), e.returncode, e.output.rstrip()) def unmount_device(device): From d9b49df0aa6f73676f76e2903085f77030065c58 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 26 Oct 2019 08:05:00 +0000 Subject: [PATCH 74/79] Whitespace fixes Signed-off-by: JoeLametta --- whipper/command/cd.py | 4 ++-- whipper/command/image.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index ab10771f..a6fa562b 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -42,7 +42,7 @@ TEMPLATE_DESCRIPTION = ''' Tracks are named according to the track template, filling in the variables -and adding the file extension. Variables exclusive to the track template are: +and adding the file extension. Variables exclusive to the track template are: - %t: track number - %a: track artist - %n: track title @@ -198,7 +198,7 @@ def doCommand(self): class Info(_CD): summary = "retrieve information about the currently inserted CD" - description = ("Display MusicBrainz, CDDB/FreeDB, and AccurateRip" + description = ("Display MusicBrainz, CDDB/FreeDB, and AccurateRip " "information for the currently inserted CD.") eject = False diff --git a/whipper/command/image.py b/whipper/command/image.py index 2c5517c3..89d326e2 100644 --- a/whipper/command/image.py +++ b/whipper/command/image.py @@ -70,7 +70,7 @@ def do(self): class Image(BaseCommand): summary = "handle images" description = """ -Handle disc images. Disc images are described by a .cue file. +Handle disc images. Disc images are described by a .cue file. Disc images can be verified. """ subcommands = { From 993dd6cc33cbcb3aa9cbf9f84feedc663285b75d Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Thu, 8 Aug 2019 16:00:00 +0000 Subject: [PATCH 75/79] Handle missing self.options for whipper cd info The attributes working_directory, disc_template, output_directory and offset are not defined during whipper cd info and they are only needed for ripping. self.program.getTable doesn't need output_path to gather the tocfile. Therefore, this part is excluded, if the attributes don't exist and an offset of 0 is used. Fixes issue #375. Co-authored-by: gorgobacka Signed-off-by: JoeLametta Signed-off-by: gorgobacka --- whipper/command/cd.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index a6fa562b..fbfe3b70 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -134,20 +134,23 @@ def do(self): return -1 # Change working directory before cdrdao's task - if self.options.working_directory is not None: + if getattr(self.options, 'working_directory', False): os.chdir(os.path.expanduser(self.options.working_directory)) - out_bpath = self.options.output_directory.decode('utf-8') - # Needed to preserve cdrdao's tocfile - out_fpath = self.program.getPath(out_bpath, - self.options.disc_template, - self.mbdiscid, - self.program.metadata) + if hasattr(self.options, 'output_directory'): + out_bpath = self.options.output_directory.decode('utf-8') + # Needed to preserve cdrdao's tocfile + out_fpath = self.program.getPath(out_bpath, + self.options.disc_template, + self.mbdiscid, + self.program.metadata) + else: + out_fpath = None # now, read the complete index table, which is slower + offset = getattr(self.options, 'offset', 0) self.itable = self.program.getTable(self.runner, self.ittoc.getCDDBDiscId(), self.ittoc.getMusicBrainzDiscId(), - self.device, self.options.offset, - out_fpath) + self.device, offset, out_fpath) assert self.itable.getCDDBDiscId() == self.ittoc.getCDDBDiscId(), \ "full table's id %s differs from toc id %s" % ( From 81af7a4d03a42a95f8e264c9ac3da6f81bc91e28 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sat, 26 Oct 2019 09:00:00 +0000 Subject: [PATCH 76/79] Update Dockerfile Signed-off-by: JoeLametta --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index c6d8ca72..998a40e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,8 +45,7 @@ RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment \ # install whipper RUN mkdir /whipper COPY . /whipper/ -RUN cd /whipper/src && make && make install \ - && cd /whipper && python2 setup.py install \ +RUN cd /whipper && python2 setup.py install \ && rm -rf /whipper \ && whipper -v From 862afffee99b7de92467786c59510c9da9deb379 Mon Sep 17 00:00:00 2001 From: itismadness Date: Mon, 16 Sep 2019 17:21:41 -0800 Subject: [PATCH 77/79] Use ruamel.yaml for formatting rip .log file - insert newlines after blocks of content - strip quotes around creation time and offset - Change offset value representation - Clarify logger regular expressions - Fix missing AccurateRip Summary field - Read usage of time.gmtime(epoch) for generating datetime string - fix missing dependency in travis - install pycdio with specific version separately Signed-off-by: itismadness --- .travis.yml | 5 +- requirements.txt | 1 + whipper/result/logger.py | 236 +++++++++++++++++++++------------------ 3 files changed, 130 insertions(+), 112 deletions(-) diff --git a/.travis.yml b/.travis.yml index 07289baf..952b6269 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,10 @@ install: - sudo apt-get -qq update - pip install --upgrade -qq pip - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libgirepository1.0-dev libiso9660-dev libsndfile1-dev sox swig libcdio-utils - - pip install musicbrainzngs mutagen pycdio==0.21 PyGObject requests setuptools setuptools_scm + # newer version of pydcio requires newer version of libcdio than travis has + - pip install pycdio==0.21 + # install rest of dependencies + - pip install -r requirements.txt # Testing dependencies - pip install twisted flake8 diff --git a/requirements.txt b/requirements.txt index c62bb6df..cdbc3733 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ mutagen pycdio>0.20 PyGObject requests +ruamel.yaml setuptools_scm diff --git a/whipper/result/logger.py b/whipper/result/logger.py index abacf72f..df277419 100644 --- a/whipper/result/logger.py +++ b/whipper/result/logger.py @@ -1,5 +1,8 @@ import time import hashlib +import re +import ruamel.yaml as yaml +from ruamel.yaml.comments import CommentedMap as OrderedDict import whipper @@ -16,68 +19,57 @@ class WhipperLogger(result.Logger): def log(self, ripResult, epoch=time.time()): """Returns big str: logfile joined text lines""" - lines = self.logRip(ripResult, epoch=epoch) - return "\n".join(lines) + return self.logRip(ripResult, epoch) def logRip(self, ripResult, epoch): """Returns logfile lines list""" - lines = [] + riplog = OrderedDict() # Ripper version - lines.append("Log created by: whipper %s (internal logger)" % - whipper.__version__) + riplog["Log created by"] = "whipper %s (internal logger)" % ( + whipper.__version__) # Rip date date = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(epoch)).strip() - lines.append("Log creation date: %s" % date) - lines.append("") + riplog["Log creation date"] = date # Rip technical settings - lines.append("Ripping phase information:") - lines.append(" Drive: %s%s (revision %s)" % ( - ripResult.vendor, ripResult.model, ripResult.release)) - lines.append(" Extraction engine: cdparanoia %s" % - ripResult.cdparanoiaVersion) - if ripResult.cdparanoiaDefeatsCache is None: - defeat = "null" - elif ripResult.cdparanoiaDefeatsCache: - defeat = "true" - else: - defeat = "false" - lines.append(" Defeat audio cache: %s" % defeat) - lines.append(" Read offset correction: %+d" % ripResult.offset) + data = OrderedDict() + + data["Drive"] = "%s%s (revision %s)" % ( + ripResult.vendor, ripResult.model, ripResult.release) + data["Extraction engine"] = "cdparanoia %s" % ( + ripResult.cdparanoiaVersion) + data["Defeat audio cache"] = ripResult.cdparanoiaDefeatsCache + data["Read offset correction"] = ripResult.offset + # Currently unsupported by the official cdparanoia package - over = "false" # Only implemented in whipper (ripResult.overread) - if ripResult.overread: - over = "true" - lines.append(" Overread into lead-out: %s" % over) + data["Overread into lead-out"] = True if ripResult.overread else False # Next one fully works only using the patched cdparanoia package # lines.append("Fill up missing offset samples with silence: true") - lines.append(" Gap detection: cdrdao %s" % ripResult.cdrdaoVersion) + data["Gap detection"] = "cdrdao %s" % ripResult.cdrdaoVersion - isCdr = "true" if ripResult.isCdr else "false" - lines.append(" CD-R detected: %s" % isCdr) - lines.append("") + data["CD-R detected"] = ripResult.isCdr + riplog["Ripping phase information"] = data # CD metadata - lines.append("CD metadata:") - lines.append(" Release:") - lines.append(" Artist: %s" % ripResult.artist) - lines.append(" Title: %s" % ripResult.title) - lines.append(" CDDB Disc ID: %s" % ripResult. table.getCDDBDiscId()) - lines.append(" MusicBrainz Disc ID: %s" % - ripResult. table.getMusicBrainzDiscId()) - lines.append(" MusicBrainz lookup URL: %s" % - ripResult. table.getMusicBrainzSubmitURL()) + release = OrderedDict() + release["Artist"] = ripResult.artist + release["Title"] = ripResult.title + data = OrderedDict() + data["Release"] = release + data["CDDB Disc ID"] = ripResult.table.getCDDBDiscId() + data["MusicBrainz Disc ID"] = ripResult.table.getMusicBrainzDiscId() + data["MusicBrainz lookup URL"] = ( + ripResult.table.getMusicBrainzSubmitURL()) if ripResult.metadata: - lines.append(" MusicBrainz Release URL: %s" % - ripResult.metadata.url) - lines.append("") + data["MusicBrainz Release URL"] = ripResult.metadata.url + riplog["CD metadata"] = data # TOC section - lines.append("TOC:") + data = OrderedDict() table = ripResult.table # Test for HTOA presence @@ -92,149 +84,171 @@ def logRip(self, ripResult, epoch): htoastart = htoa.absolute htoaend = table.getTrackEnd(0) htoalength = table.tracks[0].getIndex(1).absolute - htoastart - lines.append(" 0:") - lines.append(" Start: %s" % common.framesToMSF(htoastart)) - lines.append(" Length: %s" % common.framesToMSF(htoalength)) - lines.append(" Start sector: %d" % htoastart) - lines.append(" End sector: %d" % htoaend) - lines.append("") + track = OrderedDict() + track["Start"] = common.framesToMSF(htoastart) + track["Length"] = common.framesToMSF(htoalength) + track["Start sector"] = htoastart + track["End sector"] = htoaend + data[0] = track # For every track include information in the TOC for t in table.tracks: start = t.getIndex(1).absolute length = table.getTrackLength(t.number) end = table.getTrackEnd(t.number) - lines.append(" %d:" % t.number) - lines.append(" Start: %s" % common.framesToMSF(start)) - lines.append(" Length: %s" % common.framesToMSF(length)) - lines.append(" Start sector: %d" % start) - lines.append(" End sector: %d" % end) - lines.append("") + track = OrderedDict() + track["Start"] = common.framesToMSF(start) + track["Length"] = common.framesToMSF(length) + track["Start sector"] = start + track["End sector"] = end + data[t.number] = track + riplog["TOC"] = data # Tracks section - lines.append("Tracks:") + data = OrderedDict() duration = 0.0 for t in ripResult.tracks: if not t.filename: continue - track_lines, ARDB_entry, ARDB_match = self.trackLog(t) + track_dict, ARDB_entry, ARDB_match = self.trackLog(t) self._inARDatabase += int(ARDB_entry) self._accuratelyRipped += int(ARDB_match) - lines.extend(track_lines) - lines.append("") + data[t.number] = track_dict duration += t.testduration + t.copyduration + riplog["Tracks"] = data # Status report - lines.append("Conclusive status report:") - arHeading = " AccurateRip summary:" + data = OrderedDict() if self._inARDatabase == 0: - lines.append("%s None of the tracks are present in the " - "AccurateRip database" % arHeading) + message = ("None of the tracks are present in the " + "AccurateRip database") else: nonHTOA = len(ripResult.tracks) if ripResult.tracks[0].number == 0: nonHTOA -= 1 if self._accuratelyRipped == 0: - lines.append("%s No tracks could be verified as accurate " - "(you may have a different pressing from the " - "one(s) in the database)" % arHeading) + message = ("No tracks could be verified as accurate " + "(you may have a different pressing from the " + "one(s) in the database)") elif self._accuratelyRipped < nonHTOA: accurateTracks = nonHTOA - self._accuratelyRipped - lines.append("%s Some tracks could not be verified as " - "accurate (%d/%d got no match)" % ( - arHeading, accurateTracks, nonHTOA)) + message = ("Some tracks could not be verified as " + "accurate (%d/%d got no match)") % ( + accurateTracks, nonHTOA) else: - lines.append("%s All tracks accurately ripped" % arHeading) + message = "All tracks accurately ripped" + data["AccurateRip summary"] = message - hsHeading = " Health status:" if self._errors: - lines.append("%s There were errors" % hsHeading) + message = "There were errors" else: - lines.append("%s No errors occurred" % hsHeading) - lines.append(" EOF: End of status report") - lines.append("") + message = "No errors occurred" + data["Health Status"] = message + data["EOF"] = "End of status report" + riplog["Conclusive status report"] = data + + riplog = yaml.dump( + riplog, + default_flow_style=False, + width=4000, + Dumper=yaml.RoundTripDumper + ) + # Add a newline after the "Log creation date" line + riplog = re.sub( + r'^(Log creation date: .*)$', + "\\1\n", + riplog, + flags=re.MULTILINE + ) + # Add a newline after a dictionary ends and returns to top-level + riplog = re.sub( + r"^(\s{2})([^\n]*)\n([A-Z][^\n]+)", + "\\1\\2\n\n\\3", + riplog, + flags=re.MULTILINE + ) + # Add a newline after a track closes + riplog = re.sub( + r"^(\s{4}[^\n]*)\n(\s{2}[0-9]+)", + "\\1\n\n\\2", + riplog, + flags=re.MULTILINE + ) + # Remove single quotes around the "Log creation date" value + riplog = re.sub( + r"^(Log creation date: )'(.*)'", + "\\1\\2", + riplog, + flags=re.MULTILINE + ) # Log hash hasher = hashlib.sha256() - hasher.update("\n".join(lines).encode("utf-8")) - lines.append("SHA-256 hash: %s" % hasher.hexdigest().upper()) - lines.append("") - return lines + hasher.update(riplog.encode("utf-8")) + riplog += "\nSHA-256 hash: %s\n" % hasher.hexdigest().upper() + return riplog def trackLog(self, trackResult): """Returns Tracks section lines: data picked from trackResult""" - lines = [] - - # Track number - lines.append(" %d:" % trackResult.number) + track = OrderedDict() # Filename (including path) of ripped track - lines.append(" Filename: %s" % trackResult.filename) + track["Filename"] = trackResult.filename # Pre-gap length pregap = trackResult.pregap if pregap: - lines.append(" Pre-gap length: %s" % common.framesToMSF(pregap)) + track["Pre-gap length"] = common.framesToMSF(pregap) # Peak level peak = trackResult.peak / 32768.0 - lines.append(" Peak level: %.6f" % peak) + track["Peak level"] = float("%.6f" % peak) # Pre-emphasis status # Only implemented in whipper (trackResult.pre_emphasis) - preEmph = "true" if trackResult.pre_emphasis else "false" - lines.append(" Pre-emphasis: %s" % preEmph) + track["Pre-emphasis"] = trackResult.pre_emphasis # Extraction speed if trackResult.copyspeed: - lines.append(" Extraction speed: %.1f X" % ( - trackResult.copyspeed)) + track["Extraction speed"] = "%.1f X" % trackResult.copyspeed # Extraction quality if trackResult.quality and trackResult.quality > 0.001: - lines.append(" Extraction quality: %.2f %%" % - (trackResult.quality * 100.0, )) + track["Extraction quality"] = "%.2f %%" % ( + trackResult.quality * 100.0, ) # Ripper Test CRC if trackResult.testcrc is not None: - lines.append(" Test CRC: %08X" % trackResult.testcrc) + track["Test CRC"] = "%08X" % trackResult.testcrc # Ripper Copy CRC if trackResult.copycrc is not None: - lines.append(" Copy CRC: %08X" % trackResult.copycrc) + track["Copy CRC"] = "%08X" % trackResult.copycrc # AccurateRip track status ARDB_entry = 0 ARDB_match = 0 for v in ("v1", "v2"): + data = OrderedDict() if trackResult.AR[v]["DBCRC"]: - lines.append(" AccurateRip %s:" % v) ARDB_entry += 1 if trackResult.AR[v]["CRC"] == trackResult.AR[v]["DBCRC"]: - lines.append(" Result: Found, exact match") + data["Result"] = "Found, exact match" ARDB_match += 1 else: - lines.append(" Result: Found, NO exact match") - lines.append( - " Confidence: %d" % trackResult.AR[v]["DBConfidence"] - ) - lines.append( - " Local CRC: %s" % trackResult.AR[v]["CRC"].upper() - ) - lines.append( - " Remote CRC: %s" % trackResult.AR[v]["DBCRC"].upper() - ) + data["Result"] = "Found, NO exact match" + data["Confidence"] = trackResult.AR[v]["DBConfidence"] + data["Local CRC"] = trackResult.AR[v]["CRC"].upper() + data["Remote CRC"] = trackResult.AR[v]["DBCRC"].upper() elif trackResult.number != 0: - lines.append(" AccurateRip %s:" % v) - lines.append( - " Result: Track not present in AccurateRip database" - ) + data["Result"] = "Track not present in AccurateRip database" + track["AccurateRip %s" % v] = data # Check if Test & Copy CRCs are equal if trackResult.testcrc == trackResult.copycrc: - lines.append(" Status: Copy OK") + track["Status"] = "Copy OK" else: self._errors = True - lines.append(" Status: Error, CRC mismatch") - return lines, bool(ARDB_entry), bool(ARDB_match) + track["Status"] = "Error, CRC mismatch" + return track, bool(ARDB_entry), bool(ARDB_match) From 3cd2da79c37b7c91e7dd5cbd662a829c8e76bb0d Mon Sep 17 00:00:00 2001 From: itismadness Date: Sat, 26 Oct 2019 16:51:28 +0200 Subject: [PATCH 78/79] write unit test case for WhipperLogger Signed-off-by: itismadness --- whipper/test/test_result_logger.log | 80 +++++++++++++ whipper/test/test_result_logger.py | 169 ++++++++++++++++++++++++++++ 2 files changed, 249 insertions(+) create mode 100644 whipper/test/test_result_logger.log create mode 100644 whipper/test/test_result_logger.py diff --git a/whipper/test/test_result_logger.log b/whipper/test/test_result_logger.log new file mode 100644 index 00000000..bd780d70 --- /dev/null +++ b/whipper/test/test_result_logger.log @@ -0,0 +1,80 @@ +Log created by: whipper 0.7.4.dev87+gb71ec9f.d20191026 (internal logger) +Log creation date: 2019-10-26T14:25:02Z + +Ripping phase information: + Drive: HL-DT-STBD-RE WH14NS40 (revision 1.03) + Extraction engine: cdparanoia cdparanoia III 10.2 libcdio 2.0.0 x86_64-pc-linux-gnu + Defeat audio cache: true + Read offset correction: 6 + Overread into lead-out: false + Gap detection: cdrdao 1.2.4 + CD-R detected: false + +CD metadata: + Release: + Artist: Example - Symbol - Artist + Title: 'Album With: - Dashes' + CDDB Disc ID: c30bde0d + MusicBrainz Disc ID: eyjySLXGdKigAjY3_C0nbBmNUHc- + MusicBrainz lookup URL: https://musicbrainz.org/cdtoc/attach?toc=1+13+228039+150+16414+33638+51378+69369+88891+104871+121645+138672+160748+178096+194680+212628&tracks=13&id=eyjySLXGdKigAjY3_C0nbBmNUHc- + +TOC: + 1: + Start: 00:00:00 + Length: 03:36:64 + Start sector: 0 + End sector: 16263 + + 2: + Start: 03:36:64 + Length: 03:49:49 + Start sector: 16264 + End sector: 33487 + +Tracks: + 1: + Filename: ./soundtrack/Various Artists - Shark Tale - Motion Picture Soundtrack/01. Sean Paul & Ziggy Marley - Three Little Birds.flac + Peak level: 0.90036 + Pre-emphasis: + Extraction speed: 7.0 X + Extraction quality: 100.00 % + Test CRC: 0025D726 + Copy CRC: 0025D726 + AccurateRip v1: + Result: Found, exact match + Confidence: 14 + Local CRC: 95E6A189 + Remote CRC: 95E6A189 + AccurateRip v2: + Result: Found, exact match + Confidence: 11 + Local CRC: 113FA733 + Remote CRC: 113FA733 + Status: Copy OK + + 2: + Filename: ./soundtrack/Various Artists - Shark Tale - Motion Picture Soundtrack/02. Christina Aguilera feat. Missy Elliott - Car Wash (Shark Tale mix).flac + Peak level: 0.972351 + Pre-emphasis: + Extraction speed: 7.7 X + Extraction quality: 100.00 % + Test CRC: F77C14CB + Copy CRC: F77C14CB + AccurateRip v1: + Result: Found, exact match + Confidence: 14 + Local CRC: 0B3316DB + Remote CRC: 0B3316DB + AccurateRip v2: + Result: Found, exact match + Confidence: 10 + Local CRC: A0AE0E57 + Remote CRC: A0AE0E57 + Status: Copy OK + +Conclusive status report: + AccurateRip summary: All tracks accurately ripped + Health Status: No errors occurred + EOF: End of status report + +SHA-256 hash: 2B176D8C722989B25459160E335E5CC0C1A6813C9DA69F869B625FBF737C475E diff --git a/whipper/test/test_result_logger.py b/whipper/test/test_result_logger.py new file mode 100644 index 00000000..a6650586 --- /dev/null +++ b/whipper/test/test_result_logger.py @@ -0,0 +1,169 @@ +from __future__ import print_function +import hashlib +import os +import re +import unittest +import ruamel.yaml + +from whipper.result.result import TrackResult, RipResult +from whipper.result.logger import WhipperLogger + + +class MockImageTrack: + def __init__(self, number, start, end): + self.number = number + self.absolute = self.start = start + self.end = end + + def getIndex(self, num): + if num == 0: + raise KeyError + else: + return self + + +class MockImageTable: + """Mock of whipper.image.table.Table, with fake information.""" + def __init__(self): + self.tracks = [ + MockImageTrack(1, 0, 16263), + MockImageTrack(2, 16264, 33487) + ] + + def getCDDBDiscId(self): + return "c30bde0d" + + def getMusicBrainzDiscId(self): + return "eyjySLXGdKigAjY3_C0nbBmNUHc-" + + def getMusicBrainzSubmitURL(self): + return ( + "https://musicbrainz.org/cdtoc/attach?toc=1+13+228039+150+16414+" + "33638+51378+69369+88891+104871+121645+138672+160748+178096+194680" + "+212628&tracks=13&id=eyjySLXGdKigAjY3_C0nbBmNUHc-" + ) + + def getTrackLength(self, number): + return self.tracks[number-1].end - self.tracks[number-1].start + 1 + + def getTrackEnd(self, number): + return self.tracks[number-1].end + + +class LoggerTestCase(unittest.TestCase): + def setUp(self): + self.path = os.path.join(os.path.dirname(__file__)) + + def testLogger(self): + ripResult = RipResult() + ripResult.offset = 6 + ripResult.overread = False + ripResult.isCdr = False + ripResult.table = MockImageTable() + ripResult.artist = "Example - Symbol - Artist" + ripResult.title = "Album With: - Dashes" + ripResult.vendor = "HL-DT-STBD-RE " + ripResult.model = "WH14NS40" + ripResult.release = "1.03" + ripResult.cdrdaoVersion = "1.2.4" + ripResult.cdparanoiaVersion = ( + "cdparanoia III 10.2 " + "libcdio 2.0.0 x86_64-pc-linux-gnu" + ) + ripResult.cdparanoiaDefeatsCache = True + + trackResult = TrackResult() + trackResult.number = 1 + trackResult.filename = ( + "./soundtrack/Various Artists - Shark Tale - Motion Picture " + "Soundtrack/01. Sean Paul & Ziggy Marley - Three Little Birds.flac" + ) + trackResult.pregap = 0 + trackResult.peak = 29503 + trackResult.quality = 1 + trackResult.copyspeed = 7 + trackResult.testduration = 10 + trackResult.copyduration = 10 + trackResult.testcrc = 0x0025D726 + trackResult.copycrc = 0x0025D726 + trackResult.AR = { + "v1": { + "DBConfidence": 14, + "DBCRC": "95E6A189", + "CRC": "95E6A189" + }, + "v2": { + "DBConfidence": 11, + "DBCRC": "113FA733", + "CRC": "113FA733" + } + } + ripResult.tracks.append(trackResult) + + trackResult = TrackResult() + trackResult.number = 2 + trackResult.filename = ( + "./soundtrack/Various Artists - Shark Tale - Motion Picture " + "Soundtrack/02. Christina Aguilera feat. Missy Elliott - Car " + "Wash (Shark Tale mix).flac" + ) + trackResult.pregap = 0 + trackResult.peak = 31862 + trackResult.quality = 1 + trackResult.copyspeed = 7.7 + trackResult.testduration = 10 + trackResult.copyduration = 10 + trackResult.testcrc = 0xF77C14CB + trackResult.copycrc = 0xF77C14CB + trackResult.AR = { + "v1": { + "DBConfidence": 14, + "DBCRC": "0B3316DB", + "CRC": "0B3316DB" + }, + "v2": { + "DBConfidence": 10, + "DBCRC": "A0AE0E57", + "CRC": "A0AE0E57" + } + } + ripResult.tracks.append(trackResult) + logger = WhipperLogger() + actual = logger.log(ripResult) + actualLines = actual.splitlines() + expectedLines = open( + os.path.join(self.path, 'test_result_logger.log'), 'r' + ).read().splitlines() + # do not test on version line, date line, or SHA-256 hash line + self.assertListEqual(actualLines[2:-1], expectedLines[2:-1]) + + self.assertRegexpMatches( + actualLines[0], + re.compile(( + r'Log created by: whipper ' + r'[\d]+\.[\d]+.[\d]+\.dev[\w\.\+]+ \(internal logger\)' + )) + ) + self.assertRegexpMatches( + actualLines[1], + re.compile(( + r'Log creation date: ' + r'20[\d]{2}\-[\d]{2}\-[\d]{2}T[\d]{2}:[\d]{2}:[\d]{2}Z' + )) + ) + + yaml = ruamel.yaml.YAML() + parsedLog = yaml.load(actual) + self.assertEqual( + actual, + ruamel.yaml.dump( + parsedLog, + default_flow_style=False, + width=4000, + Dumper=ruamel.yaml.RoundTripDumper + ) + ) + self.assertEqual( + parsedLog['SHA-256 hash'], + hashlib.sha256("\n".join(actualLines[:-1])).hexdigest().upper() + ) From db9c44a7658f012657c8963da57711047b364388 Mon Sep 17 00:00:00 2001 From: JoeLametta Date: Sun, 27 Oct 2019 11:45:44 +0000 Subject: [PATCH 79/79] Push whipper v0.8.0 release Signed-off-by: JoeLametta --- CHANGELOG.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++--- COVERAGE | 54 ++++++++++++++++++++--------------------- README.md | 6 ++++- src/README.md | 15 ------------ 4 files changed, 95 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d66a72..ef10476b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,66 @@ ## [Unreleased](https://github.com/whipper-team/whipper/tree/HEAD) -[Full Changelog](https://github.com/whipper-team/whipper/compare/v0.7.3...HEAD) +[Full Changelog](https://github.com/whipper-team/whipper/compare/v0.8.0...HEAD) + +## [v0.8.0](https://github.com/whipper-team/whipper/tree/v0.8.0) (2019-10-27) +[Full Changelog](https://github.com/whipper-team/whipper/compare/v0.7.3...v0.8.0) + +**Fixed bugs:** + +- whipper bails out if MusicBrainz release group doesn’t have a type [\#396](https://github.com/whipper-team/whipper/issues/396) +- object has no attribute 'working\_directory' when running cd info [\#375](https://github.com/whipper-team/whipper/issues/375) +- Failure to rip CD: "ValueError: could not convert string to float: " [\#374](https://github.com/whipper-team/whipper/issues/374) +- "AttributeError: Program instance has no attribute '\_presult'" when ripping [\#369](https://github.com/whipper-team/whipper/issues/369) +- Drive analysis fails [\#361](https://github.com/whipper-team/whipper/issues/361) +- Eliminate warning "eject: CD-ROM tray close command failed" [\#354](https://github.com/whipper-team/whipper/issues/354) +- Flac file permissions [\#284](https://github.com/whipper-team/whipper/issues/284) + +**Closed issues:** + +- Separate out Release in log into two value map [\#416](https://github.com/whipper-team/whipper/issues/416) +- Network issue [\#412](https://github.com/whipper-team/whipper/issues/412) +- RequestsDependencyWarning: urllib3 \(1.25.2\) or chardet \(3.0.4\) doesn't match a supported version [\#400](https://github.com/whipper-team/whipper/issues/400) +- Run script after rip [\#394](https://github.com/whipper-team/whipper/issues/394) +- Add git/mercurial dependency to the README [\#386](https://github.com/whipper-team/whipper/issues/386) +- Include MusicBrainz Release ID in the log file [\#381](https://github.com/whipper-team/whipper/issues/381) +- Rip while entering MusicBrainz data [\#360](https://github.com/whipper-team/whipper/issues/360) +- Doesn't eject - "eject: unable to eject" \(but manual eject works\) [\#355](https://github.com/whipper-team/whipper/issues/355) +- Note in the whipper output/log if development version was used [\#337](https://github.com/whipper-team/whipper/issues/337) +- fedora 29, whipper 0.72, Error While Executing Any Command [\#332](https://github.com/whipper-team/whipper/issues/332) +- read-toc progress information [\#299](https://github.com/whipper-team/whipper/issues/299) +- ripping fails frequently, but not repeatably [\#290](https://github.com/whipper-team/whipper/issues/290) +- Look into adding more MusicBrainz identifiers to ripped files [\#200](https://github.com/whipper-team/whipper/issues/200) + +**Merged pull requests:** + +- Fix ripping discs with less than ten tracks [\#418](https://github.com/whipper-team/whipper/pull/418) ([mtdcr](https://github.com/mtdcr)) +- Make getFastToc\(\) fast again [\#417](https://github.com/whipper-team/whipper/pull/417) ([mtdcr](https://github.com/mtdcr)) +- Use ruamel.yaml for formatting and outputting rip .log file [\#415](https://github.com/whipper-team/whipper/pull/415) ([itismadness](https://github.com/itismadness)) +- Handle missing self.options for whipper cd info [\#410](https://github.com/whipper-team/whipper/pull/410) ([JoeLametta](https://github.com/JoeLametta)) +- Fix erroneous result message for whipper drive analyze [\#409](https://github.com/whipper-team/whipper/pull/409) ([JoeLametta](https://github.com/JoeLametta)) +- Report eject's failures as logger warnings [\#408](https://github.com/whipper-team/whipper/pull/408) ([JoeLametta](https://github.com/JoeLametta)) +- Set FLAC files permissions to 0644 [\#407](https://github.com/whipper-team/whipper/pull/407) ([JoeLametta](https://github.com/JoeLametta)) +- Fix offset find command [\#406](https://github.com/whipper-team/whipper/pull/406) ([vmx](https://github.com/vmx)) +- Make whipper not break on missing release type [\#398](https://github.com/whipper-team/whipper/pull/398) ([Freso](https://github.com/Freso)) +- Set default for eject to: success [\#392](https://github.com/whipper-team/whipper/pull/392) ([gorgobacka](https://github.com/gorgobacka)) +- Use eject value of the class again [\#391](https://github.com/whipper-team/whipper/pull/391) ([gorgobacka](https://github.com/gorgobacka)) +- Convert documentation from epydoc to reStructuredText [\#387](https://github.com/whipper-team/whipper/pull/387) ([JoeLametta](https://github.com/JoeLametta)) +- Include MusicBrainz Release URL in log output [\#382](https://github.com/whipper-team/whipper/pull/382) ([Freso](https://github.com/Freso)) +- Specify supported version\(s\) of Python in setup.py [\#378](https://github.com/whipper-team/whipper/pull/378) ([Freso](https://github.com/Freso)) +- Fix critical regressions introduced in 3e79032 and 16b0d8d [\#371](https://github.com/whipper-team/whipper/pull/371) ([JoeLametta](https://github.com/JoeLametta)) +- Use git to get whipper's version [\#370](https://github.com/whipper-team/whipper/pull/370) ([Freso](https://github.com/Freso)) +- Handle artist MBIDs as multivalue tags [\#367](https://github.com/whipper-team/whipper/pull/367) ([Freso](https://github.com/Freso)) +- Add Track, Release Group, and Work MBIDs to ripped files [\#366](https://github.com/whipper-team/whipper/pull/366) ([Freso](https://github.com/Freso)) +- Refresh MusicBrainz JSON responses used for testing [\#365](https://github.com/whipper-team/whipper/pull/365) ([Freso](https://github.com/Freso)) +- Clean up MusicBrainz nomenclature [\#364](https://github.com/whipper-team/whipper/pull/364) ([Freso](https://github.com/Freso)) +- Fix misaligned output in command.mblookup [\#363](https://github.com/whipper-team/whipper/pull/363) ([Freso](https://github.com/Freso)) +- Update accuraterip-checksum [\#362](https://github.com/whipper-team/whipper/pull/362) ([Freso](https://github.com/Freso)) +- Require Developer Certificate of Origin sign-off [\#358](https://github.com/whipper-team/whipper/pull/358) ([JoeLametta](https://github.com/JoeLametta)) +- Address warnings/errors from various static analysis tools [\#357](https://github.com/whipper-team/whipper/pull/357) ([JoeLametta](https://github.com/JoeLametta)) +- Clarify format option for disc template [\#353](https://github.com/whipper-team/whipper/pull/353) ([rekh127](https://github.com/rekh127)) +- Refactor cdrdao toc/table functions into Task and provide progress output [\#345](https://github.com/whipper-team/whipper/pull/345) ([jtl999](https://github.com/jtl999)) +- accuraterip-checksum: convert to python C extension [\#274](https://github.com/whipper-team/whipper/pull/274) ([mtdcr](https://github.com/mtdcr)) ## [v0.7.3](https://github.com/whipper-team/whipper/tree/v0.7.3) (2018-12-14) [Full Changelog](https://github.com/whipper-team/whipper/compare/v0.7.2...v0.7.3) @@ -15,7 +74,6 @@ - Possible HTOA error [\#281](https://github.com/whipper-team/whipper/issues/281) - Disc template KeyError [\#279](https://github.com/whipper-team/whipper/issues/279) - Enhanced CD causes computer to freeze. [\#256](https://github.com/whipper-team/whipper/issues/256) -- pycdio & libcdio issues [\#238](https://github.com/whipper-team/whipper/issues/238) - Unicode issues [\#215](https://github.com/whipper-team/whipper/issues/215) - whipper offset find exception [\#208](https://github.com/whipper-team/whipper/issues/208) - ZeroDivisionError: float division by zero [\#202](https://github.com/whipper-team/whipper/issues/202) @@ -26,7 +84,9 @@ - On Ubuntu 18.10 cd-paranoia binary is called cdparanoia [\#347](https://github.com/whipper-team/whipper/issues/347) - WARNING:whipper.common.program:network error: NetworkError\(\) [\#338](https://github.com/whipper-team/whipper/issues/338) - Can not install [\#314](https://github.com/whipper-team/whipper/issues/314) +- use standard logging [\#303](https://github.com/whipper-team/whipper/issues/303) - Write musicbrainz\_discid tag when disc is unknown [\#280](https://github.com/whipper-team/whipper/issues/280) +- pycdio & libcdio issues [\#238](https://github.com/whipper-team/whipper/issues/238) - Write .toc files in addition to .cue files to support cdrdao and non-compliant .cue sheets [\#214](https://github.com/whipper-team/whipper/issues/214) **Merged pull requests:** @@ -198,7 +258,6 @@ - Add flake8 testing to CI [\#151](https://github.com/whipper-team/whipper/pull/151) ([Freso](https://github.com/Freso)) - Clean up files in misc/ [\#150](https://github.com/whipper-team/whipper/pull/150) ([Freso](https://github.com/Freso)) - Update .gitignore [\#148](https://github.com/whipper-team/whipper/pull/148) ([Freso](https://github.com/Freso)) -- Fix references to morituri. [\#109](https://github.com/whipper-team/whipper/pull/109) ([Freso](https://github.com/Freso)) ## [v0.5.1](https://github.com/whipper-team/whipper/tree/v0.5.1) (2017-04-24) [Full Changelog](https://github.com/whipper-team/whipper/compare/v0.5.0...v0.5.1) @@ -271,6 +330,7 @@ **Merged pull requests:** +- Fix references to morituri. [\#109](https://github.com/whipper-team/whipper/pull/109) ([Freso](https://github.com/Freso)) - Small cleanups of setup.py [\#102](https://github.com/whipper-team/whipper/pull/102) ([Freso](https://github.com/Freso)) - Persist False value for defeats\_cache correctly [\#98](https://github.com/whipper-team/whipper/pull/98) ([ribbons](https://github.com/ribbons)) - Update suggested commands given by `drive list` [\#97](https://github.com/whipper-team/whipper/pull/97) ([ribbons](https://github.com/ribbons)) diff --git a/COVERAGE b/COVERAGE index c51cd12f..1014e46d 100644 --- a/COVERAGE +++ b/COVERAGE @@ -1,55 +1,55 @@ -Coverage.py 4.5.2 text report against whipper v0.7.3 +Coverage.py 4.5.4 text report against whipper v0.8.0 $ coverage run --branch --omit='whipper/test/*' --source=whipper -m unittest discover $ coverage report -m Name Stmts Miss Branch BrPart Cover Missing ----------------------------------------------------------------------------- -whipper/__init__.py 10 2 4 2 71% 9, 11, 8->9, 10->11 +whipper/__init__.py 15 5 4 2 63% 9-12, 16, 18, 15->16, 17->18 whipper/__main__.py 7 7 2 0 0% 4-14 whipper/command/__init__.py 0 0 0 0 100% -whipper/command/accurip.py 43 43 18 0 0% 21-92 -whipper/command/basecommand.py 69 53 30 0 16% 56-114, 121-130, 133, 136, 139, 142-145 -whipper/command/cd.py 224 186 58 0 13% 71-79, 84-193, 196, 208, 231-284, 291-318, 321-491 +whipper/command/accurip.py 41 41 18 0 0% 21-90 +whipper/command/basecommand.py 69 29 30 8 53% 70, 72, 76, 82-88, 98-102, 107-114, 127, 129, 133, 139, 142-145, 68->70, 71->72, 75->76, 80->82, 96->98, 106->107, 126->127, 128->129 +whipper/command/cd.py 227 189 60 0 13% 72-80, 85-196, 199, 212, 236-288, 295-322, 325-496 whipper/command/drive.py 57 57 10 0 0% 21-107 whipper/command/image.py 38 38 6 0 0% 21-76 -whipper/command/main.py 68 68 22 0 0% 4-115 -whipper/command/mblookup.py 28 28 8 0 0% 1-41 -whipper/command/offset.py 110 110 32 0 0% 21-221 +whipper/command/main.py 68 68 22 0 0% 4-116 +whipper/command/mblookup.py 29 3 8 2 86% 21-23, 35->37, 37->28 +whipper/command/offset.py 110 110 32 0 0% 21-219 whipper/common/__init__.py 0 0 0 0 100% -whipper/common/accurip.py 133 5 54 5 95% 121, 130, 139-141, 116->121, 125->130, 155->158, 246->252, 255->261 -whipper/common/cache.py 105 50 34 6 44% 66-90, 96, 99, 107-112, 115-116, 132, 144-148, 171-178, 202-207, 212-228, 95->96, 98->99, 131->132, 142->152, 143->144, 170->171 +whipper/common/accurip.py 132 5 54 5 95% 119, 125, 134-136, 114->119, 120->125, 150->153, 241->247, 250->256 +whipper/common/cache.py 104 49 34 6 44% 66-90, 96, 99, 108-111, 114-115, 131, 143-147, 170-177, 201-206, 211-227, 95->96, 98->99, 130->131, 141->151, 142->143, 169->170 whipper/common/checksum.py 26 14 2 0 43% 41-42, 45-46, 49-64 -whipper/common/common.py 150 28 38 6 78% 51-52, 119-120, 143-144, 162-169, 181, 275-280, 287-292, 329-333, 118->119, 131->134, 180->181, 190->197, 271->275, 327->335 -whipper/common/config.py 92 8 18 4 89% 105-106, 124-125, 131, 141, 143, 145, 130->131, 140->141, 142->143, 144->145 +whipper/common/common.py 150 28 38 6 78% 51-52, 119-120, 143-144, 162-169, 181, 274-279, 286-291, 328-332, 118->119, 131->134, 180->181, 190->197, 271->274, 326->334 +whipper/common/config.py 91 8 18 4 89% 105-106, 124-125, 131, 141, 143, 145, 130->131, 140->141, 142->143, 144->145 whipper/common/directory.py 21 8 10 2 55% 29, 39, 44-51, 28->29, 38->39 whipper/common/drive.py 31 20 6 0 35% 35-40, 44-50, 54-60, 64-71 whipper/common/encode.py 44 23 2 0 46% 37-38, 41-42, 45-46, 53-56, 59-60, 63-64, 76-77, 80-81, 84-91 -whipper/common/mbngs.py 159 53 58 7 66% 38-39, 45, 90-96, 157-158, 163-164, 208, 211, 214, 237-239, 248, 268-322, 156->157, 162->163, 207->208, 210->211, 213->214, 236->237, 245->248 +whipper/common/mbngs.py 174 52 66 7 70% 38-39, 45, 93-99, 174-175, 180-181, 227, 233, 258-260, 269, 289-344, 159->158, 173->174, 179->180, 226->227, 232->233, 257->258, 266->269 whipper/common/path.py 24 0 8 3 91% 42->45, 52->57, 62->67 -whipper/common/program.py 337 259 110 5 20% 85-87, 93-100, 109-141, 150-155, 158, 162-166, 211, 222-223, 225-229, 245-260, 268-380, 391-442, 450-458, 461-476, 487-527, 539-556, 559-577, 580-590, 593-601, 77->80, 208->211, 221->222, 224->225, 231->235 -whipper/common/renamer.py 102 2 16 1 97% 135, 158, 60->68 -whipper/common/task.py 77 19 14 2 75% 47-52, 86-87, 90-93, 101, 114-115, 122, 128, 134, 140, 146, 84->86, 98->101 +whipper/common/program.py 346 268 112 5 19% 85-87, 93-104, 113-147, 156-161, 164, 169-173, 218, 229-230, 232-236, 253-268, 276-387, 398-456, 464-472, 476-491, 502-542, 554-571, 574-592, 595-605, 608-616, 76->79, 215->218, 228->229, 231->232, 238->242 +whipper/common/renamer.py 102 2 16 1 97% 133, 156, 58->66 +whipper/common/task.py 77 19 14 2 75% 47-52, 86-87, 91-94, 102, 115-116, 123, 129, 135, 141, 147, 84->86, 99->102 whipper/extern/__init__.py 0 0 0 0 100% whipper/extern/asyncsub.py 130 71 66 12 40% 15-17, 32, 37-38, 47-84, 89-102, 115, 122, 134, 145, 151, 156-160, 164-176, 14->15, 35->37, 45->47, 110->113, 114->115, 121->122, 133->134, 139->141, 141->152, 144->145, 148->151, 163->164 -whipper/extern/freedb.py 104 83 38 1 17% 49, 57-58, 61, 64, 84-162, 170-222, 56->57 +whipper/extern/freedb.py 104 83 38 1 17% 49, 57-58, 61, 64, 84-163, 171-223, 56->57 whipper/extern/task/__init__.py 0 0 0 0 100% -whipper/extern/task/task.py 277 116 54 11 54% 57, 61, 81, 87, 153-155, 174-176, 184-200, 218-221, 241-242, 283-284, 287-293, 308-309, 317-319, 328-335, 341-357, 361, 364, 371-388, 399-400, 403-406, 410, 413, 428, 431-433, 449, 461, 506-511, 520-525, 536-544, 547-555, 558-559, 567, 572-574, 56->57, 60->61, 69->71, 152->153, 166->exit, 217->218, 231->233, 236->exit, 496->498, 533->536, 571->572 +whipper/extern/task/task.py 271 115 54 11 53% 54, 58, 79, 87, 153-155, 174-176, 184-200, 218-221, 242-243, 284-285, 288-294, 309-310, 318-320, 329-336, 342-359, 363, 366, 373-390, 401-402, 405-408, 412, 415, 430, 433-435, 451, 463, 509-514, 521-526, 535-543, 546-554, 557-558, 566, 571-573, 53->54, 57->58, 66->68, 152->153, 166->exit, 217->218, 231->233, 236->exit, 498->500, 532->535, 570->571 whipper/image/__init__.py 0 0 0 0 100% whipper/image/cue.py 91 9 20 3 89% 99, 116-117, 132-134, 159, 187, 205, 98->99, 115->116, 131->132 -whipper/image/image.py 117 94 18 0 17% 49-57, 65-67, 74-107, 121-153, 156-172, 183-213 -whipper/image/table.py 398 22 114 16 93% 237, 346-347, 499, 578, 663-664, 684-685, 694-697, 701-702, 747, 793-794, 796-797, 841-842, 847-849, 180->183, 498->499, 532->536, 555->558, 577->578, 585->592, 683->684, 692->698, 693->694, 722->726, 726->721, 746->747, 792->793, 795->796, 840->841, 846->847 +whipper/image/image.py 116 93 18 0 17% 49-57, 65-67, 74-107, 121-154, 157-173, 184-214 +whipper/image/table.py 395 18 114 16 93% 238, 497, 576, 661-662, 682-683, 692-695, 746, 792-793, 795-796, 840-841, 846-848, 181->184, 496->497, 530->534, 553->556, 575->576, 583->590, 681->682, 690->696, 691->692, 720->724, 724->719, 745->746, 791->792, 794->795, 839->840, 845->846 whipper/image/toc.py 203 16 60 10 90% 134, 261-262, 278-281, 339-341, 363-365, 385, 409, 439, 130->134, 212->220, 260->261, 277->278, 287->292, 323->330, 338->339, 362->363, 372->376, 404->409 whipper/program/__init__.py 0 0 0 0 100% -whipper/program/arc.py 38 15 12 4 58% 26-28, 32, 37-41, 48-54, 22->26, 31->32, 36->37, 43->48 -whipper/program/cdparanoia.py 315 185 86 3 39% 48-50, 59-60, 124-126, 163-166, 199-200, 242-256, 259-310, 313-351, 354-358, 361-397, 452-504, 509-554, 587-590, 593, 600, 606, 611-616, 123->124, 599->600, 603->606 -whipper/program/cdrdao.py 59 36 14 2 34% 26-56, 63-69, 79-81, 85-87, 95, 102, 78->79, 84->85 +whipper/program/arc.py 3 0 0 0 100% +whipper/program/cdparanoia.py 309 180 78 2 39% 48-50, 59-60, 124-126, 198-199, 239-253, 256-306, 309-347, 350-354, 357-393, 447-500, 505-552, 586-589, 592, 599, 607-612, 123->124, 598->599 +whipper/program/cdrdao.py 114 75 34 2 28% 33-58, 80-86, 90-105, 108-137, 140-144, 147-161, 168-171, 181-183, 187-189, 180->181, 186->187 whipper/program/flac.py 9 5 0 0 44% 12-19 whipper/program/sox.py 17 4 4 2 71% 18-19, 23-24, 17->18, 22->23 whipper/program/soxi.py 28 2 2 1 90% 36, 49, 48->49 -whipper/program/utils.py 16 10 2 0 33% 11-12, 19-20, 30-35 +whipper/program/utils.py 23 16 2 0 28% 12-17, 25-31, 42-47 whipper/result/__init__.py 0 0 0 0 100% -whipper/result/logger.py 148 148 48 0 0% 1-242 -whipper/result/result.py 56 13 6 0 69% 112-116, 134, 144-145, 154-161 +whipper/result/logger.py 144 23 40 16 78% 68, 84-92, 112, 123, 128, 130, 134-135, 143, 202, 240, 244-245, 252-253, 67->68, 83->84, 111->112, 122->123, 127->128, 129->130, 133->134, 142->143, 201->202, 213->217, 217->222, 222->226, 226->230, 234->244, 236->240, 249->252 +whipper/result/result.py 57 13 6 0 70% 115-119, 137, 148-149, 158-165 ----------------------------------------------------------------------------- -TOTAL 3961 1910 1104 108 49% +TOTAL 3997 1766 1108 129 53% diff --git a/README.md b/README.md index 6c58e773..4c5e5993 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,8 @@ https://web.archive.org/web/20160528213242/https://thomas.apestaart.org/thomas/t - Performs Test & Copy rips - Verifies rip accuracy using the [AccurateRip database](http://www.accuraterip.com/) - Uses [MusicBrainz](https://musicbrainz.org/doc/About) for metadata lookup -- Supports reading the [pre-emphasis](http://wiki.hydrogenaud.io/index.php?title=Pre-emphasis) flag embedded into some CDs (and correctly tags the resulting rip). _Currently whipper only reports the pre-emphasis flag value stored in the TOC._ +- Supports reading the [pre-emphasis](http://wiki.hydrogenaud.io/index.php?title=Pre-emphasis) flag embedded into some CDs (and correctly tags the resulting rip) + - _Currently whipper only reports the pre-emphasis flag value stored in the TOC_ - Detects and rips _non digitally silent_ [Hidden Track One Audio](http://wiki.hydrogenaud.io/index.php?title=HTOA) (HTOA) - Provides batch ripping capabilities - Provides templates for file and directory naming @@ -110,6 +111,8 @@ This is a noncomprehensive summary which shows whipper's packaging status (unoff [![Packaging status](https://repology.org/badge/vertical-allrepos/whipper.svg)](https://repology.org/metapackage/whipper) +Someone also packaged whipper as snap: [unofficial snap on snapcraft](https://snapcraft.io/whipper). + In case you decide to install whipper using an unofficial repository just keep in mind it is your responsibility to verify that the provided content is safe to use. ## Building @@ -132,6 +135,7 @@ Whipper relies on the following packages in order to run correctly and provide a - [python-requests](https://pypi.python.org/pypi/requests), for retrieving AccurateRip database entries - [pycdio](https://pypi.python.org/pypi/pycdio/), for drive identification (required for drive offset and caching behavior to be stored in the configuration file). - To avoid bugs it's advised to use the most recent `pycdio` version with the corresponding `libcdio` release or, if stuck to old pycdio versions, **0.20**/**0.21** with `libcdio` ≥ **0.90** ≤ **0.94**. All other combinations won't probably work. +- [ruamel.yaml](https://pypi.org/project/ruamel.yaml/), for generating well formed YAML report logfiles - [libsndfile](http://www.mega-nerd.com/libsndfile/), for reading wav files - [flac](https://xiph.org/flac/), for reading flac files - [sox](http://sox.sourceforge.net/), for track peak detection diff --git a/src/README.md b/src/README.md index 9b004613..afdcdfc8 100644 --- a/src/README.md +++ b/src/README.md @@ -32,21 +32,6 @@ For compiling you need: libsndfile1-dev -## Compiling - -### Using GNU Make -```shell -make clean -make -``` - -### Using Eclipse -The configuration files of an Eclipse project are included. -You can use "EGit" (Eclipse git) to import the whole repository. -It should as well ask you to import the project configuration then. - -The Eclipse configuration is currently unmaintained, using GNU Make is preferred. - ## Author Leo Bogert (http://leo.bogert.de)