import 'dotenv/config'; import { getDefaultConfig } from '../config/config'; import { createStats } from '../config/stats'; import { VisionProviderFactory } from '../providers/vision/visionProviderFactory'; import { TTSProviderFactory } from '../providers/tts/ttsProviderFactory'; import { generateAudioDescription } from '../utils/processor'; import { estimateCost } from '../utils/costEstimator'; import { loadConfigFromFile, saveConfigToFile } from '../utils/configUtils'; import { parseCommandLineArgs } from './args'; import { Config } from '../config/config'; async function main(): Promise { const argv = parseCommandLineArgs(); let config: Config = getDefaultConfig(); if (argv.config) { const fileConfig = loadConfigFromFile(argv.config); config = { ...config, ...fileConfig }; } const argvObj = argv as unknown as Record; Object.keys(argvObj).forEach(key => { if (key !== '_' && key !== '$0' && key !== 'config' && key !== 'saveConfig' && key !== 'estimate' && key !== 'help' && key !== 'version' && argvObj[key] !== undefined) { (config as any)[key] = argvObj[key]; } }); if (argv.visionModel) { if (!config.visionProviders[config.visionProvider]) { config.visionProviders[config.visionProvider] = { model: '' }; } config.visionProviders[config.visionProvider].model = argv.visionModel; } if (argv.ttsModel) { if (!config.ttsProviders[config.ttsProvider]) { config.ttsProviders[config.ttsProvider] = { model: '' }; } config.ttsProviders[config.ttsProvider].model = argv.ttsModel; } if (argv.ttsVoice) { if (!config.ttsProviders[config.ttsProvider]) { config.ttsProviders[config.ttsProvider] = { model: '', voice: '' }; } config.ttsProviders[config.ttsProvider].voice = argv.ttsVoice; } if (argv.saveConfig) { saveConfigToFile(argv.saveConfig, config); } if (argv._.length < 1) { console.error('Error: No video file specified'); console.log('Usage: node script.js [options]'); console.log('Use --help for more information'); process.exit(1); } const videoFilePath = String(argv._[0]); if (argv.estimate) { try { const costBreakdown = await estimateCost(videoFilePath, config); console.log('\n=== COST ESTIMATION ==='); console.log(JSON.stringify(costBreakdown, null, 2)); console.log(`\nEstimated total cost: ${costBreakdown.apiCosts.total}`); console.log(`Estimated processing time: ${costBreakdown.estimates.estimatedProcessingTimeMinutes.toFixed(1)} minutes`); console.log('Note: Actual costs may vary based on image complexity and actual response lengths.'); } catch (err) { console.error('Error estimating costs:', err); } } else { try { const stats = createStats(); const visionProvider = VisionProviderFactory.getProvider(config); const ttsProvider = TTSProviderFactory.getProvider(config); await generateAudioDescription(videoFilePath, visionProvider, ttsProvider, config, stats); } catch (err) { console.error('Error generating audio description:', err); } } } if (require.main === module) { main().catch(err => console.error('Unhandled error:', err)); }