@gannochenko/staticstripes 0.0.12 → 0.0.15

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 (111) hide show
  1. package/Makefile +20 -0
  2. package/dist/asset-manager.d.ts +1 -0
  3. package/dist/asset-manager.d.ts.map +1 -1
  4. package/dist/asset-manager.js +3 -0
  5. package/dist/asset-manager.js.map +1 -1
  6. package/dist/cli/ai-generation-strategy-factory.d.ts +23 -0
  7. package/dist/cli/ai-generation-strategy-factory.d.ts.map +1 -0
  8. package/dist/cli/ai-generation-strategy-factory.js +44 -0
  9. package/dist/cli/ai-generation-strategy-factory.js.map +1 -0
  10. package/dist/cli/ai-generation-strategy.d.ts +33 -0
  11. package/dist/cli/ai-generation-strategy.d.ts.map +1 -0
  12. package/dist/cli/ai-generation-strategy.js +3 -0
  13. package/dist/cli/ai-generation-strategy.js.map +1 -0
  14. package/dist/cli/ai-music-api-ai/ai-music-api-ai-generation-strategy.d.ts +38 -0
  15. package/dist/cli/ai-music-api-ai/ai-music-api-ai-generation-strategy.d.ts.map +1 -0
  16. package/dist/cli/ai-music-api-ai/ai-music-api-ai-generation-strategy.js +174 -0
  17. package/dist/cli/ai-music-api-ai/ai-music-api-ai-generation-strategy.js.map +1 -0
  18. package/dist/cli/auth-strategy-factory.d.ts +31 -0
  19. package/dist/cli/auth-strategy-factory.d.ts.map +1 -0
  20. package/dist/cli/auth-strategy-factory.js +61 -0
  21. package/dist/cli/auth-strategy-factory.js.map +1 -0
  22. package/dist/cli/auth-strategy.d.ts +31 -0
  23. package/dist/cli/auth-strategy.d.ts.map +1 -0
  24. package/dist/cli/auth-strategy.js +3 -0
  25. package/dist/cli/auth-strategy.js.map +1 -0
  26. package/dist/cli/commands/auth.d.ts +6 -0
  27. package/dist/cli/commands/auth.d.ts.map +1 -0
  28. package/dist/cli/commands/auth.js +103 -0
  29. package/dist/cli/commands/auth.js.map +1 -0
  30. package/dist/cli/commands/generate.d.ts.map +1 -1
  31. package/dist/cli/commands/generate.js +69 -2
  32. package/dist/cli/commands/generate.js.map +1 -1
  33. package/dist/cli/instagram/instagram-auth-strategy.d.ts +31 -0
  34. package/dist/cli/instagram/instagram-auth-strategy.d.ts.map +1 -0
  35. package/dist/cli/instagram/instagram-auth-strategy.js +505 -0
  36. package/dist/cli/instagram/instagram-auth-strategy.js.map +1 -0
  37. package/dist/cli/instagram/instagram-upload-strategy.d.ts +45 -0
  38. package/dist/cli/instagram/instagram-upload-strategy.d.ts.map +1 -0
  39. package/dist/cli/instagram/instagram-upload-strategy.js +303 -0
  40. package/dist/cli/instagram/instagram-upload-strategy.js.map +1 -0
  41. package/dist/cli/s3/s3-upload-strategy.d.ts.map +1 -1
  42. package/dist/cli/s3/s3-upload-strategy.js +7 -3
  43. package/dist/cli/s3/s3-upload-strategy.js.map +1 -1
  44. package/dist/cli/upload-strategy-factory.d.ts +1 -1
  45. package/dist/cli/upload-strategy-factory.d.ts.map +1 -1
  46. package/dist/cli/upload-strategy-factory.js +5 -5
  47. package/dist/cli/upload-strategy-factory.js.map +1 -1
  48. package/dist/cli/youtube/youtube-auth-strategy.d.ts +11 -0
  49. package/dist/cli/youtube/youtube-auth-strategy.d.ts.map +1 -0
  50. package/dist/cli/youtube/youtube-auth-strategy.js +320 -0
  51. package/dist/cli/youtube/youtube-auth-strategy.js.map +1 -0
  52. package/dist/cli/youtube/youtube-upload-strategy.d.ts +10 -3
  53. package/dist/cli/youtube/youtube-upload-strategy.d.ts.map +1 -1
  54. package/dist/cli/youtube/youtube-upload-strategy.js +96 -16
  55. package/dist/cli/youtube/youtube-upload-strategy.js.map +1 -1
  56. package/dist/cli.js +2 -3
  57. package/dist/cli.js.map +1 -1
  58. package/dist/html-project-parser.d.ts +40 -1
  59. package/dist/html-project-parser.d.ts.map +1 -1
  60. package/dist/html-project-parser.js +343 -9
  61. package/dist/html-project-parser.js.map +1 -1
  62. package/dist/lib/file.d.ts +2 -0
  63. package/dist/lib/file.d.ts.map +1 -0
  64. package/dist/lib/file.js +13 -0
  65. package/dist/lib/file.js.map +1 -0
  66. package/dist/lib/net.d.ts +19 -0
  67. package/dist/lib/net.d.ts.map +1 -0
  68. package/dist/lib/net.js +101 -0
  69. package/dist/lib/net.js.map +1 -0
  70. package/dist/project.d.ts +5 -2
  71. package/dist/project.d.ts.map +1 -1
  72. package/dist/project.js +9 -1
  73. package/dist/project.js.map +1 -1
  74. package/dist/type.d.ts +17 -0
  75. package/dist/type.d.ts.map +1 -1
  76. package/package.json +2 -1
  77. package/src/asset-manager.ts +4 -0
  78. package/src/cli/ai-generation-strategy-factory.ts +48 -0
  79. package/src/cli/ai-generation-strategy.ts +35 -0
  80. package/src/cli/ai-music-api-ai/ai-music-api-ai-generation-strategy.ts +266 -0
  81. package/src/cli/auth-strategy-factory.ts +67 -0
  82. package/src/cli/auth-strategy.ts +37 -0
  83. package/src/cli/commands/auth.ts +120 -0
  84. package/src/cli/commands/generate.ts +55 -2
  85. package/src/cli/instagram/instagram-auth-strategy.ts +569 -0
  86. package/src/cli/instagram/instagram-upload-strategy.ts +398 -0
  87. package/src/cli/s3/s3-upload-strategy.ts +7 -3
  88. package/src/cli/upload-strategy-factory.ts +6 -9
  89. package/src/cli/youtube/youtube-auth-strategy.ts +323 -0
  90. package/src/cli/youtube/youtube-upload-strategy.ts +147 -16
  91. package/src/cli.ts +2 -4
  92. package/src/html-project-parser.ts +429 -8
  93. package/src/lib/file.ts +11 -0
  94. package/src/lib/net.ts +120 -0
  95. package/src/project.ts +10 -0
  96. package/src/type.ts +19 -0
  97. package/dist/cli/youtube/auth-commands.d.ts +0 -3
  98. package/dist/cli/youtube/auth-commands.d.ts.map +0 -1
  99. package/dist/cli/youtube/auth-commands.js +0 -273
  100. package/dist/cli/youtube/auth-commands.js.map +0 -1
  101. package/dist/cli/youtube/cli.d.ts +0 -7
  102. package/dist/cli/youtube/cli.d.ts.map +0 -1
  103. package/dist/cli/youtube/cli.js +0 -13
  104. package/dist/cli/youtube/cli.js.map +0 -1
  105. package/dist/cli/youtube/upload-handler.d.ts +0 -12
  106. package/dist/cli/youtube/upload-handler.d.ts.map +0 -1
  107. package/dist/cli/youtube/upload-handler.js +0 -66
  108. package/dist/cli/youtube/upload-handler.js.map +0 -1
  109. package/src/cli/youtube/auth-commands.ts +0 -312
  110. package/src/cli/youtube/cli.ts +0 -11
  111. package/src/cli/youtube/upload-handler.ts +0 -101
package/src/type.ts CHANGED
@@ -30,6 +30,11 @@ export type Asset = {
30
30
  rotation: number; // rotation in degrees (0, 90, 180, 270)
31
31
  hasVideo: boolean; // whether the asset has a video stream
32
32
  hasAudio: boolean; // whether the asset has an audio stream
33
+ ai?: {
34
+ integrationName: string; // References AI integration name from <ai> section
35
+ prompt: string; // Generation prompt
36
+ duration?: number; // Optional duration in seconds for generation
37
+ };
33
38
  };
34
39
 
35
40
  export type Fragment = {
@@ -99,11 +104,25 @@ export type Upload = {
99
104
  path: string; // e.g. "videos/${slug}/${output}.mp4"
100
105
  acl?: string; // e.g. "public-read", "private"
101
106
  };
107
+ // Instagram-specific configuration
108
+ instagram?: {
109
+ caption: string; // Caption/description for the Reel
110
+ shareToFeed: boolean; // Whether to share to Feed in addition to Reels tab
111
+ thumbOffset?: number; // Thumbnail frame location in milliseconds
112
+ coverUrl?: string; // Optional cover image URL
113
+ videoUrl?: string; // Public URL to video (if not auto-generated from S3)
114
+ };
102
115
  };
103
116
 
104
117
  // Legacy alias for backward compatibility
105
118
  export type YouTubeUpload = Upload;
106
119
 
120
+ export type AIProvider = {
121
+ name: string; // e.g. "music-api" - used to reference this provider in assets
122
+ tag: string; // e.g. "music-api-ai" - used to identify provider type
123
+ model?: string; // e.g. "sonic-v3-5" - optional model name
124
+ };
125
+
107
126
  export type ProjectStructure = {
108
127
  sequences: SequenceDefinition[];
109
128
  assets: Map<string, Asset>;
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerYouTubeAuthCommands(program: Command): void;
3
- //# sourceMappingURL=auth-commands.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/youtube/auth-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFpC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqOlE"}
@@ -1,273 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.registerYouTubeAuthCommands = registerYouTubeAuthCommands;
7
- const path_1 = require("path");
8
- const fs_1 = require("fs");
9
- const youtube_uploader_js_1 = require("../../youtube-uploader.js");
10
- const open_1 = __importDefault(require("open"));
11
- const http_1 = __importDefault(require("http"));
12
- const url_1 = require("url");
13
- function getOAuthInstructions() {
14
- let instructions = '';
15
- instructions +=
16
- 'āŒ Error: STATICSTRIPES_GOOGLE_CLIENT_ID and STATICSTRIPES_GOOGLE_CLIENT_SECRET environment variables are not set\n\n';
17
- instructions += 'šŸ“‹ Getting Google OAuth Credentials:\n\n';
18
- instructions += '1. Go to Google Cloud Console:\n';
19
- instructions += ' https://console.cloud.google.com/\n\n';
20
- instructions += '2. Create or select a project\n\n';
21
- instructions += '3. Enable YouTube Data API v3:\n';
22
- instructions += ' - Go to "APIs & Services" > "Library"\n';
23
- instructions += ' - Search for "YouTube Data API v3"\n';
24
- instructions += ' - Click "Enable"\n\n';
25
- instructions += '4. Configure OAuth Consent Screen:\n';
26
- instructions += ' - Go to "APIs & Services" > "OAuth consent screen"\n';
27
- instructions += ' - Choose "External" user type\n';
28
- instructions += ' - Fill in app name and contact emails\n';
29
- instructions +=
30
- ' - Add scope: https://www.googleapis.com/auth/youtube.upload\n';
31
- instructions += ' - Add your email as a test user\n\n';
32
- instructions += '5. Create OAuth 2.0 Credentials:\n';
33
- instructions += ' - Go to "APIs & Services" > "Credentials"\n';
34
- instructions += ' - Click "Create Credentials" > "OAuth client ID"\n';
35
- instructions += ' - Choose "Web application"\n';
36
- instructions +=
37
- ' - Add redirect URI: http://localhost:3000/oauth2callback\n';
38
- instructions += ' - Click "Create"\n\n';
39
- instructions += '6. Copy your Client ID and Client Secret\n\n';
40
- instructions += '7. Publish your OAuth app (IMPORTANT):\n';
41
- instructions +=
42
- ' - Go to "APIs & Services" > "OAuth consent screen"\n';
43
- instructions += ' - Click "PUBLISH APP" button\n';
44
- instructions +=
45
- ' - This makes refresh tokens permanent (otherwise they expire in 7 days)\n';
46
- instructions +=
47
- ' - Note: For personal use, you don\'t need Google verification\n\n';
48
- instructions += '8. Set environment variables:\n\n';
49
- // Platform-specific instructions
50
- const platform = process.platform;
51
- if (platform === 'win32') {
52
- instructions += ' PowerShell (Recommended) - Run as Administrator:\n';
53
- instructions +=
54
- ' [System.Environment]::SetEnvironmentVariable("STATICSTRIPES_GOOGLE_CLIENT_ID", "your-client-id.apps.googleusercontent.com", "User")\n';
55
- instructions +=
56
- ' [System.Environment]::SetEnvironmentVariable("STATICSTRIPES_GOOGLE_CLIENT_SECRET", "your-client-secret", "User")\n';
57
- instructions += ' Then restart your terminal\n\n';
58
- instructions += ' Or Command Prompt - Run as Administrator:\n';
59
- instructions +=
60
- ' setx STATICSTRIPES_GOOGLE_CLIENT_ID "your-client-id.apps.googleusercontent.com"\n';
61
- instructions +=
62
- ' setx STATICSTRIPES_GOOGLE_CLIENT_SECRET "your-client-secret"\n';
63
- instructions += ' Then restart your terminal\n\n';
64
- }
65
- else if (platform === 'darwin') {
66
- instructions += ' Add to ~/.zshrc (or ~/.bash_profile for bash):\n';
67
- instructions +=
68
- ' export STATICSTRIPES_GOOGLE_CLIENT_ID="your-client-id.apps.googleusercontent.com"\n';
69
- instructions +=
70
- ' export STATICSTRIPES_GOOGLE_CLIENT_SECRET="your-client-secret"\n\n';
71
- instructions += ' Then reload your shell:\n';
72
- instructions += ' source ~/.zshrc\n\n';
73
- }
74
- else {
75
- // Linux and others
76
- instructions += ' Add to ~/.bashrc (or ~/.zshrc for zsh):\n';
77
- instructions +=
78
- ' export STATICSTRIPES_GOOGLE_CLIENT_ID="your-client-id.apps.googleusercontent.com"\n';
79
- instructions +=
80
- ' export STATICSTRIPES_GOOGLE_CLIENT_SECRET="your-client-secret"\n\n';
81
- instructions += ' Then reload your shell:\n';
82
- instructions += ' source ~/.bashrc # or source ~/.zshrc\n\n';
83
- }
84
- return instructions;
85
- }
86
- function registerYouTubeAuthCommands(program) {
87
- program
88
- .command('auth')
89
- .description('Authenticate with YouTube for uploading')
90
- .option('-p, --project <path>', 'Path to project directory', '.')
91
- .requiredOption('--upload-name <name>', 'Name of the upload configuration')
92
- .action(async (options) => {
93
- try {
94
- // Get OAuth credentials from environment variables
95
- const clientId = process.env.STATICSTRIPES_GOOGLE_CLIENT_ID;
96
- const clientSecret = process.env.STATICSTRIPES_GOOGLE_CLIENT_SECRET;
97
- if (!clientId || !clientSecret) {
98
- console.error(getOAuthInstructions());
99
- process.exit(1);
100
- }
101
- // Resolve project path
102
- const projectPath = (0, path_1.resolve)(process.cwd(), options.project);
103
- const projectFilePath = (0, path_1.resolve)(projectPath, 'project.html');
104
- // Validate project.html exists
105
- if (!(0, fs_1.existsSync)(projectFilePath)) {
106
- console.error(`Error: project.html not found in ${projectPath}`);
107
- process.exit(1);
108
- }
109
- console.log(`šŸ“ Project: ${projectPath}`);
110
- console.log(`šŸ” Authenticating: ${options.uploadName}\n`);
111
- // Create uploader instance
112
- const uploader = new youtube_uploader_js_1.YouTubeUploader(clientId, clientSecret);
113
- // Get authorization URL
114
- const authUrl = uploader.getAuthUrl();
115
- console.log('🌐 Starting local server on http://localhost:3000...\n');
116
- // Create a promise that resolves when we get the OAuth callback
117
- const authPromise = new Promise((resolve, reject) => {
118
- // Track all connections to force-close them
119
- const connections = new Set();
120
- const server = http_1.default.createServer((req, res) => {
121
- const url = (0, url_1.parse)(req.url || '', true);
122
- if (url.pathname === '/oauth2callback') {
123
- const code = url.query.code;
124
- const error = url.query.error;
125
- const closeServer = () => {
126
- // Destroy all connections
127
- connections.forEach((socket) => {
128
- socket.destroy();
129
- });
130
- connections.clear();
131
- server.close();
132
- };
133
- if (error) {
134
- res.writeHead(200, { 'Content-Type': 'text/html' });
135
- res.end(`
136
- <html>
137
- <body style="font-family: system-ui; padding: 40px; text-align: center;">
138
- <h1>āŒ Authorization Failed</h1>
139
- <p>Error: ${error}</p>
140
- <p>You can close this window.</p>
141
- </body>
142
- </html>
143
- `);
144
- res.on('finish', closeServer);
145
- reject(new Error(`Authorization failed: ${error}`));
146
- return;
147
- }
148
- if (code) {
149
- res.writeHead(200, { 'Content-Type': 'text/html' });
150
- res.end(`
151
- <html>
152
- <body style="font-family: system-ui; padding: 40px; text-align: center;">
153
- <h1>āœ… Authorization Successful!</h1>
154
- <p>You can close this window and return to the terminal.</p>
155
- </body>
156
- </html>
157
- `);
158
- res.on('finish', closeServer);
159
- resolve(code);
160
- }
161
- else {
162
- res.writeHead(400, { 'Content-Type': 'text/html' });
163
- res.end(`
164
- <html>
165
- <body style="font-family: system-ui; padding: 40px; text-align: center;">
166
- <h1>āŒ No Authorization Code</h1>
167
- <p>No code was received from Google.</p>
168
- <p>You can close this window.</p>
169
- </body>
170
- </html>
171
- `);
172
- res.on('finish', closeServer);
173
- reject(new Error('No authorization code received'));
174
- }
175
- }
176
- else {
177
- res.writeHead(404);
178
- res.end('Not found');
179
- }
180
- });
181
- // Track connections
182
- server.on('connection', (socket) => {
183
- connections.add(socket);
184
- socket.on('close', () => {
185
- connections.delete(socket);
186
- });
187
- });
188
- server.listen(3000, () => {
189
- console.log('āœ… Server started successfully\n');
190
- });
191
- // Set timeout to avoid hanging forever
192
- setTimeout(() => {
193
- connections.forEach((socket) => {
194
- socket.destroy();
195
- });
196
- connections.clear();
197
- server.close();
198
- reject(new Error('Authentication timeout (5 minutes)'));
199
- }, 5 * 60 * 1000);
200
- });
201
- console.log('🌐 Opening browser for authorization...\n');
202
- // Open browser automatically
203
- try {
204
- await (0, open_1.default)(authUrl);
205
- console.log('āœ… Browser opened successfully\n');
206
- }
207
- catch (err) {
208
- console.log('āš ļø Could not open browser automatically');
209
- console.log('🌐 Please visit this URL to authorize:\n');
210
- console.log(authUrl);
211
- console.log();
212
- }
213
- console.log('ā³ Waiting for authorization...\n');
214
- // Wait for the OAuth callback
215
- const code = await authPromise;
216
- console.log('šŸ”‘ Authorization code received\n');
217
- console.log('šŸ’¾ Saving authentication tokens...\n');
218
- // Complete authentication
219
- await uploader.authenticate(code, options.uploadName, projectPath);
220
- console.log(`āœ… Authentication complete for ${options.uploadName}!\n`);
221
- }
222
- catch (error) {
223
- console.error(`\nāŒ Authentication failed\n`);
224
- if (error.message) {
225
- console.error(`Error: ${error.message}\n`);
226
- }
227
- process.exit(1);
228
- }
229
- });
230
- program
231
- .command('auth-complete')
232
- .description('(Fallback) Complete authentication with authorization code manually')
233
- .option('-p, --project <path>', 'Path to project directory', '.')
234
- .requiredOption('--upload-name <name>', 'Name of the upload configuration')
235
- .requiredOption('--code <code>', 'Authorization code from OAuth flow')
236
- .action(async (options) => {
237
- try {
238
- const clientId = process.env.STATICSTRIPES_GOOGLE_CLIENT_ID;
239
- const clientSecret = process.env.STATICSTRIPES_GOOGLE_CLIENT_SECRET;
240
- if (!clientId || !clientSecret) {
241
- console.error('āŒ Error: STATICSTRIPES_GOOGLE_CLIENT_ID and STATICSTRIPES_GOOGLE_CLIENT_SECRET environment variables are not set');
242
- console.error('\nšŸ’” Run: staticstripes auth --help');
243
- console.error(' for complete setup instructions\n');
244
- process.exit(1);
245
- }
246
- const projectPath = (0, path_1.resolve)(process.cwd(), options.project);
247
- // Create uploader and complete authentication
248
- const uploader = new youtube_uploader_js_1.YouTubeUploader(clientId, clientSecret);
249
- await uploader.authenticate(options.code, options.uploadName, projectPath);
250
- console.log(`āœ… Authentication complete for ${options.uploadName}`);
251
- }
252
- catch (error) {
253
- console.error(`\nāŒ Authentication completion failed\n`);
254
- if (error.message) {
255
- console.error(`Error: ${error.message}\n`);
256
- }
257
- // Provide helpful guidance for common OAuth errors
258
- if (error.message === 'invalid_grant' || error.code === 400) {
259
- console.error('šŸ’” Common causes:\n');
260
- console.error(' • Authorization code expired (codes expire in ~60 seconds)');
261
- console.error(' • Code was already used');
262
- console.error(' • Code was copied incorrectly\n');
263
- console.error('šŸ”„ Solution: Run the auth command again and complete it quickly:\n');
264
- console.error(` 1. staticstripes auth --upload-name ${options.uploadName}`);
265
- console.error(' 2. Authorize in browser immediately');
266
- console.error(' 3. Copy the code from the URL');
267
- console.error(' 4. Run auth-complete right away with the fresh code\n');
268
- }
269
- process.exit(1);
270
- }
271
- });
272
- }
273
- //# sourceMappingURL=auth-commands.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-commands.js","sourceRoot":"","sources":["../../../src/cli/youtube/auth-commands.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import { Command } from 'commander';
2
- /**
3
- * Registers YouTube-specific commands (authentication only)
4
- * Upload functionality is handled by the generic upload command with strategy pattern
5
- */
6
- export declare function registerYouTubeCommands(program: Command): void;
7
- //# sourceMappingURL=cli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/cli/youtube/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAG9D"}
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerYouTubeCommands = registerYouTubeCommands;
4
- const auth_commands_js_1 = require("./auth-commands.js");
5
- /**
6
- * Registers YouTube-specific commands (authentication only)
7
- * Upload functionality is handled by the generic upload command with strategy pattern
8
- */
9
- function registerYouTubeCommands(program) {
10
- // Register YouTube auth commands
11
- (0, auth_commands_js_1.registerYouTubeAuthCommands)(program);
12
- }
13
- //# sourceMappingURL=cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli/youtube/cli.ts"],"names":[],"mappings":";;AAOA,0DAGC;AATD,yDAAiE;AAEjE;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,iCAAiC;IACjC,IAAA,8CAA2B,EAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
@@ -1,12 +0,0 @@
1
- import { Project } from '../../project';
2
- export interface YouTubeUploadOptions {
3
- uploadName: string;
4
- projectPath: string;
5
- clientId: string;
6
- clientSecret: string;
7
- }
8
- /**
9
- * Handles YouTube video upload process
10
- */
11
- export declare function handleYouTubeUpload(project: Project, options: YouTubeUploadOptions): Promise<void>;
12
- //# sourceMappingURL=upload-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload-handler.d.ts","sourceRoot":"","sources":["../../../src/cli/youtube/upload-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAkFf"}
@@ -1,66 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.handleYouTubeUpload = handleYouTubeUpload;
7
- const path_1 = require("path");
8
- const youtube_uploader_1 = require("../../youtube-uploader");
9
- const ejs_1 = __importDefault(require("ejs"));
10
- /**
11
- * Handles YouTube video upload process
12
- */
13
- async function handleYouTubeUpload(project, options) {
14
- // Get upload configuration
15
- const upload = project.getYouTubeUpload(options.uploadName);
16
- if (!upload) {
17
- const availableUploads = Array.from(project.getYouTubeUploads().keys());
18
- throw new Error(`Upload "${options.uploadName}" not found in project.html\n` +
19
- (availableUploads.length > 0
20
- ? `Available uploads: ${availableUploads.join(', ')}`
21
- : 'No uploads defined in project.html'));
22
- }
23
- // Get the output file
24
- const output = project.getOutput(upload.outputName);
25
- if (!output) {
26
- throw new Error(`Output "${upload.outputName}" not found`);
27
- }
28
- console.log(`šŸ“¹ Video file: ${output.path}`);
29
- console.log(`šŸŽ¬ Upload config: ${options.uploadName}\n`);
30
- // Create uploader and load tokens
31
- const uploader = new youtube_uploader_1.YouTubeUploader(options.clientId, options.clientSecret);
32
- const hasTokens = uploader.loadTokens(options.uploadName, options.projectPath);
33
- if (!hasTokens) {
34
- throw new Error(`Not authenticated. Please run: staticstripes auth --upload-name ${options.uploadName}`);
35
- }
36
- // Determine title (use upload-specific title or fall back to project title)
37
- const title = upload.title || project.getTitle();
38
- console.log(`šŸ“ Title: ${title}\n`);
39
- // Build the project to populate fragment times (needed for timecodes)
40
- console.log('šŸ”Ø Building project to calculate timecodes...');
41
- await project.build(upload.outputName);
42
- // Get timecodes and process description with EJS
43
- const timecodes = project.getTimecodes();
44
- // Convert ${variable} syntax to <%= variable %> for EJS compatibility
45
- const ejsDescription = upload.description.replace(/\$\{(\w+)\}/g, '<%= $1 %>');
46
- const processedDescription = ejs_1.default.render(ejsDescription, {
47
- timecodes: timecodes.join('\n'),
48
- });
49
- // Create a processed upload object with rendered description
50
- const processedUpload = {
51
- ...upload,
52
- description: processedDescription,
53
- };
54
- // Upload video
55
- const videoId = await uploader.uploadVideo(output.path, processedUpload, title);
56
- // Handle thumbnail if specified
57
- if (upload.thumbnailTimecode !== undefined) {
58
- console.log(`\nšŸ–¼ļø Extracting thumbnail at ${upload.thumbnailTimecode}ms...`);
59
- const thumbnailPath = (0, path_1.resolve)(options.projectPath, '.cache', 'thumbnail.png');
60
- await uploader.extractThumbnail(output.path, upload.thumbnailTimecode, thumbnailPath);
61
- await uploader.uploadThumbnail(videoId, thumbnailPath);
62
- }
63
- // TODO: Update project.html with video ID
64
- console.log('\nāœ… Upload complete!');
65
- }
66
- //# sourceMappingURL=upload-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload-handler.js","sourceRoot":"","sources":["../../../src/cli/youtube/upload-handler.ts"],"names":[],"mappings":"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"}