mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-02 21:28:08 +00:00
## Summary - **Pricing copy** — replace "concurrent API jobs" wording with "workflows via API" on Creator/Pro plans, add a third feature line to Standard, and add a new "Run Workflows via API" entry to the "What's Included" section (existing feature11 → feature12). - **Tutorial captions** — wire per-locale VTT caption tracks into `TutorialDetailDialog`, so the CC button in `VideoPlayer` is now functional for the learning tutorials. `LearningTutorial.caption` is typed as `readonly VideoTrack[]`; `VideoTrack` is now exported from `VideoPlayer.vue`. - Tailwind class ordering in `PriceSection.vue` shifted due to the formatter on touched lines. ## Test plan - [ ] `/pricing` page (EN + zh-CN): Standard plan shows the new "1 workflow via API" line; Creator/Pro show "3/5 workflows via API"; "What's Included" lists "Run Workflows via API" above "Parallel job execution". - [ ] Open a learning tutorial → CC button is visible in the player → toggling CC shows English captions in sync with playback. - [ ] Tutorials without a `caption` entry hide the CC button. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: github-actions <github-actions@github.com>
135 lines
4.4 KiB
TypeScript
135 lines
4.4 KiB
TypeScript
import type { VideoTrack } from '../components/common/VideoPlayer.vue'
|
|
import type { LocalizedText, TranslationKey } from '../i18n/translations'
|
|
|
|
export interface LearningTutorial {
|
|
id: string
|
|
tags: readonly TranslationKey[]
|
|
title: LocalizedText
|
|
videoSrc: string
|
|
href?: string
|
|
poster?: string
|
|
caption?: readonly VideoTrack[]
|
|
posterTime?: number
|
|
}
|
|
|
|
const DEFAULT_POSTER_TIME_SECONDS = 1
|
|
|
|
const partnerNodesTag: TranslationKey = 'tags.partnerNodes'
|
|
const imageToVideoTag: TranslationKey = 'tags.imageToVideo'
|
|
|
|
export const getTutorialPosterSrc = (tutorial: LearningTutorial): string =>
|
|
tutorial.poster
|
|
? tutorial.poster
|
|
: `${tutorial.videoSrc}#t=${tutorial.posterTime ?? DEFAULT_POSTER_TIME_SECONDS}`
|
|
|
|
export const learningTutorials: readonly LearningTutorial[] = [
|
|
{
|
|
id: 'cleanplate_walkthrough_v03',
|
|
title: { en: 'Cleanplate Walkthrough', 'zh-CN': '净板演练' },
|
|
videoSrc:
|
|
'https://media.comfy.org/website/learning/cleanplate_walkthrough_v03.mp4',
|
|
poster:
|
|
'https://media.comfy.org/website/learning/cleanplate_walkthrough_v03_thumbnail.jpg',
|
|
caption: [
|
|
{
|
|
src: 'https://media.comfy.org/website/learning/cleanplate_walkthrough_v03_vtt.en.vtt',
|
|
kind: 'captions',
|
|
srclang: 'en',
|
|
label: 'English'
|
|
}
|
|
],
|
|
// href: '#',
|
|
tags: [partnerNodesTag, imageToVideoTag]
|
|
},
|
|
{
|
|
id: 'deaging_workflow_v03',
|
|
title: { en: 'Deaging Workflow', 'zh-CN': '减龄工作流' },
|
|
videoSrc:
|
|
'https://media.comfy.org/website/learning/deaging_workflow_v03.mp4',
|
|
poster:
|
|
'https://media.comfy.org/website/learning/deaging_workflow_v03_thumbnail.jpg',
|
|
href: 'https://comfy.org/workflows/93f286fbc2c8-93f286fbc2c8/',
|
|
caption: [
|
|
{
|
|
src: 'https://media.comfy.org/website/learning/deaging_workflow_v03_vtt.en.vtt',
|
|
kind: 'captions',
|
|
srclang: 'en',
|
|
label: 'English'
|
|
}
|
|
],
|
|
tags: [partnerNodesTag, imageToVideoTag]
|
|
},
|
|
{
|
|
id: 'frame_adjustments_demo_v03',
|
|
title: { en: 'Frame Adjustments Demo', 'zh-CN': '帧调整演示' },
|
|
videoSrc:
|
|
'https://media.comfy.org/website/learning/frame_adjustments_demo_v03.mp4',
|
|
poster:
|
|
'https://media.comfy.org/website/learning/frame_adjustments_demo_v03_thumbnail.jpg',
|
|
href: 'https://cloud.comfy.org/?share=7dca0438edf4',
|
|
caption: [
|
|
{
|
|
src: 'https://media.comfy.org/website/learning/frame_adjustments_demo_v03_vtt.en.vtt',
|
|
kind: 'captions',
|
|
srclang: 'en',
|
|
label: 'English'
|
|
}
|
|
],
|
|
tags: [partnerNodesTag, imageToVideoTag]
|
|
},
|
|
{
|
|
id: 'mattes_and_utilities_v03',
|
|
title: { en: 'Mattes and Utilities', 'zh-CN': '遮罩与实用工具' },
|
|
videoSrc:
|
|
'https://media.comfy.org/website/learning/mattes_and_utilities_v03.mp4',
|
|
poster:
|
|
'https://media.comfy.org/website/learning/mattes_and_utilities_v03_thumbnail.jpg',
|
|
href: 'https://cloud.comfy.org/?share=be0889296f65',
|
|
caption: [
|
|
{
|
|
src: 'https://media.comfy.org/website/learning/mattes_and_utilities_v03_vtt.en.vtt',
|
|
kind: 'captions',
|
|
srclang: 'en',
|
|
label: 'English'
|
|
}
|
|
],
|
|
tags: [partnerNodesTag, imageToVideoTag]
|
|
},
|
|
{
|
|
id: 'seedance_demo_comfyui_v03',
|
|
title: { en: 'Seedance Demo ComfyUI', 'zh-CN': 'Seedance ComfyUI 演示' },
|
|
videoSrc:
|
|
'https://media.comfy.org/website/learning/seedance_demo_comfyui_v03.mp4',
|
|
poster:
|
|
'https://media.comfy.org/website/learning/seedance seedance_demo_comfyui_v03_thumbnail.jpg',
|
|
href: 'https://cloud.comfy.org/?share=ef543bd4a773',
|
|
caption: [
|
|
{
|
|
src: 'https://media.comfy.org/website/learning/seedance_demo_comfyui_v03_vtt.en.vtt',
|
|
kind: 'captions',
|
|
srclang: 'en',
|
|
label: 'English'
|
|
}
|
|
],
|
|
tags: [partnerNodesTag, imageToVideoTag]
|
|
},
|
|
{
|
|
id: 'skyreplacement_smaller_v06',
|
|
title: { en: 'Sky Replacement', 'zh-CN': '天空替换' },
|
|
videoSrc:
|
|
'https://media.comfy.org/website/learning/skyreplacement_smaller_v06.mp4',
|
|
poster:
|
|
'https://media.comfy.org/website/learning/skyreplacement_smaller_v06_thumbnail.jpg',
|
|
href: 'https://comfy.org/workflows/537cf7f1f745-537cf7f1f745/',
|
|
caption: [
|
|
{
|
|
src: 'https://media.comfy.org/website/learning/skyreplacement_smaller_v06_vtt.en.vtt',
|
|
kind: 'captions',
|
|
srclang: 'en',
|
|
label: 'English'
|
|
}
|
|
],
|
|
tags: [partnerNodesTag, imageToVideoTag]
|
|
}
|
|
] as const
|