added cli opts support for info extraction endpoint
This commit is contained in:
parent
964a24cdd5
commit
7b9144b200
2 changed files with 25 additions and 7 deletions
7
API.md
7
API.md
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue