diff --git a/components/clips/ClipEditorBar.vue b/components/clips/ClipEditorBar.vue index 3a0dc5616..62a3c5fa3 100644 --- a/components/clips/ClipEditorBar.vue +++ b/components/clips/ClipEditorBar.vue @@ -18,20 +18,12 @@ import { useNuxtApp } from "#app"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "~/components/ui/select"; import { Popover, PopoverContent, PopoverTrigger, } from "~/components/ui/popover"; import { useDemoPlaybackStore } from "~/stores/DemoPlaybackStore"; -import { useApplicationSettingsStore } from "~/stores/ApplicationSettings"; import { useDemoPlayback } from "~/composables/useDemoPlayback"; import { useClipEditor, type EditorSegment } from "~/composables/useClipEditor"; import { useClipRenderActive } from "~/composables/useClipRenderActive"; @@ -45,21 +37,6 @@ const props = defineProps<{ }>(); const store = useDemoPlaybackStore(); -const appSettings = useApplicationSettingsStore(); - -const clipFps = computed<30 | 60>(() => { - const raw = appSettings.settings.find( - (s) => s.name === "public.clip_fps", - )?.value; - return raw === "30" ? 30 : 60; -}); - -const clipResolutionDefault = computed<"720p" | "1080p">(() => { - const raw = appSettings.settings.find( - (s) => s.name === "public.clip_resolution", - )?.value; - return raw === "720p" ? "720p" : "1080p"; -}); const { seek, setHudVisible } = useDemoPlayback(); const editor = useClipEditor(); const nuxtApp = useNuxtApp(); @@ -67,10 +44,6 @@ const { active: renderActive, trackJob: trackRenderJob } = useClipRenderActive(); const title = ref(""); -const resolution = ref<"720p" | "1080p">(clipResolutionDefault.value); -watch(clipResolutionDefault, (v) => { - resolution.value = v; -}); const submitting = ref(false); const submitError = ref(null); const renderingJobId = ref(null); @@ -316,7 +289,6 @@ async function submit() { end_tick: s.end_tick, ...(s.pov_steam_id ? { pov_steam_id: s.pov_steam_id } : {}), })), - output: { format: "mp4", resolution: resolution.value, fps: clipFps.value }, destination: "library", title: title.value || undefined, }; @@ -637,9 +609,7 @@ function onRenderClose() { -
+
-
- - -
-
- - -
-

{{ submitError }}

diff --git a/components/match/RenderHighlightForPlayerDialog.vue b/components/match/RenderHighlightForPlayerDialog.vue index 3dff28144..14605d361 100644 --- a/components/match/RenderHighlightForPlayerDialog.vue +++ b/components/match/RenderHighlightForPlayerDialog.vue @@ -23,12 +23,10 @@ import { } from "~/components/ui/select"; import { generateMutation, generateQuery } from "~/graphql/graphqlGen"; import { useToast } from "~/components/ui/toast/use-toast"; -import { useApplicationSettingsStore } from "~/stores/ApplicationSettings"; const { t } = useI18n(); const nuxtApp = useNuxtApp(); const { toast } = useToast(); -const appSettings = useApplicationSettingsStore(); type MapWithDemo = { id: string; @@ -59,13 +57,6 @@ const PRESET_ORDER: Preset[] = ["multikills", "best_round", "knife", "recap"]; const selectedMatchMapId = ref(null); const presetChoice = ref("multikills"); -const clipResolutionDefault = computed<"720p" | "1080p">(() => { - const raw = appSettings.settings.find( - (s) => s.name === "public.clip_resolution", - )?.value; - return raw === "720p" ? "720p" : "1080p"; -}); -const resolution = ref<"720p" | "1080p">(clipResolutionDefault.value); const submitting = ref(false); const submitError = ref(null); const availability = ref(null); @@ -78,7 +69,6 @@ watch( submitting.value = false; submitError.value = null; presetChoice.value = "multikills"; - resolution.value = clipResolutionDefault.value; availability.value = null; selectedMatchMapId.value = props.matchMaps[0]?.id ?? null; }, @@ -215,7 +205,6 @@ async function submit() { match_map_id: selectedMatchMapId.value, target_steam_id: props.targetSteamId, preset: presetChoice.value, - resolution: resolution.value, target_name: props.targetName ?? undefined, }, { success: true, job_id: true }, @@ -337,19 +326,6 @@ function close(v: boolean) {

-
- {{ $t("clips.create_dialog.resolution") }} - -
-

{{ submitError }}

diff --git a/generated/zeus/index.ts b/generated/zeus/index.ts index c9586f6b1..554218c16 100644 --- a/generated/zeus/index.ts +++ b/generated/zeus/index.ts @@ -1024,7 +1024,7 @@ export type ValueTypes = { audio?: ValueTypes["ClipAudioInput"] | undefined | null | Variable, destination: string | Variable, match_map_id: ValueTypes["uuid"] | Variable, - output: ValueTypes["ClipOutputInput"] | Variable, + output?: ValueTypes["ClipOutputInput"] | undefined | null | Variable, overlays?: Array | undefined | null | Variable, segments: Array | Variable, title?: string | undefined | null | Variable @@ -84117,7 +84117,7 @@ export type ResolverInputTypes = { audio?: ResolverInputTypes["ClipAudioInput"] | undefined | null, destination: string, match_map_id: ResolverInputTypes["uuid"], - output: ResolverInputTypes["ClipOutputInput"], + output?: ResolverInputTypes["ClipOutputInput"] | undefined | null, overlays?: Array | undefined | null, segments: Array, title?: string | undefined | null @@ -167203,7 +167203,7 @@ export type ModelTypes = { audio?: ModelTypes["ClipAudioInput"] | undefined | null, destination: string, match_map_id: ModelTypes["uuid"], - output: ModelTypes["ClipOutputInput"], + output?: ModelTypes["ClipOutputInput"] | undefined | null, overlays?: Array | undefined | null, segments: Array, title?: string | undefined | null @@ -240290,7 +240290,7 @@ export type GraphQLTypes = { audio?: GraphQLTypes["ClipAudioInput"] | undefined | null, destination: string, match_map_id: GraphQLTypes["uuid"], - output: GraphQLTypes["ClipOutputInput"], + output?: GraphQLTypes["ClipOutputInput"] | undefined | null, overlays?: Array | undefined | null, segments: Array, title?: string | undefined | null diff --git a/graphql/clipRenderJob.ts b/graphql/clipRenderJob.ts index f9838c9cd..247daf241 100644 --- a/graphql/clipRenderJob.ts +++ b/graphql/clipRenderJob.ts @@ -56,11 +56,6 @@ export type ClipSpec = { fade_out_ms?: number; duck_game_audio?: boolean; }; - output: { - format: "mp4"; - resolution: "720p" | "1080p"; - fps: 60; - }; destination: "download" | "library"; title?: string; }; diff --git a/i18n/locales/ar_SA.json b/i18n/locales/ar_SA.json index a23833f76..780402c76 100644 --- a/i18n/locales/ar_SA.json +++ b/i18n/locales/ar_SA.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS أبرز اللقطات", "clip_fps_description": "معدل الإطارات للمخرجات المعالجة والمقاطع المحرّرة يدويًا. 60 FPS أكثر سلاسة لكنه يضاعف عبء الترميز وحجم الملف، و30 FPS هو الخيار الأخف.", "clip_resolution": "دقة أبرز اللقطات", - "clip_resolution_description": "الدقة الافتراضية للمخرجات المعالجة والمقاطع المحرّرة يدويًا. يمكن للمستخدمين تجاوزها لكل مقطع من نافذة المعالجة. 1080p يوازن بين الجودة وحجم الملف، و720p ينتج ملفات أصغر بنحو 50%. كلاهما يستفيد عندما تعالج عقد GPU بدقة 1440p — إذ يقلّصها المشغّل إلى الدقة المختارة.", + "clip_resolution_description": "دقة الإخراج للمخرجات المعالجة والمقاطع المحرّرة يدويًا. 1080p يوازن بين الجودة وحجم الملف، و720p ينتج ملفات أصغر بنحو 50%. كلاهما يستفيد عندما تعالج عقد GPU بدقة 1440p — إذ يقلّصها المشغّل إلى الدقة المختارة.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (موصى به)", "clip_bake_branding": "دمج بطاقة اللاعب والخاتمة داخل اللقطات", @@ -8820,7 +8820,6 @@ "close": "إغلاق", "segments": "المقاطع", "title_label": "العنوان", - "resolution": "الدقة", "render": "معالجة", "add": "أضف", "stop": "أوقف", @@ -8893,7 +8892,6 @@ "preset": "قالب", "title_label": "العنوان", "title_placeholder": "يأخذ اسم القالب افتراضيًا", - "resolution": "الدقة", "submit": "أنشئ أبرز اللقطات" }, "presets": { diff --git a/i18n/locales/da_DK.json b/i18n/locales/da_DK.json index 418b17076..6ec084229 100644 --- a/i18n/locales/da_DK.json +++ b/i18n/locales/da_DK.json @@ -2402,7 +2402,7 @@ "clip_fps": "Highlight-FPS", "clip_fps_description": "Billedhastighed for renderede highlights og manuelt redigerede klip. 60 FPS er mere flydende, men fordobler encode-arbejdet og filstørrelsen; 30 FPS er den lettere løsning.", "clip_resolution": "Highlight-opløsning", - "clip_resolution_description": "Standardopløsning for renderede highlights og manuelt redigerede klip. Brugere kan stadig ændre den pr. klip i renderdialogen. 1080p balancerer kvalitet og filstørrelse; 720p giver ca. 50 % mindre filer. Begge får gavn af, at GPU-noder renderer i 1440p — streameren supersampler ned til den valgte opløsning.", + "clip_resolution_description": "Opløsning for renderede highlights og manuelt redigerede klip. 1080p balancerer kvalitet og filstørrelse; 720p giver ca. 50 % mindre filer. Begge får gavn af, at GPU-noder renderer i 1440p — streameren supersampler ned til den valgte opløsning.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (anbefales)", "clip_bake_branding": "Indbrænd spillerchip og outro i highlights", @@ -8820,7 +8820,6 @@ "close": "Luk", "segments": "Segmenter", "title_label": "Titel", - "resolution": "Opløsning", "render": "Render", "add": "Tilføj", "stop": "Stop", @@ -8893,7 +8892,6 @@ "preset": "Preset", "title_label": "Titel", "title_placeholder": "Bruger preset-navnet som standard", - "resolution": "Opløsning", "submit": "Generér highlights" }, "presets": { diff --git a/i18n/locales/de_DE.json b/i18n/locales/de_DE.json index e7dac0150..ac696eb0e 100644 --- a/i18n/locales/de_DE.json +++ b/i18n/locales/de_DE.json @@ -2402,7 +2402,7 @@ "clip_fps": "Highlight-FPS", "clip_fps_description": "Bildrate der Ausgabe für gerenderte Highlights und manuell geschnittene Clips. 60 FPS ist flüssiger, verdoppelt aber Encoding-Aufwand und Dateigröße; 30 FPS ist die leichtere Option.", "clip_resolution": "Highlight-Auflösung", - "clip_resolution_description": "Standard-Ausgabeauflösung für gerenderte Highlights und manuell geschnittene Clips. Nutzer können sie im Render-Dialog pro Clip überschreiben. 1080p hält Qualität und Dateigröße in Balance; 720p erzeugt rund 50 % kleinere Dateien. Beide profitieren, wenn GPU-Nodes in 1440p rendern — der Streamer skaliert das auf die gewählte Ausgabeauflösung herunter.", + "clip_resolution_description": "Ausgabeauflösung für gerenderte Highlights und manuell geschnittene Clips. 1080p hält Qualität und Dateigröße in Balance; 720p erzeugt rund 50 % kleinere Dateien. Beide profitieren, wenn GPU-Nodes in 1440p rendern — der Streamer skaliert das auf die gewählte Ausgabeauflösung herunter.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (empfohlen)", "clip_bake_branding": "Spieler-Chip + Outro in Highlights einbrennen", @@ -8820,7 +8820,6 @@ "close": "Schließen", "segments": "Segmente", "title_label": "Titel", - "resolution": "Auflösung", "render": "Rendern", "add": "Hinzufügen", "stop": "Stopp", @@ -8893,7 +8892,6 @@ "preset": "Preset", "title_label": "Titel", "title_placeholder": "Standard ist der Preset-Name", - "resolution": "Auflösung", "submit": "Highlights erzeugen" }, "presets": { diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 2bad8a946..cafc293e3 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -2402,7 +2402,7 @@ "clip_fps": "Highlight FPS", "clip_fps_description": "Output frame rate for rendered highlights and manually-edited clips. 60 FPS is smoother but doubles the encode work and file size; 30 FPS is the lighter option.", "clip_resolution": "Highlight Resolution", - "clip_resolution_description": "Default output resolution for rendered highlights and manually-edited clips. Users can still override per-clip in the render dialog. 1080p balances quality and file size; 720p produces ~50% smaller files. Both benefit when GPU nodes render at 1440p — the streamer supersamples that down to the selected output resolution.", + "clip_resolution_description": "Output resolution for rendered highlights and manually-edited clips. 1080p balances quality and file size; 720p produces ~50% smaller files. Both benefit when GPU nodes render at 1440p — the streamer supersamples that down to the selected output resolution.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (recommended)", "clip_bake_branding": "Bake player chip + outro into highlights", @@ -8820,7 +8820,6 @@ "close": "Close", "segments": "Segments", "title_label": "Title", - "resolution": "Resolution", "render": "Render", "add": "Add", "stop": "Stop", @@ -8893,7 +8892,6 @@ "preset": "Preset", "title_label": "Title", "title_placeholder": "Defaults to preset name", - "resolution": "Resolution", "submit": "Generate highlights" }, "presets": { diff --git a/i18n/locales/es_ES.json b/i18n/locales/es_ES.json index a59df853b..44ce7b0d4 100644 --- a/i18n/locales/es_ES.json +++ b/i18n/locales/es_ES.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS de highlights", "clip_fps_description": "Tasa de fotogramas de salida para highlights renderizados y clips editados a mano. 60 FPS es más fluido, pero duplica el trabajo de codificación y el tamaño del archivo; 30 FPS es la opción más ligera.", "clip_resolution": "Resolución de highlights", - "clip_resolution_description": "Resolución de salida por defecto para highlights renderizados y clips editados a mano. Los usuarios pueden cambiarla por clip en el diálogo de renderizado. 1080p equilibra calidad y tamaño; 720p genera archivos ~50 % más pequeños. Ambas mejoran cuando los nodos con GPU renderizan a 1440p: el streamer hace supermuestreo hasta la resolución de salida elegida.", + "clip_resolution_description": "Resolución de salida para highlights renderizados y clips editados a mano. 1080p equilibra calidad y tamaño; 720p genera archivos ~50 % más pequeños. Ambas mejoran cuando los nodos con GPU renderizan a 1440p: el streamer hace supermuestreo hasta la resolución de salida elegida.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (recomendado)", "clip_bake_branding": "Incrustar la ficha del jugador y el outro en los highlights", @@ -8820,7 +8820,6 @@ "close": "Cerrar", "segments": "Segmentos", "title_label": "Título", - "resolution": "Resolución", "render": "Renderizar", "add": "Añadir", "stop": "Detener", @@ -8893,7 +8892,6 @@ "preset": "Preset", "title_label": "Título", "title_placeholder": "Por defecto, el nombre del preset", - "resolution": "Resolución", "submit": "Generar highlights" }, "presets": { diff --git a/i18n/locales/fr_FR.json b/i18n/locales/fr_FR.json index f5725890c..8f0d255ca 100644 --- a/i18n/locales/fr_FR.json +++ b/i18n/locales/fr_FR.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS des highlights", "clip_fps_description": "Fréquence d'images en sortie pour les highlights rendus et les clips montés manuellement. 60 FPS est plus fluide mais double le travail d'encodage et la taille des fichiers ; 30 FPS est l'option la plus légère.", "clip_resolution": "Résolution des highlights", - "clip_resolution_description": "Résolution de sortie par défaut pour les highlights rendus et les clips montés manuellement. Les utilisateurs peuvent toujours la modifier clip par clip dans la fenêtre de rendu. 1080p équilibre qualité et taille de fichier ; 720p produit des fichiers ~50 % plus petits. Les deux profitent d'un rendu en 1440p sur les nœuds GPU — le streamer suréchantillonne ensuite vers la résolution de sortie choisie.", + "clip_resolution_description": "Résolution de sortie pour les highlights rendus et les clips montés manuellement. 1080p équilibre qualité et taille de fichier ; 720p produit des fichiers ~50 % plus petits. Les deux profitent d'un rendu en 1440p sur les nœuds GPU — le streamer suréchantillonne ensuite vers la résolution de sortie choisie.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (recommandé)", "clip_bake_branding": "Intégrer le bandeau joueur et l'outro aux highlights", @@ -8820,7 +8820,6 @@ "close": "Fermer", "segments": "Segments", "title_label": "Titre", - "resolution": "Résolution", "render": "Rendre", "add": "Ajouter", "stop": "Arrêter", @@ -8893,7 +8892,6 @@ "preset": "Preset", "title_label": "Titre", "title_placeholder": "Par défaut : le nom du preset", - "resolution": "Résolution", "submit": "Générer les highlights" }, "presets": { diff --git a/i18n/locales/it_IT.json b/i18n/locales/it_IT.json index 11b4146c1..396f8bb11 100644 --- a/i18n/locales/it_IT.json +++ b/i18n/locales/it_IT.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS highlight", "clip_fps_description": "Frame rate di output per gli highlight renderizzati e le clip modificate a mano. 60 FPS è più fluido ma raddoppia il carico di encoding e la dimensione dei file; 30 FPS è l'opzione più leggera.", "clip_resolution": "Risoluzione highlight", - "clip_resolution_description": "Risoluzione di output predefinita per gli highlight renderizzati e le clip modificate a mano. Gli utenti possono comunque cambiarla per singola clip nella finestra di render. 1080p bilancia qualità e dimensione; 720p produce file circa il 50% più piccoli. Entrambe migliorano quando i nodi GPU renderizzano a 1440p — lo streamer effettua il supersampling verso la risoluzione di output scelta.", + "clip_resolution_description": "Risoluzione di output per gli highlight renderizzati e le clip modificate a mano. 1080p bilancia qualità e dimensione; 720p produce file circa il 50% più piccoli. Entrambe migliorano quando i nodi GPU renderizzano a 1440p — lo streamer effettua il supersampling verso la risoluzione di output scelta.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (consigliato)", "clip_bake_branding": "Includi chip giocatore e outro negli highlight", @@ -8820,7 +8820,6 @@ "close": "Chiudi", "segments": "Segmenti", "title_label": "Titolo", - "resolution": "Risoluzione", "render": "Render", "add": "Aggiungi", "stop": "Ferma", @@ -8893,7 +8892,6 @@ "preset": "Preset", "title_label": "Titolo", "title_placeholder": "Predefinito: nome del preset", - "resolution": "Risoluzione", "submit": "Genera highlight" }, "presets": { diff --git a/i18n/locales/ja_JP.json b/i18n/locales/ja_JP.json index daa5790a0..0387cb27e 100644 --- a/i18n/locales/ja_JP.json +++ b/i18n/locales/ja_JP.json @@ -2402,7 +2402,7 @@ "clip_fps": "ハイライトFPS", "clip_fps_description": "レンダーされたハイライトと手動編集クリップの出力フレームレートです。60 FPSはより滑らかですが、エンコード処理とファイルサイズが倍になります。30 FPSは軽量な選択肢です。", "clip_resolution": "ハイライト解像度", - "clip_resolution_description": "レンダーされたハイライトと手動編集クリップのデフォルト出力解像度です。ユーザーはレンダーダイアログでクリップごとに上書きできます。1080pは画質とファイルサイズのバランスが良く、720pはファイルサイズが約50%小さくなります。GPUノードで1440pでレンダーすると、ストリーマーが選択した出力解像度にスーパーサンプリングして縮小するため、どちらも画質が向上します。", + "clip_resolution_description": "レンダーされたハイライトと手動編集クリップの出力解像度です。1080pは画質とファイルサイズのバランスが良く、720pはファイルサイズが約50%小さくなります。GPUノードで1440pでレンダーすると、ストリーマーが選択した出力解像度にスーパーサンプリングして縮小するため、どちらも画質が向上します。", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264(推奨)", "clip_bake_branding": "プレイヤーチップとアウトロをハイライトに焼き込む", @@ -8820,7 +8820,6 @@ "close": "閉じる", "segments": "セグメント", "title_label": "タイトル", - "resolution": "解像度", "render": "レンダリング", "add": "追加", "stop": "停止", @@ -8893,7 +8892,6 @@ "preset": "プリセット", "title_label": "タイトル", "title_placeholder": "未入力ならプリセット名", - "resolution": "解像度", "submit": "ハイライトを生成" }, "presets": { diff --git a/i18n/locales/ko_KR.json b/i18n/locales/ko_KR.json index 9f9d99033..cb9508056 100644 --- a/i18n/locales/ko_KR.json +++ b/i18n/locales/ko_KR.json @@ -2402,7 +2402,7 @@ "clip_fps": "하이라이트 FPS", "clip_fps_description": "렌더링된 하이라이트와 수동 편집 클립의 출력 프레임 레이트입니다. 60 FPS는 더 부드럽지만 인코딩 작업량과 파일 크기가 두 배가 되고, 30 FPS는 더 가벼운 선택지입니다.", "clip_resolution": "하이라이트 해상도", - "clip_resolution_description": "렌더링된 하이라이트와 수동 편집 클립의 기본 출력 해상도입니다. 사용자는 렌더 대화상자에서 클립별로 재정의할 수 있습니다. 1080p는 화질과 파일 크기의 균형이 좋고, 720p는 파일 크기가 약 50% 더 작습니다. GPU 노드가 1440p로 렌더링하면 스트리머가 선택된 출력 해상도로 슈퍼샘플링하므로 두 해상도 모두 이점을 얻습니다.", + "clip_resolution_description": "렌더링된 하이라이트와 수동 편집 클립의 출력 해상도입니다. 1080p는 화질과 파일 크기의 균형이 좋고, 720p는 파일 크기가 약 50% 더 작습니다. GPU 노드가 1440p로 렌더링하면 스트리머가 선택된 출력 해상도로 슈퍼샘플링하므로 두 해상도 모두 이점을 얻습니다.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (권장)", "clip_bake_branding": "하이라이트에 플레이어 칩 + 아웃트로 삽입", @@ -8820,7 +8820,6 @@ "close": "닫기", "segments": "구간", "title_label": "제목", - "resolution": "해상도", "render": "렌더링", "add": "추가", "stop": "중지", @@ -8893,7 +8892,6 @@ "preset": "프리셋", "title_label": "제목", "title_placeholder": "기본값은 프리셋 이름", - "resolution": "해상도", "submit": "하이라이트 생성" }, "presets": { diff --git a/i18n/locales/pl_PL.json b/i18n/locales/pl_PL.json index ba162eb9b..2a455723b 100644 --- a/i18n/locales/pl_PL.json +++ b/i18n/locales/pl_PL.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS highlightów", "clip_fps_description": "Częstotliwość klatek dla renderowanych highlightów i ręcznie edytowanych klipów. 60 FPS jest płynniejsze, ale podwaja pracę enkodera i rozmiar pliku; 30 FPS to lżejsza opcja.", "clip_resolution": "Rozdzielczość highlightów", - "clip_resolution_description": "Domyślna rozdzielczość wyjściowa dla renderowanych highlightów i ręcznie edytowanych klipów. Użytkownicy mogą nadal nadpisać ją dla pojedynczego klipu w oknie renderowania. 1080p balansuje jakość i rozmiar pliku; 720p daje ~50% mniejsze pliki. Obie opcje korzystają, gdy węzły GPU renderują w 1440p — streamer nadpróbkowuje do wybranej rozdzielczości wyjściowej.", + "clip_resolution_description": "Rozdzielczość wyjściowa dla renderowanych highlightów i ręcznie edytowanych klipów. 1080p balansuje jakość i rozmiar pliku; 720p daje ~50% mniejsze pliki. Obie opcje korzystają, gdy węzły GPU renderują w 1440p — streamer nadpróbkowuje do wybranej rozdzielczości wyjściowej.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (zalecane)", "clip_bake_branding": "Wypal chip gracza i outro w highlighty", @@ -8820,7 +8820,6 @@ "close": "Zamknij", "segments": "Segmenty", "title_label": "Tytuł", - "resolution": "Rozdzielczość", "render": "Renderuj", "add": "Dodaj", "stop": "Zatrzymaj", @@ -8893,7 +8892,6 @@ "preset": "Szablon", "title_label": "Tytuł", "title_placeholder": "Domyślnie nazwa szablonu", - "resolution": "Rozdzielczość", "submit": "Generuj highlighty" }, "presets": { diff --git a/i18n/locales/pt_BR.json b/i18n/locales/pt_BR.json index 6ce80a850..19ec88feb 100644 --- a/i18n/locales/pt_BR.json +++ b/i18n/locales/pt_BR.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS do highlight", "clip_fps_description": "Taxa de quadros de saída para highlights renderizados e clipes editados manualmente. 60 FPS é mais suave, mas dobra o trabalho de codificação e o tamanho do arquivo; 30 FPS é a opção mais leve.", "clip_resolution": "Resolução do highlight", - "clip_resolution_description": "Resolução de saída padrão para highlights renderizados e clipes editados manualmente. Os usuários ainda podem substituir por clipe no diálogo de renderização. 1080p equilibra qualidade e tamanho de arquivo; 720p produz arquivos ~50% menores. Ambos se beneficiam quando os nós de GPU renderizam em 1440p — o streamer faz supersampling reduzindo para a resolução de saída selecionada.", + "clip_resolution_description": "Resolução de saída para highlights renderizados e clipes editados manualmente. 1080p equilibra qualidade e tamanho de arquivo; 720p produz arquivos ~50% menores. Ambos se beneficiam quando os nós de GPU renderizam em 1440p — o streamer faz supersampling reduzindo para a resolução de saída selecionada.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (recomendado)", "clip_bake_branding": "Incorporar chip do jogador + outro nos highlights*", @@ -8820,7 +8820,6 @@ "close": "Fechar", "segments": "Segmentos", "title_label": "Título", - "resolution": "Resolução", "render": "Renderizar", "add": "Adicionar", "stop": "Parar", @@ -8893,7 +8892,6 @@ "preset": "Pré-ajuste", "title_label": "Título", "title_placeholder": "Padrão para o nome do pré-ajuste", - "resolution": "Resolução", "submit": "Gerar highlights" }, "presets": { diff --git a/i18n/locales/ru_RU.json b/i18n/locales/ru_RU.json index ba1ce70f3..e43ae950e 100644 --- a/i18n/locales/ru_RU.json +++ b/i18n/locales/ru_RU.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS хайлайтов", "clip_fps_description": "Частота кадров для рендеренных хайлайтов и вручную отредактированных клипов. 60 FPS плавнее, но удваивает нагрузку кодирования и размер файла; 30 FPS — более лёгкий вариант.", "clip_resolution": "Разрешение хайлайтов", - "clip_resolution_description": "Разрешение по умолчанию для рендеренных хайлайтов и вручную отредактированных клипов. Пользователи всё ещё могут переопределить его для каждого клипа в диалоге рендера. 1080p — баланс качества и размера файла; 720p даёт файлы примерно на 50% меньше. Оба варианта выигрывают, если GPU-ноды рендерят в 1440p — стример сжимает результат до выбранного выходного разрешения.", + "clip_resolution_description": "Разрешение для рендеренных хайлайтов и вручную отредактированных клипов. 1080p — баланс качества и размера файла; 720p даёт файлы примерно на 50% меньше. Оба варианта выигрывают, если GPU-ноды рендерят в 1440p — стример сжимает результат до выбранного выходного разрешения.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (рекомендуется)", "clip_bake_branding": "Встраивать чип игрока и аутро в хайлайты", @@ -8820,7 +8820,6 @@ "close": "Закрыть", "segments": "Сегменты", "title_label": "Название", - "resolution": "Разрешение", "render": "Рендер", "add": "Добавить", "stop": "Остановить", @@ -8893,7 +8892,6 @@ "preset": "Пресет", "title_label": "Название", "title_placeholder": "По умолчанию — название пресета", - "resolution": "Разрешение", "submit": "Сгенерировать хайлайты" }, "presets": { diff --git a/i18n/locales/sv_SE.json b/i18n/locales/sv_SE.json index 73c0fce7d..e237be036 100644 --- a/i18n/locales/sv_SE.json +++ b/i18n/locales/sv_SE.json @@ -2402,7 +2402,7 @@ "clip_fps": "Höjdpunkts-FPS", "clip_fps_description": "Utdatabildfrekvens för renderade höjdpunkter och manuellt redigerade klipp. 60 FPS är mjukare men dubblar kodningsarbetet och filstorleken; 30 FPS är det lättare alternativet.", "clip_resolution": "Höjdpunktsupplösning", - "clip_resolution_description": "Standardupplösning för renderade höjdpunkter och manuellt redigerade klipp. Användare kan fortfarande åsidosätta detta per klipp i renderingsdialogen. 1080p balanserar kvalitet och filstorlek; 720p ger ~50 % mindre filer. Båda gynnas när GPU-noder renderar i 1440p — streamern nedsamplar det till vald utdataupplösning.", + "clip_resolution_description": "Utdataupplösning för renderade höjdpunkter och manuellt redigerade klipp. 1080p balanserar kvalitet och filstorlek; 720p ger ~50 % mindre filer. Båda gynnas när GPU-noder renderar i 1440p — streamern nedsamplar det till vald utdataupplösning.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (rekommenderas)", "clip_bake_branding": "Bränn in spelarchip och outro i höjdpunkter", @@ -8820,7 +8820,6 @@ "close": "Stäng", "segments": "Segment", "title_label": "Titel", - "resolution": "Upplösning", "render": "Rendera", "add": "Lägg till", "stop": "Stoppa", @@ -8893,7 +8892,6 @@ "preset": "Förinställning", "title_label": "Titel", "title_placeholder": "Standard är förinställningens namn", - "resolution": "Upplösning", "submit": "Generera höjdpunkter" }, "presets": { diff --git a/i18n/locales/tr_TR.json b/i18n/locales/tr_TR.json index 87d2aefea..392a75a1e 100644 --- a/i18n/locales/tr_TR.json +++ b/i18n/locales/tr_TR.json @@ -2402,7 +2402,7 @@ "clip_fps": "Öne Çıkan An FPS", "clip_fps_description": "Render edilen öne çıkan anlar ve manuel düzenlenen klipler için çıktı kare hızı. 60 FPS daha akıcıdır ama render işini ve dosya boyutunu iki katına çıkarır; 30 FPS daha hafif seçenektir.", "clip_resolution": "Öne Çıkan An Çözünürlüğü", - "clip_resolution_description": "Render edilen öne çıkan anlar ve manuel düzenlenen klipler için varsayılan çıktı çözünürlüğü. Kullanıcılar render diyaloğunda klip başına bunu değiştirebilir. 1080p kalite ve dosya boyutu dengesi sunar; 720p yaklaşık %50 daha küçük dosyalar üretir. GPU düğümleri 1440p'de render ettiğinde ikisi de fayda görür — streamer bunu seçilen çıktı çözünürlüğüne süper örnekler.", + "clip_resolution_description": "Render edilen öne çıkan anlar ve manuel düzenlenen klipler için çıktı çözünürlüğü. 1080p kalite ve dosya boyutu dengesi sunar; 720p yaklaşık %50 daha küçük dosyalar üretir. GPU düğümleri 1440p'de render ettiğinde ikisi de fayda görür — streamer bunu seçilen çıktı çözünürlüğüne süper örnekler.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (önerilen)", "clip_bake_branding": "Oyuncu etiketini ve kapanışı öne çıkan anlara göm", @@ -8820,7 +8820,6 @@ "close": "Kapat", "segments": "Parçalar", "title_label": "Başlık", - "resolution": "Çözünürlük", "render": "Render", "add": "Ekle", "stop": "Durdur", @@ -8893,7 +8892,6 @@ "preset": "Hazır ayar", "title_label": "Başlık", "title_placeholder": "Varsayılan olarak hazır ayar adı kullanılır", - "resolution": "Çözünürlük", "submit": "Öne çıkan anları oluştur" }, "presets": { diff --git a/i18n/locales/uk_UA.json b/i18n/locales/uk_UA.json index b2a52adf6..671ecad04 100644 --- a/i18n/locales/uk_UA.json +++ b/i18n/locales/uk_UA.json @@ -2402,7 +2402,7 @@ "clip_fps": "FPS хайлайтів", "clip_fps_description": "Частота кадрів для рендерених хайлайтів і вручну змонтованих кліпів. 60 FPS плавніше, але подвоює навантаження на кодування та розмір файлу; 30 FPS — легший варіант.", "clip_resolution": "Роздільна здатність хайлайтів", - "clip_resolution_description": "Типова роздільна здатність для рендерених хайлайтів і вручну змонтованих кліпів. Користувачі все ще можуть перевизначити її для окремого кліпа в діалозі рендеру. 1080p балансує якість і розмір файлу; 720p дає приблизно на 50% менші файли. Обидва варіанти виграють, коли GPU-ноди рендерять у 1440p — стрімер суперсемплить це до вибраної вихідної роздільної здатності.", + "clip_resolution_description": "Роздільна здатність для рендерених хайлайтів і вручну змонтованих кліпів. 1080p балансує якість і розмір файлу; 720p дає приблизно на 50% менші файли. Обидва варіанти виграють, коли GPU-ноди рендерять у 1440p — стрімер суперсемплить це до вибраної вихідної роздільної здатності.", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264 (рекомендовано)", "clip_bake_branding": "Вшивати чіп гравця й аутро в хайлайти", @@ -8820,7 +8820,6 @@ "close": "Закрити", "segments": "Сегменти", "title_label": "Назва", - "resolution": "Роздільність", "render": "Рендер", "add": "Додати", "stop": "Зупинити", @@ -8893,7 +8892,6 @@ "preset": "Пресет", "title_label": "Назва", "title_placeholder": "За замовчуванням — назва пресету", - "resolution": "Роздільність", "submit": "Згенерувати хайлайти" }, "presets": { diff --git a/i18n/locales/zh_Hans.json b/i18n/locales/zh_Hans.json index 545892471..deff06cf1 100644 --- a/i18n/locales/zh_Hans.json +++ b/i18n/locales/zh_Hans.json @@ -2402,7 +2402,7 @@ "clip_fps": "高光时刻帧率", "clip_fps_description": "渲染的高光时刻和手动编辑精彩集锦的输出帧率。60 FPS 更流畅,但编码工作量和文件大小翻倍;30 FPS 是更轻量的选择。", "clip_resolution": "高光时刻分辨率", - "clip_resolution_description": "渲染的高光时刻和手动编辑精彩集锦的默认输出分辨率。用户仍可在渲染对话框中按集锦覆盖。1080p 兼顾画质和文件大小;720p 文件大小约减小 50%。当 GPU 节点以 1440p 渲染时,两者都能受益——流媒体服务器将超采样结果下采样到所选输出分辨率。", + "clip_resolution_description": "渲染的高光时刻和手动编辑精彩集锦的输出分辨率。1080p 兼顾画质和文件大小;720p 文件大小约减小 50%。当 GPU 节点以 1440p 渲染时,两者都能受益——流媒体服务器将超采样结果下采样到所选输出分辨率。", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264(推荐)", "clip_bake_branding": "在高光时刻中嵌入玩家标签和片尾", @@ -8820,7 +8820,6 @@ "close": "关闭", "segments": "片段", "title_label": "标题", - "resolution": "分辨率", "render": "渲染", "add": "添加", "stop": "停止", @@ -8893,7 +8892,6 @@ "preset": "预设", "title_label": "标题", "title_placeholder": "默认使用预设名称", - "resolution": "分辨率", "submit": "生成高光" }, "presets": { diff --git a/i18n/locales/zh_Hant.json b/i18n/locales/zh_Hant.json index be9f0be41..1227e8d1a 100644 --- a/i18n/locales/zh_Hant.json +++ b/i18n/locales/zh_Hant.json @@ -2402,7 +2402,7 @@ "clip_fps": "精華影格率", "clip_fps_description": "算圖精華與手動剪輯片段的輸出影格率。60 FPS 較流暢,但編碼工作量與檔案大小加倍;30 FPS 則較輕量。", "clip_resolution": "精華解析度", - "clip_resolution_description": "算圖精華與手動剪輯片段的預設輸出解析度。使用者仍可在算圖對話框中逐一覆寫。1080p 兼顧品質與檔案大小;720p 檔案約小 50%。當 GPU 節點以 1440p 算圖時兩者都能受益——串流器會將其超取樣降至所選的輸出解析度。", + "clip_resolution_description": "算圖精華與手動剪輯片段的輸出解析度。1080p 兼顧品質與檔案大小;720p 檔案約小 50%。當 GPU 節點以 1440p 算圖時兩者都能受益——串流器會將其超取樣降至所選的輸出解析度。", "codec_h265": "H.265 / HEVC", "codec_h264": "H.264(建議)", "clip_bake_branding": "將玩家標籤與片尾嵌入精華", @@ -8820,7 +8820,6 @@ "close": "關閉", "segments": "片段", "title_label": "標題", - "resolution": "解析度", "render": "算圖", "add": "新增", "stop": "停止", @@ -8893,7 +8892,6 @@ "preset": "預設集", "title_label": "標題", "title_placeholder": "預設使用預設集名稱", - "resolution": "解析度", "submit": "產生精華" }, "presets": { diff --git a/pages/settings/application/highlights.vue b/pages/settings/application/highlights.vue index baf2bf22a..25f492feb 100644 --- a/pages/settings/application/highlights.vue +++ b/pages/settings/application/highlights.vue @@ -325,7 +325,7 @@ import SettingsSaveBar from "~/components/settings/SettingsSaveBar.vue"; - + {{ $t("pages.settings.application.demo_settings.clip_fps") @@ -350,7 +350,7 @@ import SettingsSaveBar from "~/components/settings/SettingsSaveBar.vue"; - + {{ $t("pages.settings.application.demo_settings.clip_resolution") @@ -494,10 +494,8 @@ export default { .enum(["private", "public"]) .default("private"), clip_video_codec: z.enum(["h265", "h264"]).default("h264"), - public: z.object({ - clip_fps: z.enum(["30", "60"]).default("60"), - clip_resolution: z.enum(["720p", "1080p"]).default("1080p"), - }), + clip_fps: z.enum(["30", "60"]).default("60"), + clip_resolution: z.enum(["720p", "1080p"]).default("1080p"), }), ), }), @@ -527,7 +525,7 @@ export default { continue; } - if (setting.name === "public.clip_fps") { + if (setting.name === "clip_fps") { this.form.setFieldValue( setting.name, setting.value === "30" ? "30" : "60", @@ -535,7 +533,7 @@ export default { continue; } - if (setting.name === "public.clip_resolution") { + if (setting.name === "clip_resolution") { this.form.setFieldValue( setting.name, setting.value === "720p" ? "720p" : "1080p", @@ -629,12 +627,12 @@ export default { value: this.form.values.clip_video_codec ?? "h264", }, { - name: "public.clip_fps", - value: this.form.values.public?.clip_fps ?? "60", + name: "clip_fps", + value: this.form.values.clip_fps ?? "60", }, { - name: "public.clip_resolution", - value: this.form.values.public?.clip_resolution ?? "1080p", + name: "clip_resolution", + value: this.form.values.clip_resolution ?? "1080p", }, ], on_conflict: { diff --git a/tests/components/clipOutputSettings.spec.ts b/tests/components/clipOutputOperatorOnly.spec.ts similarity index 64% rename from tests/components/clipOutputSettings.spec.ts rename to tests/components/clipOutputOperatorOnly.spec.ts index 78e1b6796..863a91f2a 100644 --- a/tests/components/clipOutputSettings.spec.ts +++ b/tests/components/clipOutputOperatorOnly.spec.ts @@ -22,10 +22,18 @@ const sent = (action: string) => .map(([{ mutation }]) => mutation?.[action]?.[0]) .find(Boolean); -describe("clip output settings for a non-administrator", () => { +const OUTPUT_CONTROL = /resolution|\bfps\b|720p|1080p/i; + +const dialogWith = (marker: string) => + [...document.body.querySelectorAll('[role="dialog"]')] + .map((dialog) => dialog.textContent ?? "") + .find((text) => text.includes(marker)); + +describe("clip render requests", () => { beforeEach(() => { - // All a non-administrator's settings subscription can see: `public.` rows. useApplicationSettingsStore().settings = [ + { name: "clip_fps", value: "30" }, + { name: "clip_resolution", value: "720p" }, { name: "public.clip_fps", value: "30" }, { name: "public.clip_resolution", value: "720p" }, ]; @@ -45,24 +53,28 @@ describe("clip output settings for a non-administrator", () => { vi.restoreAllMocks(); }); - it("sends the operator's fps and resolution from the preset dialog", async () => { + it("the preset dialog shows no output controls and sends no fps or resolution", async () => { const wrapper = await mountSuspended(CreateClipDialog, { props: { open: false, matchMapId: "map-1" }, }); unmount = () => wrapper.unmount(); await wrapper.setProps({ open: true }); + await flushPromises(); + expect(dialogWith("Auto Clip")).toBeDefined(); + expect(dialogWith("Auto Clip")).not.toMatch(OUTPUT_CONTROL); + const vm = wrapper.vm as any; vm.presetTarget = "76561198000000009"; await vm.submit(); - expect(sent("createClipFromPreset")).toMatchObject({ - resolution: "720p", - fps: 30, - }); + const args = sent("createClipFromPreset"); + expect(args.target_steam_id).toBe("76561198000000009"); + expect(args).not.toHaveProperty("fps"); + expect(args).not.toHaveProperty("resolution"); }); - it("sends the operator's fps and resolution from the clip editor", async () => { + it("the clip editor shows no output controls and sends no output", async () => { const playback = useDemoPlaybackStore(); playback.totalTicks = 64 * 60; playback.hudVisible = false; @@ -73,16 +85,16 @@ describe("clip output settings for a non-administrator", () => { }); unmount = () => wrapper.unmount(); + expect(wrapper.text()).not.toMatch(OUTPUT_CONTROL); + await (wrapper.vm as any).submit(); - expect(sent("createClipRender").spec.output).toEqual({ - format: "mp4", - resolution: "720p", - fps: 30, - }); + const { spec } = sent("createClipRender"); + expect(spec.match_map_id).toBe("map-1"); + expect(spec).not.toHaveProperty("output"); }); - it("opens the admin highlight dialog on the operator's resolution", async () => { + it("the admin highlight dialog shows no output controls and sends no fps or resolution", async () => { vi.spyOn( (useNuxtApp() as any).$apollo.defaultClient, "query", @@ -110,11 +122,15 @@ describe("clip output settings for a non-administrator", () => { await wrapper.setProps({ open: true }); await flushPromises(); + expect(dialogWith("Mirage")).toBeDefined(); + expect(dialogWith("Mirage")).not.toMatch(OUTPUT_CONTROL); + await (wrapper.vm as any).submit(); const args = sent("queueClipFromPreset"); - expect(args.resolution).toBe("720p"); + expect(args.target_steam_id).toBe("76561198000000009"); expect(args).not.toHaveProperty("fps"); + expect(args).not.toHaveProperty("resolution"); }); }); @@ -143,40 +159,45 @@ describe("highlights settings page", () => { return wrapper; }; - it("loads and saves the clip settings under names every role can read", async () => { + const saved = () => + (sent("insert_settings").objects as Array<{ name: string }>).filter( + ({ name }) => + name.includes("clip_fps") || name.includes("clip_resolution"), + ); + + it("loads and saves the admin-only clip settings", async () => { useApplicationSettingsStore().settings = [ - { name: "public.clip_fps", value: "30" }, - { name: "public.clip_resolution", value: "720p" }, + { name: "clip_fps", value: "30" }, + { name: "clip_resolution", value: "720p" }, ]; const wrapper = await mountPage(); await (wrapper.vm as any).updateSettings(); - expect(sent("insert_settings").objects).toEqual( - expect.arrayContaining([ - { name: "public.clip_fps", value: "30" }, - { name: "public.clip_resolution", value: "720p" }, - ]), - ); + expect(saved()).toEqual([ + { name: "clip_fps", value: "30" }, + { name: "clip_resolution", value: "720p" }, + ]); }); - it("saves what an admin picks in the clip fields", async () => { + it("binds the clip fields to the admin-only names", async () => { const wrapper = await mountPage(); const field = (name: string) => wrapper .findAllComponents({ name: "Field" }) .find((f) => f.props("name") === name); - field("public.clip_fps")!.vm.handleChange("30"); - field("public.clip_resolution")!.vm.handleChange("720p"); + expect(field("public.clip_fps")).toBeUndefined(); + expect(field("public.clip_resolution")).toBeUndefined(); + + field("clip_fps")!.vm.handleChange("30"); + field("clip_resolution")!.vm.handleChange("720p"); await flushPromises(); await (wrapper.vm as any).updateSettings(); - expect(sent("insert_settings").objects).toEqual( - expect.arrayContaining([ - { name: "public.clip_fps", value: "30" }, - { name: "public.clip_resolution", value: "720p" }, - ]), - ); + expect(saved()).toEqual([ + { name: "clip_fps", value: "30" }, + { name: "clip_resolution", value: "720p" }, + ]); }); });