@houtini/gemini-mcp 1.4.5 โ†’ 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +316 -834
  2. package/claude_desktop_config_example.json +1 -0
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/index.js +8 -4
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/types.d.ts +5 -0
  7. package/dist/config/types.d.ts.map +1 -1
  8. package/dist/image-viewer/image-viewer-app.html +180 -0
  9. package/dist/image-viewer/src/ui/image-viewer.html +142 -0
  10. package/dist/index-new.d.ts +3 -0
  11. package/dist/index-new.d.ts.map +1 -0
  12. package/dist/index-new.js +7 -0
  13. package/dist/index-new.js.map +1 -0
  14. package/dist/index.d.ts +3 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +70 -172
  17. package/dist/index.js.map +1 -1
  18. package/dist/landing-page-viewer/src/ui/landing-page-viewer.html +147 -0
  19. package/dist/services/gemini/export.d.ts +5 -0
  20. package/dist/services/gemini/export.d.ts.map +1 -0
  21. package/dist/services/gemini/export.js +5 -0
  22. package/dist/services/gemini/export.js.map +1 -0
  23. package/dist/services/gemini/image-service.d.ts +45 -0
  24. package/dist/services/gemini/image-service.d.ts.map +1 -0
  25. package/dist/services/gemini/image-service.js +248 -0
  26. package/dist/services/gemini/image-service.js.map +1 -0
  27. package/dist/services/gemini/index.d.ts +7 -2
  28. package/dist/services/gemini/index.d.ts.map +1 -1
  29. package/dist/services/gemini/index.js +132 -56
  30. package/dist/services/gemini/index.js.map +1 -1
  31. package/dist/services/gemini/types.d.ts +32 -0
  32. package/dist/services/gemini/types.d.ts.map +1 -1
  33. package/dist/services/gemini/video-service.d.ts +58 -0
  34. package/dist/services/gemini/video-service.d.ts.map +1 -0
  35. package/dist/services/gemini/video-service.js +325 -0
  36. package/dist/services/gemini/video-service.js.map +1 -0
  37. package/dist/services/media-server.d.ts +28 -0
  38. package/dist/services/media-server.d.ts.map +1 -0
  39. package/dist/services/media-server.js +195 -0
  40. package/dist/services/media-server.js.map +1 -0
  41. package/dist/svg-viewer/src/ui/svg-viewer.html +138 -0
  42. package/dist/tools/gemini-chat.d.ts.map +1 -1
  43. package/dist/tools/gemini-chat.js +7 -1
  44. package/dist/tools/gemini-chat.js.map +1 -1
  45. package/dist/tools/gemini-deep-research.d.ts +1 -2
  46. package/dist/tools/gemini-deep-research.d.ts.map +1 -1
  47. package/dist/tools/gemini-deep-research.js +12 -52
  48. package/dist/tools/gemini-deep-research.js.map +1 -1
  49. package/dist/tools/gemini-help.d.ts +3 -0
  50. package/dist/tools/gemini-help.d.ts.map +1 -0
  51. package/dist/tools/gemini-help.js +534 -0
  52. package/dist/tools/gemini-help.js.map +1 -0
  53. package/dist/tools/gemini-prompt-assistant.d.ts +20 -0
  54. package/dist/tools/gemini-prompt-assistant.d.ts.map +1 -0
  55. package/dist/tools/gemini-prompt-assistant.js +129 -0
  56. package/dist/tools/gemini-prompt-assistant.js.map +1 -0
  57. package/dist/tools/generate-landing-page.d.ts +15 -0
  58. package/dist/tools/generate-landing-page.d.ts.map +1 -0
  59. package/dist/tools/generate-landing-page.js +66 -0
  60. package/dist/tools/generate-landing-page.js.map +1 -0
  61. package/dist/tools/generate-svg.d.ts +14 -0
  62. package/dist/tools/generate-svg.d.ts.map +1 -0
  63. package/dist/tools/generate-svg.js +106 -0
  64. package/dist/tools/generate-svg.js.map +1 -0
  65. package/dist/tools/generate-video.d.ts +24 -0
  66. package/dist/tools/generate-video.d.ts.map +1 -0
  67. package/dist/tools/generate-video.js +163 -0
  68. package/dist/tools/generate-video.js.map +1 -0
  69. package/dist/tools/image-prompt-assistant.d.ts +3 -0
  70. package/dist/tools/image-prompt-assistant.d.ts.map +1 -0
  71. package/dist/tools/image-prompt-assistant.js +790 -0
  72. package/dist/tools/image-prompt-assistant.js.map +1 -0
  73. package/dist/tools/load-image-from-path.d.ts +11 -0
  74. package/dist/tools/load-image-from-path.d.ts.map +1 -0
  75. package/dist/tools/load-image-from-path.js +100 -0
  76. package/dist/tools/load-image-from-path.js.map +1 -0
  77. package/dist/tools/prompt-library/charts.d.ts +325 -0
  78. package/dist/tools/prompt-library/charts.d.ts.map +1 -0
  79. package/dist/tools/prompt-library/charts.js +384 -0
  80. package/dist/tools/prompt-library/charts.js.map +1 -0
  81. package/dist/tools/prompt-library/index.d.ts +8 -0
  82. package/dist/tools/prompt-library/index.d.ts.map +1 -0
  83. package/dist/tools/prompt-library/index.js +10 -0
  84. package/dist/tools/prompt-library/index.js.map +1 -0
  85. package/dist/tools/register-analyze-image.d.ts +3 -0
  86. package/dist/tools/register-analyze-image.d.ts.map +1 -0
  87. package/dist/tools/register-analyze-image.js +67 -0
  88. package/dist/tools/register-analyze-image.js.map +1 -0
  89. package/dist/tools/register-chat.d.ts +3 -0
  90. package/dist/tools/register-chat.d.ts.map +1 -0
  91. package/dist/tools/register-chat.js +71 -0
  92. package/dist/tools/register-chat.js.map +1 -0
  93. package/dist/tools/register-deep-research.d.ts +3 -0
  94. package/dist/tools/register-deep-research.d.ts.map +1 -0
  95. package/dist/tools/register-deep-research.js +59 -0
  96. package/dist/tools/register-deep-research.js.map +1 -0
  97. package/dist/tools/register-describe-image.d.ts +3 -0
  98. package/dist/tools/register-describe-image.d.ts.map +1 -0
  99. package/dist/tools/register-describe-image.js +59 -0
  100. package/dist/tools/register-describe-image.js.map +1 -0
  101. package/dist/tools/register-image-gen.d.ts +3 -0
  102. package/dist/tools/register-image-gen.d.ts.map +1 -0
  103. package/dist/tools/register-image-gen.js +235 -0
  104. package/dist/tools/register-image-gen.js.map +1 -0
  105. package/dist/tools/register-landing-page.d.ts +3 -0
  106. package/dist/tools/register-landing-page.d.ts.map +1 -0
  107. package/dist/tools/register-landing-page.js +79 -0
  108. package/dist/tools/register-landing-page.js.map +1 -0
  109. package/dist/tools/register-list-models.d.ts +3 -0
  110. package/dist/tools/register-list-models.d.ts.map +1 -0
  111. package/dist/tools/register-list-models.js +33 -0
  112. package/dist/tools/register-list-models.js.map +1 -0
  113. package/dist/tools/register-load-image.d.ts +3 -0
  114. package/dist/tools/register-load-image.d.ts.map +1 -0
  115. package/dist/tools/register-load-image.js +66 -0
  116. package/dist/tools/register-load-image.js.map +1 -0
  117. package/dist/tools/register-svg.d.ts +3 -0
  118. package/dist/tools/register-svg.d.ts.map +1 -0
  119. package/dist/tools/register-svg.js +84 -0
  120. package/dist/tools/register-svg.js.map +1 -0
  121. package/dist/tools/register-video.d.ts +3 -0
  122. package/dist/tools/register-video.d.ts.map +1 -0
  123. package/dist/tools/register-video.js +118 -0
  124. package/dist/tools/register-video.js.map +1 -0
  125. package/dist/tools/register-viewers.d.ts +8 -0
  126. package/dist/tools/register-viewers.d.ts.map +1 -0
  127. package/dist/tools/register-viewers.js +89 -0
  128. package/dist/tools/register-viewers.js.map +1 -0
  129. package/dist/tools/schemas.d.ts +33 -0
  130. package/dist/tools/schemas.d.ts.map +1 -0
  131. package/dist/tools/schemas.js +39 -0
  132. package/dist/tools/schemas.js.map +1 -0
  133. package/dist/tools/types.d.ts +12 -0
  134. package/dist/tools/types.d.ts.map +1 -0
  135. package/dist/tools/types.js +2 -0
  136. package/dist/tools/types.js.map +1 -0
  137. package/dist/ui/image-viewer.d.ts +2 -0
  138. package/dist/ui/image-viewer.d.ts.map +1 -0
  139. package/dist/ui/image-viewer.js +42 -0
  140. package/dist/ui/image-viewer.js.map +1 -0
  141. package/dist/utils/chart-design-system.d.ts +92 -0
  142. package/dist/utils/chart-design-system.d.ts.map +1 -0
  143. package/dist/utils/chart-design-system.js +235 -0
  144. package/dist/utils/chart-design-system.js.map +1 -0
  145. package/dist/utils/image-compress.d.ts +9 -0
  146. package/dist/utils/image-compress.d.ts.map +1 -0
  147. package/dist/utils/image-compress.js +43 -0
  148. package/dist/utils/image-compress.js.map +1 -0
  149. package/dist/utils/image-utils.d.ts +9 -0
  150. package/dist/utils/image-utils.d.ts.map +1 -0
  151. package/dist/utils/image-utils.js +257 -0
  152. package/dist/utils/image-utils.js.map +1 -0
  153. package/dist/utils/resolve-images.d.ts +29 -0
  154. package/dist/utils/resolve-images.d.ts.map +1 -0
  155. package/dist/utils/resolve-images.js +56 -0
  156. package/dist/utils/resolve-images.js.map +1 -0
  157. package/dist/utils/tool-wrapper.d.ts +13 -0
  158. package/dist/utils/tool-wrapper.d.ts.map +1 -0
  159. package/dist/utils/tool-wrapper.js +22 -0
  160. package/dist/utils/tool-wrapper.js.map +1 -0
  161. package/dist/utils/video-utils.d.ts +16 -0
  162. package/dist/utils/video-utils.d.ts.map +1 -0
  163. package/dist/utils/video-utils.js +319 -0
  164. package/dist/utils/video-utils.js.map +1 -0
  165. package/dist/video-viewer/src/ui/video-viewer.html +137 -0
  166. package/package.json +21 -7
  167. package/server.json +30 -29
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-images.js","sourceRoot":"","sources":["../../src/utils/resolve-images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;CACpB,CAAC;AAoBF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAiB;IACvD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,eAAe,EAAE,KAAK,CAAC,eAAe;SACvC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,6BAA6B,GAAG,gBAAgB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE;YACzD,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;SACzC,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC/B,QAAQ;YACR,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,eAAe,EAAE,KAAK,CAAC,eAAe;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,gEAAgE;QAChE,+DAA+D,CAChE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAoB;IAC3D,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function fileLink(absolutePath: string): string;
2
+ export declare function savedFileMessage(label: string, absolutePath: string): string;
3
+ export declare function toolError(toolName: string, error: unknown): {
4
+ content: {
5
+ type: "text";
6
+ text: string;
7
+ }[];
8
+ structuredContent: {
9
+ content: string;
10
+ success: boolean;
11
+ };
12
+ };
13
+ //# sourceMappingURL=tool-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-wrapper.d.ts","sourceRoot":"","sources":["../../src/utils/tool-wrapper.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;;;;;;;;;EAWzD"}
@@ -0,0 +1,22 @@
1
+ import { platform } from 'os';
2
+ import logger from './logger.js';
3
+ import { McpError, createToolResult } from './error-handler.js';
4
+ const IS_WINDOWS = platform() === 'win32';
5
+ export function fileLink(absolutePath) {
6
+ const normalized = absolutePath.replace(/\\/g, '/');
7
+ return IS_WINDOWS ? `file:///${normalized}` : `file://${normalized}`;
8
+ }
9
+ export function savedFileMessage(label, absolutePath) {
10
+ return `${label}: ${absolutePath}\n Open: ${fileLink(absolutePath)}`;
11
+ }
12
+ export function toolError(toolName, error) {
13
+ logger.error(`${toolName} failed`, { error });
14
+ const msg = error instanceof McpError
15
+ ? error.message
16
+ : `${toolName} failed: ${error.message}`;
17
+ return {
18
+ content: createToolResult(false, msg, error),
19
+ structuredContent: { content: msg, success: false },
20
+ };
21
+ }
22
+ //# sourceMappingURL=tool-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-wrapper.js","sourceRoot":"","sources":["../../src/utils/tool-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,UAAU,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC;AAE1C,MAAM,UAAU,QAAQ,CAAC,YAAoB;IAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,UAAU,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,YAAoB;IAClE,OAAO,GAAG,KAAK,KAAK,YAAY,aAAa,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,KAAc;IACxD,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,KAAK,YAAY,QAAQ;QACnC,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC,GAAG,QAAQ,YAAa,KAAe,CAAC,OAAO,EAAE,CAAC;IAEtD,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAc,CAAC;QACrD,iBAAiB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ThumbnailOptions {
2
+ videoPath: string;
3
+ outputPath?: string;
4
+ timeSeconds?: number;
5
+ width?: number;
6
+ height?: number;
7
+ }
8
+ export declare function extractThumbnail(options: ThumbnailOptions): Promise<string | undefined>;
9
+ export declare function generateVideoPlayerHTML(videoPath: string, thumbnailPath?: string, metadata?: {
10
+ prompt?: string;
11
+ duration?: number;
12
+ resolution?: string;
13
+ aspectRatio?: string;
14
+ }): string;
15
+ export declare function saveVideoPlayerHTML(htmlContent: string, outputPath?: string): Promise<string>;
16
+ //# sourceMappingURL=video-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-utils.d.ts","sourceRoot":"","sources":["../../src/utils/video-utils.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmD7F;AAgBD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,MAAM,CAoQR;AAED,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
@@ -0,0 +1,319 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { spawn } from 'child_process';
4
+ import logger from './logger.js';
5
+ export async function extractThumbnail(options) {
6
+ const { videoPath, outputPath, timeSeconds = 1, width = 640, height = 360 } = options;
7
+ const hasFFmpeg = await checkFFmpegAvailable();
8
+ if (!hasFFmpeg) {
9
+ logger.warn('ffmpeg not found in PATH - thumbnail extraction skipped');
10
+ return undefined;
11
+ }
12
+ const thumbnailPath = outputPath ||
13
+ videoPath.replace(/\.(mp4|webm)$/, '-thumbnail.jpg');
14
+ return new Promise((resolve, reject) => {
15
+ const ffmpegArgs = [
16
+ '-i', videoPath,
17
+ '-ss', timeSeconds.toString(),
18
+ '-vframes', '1',
19
+ '-vf', `scale=${width}:${height}`,
20
+ '-y',
21
+ thumbnailPath
22
+ ];
23
+ const ffmpeg = spawn('ffmpeg', ffmpegArgs);
24
+ let stderr = '';
25
+ ffmpeg.stderr.on('data', (data) => {
26
+ stderr += data.toString();
27
+ });
28
+ ffmpeg.on('close', (code) => {
29
+ if (code === 0) {
30
+ resolve(thumbnailPath);
31
+ }
32
+ else {
33
+ logger.warn('ffmpeg thumbnail extraction failed', { stderr });
34
+ resolve(undefined);
35
+ }
36
+ });
37
+ ffmpeg.on('error', (error) => {
38
+ logger.warn('ffmpeg spawn error', { error: error.message });
39
+ resolve(undefined);
40
+ });
41
+ });
42
+ }
43
+ async function checkFFmpegAvailable() {
44
+ return new Promise((resolve) => {
45
+ const ffmpeg = spawn('ffmpeg', ['-version']);
46
+ ffmpeg.on('close', (code) => {
47
+ resolve(code === 0);
48
+ });
49
+ ffmpeg.on('error', () => {
50
+ resolve(false);
51
+ });
52
+ });
53
+ }
54
+ export function generateVideoPlayerHTML(videoPath, thumbnailPath, metadata) {
55
+ const videoName = path.basename(videoPath);
56
+ const videoUrl = `file:///${videoPath.replace(/\\/g, '/')}`;
57
+ const thumbnailUrl = thumbnailPath
58
+ ? `file:///${thumbnailPath.replace(/\\/g, '/')}`
59
+ : undefined;
60
+ return `<!DOCTYPE html>
61
+ <html lang="en">
62
+ <head>
63
+ <meta charset="UTF-8">
64
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
65
+ <title>Veo 3.1 Video - ${videoName}</title>
66
+ <style>
67
+ * {
68
+ margin: 0;
69
+ padding: 0;
70
+ box-sizing: border-box;
71
+ }
72
+
73
+ body {
74
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
75
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
76
+ color: #e0e0e0;
77
+ min-height: 100vh;
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ padding: 20px;
82
+ }
83
+
84
+ .container {
85
+ max-width: 1200px;
86
+ width: 100%;
87
+ }
88
+
89
+ .header {
90
+ text-align: center;
91
+ margin-bottom: 30px;
92
+ }
93
+
94
+ .header h1 {
95
+ font-size: 2.5em;
96
+ font-weight: 700;
97
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
98
+ -webkit-background-clip: text;
99
+ -webkit-text-fill-color: transparent;
100
+ margin-bottom: 10px;
101
+ }
102
+
103
+ .header p {
104
+ color: #a0a0a0;
105
+ font-size: 1.1em;
106
+ }
107
+
108
+ .video-wrapper {
109
+ background: #2a2a3e;
110
+ border-radius: 16px;
111
+ overflow: hidden;
112
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
113
+ margin-bottom: 20px;
114
+ }
115
+
116
+ video {
117
+ width: 100%;
118
+ height: auto;
119
+ display: block;
120
+ }
121
+
122
+ ${metadata ? `.metadata {
123
+ background: #2a2a3e;
124
+ border-radius: 16px;
125
+ padding: 30px;
126
+ margin-bottom: 20px;
127
+ }
128
+
129
+ .metadata h2 {
130
+ color: #667eea;
131
+ font-size: 1.3em;
132
+ margin-bottom: 15px;
133
+ }
134
+
135
+ .metadata-grid {
136
+ display: grid;
137
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
138
+ gap: 20px;
139
+ margin-top: 20px;
140
+ }
141
+
142
+ .metadata-item {
143
+ background: #1a1a2e;
144
+ padding: 15px;
145
+ border-radius: 8px;
146
+ border-left: 3px solid #667eea;
147
+ }
148
+
149
+ .metadata-label {
150
+ color: #a0a0a0;
151
+ font-size: 0.9em;
152
+ text-transform: uppercase;
153
+ letter-spacing: 1px;
154
+ margin-bottom: 5px;
155
+ }
156
+
157
+ .metadata-value {
158
+ color: #e0e0e0;
159
+ font-size: 1.1em;
160
+ font-weight: 600;
161
+ }
162
+
163
+ .prompt-box {
164
+ background: #1a1a2e;
165
+ padding: 20px;
166
+ border-radius: 8px;
167
+ border-left: 3px solid #764ba2;
168
+ margin-top: 20px;
169
+ }
170
+
171
+ .prompt-box .metadata-label {
172
+ border-left-color: #764ba2;
173
+ }
174
+
175
+ .prompt-text {
176
+ color: #e0e0e0;
177
+ font-size: 1em;
178
+ line-height: 1.6;
179
+ font-style: italic;
180
+ }` : ''}
181
+
182
+ .controls {
183
+ background: #2a2a3e;
184
+ border-radius: 16px;
185
+ padding: 20px;
186
+ display: flex;
187
+ gap: 15px;
188
+ flex-wrap: wrap;
189
+ justify-content: center;
190
+ }
191
+
192
+ .btn {
193
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
194
+ color: white;
195
+ border: none;
196
+ padding: 12px 24px;
197
+ border-radius: 8px;
198
+ font-size: 1em;
199
+ font-weight: 600;
200
+ cursor: pointer;
201
+ transition: transform 0.2s, box-shadow 0.2s;
202
+ text-decoration: none;
203
+ display: inline-block;
204
+ }
205
+
206
+ .btn:hover {
207
+ transform: translateY(-2px);
208
+ box-shadow: 0 10px 30px rgba(102, 126, 234, 0.4);
209
+ }
210
+
211
+ .btn:active {
212
+ transform: translateY(0);
213
+ }
214
+
215
+ .footer {
216
+ text-align: center;
217
+ margin-top: 30px;
218
+ color: #a0a0a0;
219
+ font-size: 0.9em;
220
+ }
221
+
222
+ @media (max-width: 768px) {
223
+ .header h1 {
224
+ font-size: 2em;
225
+ }
226
+
227
+ .metadata-grid {
228
+ grid-template-columns: 1fr;
229
+ }
230
+ }
231
+ </style>
232
+ </head>
233
+ <body>
234
+ <div class="container">
235
+ <div class="header">
236
+ <h1>๐ŸŽฌ Veo 3.1 Video Generation</h1>
237
+ <p>Google's latest AI video generation model</p>
238
+ </div>
239
+
240
+ <div class="video-wrapper">
241
+ <video controls ${thumbnailUrl ? `poster="${thumbnailUrl}"` : ''} preload="metadata">
242
+ <source src="${videoUrl}" type="video/mp4">
243
+ Your browser does not support the video tag.
244
+ </video>
245
+ </div>
246
+
247
+ ${metadata ? `<div class="metadata">
248
+ <h2>Generation Details</h2>
249
+
250
+ ${metadata.prompt ? `<div class="prompt-box">
251
+ <div class="metadata-label">Prompt</div>
252
+ <div class="prompt-text">"${metadata.prompt}"</div>
253
+ </div>` : ''}
254
+
255
+ <div class="metadata-grid">
256
+ ${metadata.duration ? `<div class="metadata-item">
257
+ <div class="metadata-label">Duration</div>
258
+ <div class="metadata-value">${metadata.duration} seconds</div>
259
+ </div>` : ''}
260
+
261
+ ${metadata.resolution ? `<div class="metadata-item">
262
+ <div class="metadata-label">Resolution</div>
263
+ <div class="metadata-value">${metadata.resolution}</div>
264
+ </div>` : ''}
265
+
266
+ ${metadata.aspectRatio ? `<div class="metadata-item">
267
+ <div class="metadata-label">Aspect Ratio</div>
268
+ <div class="metadata-value">${metadata.aspectRatio}</div>
269
+ </div>` : ''}
270
+
271
+ <div class="metadata-item">
272
+ <div class="metadata-label">Model</div>
273
+ <div class="metadata-value">Veo 3.1</div>
274
+ </div>
275
+ </div>
276
+ </div>` : ''}
277
+
278
+ <div class="controls">
279
+ <a href="${videoUrl}" class="btn" download="${videoName}">๐Ÿ“ฅ Download Video</a>
280
+ ${thumbnailUrl ? `<a href="${thumbnailUrl}" class="btn" download="${path.basename(thumbnailPath)}">๐Ÿ–ผ๏ธ Download Thumbnail</a>` : ''}
281
+ </div>
282
+
283
+ <div class="footer">
284
+ <p>Generated with Google Gemini MCP ยท Veo 3.1 Preview</p>
285
+ <p>Video saved to: ${videoPath}</p>
286
+ </div>
287
+ </div>
288
+
289
+ <script>
290
+ const video = document.querySelector('video');
291
+
292
+ video.addEventListener('loadedmetadata', () => {
293
+ console.log('Video metadata loaded:', {
294
+ duration: video.duration,
295
+ width: video.videoWidth,
296
+ height: video.videoHeight
297
+ });
298
+ });
299
+
300
+ document.addEventListener('keydown', (e) => {
301
+ if (e.code === 'Space') {
302
+ e.preventDefault();
303
+ if (video.paused) {
304
+ video.play();
305
+ } else {
306
+ video.pause();
307
+ }
308
+ }
309
+ });
310
+ </script>
311
+ </body>
312
+ </html>`;
313
+ }
314
+ export async function saveVideoPlayerHTML(htmlContent, outputPath) {
315
+ const filePath = outputPath || `video-player-${Date.now()}.html`;
316
+ await fs.writeFile(filePath, htmlContent, 'utf-8');
317
+ return path.resolve(filePath);
318
+ }
319
+ //# sourceMappingURL=video-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-utils.js","sourceRoot":"","sources":["../../src/utils/video-utils.ts"],"names":[],"mappings":"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"}