mhdzumair's picture
Add Support for play expired or self-signed SSL certificates server streams
0e2d63a
raw
history blame
5.35 kB
from fastapi import Request, Depends, APIRouter
from pydantic import HttpUrl
from .handlers import handle_hls_stream_proxy, proxy_stream, get_manifest, get_playlist, get_segment, get_public_ip
from .utils.http_utils import get_proxy_headers
proxy_router = APIRouter()
@proxy_router.head("/hls")
@proxy_router.get("/hls")
async def hls_stream_proxy(
request: Request,
d: HttpUrl,
headers: dict = Depends(get_proxy_headers),
key_url: HttpUrl | None = None,
verify_ssl: bool = True,
):
"""
Proxify HLS stream requests, fetching and processing the m3u8 playlist or streaming the content.
Args:
request (Request): The incoming HTTP request.
d (HttpUrl): The destination URL to fetch the content from.
key_url (HttpUrl, optional): The HLS Key URL to replace the original key URL. Defaults to None. (Useful for bypassing some sneaky protection)
headers (dict): The headers to include in the request.
verify_ssl (bool, optional): Whether to verify the SSL certificate of the destination. Defaults to True.
Returns:
Response: The HTTP response with the processed m3u8 playlist or streamed content.
"""
destination = str(d)
return await handle_hls_stream_proxy(request, destination, headers, key_url, verify_ssl)
@proxy_router.head("/stream")
@proxy_router.get("/stream")
async def proxy_stream_endpoint(
request: Request, d: HttpUrl, headers: dict = Depends(get_proxy_headers), verify_ssl: bool = True
):
"""
Proxies stream requests to the given video URL.
Args:
request (Request): The incoming HTTP request.
d (HttpUrl): The URL of the video to stream.
headers (dict): The headers to include in the request.
verify_ssl (bool, optional): Whether to verify the SSL certificate of the destination. Defaults to True.
Returns:
Response: The HTTP response with the streamed content.
"""
headers.update({"range": headers.get("range", "bytes=0-")})
return await proxy_stream(request.method, str(d), headers, verify_ssl)
@proxy_router.get("/mpd/manifest")
async def manifest_endpoint(
request: Request,
d: HttpUrl,
headers: dict = Depends(get_proxy_headers),
key_id: str = None,
key: str = None,
verify_ssl: bool = True,
):
"""
Retrieves and processes the MPD manifest, converting it to an HLS manifest.
Args:
request (Request): The incoming HTTP request.
d (HttpUrl): The URL of the MPD manifest.
headers (dict): The headers to include in the request.
key_id (str, optional): The DRM key ID. Defaults to None.
key (str, optional): The DRM key. Defaults to None.
verify_ssl (bool, optional): Whether to verify the SSL certificate of the destination. Defaults to True.
Returns:
Response: The HTTP response with the HLS manifest.
"""
return await get_manifest(request, str(d), headers, key_id, key, verify_ssl)
@proxy_router.get("/mpd/playlist")
async def playlist_endpoint(
request: Request,
d: HttpUrl,
profile_id: str,
headers: dict = Depends(get_proxy_headers),
key_id: str = None,
key: str = None,
verify_ssl: bool = True,
):
"""
Retrieves and processes the MPD manifest, converting it to an HLS playlist for a specific profile.
Args:
request (Request): The incoming HTTP request.
d (HttpUrl): The URL of the MPD manifest.
profile_id (str): The profile ID to generate the playlist for.
headers (dict): The headers to include in the request.
key_id (str, optional): The DRM key ID. Defaults to None.
key (str, optional): The DRM key. Defaults to None.
verify_ssl (bool, optional): Whether to verify the SSL certificate of the destination. Defaults to True.
Returns:
Response: The HTTP response with the HLS playlist.
"""
return await get_playlist(request, str(d), profile_id, headers, key_id, key, verify_ssl)
@proxy_router.get("/mpd/segment")
async def segment_endpoint(
init_url: HttpUrl,
segment_url: HttpUrl,
mime_type: str,
headers: dict = Depends(get_proxy_headers),
key_id: str = None,
key: str = None,
verify_ssl: bool = True,
):
"""
Retrieves and processes a media segment, decrypting it if necessary.
Args:
init_url (HttpUrl): The URL of the initialization segment.
segment_url (HttpUrl): The URL of the media segment.
mime_type (str): The MIME type of the segment.
headers (dict): The headers to include in the request.
key_id (str, optional): The DRM key ID. Defaults to None.
key (str, optional): The DRM key. Defaults to None.
verify_ssl (bool, optional): Whether to verify the SSL certificate of the destination. Defaults to True.
Returns:
Response: The HTTP response with the processed segment.
"""
return await get_segment(str(init_url), str(segment_url), mime_type, headers, key_id, key, verify_ssl)
@proxy_router.get("/ip")
async def get_mediaflow_proxy_public_ip():
"""
Retrieves the public IP address of the MediaFlow proxy server.
Returns:
Response: The HTTP response with the public IP address in the form of a JSON object. {"ip": "xxx.xxx.xxx.xxx"}
"""
return await get_public_ip()