import * as __ns_873 from 'axios' const axios = __ns_873.default import * as __ns_874 from 'node:url' const pathToFileURL = __ns_874.pathToFileURL async function stalkYT(query) { if (!query) throw new Error('Masukkan username/handle YouTube.') const clean = query .trim() .replace(/^https?:\/\/(www\.)?youtube\.com\//i, '') .replace(/^@/, '') .split(/[/?#]/)[0] const url = `https://www.youtube.com/@${clean}` try { const { data: html } = await axios.get(url, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', 'Accept-Language': 'id-ID,id;q=0.9,en-US;q=0.8' }, timeout: 15000 }) const m = html.match(/ytInitialData\s*=\s*({.+?});<\/script>/) if (!m) throw new Error('Gagal membaca struktur halaman YouTube.') const data = JSON.parse(m[1]) const meta = data.metadata?.channelMetadataRenderer || {} const header = data.header?.pageHeaderRenderer || data.header?.c4TabbedHeaderRenderer || {} const name = meta.title || clean const bio = meta.description || 'Tidak ada deskripsi.' const avatar = meta.avatar?.thumbnails?.slice(-1)[0]?.url || header?.content?.pageHeaderViewModel?.image?.decoratedAvatarViewModel?.avatar?.avatarViewModel?.image?.sources?.slice(-1)[0]?.url || `https://avatar.iran.liara.run/public/boy?username=${encodeURIComponent(clean)}` const channelUrl = meta.channelUrl || `https://www.youtube.com/@${clean}` let subscribers = '-' let videos = '-' const rows = header?.content?.pageHeaderViewModel?.metadata?.contentMetadataViewModel?.metadataRows || [] for (const r of rows) { for (const part of r.metadataParts || []) { const txt = part.text?.content || '' if (/subscriber|pelanggan/i.test(txt)) subscribers = txt if (/video/i.test(txt)) videos = txt } } return { name, username: clean, bio, avatar, subscribers, videos, url: channelUrl } } catch (err) { const searchUrl = `https://www.youtube.com/results?search_query=${encodeURIComponent(query)}&sp=EgIQAg%253D%253D` const { data: html2 } = await axios.get(searchUrl, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' }, timeout: 15000 }) const m2 = html2.match(/ytInitialData\s*=\s*({.+?});<\/script>/) if (!m2) throw new Error(`Channel YouTube "@${clean}" tidak ditemukan.`) const data2 = JSON.parse(m2[1]) const channelRenderer = data2.contents?.twoColumnSearchResultsRenderer?.primaryContents?.sectionListRenderer?.contents?.[0]?.itemSectionRenderer?.contents?.find(c => c.channelRenderer)?.channelRenderer if (!channelRenderer) throw new Error(`Channel YouTube "@${clean}" tidak ditemukan.`) return { name: channelRenderer.title?.simpleText || clean, username: clean, bio: channelRenderer.descriptionSnippet?.runs?.map(r => r.text).join('') || 'Tidak ada deskripsi.', avatar: channelRenderer.thumbnail?.thumbnails?.slice(-1)[0]?.url || '', subscribers: channelRenderer.videoCountText?.simpleText || channelRenderer.subscriberCountText?.simpleText || '-', videos: channelRenderer.videoCountText?.simpleText || '-', url: `https://www.youtube.com/${channelRenderer.navigationEndpoint?.commandMetadata?.webCommandMetadata?.url || '@' + clean}` } } } const __dflt_36 = { stalkYT } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { const __exports = { stalkYT: stalkYT, default: __dflt_36 } const __fns = Object.fromEntries(Object.entries(__exports).filter(([, v]) => typeof v === 'function')) const __names = Object.keys(__fns) if (__names.length === 0) { console.log('Tidak ada fungsi yang bisa di-demo. Import modul ini dari kode lain.') } else { const __search = __names.find((n) => /search|cari/i.test(n)) const __name = __search || __names[0] const __fn = __fns[__name] const __isClass = /^class\s/.test(Function.prototype.toString.call(__fn)) const __defaultArgs = (() => { const n = __name.toLowerCase() if (/emoji/.test(n)) return [{ emoji: '😀😃' }] if (/textpro|generate.*text|effect/.test(n)) return ['neon', 'Hello'] if (/image|wallpaper|search|query|anime|movie|manga|news|lyrics|wiki|quote|stalk|detail/.test(n)) return ['naruto'] if (/download|youtube|video|audio|music|spotify|tiktok|instagram|facebook|twitter|reels|terabox|media/.test(n)) return ['https://www.youtube.com/watch?v=dQw4w9WgXcQ'] if (/dork/.test(n)) return ['example.com', 'documents'] if (/tts|speech|prompt|chat|ask|translate/.test(n)) return ['Hello world'] if (/parse|format|normalize|list|features/.test(n)) return [] return ['test'] })() let __args = __defaultArgs if (process.argv.length > 2) __args = process.argv.slice(2).map((a) => { try { return JSON.parse(a) } catch { return a } }) if (__args.length === 0 && !__search && !__isClass && __fn.length > 0) { console.log('Fungsi: ' + __names.join(', ')) console.log('Contoh: node ' + "ytstalk.js" + ' ' + __name + ' ') } else { ;(async () => { try { const r = __isClass ? new __fn(...__args) : await __fn(...__args) console.log(JSON.stringify(r, null, 2)) } catch (e) { console.error('Error: ' + (e && e.message ? e.message : e)) process.exitCode = 1 } })() } } }