Explorar o código

Split scrobble endpoints up

Colin Powell %!s(int64=2) %!d(string=hai) anos
pai
achega
410fe36d9a
Modificáronse 3 ficheiros con 94 adicións e 94 borrados
  1. 2 1
      scrobbles/urls.py
  2. 91 91
      scrobbles/views.py
  3. 1 2
      vrobbler/urls.py

+ 2 - 1
scrobbles/urls.py

@@ -4,5 +4,6 @@ from scrobbles import views
 app_name = 'scrobbles'
 
 urlpatterns = [
-    path('', views.scrobble_list, name='scrobble-list'),
+    path('', views.scrobble_endpoint, name='scrobble-list'),
+    path('jellyfin/', views.jellyfin_websocket, name='jellyfin-websocket'),
 ]

+ 91 - 91
scrobbles/views.py

@@ -38,101 +38,101 @@ class RecentScrobbleList(ListView):
 
 
 @csrf_exempt
-@api_view(['GET', 'POST'])
-def scrobble_list(request):
+@api_view(['GET'])
+def scrobble_endpoint(request):
     """List all Scrobbles, or create a new Scrobble"""
-    if request.method == 'GET':
-        scrobble = Scrobble.objects.all()
-        serializer = ScrobbleSerializer(scrobble, many=True)
-        return Response(serializer.data)
-
-    elif request.method == 'POST':
-        data_dict = request.data
-        media_type = data_dict["ItemType"]
-        # Check if it's a TV Episode
-        video_dict = {
-            "title": data_dict["Name"],
-            "imdb_id": data_dict["Provider_imdb"],
-            "video_type": Video.VideoType.MOVIE,
-            "year": data_dict["Year"],
-        }
-        if media_type == 'Episode':
-            series_name = data_dict["SeriesName"]
-            series, series_created = Series.objects.get_or_create(
-                name=series_name
-            )
-
-            video_dict['video_type'] = Video.VideoType.TV_EPISODE
-            video_dict["tv_series_id"] = series.id
-            video_dict["episode_number"] = data_dict["EpisodeNumber"]
-            video_dict["season_number"] = data_dict["SeasonNumber"]
-            video_dict["tvdb_id"] = data_dict.get("Provider_tvdb", None)
-            video_dict["tvrage_id"] = data_dict.get("Provider_tvrage", None)
-
-        video, video_created = Video.objects.get_or_create(**video_dict)
-
-        if video_created:
-            video.overview = data_dict["Overview"]
-            video.tagline = data_dict["Tagline"]
-            video.run_time_ticks = data_dict["RunTimeTicks"]
-            video.run_time = data_dict["RunTime"]
-            video.save()
-
-        # Now we run off a scrobble
-        timestamp = parse(data_dict["UtcTimestamp"])
-        scrobble_dict = {
-            'video_id': video.id,
-            'user_id': request.user.id,
-            'in_progress': True,
-        }
-
-        existing_finished_scrobble = (
-            Scrobble.objects.filter(
-                video=video, user_id=request.user.id, in_progress=False
-            )
-            .order_by('-modified')
-            .first()
-        )
-
-        minutes_from_now = timezone.now() + timedelta(minutes=15)
+    scrobble = Scrobble.objects.all()
+    serializer = ScrobbleSerializer(scrobble, many=True)
+    return Response(serializer.data)
 
-        if (
-            existing_finished_scrobble
-            and existing_finished_scrobble.modified < minutes_from_now
-        ):
-            logger.info(
-                'Found a scrobble for this video less than 15 minutes ago, holding off scrobbling again'
-            )
-            return Response(video_dict, status=status.HTTP_204_NO_CONTENT)
 
-        scrobble, scrobble_created = Scrobble.objects.get_or_create(
-            **scrobble_dict
+@csrf_exempt
+@api_view(['POST'])
+def jellyfin_websocket(request):
+    data_dict = request.data
+    media_type = data_dict["ItemType"]
+    # Check if it's a TV Episode
+    video_dict = {
+        "title": data_dict["Name"],
+        "imdb_id": data_dict["Provider_imdb"],
+        "video_type": Video.VideoType.MOVIE,
+        "year": data_dict["Year"],
+    }
+    if media_type == 'Episode':
+        series_name = data_dict["SeriesName"]
+        series, series_created = Series.objects.get_or_create(name=series_name)
+
+        video_dict['video_type'] = Video.VideoType.TV_EPISODE
+        video_dict["tv_series_id"] = series.id
+        video_dict["episode_number"] = data_dict["EpisodeNumber"]
+        video_dict["season_number"] = data_dict["SeasonNumber"]
+        video_dict["tvdb_id"] = data_dict.get("Provider_tvdb", None)
+        video_dict["tvrage_id"] = data_dict.get("Provider_tvrage", None)
+
+    video, video_created = Video.objects.get_or_create(**video_dict)
+
+    if video_created:
+        video.overview = data_dict["Overview"]
+        video.tagline = data_dict["Tagline"]
+        video.run_time_ticks = data_dict["RunTimeTicks"]
+        video.run_time = data_dict["RunTime"]
+        video.save()
+
+    # Now we run off a scrobble
+    timestamp = parse(data_dict["UtcTimestamp"])
+    scrobble_dict = {
+        'video_id': video.id,
+        'user_id': request.user.id,
+        'in_progress': True,
+    }
+
+    existing_finished_scrobble = (
+        Scrobble.objects.filter(
+            video=video, user_id=request.user.id, in_progress=False
         )
-
-        if scrobble_created:
-            # If we newly created this, capture the client we're watching from
-            scrobble.source = data_dict['ClientName']
-            scrobble.source_id = data_dict['MediaSourceId']
-        else:
-            last_tick = scrobble.playback_position_ticks
-
-        # Update a found scrobble with new position and timestamp
-        scrobble.playback_position_ticks = data_dict["PlaybackPositionTicks"]
-        scrobble.playback_position = data_dict["PlaybackPosition"]
-        scrobble.timestamp = parse(data_dict["UtcTimestamp"])
-        scrobble.is_paused = data_dict["IsPaused"] in TRUTHY_VALUES
+        .order_by('-modified')
+        .first()
+    )
+
+    minutes_from_now = timezone.now() + timedelta(minutes=15)
+
+    if (
+        existing_finished_scrobble
+        and existing_finished_scrobble.modified < minutes_from_now
+    ):
+        logger.info(
+            'Found a scrobble for this video less than 15 minutes ago, holding off scrobbling again'
+        )
+        return Response(video_dict, status=status.HTTP_204_NO_CONTENT)
+
+    scrobble, scrobble_created = Scrobble.objects.get_or_create(
+        **scrobble_dict
+    )
+
+    if scrobble_created:
+        # If we newly created this, capture the client we're watching from
+        scrobble.source = data_dict['ClientName']
+        scrobble.source_id = data_dict['MediaSourceId']
+    else:
+        last_tick = scrobble.playback_position_ticks
+
+    # Update a found scrobble with new position and timestamp
+    scrobble.playback_position_ticks = data_dict["PlaybackPositionTicks"]
+    scrobble.playback_position = data_dict["PlaybackPosition"]
+    scrobble.timestamp = parse(data_dict["UtcTimestamp"])
+    scrobble.is_paused = data_dict["IsPaused"] in TRUTHY_VALUES
+    scrobble.save()
+
+    # If we hit our completion threshold, save it and get ready
+    # to scrobble again if we re-watch this.
+    if scrobble.percent_played >= getattr(
+        settings, "PERCENT_FOR_COMPLETION", 95
+    ):
+        scrobble.in_progress = False
+        scrobble.playback_position_ticks = video.run_time_ticks
         scrobble.save()
 
-        # If we hit our completion threshold, save it and get ready
-        # to scrobble again if we re-watch this.
-        if scrobble.percent_played >= getattr(
-            settings, "PERCENT_FOR_COMPLETION", 95
-        ):
-            scrobble.in_progress = False
-            scrobble.playback_position_ticks = video.run_time_ticks
-            scrobble.save()
-
-        if scrobble.percent_played % 5 == 0:
-            logger.info(f"You are {scrobble.percent_played}% through {video}")
+    if scrobble.percent_played % 5 == 0:
+        logger.info(f"You are {scrobble.percent_played}% through {video}")
 
-        return Response(video_dict, status=status.HTTP_201_CREATED)
+    return Response(video_dict, status=status.HTTP_201_CREATED)

+ 1 - 2
vrobbler/urls.py

@@ -21,10 +21,9 @@ urlpatterns = [
     path("admin/", admin.site.urls),
     path("accounts/", include("allauth.urls")),
     # path("api-auth/", include("rest_framework.urls")),
-    # path("api/v1/", include(router.urls)),
     # path("movies/", include(movies, namespace="movies")),
     # path("shows/", include(shows, namespace="shows")),
-    path("scrobbles/", include(scrobble_urls, namespace="scrobbles")),
+    path("api/v1/scrobbles/", include(scrobble_urls, namespace="scrobbles")),
     path("", RecentScrobbleList.as_view(), name="home"),
 ]