{"_id":"@andy-toolforge/footage-generation","_rev":"8-3e953e6c5e74ae0d291a09c71975d527","name":"@andy-toolforge/footage-generation","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@andy-toolforge/footage-generation","version":"1.0.0","_id":"@andy-toolforge/footage-generation@1.0.0","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"homepage":"https://github.com/andy-pham-it/toolforge#readme","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"dist":{"shasum":"df3b1af2b22d8885f6624a45bc999c80dc10efc3","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.0.0.tgz","fileCount":13,"integrity":"sha512-VWuIX1d99EgOE112H/44i+gbuvbZV+GkwXjO3gUVF/PDzDeoBe/X7E9e+DG7bL3bJvMN17Etu001hTl7PTdk+Q==","signatures":[{"sig":"MEUCIFnBjLnrglhShRY0MKEbiWdEmnR3DCC08gnC2OG2wyeRAiEAnKoQKrHPPcGAMic8niDC22iu1eoF/VxAZ5o7Xh0pnCA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78462},"main":"lib/index.js","scripts":{"test":"node --test lib/*.test.js","postinstall":"node skills/postinstall.js"},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"repository":{"url":"git+https://github.com/andy-pham-it/toolforge.git","type":"git"},"_npmVersion":"10.9.4","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","directories":{},"_nodeVersion":"22.22.0","dependencies":{"sharp":"^0.35.2","@andy-toolforge/core":"^1.0.0"},"publishConfig":{"registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/footage-generation_1.0.0_1782900474712_0.22883019735025956","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@andy-toolforge/footage-generation","version":"1.0.1","_id":"@andy-toolforge/footage-generation@1.0.1","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"homepage":"https://github.com/andy-pham-it/toolforge#readme","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"dist":{"shasum":"80c81effcbe3bfb6da506fbf8a59b99eebfbe10f","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.0.1.tgz","fileCount":14,"integrity":"sha512-5yEUheiHD+UaIX+eEmdYECpGXq5ttjuWuJJY5EjvnZ+PuvMFOk1Wp/94Nv4ikpZ8smmgrT9sAYS8yzjTEZlljg==","signatures":[{"sig":"MEUCIQD8KEKTqDEArSpVnNTRAOaAfePDXI042DbeutxEZk3krQIgE7e5y6MsLF1s2caSUNVhV0GCjGOMh3gyFoHCKWKqfzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93271},"main":"lib/index.js","gitHead":"0a96a7db4c347c952b827416f0922a79816369cf","scripts":{"test":"node --test lib/*.test.js","postinstall":"node skills/postinstall.js"},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"repository":{"url":"git+https://github.com/andy-pham-it/toolforge.git","type":"git"},"_npmVersion":"10.8.2","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","directories":{},"_nodeVersion":"20.20.2","dependencies":{"sharp":"^0.35.2","@andy-toolforge/core":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/footage-generation_1.0.1_1783216846973_0.8028810394518742","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@andy-toolforge/footage-generation","version":"1.1.0","_id":"@andy-toolforge/footage-generation@1.1.0","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"homepage":"https://github.com/andy-pham-it/toolforge#readme","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"dist":{"shasum":"92c08bcaf49d3d72166ccd9a95a9329d7fa4d114","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.1.0.tgz","fileCount":19,"integrity":"sha512-DPLE0KwiegePGB26+JJzSxayd1Z4AH0Bt+cxkO5aiscZmiv5nwBDluBitKJkT1oqCezWyDHssvtNWYW3F790DQ==","signatures":[{"sig":"MEQCIA/0MW/z8nLV8EQY6t9l5kOUTU0g0l4Jdpn005ElMtorAiBHYNjuii11x+D5MlfCy5MjuZxoJJOD04cU7xyMXCLFqw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152637},"main":"lib/index.js","gitHead":"10d1b9f858339b4913b97679e35b51542929c133","scripts":{"test":"node --test lib/*.test.js","postinstall":"node skills/postinstall.js"},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"repository":{"url":"git+https://github.com/andy-pham-it/toolforge.git","type":"git"},"_npmVersion":"10.8.2","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","directories":{},"_nodeVersion":"20.20.2","dependencies":{"sharp":"^0.35.2","puppeteer":"^25.2.1","@andy-toolforge/core":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/footage-generation_1.1.0_1783299600923_0.9462659936113456","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@andy-toolforge/footage-generation","version":"1.2.0","_id":"@andy-toolforge/footage-generation@1.2.0","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"homepage":"https://github.com/andy-pham-it/toolforge#readme","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"dist":{"shasum":"75ee072929eba4d152dbe31651f1aadfb7a20ab5","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.2.0.tgz","fileCount":19,"integrity":"sha512-BJqRoc5NxwC8EGw2riwfU/DEipRyV1QME8ZZ34q4N++niWKi3kjBeuyquZPSKyRWjDWgOOevNGuwIEgv4duuNA==","signatures":[{"sig":"MEUCIGRKmps/kod+Znev1rU/u06sRitVjutwXHlm3z8gaAvlAiEArxL8VgBu4WcHuX1F2IVoaCBTU/mjVlmUmwEZyUwa1RU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156871},"main":"lib/index.js","gitHead":"30c0a3474bca9e9546e94b6b1d9e1940c0dead0a","scripts":{"test":"node --test lib/*.test.js","postinstall":"node skills/postinstall.js"},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"repository":{"url":"git+https://github.com/andy-pham-it/toolforge.git","type":"git"},"_npmVersion":"10.8.2","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","directories":{},"_nodeVersion":"20.20.2","dependencies":{"sharp":"^0.35.2","puppeteer":"^25.2.1","@andy-toolforge/core":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/footage-generation_1.2.0_1783347861301_0.9468310249222964","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@andy-toolforge/footage-generation","version":"1.2.1","_id":"@andy-toolforge/footage-generation@1.2.1","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"homepage":"https://github.com/andy-pham-it/toolforge#readme","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"dist":{"shasum":"8a9ff0c01d8317dd520ba6091ebf1a894aa83362","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.2.1.tgz","fileCount":20,"integrity":"sha512-GJ5zxS0JWzi34RbMlW9wa/yD1Yer1QTjK8VBU0tvib4q3WSGKZRP/PXya0vJ0WBJYs3qrLr5VJw2B/C42a3Y1w==","signatures":[{"sig":"MEUCIQCcYURMMZ4/nQ+QpMFyXLksYFxQUK74UBuUSRHGt6A7NAIgWfHuIi/r9DjvmpL0XsdMGm2z63p7wvoaxr41B9AvEg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165431},"main":"lib/index.js","gitHead":"e606f126cb5e89e10d53308e55238a0ba754b4a1","scripts":{"test":"node --test lib/*.test.js","postinstall":"node skills/postinstall.js"},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"repository":{"url":"git+https://github.com/andy-pham-it/toolforge.git","type":"git"},"_npmVersion":"10.8.2","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","directories":{},"_nodeVersion":"20.20.2","dependencies":{"sharp":"^0.35.2","puppeteer":"^25.2.1","@andy-toolforge/core":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/footage-generation_1.2.1_1783780107894_0.18814742469451406","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@andy-toolforge/footage-generation","version":"1.3.0","_id":"@andy-toolforge/footage-generation@1.3.0","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"homepage":"https://github.com/andy-pham-it/toolforge#readme","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"dist":{"shasum":"f1fb7fd9c6c3ea7b94c261658d062dce62dfe10b","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.3.0.tgz","fileCount":20,"integrity":"sha512-XA2+4O5+xou/z1bBy/6QPk+3AL2Mp/NCfSaY67onWqnOCDdQuowweOxnbUTJmud8rV31M0n68fSCjScIjHoPcA==","signatures":[{"sig":"MEYCIQC04hmz0Msum+E8kXSzBxudYf6+0tKY99ZoSpoON1RreAIhAK0JHMktgPLYRIFBIeXlmTocBoZ5xcmEXPOGspsKxsmJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171535},"main":"lib/index.js","gitHead":"d636b300685b7ddc5ff6ef52cec9491df6e9a900","scripts":{"test":"node --test lib/*.test.js","postinstall":"node skills/postinstall.js"},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"repository":{"url":"git+https://github.com/andy-pham-it/toolforge.git","type":"git"},"_npmVersion":"10.8.2","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","directories":{},"_nodeVersion":"20.20.2","dependencies":{"sharp":"^0.35.2","puppeteer":"^25.2.1","@andy-toolforge/core":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/footage-generation_1.3.0_1783828000476_0.24862718658372995","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@andy-toolforge/footage-generation","version":"1.3.1","_id":"@andy-toolforge/footage-generation@1.3.1","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"homepage":"https://github.com/andy-pham-it/toolforge#readme","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"dist":{"shasum":"a9993ed060f3bbfdf909c587e5c6f69bbac0a11d","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.3.1.tgz","fileCount":21,"integrity":"sha512-9W6XosI5eM9Lg9/WpRnQLwXt8HAlMlbRpecjwhr1OG/KXCL5H0suB4RSXUQ5GaBFn75RHlVMKdA/VwH9nSpQNg==","signatures":[{"sig":"MEUCIQDQzBm6/sSrNeuzJKoxISrLT/W8jxsdGMADR53w47oynQIgRz4eMtLEBtMZwhaOpgNoWhEGE5VrSf7Cxor6Cw2ieZs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175999},"main":"lib/index.js","gitHead":"8f5ce92f2c9d641d1bcc3ac162714fff92ff9917","scripts":{"test":"node --test lib/*.test.js","postinstall":"node skills/postinstall.js"},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"repository":{"url":"git+https://github.com/andy-pham-it/toolforge.git","type":"git"},"_npmVersion":"10.8.2","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","directories":{},"_nodeVersion":"20.20.2","dependencies":{"sharp":"^0.35.2","puppeteer":"^25.2.1","@andy-toolforge/core":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/footage-generation_1.3.1_1783837615024_0.952112971859084","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@andy-toolforge/footage-generation","version":"1.4.0","description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","main":"lib/index.js","repository":{"type":"git","url":"git+https://github.com/andy-pham-it/toolforge.git"},"scripts":{"postinstall":"node skills/postinstall.js","test":"node --test lib/*.test.js"},"dependencies":{"@andy-toolforge/core":"^1.0.0","puppeteer":"^25.2.1","sharp":"^0.35.2"},"peerDependencies":{"@google/genai":"^2.10.0"},"_id":"@andy-toolforge/footage-generation@1.4.0","gitHead":"13f8dac5f981440ff64e699c165978285c470e1a","bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"homepage":"https://github.com/andy-pham-it/toolforge#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-fg3j0uJxwxhqYNOOYu/tqbB0Yb5wSkgM62lx3qi3lFmtHUJakiQFFCfB9M2VR8qKVRSwnSkaXMboh/v3auxiyQ==","shasum":"44820f2d2da39bc32686f7812f0edf2343b0327d","tarball":"https://registry.npmjs.org/@andy-toolforge/footage-generation/-/footage-generation-1.4.0.tgz","fileCount":22,"unpackedSize":186689,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF4eQQYwftC6r/J3T1BYoqeBOU2IETE7NLUJmG5DTYZEAiA/rYeBm4mOfPmE+OX+qvmwv1ZG3FKQ36eY3Sv02yWSfg=="}]},"_npmUser":{"name":"andy_pham","email":"phamlehoaian@gmail.com"},"directories":{},"maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/footage-generation_1.4.0_1784305209547_0.9188540046150968"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-01T10:07:54.330Z","modified":"2026-07-17T16:20:09.979Z","1.0.0":"2026-07-01T10:07:54.854Z","1.0.1":"2026-07-05T02:00:47.124Z","1.1.0":"2026-07-06T01:00:01.049Z","1.2.0":"2026-07-06T14:24:21.502Z","1.2.1":"2026-07-11T14:28:28.052Z","1.3.0":"2026-07-12T03:46:40.630Z","1.3.1":"2026-07-12T06:26:55.165Z","1.4.0":"2026-07-17T16:20:09.696Z"},"bugs":{"url":"https://github.com/andy-pham-it/toolforge/issues"},"homepage":"https://github.com/andy-pham-it/toolforge#readme","repository":{"type":"git","url":"git+https://github.com/andy-pham-it/toolforge.git"},"description":"Toolforge domain: generate images, videos, and visuals for podcasts and content","maintainers":[{"name":"andy_pham","email":"phamlehoaian@gmail.com"}],"readme":"# @andy-toolforge/footage-generation\n\n[![npm](https://img.shields.io/npm/v/@andy-toolforge/footage-generation)](https://npmjs.com/package/@andy-toolforge/footage-generation)\n[![License](https://img.shields.io/npm/l/@andy-toolforge/footage-generation)](https://github.com/andy-pham-it/toolforge)\n\n**Image and video generation toolkit for podcasts and content creation.** Thuộc hệ sinh thái [toolforge](https://github.com/andy-pham-it/toolforge).\n\nPackage này giúp bạn:\n- Phân tích script podcast → chia thành visual segments với image prompts\n- Sinh prompt cho image generation (5 visual styles)\n- Overlay text lên ảnh (dùng sharp)\n- Map nhạc nền + sound design cho từng segment\n- Gợi ý cover art cho series/episode/thumbnail\n\n## Installation\n\n```bash\nnpm install @andy-toolforge/footage-generation\n```\n\nYêu cầu: `sharp` (xử lý ảnh) và `@andy-toolforge/core` (tự động cài kèm).\n\n## API Reference\n\n```javascript\nconst {\n    ImageGenerator,    // Sinh ảnh/video từ prompts\n    TextOverlayer,     // Overlay text lên ảnh\n    PromptWriter,      // Quản lý prompt templates\n    LLMClient,         // LLMClient mở rộng với domain methods (analyzeScript, generateCoverPrompts)\n    Imagen4Generator,  // Google Imagen 4 image generation (3 model tiers, quota tracking)\n    MODEL_TIERS,       // { FAST, GENERATE, ULTRA } — model tier identifiers\n} = require('@andy-toolforge/footage-generation');\n```\n\n---\n\n### LLMClient\n\nExtends `@andy-toolforge/core`'s LLMClient với các method domain-specific. Tự động load skill files từ `.opencode/skills/`.\n\n**Method: `analyzeScript()`**\n\nPhân tích podcast script, trả về mảng visual segments.\n\n| Param | Type | Default | Mô tả |\n|-------|------|---------|-------|\n| `script` | string | required | Full script text |\n| `title` | string | required | Episode title |\n| `outline` | string | `''` | Optional outline |\n| `density` | number | `2` | Images per segment (1-5) |\n| `lang` | string | `'vi'` | Language code (vi/en) |\n\n**Return: `Array<Segment>`**\n\n```javascript\n[\n  {\n    id: 1,\n    title: 'Giới thiệu',\n    summary: 'Mở đầu về chủ đề...',\n    visualType: 'Surrealist', // Surrealist | Lineart | Comparison | Typography | Infographic\n    startTime: '00:00',\n    endTime: '02:30',\n    prompts: {\n      a: 'A surreal landscape...',\n      b: 'Close-up of...',\n      c: 'Abstract visualization...',\n      d: 'Split screen comparison...',\n      e: 'Infographic showing...'\n    },\n    editSuggestions: {\n      zoom: 'Slow zoom in',\n      context: 'Cut to speaker',\n      mood: 'Mysterious'\n    }\n  }\n]\n```\n\n**Ví dụ:**\n\n```javascript\nconst { LLMClient } = require('@andy-toolforge/footage-generation');\n\nconst llm = new LLMClient({ provider: 'gemini', apiKey: process.env.GEMINI_API_KEY });\nconst segments = await llm.analyzeScript(\n    'Xin chào các bạn, hôm nay chúng ta sẽ nói về...',\n    'Tập 1: Khởi đầu',\n    '1. Giới thiệu\\n2. Nội dung chính\\n3. Kết luận',\n    3,  // 3 images per segment\n    'vi'\n);\n\n// segments[0].prompts.a → prompt cho image đầu tiên\n```\n\n**Method: `generateCoverPrompts()`**\n\nSinh cover art prompts cho series + chapters.\n\n| Param | Type | Default | Mô tả |\n|-------|------|---------|-------|\n| `title` | string | required | Episode/series title |\n| `outline` | string | `''` | Chapter outline |\n| `lang` | string | `'vi'` | Language code |\n\n**Return:**\n\n```javascript\n{\n  seriesCover: { prompt: '...', style: '...' },\n  chapterCovers: [\n    { chapter: 1, title: 'Chương 1', prompt: '...', style: '...' },\n    // ...\n  ]\n}\n```\n\n---\n\n### ImageGenerator\n\nSpawn image/video generation từ prompts.\n\n**Constructor:** `new ImageGenerator({ outputDir })`\n\n| Param | Type | Default | Mô tả |\n|-------|------|---------|-------|\n| `outputDir` | string | required | Thư mục output |\n\n**Method: `generate()`**\n\n| Param | Type | Mô tả |\n|-------|------|-------|\n| `prompt` | string | Image generation prompt |\n| `count` | number | Số lượng ảnh (default: 1) |\n\n```javascript\nconst { ImageGenerator } = require('@andy-toolforge/footage-generation');\nconst gen = new ImageGenerator({ outputDir: './output' });\nawait gen.generate({ prompt: 'A serene mountain landscape at sunset', count: 3 });\n```\n\n---\n\n### TextOverlayer\n\nOverlay text lên ảnh (via sharp).\n\n**Method: `overlay()`**\n\n| Param | Type | Mô tả |\n|-------|------|-------|\n| `imagePath` | string | Path ảnh gốc |\n| `text` | string | Text cần overlay |\n| `outputPath` | string | Path ảnh output |\n\n```javascript\nconst { TextOverlayer } = require('@andy-toolforge/footage-generation');\nconst overlay = new TextOverlayer();\nawait overlay.overlay('input.jpg', 'Hello World', 'output.jpg');\n```\n\n---\n\n### PromptWriter\n\nQuản lý prompt templates. Load template từ thư mục `templates/` và substitute variables.\n\n```javascript\nconst { PromptWriter } = require('@andy-toolforge/footage-generation');\nconst writer = new PromptWriter();\nconst prompt = writer.buildPrompt('podcast-intro', { title: 'Tập 1', guest: 'John' });\n```\n\n---\n\n### Imagen4Generator\n\nGoogle Imagen 4 image generation với 3 model tiers, tự động routing visual style và quota tracking (25 requests/day per tier).\n\n> Yêu cầu: `GOOGLE_API_KEY` hoặc `GEMINI_API_KEY` environment variable.\n\n**Constructor:** `new Imagen4Generator(options)`\n\n| Param | Type | Default | Mô tả |\n|-------|------|---------|-------|\n| `apiKey` | string | `GOOGLE_API_KEY` | Google AI API key |\n| `aspectRatio` | string | `'16:9'` | Aspect ratio (`16:9`, `9:16`, `1:1`, `3:4`, `4:3`) |\n| `language` | string | `'vi'` | Language code |\n| `onProgress` | function | `null` | Progress callback `({current, total, name, status, file, error})` |\n| `signal` | AbortSignal | `null` | AbortController signal |\n\n**Visual Type → Model Tier routing:**\n\n| Visual Type | Model Tier | Use case |\n|-------------|-----------|----------|\n| `Typography`, `Infographic` | **Fast** (`imagen-4.0-fast-generate-001`) | Text-heavy, simple graphics |\n| `Lineart`, `Comparison` | **Generate** (`imagen-4.0-generate-001`) | Moderate illustrations |\n| `Surrealist`, `Portrait`, `Scene` | **Ultra** (`imagen-4.0-ultra-generate-001`) | Complex creative, photorealistic |\n\n```javascript\nconst { Imagen4Generator, MODEL_TIERS } = require('@andy-toolforge/footage-generation');\n\n// Generate single image\nconst gen = new Imagen4Generator();\nconst result = await gen.generateImage('A serene mountain landscape at sunset', 'Surrealist');\nfs.writeFileSync('output.png', result.imageBytes);\n// → result: { imageBytes: Buffer, model: 'imagen-4.0-ultra-generate-001', raiReason: null }\n\n// Batch generate from segments\nconst batchResult = await gen.generateBatch([\n    { name: 'intro', prompt: 'Mountain landscape', visualType: 'Surrealist' },\n    { name: 'chart', prompt: 'Bar chart showing growth', visualType: 'Infographic' },\n], './output');\n// → batchResult: { successCount, totalCount, skippedCount, results }\n\n// Check quota\nconsole.log(gen.getQuota());\n// → { 'imagen-4.0-fast-generate-001': { used: 2, limit: 25, remaining: 23 }, ... }\n```\n\n**MODEL_TIERS:**\n\n```javascript\nMODEL_TIERS.FAST     // 'imagen-4.0-fast-generate-001'\nMODEL_TIERS.GENERATE // 'imagen-4.0-generate-001'\nMODEL_TIERS.ULTRA    // 'imagen-4.0-ultra-generate-001'\n```\n\n---\n\n## Tutorial: Sản xuất Podcast Episode (A→Z)\n\n```javascript\nconst { LLMClient } = require('@andy-toolforge/footage-generation');\n\nasync function producePodcast(script, title, outline) {\n    const llm = new LLMClient({ provider: 'gemini', apiKey: process.env.GEMINI_API_KEY });\n\n    // Bước 1: Phân tích script → segments\n    console.log('🔍 Analyzing script...');\n    const segments = await llm.analyzeScript(script, title, outline, 2, 'vi');\n    console.log(`→ ${segments.length} segments detected`);\n\n    // Bước 2: Sinh cover art\n    console.log('🎨 Generating cover art...');\n    const covers = await llm.generateCoverPrompts(title, outline, 'vi');\n    console.log(`→ Series cover + ${covers.chapterCovers.length} chapter covers`);\n\n    return { segments, covers };\n}\n\n// Dùng với MCP server\nconst { createServer } = require('@andy-toolforge/mcp');\nconst server = createServer({ provider: 'gemini', apiKey });\n// Tools: analyze_script, generate_prompts, generate_mapping, suggest_cover\n// được auto-discover từ package này\n```\n\n## MCP Tools\n\nKhi dùng với [@andy-toolforge/mcp](https://npmjs.com/package/@andy-toolforge/mcp), package này cung cấp:\n\n| Tool | Description |\n|------|-------------|\n| `analyze_script` | Analyze podcast script → visual segments + prompts |\n| `generate_prompts` | Generate 5 image prompts per segment (Surrealist, Lineart, Comparison, Typography, Infographic) |\n| `generate_mapping` | Map background music + sound design per segment |\n| `suggest_cover` | Suggest cover art (series/episode/thumbnail) + generation prompt |\n\nCác tools được auto-discover khi MCP server start — không cần config thêm.\n\n## Integration với các packages khác\n\n- **+ [@andy-toolforge/seo-generation](https://npmjs.com/package/@andy-toolforge/seo-generation):** Phân tích script → sinh SEO metadata cho YouTube/TikTok\n- **+ [@andy-toolforge/content-research](https://npmjs.com/package/@andy-toolforge/content-research):** Nghiên cứu nội dung → phát triển thành script → sinh visuals\n- **+ [@andy-toolforge/mcp](https://npmjs.com/package/@andy-toolforge/mcp):** Expose tools qua MCP protocol cho AI agents\n\n## Related\n\n- [@andy-toolforge/core](https://npmjs.com/package/@andy-toolforge/core) — Nền tảng LLM client\n- [@andy-toolforge/mcp](https://npmjs.com/package/@andy-toolforge/mcp) — MCP server với plugin discovery\n- [sharp](https://sharp.pixelplumbing.com/) — Image processing library\n","readmeFilename":"README.md"}