const { parse } = require('url'); /** * Parse a string as a potential YouTube resource URL. * @param {string} url * @returns {{video: ?string, channel: ?string, playlist: ?string}} */ exports.parseURL = (url) => { const parsed = parse(url, true); switch (parsed.hostname) { case 'www.youtube.com': case 'youtube.com': case 'm.youtube.com': case 'music.youtube.com': { const idRegex = /^[a-zA-Z0-9-_]+$/; if (parsed.pathname === '/watch') { if (!idRegex.test(parsed.query.v)) return {}; const response = { video: parsed.query.v }; if (parsed.query.list) response.playlist = parsed.query.list; return response; } else if (parsed.pathname === '/playlist') { if(!idRegex.test(parsed.query.list)) return {}; return { playlist: parsed.query.list }; } else if (parsed.pathname.startsWith('/channel/')) { const id = parsed.pathname.replace('/channel/', ''); if (!idRegex.test(id)) return {}; return { channel: id }; } else if (parsed.pathname.startsWith('/browse/')) { const id = parsed.pathname.replace('/browse/', ''); if (!idRegex.test(id)) return {}; return { channel: id }; } return {}; } case 'youtu.be': return { video: /^\/[a-zA-Z0-9-_]+$/.test(parsed.pathname) ? parsed.pathname.slice(1) : null }; default: return {}; } };