瀏覽代碼

Clean up retroarch scrobbling

Colin Powell 1 年之前
父節點
當前提交
955b6f028a
共有 1 個文件被更改,包括 63 次插入48 次删除
  1. 63 48
      vrobbler/apps/videogames/retroarch.py

+ 63 - 48
vrobbler/apps/videogames/retroarch.py

@@ -2,7 +2,7 @@ import json
 import logging
 import os
 from datetime import datetime, timedelta
-from typing import List
+from typing import List, Optional
 
 import pytz
 from dateutil.parser import ParserError, parse
@@ -68,6 +68,21 @@ def load_game_data(directory_path: str, user_tz=None) -> dict:
     return games
 
 
+def lookup_from_short_mame_name(game_name: str) -> Optional[VideoGame]:
+    logger.info(f"Received name {game_name}")
+    try:
+        mame_name = scrape_game_name_from_adb(game_name)
+    except GameNotFound as e:
+        logger.warning(e)
+        return
+
+    if mame_name:
+        logger.info(f"Found name {game_name}")
+        game_name = mame_name
+
+    return VideoGame.objects.filter(retroarch_name=game_name).first()
+
+
 def import_retroarch_lrtl_files(playlog_path: str, user_id: int) -> List[dict]:
     """Given a path to Retroarch lrtl game log file data,
     gather
@@ -91,22 +106,15 @@ def import_retroarch_lrtl_files(playlog_path: str, user_id: int) -> List[dict]:
     new_scrobbles = []
 
     for game_name, game_data in game_logs.items():
-        # Use the retroarch name, because we can't change those but may want to
-        # tweak the found game
-        logger.info(f"Received name {game_name}")
-        try:
-            mame_name = scrape_game_name_from_adb(game_name)
-        except GameNotFound as e:
-            logger.warning(e)
-            continue
-
-        if mame_name:
-            logger.info(f"Found name {game_name}")
-            game_name = mame_name
-
         found_game = VideoGame.objects.filter(retroarch_name=game_name).first()
 
+        # If we didn't find by Retroarch name, check ArcadeDB
+        found_game_from_adb = None
         if not found_game:
+            found_game_from_adb = lookup_from_short_mame_name(game_name)
+
+        # If we didn't find it on ADB, go to get_or_create
+        if not found_game and not found_game_from_adb:
             try:
                 found_game = get_or_create_videogame(game_name)
             except GameNotFound as e:
@@ -117,48 +125,55 @@ def import_retroarch_lrtl_files(playlog_path: str, user_id: int) -> List[dict]:
                 found_game.retroarch_name = game_name
                 found_game.save(update_fields=["retroarch_name"])
 
+        if not found_game:
+            logger.warning(f"No game found or created for {game_name}")
+            continue
+
+        # Found a game, check if scrobble exists
         end_datetime = game_data.get("last_played")
-        if found_game:
-            found_scrobble = found_game.scrobble_set.filter(
-                stop_timestamp=end_datetime
-            )
-            if found_scrobble:
-                logger.info(f"Skipping scrobble for game {found_game.id}")
-                continue
+        found_scrobble = found_game.scrobble_set.filter(
+            stop_timestamp=end_datetime
+        )
+        if found_scrobble:
+            logger.info(f"Skipping scrobble for game {found_game.id}")
+            continue
 
-            last_scrobble = found_game.scrobble_set.last()
+        last_scrobble = found_game.scrobble_set.last()
+
+        long_play_complete = None
+        if last_scrobble:
             long_play_complete = last_scrobble.long_play_complete
 
-            # Default to 0 for delta, but if there's an past scrobble, use that
-            delta_runtime = 0
-            if last_scrobble:
-                delta_runtime = last_scrobble.long_play_seconds
-            playback_position_seconds = game_data["runtime"] - delta_runtime
+        # Default to 0 for delta, but if there's an past scrobble, use that
+        delta_runtime = 0
+        if last_scrobble:
+            delta_runtime = last_scrobble.long_play_seconds
 
-            timestamp = end_datetime - timedelta(
-                seconds=playback_position_seconds
+        playback_position_seconds = game_data["runtime"] - delta_runtime
+        timestamp = end_datetime - timedelta(seconds=playback_position_seconds)
+        if playback_position_seconds < 30:
+            logger.info(
+                f"Video game {found_game.id} played for less than 30 seconds, skipping"
             )
+            continue
 
-            if playback_position_seconds < 30:
-                logger.info(
-                    f"Video game {found_game.id} played for less than 30 seconds, skipping"
-                )
-            new_scrobbles.append(
-                Scrobble(
-                    video_game_id=found_game.id,
-                    timestamp=timestamp,
-                    stop_timestamp=game_data["last_played"],
-                    playback_position_seconds=playback_position_seconds,
-                    played_to_completion=True,
-                    in_progress=False,
-                    long_play_seconds=game_data["runtime"],
-                    long_play_complete=long_play_complete,
-                    user_id=user_id,
-                    source="Retroarch",
-                    source_id="Imported from Retroarch play log file",
-                    media_type=Scrobble.MediaType.VIDEO_GAME,
-                )
+        logger.info(f"Queued scrobble for game {found_game.id}")
+        new_scrobbles.append(
+            Scrobble(
+                video_game_id=found_game.id,
+                timestamp=timestamp,
+                stop_timestamp=end_datetime,
+                playback_position_seconds=playback_position_seconds,
+                played_to_completion=True,
+                in_progress=False,
+                long_play_seconds=game_data["runtime"],
+                long_play_complete=long_play_complete,
+                user_id=user_id,
+                source="Retroarch",
+                source_id="Imported from Retroarch play log file",
+                media_type=Scrobble.MediaType.VIDEO_GAME,
             )
+        )
     created_scrobbles = Scrobble.objects.bulk_create(new_scrobbles)
     logger.info(f"Created {len(created_scrobbles)} scrobbles")
     return new_scrobbles