Ejemplo n.º 1
0
    def test_serialize_recording(self):
        """Tests that recordings are serialized properly."""
        # Without any includes
        recording = serialize_recording(recording_numb_encore_explicit)
        self.assertDictEqual(
            recording, {
                'length': 205.28,
                'id': 'daccb724-8023-432a-854c-e0accb6c8678',
                'name': 'Numb/Encore (explicit)',
            })

        # With artists included
        recording = serialize_recording(recording_numb_encore_explicit,
                                        includes={'artists'})
        self.assertDictEqual(
            recording, {
                'id':
                'daccb724-8023-432a-854c-e0accb6c8678',
                'name':
                'Numb/Encore (explicit)',
                'length':
                205.28,
                'artists': [{
                    'id': 'f82bcf78-5b69-4622-a5ef-73800768d9ac',
                    'name': 'JAY Z',
                    'credited_name': 'Jay-Z',
                    'join_phrase': '/'
                }, {
                    'id': 'f59c5520-5f46-4d2c-b2c4-822eabf53419',
                    'name': 'Linkin Park'
                }]
            })
    def test_serialize_recording(self):
        """Tests that recordings are serialized properly."""
        # Without any includes
        recording = serialize_recording(recording_numb_encore_explicit)
        self.assertDictEqual(recording,
                             {
                                 'length': 205.28,
                                 'id': 'daccb724-8023-432a-854c-e0accb6c8678',
                                 'name': 'Numb/Encore (explicit)',
                             }
                             )

        # With artists included
        recording = serialize_recording(recording_numb_encore_explicit, includes={'artists'})
        self.assertDictEqual(recording,
                             {
                                 'id': 'daccb724-8023-432a-854c-e0accb6c8678',
                                 'name': 'Numb/Encore (explicit)',
                                 'length': 205.28,
                                 'artists': [
                                     {
                                         'id': 'f82bcf78-5b69-4622-a5ef-73800768d9ac',
                                         'name': 'JAY Z',
                                         'credited_name': 'Jay-Z',
                                         'join_phrase': '/'
                                     },
                                     {
                                         'id': 'f59c5520-5f46-4d2c-b2c4-822eabf53419',
                                         'name': 'Linkin Park'
                                     }
                                 ]
                             }
                             )
Ejemplo n.º 3
0
def _fetch_multiple_recordings(mbids, includes=None):
    """ Fetch multiple recordings with MusicBrainz IDs.

    Args:
        mbids (list): list of uuid (MBID(gid)) of the recordings.
        includes (list): List of values to be included.
                        For list of possible values visit https://bitbucket.org/lalinsky/mbdata/wiki/API/v1/includes#!recording
    Returns:
        Dictionary containing the recording information with MBIDs as keys.
            - id: Recording mbid
            - name: Name of the recording
            - length: length of the recording
            - artists:
                - artist information: id, name, credited_name and join_phrase
    """
    if includes is None:
        includes = []
    includes_data = defaultdict(dict)
    check_includes('recording', includes)

    with mb_session() as db:
        query = db.query(Recording)

        if 'artist' in includes or 'artists' in includes:
            query = query.options(joinedload("artist_credit", innerjoin=True))

        if 'artists' in includes:
            query = query.\
            options(subqueryload("artist_credit.artists")).\
            options(joinedload("artist_credit.artists.artist", innerjoin=True))

        recordings = get_entities_by_gids(
            query=query,
            entity_type='recording',
            mbids=mbids,
        )

        recording_ids = [recording.id for recording in recordings.values()]

        if 'artist' in includes:
            for recording in recordings.values():
                includes_data[recording.id]['artist'] = recording.artist_credit

        if 'artists' in includes:
            for recording in recordings.values():
                includes_data[
                    recording.id]['artists'] = recording.artist_credit.artists

        serial_recordings = {
            str(mbid): serialize_recording(recordings[mbid],
                                           includes_data[recordings[mbid].id])
            for mbid in mbids
        }

    return serial_recordings
Ejemplo n.º 4
0
def _fetch_multiple_recordings(mbids, includes=None):
    """ Fetch multiple recordings with MusicBrainz IDs.

    Args:
        mbids (list): list of uuid (MBID(gid)) of the recordings.
        includes (list): List of values to be included.
                        For list of possible values visit https://bitbucket.org/lalinsky/mbdata/wiki/API/v1/includes#!recording
    Returns:
        Dictionary containing the recording information with MBIDs as keys.
            - id: Recording mbid
            - name: Name of the recording
            - length: length of the recording
            - artists:
                - artist information: id, name, credited_name and join_phrase
    """
    if includes is None:
        includes = []
    includes_data = defaultdict(dict)
    check_includes('recording', includes)

    with mb_session() as db:
        query = db.query(Recording)
        
        if 'artist' in includes or 'artists' in includes:
            query = query.options(joinedload("artist_credit", innerjoin=True))

        if 'artists' in includes:
            query = query.\
            options(subqueryload("artist_credit.artists")).\
            options(joinedload("artist_credit.artists.artist", innerjoin=True))

        recordings = get_entities_by_gids(
            query=query,
            entity_type='recording',
            mbids=mbids,
        )

        recording_ids = [recording.id for recording in recordings.values()]

        if 'artist' in includes:
            for recording in recordings.values():
                includes_data[recording.id]['artist'] = recording.artist_credit

        if 'artists' in includes:
            for recording in recordings.values():
                includes_data[recording.id]['artists'] = recording.artist_credit.artists

        serial_recordings = {str(mbid): serialize_recording(recordings[mbid], includes_data[recordings[mbid].id]) for mbid in mbids}

    return serial_recordings