Fix jellyfin duping scrobbles after complete
This commit is contained in:
@ -577,8 +577,8 @@ class Scrobble(TimeStampedModel):
|
|||||||
|
|
||||||
media_class = media.__class__.__name__
|
media_class = media.__class__.__name__
|
||||||
|
|
||||||
|
media_query = models.Q(track=media)
|
||||||
if media_class == "Track":
|
if media_class == "Track":
|
||||||
media_query = models.Q(track=media)
|
|
||||||
scrobble_data["track_id"] = media.id
|
scrobble_data["track_id"] = media.id
|
||||||
if media_class == "Video":
|
if media_class == "Video":
|
||||||
media_query = models.Q(video=media)
|
media_query = models.Q(video=media)
|
||||||
@ -604,7 +604,17 @@ class Scrobble(TimeStampedModel):
|
|||||||
.order_by("-modified")
|
.order_by("-modified")
|
||||||
.first()
|
.first()
|
||||||
)
|
)
|
||||||
if scrobble and scrobble.can_be_updated:
|
# We want to finish a video after it's reeached 90%
|
||||||
|
# but we also don't want to create new videos, so in
|
||||||
|
# this special case, we allow jellyfin resumed status
|
||||||
|
# to allow a scrobble to be updated.
|
||||||
|
jellyfin_in_progress = (
|
||||||
|
scrobble_data.pop("jellyfin_status", None) is "resumed"
|
||||||
|
)
|
||||||
|
# We also discard mopidy_status, unused presently
|
||||||
|
scrobble_data.pop("mopidy_status", None)
|
||||||
|
|
||||||
|
if scrobble and (scrobble.can_be_updated or jellyfin_in_progress):
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Updating {scrobble.id}",
|
f"Updating {scrobble.id}",
|
||||||
{"scrobble_data": scrobble_data, "media": media},
|
{"scrobble_data": scrobble_data, "media": media},
|
||||||
@ -616,9 +626,6 @@ class Scrobble(TimeStampedModel):
|
|||||||
f"Creating for {media.id} - {source}",
|
f"Creating for {media.id} - {source}",
|
||||||
{"scrobble_data": scrobble_data, "media": media},
|
{"scrobble_data": scrobble_data, "media": media},
|
||||||
)
|
)
|
||||||
# If creating a new scrobble, we don't need status
|
|
||||||
scrobble_data.pop("mopidy_status", None)
|
|
||||||
scrobble_data.pop("jellyfin_status", None)
|
|
||||||
return cls.create(scrobble_data)
|
return cls.create(scrobble_data)
|
||||||
|
|
||||||
def update(self, scrobble_data: dict) -> "Scrobble":
|
def update(self, scrobble_data: dict) -> "Scrobble":
|
||||||
@ -643,6 +650,9 @@ class Scrobble(TimeStampedModel):
|
|||||||
for key, value in scrobble_data.items():
|
for key, value in scrobble_data.items():
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
|
check_scrobble_for_finish(self)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -669,16 +679,13 @@ class Scrobble(TimeStampedModel):
|
|||||||
check_long_play_for_finish(self)
|
check_long_play_for_finish(self)
|
||||||
return
|
return
|
||||||
|
|
||||||
check_scrobble_for_finish(self, force_finish=force_finish)
|
|
||||||
|
|
||||||
def pause(self) -> None:
|
def pause(self) -> None:
|
||||||
if self.is_paused:
|
if self.is_paused:
|
||||||
logger.warning(f"{self.id} - already paused - {self.source}")
|
logger.warning(f"{self.id} - already paused - {self.source}")
|
||||||
return
|
return
|
||||||
|
logger.info(f"{self.id} - pausing - {self.source}")
|
||||||
self.is_paused = True
|
self.is_paused = True
|
||||||
self.save(update_fields=["is_paused"])
|
self.save(update_fields=["is_paused"])
|
||||||
logger.info(f"{self.id} - pausing - {self.source}")
|
|
||||||
check_scrobble_for_finish(self)
|
|
||||||
|
|
||||||
def resume(self) -> None:
|
def resume(self) -> None:
|
||||||
if self.is_paused or not self.in_progress:
|
if self.is_paused or not self.in_progress:
|
||||||
|
|||||||
@ -81,7 +81,7 @@ def check_scrobble_for_finish(
|
|||||||
completion_percent = scrobble.media_obj.COMPLETION_PERCENT
|
completion_percent = scrobble.media_obj.COMPLETION_PERCENT
|
||||||
# scrobble.refresh_from - db()
|
# scrobble.refresh_from - db()
|
||||||
if scrobble.percent_played >= completion_percent or force_finish:
|
if scrobble.percent_played >= completion_percent or force_finish:
|
||||||
logger.debug(f"{scrobble} finished, updating")
|
logger.info(f"{scrobble.id} finished, updating")
|
||||||
scrobble.playback_position_seconds = (
|
scrobble.playback_position_seconds = (
|
||||||
scrobble.media_obj.run_time_seconds
|
scrobble.media_obj.run_time_seconds
|
||||||
)
|
)
|
||||||
@ -99,7 +99,7 @@ def check_scrobble_for_finish(
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
logger.debug(f"{scrobble} not played to completion, not completing")
|
logger.info(f"{scrobble.id} not complete")
|
||||||
|
|
||||||
|
|
||||||
def check_long_play_for_finish(scrobble):
|
def check_long_play_for_finish(scrobble):
|
||||||
|
|||||||
Reference in New Issue
Block a user