def browse_release_groups(*, artist_id, release_types=None, limit=None, offset=None): """Get all release groups linked to an artist. Args: artist_id (uuid): MBID of the artist. release_types (list): List of types of release groups to be fetched. limit (int): Max number of release groups to return. offset (int): Offset that can be used in conjunction with the limit. Returns: Tuple containing the list of dictionaries of release groups ordered by release year and the total count of the release groups. """ artist_id = str(artist_id) includes_data = defaultdict(dict) if release_types is None: release_types = [] release_types = [release_type.capitalize() for release_type in release_types] key = cache.gen_key(artist_id, limit, offset, *release_types) release_groups = cache.get(key) if not release_groups: with mb_session() as db: release_groups_query = _browse_release_groups_query(db, artist_id, release_types) count = release_groups_query.count() release_groups = release_groups_query.order_by( case([(models.ReleaseGroupMeta.first_release_date_year.is_(None), 1)], else_=0), models.ReleaseGroupMeta.first_release_date_year.desc() ).limit(limit).offset(offset).all() for release_group in release_groups: includes_data[release_group.id]['meta'] = release_group.meta release_groups = ([to_dict_release_groups(release_group, includes_data[release_group.id]) for release_group in release_groups], count) cache.set(key=key, val=release_groups, time=DEFAULT_CACHE_EXPIRATION) return release_groups
def fetch_multiple_places(mbids, *, includes=None): """Get info related to multiple places using their MusicBrainz IDs. Args: mbids (list): List of MBIDs of places. includes (list): List of information to be included. Returns: Dictionary containing info of multiple places keyed by their mbid. """ if includes is None: includes = [] includes_data = defaultdict(dict) check_includes('place', includes) with mb_session() as db: query = db.query(models.Place).\ options(joinedload("area")).\ options(joinedload("type")) places = get_entities_by_gids( query=query, entity_type='place', mbids=mbids, ) place_ids = [place.id for place in places.values()] if 'artist-rels' in includes: get_relationship_info( db=db, target_type='artist', source_type='place', source_entity_ids=place_ids, includes_data=includes_data, ) if 'place-rels' in includes: get_relationship_info( db=db, target_type='place', source_type='place', source_entity_ids=place_ids, includes_data=includes_data, ) if 'url-rels' in includes: get_relationship_info( db=db, target_type='url', source_type='place', source_entity_ids=place_ids, includes_data=includes_data, ) for place in places.values(): includes_data[place.id]['area'] = place.area includes_data[place.id]['type'] = place.type places = {str(mbid): to_dict_places(places[mbid], includes_data[places[mbid].id]) for mbid in mbids} return places
def fetch_multiple_releases(mbids, *, includes=None): """Get info related to multiple releases using their MusicBrainz IDs. Args: mbids (list): List of MBIDs of releases. includes (list): List of information to be included. Returns: Dictionary containing info of multiple releases keyed by their mbid. """ if includes is None: includes = [] includes_data = defaultdict(dict) check_includes('release', includes) with mb_session() as db: query = db.query(models.Release) if 'release-groups' in includes: query = query.options(joinedload('release_group')) if 'media' in includes: # Fetch media with tracks query = query.options(joinedload('mediums')).\ options(joinedload('mediums.tracks')).\ options(joinedload('mediums.format')).\ options(joinedload('mediums.tracks.recording')) releases = get_entities_by_gids( query=query, entity_type='release', mbids=mbids, ) release_ids = [release.id for release in releases.values()] if 'release-groups' in includes: for release in releases.values(): includes_data[ release.id]['release-groups'] = release.release_group if 'media' in includes: for release in releases.values(): includes_data[release.id]['media'] = release.mediums if 'url-rels' in includes: get_relationship_info( db=db, target_type='url', source_type='release', source_entity_ids=release_ids, includes_data=includes_data, ) releases = { str(mbid): to_dict_releases(releases[mbid], includes_data[releases[mbid].id]) for mbid in mbids } return releases
def browse_releases(*, release_group_id, includes=None): """Get all the releases by a certain release group. You need to provide the Release Group's MusicBrainz ID. """ if includes is None: includes = [] with mb_session() as db: release_ids = db.query(models.Release.gid).\ join(models.ReleaseGroup).\ filter(models.ReleaseGroup.gid == release_group_id).all() release_ids = [release_id[0] for release_id in release_ids] releases = fetch_multiple_releases(release_ids, includes=includes) return releases
def fetch_multiple_artists(mbids, *, includes=None): """Get info related to multiple artists using their MusicBrainz IDs. Args: mbids (list): List of MBIDs of artists. includes (list): List of information to be included. Returns: Dictionary containing info of multiple artists keyed by their mbid. """ if includes is None: includes = [] includes_data = defaultdict(dict) check_includes('artist', includes) with mb_session() as db: query = db.query(models.Artist).\ options(joinedload("type")) artists = get_entities_by_gids( query=query, entity_type='artist', mbids=mbids, ) artist_ids = [artist.id for artist in artists.values()] if 'artist-rels' in includes: get_relationship_info( db=db, target_type='artist', source_type='artist', source_entity_ids=artist_ids, includes_data=includes_data, ) if 'url-rels' in includes: get_relationship_info( db=db, target_type='url', source_type='artist', source_entity_ids=artist_ids, includes_data=includes_data, ) for artist in artists.values(): includes_data[artist.id]['type'] = artist.type artists = { str(mbid): to_dict_artists(artists[mbid], includes_data[artists[mbid].id]) for mbid in mbids } return artists
def fetch_multiple_releases(mbids, *, includes=None): """Get info related to multiple releases using their MusicBrainz IDs. Args: mbids (list): List of MBIDs of releases. includes (list): List of information to be included. Returns: Dictionary containing info of multiple releases keyed by their mbid. """ if includes is None: includes = [] includes_data = defaultdict(dict) check_includes('release', includes) with mb_session() as db: query = db.query(models.Release) if 'release-groups' in includes: query = query.options(joinedload('release_group')) if 'media' in includes: # Fetch media with tracks query = query.options(joinedload('mediums')).\ options(joinedload('mediums.tracks')).\ options(joinedload('mediums.format')).\ options(joinedload('mediums.tracks.recording')) releases = get_entities_by_gids( query=query, entity_type='release', mbids=mbids, ) release_ids = [release.id for release in releases.values()] if 'release-groups' in includes: for release in releases.values(): includes_data[release.id]['release-groups'] = release.release_group if 'media' in includes: for release in releases.values(): includes_data[release.id]['media'] = release.mediums if 'url-rels' in includes: get_relationship_info( db=db, target_type='url', source_type='release', source_entity_ids=release_ids, includes_data=includes_data, ) releases = {str(mbid): to_dict_releases(releases[mbid], includes_data[releases[mbid].id]) for mbid in mbids} return releases
def fetch_multiple_events(mbids, *, includes=None): """Get info related to multiple events using their MusicBrainz IDs. Args: mbids (list): List of MBIDs of events. includes (list): List of information to be included. Returns: Dictionary containing info of multiple events keyed by their mbid. """ if includes is None: includes = [] includes_data = defaultdict(dict) check_includes('event', includes) with mb_session() as db: query = db.query(models.Event) events = get_entities_by_gids( query=query, entity_type='event', mbids=mbids, ) event_ids = [event.id for event in events.values()] if 'artist-rels' in includes: get_relationship_info( db=db, target_type='artist', source_type='event', source_entity_ids=event_ids, includes_data=includes_data, ) if 'place-rels' in includes: get_relationship_info( db=db, target_type='place', source_type='event', source_entity_ids=event_ids, includes_data=includes_data, ) if 'series-rels' in includes: get_relationship_info( db=db, target_type='series', source_type='event', source_entity_ids=event_ids, includes_data=includes_data, ) if 'url-rels' in includes: get_relationship_info( db=db, target_type='url', source_type='event', source_entity_ids=event_ids, includes_data=includes_data, ) if 'release-group-rels' in includes: get_relationship_info( db=db, target_type='release_group', source_type='event', source_entity_ids=event_ids, includes_data=includes_data, ) return {str(mbid): to_dict_events(events[mbid], includes_data[events[mbid].id]) for mbid in mbids}
def fetch_multiple_release_groups(mbids, *, includes=None): includes = [] if includes is None else includes includes_data = defaultdict(dict) check_includes('release_group', includes) with mb_session() as db: # Join table meta which contains release date for a release group query = db.query(models.ReleaseGroup).options(joinedload("meta")).\ options(joinedload("type")) if 'artists' in includes: query = query.\ options(joinedload("artist_credit")).\ options(joinedload("artist_credit.artists")).\ options(joinedload("artist_credit.artists.artist")) release_groups = get_entities_by_gids( query=query, entity_type='release_group', mbids=mbids, ) release_group_ids = [release_group.id for release_group in release_groups.values()] if 'artists' in includes: for release_group in release_groups.values(): artist_credit_names = release_group.artist_credit.artists includes_data[release_group.id]['artist-credit-names'] = artist_credit_names includes_data[release_group.id]['artist-credit-phrase'] = release_group.artist_credit.name if 'releases' in includes: query = db.query(models.Release).filter(getattr(models.Release, "release_group_id").in_(release_group_ids)) for release in query: includes_data[release.release_group_id].setdefault('releases', []).append(release) if 'release-group-rels' in includes: get_relationship_info( db=db, target_type='release_group', source_type='release_group', source_entity_ids=release_group_ids, includes_data=includes_data, ) if 'url-rels' in includes: get_relationship_info( db=db, target_type='url', source_type='release_group', source_entity_ids=release_group_ids, includes_data=includes_data, ) if 'work-rels' in includes: get_relationship_info( db=db, target_type='work', source_type='release_group', source_entity_ids=release_group_ids, includes_data=includes_data, ) if 'tags' in includes: release_group_tags = get_tags( db=db, entity_model=models.ReleaseGroup, tag_model=models.ReleaseGroupTag, entity_ids=release_group_ids, ) for release_group_id, tags in release_group_tags: includes_data[release_group_id]['tags'] = tags for release_group in release_groups.values(): includes_data[release_group.id]['meta'] = release_group.meta includes_data[release_group.id]['type'] = release_group.type release_groups = {str(mbid): to_dict_release_groups(release_groups[mbid], includes_data[release_groups[mbid].id]) for mbid in mbids} return release_groups
def fetch_multiple_release_groups(mbids, *, includes=None): includes = [] if includes is None else includes includes_data = defaultdict(dict) check_includes('release_group', includes) with mb_session() as db: # Join table meta which contains release date for a release group query = db.query(models.ReleaseGroup).options(joinedload("meta")).\ options(joinedload("type")) if 'artists' in includes: query = query.\ options(joinedload("artist_credit")).\ options(joinedload("artist_credit.artists")).\ options(joinedload("artist_credit.artists.artist")) release_groups = get_entities_by_gids( query=query, entity_type='release_group', mbids=mbids, ) release_group_ids = [release_group.id for release_group in release_groups.values()] if 'artists' in includes: for release_group in release_groups.values(): artist_credit_names = release_group.artist_credit.artists includes_data[release_group.id]['artist-credit-names'] = artist_credit_names includes_data[release_group.id]['artist-credit-phrase'] = release_group.artist_credit.name if 'releases' in includes: query = db.query(models.Release).filter(getattr(models.Release, "release_group_id").in_(release_group_ids)) for release in query: includes_data[release.release_group_id].setdefault('releases', []).append(release) if 'release-group-rels' in includes: get_relationship_info( db=db, target_type='release_group', source_type='release_group', source_entity_ids=release_group_ids, includes_data=includes_data, ) if 'url-rels' in includes: get_relationship_info( db=db, target_type='url', source_type='release_group', source_entity_ids=release_group_ids, includes_data=includes_data, ) if 'work-rels' in includes: get_relationship_info( db=db, target_type='work', source_type='release_group', source_entity_ids=release_group_ids, includes_data=includes_data, ) if 'tags' in includes: release_group_tags = get_tags( db=db, entity_model=models.ReleaseGroup, tag_model=models.ReleaseGroupTag, foreign_tag_id=models.ReleaseGroupTag.release_group_id, entity_ids=release_group_ids, ) for release_group_id, tags in release_group_tags: includes_data[release_group_id]['tags'] = tags for release_group in release_groups.values(): includes_data[release_group.id]['meta'] = release_group.meta includes_data[release_group.id]['type'] = release_group.type release_groups = {str(mbid): to_dict_release_groups(release_groups[mbid], includes_data[release_groups[mbid].id]) for mbid in mbids} return release_groups