fix: ensure episode number does not go below zero and improve movie handling logic

This commit is contained in:
FuzzyGrim
2025-05-22 20:50:01 +02:00
parent 699ef3d65d
commit c702241662
2 changed files with 44 additions and 29 deletions

View File

@@ -258,5 +258,5 @@ class JellyfinWebhookTests(TestCase):
self.assertEqual(response.status_code, 200)
movie = Movie.objects.get(item__media_id="603")
self.assertEqual(movie.status, Media.Status.REPEATING.value)
self.assertEqual(movie.status, Media.Status.COMPLETED.value)
self.assertEqual(movie.repeats, 1)

View File

@@ -87,7 +87,7 @@ def handle_anime(media_id, episode_number, payload, user):
)
if not episode_played:
episode_number = episode_number - 1
episode_number = max(0, episode_number - 1)
try:
anime_instance = app.models.Anime.objects.get(
@@ -113,12 +113,13 @@ def handle_anime(media_id, episode_number, payload, user):
def handle_movie(media_id, payload, user):
"""Add a movie as watched."""
"""Handle movie object from payload."""
movie_metadata = app.providers.tmdb.movie(media_id)
movie_played = payload["Item"]["UserData"]["Played"]
progress = 1 if movie_played else 0
now = timezone.now().replace(second=0, microsecond=0)
item, _ = app.models.Item.objects.get_or_create(
movie_item, _ = app.models.Item.objects.get_or_create(
media_id=media_id,
source=Sources.TMDB.value,
media_type=MediaTypes.MOVIE.value,
@@ -128,32 +129,47 @@ def handle_movie(media_id, payload, user):
},
)
try:
movie_instance = app.models.Movie.objects.get(
item=item,
user=user,
)
movie_instance, created = app.models.Movie.objects.get_or_create(
item=movie_item,
user=user,
defaults={
"progress": progress,
"status": Media.Status.COMPLETED.value
if movie_played
else Media.Status.IN_PROGRESS.value,
"start_date": now if not movie_played else None,
"end_date": now if movie_played else None,
},
)
if not created:
movie_instance.progress = progress
if (
movie_instance.status == Media.Status.COMPLETED.value and movie_played
) or movie_instance.status == Media.Status.REPEATING.value:
if movie_played:
movie_instance.repeats += 1
else:
movie_instance.status = Media.Status.REPEATING.value
movie_instance.status = Media.Status.REPEATING.value
else:
movie_instance.status = Media.Status.IN_PROGRESS.value
movie_instance.save()
if movie_played:
movie_instance.end_date = now
except app.models.Movie.DoesNotExist:
app.models.Movie.objects.create(
item=item,
user=user,
progress=progress,
status=Media.Status.IN_PROGRESS.value,
)
if movie_instance.status == Media.Status.COMPLETED.value:
movie_instance.repeats += 1
elif movie_instance.status == Media.Status.REPEATING.value:
movie_instance.repeats += 1
movie_instance.status = Media.Status.COMPLETED.value
else:
movie_instance.status = Media.Status.COMPLETED.value
elif movie_instance.status == Media.Status.COMPLETED.value:
movie_instance.status = Media.Status.REPEATING.value
movie_instance.start_date = now
movie_instance.end_date = None
elif movie_instance.status not in (
Media.Status.REPEATING.value,
Media.Status.IN_PROGRESS.value,
):
movie_instance.status = Media.Status.IN_PROGRESS.value
if not movie_instance.start_date:
movie_instance.start_date = now
movie_instance.save()
def handle_tv_episode(media_id, payload, user):
@@ -191,8 +207,7 @@ def handle_tv_episode(media_id, payload, user):
Media.Status.IN_PROGRESS.value,
):
tv_instance.status = Media.Status.IN_PROGRESS.value
tv_instance.save(
)
tv_instance.save()
season_item, _ = app.models.Item.objects.get_or_create(
media_id=media_id,