diff --git a/.gitignore b/.gitignore
index 0179ec38..7701ab66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,3 +39,4 @@ build
version.txt
test_impl.py
./eslint.config.js
+.pytest_cache
diff --git a/ui/app/components/Simple.vue b/ui/app/components/Simple.vue
index a24e7dc9..a1939e1b 100644
--- a/ui/app/components/Simple.vue
+++ b/ui/app/components/Simple.vue
@@ -13,8 +13,9 @@
-
@@ -29,7 +30,7 @@
-
@@ -213,7 +228,8 @@ const videoItem = ref(null)
const formUrl = ref('')
const formPreset = ref<{ preset: string }>({ preset: app.value.default_preset || '' })
const addInProgress = ref(false)
-const showPresets = ref(false)
+const showExtras = ref(false)
+const dlFields = useStorage>('dl_fields', {})
const show_thumbnail = useStorage('show_thumbnail', true)
const sortByNewest = (items: StoreItem[]): StoreItem[] => items.slice().sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0))
@@ -247,9 +263,50 @@ const addDownload = async (): Promise => {
return
}
+ let cli = ''
+
+ const dlFieldsExtra = ['--no-download-archive']
+
+ const is_valid = (dl_field: string): boolean => {
+ if (dlFieldsExtra.includes(dl_field)) {
+ return true
+ }
+
+ if (configStore.dl_fields && configStore.dl_fields.length > 0) {
+ return configStore.dl_fields.some(f => dl_field === f.field)
+ }
+
+ return false
+ }
+
+ if (dlFields.value && Object.keys(dlFields.value).length > 0) {
+ const joined = []
+ for (const [key, value] of Object.entries(dlFields.value)) {
+ if (false === is_valid(key)) {
+ continue
+ }
+
+ if ([undefined, null, '', false].includes(value as any)) {
+ continue
+ }
+
+ const keyRegex = new RegExp(`(^|\\s)${key}(\\s|$)`)
+ if (cli && keyRegex.test(cli)) {
+ continue
+ }
+
+ joined.push(true === value ? `${key}` : `${key} ${value}`)
+ }
+
+ if (joined.length > 0) {
+ cli = joined.join(' ')
+ }
+ }
+
const payload: item_request[] = [{
url,
preset: formPreset.value.preset || app.value.default_preset,
+ cli: cli || '',
auto_start: true,
}]
@@ -274,6 +331,7 @@ const addDownload = async (): Promise => {
formUrl.value = ''
formPreset.value.preset = app.value.default_preset || ''
+ dlFields.value = {}
} catch (error) {
const message = error instanceof Error ? error.message : 'Failed to add download.'
toast.error(message)
@@ -544,6 +602,9 @@ const showMessage = (item: StoreItem) => {
return (item.msg?.length || 0) > 0
}
+// eslint-disable-next-line vue/no-side-effects-in-computed-properties
+const sortedDLFields = computed(() => configStore.dl_fields.sort((a, b) => (a.order || 0) - (b.order || 0)))
+
const connectionStatusColor = computed(() => {
switch (socketStore.connectionStatus) {
case 'connected':