Refactor long play finishing

This commit is contained in:
2023-03-30 01:55:36 -04:00
parent 7d1e070ee6
commit 0dc0102bb6
2 changed files with 49 additions and 42 deletions

View File

@ -24,7 +24,10 @@ from profiles.utils import (
) )
from scrobbles.constants import LONG_PLAY_MEDIA from scrobbles.constants import LONG_PLAY_MEDIA
from scrobbles.stats import build_charts from scrobbles.stats import build_charts
from scrobbles.utils import check_scrobble_for_finish from scrobbles.utils import (
check_long_play_for_finish,
check_scrobble_for_finish,
)
from sports.models import SportEvent from sports.models import SportEvent
from videogames.models import VideoGame from videogames.models import VideoGame
from videos.models import Series, Video from videos.models import Series, Video
@ -655,6 +658,7 @@ class Scrobble(TimeStampedModel):
def stop(self, force_finish=False) -> None: def stop(self, force_finish=False) -> None:
if not self.in_progress: if not self.in_progress:
logger.debug(f"Cannot stop scrobble {scrobble.id} not in progress")
return return
self.in_progress = False self.in_progress = False
self.save(update_fields=["in_progress"]) self.save(update_fields=["in_progress"])
@ -662,36 +666,9 @@ class Scrobble(TimeStampedModel):
class_name = self.media_obj.__class__.__name__ class_name = self.media_obj.__class__.__name__
if class_name in LONG_PLAY_MEDIA.values(): if class_name in LONG_PLAY_MEDIA.values():
now = timezone.now() check_long_play_for_finish(self)
self.played_to_completion = True
self.playback_position_seconds = (now - self.timestamp).seconds
media_filter = models.Q(video_game=self.video_game)
if class_name == "Book":
media_filter = models.Q(book=self.book)
# Check for last scrobble, and if present, update long play time
last_scrobble = Scrobble.objects.filter(
media_filter,
user_id=self.user,
played_to_completion=True,
long_play_complete=False,
).last()
self.long_play_seconds = self.playback_position_seconds
if last_scrobble:
self.long_play_seconds = (
last_scrobble.long_play_seconds
+ self.playback_position_seconds
)
self.save(
update_fields=[
"playback_position_seconds",
"played_to_completion",
"long_play_seconds",
]
)
return return
check_scrobble_for_finish(self, force_finish=force_finish) check_scrobble_for_finish(self, force_finish=force_finish)
def pause(self) -> None: def pause(self) -> None:

View File

@ -1,6 +1,7 @@
import logging import logging
from urllib.parse import unquote from urllib.parse import unquote
from django.utils import timezone
from dateutil.parser import ParserError, parse from dateutil.parser import ParserError, parse
from django.apps import apps from django.apps import apps
from django.conf import settings from django.conf import settings
@ -78,19 +79,12 @@ def check_scrobble_for_finish(
scrobble: "Scrobble", force_to_100=False, force_finish=False scrobble: "Scrobble", force_to_100=False, force_finish=False
) -> None: ) -> None:
completion_percent = scrobble.media_obj.COMPLETION_PERCENT completion_percent = scrobble.media_obj.COMPLETION_PERCENT
# scrobble.refresh_from - db()
if scrobble.percent_played >= completion_percent or force_finish: if scrobble.percent_played >= completion_percent or force_finish:
if ( logger.debug(f"{scrobble} finished, updating")
scrobble.playback_position_seconds scrobble.playback_position_seconds = (
and scrobble.media_obj.run_time_seconds scrobble.media_obj.run_time_seconds
): )
logger.info(f"{scrobble.id} {completion_percent} met, finishing")
scrobble.playback_position_seconds = (
scrobble.media_obj.run_time_seconds
)
logger.info(
f"{scrobble.playback_position_seconds} set to {scrobble.media_obj.run_time_seconds}"
)
scrobble.in_progress = False scrobble.in_progress = False
scrobble.is_paused = False scrobble.is_paused = False
@ -104,6 +98,42 @@ def check_scrobble_for_finish(
"playback_position_seconds", "playback_position_seconds",
] ]
) )
else:
logger.debug(f"{scrobble} not played to completion, not completing")
def check_long_play_for_finish(scrobble):
Scrobble = apps.get_model("scrobbles", "Scrobble")
class_name = scrobble.media_obj.__class__.__name__
now = timezone.now()
scrobble.played_to_completion = True
scrobble.playback_position_seconds = (now - scrobble.timestamp).seconds
media_filter = models.Q(video_game=scrobble.video_game)
if class_name == "Book":
media_filter = models.Q(book=scrobble.book)
# Check for last scrobble, and if present, update long play time
last_scrobble = Scrobble.objects.filter(
media_filter,
user_id=scrobble.user,
played_to_completion=True,
long_play_complete=False,
).last()
scrobble.long_play_seconds = scrobble.playback_position_seconds
if last_scrobble:
scrobble.long_play_seconds = (
last_scrobble.long_play_seconds
+ scrobble.playback_position_seconds
)
scrobble.save(
update_fields=[
"playback_position_seconds",
"played_to_completion",
"long_play_seconds",
]
)
def get_scrobbles_for_media(media_obj, user: User) -> models.QuerySet: def get_scrobbles_for_media(media_obj, user: User) -> models.QuerySet: