yt-sub-fetch
Version:
A lightweight and efficient CLI tool for fetching YouTube subtitles or transcripts effortlessly.
73 lines (58 loc) • 1.8 kB
JavaScript
/**
* YouTube Transcript Fetcher CLI
* Fetches and formats YouTube transcripts from video URLs.
*/
import process from "process";
import { parseYouTubeURL } from "./utils/parseYouTubeURL.js";
import { fetchTranscriptAPI } from "./utils/fetchTranscriptAPI.js";
import { crawlYouTubeTranscript } from "./utils/crawlTranscript.js";
import { copyToClipboard } from "./utils/copyToClipboard.js";
/**
* CLI entry point
*/
async function main() {
const args = process.argv.slice(2);
if (args.length === 0) {
console.error("Usage: cli.js <YouTube URL> [langCode] [--copy]");
process.exit(1);
}
const shouldCopyIndex = args.indexOf("--copy");
const shouldCopy = shouldCopyIndex !== -1;
// Remove --copy from args to prevent issues
if (shouldCopy) {
args.splice(shouldCopyIndex, 1);
}
const url = args.find((arg) => arg.startsWith("http"));
const langCode =
args.find((arg) => !arg.startsWith("http") && arg !== "--copy") || "en";
if (!url) {
console.error("Error: Invalid or missing YouTube URL.");
process.exit(1);
}
try {
const { youtubeURL } = parseYouTubeURL(url);
let transcript;
try {
transcript = await fetchTranscriptAPI(youtubeURL, langCode);
} catch (apiError) {
console.warn(
"fetchTranscriptAPI failed, retrying with getYouTubeTranscript...",
);
transcript = await crawlYouTubeTranscript(youtubeURL, langCode);
}
console.log(transcript);
if (shouldCopy) {
copyToClipboard(transcript);
console.log("---");
console.log("Transcript copied to clipboard!");
console.log("---");
}
process.exit(0);
} catch (error) {
console.error(`Error: ${error.message}`);
process.exit(1);
}
}
// Execute the CLI
main();