mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-26 01:09:46 +00:00
Support VHS advanced preview in queue sidebar tab (#1183)
* Map VHS video type * Advance preview format * nit * View VHS advanced preview * Disable result gallery vitest * Proper disable
This commit is contained in:
@@ -27,10 +27,7 @@
|
|||||||
class="galleria-image"
|
class="galleria-image"
|
||||||
v-if="item.isImage"
|
v-if="item.isImage"
|
||||||
/>
|
/>
|
||||||
<video v-else-if="item.isVideo" controls width="100%" height="100%">
|
<ResultVideo v-else-if="item.isVideo" :result="item" />
|
||||||
<source :src="item.url" :type="item.format" />
|
|
||||||
{{ $t('videoFailedToLoad') }}
|
|
||||||
</video>
|
|
||||||
</template>
|
</template>
|
||||||
</Galleria>
|
</Galleria>
|
||||||
</template>
|
</template>
|
||||||
@@ -40,6 +37,7 @@ import { ref, watch, onMounted, onUnmounted } from 'vue'
|
|||||||
import Galleria from 'primevue/galleria'
|
import Galleria from 'primevue/galleria'
|
||||||
import { ResultItemImpl } from '@/stores/queueStore'
|
import { ResultItemImpl } from '@/stores/queueStore'
|
||||||
import ComfyImage from '@/components/common/ComfyImage.vue'
|
import ComfyImage from '@/components/common/ComfyImage.vue'
|
||||||
|
import ResultVideo from './ResultVideo.vue'
|
||||||
|
|
||||||
const galleryVisible = ref(false)
|
const galleryVisible = ref(false)
|
||||||
|
|
||||||
|
|||||||
@@ -6,12 +6,7 @@
|
|||||||
class="task-output-image"
|
class="task-output-image"
|
||||||
:contain="imageFit === 'contain'"
|
:contain="imageFit === 'contain'"
|
||||||
/>
|
/>
|
||||||
<template v-else-if="result.isVideo">
|
<ResultVideo v-else-if="result.isVideo" :result="result" />
|
||||||
<video controls width="100%" height="100%">
|
|
||||||
<source :src="result.url" :type="result.format" />
|
|
||||||
{{ $t('videoFailedToLoad') }}
|
|
||||||
</video>
|
|
||||||
</template>
|
|
||||||
<div v-else class="task-result-preview">
|
<div v-else class="task-result-preview">
|
||||||
<i class="pi pi-file"></i>
|
<i class="pi pi-file"></i>
|
||||||
<span>{{ result.mediaType }}</span>
|
<span>{{ result.mediaType }}</span>
|
||||||
@@ -34,6 +29,7 @@ import ComfyImage from '@/components/common/ComfyImage.vue'
|
|||||||
import Button from 'primevue/button'
|
import Button from 'primevue/button'
|
||||||
import { computed, onMounted, ref } from 'vue'
|
import { computed, onMounted, ref } from 'vue'
|
||||||
import { useSettingStore } from '@/stores/settingStore'
|
import { useSettingStore } from '@/stores/settingStore'
|
||||||
|
import ResultVideo from './ResultVideo.vue'
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
result: ResultItemImpl
|
result: ResultItemImpl
|
||||||
|
|||||||
24
src/components/sidebar/tabs/queue/ResultVideo.vue
Normal file
24
src/components/sidebar/tabs/queue/ResultVideo.vue
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<template>
|
||||||
|
<video controls width="100%" height="100%">
|
||||||
|
<source :src="url" :type="result.htmlVideoType" />
|
||||||
|
{{ $t('videoFailedToLoad') }}
|
||||||
|
</video>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ResultItemImpl } from '@/stores/queueStore'
|
||||||
|
import { useSettingStore } from '@/stores/settingStore'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
result: ResultItemImpl
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const settingStore = useSettingStore()
|
||||||
|
const url = computed(() => {
|
||||||
|
if (settingStore.get('VHS.AdvancedPreviews')) {
|
||||||
|
return props.result.vhsAdvancedPreviewUrl
|
||||||
|
}
|
||||||
|
return props.result.url
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// Disabled because of https://github.com/Comfy-Org/ComfyUI_frontend/issues/1184
|
||||||
|
|
||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import { expect, describe, it } from 'vitest'
|
import { expect, describe, it } from 'vitest'
|
||||||
import ResultGallery from '../ResultGallery.vue'
|
import ResultGallery from '../ResultGallery.vue'
|
||||||
@@ -50,17 +50,58 @@ export class ResultItemImpl {
|
|||||||
this.frame_rate = obj.frame_rate
|
this.frame_rate = obj.frame_rate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private get urlParams(): URLSearchParams {
|
||||||
|
const params = new URLSearchParams()
|
||||||
|
params.set('filename', this.filename)
|
||||||
|
params.set('type', this.type)
|
||||||
|
params.set('subfolder', this.subfolder || '')
|
||||||
|
|
||||||
|
if (this.format) {
|
||||||
|
params.set('format', this.format)
|
||||||
|
}
|
||||||
|
if (this.frame_rate) {
|
||||||
|
params.set('frame_rate', this.frame_rate.toString())
|
||||||
|
}
|
||||||
|
return params
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VHS advanced preview URL. `/viewvideo` endpoint is provided by VHS node.
|
||||||
|
*/
|
||||||
|
get vhsAdvancedPreviewUrl(): string {
|
||||||
|
return api.apiURL('/viewvideo?' + this.urlParams)
|
||||||
|
}
|
||||||
|
|
||||||
get url(): string {
|
get url(): string {
|
||||||
return api.apiURL(`/view?filename=${encodeURIComponent(this.filename)}&type=${this.type}&
|
return api.apiURL('/view?' + this.urlParams)
|
||||||
subfolder=${encodeURIComponent(this.subfolder || '')}`)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get urlWithTimestamp(): string {
|
get urlWithTimestamp(): string {
|
||||||
return `${this.url}&t=${+new Date()}`
|
return `${this.url}&t=${+new Date()}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get isVhsFormat(): boolean {
|
||||||
|
return !!this.format && !!this.frame_rate
|
||||||
|
}
|
||||||
|
|
||||||
|
get htmlVideoType(): string | undefined {
|
||||||
|
const defaultType = undefined
|
||||||
|
|
||||||
|
if (!this.isVhsFormat) {
|
||||||
|
return defaultType
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.format.endsWith('webm')) {
|
||||||
|
return 'video/webm'
|
||||||
|
}
|
||||||
|
if (this.format.endsWith('mp4')) {
|
||||||
|
return 'video/mp4'
|
||||||
|
}
|
||||||
|
return defaultType
|
||||||
|
}
|
||||||
|
|
||||||
get isVideo(): boolean {
|
get isVideo(): boolean {
|
||||||
return this.format && this.format.startsWith('video/')
|
return !this.isImage && this.format && this.format.startsWith('video/')
|
||||||
}
|
}
|
||||||
|
|
||||||
get isGif(): boolean {
|
get isGif(): boolean {
|
||||||
|
|||||||
Reference in New Issue
Block a user