From 355adfade47db40dfb68aacda38b770c81e8f31f Mon Sep 17 00:00:00 2001 From: arabcoders Date: Thu, 7 Aug 2025 21:01:24 +0300 Subject: [PATCH] more changes to support custom fields in download form --- app/library/dl_fields.py | 7 +- app/routes/api/dl_fields.py | 2 +- app/routes/socket/connection.py | 2 + ui/app/components/DLFields.vue | 245 ++++++++++++++++++++++++++++++ ui/app/components/NewDownload.vue | 10 ++ ui/app/stores/ConfigStore.ts | 1 + ui/app/stores/SocketStore.ts | 1 + ui/app/types/config.d.ts | 2 + ui/app/types/dl_fields.d.ts | 4 +- 9 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 ui/app/components/DLFields.vue diff --git a/app/library/dl_fields.py b/app/library/dl_fields.py index 7d45d29b..34281b01 100644 --- a/app/library/dl_fields.py +++ b/app/library/dl_fields.py @@ -1,5 +1,6 @@ import json import logging +import re import uuid from dataclasses import dataclass, field from enum import Enum @@ -153,7 +154,7 @@ class DLFields(metaclass=Singleton): def get_all(self) -> list[DLField]: """Return the items.""" - return self._default + self._items + return self._items def load(self) -> "DLFields": """ @@ -257,6 +258,10 @@ class DLFields(metaclass=Singleton): msg = "Extras must be a dictionary." raise ValueError(msg) # noqa: TRY004 + if re.match(r"^--[a-zA-Z0-9\-]+$", item.get("field", "").strip()) is None: + msg = "Invalid yt-dlp option field it must starts with '--' and contain only alphanumeric characters." + raise ValueError(msg) + return True def save(self, items: list[DLField | dict]) -> "DLFields": diff --git a/app/routes/api/dl_fields.py b/app/routes/api/dl_fields.py index d8ac9ce7..87f67dd2 100644 --- a/app/routes/api/dl_fields.py +++ b/app/routes/api/dl_fields.py @@ -85,7 +85,7 @@ async def dl_fields_add(request: Request, encoder: Encoder, notify: EventBus) -> status=web.HTTPBadRequest.status_code, ) - items.append(init_class(DLFields, item)) + items.append(init_class(DLField, item)) try: items = cls.save(items=items).load().get_all() diff --git a/app/routes/socket/connection.py b/app/routes/socket/connection.py index bce02997..37c2b74e 100644 --- a/app/routes/socket/connection.py +++ b/app/routes/socket/connection.py @@ -6,6 +6,7 @@ from typing import Any import socketio from app.library.config import Config +from app.library.dl_fields import DLFields from app.library.DownloadQueue import DownloadQueue from app.library.Events import EventBus, Events from app.library.Presets import Presets @@ -26,6 +27,7 @@ async def connect(config: Config, queue: DownloadQueue, notify: EventBus, sid: s **queue.get(), "config": config.frontend(), "presets": Presets.get_instance().get_all(), + "dl_fields": DLFields.get_instance().get_all(), "paused": queue.is_paused(), } diff --git a/ui/app/components/DLFields.vue b/ui/app/components/DLFields.vue new file mode 100644 index 00000000..b1f50b25 --- /dev/null +++ b/ui/app/components/DLFields.vue @@ -0,0 +1,245 @@ + + + diff --git a/ui/app/components/NewDownload.vue b/ui/app/components/NewDownload.vue index 55cd9f34..dd8b23a1 100644 --- a/ui/app/components/NewDownload.vue +++ b/ui/app/components/NewDownload.vue @@ -198,6 +198,13 @@
+ +
+