diff --git a/src/components/sidebar/tabs/queue/ResultGallery.vue b/src/components/sidebar/tabs/queue/ResultGallery.vue index 65815c985f..10afa5757e 100644 --- a/src/components/sidebar/tabs/queue/ResultGallery.vue +++ b/src/components/sidebar/tabs/queue/ResultGallery.vue @@ -27,10 +27,7 @@ class="galleria-image" v-if="item.isImage" /> - + @@ -40,6 +37,7 @@ import { ref, watch, onMounted, onUnmounted } from 'vue' import Galleria from 'primevue/galleria' import { ResultItemImpl } from '@/stores/queueStore' import ComfyImage from '@/components/common/ComfyImage.vue' +import ResultVideo from './ResultVideo.vue' const galleryVisible = ref(false) diff --git a/src/components/sidebar/tabs/queue/ResultItem.vue b/src/components/sidebar/tabs/queue/ResultItem.vue index 1fd59779a2..544116a2ff 100644 --- a/src/components/sidebar/tabs/queue/ResultItem.vue +++ b/src/components/sidebar/tabs/queue/ResultItem.vue @@ -6,12 +6,7 @@ class="task-output-image" :contain="imageFit === 'contain'" /> - +
{{ result.mediaType }} @@ -34,6 +29,7 @@ import ComfyImage from '@/components/common/ComfyImage.vue' import Button from 'primevue/button' import { computed, onMounted, ref } from 'vue' import { useSettingStore } from '@/stores/settingStore' +import ResultVideo from './ResultVideo.vue' const props = defineProps<{ result: ResultItemImpl diff --git a/src/components/sidebar/tabs/queue/ResultVideo.vue b/src/components/sidebar/tabs/queue/ResultVideo.vue new file mode 100644 index 0000000000..91521fcea5 --- /dev/null +++ b/src/components/sidebar/tabs/queue/ResultVideo.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/sidebar/tabs/queue/__tests__/ResultGallery.spec.ts b/src/components/sidebar/tabs/queue/__tests__/ResultGallery.ts similarity index 96% rename from src/components/sidebar/tabs/queue/__tests__/ResultGallery.spec.ts rename to src/components/sidebar/tabs/queue/__tests__/ResultGallery.ts index 2bfefed455..2bd1c859b9 100644 --- a/src/components/sidebar/tabs/queue/__tests__/ResultGallery.spec.ts +++ b/src/components/sidebar/tabs/queue/__tests__/ResultGallery.ts @@ -1,3 +1,5 @@ +// Disabled because of https://github.com/Comfy-Org/ComfyUI_frontend/issues/1184 + import { mount } from '@vue/test-utils' import { expect, describe, it } from 'vitest' import ResultGallery from '../ResultGallery.vue' diff --git a/src/stores/queueStore.ts b/src/stores/queueStore.ts index 73625338bb..84b99ff232 100644 --- a/src/stores/queueStore.ts +++ b/src/stores/queueStore.ts @@ -50,17 +50,58 @@ export class ResultItemImpl { 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 { - return api.apiURL(`/view?filename=${encodeURIComponent(this.filename)}&type=${this.type}& - subfolder=${encodeURIComponent(this.subfolder || '')}`) + return api.apiURL('/view?' + this.urlParams) } get urlWithTimestamp(): string { 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 { - return this.format && this.format.startsWith('video/') + return !this.isImage && this.format && this.format.startsWith('video/') } get isGif(): boolean {