Skip to content

Commit

Permalink
misc fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
amCap1712 committed Feb 5, 2024
1 parent 23a3be1 commit 0b40f9e
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 23 deletions.
17 changes: 7 additions & 10 deletions listenbrainz/db/metadata.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import psycopg2
import psycopg2.extras

from listenbrainz.db import timescale
from listenbrainz.db.model.metadata import RecordingMetadata, ArtistMetadata, ReleaseGroupMetadata
from typing import List

Expand All @@ -15,13 +14,14 @@ def fixup_mbids_to_artists(row):
return row


def get_metadata_for_recording(recording_mbid_list: List[str]) -> List[RecordingMetadata]:
def get_metadata_for_recording(ts_conn, recording_mbid_list: List[str]) -> List[RecordingMetadata]:
""" Get a list of recording Metadata objects for a given recording in descending order of their creation.
The list of recordings cannot exceed `~db.metadata.MAX_NUMBER_OF_ENTITIES_PER_CALL` per call.
If the number of items exceeds this limit, ValueError will be raised. Data is sorted according
to recording_mbid
Args:
ts_conn: timescale database connection
recording_mbid_list: A list of recording_mbids to fetch metadata for
Returns:
Expand All @@ -37,8 +37,7 @@ def get_metadata_for_recording(recording_mbid_list: List[str]) -> List[Recording
WHERE recording_mbid in %s
ORDER BY recording_mbid"""

conn = timescale.engine.raw_connection()
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as curs:
with ts_conn.connection.cursor(cursor_factory=psycopg2.extras.DictCursor) as curs:
curs.execute(query, (recording_mbid_list, ))
data = []
for row in curs.fetchall():
Expand All @@ -47,7 +46,7 @@ def get_metadata_for_recording(recording_mbid_list: List[str]) -> List[Recording
return data


def get_metadata_for_release_group(release_group_mbid_list: List[str]) -> List[ReleaseGroupMetadata]:
def get_metadata_for_release_group(ts_conn, release_group_mbid_list: List[str]) -> List[ReleaseGroupMetadata]:
""" Get a list of release_group Metadata objects for a given release_group in descending order of their creation.
The list of release groups cannot exceed `~db.metadata.MAX_NUMBER_OF_ENTITIES_PER_CALL` per call.
If the number of items exceeds this limit, ValueError will be raised. Data is sorted according
Expand All @@ -69,8 +68,7 @@ def get_metadata_for_release_group(release_group_mbid_list: List[str]) -> List[R
WHERE release_group_mbid in %s
ORDER BY release_group_mbid"""

conn = timescale.engine.raw_connection()
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as curs:
with ts_conn.connection.cursor(cursor_factory=psycopg2.extras.DictCursor) as curs:
curs.execute(query, (release_group_mbid_list, ))
data = []
for row in curs.fetchall():
Expand All @@ -79,7 +77,7 @@ def get_metadata_for_release_group(release_group_mbid_list: List[str]) -> List[R
return data


def get_metadata_for_artist(artist_mbid_list: List[str]) -> List[ArtistMetadata]:
def get_metadata_for_artist(ts_conn, artist_mbid_list: List[str]) -> List[ArtistMetadata]:
""" Get a list of artist Metadata objects for a given recording in descending order of their creation.
The list of artists cannot exceed `~db.metadata.MAX_NUMBER_OF_ENTITIES_PER_CALL` per call.
If the number of items exceeds this limit, ValueError will be raised. Data is sorted according
Expand All @@ -101,7 +99,6 @@ def get_metadata_for_artist(artist_mbid_list: List[str]) -> List[ArtistMetadata]
WHERE artist_mbid in %s
ORDER BY artist_mbid"""

conn = timescale.engine.raw_connection()
with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as curs:
with ts_conn.connection.cursor(cursor_factory=psycopg2.extras.DictCursor) as curs:
curs.execute(query, (artist_mbid_list, ))
return [ArtistMetadata(**dict(row)) for row in curs.fetchall()]
2 changes: 1 addition & 1 deletion listenbrainz/webserver/views/entity_pages.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ def artist_entity(artist_mbid):
raise BadRequest("Provided artist mbid is invalid: %s" % artist_mbid)

# Fetch the artist cached data
artist_data = get_metadata_for_artist([artist_mbid])
artist_data = get_metadata_for_artist(ts_conn, [artist_mbid])
if len(artist_data) == 0:
raise NotFound(f"artist {artist_mbid} not found in the metadata cache")

Expand Down
15 changes: 7 additions & 8 deletions listenbrainz/webserver/views/metadata_api.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
from brainzutils.ratelimit import ratelimit
from flask import Blueprint, request, jsonify,current_app
from flask import Blueprint, request, jsonify, current_app

from listenbrainz.db.mbid_manual_mapping import create_mbid_manual_mapping, get_mbid_manual_mapping
from listenbrainz.db.metadata import get_metadata_for_recording, get_metadata_for_artist, get_metadata_for_release_group
from listenbrainz.db.model.metadata import ReleaseGroupMetadata
from listenbrainz.db.model.mbid_manual_mapping import MbidManualMapping
from listenbrainz.labs_api.labs.api.artist_credit_recording_lookup import ArtistCreditRecordingLookupQuery
from listenbrainz.labs_api.labs.api.artist_credit_recording_release_lookup import \
ArtistCreditRecordingReleaseLookupQuery
from listenbrainz.mbid_mapping_writer.mbid_mapper import MBIDMapper
from listenbrainz.mbid_mapping_writer.mbid_mapper_metadata_api import MBIDMapperMetadataAPI
from listenbrainz.webserver import ts_conn
from listenbrainz.webserver.decorators import crossdomain
from listenbrainz.webserver.errors import APIBadRequest, APIInternalServerError
from listenbrainz.webserver.utils import parse_boolean_arg
Expand All @@ -33,7 +32,7 @@ def parse_incs():


def fetch_metadata(recording_mbids, incs):
metadata = get_metadata_for_recording(recording_mbids)
metadata = get_metadata_for_recording(ts_conn, recording_mbids)
result = {}
for entry in metadata:
data = {"recording": entry.recording_data}
Expand All @@ -52,7 +51,7 @@ def fetch_metadata(recording_mbids, incs):


def fetch_release_group_metadata(release_group_mbids, incs):
metadata = get_metadata_for_release_group(release_group_mbids)
metadata = get_metadata_for_release_group(ts_conn, release_group_mbids)
result = {}
for entry in metadata:
data = {"release_group": entry.release_group_data}
Expand Down Expand Up @@ -277,7 +276,7 @@ def submit_manual_mapping():
user_id=user["id"]
)

create_mbid_manual_mapping(mapping)
create_mbid_manual_mapping(ts_conn, mapping)

return jsonify({"status": "ok"})

Expand All @@ -301,7 +300,7 @@ def get_manual_mapping():
if not recording_msid or not is_valid_uuid(recording_msid):
raise APIBadRequest("recording_msid is invalid or not present in arguments")

existing_mapping = get_mbid_manual_mapping(recording_msid=recording_msid, user_id=user["id"])
existing_mapping = get_mbid_manual_mapping(ts_conn, recording_msid=recording_msid, user_id=user["id"])

if existing_mapping:
return jsonify({
Expand Down Expand Up @@ -352,7 +351,7 @@ def metadata_artist():
artist_mbids.append(mbid_clean)

results = []
for row in get_metadata_for_artist(artist_mbids):
for row in get_metadata_for_artist(ts_conn, artist_mbids):
item = {"artist_mbid": row.artist_mbid}
item.update(**row.artist_data)
if "tag" in incs:
Expand Down
7 changes: 3 additions & 4 deletions listenbrainz/webserver/views/popularity_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
from flask import Blueprint, request, current_app

from listenbrainz.db import popularity
from listenbrainz.db.recording import load_recordings_from_mbids_with_redirects
from listenbrainz.db.release import load_releases_from_mbids_with_redirects
from listenbrainz.webserver import ts_conn, db_conn
from listenbrainz.webserver.decorators import crossdomain
from listenbrainz.webserver.errors import APIBadRequest, APIInternalServerError
from listenbrainz.webserver.views.api_tools import is_valid_uuid
Expand Down Expand Up @@ -52,7 +51,7 @@ def top_recordings():
raise APIBadRequest(f"artist_mbid: '{artist_mbid}' is not a valid uuid")

try:
recordings = popularity.get_top_recordings_for_artist(artist_mbid)
recordings = popularity.get_top_recordings_for_artist(db_conn, ts_conn, artist_mbid)
return recordings
except Exception:
current_app.logger.error("Error while fetching metadata for recordings: ", exc_info=True)
Expand Down Expand Up @@ -112,7 +111,7 @@ def top_release_groups():
raise APIBadRequest(f"artist_mbid: '{artist_mbid}' is not a valid uuid")

try:
releases = popularity.get_top_release_groups_for_artist(artist_mbid)
releases = popularity.get_top_release_groups_for_artist(db_conn, ts_conn, artist_mbid)
return releases
except Exception:
current_app.logger.error("Error while fetching metadata for release groups: ", exc_info=True)
Expand Down

0 comments on commit 0b40f9e

Please sign in to comment.