save current changes

This commit is contained in:
2025-08-16 13:11:45 +02:00
parent 13c878b627
commit 67abb253cb

View File

@ -4,18 +4,18 @@ 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 function generateVideoFromKeyword(keyword: string) { async function prepareImageForKeyword(keyword: string): Promise<{ keyword: string; generatedImagePath: string } | null> {
const numberOfPages = 1; const numberOfPages = 1;
const imagePaths = await downloadPinterestImages(keyword, numberOfPages); const imagePaths = await downloadPinterestImages(keyword, numberOfPages);
logger.debug('Downloaded images:', imagePaths); logger.debug(`Downloaded ${imagePaths.length} images for keyword: ${keyword}`);
if (imagePaths.length === 0) { if (imagePaths.length === 0) {
logger.warn('No images downloaded, cannot proceed.'); logger.warn(`No images downloaded for keyword "${keyword}", cannot proceed.`);
return; return null;
} }
const randomImagePath = imagePaths[Math.floor(Math.random() * imagePaths.length)]; const randomImagePath = imagePaths[Math.floor(Math.random() * imagePaths.length)];
logger.debug(`Randomly selected image: ${randomImagePath}`); logger.debug(`Randomly selected image for "${keyword}": ${randomImagePath}`);
try { try {
const imagePromptResponse = await describeImage(randomImagePath, const imagePromptResponse = await describeImage(randomImagePath,
@ -24,18 +24,26 @@ async function generateVideoFromKeyword(keyword: string) {
Output should be in this format Output should be in this format
--- ---
{ {
"prompt":"" "prompt":"Ultra detialed realistic photo, {result comes here}"
} }
--- ---
`); `);
const imagePrompt = imagePromptResponse.prompt; const imagePrompt = imagePromptResponse.prompt;
logger.debug(`Description for ${randomImagePath}:`, imagePrompt); logger.info(`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(imagePrompt, imageFileName); const generatedImagePath = await generateImage(imagePrompt, imageFileName);
logger.debug(`Generated new image from prompt, saved to: ${generatedImagePath}`); logger.debug(`Generated new image from prompt, saved to: ${generatedImagePath}`);
return { keyword, generatedImagePath };
} catch (error) {
logger.error(`Failed to process ${randomImagePath} for keyword "${keyword}":`, error);
return null;
}
}
async function generateVideoFromImagePath(keyword: string, generatedImagePath: string) {
try {
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.
The prompt should describe a dynamic scene that evolves from the static image. The prompt should describe a dynamic scene that evolves from the static image.
@ -47,18 +55,19 @@ async function generateVideoFromKeyword(keyword: string) {
--- ---
`); `);
const videoPrompt = videoPromptResponse.prompt; const videoPrompt = videoPromptResponse.prompt;
logger.debug(`Generated video prompt: ${videoPrompt}`); logger.info(`Generated video prompt for ${generatedImagePath}: ${videoPrompt}`);
const timestamp = new Date().getTime();
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.debug(`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 ${randomImagePath}:`, error); logger.error(`Failed to generate video for ${generatedImagePath}:`, error);
} }
} }
(async () => { (async () => {
while (1) {
const keywords = [ const keywords = [
"beautiful woman portrait", "beautiful woman portrait",
"handsome man candid", "handsome man candid",
@ -66,7 +75,6 @@ async function generateVideoFromKeyword(keyword: string) {
"stunning landscape", "stunning landscape",
"vibrant city nightlife", "vibrant city nightlife",
"elegant fashion model", "elegant fashion model",
"captivating eyes",
"fantasy landscape", "fantasy landscape",
"RPG character art", "RPG character art",
"high fashion model", "high fashion model",
@ -76,14 +84,32 @@ async function generateVideoFromKeyword(keyword: string) {
"3D abstract render" "3D abstract render"
]; ];
while (1) {
const preparedImages = [];
logger.info('--- Starting image preparation phase ---');
for (const keyword of keywords) { for (const keyword of keywords) {
const startTime = Date.now(); const startTime = Date.now();
logger.info(`--- Starting process for keyword: ${keyword} ---`); logger.info(`--- Preparing image for keyword: ${keyword} ---`);
await generateVideoFromKeyword(keyword); const result = await prepareImageForKeyword(keyword);
if (result) {
preparedImages.push(result);
}
const endTime = Date.now(); const endTime = Date.now();
const durationInSeconds = (endTime - startTime) / 1000; const durationInSeconds = (endTime - startTime) / 1000;
logger.info(`--- Finished process for keyword: ${keyword} in ${durationInSeconds.toFixed(2)} seconds ---`); logger.info(`--- Finished preparing image for keyword: ${keyword} in ${durationInSeconds.toFixed(2)} seconds ---`);
} }
logger.info('--- Finished image preparation phase ---');
logger.info('--- Starting video generation phase ---');
for (const { keyword, generatedImagePath } of preparedImages) {
const startTime = Date.now();
logger.info(`--- Generating video for keyword: ${keyword} ---`);
await generateVideoFromImagePath(keyword, generatedImagePath);
const endTime = Date.now();
const durationInSeconds = (endTime - startTime) / 1000;
logger.info(`--- Finished generating video for keyword: ${keyword} in ${durationInSeconds.toFixed(2)} seconds ---`);
}
logger.info('--- Finished video generation phase ---');
} }
})(); })();