Sylvatica.

Back to Library

YouTube Search

js 1/27/2026
13
const axios = require("axios");

const ytSearch = async (query) => {
    try {
        const { data } = await axios.get("https://www.youtube.com/results", {
            params: { search_query: query },
            headers: {
                "User-Agent":
                    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
            },
        });
        const match = data.match(/var ytInitialData = (.*?);<\/script>/s);
        if (!match) return [];

        const ytInitialData = JSON.parse(match[1]);
        const contents =
            ytInitialData.contents?.twoColumnSearchResultsRenderer
                ?.primaryContents?.sectionListRenderer?.contents;

        if (!contents) return [];
        const section =
            contents.find(c => c.itemSectionRenderer)?.itemSectionRenderer
                ?.contents;

        if (!section) return [];
        return section
            .filter(i => i.videoRenderer && i.videoRenderer.lengthText)
            .map(i => {
                const v = i.videoRenderer;
                return {
                    title: v.title?.runs?.[0]?.text || "No Title",
                    thumbnail: v.thumbnail?.thumbnails?.slice(-1)[0]?.url || "",
                    duration: v.lengthText?.simpleText || "0:00",
                    uploaded: v.publishedTimeText?.simpleText || "",
                    views: v.viewCountText?.simpleText || "0 views",
                    url: `https://youtu.be/${v.videoId}`,
                    videoId: v.videoId
                };
            });
    } catch (e) {
        console.error(e);
        return [];
    }
};

module.exports = { ytSearch };