Modernize codebase
This commit is contained in:
90
src/cli/index.ts
Normal file
90
src/cli/index.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
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<void> {
|
||||
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<string, unknown>;
|
||||
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 <video_file_path> [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));
|
||||
}
|
||||
Reference in New Issue
Block a user