From 016d8557e684891ab2032910d51903d9fbdd1103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Koh=C3=A1nyi=20R=C3=B3bert?= Date: Mon, 3 Feb 2025 20:40:57 +0100 Subject: [PATCH] feat: allow auto/pre-selected extension (#255) * feat: allow auto/pre-selected extension * fix: revert typo and changes made for local dev --- .devcontainer/devcontainer.json | 27 ++++++++++++++++ .gitignore | 2 ++ frontend/package.json | 2 +- frontend/src/assets/i18n/ca.yaml | 1 + frontend/src/assets/i18n/de.yaml | 1 + frontend/src/assets/i18n/en_US.yaml | 1 + frontend/src/assets/i18n/es.yaml | 1 + frontend/src/assets/i18n/fr.yaml | 1 + frontend/src/assets/i18n/hu.yaml | 1 + frontend/src/assets/i18n/it_IT.yaml | 1 + frontend/src/assets/i18n/ja.yaml | 1 + frontend/src/assets/i18n/ko.yaml | 1 + frontend/src/assets/i18n/pl.yaml | 1 + frontend/src/assets/i18n/pt_BR.yaml | 1 + frontend/src/assets/i18n/ru.yaml | 1 + frontend/src/assets/i18n/sv.yaml | 1 + frontend/src/assets/i18n/uk.yaml | 1 + frontend/src/assets/i18n/zh_CN.yaml | 1 + frontend/src/atoms/settings.ts | 7 ++++ frontend/src/components/DownloadDialog.tsx | 37 ++++++++++++++++++++-- frontend/src/views/Settings.tsx | 20 ++++++++++++ 21 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..1aad277 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/go +{ + "name": "Go", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/go:1-1.23-bookworm", + "features": { + "ghcr.io/devcontainers-extra/features/pnpm:2": {}, + "ghcr.io/devcontainers-extra/features/ffmpeg-apt-get:1": {}, + "ghcr.io/devcontainers-extra/features/yt-dlp:2": {} + } + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "go version" + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.gitignore b/.gitignore index b6cc977..f87bef8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ result/ result dist +.pnpm-store/ .pnpm-debug.log node_modules .env @@ -26,3 +27,4 @@ frontend/.pnp.loader.mjs frontend/.yarn/install-state.gz .db.lock livestreams.dat +.vite/deps \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index a80a810..8da9a81 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,7 +3,7 @@ "version": "3.2.3", "description": "Frontend compontent of yt-dlp-webui", "scripts": { - "dev": "vite", + "dev": "vite --host 0.0.0.0", "build": "vite build" }, "author": "marcopiovanello", diff --git a/frontend/src/assets/i18n/ca.yaml b/frontend/src/assets/i18n/ca.yaml index a4a9cbb..21da777 100644 --- a/frontend/src/assets/i18n/ca.yaml +++ b/frontend/src/assets/i18n/ca.yaml @@ -21,6 +21,7 @@ keys: overridesAnchor: Anul·lacions pathOverrideOption: Sobreescriure en la ruta de sortida filenameOverrideOption: Sobreescriure el nom del fitxer + autoFileExtensionOption: Afegeix l'extensió de fitxer automàticament customFilename: Nom d'arxiu personalitzat (en blanc per utilitzar el predeterminat) customPath: Ruta personalitzada customArgs: Habilitar els arguments yt-dlp personalitzats (un gran poder comporta una gran responsabilitat) diff --git a/frontend/src/assets/i18n/de.yaml b/frontend/src/assets/i18n/de.yaml index 856f37f..b722fa7 100644 --- a/frontend/src/assets/i18n/de.yaml +++ b/frontend/src/assets/i18n/de.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: Überschreibungen pathOverrideOption: Ausgabe-Pfad Überschreibung aktivieren filenameOverrideOption: Ausgabe-Dateiname Überschreibung aktivieren + autoFileExtensionOption: Dateierweiterung automatisch hinzufügen customFilename: Benutzerdefinierter Dateiname (Leer lassen um Standardwert zu nutzen) customPath: Benutzerdefinierter Pfad customArgs: Benutzerdefinierte yt-dlp Argumente aktivieren (Auf viel Macht folgt große Verantwortung) diff --git a/frontend/src/assets/i18n/en_US.yaml b/frontend/src/assets/i18n/en_US.yaml index 3edbbb7..9260df6 100644 --- a/frontend/src/assets/i18n/en_US.yaml +++ b/frontend/src/assets/i18n/en_US.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: Overrides pathOverrideOption: Enable output path overriding filenameOverrideOption: Enable output file name overriding + autoFileExtensionOption: Automatically add file extension customFilename: Custom filename (leave blank to use default) customPath: Custom path customArgs: Enable custom yt-dlp args (great power = great responsibilities) diff --git a/frontend/src/assets/i18n/es.yaml b/frontend/src/assets/i18n/es.yaml index f5cd0c3..289ed76 100644 --- a/frontend/src/assets/i18n/es.yaml +++ b/frontend/src/assets/i18n/es.yaml @@ -21,6 +21,7 @@ keys: overridesAnchor: Anulaciones pathOverrideOption: Sobreescribir en la ruta de salida filenameOverrideOption: Sobreescribir el nombre del fichero + autoFileExtensionOption: Agregar extensión de archivo automáticamente customFilename: Nombre de archivo personalizado (en blanco para usar el predeterminado) customPath: Ruta personalizada customArgs: Habilitar los argumentos yt-dlp personalizados (un gran poder conlleva una gran responsabilidad) diff --git a/frontend/src/assets/i18n/fr.yaml b/frontend/src/assets/i18n/fr.yaml index b4760df..bcce061 100644 --- a/frontend/src/assets/i18n/fr.yaml +++ b/frontend/src/assets/i18n/fr.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: Remplacer pathOverrideOption: Activer le remplacement du chemin de sortie filenameOverrideOption: Activer le remplacement du nom du fichier de sortie + autoFileExtensionOption: Ajouter automatiquement l'extension de fichier customFilename: Nom de fichier personnalisé (laisser vide pour utiliser le nom par défaut) customPath: Chemin personnalisé customArgs: Activer les args personnalisés yt-dlp (grand pouvoir = grandes responsabilités) diff --git a/frontend/src/assets/i18n/hu.yaml b/frontend/src/assets/i18n/hu.yaml index 18c9c6b..ab045f9 100644 --- a/frontend/src/assets/i18n/hu.yaml +++ b/frontend/src/assets/i18n/hu.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: Felülbírálások pathOverrideOption: Letöltési útvonal felülbírálása filenameOverrideOption: Letöltési fájlnév felülbírálása + autoFileExtensionOption: Automatikus fájlkiterjesztés customFilename: Egyedi fájlnév (hagyd üresen, hogy a fájlnév automatikusan generálódjon) customPath: Egyedi útvonal customArgs: Egyedi yt-dlp argumentumok (Nagy hatalommal nagy felelősség jár.) diff --git a/frontend/src/assets/i18n/it_IT.yaml b/frontend/src/assets/i18n/it_IT.yaml index 2e41207..796385e 100644 --- a/frontend/src/assets/i18n/it_IT.yaml +++ b/frontend/src/assets/i18n/it_IT.yaml @@ -21,6 +21,7 @@ keys: overridesAnchor: Sovrascritture pathOverrideOption: Abilita sovrascrittura percorso di output filenameOverrideOption: Abilita sovrascrittura del nome del file di output + autoFileExtensionOption: Aggiungi estensione automaticamente customFilename: Custom filename (leave blank to use default) customPath: Custom path customArgs: Enable custom yt-dlp args (great power = great responsabilities) diff --git a/frontend/src/assets/i18n/ja.yaml b/frontend/src/assets/i18n/ja.yaml index dc61bb5..d888d3b 100644 --- a/frontend/src/assets/i18n/ja.yaml +++ b/frontend/src/assets/i18n/ja.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: 上書き pathOverrideOption: 保存するディレクトリ filenameOverrideOption: ファイル名の上書き + autoFileExtensionOption: 自動ファイル拡張子 customFilename: (空白の場合は元のファイル名) customPath: 保存先 customArgs: yt-dlpのオプションの有効化 (最適設定にする場合) diff --git a/frontend/src/assets/i18n/ko.yaml b/frontend/src/assets/i18n/ko.yaml index b36339b..5fdffa7 100644 --- a/frontend/src/assets/i18n/ko.yaml +++ b/frontend/src/assets/i18n/ko.yaml @@ -21,6 +21,7 @@ keys: overridesAnchor: Overrides pathOverrideOption: Enable output path overriding filenameOverrideOption: Enable output file name overriding + autoFileExtensionOption: 자동으로 파일 확장자 추가 customFilename: Custom filename (leave blank to use default) customPath: Custom path customArgs: Enable custom yt-dlp args (great power = great responsabilities) diff --git a/frontend/src/assets/i18n/pl.yaml b/frontend/src/assets/i18n/pl.yaml index 736d29f..c933987 100644 --- a/frontend/src/assets/i18n/pl.yaml +++ b/frontend/src/assets/i18n/pl.yaml @@ -21,6 +21,7 @@ keys: overridesAnchor: Przedefiniuj pathOverrideOption: Aktywuj zastąpienie ścieżki źródłowej filenameOverrideOption: Aktywuj zastępowanie nazwy pliku źródłowego + autoFileExtensionOption: Automatyczne rozszerzenie pliku customFilename: Wprowadź nazwę pliku (pozostaw puste, aby użyć nazwy domyślnej) customPath: Ustaw ścieżkę customArgs: Uwzględnij konfigurowalne argumenty yt-dlp (wielka moc = wielka odpowiedzialność) diff --git a/frontend/src/assets/i18n/pt_BR.yaml b/frontend/src/assets/i18n/pt_BR.yaml index 99a89c0..543774d 100644 --- a/frontend/src/assets/i18n/pt_BR.yaml +++ b/frontend/src/assets/i18n/pt_BR.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: Substituições pathOverrideOption: Habilitar substituição do caminho de saída filenameOverrideOption: Habilitar substituição do nome do arquivo de saída + autoFileExtensionOption: Adicionar extensão de arquivo automaticamente customFilename: Nome de arquivo personalizado (deixe em branco para usar o padrão) customPath: Caminho personalizado customArgs: Habilitar argumentos personalizados do yt-dlp (grandes poderes = grandes responsabilidades) diff --git a/frontend/src/assets/i18n/ru.yaml b/frontend/src/assets/i18n/ru.yaml index fb45cd9..15e2d53 100644 --- a/frontend/src/assets/i18n/ru.yaml +++ b/frontend/src/assets/i18n/ru.yaml @@ -21,6 +21,7 @@ keys: overridesAnchor: Переопределить pathOverrideOption: Активировать переопределение выходного пути filenameOverrideOption: Активировать переопределение имени выходного файла + autoFileExtensionOption: Автоматическое расширение файла customFilename: Задать имя файла (оставьте пустым, чтобы использовать значение по умолчанию) customPath: Задать путь customArgs: Включить настраиваемые аргументы yt-dlp (большая сила = большая ответственность) diff --git a/frontend/src/assets/i18n/sv.yaml b/frontend/src/assets/i18n/sv.yaml index 2414952..fba27ce 100644 --- a/frontend/src/assets/i18n/sv.yaml +++ b/frontend/src/assets/i18n/sv.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: Överskrivningar pathOverrideOption: Tillåt överskrivning av filsökvägen filenameOverrideOption: Tillåt överskrivning av filnamn + autoFileExtensionOption: Lägg till filändelse automatiskt customFilename: Eget filnamn (lämna blankt för standardnamn) customPath: Egen filsökväg customArgs: Tillåt egna yt-dlp-argument (frihet under ansvar!) diff --git a/frontend/src/assets/i18n/uk.yaml b/frontend/src/assets/i18n/uk.yaml index 502465e..969f408 100644 --- a/frontend/src/assets/i18n/uk.yaml +++ b/frontend/src/assets/i18n/uk.yaml @@ -21,6 +21,7 @@ keys: overridesAnchor: Перевизначити pathOverrideOption: Активувати перевизначення вихідного шляху filenameOverrideOption: Активувати перевизначення імені вихідного файлу + autoFileExtensionOption: Автоматичне додавання розширення файлу customFilename: Введіть ім'я файлу (залишіть порожнім, щоб використовувати значення за замовчуванням) customPath: Задати шлях customArgs: Включити аргументи, що настроюються yt-dlp (велика сила = велика відповідальність) diff --git a/frontend/src/assets/i18n/zh_CN.yaml b/frontend/src/assets/i18n/zh_CN.yaml index ec8dc85..b5b6bc0 100644 --- a/frontend/src/assets/i18n/zh_CN.yaml +++ b/frontend/src/assets/i18n/zh_CN.yaml @@ -22,6 +22,7 @@ keys: overridesAnchor: 覆盖 pathOverrideOption: 启用输出路径覆盖 filenameOverrideOption: 启用输出文件名覆盖 + autoFileExtensionOption: 自动文件扩展名 customFilename: 自定义文件名(留空使用默认值) customPath: 自定义路径 customArgs: 启用自定义 yt-dlp 参数(能力越大 = 责任越大) diff --git a/frontend/src/atoms/settings.ts b/frontend/src/atoms/settings.ts index fbabd82..00929db 100644 --- a/frontend/src/atoms/settings.ts +++ b/frontend/src/atoms/settings.ts @@ -40,6 +40,7 @@ export interface SettingsState { cliArgs: string formatSelection: boolean fileRenaming: boolean + autoFileExtension: boolean pathOverriding: boolean enableCustomArgs: boolean listView: boolean @@ -82,6 +83,11 @@ export const fileRenamingState = atomWithStorage( localStorage.getItem('file-renaming') === 'true' ) +export const autoFileExtensionState = atomWithStorage( + 'auto-file-extension', + localStorage.getItem('auto-file-extension') === 'true' +) + export const pathOverridingState = atomWithStorage( 'path-overriding', localStorage.getItem('path-overriding') === 'true' @@ -168,6 +174,7 @@ export const settingsState = atom((get) => ({ cliArgs: get(latestCliArgumentsState), formatSelection: get(formatSelectionState), fileRenaming: get(fileRenamingState), + autoFileExtension: get(autoFileExtensionState), pathOverriding: get(pathOverridingState), enableCustomArgs: get(enableCustomArgsState), listView: get(listViewState), diff --git a/frontend/src/components/DownloadDialog.tsx b/frontend/src/components/DownloadDialog.tsx index 8e917df..3b6b840 100644 --- a/frontend/src/components/DownloadDialog.tsx +++ b/frontend/src/components/DownloadDialog.tsx @@ -11,7 +11,10 @@ import { Grid, IconButton, InputAdornment, + MenuItem, Paper, + Select, + SelectChangeEvent, TextField } from '@mui/material' import AppBar from '@mui/material/AppBar' @@ -83,6 +86,8 @@ const DownloadDialog: FC = ({ open, onClose, onDownloadStart }) => { filenameTemplateState ) + const [fileExtension, setFileExtension] = useState('.%(ext)s') + const [url, setUrl] = useState('') const [isPlaylist, setIsPlaylist] = useState(false) @@ -115,7 +120,7 @@ const DownloadDialog: FC = ({ open, onClose, onDownloadStart }) => { url: immediate || line, args: `${toFormatArgs(codes)} ${downloadTemplate}`, pathOverride: downloadPath ?? '', - renameTo: settings.fileRenaming ? filenameTemplate : '', + renameTo: settings.fileRenaming ? filenameTemplate + (settings.autoFileExtension ? fileExtension : '') : '', playlist: isPlaylist, }) @@ -169,6 +174,10 @@ const DownloadDialog: FC = ({ open, onClose, onDownloadStart }) => { setFilenameTemplate(e.target.value) } + const handleFileExtensionChange = (e: SelectChangeEvent) => { + setFileExtension(e.target.value) + } + const handleCustomArgsChange = (e: React.ChangeEvent) => { setCustomArgs(e.target.value) } @@ -286,7 +295,15 @@ const DownloadDialog: FC = ({ open, onClose, onDownloadStart }) => { } { settings.fileRenaming && - + = ({ open, onClose, onDownloadStart }) => { /> } + { + settings.autoFileExtension && + + + + } { settings.pathOverriding && diff --git a/frontend/src/views/Settings.tsx b/frontend/src/views/Settings.tsx index 6ad9a38..34ac0cb 100644 --- a/frontend/src/views/Settings.tsx +++ b/frontend/src/views/Settings.tsx @@ -36,6 +36,7 @@ import { appTitleState, enableCustomArgsState, fileRenamingState, + autoFileExtensionState, formatSelectionState, languageState, languages, @@ -61,6 +62,7 @@ export default function Settings() { const [formatSelection, setFormatSelection] = useAtom(formatSelectionState) const [pathOverriding, setPathOverriding] = useAtom(pathOverridingState) const [fileRenaming, setFileRenaming] = useAtom(fileRenamingState) + const [autoFileExtension, setAutoFileExtension] = useAtom(autoFileExtensionState) const [enableArgs, setEnableArgs] = useAtom(enableCustomArgsState) const [serverAddr, setServerAddr] = useAtom(serverAddressState) @@ -343,12 +345,30 @@ export default function Settings() { { + if (fileRenaming) { + setAutoFileExtension(false) + } setFileRenaming(state => !state) }} /> } label={i18n.t('filenameOverrideOption')} /> + { + { + setAutoFileExtension(state => !state) + }} + /> + } + label={i18n.t('autoFileExtensionOption')} + /> + }