feat: batch video upscaling with folder upload, directory save, and result comparison (#1051)

* feat: support batch video upscaling with folder upload and directory save

- Add multi-file selection and entire folder upload (webkitdirectory)
- Support drag & drop of both files and folders via FileSystemEntry API
- Add save directory picker using File System Access API (showDirectoryPicker)
- Process videos sequentially with per-file progress and status tracking
- Add right-side result list with click-to-compare functionality
- Add per-video duration and total batch duration display
- Add retry button for failed items with error detail display
- Remove auto-play on comparison viewer load
- Fix worker error handling: handle "error" command to reject stale promises
- Fix event listener accumulation in video comparison (AbortController)
- Fix XSS risk by escaping HTML in all innerHTML injections
- Fix URL revocation timing in download to prevent large file truncation
- Extract writeToSaveDirectory and truncateName helpers to reduce duplication
- Add Usage Guide panel explaining single/multiple/folder upload options

Files changed:
  docs/upscaler/index.html  (+1110/-181)
  docs/upscaler/upscaler.js (+110)

* fix: prevent auto-play and resource consumption during upscaling

- Set preload="metadata" on preview and comparison video elements
- Explicitly pause preview video after setting src in showVideoPreview
- Remove preview video seek sync from batch processing progress callbacks
  (was causing continuous decode during upscaling, wasting GPU resources)
- Remove preview video seek sync from retry progress callback
- All videos now require manual play; no background resource usage

* fix: improve upscaled video quality with higher bitrate and codec support

- Raise base bitrate from 2.5 Mbps (25e5) to 8 Mbps (8e6) for standard and
  firefox processors, preventing quality loss when source videos have high
  bitrates (e.g. 720p @ 16.7 Mbps was producing 1440p @ 10 Mbps, smaller
  than the original file)
- Double the bitrate for mediabunny processor (X.n1 * 2) to account for the
  4x pixel increase from 2x upscaling
- Add H.264 Level 5.1 (avc1.640033) and Level 5.2 (avc1.640034) codecs to
  the fallback lists, since Level 4.0 (avc1.640028, ~24.6 Mbps) cannot
  support the higher bitrates for 1440p+ outputs
- Add latencyMode: "quality" to VideoEncoder configs for both standard and
  firefox processors, prioritizing encoding quality over latency (suitable
  for offline processing)

* feat: add video data comparison panel for original vs upscaled metrics

- Add a comparison data table below the file info bar showing 6 metrics:
  Resolution, File Size, Duration, Est. Bitrate, Pixels, Process Time
- Display per-metric change percentage with color-coded indicators:
  green (↑) for improvements, red (↓) for regressions, gray for neutral
- Estimated bitrate calculated from file size × 8 / video duration
- Table renders after both original and upscaled video metadata loads
- Auto-hide panel on reset

* fix: make video data comparison panel full-width and responsive

- Move comparison data table from inside the left column to the full-width
  area below the left/right layout, so it is no longer constrained by the
  comparison viewer column width
- Remove table-fixed colgroup and overflow-x-auto that caused horizontal
  scrolling on smaller screens
- Table now uses w-full auto-layout, displaying all 4 columns (Metric,
  Original, Upscaled, Change) without requiring horizontal scrolling

---------

Co-authored-by: rionzhao <rionzhao@tencent.com>
This commit is contained in:
糖猫猫andrionzhao authored and GitHub committed 2026-09-10 17:19:38 +08:00
commit 0896841d23
538 files changed
+379715

No files matched your search

+13
View File
@@ -0,0 +1,13 @@
/*!-----------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Version: 0.30.1(829382514cb1065f5ebb90f436e1c6103e153953)
* Released under the MIT license
* https://github.com/microsoft/vscode/blob/main/LICENSE.txt
*-----------------------------------------------------------*/define("vs/editor/editor.main.nls.de",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["Eingabe"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Gro\xDF-/Kleinschreibung beachten","Nur ganzes Wort suchen","Regul\xE4ren Ausdruck verwenden"],"vs/base/browser/ui/findinput/replaceInput":["Eingabe","Gro\xDF-/Kleinschreibung beibehalten"],"vs/base/browser/ui/iconLabel/iconLabelHover":["Wird geladen..."],"vs/base/browser/ui/inputbox/inputBox":["Fehler: {0}","Warnung: {0}","Info: {0}","f\xFCr Verlauf"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Ungebunden"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["L\xF6schen","Typfilter deaktivieren","Typfilter aktivieren","Keine Elemente gefunden","{0} von {1} Elementen stimmen \xFCberein"],"vs/base/common/actions":["(leer)"],"vs/base/common/errorMessage":["{0}: {1}","Ein Systemfehler ist aufgetreten ({0}).","Ein unbekannter Fehler ist aufgetreten. Weitere Details dazu finden Sie im Protokoll.","Ein unbekannter Fehler ist aufgetreten. Weitere Details dazu finden Sie im Protokoll.","{0} ({1} Fehler gesamt)","Ein unbekannter Fehler ist aufgetreten. Weitere Details dazu finden Sie im Protokoll."],"vs/base/common/keybindingLabels":["STRG","UMSCHALTTASTE","ALT","Windows","STRG","UMSCHALTTASTE","ALT","Super","Steuern","UMSCHALTTASTE","ALT","Befehl","Steuern","UMSCHALTTASTE","ALT","Windows","Steuern","UMSCHALTTASTE","ALT","Super"],"vs/base/parts/quickinput/browser/quickInput":["Zur\xFCck","Dr\xFCcken Sie die EINGABETASTE, um Ihre Eingabe zu best\xE4tigen, oder ESC, um den Vorgang abzubrechen.","{0}/{1}","Nehmen Sie eine Eingabe vor, um die Ergebnisse einzugrenzen.","{0} Ergebnisse","{0} ausgew\xE4hlt","OK","Benutzerdefiniert","Zur\xFCck ({0})","Zur\xFCck"],"vs/base/parts/quickinput/browser/quickInputList":["Schnelleingabe"],"vs/editor/browser/controller/coreCommands":["Auch bei l\xE4ngeren Zeilen am Ende bleiben","Auch bei l\xE4ngeren Zeilen am Ende bleiben","Sekund\xE4re Cursor entfernt"],"vs/editor/browser/controller/textAreaHandler":["Editor","Auf den Editor kann derzeit nicht zugegriffen werden. Dr\xFCcken Sie {0}, um die Optionen anzuzeigen."],"vs/editor/browser/core/keybindingCancellation":['Gibt an, ob der Editor einen abbrechbaren Vorgang ausf\xFChrt, z.\xA0B. "Verweisvorschau".'],"vs/editor/browser/editorExtensions":["&&R\xFCckg\xE4ngig","R\xFCckg\xE4ngig","&&Wiederholen","Wiederholen","&&Alles ausw\xE4hlen","Alle ausw\xE4hlen"],"vs/editor/browser/widget/codeEditorWidget":["Die Anzahl der Cursors wurde auf {0} beschr\xE4nkt."],"vs/editor/browser/widget/diffEditorWidget":["Zeilenformatierung f\xFCr Einf\xFCgungen im Diff-Editor","Zeilenformatierung f\xFCr Entfernungen im Diff-Editor","Kann die Dateien nicht vergleichen, da eine Datei zu gro\xDF ist."],"vs/editor/browser/widget/diffReview":['Symbol f\xFCr "Einf\xFCgen" in der Diff-\xDCberpr\xFCfung.','Symbol f\xFCr "Entfernen" in der Diff-\xDCberpr\xFCfung.','Symbol f\xFCr "Schlie\xDFen" in der Diff-\xDCberpr\xFCfung.',"Schlie\xDFen","keine ge\xE4nderten Zeilen","1 Zeile ge\xE4ndert","{0} Zeilen ge\xE4ndert","Unterschied {0} von {1}: urspr\xFCngliche Zeile {2}, {3}, ge\xE4nderte Zeile {4}, {5}","leer","{0}: unver\xE4nderte Zeile {1}","{0} urspr\xFCngliche Zeile {1} ge\xE4nderte Zeile {2}","+ {0} ge\xE4nderte Zeile(n) {1}","\u2013 {0} Originalzeile {1}","Zum n\xE4chsten Unterschied wechseln","Zum vorherigen Unterschied wechseln"],"vs/editor/browser/widget/inlineDiffMargin":["Gel\xF6schte Zeilen kopieren","Gel\xF6schte Zeile kopieren","Ge\xE4nderte Zeilen kopieren","Ge\xE4nderte Zeile kopieren","Gel\xF6schte Zeile kopieren ({0})","Ge\xE4nderte Zeile ({0}) kopieren","Diese \xC4nderung r\xFCckg\xE4ngig machen","Gel\xF6schte Zeile kopieren ({0})","Ge\xE4nderte Zeile ({0}) kopieren"],"vs/editor/common/config/commonEditorConfig":["Editor",'Die Anzahl der Leerzeichen, denen ein Tabstopp entspricht. Diese Einstellung wird basierend auf dem Inhalt der Datei \xFCberschrieben, wenn "#editor.detectIndentation#" aktiviert ist.','F\xFCgt beim Dr\xFCcken der TAB-Taste Leerzeichen ein. Diese Einstellung wird basierend auf dem Inhalt der Datei \xFCberschrieben, wenn "#editor.detectIndentation#" aktiviert ist.','Steuert, ob "#editor.tabSize#" und "#editor.insertSpaces#" automatisch erkannt werden, wenn eine Datei basierend auf dem Dateiinhalt ge\xF6ffnet wird.',"Nachfolgende automatisch eingef\xFCgte Leerzeichen entfernen","Spezielle Behandlung f\xFCr gro\xDFe Dateien zum Deaktivieren bestimmter speicherintensiver Funktionen.","Steuert, ob Vervollst\xE4ndigungen auf Grundlage der W\xF6rter im Dokument berechnet werden sollen.","Nur W\xF6rter aus dem aktiven Dokument vorschlagen","W\xF6rter aus allen ge\xF6ffneten Dokumenten derselben Sprache vorschlagen","W\xF6rter aus allen ge\xF6ffneten Dokumenten vorschlagen","Steuert, aus welchen Dokumenten wortbasierte Vervollst\xE4Line truncated
\u2013 Verwenden Sie 0, um die Zeilenh\xF6he automatisch anhand des Schriftgrads zu berechnen.\r
\u2013 Werte zwischen 0 und 8 werden als Multiplikator mit dem Schriftgrad verwendet.\r
\u2013 Werte gr\xF6\xDFer oder gleich 8 werden als effektive Werte verwendet.`,"Steuert, ob die Minimap angezeigt wird.","Die Minimap hat die gleiche Gr\xF6\xDFe wie der Editor-Inhalt (und kann scrollen).","Die Minimap wird bei Bedarf vergr\xF6\xDFert oder verkleinert, um die H\xF6he des Editors zu f\xFCllen (kein Scrollen).","Die Minimap wird bei Bedarf verkleinert, damit sie nicht gr\xF6\xDFer als der Editor ist (kein Scrollen).","Legt die Gr\xF6\xDFe der Minimap fest.","Steuert die Seite, wo die Minimap gerendert wird.","Steuert, wann der Schieberegler f\xFCr die Minimap angezeigt wird.","Ma\xDFstab des in der Minimap gezeichneten Inhalts: 1, 2 oder 3.","Die tats\xE4chlichen Zeichen in einer Zeile rendern im Gegensatz zu Farbbl\xF6cken.","Begrenzen Sie die Breite der Minimap, um nur eine bestimmte Anzahl von Spalten zu rendern.","Steuert den Abstand zwischen dem oberen Rand des Editors und der ersten Zeile.","Steuert den Abstand zwischen dem unteren Rand des Editors und der letzten Zeile.","Aktiviert ein Pop-up, das Dokumentation und Typ eines Parameters anzeigt w\xE4hrend Sie tippen.","Steuert, ob das Men\xFC mit Parameterhinweisen zyklisch ist oder sich am Ende der Liste schlie\xDFt.","Schnellvorschl\xE4ge innerhalb von Zeichenfolgen aktivieren.","Schnellvorschl\xE4ge innerhalb von Kommentaren aktivieren.","Schnellvorschl\xE4ge au\xDFerhalb von Zeichenfolgen und Kommentaren aktivieren.","Steuert, ob Vorschl\xE4ge automatisch w\xE4hrend der Eingabe angezeigt werden sollen.","Zeilennummern werden nicht dargestellt.","Zeilennummern werden als absolute Zahl dargestellt.","Zeilennummern werden als Abstand in Zeilen an Cursorposition dargestellt.","Zeilennummern werden alle 10 Zeilen dargestellt.","Steuert die Anzeige von Zeilennummern.","Anzahl der Zeichen aus Festbreitenschriftarten, ab der dieses Editor-Lineal gerendert wird.","Farbe dieses Editor-Lineals.","Vertikale Linien nach einer bestimmten Anzahl von Monospacezeichen rendern. Verwenden Sie mehrere Werte f\xFCr mehrere Linien. Wenn das Array leer ist, werden keine Linien gerendert.","Die vertikale Bildlaufleiste wird nur bei Bedarf angezeigt.","Die vertikale Bildlaufleiste ist immer sichtbar.","Die vertikale Bildlaufleiste wird immer ausgeblendet.","Steuert die Sichtbarkeit der vertikalen Bildlaufleiste.","Die horizontale Bildlaufleiste wird nur bei Bedarf angezeigt.","Die horizontale Bildlaufleiste ist immer sichtbar.","Die horizontale Bildlaufleiste wird immer ausgeblendet.","Steuert die Sichtbarkeit der horizontalen Bildlaufleiste.","Die Breite der vertikalen Bildlaufleiste.","Die H\xF6he der horizontalen Bildlaufleiste.","Steuert, ob Klicks nach Seite scrollen oder zur Klickposition springen.","Steuert, ob Inline-Vorschl\xE4ge automatisch im Editor angezeigt werden.","Steuert, ob die Farbgebung f\xFCr das Klammerpaar aktiviert ist. Verwenden Sie \u201Eworkbench.colorCustomizations\u201C, um die Hervorhebungsfarben der Klammer au\xDFer Kraft zu setzen.","Aktiviert Klammernpaarf\xFChrungslinien.","Aktiviert Klammernpaarf\xFChrungslinien nur f\xFCr das aktive Klammerpaar.","Deaktiviert Klammernpaarf\xFChrungslinien.","Steuert, ob F\xFChrungslinien f\xFCr Klammerpaare aktiviert sind oder nicht.","Aktiviert horizontale F\xFChrungslinien als Erg\xE4nzung zu vertikalen Klammernpaarf\xFChrungslinien.","Aktiviert horizontale F\xFChrungslinien nur f\xFCr das aktive Klammerpaar.","Deaktiviert horizontale F\xFChrungslinien f\xFCr Klammernpaare.","Steuert, ob horizontale F\xFChrungslinien f\xFCr Klammernpaare aktiviert sind oder nicht.","Steuert, ob F\xFChrungslinien f\xFCr Klammerpaare aktiviert sind oder nicht.","Steuert, ob der Editor Einzugsf\xFChrungslinien rendern soll.","Steuert, ob der Editor die aktive Einzugsf\xFChrungslinie hevorheben soll.","Vorschlag einf\xFCgen, ohne den Text auf der rechten Seite des Cursors zu \xFCberschreiben","Vorschlag einf\xFCgen und Text auf der rechten Seite des Cursors \xFCberschreiben","Legt fest, ob W\xF6rter beim Akzeptieren von Vervollst\xE4ndigungen \xFCberschrieben werden. Beachten Sie, dass dies von Erweiterungen abh\xE4ngt, die f\xFCr dieses Features aktiviert sind.","Steuert, ob Filter- und Suchvorschl\xE4ge geringf\xFCgige Tippfehler ber\xFCcksichtigen.","Steuert, ob bei der Sortierung W\xF6rter priorisiert werden, die in der N\xE4he des Cursors stehen.",'Steuert, ob gespeicherte Vorschlagauswahlen in verschiedenen Arbeitsbereichen und Fenstern gemeinsam verwendet werden (daf\xFCr ist "#editor.suggestSelection#" erforderlich).','Steuert, ob ein aktiver Ausschnitt verhindert, dass der Bereich "Schnelle Vorschl\xE4ge" angezeigt wird.',"Steuert, ob Symbole in Vorschl\xE4gen ein- oder ausgeblendet werden.","Steuert die Sichtbarkeit der Statusleiste unten im Vorschlagswidget.","Steuert, ob das Ergebnis des Vorschlags im Editor in der Vorschau angezeigt werden soll.","Steuert, ob Vorschlagsdetails inline mit der Bezeichnung oder nur im Detailwidget angezeigt werden.","Diese Einstellung ist veraltet. Die Gr\xF6\xD Line truncated
\r
Es wird empfohlen, sie aus der Datei zu entfernen. Dies kann \xFCber "editor.unusualLineTerminators" konfiguriert werden.`,"Entfernen ungew\xF6hnlicher Zeilenabschlusszeichen","Ignorieren"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Hintergrundfarbe eines Symbols beim Lesezugriff, z.B. beim Lesen einer Variablen. Die Farbe darf nicht deckend sein, damit sie nicht die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe eines Symbols bei Schreibzugriff, z.B. beim Schreiben in eine Variable. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Randfarbe eines Symbols beim Lesezugriff, wie etwa beim Lesen einer Variablen.","Randfarbe eines Symbols beim Schreibzugriff, wie etwa beim Schreiben einer Variablen.","\xDCbersichtslinealmarkerfarbd f\xFCr das Hervorheben von Symbolen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslinealmarkerfarbe f\xFCr Symbolhervorhebungen bei Schreibzugriff. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Gehe zur n\xE4chsten Symbolhervorhebungen","Gehe zur vorherigen Symbolhervorhebungen","Symbol-Hervorhebung ein-/ausschalten"],"vs/editor/contrib/wordOperations/wordOperations":["Wort l\xF6schen"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Au\xDFerkraftsetzungen f\xFCr die Standardsprachkonfiguration","Zu \xFCberschreibende Editor-Einstellungen f\xFCr eine Sprache konfigurieren.","Diese Einstellung unterst\xFCtzt keine sprachspezifische Konfiguration.","Eine leere Eigenschaft kann nicht registriert werden.",'"{0}" kann nicht registriert werden. Stimmt mit dem Eigenschaftsmuster "\\\\[.*\\\\]$" zum Beschreiben sprachspezifischer Editor-Einstellungen \xFCberein. Verwenden Sie den Beitrag "configurationDefaults".','{0}" kann nicht registriert werden. Diese Eigenschaft ist bereits registriert.'],"vs/platform/contextkey/browser/contextKeyService":["Ein Befehl, der Informationen zu Kontextschl\xFCsseln zur\xFCckgibt"],"vs/platform/contextkey/common/contextkeys":["Gibt an, ob Windows als Betriebssystem verwendet wird."],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) wurde gedr\xFCckt. Es wird auf die zweite Taste in der Kombination gewartet...","Die Tastenkombination ({0}, {1}) ist kein Befehl."],"vs/platform/list/browser/listService":["Workbench","Ist unter Windows und Linux der STRG-Taste und unter macOS der Befehlstaste zugeordnet.","Ist unter Windows und Linux der ALT-Taste und unter macOS der Wahltaste zugeordnet.",'Der Modifizierer zum Hinzuf\xFCgen eines Elements in B\xE4umen und Listen zu einer Mehrfachauswahl mit der Maus (zum Beispiel im Explorer, in ge\xF6ffneten Editoren und in der SCM-Ansicht). Die Mausbewegung "Seitlich \xF6ffnen" wird \u2013 sofern unterst\xFCtzt \u2013 so angepasst, dass kein Konflikt mit dem Modifizierer f\xFCr Mehrfachauswahl entsteht.',"Steuert, wie Elemente in Strukturen und Listen mithilfe der Maus ge\xF6ffnet werden (sofern unterst\xFCtzt). Bei \xFCbergeordneten Elementen, deren untergeordnete Elemente sich in Strukturen befinden, steuert diese Einstellung, ob ein Einfachklick oder ein Doppelklick das \xFCbergeordnete Elemente erweitert. Beachten Sie, dass einige Strukturen und Listen diese Einstellung ggf. ignorieren, wenn sie nicht zutrifft.","Steuert, ob Listen und Strukturen ein horizontales Scrollen in der Workbench unterst\xFCtzen. Warnung: Das Aktivieren dieser Einstellung kann sich auf die Leistung auswirken.","Steuert den Struktureinzug in Pixeln.","Steuert, ob die Struktur Einzugsf\xFChrungslinien rendern soll.","Steuert, ob Listen und Strukturen einen optimierten Bildlauf verwenden.",'Ein Multiplikator, der f\xFCr die Mausrad-Bildlaufereignisse "deltaX" und "deltaY" verwendet werden soll.',"Multiplikator f\xFCr Scrollgeschwindigkeit bei Dr\xFCcken von ALT.","Bei der einfachen Tastaturnavigation werden Elemente in den Fokus genommen, die mit der Tastatureingabe \xFCbereinstimmen. Die \xDCbereinstimmungen gelten nur f\xFCr Pr\xE4fixe.","Hervorheben von Tastaturnavigationshervorgebungselemente, die mit der Tastatureingabe \xFCbereinstimmen. Beim nach oben und nach unten Navigieren werden nur die hervorgehobenen Elemente durchlaufen.","Durch das Filtern der Tastaturnavigation werden alle Elemente herausgefiltert und ausgeblendet, die nicht mit der Tastatureingabe \xFCbereinstimmen.",'Steuert die Tastaturnavigation in Listen und Strukturen in der Workbench. Kann "simple" (einfach), "highlight" (hervorheben) und "filter" (filtern) sein.','Legt fest, ob die Tastaturnavigation in Listen und Strukturen automatisch durch Eingaben ausgel\xF6st wird. Wenn der Wert auf "false" festgelegt ist, wird die Tastaturnavigation nur ausgel\xF6st, wenn der Befehl "list.toggleKeyboardNavigation" ausgef\xFChrt wird. Diesem Befehl k\xF6nnen Sie eine Tastenkombination zuweisen Line truncated
//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.de.js.map