71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
from typing import TYPE_CHECKING, Any
|
|
|
|
from app.features.tasks.definitions.results import HandleTask, TaskFailure, TaskResult
|
|
from app.library.config import Config
|
|
from app.library.httpx_client import Globals, build_request_headers, get_async_client, resolve_curl_transport
|
|
|
|
if TYPE_CHECKING:
|
|
import httpx
|
|
|
|
|
|
class BaseHandler:
|
|
@staticmethod
|
|
async def can_handle(task: HandleTask) -> bool:
|
|
_ = task
|
|
return False
|
|
|
|
@staticmethod
|
|
async def extract(task: HandleTask, config: Config | None = None) -> TaskResult | TaskFailure:
|
|
raise NotImplementedError
|
|
|
|
@classmethod
|
|
async def inspect(cls, task: HandleTask, config: Config | None = None) -> TaskResult | TaskFailure:
|
|
return await cls.extract(task=task, config=config)
|
|
|
|
@staticmethod
|
|
def parse(url: str) -> Any | None:
|
|
_ = url
|
|
return None
|
|
|
|
@staticmethod
|
|
def tests() -> list[tuple[str, bool]]:
|
|
return []
|
|
|
|
@staticmethod
|
|
async def request(
|
|
url: str, headers: dict | None = None, ytdlp_opts: dict | None = None, **kwargs
|
|
) -> "httpx.Response":
|
|
"""
|
|
Make an HTTP request.
|
|
|
|
Args:
|
|
url (str): The URL to request.
|
|
headers (dict | None): Additional headers to include in the request.
|
|
ytdlp_opts (dict | None): yt-dlp options that may affect the request.
|
|
**kwargs: Additional arguments to pass to httpx request.
|
|
|
|
Returns:
|
|
httpx.Response: The HTTP response.
|
|
|
|
"""
|
|
headers = {} if not isinstance(headers, dict) else headers
|
|
ytdlp_opts = {} if not isinstance(ytdlp_opts, dict) else ytdlp_opts
|
|
|
|
use_curl = resolve_curl_transport()
|
|
request_headers = build_request_headers(
|
|
base_headers=headers,
|
|
user_agent=Globals.get_random_agent(),
|
|
use_curl=use_curl,
|
|
)
|
|
|
|
proxy = ytdlp_opts.get("proxy", None)
|
|
client = get_async_client(proxy=proxy, use_curl=use_curl)
|
|
method = kwargs.pop("method", "GET").upper()
|
|
timeout = ytdlp_opts.get("timeout", ytdlp_opts.get("socket_timeout", 120))
|
|
return await client.request(
|
|
method=method,
|
|
url=url,
|
|
headers=request_headers,
|
|
timeout=timeout,
|
|
**kwargs,
|
|
)
|