From 447a4e830e9dc2b4112ac9e246cd280a99806c60 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Wed, 15 Mar 2023 14:38:59 -0400 Subject: [PATCH] Allow starting next in series --- vrobbler/apps/scrobbles/views.py | 12 ++++----- .../migrations/0013_video_next_imdb_id.py | 21 +++++++++++++++ vrobbler/apps/videos/models.py | 27 ++++++++++++++++--- vrobbler/apps/videos/utils.py | 1 + vrobbler/apps/videos/views.py | 11 +++++--- vrobbler/templates/videos/series_detail.html | 7 +++++ 6 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 vrobbler/apps/videos/migrations/0013_video_next_imdb_id.py diff --git a/vrobbler/apps/scrobbles/views.py b/vrobbler/apps/scrobbles/views.py index ddbc458..3cb2845 100644 --- a/vrobbler/apps/scrobbles/views.py +++ b/vrobbler/apps/scrobbles/views.py @@ -229,7 +229,7 @@ class ManualScrobbleView(FormView): if key == "-i": manual_scrobble_video(item_id, self.request.user.id) - return HttpResponseRedirect(reverse("vrobbler-home")) + return HttpResponseRedirect(self.request.META.get("HTTP_REFERER")) class JsonableResponseMixin: @@ -272,7 +272,7 @@ class AudioScrobblerImportCreateView( self.object.user = self.request.user self.object.save() process_tsv_import.delay(self.object.id) - return HttpResponseRedirect(self.get_success_url()) + return HttpResponseRedirect(self.request.META.get("HTTP_REFERER")) class KoReaderImportCreateView( @@ -288,7 +288,7 @@ class KoReaderImportCreateView( self.object.user = self.request.user self.object.save() process_koreader_import.delay(self.object.id) - return HttpResponseRedirect(self.get_success_url()) + return HttpResponseRedirect(self.request.META.get("HTTP_REFERER")) @permission_classes([IsAuthenticated]) @@ -300,8 +300,7 @@ def lastfm_import(request): process_lastfm_import.delay(lfm_import.id) - success_url = reverse_lazy("vrobbler-home") - return HttpResponseRedirect(success_url) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) @csrf_exempt @@ -394,6 +393,7 @@ def scrobble_start(request, uuid): success_url = request.META.get("HTTP_REFERER") if not user.is_authenticated: + return HttpResponseRedirect(success_url) media_obj = None @@ -506,7 +506,7 @@ def scrobble_cancel(request, uuid): ) else: messages.add_message(request, messages.ERROR, "Scrobble not found.") - return HttpResponseRedirect(success_url) + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) @permission_classes([IsAuthenticated]) diff --git a/vrobbler/apps/videos/migrations/0013_video_next_imdb_id.py b/vrobbler/apps/videos/migrations/0013_video_next_imdb_id.py new file mode 100644 index 0000000..80cd771 --- /dev/null +++ b/vrobbler/apps/videos/migrations/0013_video_next_imdb_id.py @@ -0,0 +1,21 @@ +# Generated by Django 4.1.5 on 2023-03-15 17:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ( + "videos", + "0012_remove_series_tags_remove_video_tags_series_genre_and_more", + ), + ] + + operations = [ + migrations.AddField( + model_name="video", + name="next_imdb_id", + field=models.CharField(blank=True, max_length=20, null=True), + ), + ] diff --git a/vrobbler/apps/videos/models.py b/vrobbler/apps/videos/models.py index a1bda8c..84c3501 100644 --- a/vrobbler/apps/videos/models.py +++ b/vrobbler/apps/videos/models.py @@ -1,5 +1,5 @@ import logging -from typing import Dict +from typing import Dict, Optional from uuid import uuid4 import requests @@ -40,13 +40,33 @@ class Series(TimeStampedModel): def imdb_link(self): return f"https://www.imdb.com/title/tt{self.imdb_id}" - def scrobbles_for_user(self, user_id: int): + def scrobbles_for_user(self, user_id: int, include_playing=False): from scrobbles.models import Scrobble + played_query = models.Q(played_to_completion=True) + if include_playing: + played_query = models.Q() return Scrobble.objects.filter( - video__tv_series=self, user=user_id, played_to_completion=True + played_query, + video__tv_series=self, + user=user_id, ).order_by("-timestamp") + def last_scrobbled_episode(self, user_id: int) -> Optional["Video"]: + episode = None + last_scrobble = self.scrobbles_for_user( + user_id, include_playing=True + ).first() + if last_scrobble: + episode = last_scrobble.media_obj + return episode + + def is_episode_playing(self, user_id: int) -> bool: + last_scrobble = self.scrobbles_for_user( + user_id, include_playing=True + ).first() + return not last_scrobble.played_to_completion + def fix_metadata(self, force_update=False): name_or_id = self.name if self.imdb_id: @@ -95,6 +115,7 @@ class Video(ScrobblableMixin): tv_series = models.ForeignKey(Series, on_delete=models.DO_NOTHING, **BNULL) season_number = models.IntegerField(**BNULL) episode_number = models.IntegerField(**BNULL) + next_imdb_id = models.CharField(max_length=20, **BNULL) imdb_id = models.CharField(max_length=20, **BNULL) imdb_rating = models.FloatField(**BNULL) cover_image = models.ImageField(upload_to="videos/video/", **BNULL) diff --git a/vrobbler/apps/videos/utils.py b/vrobbler/apps/videos/utils.py index e3944f3..c732755 100644 --- a/vrobbler/apps/videos/utils.py +++ b/vrobbler/apps/videos/utils.py @@ -37,6 +37,7 @@ def get_or_create_video(name_or_id: str, force_update=False): "run_time_seconds": run_time_seconds, "episode_number": imdb_dict.get("episode", None), "season_number": imdb_dict.get("season", None), + "next_imdb_id": imdb_dict.get("next episode", None), "tv_series_id": series.id if series else None, } Video.objects.filter(pk=video.id).update(**video_dict) diff --git a/vrobbler/apps/videos/views.py b/vrobbler/apps/videos/views.py index 53eee18..b20b982 100644 --- a/vrobbler/apps/videos/views.py +++ b/vrobbler/apps/videos/views.py @@ -21,11 +21,16 @@ class SeriesDetailView(generic.DetailView): slug_field = "uuid" def get_context_data(self, **kwargs): + user_id = self.request.user.id context_data = super().get_context_data(**kwargs) - context_data["scrobbles"] = self.object.scrobbles_for_user( - self.request.user.id - ) + context_data["scrobbles"] = self.object.scrobbles_for_user(user_id) + next_episode_id = self.object.last_scrobbled_episode( + user_id + ).next_imdb_id + if self.object.is_episode_playing(user_id): + next_episode_id = None + context_data["next_episode_id"] = next_episode_id return context_data diff --git a/vrobbler/templates/videos/series_detail.html b/vrobbler/templates/videos/series_detail.html index 7fd8dad..baee566 100644 --- a/vrobbler/templates/videos/series_detail.html +++ b/vrobbler/templates/videos/series_detail.html @@ -28,6 +28,13 @@
{% if object.imdb_rating %}
{{object.imdb_rating}}
{% endif %} + {% if next_episode_id %} +
+ {% csrf_token %} + + +
+ {% endif %}
{% if object.plot%}

{{object.plot|safe|linebreaks|truncatewords:160}}

{% endif %}