(request, profile_name=None, user=None)
| 78 | return generate_m3u(request, profile_name, user) |
| 79 | |
| 80 | def epg_endpoint(request, profile_name=None, user=None): |
| 81 | logger.debug("epg_endpoint called: method=%s, profile=%s", request.method, profile_name) |
| 82 | if not network_access_allowed(request, "M3U_EPG"): |
| 83 | # Log blocked EPG download |
| 84 | from core.utils import log_system_event |
| 85 | client_ip = request.META.get('REMOTE_ADDR', 'unknown') |
| 86 | user_agent = request.META.get('HTTP_USER_AGENT', 'unknown') |
| 87 | log_system_event( |
| 88 | event_type='epg_blocked', |
| 89 | profile=profile_name or 'all', |
| 90 | reason='Network access denied', |
| 91 | client_ip=client_ip, |
| 92 | user_agent=user_agent, |
| 93 | ) |
| 94 | return JsonResponse({"error": "Forbidden"}, status=403) |
| 95 | |
| 96 | # Handle HEAD requests efficiently without generating content |
| 97 | if request.method == "HEAD": |
| 98 | logger.debug("Handling HEAD request for EPG") |
| 99 | response = HttpResponse(content_type="application/xml") |
| 100 | response["Content-Disposition"] = 'attachment; filename="Dispatcharr.xml"' |
| 101 | response["Cache-Control"] = "no-cache" |
| 102 | return response |
| 103 | |
| 104 | return generate_epg(request, profile_name, user) |
| 105 | |
| 106 | @csrf_exempt |
| 107 | @require_http_methods(["GET", "POST", "HEAD"]) |
nothing calls this directly
no test coverage detected