save changes
This commit is contained in:
60
src/index.ts
60
src/index.ts
@ -4,15 +4,21 @@ import { generateImage } from './lib/image-generator';
|
|||||||
import { generateVideo } from './lib/video-generator';
|
import { generateVideo } from './lib/video-generator';
|
||||||
import { logger } from './lib/logger';
|
import { logger } from './lib/logger';
|
||||||
|
|
||||||
(async () => {
|
async function generateVideoFromKeyword(keyword: string) {
|
||||||
const keyword = 'cyberpunk city';
|
|
||||||
const numberOfPages = 1;
|
const numberOfPages = 1;
|
||||||
const imagePaths = await downloadPinterestImages(keyword, numberOfPages);
|
const imagePaths = await downloadPinterestImages(keyword, numberOfPages);
|
||||||
logger.info('Downloaded images:', imagePaths);
|
logger.debug('Downloaded images:', imagePaths);
|
||||||
|
|
||||||
|
if (imagePaths.length === 0) {
|
||||||
|
logger.warn('No images downloaded, cannot proceed.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const randomImagePath = imagePaths[Math.floor(Math.random() * imagePaths.length)];
|
||||||
|
logger.debug(`Randomly selected image: ${randomImagePath}`);
|
||||||
|
|
||||||
for (const imagePath of imagePaths) {
|
|
||||||
try {
|
try {
|
||||||
const llmResponseJSON = await describeImage(imagePath,
|
const imagePromptResponse = await describeImage(randomImagePath,
|
||||||
`Describe this image as a prompt for an image generation model.
|
`Describe this image as a prompt for an image generation model.
|
||||||
Prompt should be in 200 words.
|
Prompt should be in 200 words.
|
||||||
Output should be in this format
|
Output should be in this format
|
||||||
@ -22,13 +28,13 @@ import { logger } from './lib/logger';
|
|||||||
}
|
}
|
||||||
---
|
---
|
||||||
`);
|
`);
|
||||||
const prompt = llmResponseJSON.prompt;
|
const imagePrompt = imagePromptResponse.prompt;
|
||||||
logger.info(`Description for ${imagePath}:`, prompt);
|
logger.debug(`Description for ${randomImagePath}:`, imagePrompt);
|
||||||
|
|
||||||
const timestamp = new Date().getTime();
|
const timestamp = new Date().getTime();
|
||||||
const imageFileName = `${keyword.replace(/\s/g, '_')}_${timestamp}.png`;
|
const imageFileName = `${keyword.replace(/\s/g, '_')}_${timestamp}.png`;
|
||||||
const generatedImagePath = await generateImage(prompt, imageFileName);
|
const generatedImagePath = await generateImage(imagePrompt, imageFileName);
|
||||||
logger.info(`Generated new image from prompt, saved to: ${generatedImagePath}`);
|
logger.debug(`Generated new image from prompt, saved to: ${generatedImagePath}`);
|
||||||
|
|
||||||
const videoPromptResponse = await describeImage(generatedImagePath,
|
const videoPromptResponse = await describeImage(generatedImagePath,
|
||||||
`Generate a prompt for an 8-second video based on the provided image.
|
`Generate a prompt for an 8-second video based on the provided image.
|
||||||
@ -41,13 +47,43 @@ import { logger } from './lib/logger';
|
|||||||
---
|
---
|
||||||
`);
|
`);
|
||||||
const videoPrompt = videoPromptResponse.prompt;
|
const videoPrompt = videoPromptResponse.prompt;
|
||||||
logger.info(`Generated video prompt: ${videoPrompt}`);
|
logger.debug(`Generated video prompt: ${videoPrompt}`);
|
||||||
|
|
||||||
const videoFileName = `${keyword.replace(/\s/g, '_')}_${timestamp}.mp4`;
|
const videoFileName = `${keyword.replace(/\s/g, '_')}_${timestamp}.mp4`;
|
||||||
const generatedVideoPath = await generateVideo(videoPrompt, generatedImagePath, videoFileName);
|
const generatedVideoPath = await generateVideo(videoPrompt, generatedImagePath, videoFileName);
|
||||||
logger.info(`Generated video from prompt, saved to: ${generatedVideoPath}`);
|
logger.debug(`Generated video from prompt, saved to: ${generatedVideoPath}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error(`Failed to process ${imagePath}:`, error);
|
logger.error(`Failed to process ${randomImagePath}:`, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
while (1) {
|
||||||
|
const keywords = [
|
||||||
|
"beautiful woman portrait",
|
||||||
|
"handsome man candid",
|
||||||
|
"interesting street photography",
|
||||||
|
"stunning landscape",
|
||||||
|
"vibrant city nightlife",
|
||||||
|
"elegant fashion model",
|
||||||
|
"captivating eyes",
|
||||||
|
"fantasy landscape",
|
||||||
|
"RPG character art",
|
||||||
|
"high fashion model",
|
||||||
|
"city nightscape",
|
||||||
|
"fireworks display",
|
||||||
|
"nebula space art",
|
||||||
|
"3D abstract render"
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const keyword of keywords) {
|
||||||
|
const startTime = Date.now();
|
||||||
|
logger.info(`--- Starting process for keyword: ${keyword} ---`);
|
||||||
|
await generateVideoFromKeyword(keyword);
|
||||||
|
const endTime = Date.now();
|
||||||
|
const durationInSeconds = (endTime - startTime) / 1000;
|
||||||
|
logger.info(`--- Finished process for keyword: ${keyword} in ${durationInSeconds.toFixed(2)} seconds ---`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
Reference in New Issue
Block a user