@rolme/ytscript
Version:
A CLI tool to download YouTube transcripts and generate summaries
72 lines (71 loc) • 2.63 kB
JavaScript
import { mkdir, writeFile } from 'fs/promises';
import { existsSync } from 'fs';
import { join, dirname, extname } from 'path';
import { TranscriptError } from '../../types/transcript.js';
import { AIError } from '../../types/ai.js';
export async function formatAndSaveOutput(result, title, options = {}, summary) {
const format = options.format || 'text';
let outputPath = options.outputPath;
// Generate filename if not provided
if (!outputPath) {
const timestamp = new Date().toISOString().replace(/:/g, '-');
const extension = format === 'json' ? '.json' : '.txt';
outputPath = join(process.cwd(), `${title}-${timestamp}${extension}`);
}
else {
// Ensure correct extension based on format
const currentExt = extname(outputPath);
const desiredExt = format === 'json' ? '.json' : '.txt';
if (currentExt !== desiredExt) {
outputPath = outputPath.replace(currentExt, desiredExt);
}
}
// Create directory if it doesn't exist
const dir = dirname(outputPath);
if (!existsSync(dir)) {
await mkdir(dir, { recursive: true });
}
let content;
if (result instanceof Error) {
if (format === 'json') {
content = JSON.stringify({
success: false,
error: {
code: result instanceof TranscriptError ? 'TRANSCRIPT_ERROR' :
result instanceof AIError ? 'AI_ERROR' : 'UNKNOWN_ERROR',
message: result.message
}
}, null, 2);
}
else {
content = `Error: ${result.message}`;
}
}
else {
if (format === 'json') {
content = JSON.stringify({
success: true,
data: {
videoId: result.videoId,
transcript: result.transcript,
segments: result.segments,
...(summary && { summary }),
metadata: {
timestamp: new Date().toISOString(),
options: {
language: options.language,
...(options.provider && { provider: options.provider })
}
}
}
}, null, 2);
}
else {
content = summary
? `Original Transcript:\n${result.transcript}\n\nSummary:\n${summary}`
: result.transcript;
}
}
await writeFile(outputPath, content, 'utf8');
return outputPath;
}