From 7db98f0979e5921704bfe5733068cd6f29b0aed6 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Tue, 11 Apr 2023 18:08:43 -0400 Subject: [PATCH] Clean up code for manaul scrobblign --- vrobbler/apps/scrobbles/constants.py | 7 +++++ vrobbler/apps/scrobbles/models.py | 4 +-- vrobbler/apps/scrobbles/scrobblers.py | 17 +++++++----- vrobbler/apps/scrobbles/views.py | 37 ++++----------------------- vrobbler/apps/videos/imdb.py | 6 ++++- 5 files changed, 30 insertions(+), 41 deletions(-) diff --git a/vrobbler/apps/scrobbles/constants.py b/vrobbler/apps/scrobbles/constants.py index 0a99fcc..92a8d33 100644 --- a/vrobbler/apps/scrobbles/constants.py +++ b/vrobbler/apps/scrobbles/constants.py @@ -8,6 +8,13 @@ LONG_PLAY_MEDIA = { "books": "Book", } +MANUAL_SCROBBLE_FNS = { + "-v": "manual_scrobble_video_game", + "-b": "manual_scrobble_book", + "-s": "manual_scrobble_sport_event", + "-i": "manual_scrobble_video", +} + class AsTsvColumn(Enum): ARTIST_NAME = 0 diff --git a/vrobbler/apps/scrobbles/models.py b/vrobbler/apps/scrobbles/models.py index 830b359..8679230 100644 --- a/vrobbler/apps/scrobbles/models.py +++ b/vrobbler/apps/scrobbles/models.py @@ -639,9 +639,9 @@ class Scrobble(TimeStampedModel): scrobble_data.pop("mopidy_status", None) scrobble_data.pop("jellyfin_status", None) source = scrobble_data["source"] + mtype = media.__class__.__name__ logger.info( - f"Creating for {media.id} - {source}", - {"scrobble_data": scrobble_data, "media": media}, + f"[scrobbling] creating for {mtype} {media.id} from {source}" ) return cls.create(scrobble_data) diff --git a/vrobbler/apps/scrobbles/scrobblers.py b/vrobbler/apps/scrobbles/scrobblers.py index 48a5b65..415bbc5 100644 --- a/vrobbler/apps/scrobbles/scrobblers.py +++ b/vrobbler/apps/scrobbles/scrobblers.py @@ -17,6 +17,9 @@ from sports.models import SportEvent from videos.models import Video from videogames.models import VideoGame from books.models import Book +from vrobbler.apps.books.openlibrary import lookup_book_from_openlibrary +from vrobbler.apps.sports.thesportsdb import lookup_event_from_thesportsdb +from vrobbler.apps.videogames.howlongtobeat import lookup_game_from_hltb logger = logging.getLogger(__name__) @@ -166,7 +169,7 @@ def jellyfin_scrobble_video(data_dict: dict, user_id: Optional[int]): def manual_scrobble_video(imdb_id: str, user_id: int): - video = Video.find_or_create({"imdb_id": imdb_id}) + video = Video.find_or_create(imdb_id) # When manually scrobbling, try finding a source from the series if video.tv_series: @@ -182,15 +185,16 @@ def manual_scrobble_video(imdb_id: str, user_id: int): return Scrobble.create_or_update(video, user_id, scrobble_dict) -def manual_scrobble_event(data_dict: dict, user_id: Optional[int]): +def manual_scrobble_event(thesportsdb_id: str, user_id: int): + data_dict = lookup_event_from_thesportsdb(thesportsdb_id) + event = SportEvent.find_or_create(data_dict) - scrobble_dict = build_scrobble_dict(data_dict, user_id) - return Scrobble.create_or_update(event, user_id, scrobble_dict) -def manual_scrobble_video_game(data_dict: dict, user_id: Optional[int]): +def manual_scrobble_video_game(hltb_id: str, user_id: int): + data_dict = lookup_game_from_hltb(hltb_id) game = VideoGame.find_or_create(data_dict) scrobble_dict = { @@ -205,7 +209,8 @@ def manual_scrobble_video_game(data_dict: dict, user_id: Optional[int]): return Scrobble.create_or_update(game, user_id, scrobble_dict) -def manual_scrobble_book(data_dict: dict, user_id: Optional[int]): +def manual_scrobble_book(openlibrary_id: str, user_id: int): + data_dict = lookup_book_from_openlibrary(openlibrary_id) book = Book.find_or_create(data_dict) scrobble_dict = { diff --git a/vrobbler/apps/scrobbles/views.py b/vrobbler/apps/scrobbles/views.py index de50915..05ee932 100644 --- a/vrobbler/apps/scrobbles/views.py +++ b/vrobbler/apps/scrobbles/views.py @@ -33,6 +33,7 @@ from scrobbles.constants import ( JELLYFIN_AUDIO_ITEM_TYPES, JELLYFIN_VIDEO_ITEM_TYPES, LONG_PLAY_MEDIA, + MANUAL_SCROBBLE_FNS, ) from scrobbles.export import export_scrobbles from scrobbles.forms import ExportScrobbleForm, ScrobbleForm @@ -47,9 +48,6 @@ from scrobbles.scrobblers import ( jellyfin_scrobble_track, jellyfin_scrobble_video, manual_scrobble_book, - manual_scrobble_event, - manual_scrobble_video, - manual_scrobble_video_game, mopidy_scrobble_podcast, mopidy_scrobble_track, ) @@ -58,10 +56,6 @@ from scrobbles.tasks import ( process_lastfm_import, process_tsv_import, ) -from sports.thesportsdb import lookup_event_from_thesportsdb -from videogames.howlongtobeat import lookup_game_from_hltb - -from books.openlibrary import lookup_book_from_openlibrary from scrobbles.utils import ( get_long_plays_completed, get_long_plays_in_progress, @@ -209,32 +203,12 @@ class ManualScrobbleView(FormView): template_name = "scrobbles/manual_form.html" def form_valid(self, form): - item_str = form.cleaned_data.get("item_id") - key = item_str[:2] - item_id = item_str[3:] - data_dict = None + logger.debug(f"Looking for scrobblable media with input {item_str}") - if key == "-v": - logger.debug(f"Looking for video game with ID {item_id}") - data_dict = lookup_game_from_hltb(item_id.replace("-v", "")) - if data_dict: - manual_scrobble_video_game(data_dict, self.request.user.id) - - if key == "-b": - logger.debug(f"Looking for book with ID {item_id}") - data_dict = lookup_book_from_openlibrary(item_id.replace("-b", "")) - if data_dict: - manual_scrobble_book(data_dict, self.request.user.id) - - if key == "-s": - logger.debug(f"Looking for sport event with ID {item_id}") - data_dict = lookup_event_from_thesportsdb(item_id) - if data_dict: - manual_scrobble_event(data_dict, self.request.user.id) - - if key == "-i": - manual_scrobble_video(item_id, self.request.user.id) + key, item_id = item_str[:2], item_str[3:] + scrobble_fn = MANUAL_SCROBBLE_FNS[key] + eval(scrobble_fn)(item_id, self.request.user.id) return HttpResponseRedirect(self.request.META.get("HTTP_REFERER")) @@ -349,7 +323,6 @@ def mopidy_webhook(request): try: data_dict = json.loads(request.data) except TypeError: - logger.warning("Received Mopidy data as dict, rather than a string") data_dict = request.data # For making things easier to build new input processors diff --git a/vrobbler/apps/videos/imdb.py b/vrobbler/apps/videos/imdb.py index 68437b7..17227e6 100644 --- a/vrobbler/apps/videos/imdb.py +++ b/vrobbler/apps/videos/imdb.py @@ -10,7 +10,11 @@ logger = logging.getLogger(__name__) def lookup_video_from_imdb(name_or_id: str, kind: str = "movie") -> dict: - name_or_id = name_or_id.strip("tt") + + # Very few video titles start with tt, but IMDB IDs often come in with it + if name_or_id.startswith("tt"): + name_or_id = name_or_id[2:] + video_dict = {} imdb_id = None