[boardgames] Fix import from imap for timezones

This commit is contained in:
2025-07-25 17:34:43 -04:00
parent 95d8c4e4d6
commit 2bdba14cd6

View File

@ -2,6 +2,7 @@ import logging
import re import re
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Any, Optional from typing import Any, Optional
from zoneinfo import ZoneInfo
import pendulum import pendulum
import pytz import pytz
@ -18,6 +19,7 @@ from music.models import Track
from people.models import Person from people.models import Person
from podcasts.models import PodcastEpisode from podcasts.models import PodcastEpisode
from podcasts.utils import parse_mopidy_uri from podcasts.utils import parse_mopidy_uri
from profiles.models import UserProfile
from puzzles.models import Puzzle from puzzles.models import Puzzle
from scrobbles.constants import ( from scrobbles.constants import (
JELLYFIN_AUDIO_ITEM_TYPES, JELLYFIN_AUDIO_ITEM_TYPES,
@ -390,10 +392,25 @@ def email_scrobble_board_game(
locations[location_dict.get("id")] = location locations[location_dict.get("id")] = location
scrobbles_created = [] scrobbles_created = []
second = 0
for play_dict in bgstat_data.get("plays", []): for play_dict in bgstat_data.get("plays", []):
hour = None
minute = None
second = None
if "comments" in play_dict.keys(): if "comments" in play_dict.keys():
if "Learning to play" in play_dict.get("comments"): for line in play_dict.get("comments", "").split("\n"):
log_data["learning"] = True if "Learning to play" in line:
log_data["learning"] = True
if "Start time:" in line:
start_time = line.split(": ")[1]
pieces = start_time.split(":")
hour = int(pieces[0])
minute = int(pieces[1])
try:
second = int(pieces[2])
except IndexError:
second = 0
log_data["details"] = play_dict.get("comments") log_data["details"] = play_dict.get("comments")
log_data["expansion_ids"] = [] log_data["expansion_ids"] = []
try: try:
@ -402,7 +419,6 @@ def email_scrobble_board_game(
try: try:
base_game = expansions[play_dict.get("gameRefId")] base_game = expansions[play_dict.get("gameRefId")]
except KeyError: except KeyError:
print(play_dict)
logger.info( logger.info(
"Skipping scrobble of play, can't find game", "Skipping scrobble of play, can't find game",
extra={"play_dict": play_dict}, extra={"play_dict": play_dict},
@ -440,31 +456,51 @@ def email_scrobble_board_game(
} }
) )
start = parse(play_dict.get("playDate")) timestamp = parse(play_dict.get("playDate"))
if hour and minute:
logger.info(f"Scrobble playDate has manual start time {timestamp}")
timestamp = timestamp.replace(
hour=hour, minute=minute, second=second or 0
)
logger.info(f"Update to {timestamp}")
profile = UserProfile.objects.filter(user_id=user_id).first()
timestamp = profile.get_timestamp_with_tz(timestamp)
if play_dict.get("durationMin") > 0: if play_dict.get("durationMin") > 0:
duration_seconds = play_dict.get("durationMin") * 60 duration_seconds = play_dict.get("durationMin") * 60
else: else:
duration_seconds = base_game.run_time_seconds duration_seconds = base_game.run_time_seconds
stop = start + timedelta(seconds=duration_seconds) stop_timestamp = timestamp + timedelta(seconds=duration_seconds)
logger.info(f"Creating scrobble for {base_game} at {timestamp}")
scrobble_dict = { scrobble_dict = {
"user_id": user_id, "user_id": user_id,
"timestamp": start, "timestamp": timestamp,
"playback_position_seconds": duration_seconds, "playback_position_seconds": duration_seconds,
"source": "BG Stats", "source": "BG Stats",
"log": log_data, "log": log_data,
} }
scrobble = Scrobble.objects.filter( scrobble = None
board_game=base_game, user_id=user_id, timestamp=start if timestamp.year > 2023:
).first() logger.info(
"Scrobbles older than 2024 likely have no time associated just create it"
)
scrobble = Scrobble.objects.filter(
board_game=base_game, user_id=user_id, timestamp=timestamp
).first()
if scrobble: if scrobble:
logger.info( logger.info(
"Scrobble already exists, skipping", "Scrobble already exists, skipping",
extra={"scrobble_dict": scrobble_dict, "user_id": user_id}, extra={"scrobble_dict": scrobble_dict, "user_id": user_id},
) )
continue continue
scrobble = Scrobble.create_or_update(base_game, user_id, scrobble_dict) scrobble = Scrobble.create_or_update(
scrobble.stop_timestamp = stop base_game, user_id, scrobble_dict, skip_in_progress_check=True
)
scrobble.timezone = timestamp.tzinfo.name
scrobble.stop_timestamp = stop_timestamp
scrobble.in_progress = False scrobble.in_progress = False
scrobble.played_to_completion = True scrobble.played_to_completion = True
scrobble.save() scrobble.save()