def test_ensure_conformity(self): # Test artists alist = [ Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']), Artist(mbids=['73a9d0db-0ec7-490e-9a85-0525a5ccef8e']) ] blist = [Artist(mbids=['a1c35a51-d102-4ce7-aefb-79a361e843b6'])] assert troi.operations._ensure_conformity(alist, blist) == True alist = [ Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']), Artist(mbids=['73a9d0db-0ec7-490e-9a85-0525a5ccef8e']) ] blist = [Release(mbid='a1c35a51-d102-4ce7-aefb-79a361e843b6')] with self.assertRaises(TypeError): troi.operations._ensure_conformity(alist, blist) # Test recording (not testing release since rel and rec use same code) alist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd'), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e') ] blist = [Recording(mbid='a1c35a51-d102-4ce7-aefb-79a361e843b6')] assert troi.operations._ensure_conformity(alist, blist) == True alist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd'), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e') ] blist = [Release(mbid='a1c35a51-d102-4ce7-aefb-79a361e843b6')] with self.assertRaises(TypeError): troi.operations._ensure_conformity(alist, blist)
def test_is_homogeneous(self): alist = [] assert troi.operations.is_homogeneous(alist) == True alist = [Artist(), Artist()] assert troi.operations.is_homogeneous(alist) == True alist = [Artist(), Release()] assert troi.operations.is_homogeneous(alist) == False
def test_artist_credit_filter_include(self): rlist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd', artist=Artist(artist_credit_id=65)), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e', artist=Artist(artist_credit_id=197)) ] alist = [ 197 ] e = troi.filters.ArtistCreditFilterElement(alist, include=True) flist = e.read([rlist]) assert len(flist) == 1 assert flist[0].artist.artist_credit_id == 197 assert flist[0].mbid == "73a9d0db-0ec7-490e-9a85-0525a5ccef8e" alist = [ 1 ] e = troi.filters.ArtistCreditFilterElement(alist, include=True) flist = e.read([rlist]) assert len(flist) == 0
def read(self, inputs): data = [{ 'area_id': self.area_id, 'start_year': self.start_year, 'end_year': self.end_year }] r = requests.post(self.SERVER_URL, json=data) if r.status_code != 200: raise PipelineError( "Cannot fetch area random recordings from ListenBrainz. HTTP code %s" % r.status_code) try: rows = ujson.loads(r.text) except ValueError as err: raise PipelineError( "Cannot fetch area random recordings from ListenBrainz. Invalid JSON returned: " + str(err)) recordings = [] for row in rows: recordings.append( Recording(mbid=row['recording_mbid'], name=row['recording_name'], year=row['year'], artist=Artist( name=row['artist_credit_name'], artist_credit_id=row['artist_credit_id']))) return recordings
def test_union(self): # Test artists alist = [Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd'])] blist = [Artist(mbids=['a1c35a51-d102-4ce7-aefb-79a361e843b6'])] e = troi.operations.UnionElement() ulist = e.read([alist, blist]) assert len(ulist) == 2 assert ulist[0].mbids == ['8756f690-18ca-488d-a456-680fdaf234bd'] assert ulist[1].mbids == ['a1c35a51-d102-4ce7-aefb-79a361e843b6'] # Test recording (not testing release since rel and rec use same code) alist = [Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd')] blist = [Recording(mbid='a1c35a51-d102-4ce7-aefb-79a361e843b6')] ulist = e.read([alist, blist]) assert len(ulist) == 2 assert ulist[0].mbid == '8756f690-18ca-488d-a456-680fdaf234bd' assert ulist[1].mbid == 'a1c35a51-d102-4ce7-aefb-79a361e843b6'
def test_artist_credit_filter(self): rlist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd', artist=Artist(artist_credit_id=65)), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e', artist=Artist(artist_credit_id=197)) ] alist = [Artist(artist_credit_id=65)] e = troi.operations.ArtistCreditFilterElement() flist = e.read([rlist, alist]) assert len(flist) == 1 assert flist[0].artist.artist_credit_id == 65 assert flist[0].mbid == "8756f690-18ca-488d-a456-680fdaf234bd" alist = [Artist(artist_credit_id=1)] flist = e.read([rlist, alist]) assert len(flist) == 0
def test_artist_credit_limiter_higher_ranked(self): rlist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd', artist=Artist(artist_credit_id=65), ranking=1.0), Recording(mbid='139654ae-2c02-4e0f-aee0-c47da6e59ff1', artist=Artist(artist_credit_id=65), ranking=.5), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e', artist=Artist(artist_credit_id=197), ranking=.1) ] e = troi.filters.ArtistCreditLimiterElement(1) flist = e.read([rlist]) assert len(flist) == 2 assert flist[0].artist.artist_credit_id == 65 assert flist[0].mbid == "8756f690-18ca-488d-a456-680fdaf234bd" assert flist[1].artist.artist_credit_id == 197 assert flist[1].mbid == "73a9d0db-0ec7-490e-9a85-0525a5ccef8e" e = troi.filters.ArtistCreditLimiterElement(1, exclude_lower_ranked=False) flist = e.read([rlist]) assert len(flist) == 2 assert flist[0].artist.artist_credit_id == 65 assert flist[0].mbid == "139654ae-2c02-4e0f-aee0-c47da6e59ff1" assert flist[1].artist.artist_credit_id == 197 assert flist[1].mbid == "73a9d0db-0ec7-490e-9a85-0525a5ccef8e"
def read(self, inputs=[]): artist_list = [] artists = self.client.get_user_artists(self.user_name, self.count, self.offset, self.time_range) for a in artists['payload']['artists']: artist_list.append( Artist(a['artist_name'], mbids=a['artist_mbids'], msid=a['artist_msid'])) return artist_list
def test_intersection(self): # Test artists alist = [ Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']), Artist(mbids=['73a9d0db-0ec7-490e-9a85-0525a5ccef8e']) ] blist = [Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd'])] e = troi.operations.IntersectionElement('mbid') with self.assertRaises(ValueError): ilist = e.read([alist, blist]) e = troi.operations.IntersectionElement('mbids') ilist = e.read([alist, blist]) assert len(ilist) == 1 assert ilist[0].mbids == blist[0].mbids alist = [Artist(mbids=['73a9d0db-0ec7-490e-9a85-0525a5ccef8e'])] blist = [Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd'])] ilist = e.read([alist, blist]) assert len(ilist) == 0 # Test recording (not testing release since rel and rec use same code) alist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd'), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e') ] blist = [Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd')] e = troi.operations.IntersectionElement('mbids') with self.assertRaises(ValueError): ilist = e.read([alist, blist]) e = troi.operations.IntersectionElement('mbid') ilist = e.read([alist, blist]) assert len(ilist) == 1 assert ilist[0].mbid == blist[0].mbid alist = [Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e')] blist = [Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd')] ilist = e.read([alist, blist]) assert len(ilist) == 0
def test_artist(self): a = Artist() assert a.mbids is None assert a.msid is None assert a.name is None assert a.artist_credit_id is None with self.assertRaises(TypeError): a = Artist(mbids="not a list") a = Artist("Portishead", ["8fe3f1d4-b6d5-4726-89ad-926e3420b9e3"], "97b01626-65fc-4c32-b30c-c4d7eab1b339", ranking=1.0) assert a.name == "Portishead" assert a.mbids == ["8fe3f1d4-b6d5-4726-89ad-926e3420b9e3"] assert a.msid == "97b01626-65fc-4c32-b30c-c4d7eab1b339" assert a.ranking == 1.0 a = Artist("Portishead", ["afe3f1d4-b6d5-4726-89ad-926e3420b9e3", "97b01626-65fc-4c32-b30c-c4d7eab1b339"]) assert len(a.mbids) assert a.mbids[0] == "97b01626-65fc-4c32-b30c-c4d7eab1b339" assert a.mbids[1] == "afe3f1d4-b6d5-4726-89ad-926e3420b9e3" a = Artist("Portishead", artist_credit_id=65) assert a.artist_credit_id == 65 a = Artist(listenbrainz={ 1 : 2}, musicbrainz={ 3 : 4}, acousticbrainz={ 5 : 6}) assert a.lb[1] == 2 assert a.mb[3] == 4 assert a.ab[5] == 6 assert a.name is None assert a.mbid is None assert a.msid is None
def read(self, inputs): recordings = inputs[0] if not recordings: return [] data = [] for r in recordings: data.append({'[recording_mbid]': r.mbid}) self.debug("- debug %d recordings" % len(recordings)) r = requests.post(self.SERVER_URL % len(recordings), json=data) if r.status_code != 200: raise PipelineError( "Cannot fetch recordings from ListenBrainz: HTTP code %d" % r.status_code) try: rows = ujson.loads(r.text) self.debug("- debug %d rows in response" % len(rows)) except ValueError as err: raise PipelineError("Cannot fetch recordings from ListenBrainz: " + str(err)) mbid_index = {} for row in rows: mbid_index[row['original_recording_mbid']] = row for r in recordings: try: row = mbid_index[r.mbid] except KeyError: self.debug("- debug recording MBID %s not found, skipping." % r.mbid) continue if not r.artist: a = Artist(name=row['artist_credit_name'], mbids=row.get('[artist_credit_mbids]', []), artist_credit_id=row['artist_credit_id']) r.artist = a else: r.artist.name = row['artist_credit_name'] r.artist.mbids = row.get('[artist_credit_mbids]', []), r.artist.artist_credit_id = row['artist_credit_id'] r.name = row['recording_name'] r.length = row['length'] r.mbid = row['recording_mbid'] return recordings
def read(self, inputs=[]): release_list = [] releases = self.client.get_user_releases(self.user_name, self.count, self.offset, self.time_range) for r in releases['payload']['releases']: artist = Artist(r['artist_name'], mbids=r['artist_mbids'], msid=r['artist_msid']) release_list.append( Release(r['release_name'], mbid=r['release_mbid'], msid=r['release_msid'], artist=artist)) return release_list
def read(self, inputs): recordings = inputs[0] if not recordings: return [] data = [] r_mbids = ",".join([r.mbid for r in recordings]) for r in recordings: data.append({'recording_mbid': r.mbid}) r = requests.post(self.SERVER_URL, json=data) if r.status_code != 200: r.raise_for_status() try: rows = ujson.loads(r.text) except Exception as err: raise RuntimeError(str(err)) mbid_index = {} for row in rows: mbid_index[row['recording_mbid']] = row for r in recordings: if mbid_index.get(r.mbid) == None: continue row = mbid_index[r.mbid] if not r.artist: a = Artist(name=row['artist_credit_name'], mbids=row['[artist_credit_mbids]'], artist_credit_id=row['artist_credit_id']) r.artist = a else: r.artist.name = row['artist_credit_name'] r.artist.mbids = row['artist_credit_mbids'] r.artist.artist_credit_id = row['artist_credit_id'] r.name = row['recording_name'] r.length = row['length'] print(" MB recording lookup: read %d recordings" % len(recordings)) return recordings
def test_difference(self): # Test artists alist = [ Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']), Artist(mbids=['73a9d0db-0ec7-490e-9a85-0525a5ccef8e']) ] blist = [Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd'])] e = troi.operations.DifferenceElement('mbid') with self.assertRaises(ValueError): ilist = e.read([alist, blist]) e = troi.operations.DifferenceElement('mbids') ilist = e.read([alist, blist]) assert len(ilist) == 1 assert ilist[0].mbids == ['73a9d0db-0ec7-490e-9a85-0525a5ccef8e'] alist = [ Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']), Artist(mbids=['73a9d0db-0ec7-490e-9a85-0525a5ccef8e']) ] blist = [Artist(mbids=['a1c35a51-d102-4ce7-aefb-79a361e843b6'])] dlist = e.read([alist, blist]) assert len(dlist) == 2 assert dlist[0].mbids == ['8756f690-18ca-488d-a456-680fdaf234bd'] assert dlist[1].mbids == ['73a9d0db-0ec7-490e-9a85-0525a5ccef8e'] # Test recording (not testing release since rel and rec use same code) alist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd'), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e') ] blist = [Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd')] e = troi.operations.DifferenceElement('mbids') with self.assertRaises(ValueError): ilist = e.read([alist, blist]) e = troi.operations.DifferenceElement('mbid') ilist = e.read([alist, blist]) assert len(ilist) == 1 assert ilist[0].mbid == '73a9d0db-0ec7-490e-9a85-0525a5ccef8e' alist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd'), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e') ] blist = [Recording(mbid='a1c35a51-d102-4ce7-aefb-79a361e843b6')] dlist = e.read([alist, blist]) assert len(dlist) == 2 assert dlist[0].mbid == '8756f690-18ca-488d-a456-680fdaf234bd' assert dlist[1].mbid == '73a9d0db-0ec7-490e-9a85-0525a5ccef8e'
def read(self, inputs): recordings = inputs[0] if not recordings: return [] r_mbids = ",".join([ r.mbid for r in recordings ]) url = self.SERVER_URL + "?[recording_mbid]=" + quote(r_mbids) r = requests.get(url) if r.status_code != 200: r.raise_for_status() try: rows = ujson.loads(r.text) except Exception as err: raise RuntimeError(str(err)) mbid_index = {} for row in rows: mbid_index[row['recording_mbid']] = row for r in recordings: row = mbid_index[r.mbid] if not r.artist: a = Artist(name=row['artist_credit_name'], mbids=row['artist_credit_mbids'], artist_credit_id=row['artist_credit_id']) r.artist = a else: r.artist.name = row['artist_credit_name'] r.artist.mbids = row['artist_credit_mbids'] r.artist.artist_credit_id = row['artist_credit_id'] r.name = row['recording_name'] r.length = row['length'] print(" MB recording lookup: read %d recordings" % len(recordings)) return recordings
def test_unique(self): # Test artists alist = [ Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']), Artist(mbids=['a1c35a51-d102-4ce7-aefb-79a361e843b6']) ] e = troi.operations.UniqueElement('mbids') u_alist = e.read([alist]) assert len(u_alist) == 2 alist = [ Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']), Artist(mbids=['8756f690-18ca-488d-a456-680fdaf234bd']) ] e = troi.operations.UniqueElement('mbids') u_alist = e.read([alist]) assert len(u_alist) == 1 assert u_alist[0].mbids == ['8756f690-18ca-488d-a456-680fdaf234bd'] alist = [Artist(artist_credit_id=65), Artist(artist_credit_id=65)] e = troi.operations.UniqueElement('artist_credit_id') u_alist = e.read([alist]) assert len(u_alist) == 1 assert u_alist[0].artist_credit_id == 65 # Test recording (not testing release since rel and rec use same code) rlist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd'), Recording(mbid='a1c35a51-d102-4ce7-aefb-79a361e843b6') ] e = troi.operations.UniqueElement('mbids') with self.assertRaises(ValueError): u_rlist = e.read([rlist]) e = troi.operations.UniqueElement('mbid') u_rlist = e.read([rlist]) assert len(u_rlist) == 2 rlist = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd'), Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd') ] u_rlist = e.read([rlist]) assert len(u_rlist) == 1 assert u_rlist[0].mbid == '8756f690-18ca-488d-a456-680fdaf234bd'
def test_artist_credit_limiter_playlist(self): p = Playlist("test playlist") p.recordings = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd', artist=Artist(artist_credit_id=65), ranking=1.0), Recording(mbid='139654ae-2c02-4e0f-aee0-c47da6e59ff1', artist=Artist(artist_credit_id=65), ranking=.5), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e', artist=Artist(artist_credit_id=197), ranking=.1) ] p2 = Playlist("test playlist 2") p2.recordings = [ Recording(mbid='8756f690-18ca-488d-a456-680fdaf234bd', artist=Artist(artist_credit_id=48), ranking=1.0), Recording(mbid='73a9d0db-0ec7-490e-9a85-0525a5ccef8e', artist=Artist(artist_credit_id=197), ranking=.1), Recording(mbid='139654ae-2c02-4e0f-aee0-c47da6e59ff1', artist=Artist(artist_credit_id=48), ranking=.5)] e = troi.filters.ArtistCreditLimiterElement(1) plist = e.read([[p, p2]]) assert len(plist) == 2 assert len(plist[0].recordings) == 2 assert plist[0].recordings[0].artist.artist_credit_id == 65 assert plist[0].recordings[0].mbid == "8756f690-18ca-488d-a456-680fdaf234bd" assert plist[0].recordings[1].artist.artist_credit_id == 197 assert plist[0].recordings[1].mbid == "73a9d0db-0ec7-490e-9a85-0525a5ccef8e" assert len(plist[1].recordings) == 2 assert plist[1].recordings[0].artist.artist_credit_id == 48 assert plist[1].recordings[0].mbid == "8756f690-18ca-488d-a456-680fdaf234bd" assert plist[1].recordings[1].artist.artist_credit_id == 197 assert plist[1].recordings[1].mbid == "73a9d0db-0ec7-490e-9a85-0525a5ccef8e"