feat: allow auto/pre-selected extension (#255)

* feat: allow auto/pre-selected extension

* fix: revert typo and changes made for local dev
This commit is contained in:
Kohányi Róbert
2025-02-03 20:40:57 +01:00
committed by GitHub
parent 5e9f92a06f
commit 016d8557e6
21 changed files with 107 additions and 3 deletions

View File

@@ -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"
}

2
.gitignore vendored
View File

@@ -3,6 +3,7 @@
result/ result/
result result
dist dist
.pnpm-store/
.pnpm-debug.log .pnpm-debug.log
node_modules node_modules
.env .env
@@ -26,3 +27,4 @@ frontend/.pnp.loader.mjs
frontend/.yarn/install-state.gz frontend/.yarn/install-state.gz
.db.lock .db.lock
livestreams.dat livestreams.dat
.vite/deps

View File

@@ -3,7 +3,7 @@
"version": "3.2.3", "version": "3.2.3",
"description": "Frontend compontent of yt-dlp-webui", "description": "Frontend compontent of yt-dlp-webui",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite --host 0.0.0.0",
"build": "vite build" "build": "vite build"
}, },
"author": "marcopiovanello", "author": "marcopiovanello",

View File

@@ -21,6 +21,7 @@ keys:
overridesAnchor: Anul·lacions overridesAnchor: Anul·lacions
pathOverrideOption: Sobreescriure en la ruta de sortida pathOverrideOption: Sobreescriure en la ruta de sortida
filenameOverrideOption: Sobreescriure el nom del fitxer 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) customFilename: Nom d'arxiu personalitzat (en blanc per utilitzar el predeterminat)
customPath: Ruta personalitzada customPath: Ruta personalitzada
customArgs: Habilitar els arguments yt-dlp personalitzats (un gran poder comporta una gran responsabilitat) customArgs: Habilitar els arguments yt-dlp personalitzats (un gran poder comporta una gran responsabilitat)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: Überschreibungen overridesAnchor: Überschreibungen
pathOverrideOption: Ausgabe-Pfad Überschreibung aktivieren pathOverrideOption: Ausgabe-Pfad Überschreibung aktivieren
filenameOverrideOption: Ausgabe-Dateiname Überschreibung aktivieren filenameOverrideOption: Ausgabe-Dateiname Überschreibung aktivieren
autoFileExtensionOption: Dateierweiterung automatisch hinzufügen
customFilename: Benutzerdefinierter Dateiname (Leer lassen um Standardwert zu nutzen) customFilename: Benutzerdefinierter Dateiname (Leer lassen um Standardwert zu nutzen)
customPath: Benutzerdefinierter Pfad customPath: Benutzerdefinierter Pfad
customArgs: Benutzerdefinierte yt-dlp Argumente aktivieren (Auf viel Macht folgt große Verantwortung) customArgs: Benutzerdefinierte yt-dlp Argumente aktivieren (Auf viel Macht folgt große Verantwortung)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: Overrides overridesAnchor: Overrides
pathOverrideOption: Enable output path overriding pathOverrideOption: Enable output path overriding
filenameOverrideOption: Enable output file name overriding filenameOverrideOption: Enable output file name overriding
autoFileExtensionOption: Automatically add file extension
customFilename: Custom filename (leave blank to use default) customFilename: Custom filename (leave blank to use default)
customPath: Custom path customPath: Custom path
customArgs: Enable custom yt-dlp args (great power = great responsibilities) customArgs: Enable custom yt-dlp args (great power = great responsibilities)

View File

@@ -21,6 +21,7 @@ keys:
overridesAnchor: Anulaciones overridesAnchor: Anulaciones
pathOverrideOption: Sobreescribir en la ruta de salida pathOverrideOption: Sobreescribir en la ruta de salida
filenameOverrideOption: Sobreescribir el nombre del fichero 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) customFilename: Nombre de archivo personalizado (en blanco para usar el predeterminado)
customPath: Ruta personalizada customPath: Ruta personalizada
customArgs: Habilitar los argumentos yt-dlp personalizados (un gran poder conlleva una gran responsabilidad) customArgs: Habilitar los argumentos yt-dlp personalizados (un gran poder conlleva una gran responsabilidad)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: Remplacer overridesAnchor: Remplacer
pathOverrideOption: Activer le remplacement du chemin de sortie pathOverrideOption: Activer le remplacement du chemin de sortie
filenameOverrideOption: Activer le remplacement du nom du fichier 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) customFilename: Nom de fichier personnalisé (laisser vide pour utiliser le nom par défaut)
customPath: Chemin personnalisé customPath: Chemin personnalisé
customArgs: Activer les args personnalisés yt-dlp (grand pouvoir = grandes responsabilités) customArgs: Activer les args personnalisés yt-dlp (grand pouvoir = grandes responsabilités)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: Felülbírálások overridesAnchor: Felülbírálások
pathOverrideOption: Letöltési útvonal felülbírálása pathOverrideOption: Letöltési útvonal felülbírálása
filenameOverrideOption: Letöltési fájlnév 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) customFilename: Egyedi fájlnév (hagyd üresen, hogy a fájlnév automatikusan generálódjon)
customPath: Egyedi útvonal customPath: Egyedi útvonal
customArgs: Egyedi yt-dlp argumentumok (Nagy hatalommal nagy felelősség jár.) customArgs: Egyedi yt-dlp argumentumok (Nagy hatalommal nagy felelősség jár.)

View File

@@ -21,6 +21,7 @@ keys:
overridesAnchor: Sovrascritture overridesAnchor: Sovrascritture
pathOverrideOption: Abilita sovrascrittura percorso di output pathOverrideOption: Abilita sovrascrittura percorso di output
filenameOverrideOption: Abilita sovrascrittura del nome del file di output filenameOverrideOption: Abilita sovrascrittura del nome del file di output
autoFileExtensionOption: Aggiungi estensione automaticamente
customFilename: Custom filename (leave blank to use default) customFilename: Custom filename (leave blank to use default)
customPath: Custom path customPath: Custom path
customArgs: Enable custom yt-dlp args (great power = great responsabilities) customArgs: Enable custom yt-dlp args (great power = great responsabilities)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: 上書き overridesAnchor: 上書き
pathOverrideOption: 保存するディレクトリ pathOverrideOption: 保存するディレクトリ
filenameOverrideOption: ファイル名の上書き filenameOverrideOption: ファイル名の上書き
autoFileExtensionOption: 自動ファイル拡張子
customFilename: (空白の場合は元のファイル名) customFilename: (空白の場合は元のファイル名)
customPath: 保存先 customPath: 保存先
customArgs: yt-dlpのオプションの有効化 (最適設定にする場合) customArgs: yt-dlpのオプションの有効化 (最適設定にする場合)

View File

@@ -21,6 +21,7 @@ keys:
overridesAnchor: Overrides overridesAnchor: Overrides
pathOverrideOption: Enable output path overriding pathOverrideOption: Enable output path overriding
filenameOverrideOption: Enable output file name overriding filenameOverrideOption: Enable output file name overriding
autoFileExtensionOption: 자동으로 파일 확장자 추가
customFilename: Custom filename (leave blank to use default) customFilename: Custom filename (leave blank to use default)
customPath: Custom path customPath: Custom path
customArgs: Enable custom yt-dlp args (great power = great responsabilities) customArgs: Enable custom yt-dlp args (great power = great responsabilities)

View File

@@ -21,6 +21,7 @@ keys:
overridesAnchor: Przedefiniuj overridesAnchor: Przedefiniuj
pathOverrideOption: Aktywuj zastąpienie ścieżki źródłowej pathOverrideOption: Aktywuj zastąpienie ścieżki źródłowej
filenameOverrideOption: Aktywuj zastępowanie nazwy pliku źródłowego 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) customFilename: Wprowadź nazwę pliku (pozostaw puste, aby użyć nazwy domyślnej)
customPath: Ustaw ścieżkę customPath: Ustaw ścieżkę
customArgs: Uwzględnij konfigurowalne argumenty yt-dlp (wielka moc = wielka odpowiedzialność) customArgs: Uwzględnij konfigurowalne argumenty yt-dlp (wielka moc = wielka odpowiedzialność)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: Substituições overridesAnchor: Substituições
pathOverrideOption: Habilitar substituição do caminho de saída pathOverrideOption: Habilitar substituição do caminho de saída
filenameOverrideOption: Habilitar substituição do nome do arquivo 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) customFilename: Nome de arquivo personalizado (deixe em branco para usar o padrão)
customPath: Caminho personalizado customPath: Caminho personalizado
customArgs: Habilitar argumentos personalizados do yt-dlp (grandes poderes = grandes responsabilidades) customArgs: Habilitar argumentos personalizados do yt-dlp (grandes poderes = grandes responsabilidades)

View File

@@ -21,6 +21,7 @@ keys:
overridesAnchor: Переопределить overridesAnchor: Переопределить
pathOverrideOption: Активировать переопределение выходного пути pathOverrideOption: Активировать переопределение выходного пути
filenameOverrideOption: Активировать переопределение имени выходного файла filenameOverrideOption: Активировать переопределение имени выходного файла
autoFileExtensionOption: Автоматическое расширение файла
customFilename: Задать имя файла (оставьте пустым, чтобы использовать значение по умолчанию) customFilename: Задать имя файла (оставьте пустым, чтобы использовать значение по умолчанию)
customPath: Задать путь customPath: Задать путь
customArgs: Включить настраиваемые аргументы yt-dlp (большая сила = большая ответственность) customArgs: Включить настраиваемые аргументы yt-dlp (большая сила = большая ответственность)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: Överskrivningar overridesAnchor: Överskrivningar
pathOverrideOption: Tillåt överskrivning av filsökvägen pathOverrideOption: Tillåt överskrivning av filsökvägen
filenameOverrideOption: Tillåt överskrivning av filnamn filenameOverrideOption: Tillåt överskrivning av filnamn
autoFileExtensionOption: Lägg till filändelse automatiskt
customFilename: Eget filnamn (lämna blankt för standardnamn) customFilename: Eget filnamn (lämna blankt för standardnamn)
customPath: Egen filsökväg customPath: Egen filsökväg
customArgs: Tillåt egna yt-dlp-argument (frihet under ansvar!) customArgs: Tillåt egna yt-dlp-argument (frihet under ansvar!)

View File

@@ -21,6 +21,7 @@ keys:
overridesAnchor: Перевизначити overridesAnchor: Перевизначити
pathOverrideOption: Активувати перевизначення вихідного шляху pathOverrideOption: Активувати перевизначення вихідного шляху
filenameOverrideOption: Активувати перевизначення імені вихідного файлу filenameOverrideOption: Активувати перевизначення імені вихідного файлу
autoFileExtensionOption: Автоматичне додавання розширення файлу
customFilename: Введіть ім'я файлу (залишіть порожнім, щоб використовувати значення за замовчуванням) customFilename: Введіть ім'я файлу (залишіть порожнім, щоб використовувати значення за замовчуванням)
customPath: Задати шлях customPath: Задати шлях
customArgs: Включити аргументи, що настроюються yt-dlp (велика сила = велика відповідальність) customArgs: Включити аргументи, що настроюються yt-dlp (велика сила = велика відповідальність)

View File

@@ -22,6 +22,7 @@ keys:
overridesAnchor: 覆盖 overridesAnchor: 覆盖
pathOverrideOption: 启用输出路径覆盖 pathOverrideOption: 启用输出路径覆盖
filenameOverrideOption: 启用输出文件名覆盖 filenameOverrideOption: 启用输出文件名覆盖
autoFileExtensionOption: 自动文件扩展名
customFilename: 自定义文件名(留空使用默认值) customFilename: 自定义文件名(留空使用默认值)
customPath: 自定义路径 customPath: 自定义路径
customArgs: 启用自定义 yt-dlp 参数(能力越大 = 责任越大) customArgs: 启用自定义 yt-dlp 参数(能力越大 = 责任越大)

View File

@@ -40,6 +40,7 @@ export interface SettingsState {
cliArgs: string cliArgs: string
formatSelection: boolean formatSelection: boolean
fileRenaming: boolean fileRenaming: boolean
autoFileExtension: boolean
pathOverriding: boolean pathOverriding: boolean
enableCustomArgs: boolean enableCustomArgs: boolean
listView: boolean listView: boolean
@@ -82,6 +83,11 @@ export const fileRenamingState = atomWithStorage(
localStorage.getItem('file-renaming') === 'true' localStorage.getItem('file-renaming') === 'true'
) )
export const autoFileExtensionState = atomWithStorage(
'auto-file-extension',
localStorage.getItem('auto-file-extension') === 'true'
)
export const pathOverridingState = atomWithStorage( export const pathOverridingState = atomWithStorage(
'path-overriding', 'path-overriding',
localStorage.getItem('path-overriding') === 'true' localStorage.getItem('path-overriding') === 'true'
@@ -168,6 +174,7 @@ export const settingsState = atom<SettingsState>((get) => ({
cliArgs: get(latestCliArgumentsState), cliArgs: get(latestCliArgumentsState),
formatSelection: get(formatSelectionState), formatSelection: get(formatSelectionState),
fileRenaming: get(fileRenamingState), fileRenaming: get(fileRenamingState),
autoFileExtension: get(autoFileExtensionState),
pathOverriding: get(pathOverridingState), pathOverriding: get(pathOverridingState),
enableCustomArgs: get(enableCustomArgsState), enableCustomArgs: get(enableCustomArgsState),
listView: get(listViewState), listView: get(listViewState),

View File

@@ -11,7 +11,10 @@ import {
Grid, Grid,
IconButton, IconButton,
InputAdornment, InputAdornment,
MenuItem,
Paper, Paper,
Select,
SelectChangeEvent,
TextField TextField
} from '@mui/material' } from '@mui/material'
import AppBar from '@mui/material/AppBar' import AppBar from '@mui/material/AppBar'
@@ -83,6 +86,8 @@ const DownloadDialog: FC<Props> = ({ open, onClose, onDownloadStart }) => {
filenameTemplateState filenameTemplateState
) )
const [fileExtension, setFileExtension] = useState('.%(ext)s')
const [url, setUrl] = useState('') const [url, setUrl] = useState('')
const [isPlaylist, setIsPlaylist] = useState(false) const [isPlaylist, setIsPlaylist] = useState(false)
@@ -115,7 +120,7 @@ const DownloadDialog: FC<Props> = ({ open, onClose, onDownloadStart }) => {
url: immediate || line, url: immediate || line,
args: `${toFormatArgs(codes)} ${downloadTemplate}`, args: `${toFormatArgs(codes)} ${downloadTemplate}`,
pathOverride: downloadPath ?? '', pathOverride: downloadPath ?? '',
renameTo: settings.fileRenaming ? filenameTemplate : '', renameTo: settings.fileRenaming ? filenameTemplate + (settings.autoFileExtension ? fileExtension : '') : '',
playlist: isPlaylist, playlist: isPlaylist,
}) })
@@ -169,6 +174,10 @@ const DownloadDialog: FC<Props> = ({ open, onClose, onDownloadStart }) => {
setFilenameTemplate(e.target.value) setFilenameTemplate(e.target.value)
} }
const handleFileExtensionChange = (e: SelectChangeEvent<string>) => {
setFileExtension(e.target.value)
}
const handleCustomArgsChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handleCustomArgsChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setCustomArgs(e.target.value) setCustomArgs(e.target.value)
} }
@@ -286,7 +295,15 @@ const DownloadDialog: FC<Props> = ({ open, onClose, onDownloadStart }) => {
} }
{ {
settings.fileRenaming && settings.fileRenaming &&
<Grid item xs={settings.pathOverriding ? 8 : 12}> <Grid item xs={
!settings.autoFileExtension && !settings.pathOverriding
? 12
: !settings.autoFileExtension && settings.pathOverriding
? 8
: settings.autoFileExtension && !settings.pathOverriding
? 10
: 6
}>
<TextField <TextField
sx={{ mt: 1 }} sx={{ mt: 1 }}
ref={customFilenameInputRef} ref={customFilenameInputRef}
@@ -302,6 +319,22 @@ const DownloadDialog: FC<Props> = ({ open, onClose, onDownloadStart }) => {
/> />
</Grid> </Grid>
} }
{
settings.autoFileExtension &&
<Grid item xs={2}>
<Select
sx={{ mt: 1 }}
fullWidth
label={i18n.t('autoFileExtension')}
value={fileExtension}
onChange={handleFileExtensionChange}
variant="outlined">
<MenuItem value=".%(ext)s">Auto</MenuItem>
<MenuItem value=".mp4">mp4</MenuItem>
<MenuItem value=".mkv">mkv</MenuItem>
</Select>
</Grid>
}
{ {
settings.pathOverriding && settings.pathOverriding &&
<Grid item xs={4}> <Grid item xs={4}>

View File

@@ -36,6 +36,7 @@ import {
appTitleState, appTitleState,
enableCustomArgsState, enableCustomArgsState,
fileRenamingState, fileRenamingState,
autoFileExtensionState,
formatSelectionState, formatSelectionState,
languageState, languageState,
languages, languages,
@@ -61,6 +62,7 @@ export default function Settings() {
const [formatSelection, setFormatSelection] = useAtom(formatSelectionState) const [formatSelection, setFormatSelection] = useAtom(formatSelectionState)
const [pathOverriding, setPathOverriding] = useAtom(pathOverridingState) const [pathOverriding, setPathOverriding] = useAtom(pathOverridingState)
const [fileRenaming, setFileRenaming] = useAtom(fileRenamingState) const [fileRenaming, setFileRenaming] = useAtom(fileRenamingState)
const [autoFileExtension, setAutoFileExtension] = useAtom(autoFileExtensionState)
const [enableArgs, setEnableArgs] = useAtom(enableCustomArgsState) const [enableArgs, setEnableArgs] = useAtom(enableCustomArgsState)
const [serverAddr, setServerAddr] = useAtom(serverAddressState) const [serverAddr, setServerAddr] = useAtom(serverAddressState)
@@ -343,12 +345,30 @@ export default function Settings() {
<Switch <Switch
defaultChecked={fileRenaming} defaultChecked={fileRenaming}
onChange={() => { onChange={() => {
if (fileRenaming) {
setAutoFileExtension(false)
}
setFileRenaming(state => !state) setFileRenaming(state => !state)
}} }}
/> />
} }
label={i18n.t('filenameOverrideOption')} label={i18n.t('filenameOverrideOption')}
/> />
{
<FormControlLabel
control={
<Switch
disabled={!fileRenaming}
checked={fileRenaming ? autoFileExtension : false}
defaultChecked={autoFileExtension}
onChange={() => {
setAutoFileExtension(state => !state)
}}
/>
}
label={i18n.t('autoFileExtensionOption')}
/>
}
<FormControlLabel <FormControlLabel
control={ control={
<Switch <Switch