diff --git a/src/components/AppSidebar.vue b/src/components/AppSidebar.vue index 1af1384..5fce16d 100644 --- a/src/components/AppSidebar.vue +++ b/src/components/AppSidebar.vue @@ -73,6 +73,7 @@ const navItems = computed(() => { { path: '/', icon: '🏠', tooltip: 'Home' }, { path: '/projects', icon: '📂', tooltip: 'Projects' }, { path: '/flexible', icon: '🖌️', tooltip: 'Flexible Generation' }, + { path: '/video', icon: '🎬', tooltip: 'Video Generation' }, { path: '/albums', icon: '🖼️', tooltip: 'Library' }, { path: '/characters', icon: '👥', tooltip: 'Characters' }, { path: '/image-to-prompt', icon: '✨', tooltip: 'Image to Prompt' } diff --git a/src/router/index.js b/src/router/index.js index 5f21804..70934af 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -57,6 +57,11 @@ const router = createRouter({ name: 'flexible', component: () => import('../views/FlexibleGenerationView.vue') }, + { + path: '/video', + name: 'video', + component: () => import('../views/VideoGenerationView.vue') + }, { path: '/albums', name: 'albums', diff --git a/src/services/aiService.js b/src/services/aiService.js index 2a6ead9..56c9311 100644 --- a/src/services/aiService.js +++ b/src/services/aiService.js @@ -66,5 +66,18 @@ export const aiService = { linked_assets: linkedAssets }) return response.data + }, + + // Run video generation task + async runVideoGeneration(payload) { + const response = await api.post('/generations/video/_run', payload) + return response.data + }, + + // Get video generations history + async getVideoGenerations(limit, offset) { + const params = { limit, offset, gen_type: 'Video' } + const response = await api.get('/generations', { params }) + return response.data } } diff --git a/src/views/VideoGenerationView.vue b/src/views/VideoGenerationView.vue new file mode 100644 index 0000000..54fdf77 --- /dev/null +++ b/src/views/VideoGenerationView.vue @@ -0,0 +1,982 @@ + + + + + + + + + 🎬 Video Studio + + History + + + + + + + + + + + + + + + + + + + + + + + Failed + {{ gen.failed_reason }} + + + + + + + + + + + + {{ gen.status + }}... + {{ + gen.progress }}% + + + + + + + + + + + + + + {{ + gen.cost }} $ + {{ + gen.execution_time_seconds.toFixed(1) }}s + + + + + + + + + + + + + + + + + {{ gen.prompt }} + + + + + + + + Your videos will appear here + + + + + + + All items loaded + + + + + + + + + + + + + + + + + Prompt + (motion/scene description) + + + + + + + Negative Prompt + (optional) + + + + + + + + + + Start Image * + + + + + + + + {{ startImage.name || 'Start' }} + + + + + Select start frame + + + + + + + Tail Image (optional) + + + + + + + + {{ tailImage.name || 'Tail' }} + + + + + Select end frame + + + + + + + Character + (optional) + + + + + + {{ slotProps.value.name }} + + {{ slotProps.placeholder }} + + + + + {{ slotProps.option.name }} + + + + + + + Use + Character + Photo + + + + + + + + + Duration + + + 5 sec + + + 10 sec + + + + + + + Mode + + + Standard + + + Pro + + + + + + + Model + + + + + + + CFG + Scale + {{ (cfgScale / 100).toFixed(2) }} + + + + + + + + + Send to + Telegram + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ tab }} + + + + + + + + + + + + + + + + + + {{ asset.name || 'Asset ' + (asset.id ? + asset.id.substring(0, 4) : '') }} + + + + + + No assets found + + + + + + + + + + + + + No albums found. Create one first! + + + + + + + + + + + + + + +
{{ gen.prompt }}
Your videos will appear here
{{ asset.name || 'Asset ' + (asset.id ? + asset.id.substring(0, 4) : '') }}
No assets found