From 78bbfb39ea8be0def58f8bdb09f8e3e6f0d0cb97 Mon Sep 17 00:00:00 2001 From: Dispatcharr Date: Sun, 12 Oct 2025 21:18:37 -0500 Subject: [PATCH] Proxy Test --- apps/media_library/api_views.py | 4 +--- apps/proxy/urls.py | 7 +++++-- apps/proxy/views.py | 21 +++++++++++++++++---- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/apps/media_library/api_views.py b/apps/media_library/api_views.py index 2b634a3a..6b57aa22 100644 --- a/apps/media_library/api_views.py +++ b/apps/media_library/api_views.py @@ -482,9 +482,7 @@ class MediaItemViewSet(viewsets.ModelViewSet): payload["start_ms"] = applied_start_ms token = self._stream_signer.sign_object(payload) - stream_url = request.build_absolute_uri( - reverse("api:media:stream-file", args=[token]) - ) + stream_url = request.build_absolute_uri(reverse("proxy:library-stream", args=[token])) ttl = getattr(settings, "MEDIA_LIBRARY_STREAM_TOKEN_TTL", 3600) return Response( { diff --git a/apps/proxy/urls.py b/apps/proxy/urls.py index 34c026a9..458615d9 100644 --- a/apps/proxy/urls.py +++ b/apps/proxy/urls.py @@ -1,4 +1,6 @@ -from django.urls import path, include +from django.urls import include, path + +from . import views app_name = 'proxy' @@ -6,4 +8,5 @@ urlpatterns = [ path('ts/', include('apps.proxy.ts_proxy.urls')), path('hls/', include('apps.proxy.hls_proxy.urls')), path('vod/', include('apps.proxy.vod_proxy.urls')), -] \ No newline at end of file + path('library//', views.library_stream, name='library-stream'), +] diff --git a/apps/proxy/views.py b/apps/proxy/views.py index d816992f..42889ded 100644 --- a/apps/proxy/views.py +++ b/apps/proxy/views.py @@ -1,8 +1,12 @@ -from rest_framework import viewsets, status +import logging + +from django.apps import apps +from django.http import HttpResponse +from rest_framework import status, viewsets from rest_framework.decorators import action from rest_framework.response import Response -from django.apps import apps -import logging + +from apps.media_library.views import stream_media_file logger = logging.getLogger(__name__) @@ -40,6 +44,7 @@ class ProxyViewSet(viewsets.ViewSet): status=status.HTTP_500_INTERNAL_SERVER_ERROR ) + @action(detail=False, methods=['post']) def stop(self, request): """Stop a proxy server for a channel""" @@ -61,4 +66,12 @@ class ProxyViewSet(viewsets.ViewSet): return Response( {'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR - ) \ No newline at end of file + ) + + +def library_stream(request, token: str) -> HttpResponse: + """ + Shallow proxy around the media library stream endpoint so playback traffic + is routed through the proxy layer (for stats, connection tracking, etc.). + """ + return stream_media_file(request, token)