added cli opts support for info extraction endpoint

This commit is contained in:
arabcoders 2025-07-27 16:07:38 +03:00
parent 964a24cdd5
commit 7b9144b200
2 changed files with 25 additions and 7 deletions

7
API.md
View file

@ -142,8 +142,9 @@ or an error:
**Query Parameters**: **Query Parameters**:
- `url=<video-url>` (required) - `url=<video-url>` (required)
- `preset=<preset-name>` (optional) - The preset to use for extracting info - `preset=<preset-name>` (optional) - The preset to use for extracting info.
- `force=true` (optional) - Force fetch new info instead of using cache - `force=true` (optional) - Force fetch new info instead of using cache.
- `args=<yt-dlp-command-opts>` (optional) - The yt-dlp command options to apply to the info extraction.
**Response** (example): **Response** (example):
```json ```json
@ -153,6 +154,8 @@ or an error:
"extractor": "youtube", "extractor": "youtube",
"_cached": { "_cached": {
"status": "miss|hit", "status": "miss|hit",
"preset": "<preset-name>",
"cli_args": "<yt-dlp-command-opts>",
"key": "<hash>", "key": "<hash>",
"ttl": 300, "ttl": 300,
"ttl_left": 299.82, "ttl_left": 299.82,

View file

@ -105,6 +105,8 @@ async def get_info(request: Request, cache: Cache, config: Config) -> Response:
status=web.HTTPBadRequest.status_code, status=web.HTTPBadRequest.status_code,
) )
opts = YTDLPOpts.get_instance()
preset: str = request.query.get("preset", config.default_preset) preset: str = request.query.get("preset", config.default_preset)
exists: Preset | None = Presets.get_instance().get(preset) exists: Preset | None = Presets.get_instance().get(preset)
if not exists: if not exists:
@ -114,14 +116,28 @@ async def get_info(request: Request, cache: Cache, config: Config) -> Response:
status=web.HTTPBadRequest.status_code, status=web.HTTPBadRequest.status_code,
) )
if cli_args := request.query.get("args", None):
try:
arg_converter(cli_args, dumps=True)
opts = opts.add_cli(cli_args, from_user=True)
except Exception as e:
err = str(e).strip()
err = err.split("\n")[-1] if "\n" in err else err
err = err.replace("main.py: error: ", "").strip().capitalize()
return web.json_response(
data={"error": f"Failed to parse command options for yt-dlp. '{err}'."},
status=web.HTTPBadRequest.status_code,
)
try: try:
key: str = cache.hash(f"{preset}:{url}") key: str = cache.hash(f"{preset}:{url}:{cli_args or ''}")
if cache.has(key) and not request.query.get("force", False): if cache.has(key) and not request.query.get("force", False):
data: Any | None = cache.get(key) data: Any | None = cache.get(key)
data["_cached"] = { data["_cached"] = {
"status": "hit", "status": "hit",
"preset": preset, "preset": preset,
"cli_args": cli_args,
"key": key, "key": key,
"ttl": data.get("_cached", {}).get("ttl", 300), "ttl": data.get("_cached", {}).get("ttl", 300),
"ttl_left": data.get("_cached", {}).get("expires", time.time() + 300) - time.time(), "ttl_left": data.get("_cached", {}).get("expires", time.time() + 300) - time.time(),
@ -129,20 +145,18 @@ async def get_info(request: Request, cache: Cache, config: Config) -> Response:
} }
return web.Response(body=json.dumps(data, indent=4, default=str), status=web.HTTPOk.status_code) return web.Response(body=json.dumps(data, indent=4, default=str), status=web.HTTPOk.status_code)
opts: dict = {}
if ytdlp_proxy := config.get_ytdlp_args().get("proxy", None): if ytdlp_proxy := config.get_ytdlp_args().get("proxy", None):
opts["proxy"] = ytdlp_proxy opts = opts.add({"proxy": ytdlp_proxy})
logs: list = [] logs: list = []
ytdlp_opts: dict = { ytdlp_opts: dict = {
**opts.get_all(),
"callback": { "callback": {
"func": lambda _, msg: logs.append(msg), "func": lambda _, msg: logs.append(msg),
"level": logging.WARNING, "level": logging.WARNING,
"name": "callback-logger", "name": "callback-logger",
}, },
**YTDLPOpts.get_instance().preset(name=preset).add(opts).get_all(),
} }
data = extract_info( data = extract_info(
@ -177,6 +191,7 @@ async def get_info(request: Request, cache: Cache, config: Config) -> Response:
data["_cached"] = { data["_cached"] = {
"status": "miss", "status": "miss",
"preset": preset, "preset": preset,
"cli_args": cli_args,
"key": key, "key": key,
"ttl": 300, "ttl": 300,
"ttl_left": 300, "ttl_left": 300,