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
Example #4
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
Example #10
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
Example #13
0
    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"