Files
localMiniDrama/frontweb/src/composables/useCanvasStoryboardMedia.js
T
2026-06-30 15:07:31 +08:00

62 lines
1.7 KiB
JavaScript

import { ref } from 'vue'
import { imagesAPI } from '@/api/images'
import { videosAPI } from '@/api/videos'
/**
* 加载当前剧集分镜的 images / videos 列表(与 FilmCreate.loadStoryboardMedia 对齐)
*/
export function useCanvasStoryboardMedia() {
const imagesBySbId = ref({})
const videosBySbId = ref({})
const mediaLoading = ref(false)
async function loadForStoryboards(storyboards) {
const boards = storyboards || []
if (!boards.length) {
imagesBySbId.value = {}
videosBySbId.value = {}
return
}
mediaLoading.value = true
try {
const nextImages = { ...imagesBySbId.value }
const nextVideos = { ...videosBySbId.value }
await Promise.all(
boards.map(async (sb) => {
try {
const [imgRes, vidRes] = await Promise.all([
imagesAPI.list({ storyboard_id: sb.id, page: 1, page_size: 100 }),
videosAPI.list({ storyboard_id: sb.id, page: 1, page_size: 50 }),
])
nextImages[sb.id] = imgRes?.items || []
nextVideos[sb.id] = vidRes?.items || []
} catch (_) {
nextImages[sb.id] = []
nextVideos[sb.id] = []
}
})
)
imagesBySbId.value = nextImages
videosBySbId.value = nextVideos
} finally {
mediaLoading.value = false
}
}
async function loadForDrama(drama, episodeId = null) {
const episodes = episodeId
? (drama?.episodes || []).filter((ep) => ep.id === episodeId)
: (drama?.episodes || [])
const boards = episodes.flatMap((ep) => ep.storyboards || [])
await loadForStoryboards(boards)
}
return {
imagesBySbId,
videosBySbId,
mediaLoading,
loadForStoryboards,
loadForDrama,
}
}