yt-dlx
Version:
Effortless Audio-Video Downloader And Streamer!
90 lines • 4.07 kB
JavaScript
import path from "path";
import colors from "colors";
import { z, ZodError } from "zod";
import { Client } from "youtubei";
import { Innertube, UniversalCache } from "youtubei.js";
const ZodSchema = z.object({ query: z.string().min(2), verbose: z.boolean().optional() });
async function fetchVideoComments({ query, verbose }) {
try {
if (verbose)
console.log(colors.green("@info:"), `Searching for videos with query: ${query}`);
const youtubeClient = new Client();
const searchResults = await youtubeClient.search(query, { type: "video" });
const video = searchResults.items[0];
if (!video || !video.id) {
if (verbose)
console.log(colors.red("@error:"), "No videos found for the given query");
throw new Error("No videos found for the given query");
}
const videoId = video.id;
if (verbose)
console.log(colors.green("@info:"), `Fetching comments for video ID: ${videoId}`);
const youtubeInnertube = await Innertube.create({
user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
cache: new UniversalCache(true, path.join(process.cwd(), "YouTubeDLX")),
});
const response = await youtubeInnertube.getComments(videoId);
const comments = response.contents
.map(thread => {
const comment = thread?.comment;
if (!comment || !comment.content?.text || !comment.published_time || !comment.author?.name)
return null;
return {
comment_id: comment.comment_id || "",
is_pinned: comment.is_pinned || false,
comment: comment.content.text,
published_time: comment.published_time,
author_is_channel_owner: comment.author_is_channel_owner || false,
creator_thumbnail_url: comment.creator_thumbnail_url || "",
like_count: comment.like_count || 0,
is_member: comment.is_member || false,
author: comment.author.name,
is_hearted: comment.is_hearted || false,
is_liked: comment.is_liked || false,
is_disliked: comment.is_disliked || false,
reply_count: comment.reply_count || 0,
hasReplies: thread.has_replies || false,
};
})
.filter((item) => item !== null);
if (comments.length === 0) {
if (verbose)
console.log(colors.red("@error:"), "No comments found for the video");
throw new Error("No comments found for the video");
}
if (verbose)
console.log(colors.green("@info:"), "Video comments fetched!");
return comments;
}
catch (error) {
throw new Error(error.message);
}
}
export default async function videoComments({ query, verbose }) {
try {
ZodSchema.parse({ query, verbose });
const comments = await fetchVideoComments({ query, verbose });
if (verbose)
console.log(colors.green("@info:"), "❣️ Thank you for using yt-dlx. Consider 🌟starring the GitHub repo https://github.com/yt-dlx.");
return comments;
}
catch (error) {
if (error instanceof ZodError) {
const errorMessage = `${colors.red("@error:")} Argument validation failed: ${error.errors.map(e => `${e.path.join(".")}: ${e.message}`).join(", ")}`;
console.error(errorMessage);
throw new Error(errorMessage);
}
else if (error instanceof Error) {
console.error(error.message);
throw error;
}
else {
const unexpectedError = `${colors.red("@error:")} An unexpected error occurred: ${String(error)}`;
console.error(unexpectedError);
throw new Error(unexpectedError);
}
}
finally {
}
}
//# sourceMappingURL=Comments.js.map