Video tab: modalita 'Solo audio' (estrazione MP3)
Aggiunto toggle Video/Solo audio nella tab Video. In modalita audio yt-dlp scarica solo bestaudio ed estrae in MP3 al bitrate impostato in Impostazioni (default 320 kbps), con embed thumbnail come la tab Scarica. - core/downloader.py: download_video() accetta audio_only e audio_bitrate; quando True usa format 'bestaudio/best' e --extract-audio --audio-format mp3 - api/bridge.py: start_video_download passa audio_only nel worker; log mostra 'Solo audio MP3 320K' vs 'Video 1080p' - webui: segmented control 'Video (MP4)' / 'Solo audio (MP3)' rosa, selettore qualita nascosto in modalita audio, hint aggiornato Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
1 parent
39c92f44f4
commit
6f5c32165a
5 files changed
+95
-18
No files matched your search
@@ -615,6 +615,36 @@ input[type="number"]::-webkit-inner-spin-button {
|
||||
.log .l-warn { color: #FDCB6E; }
|
||||
.log .l-muted { color: var(--text-3); }
|
||||
|
||||
/* ===============================
|
||||
SEGMENTED CONTROL
|
||||
=============================== */
|
||||
.segmented {
|
||||
display: inline-flex;
|
||||
background: var(--bg-input);
|
||||
padding: 4px;
|
||||
border-radius: var(--r-pill);
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.seg-btn {
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--text-2);
|
||||
padding: 8px 18px;
|
||||
border-radius: var(--r-pill);
|
||||
cursor: pointer;
|
||||
font-weight: 700;
|
||||
font-size: 13px;
|
||||
transition: background-color 0.15s, color 0.15s;
|
||||
}
|
||||
|
||||
.seg-btn:hover:not(.active) { color: var(--text); }
|
||||
|
||||
.seg-btn.active {
|
||||
background: var(--pink);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
HINT BOX
|
||||
=============================== */
|
||||
|
||||
+12
-1
@@ -144,6 +144,14 @@
|
||||
</div>
|
||||
|
||||
<div class="field inline">
|
||||
<label class="field-label">Modalità</label>
|
||||
<div class="segmented" id="videoMode">
|
||||
<button type="button" class="seg-btn active" data-mode="video">🎬 Video (MP4)</button>
|
||||
<button type="button" class="seg-btn" data-mode="audio">🎵 Solo audio (MP3)</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field inline" id="videoQualityField">
|
||||
<label class="field-label">Qualità</label>
|
||||
<select id="videoQuality" class="input pill input-sm">
|
||||
<option value="best">Migliore disponibile</option>
|
||||
@@ -155,7 +163,10 @@
|
||||
|
||||
<div class="hint">
|
||||
<span class="hint-ico">ⓘ</span>
|
||||
Per Instagram/Facebook privati serve un file <strong>cookies.txt</strong> valido (Impostazioni → Percorsi).
|
||||
<div>
|
||||
In modalità <strong>Solo audio</strong> il file viene salvato in MP3 al bitrate impostato in Impostazioni → Download.<br>
|
||||
Per Instagram/Facebook privati serve un file <strong>cookies.txt</strong> valido (Impostazioni → Percorsi).
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -375,6 +375,17 @@ $("#videoBrowseBtn").addEventListener("click", async () => {
|
||||
}
|
||||
});
|
||||
|
||||
let videoMode = "video"; // "video" | "audio"
|
||||
|
||||
$$("#videoMode .seg-btn").forEach((b) => {
|
||||
b.addEventListener("click", () => {
|
||||
$$("#videoMode .seg-btn").forEach((x) => x.classList.remove("active"));
|
||||
b.classList.add("active");
|
||||
videoMode = b.dataset.mode;
|
||||
$("#videoQualityField").style.display = videoMode === "audio" ? "none" : "";
|
||||
});
|
||||
});
|
||||
|
||||
$("#videoDownloadBtn").addEventListener("click", async () => {
|
||||
const url = $("#videoUrlInput").value.trim();
|
||||
if (!url) {
|
||||
@@ -396,6 +407,7 @@ $("#videoDownloadBtn").addEventListener("click", async () => {
|
||||
urls: [url],
|
||||
output_dir: state.videoOutputDir,
|
||||
quality: $("#videoQuality").value,
|
||||
audio_only: videoMode === "audio",
|
||||
});
|
||||
if (!res.ok) {
|
||||
toast(res.error || "Errore", "error");
|
||||
|
||||
Reference in new issue
Block a user