UNPKG

newpipe-extractor-js

Version:
283 lines 15.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.throttlingDecryptor = exports.FormatSorterPresets = exports.FormatSorter = exports.getOptimalContainer = exports.isHDRCodec = exports.getCodecDescription = exports.parseCodecs = exports.getFormatCodecInfo = exports.isEncryptedFormat = exports.findBestVideoFormat = exports.findBestAudioFormat = exports.getStreamQualityScore = exports.validateYouTubeUrl = exports.extractVideoIdFromUrl = exports.PoTokenDirector = exports.AdvancedWebPoTokenProvider = exports.WebPoTokenProvider = exports.WEBPO_CLIENTS = exports.generateWebPoCacheSpec = exports.getWebPoContentBinding = exports.PoTokenProviderRejectedRequest = exports.PoTokenError = exports.ContentBindingType = exports.PoTokenContext = exports.PoTokenCache = exports.PoTokenProvider = exports.DashManifestParser = exports.YoutubeSignatureDecryptor = exports.YoutubeLinkHandler = exports.YoutubeService = exports.StreamingService = exports.DefaultDownloader = exports.Downloader = exports.NewPipe = void 0; exports.initializeNewPipe = initializeNewPipe; exports.initializeNewPipeWithPoToken = initializeNewPipeWithPoToken; exports.extractStreamInfo = extractStreamInfo; exports.searchYoutube = searchYoutube; exports.getYoutubeSearchSuggestions = getYoutubeSearchSuggestions; exports.isUrlSupported = isUrlSupported; exports.getBestAudioStream = getBestAudioStream; exports.getBestVideoStream = getBestVideoStream; exports.getDashStreams = getDashStreams; exports.hasDashStreams = hasDashStreams; exports.getBestDashAudioStream = getBestDashAudioStream; exports.getBestDashVideoStream = getBestDashVideoStream; exports.parseDashManifest = parseDashManifest; exports.setPreferredLocalization = setPreferredLocalization; exports.setPreferredContentCountry = setPreferredContentCountry; // Main NewPipe Extractor JS Library const node_fetch_1 = __importDefault(require("node-fetch")); // Core exports var NewPipe_1 = require("./core/NewPipe"); Object.defineProperty(exports, "NewPipe", { enumerable: true, get: function () { return NewPipe_1.NewPipe; } }); var Downloader_1 = require("./core/Downloader"); Object.defineProperty(exports, "Downloader", { enumerable: true, get: function () { return Downloader_1.Downloader; } }); Object.defineProperty(exports, "DefaultDownloader", { enumerable: true, get: function () { return Downloader_1.DefaultDownloader; } }); var StreamingService_1 = require("./core/StreamingService"); Object.defineProperty(exports, "StreamingService", { enumerable: true, get: function () { return StreamingService_1.StreamingService; } }); // Types __exportStar(require("./types"), exports); // Services var YoutubeService_1 = require("./services/youtube/YoutubeService"); Object.defineProperty(exports, "YoutubeService", { enumerable: true, get: function () { return YoutubeService_1.YoutubeService; } }); var YoutubeLinkHandler_1 = require("./services/youtube/YoutubeLinkHandler"); Object.defineProperty(exports, "YoutubeLinkHandler", { enumerable: true, get: function () { return YoutubeLinkHandler_1.YoutubeLinkHandler; } }); var YoutubeSignatureDecryptor_1 = require("./services/youtube/YoutubeSignatureDecryptor"); Object.defineProperty(exports, "YoutubeSignatureDecryptor", { enumerable: true, get: function () { return YoutubeSignatureDecryptor_1.YoutubeSignatureDecryptor; } }); // DASH Support var DashManifestParser_1 = require("./services/youtube/DashManifestParser"); Object.defineProperty(exports, "DashManifestParser", { enumerable: true, get: function () { return DashManifestParser_1.DashManifestParser; } }); // PoToken System - YouTube's Proof of Origin Token support var PoTokenProvider_1 = require("./potoken/PoTokenProvider"); Object.defineProperty(exports, "PoTokenProvider", { enumerable: true, get: function () { return PoTokenProvider_1.PoTokenProvider; } }); Object.defineProperty(exports, "PoTokenCache", { enumerable: true, get: function () { return PoTokenProvider_1.PoTokenCache; } }); Object.defineProperty(exports, "PoTokenContext", { enumerable: true, get: function () { return PoTokenProvider_1.PoTokenContext; } }); Object.defineProperty(exports, "ContentBindingType", { enumerable: true, get: function () { return PoTokenProvider_1.ContentBindingType; } }); Object.defineProperty(exports, "PoTokenError", { enumerable: true, get: function () { return PoTokenProvider_1.PoTokenError; } }); Object.defineProperty(exports, "PoTokenProviderRejectedRequest", { enumerable: true, get: function () { return PoTokenProvider_1.PoTokenProviderRejectedRequest; } }); Object.defineProperty(exports, "getWebPoContentBinding", { enumerable: true, get: function () { return PoTokenProvider_1.getWebPoContentBinding; } }); Object.defineProperty(exports, "generateWebPoCacheSpec", { enumerable: true, get: function () { return PoTokenProvider_1.generateWebPoCacheSpec; } }); Object.defineProperty(exports, "WEBPO_CLIENTS", { enumerable: true, get: function () { return PoTokenProvider_1.WEBPO_CLIENTS; } }); var WebPoTokenProvider_1 = require("./potoken/WebPoTokenProvider"); Object.defineProperty(exports, "WebPoTokenProvider", { enumerable: true, get: function () { return WebPoTokenProvider_1.WebPoTokenProvider; } }); Object.defineProperty(exports, "AdvancedWebPoTokenProvider", { enumerable: true, get: function () { return WebPoTokenProvider_1.AdvancedWebPoTokenProvider; } }); var PoTokenDirector_1 = require("./potoken/PoTokenDirector"); Object.defineProperty(exports, "PoTokenDirector", { enumerable: true, get: function () { return PoTokenDirector_1.PoTokenDirector; } }); // Convenience functions const NewPipe_2 = require("./core/NewPipe"); const Downloader_2 = require("./core/Downloader"); const YoutubeService_2 = require("./services/youtube/YoutubeService"); const DashManifestParser_2 = require("./services/youtube/DashManifestParser"); // Enhanced stream processing utilities var StreamUtils_1 = require("./utils/StreamUtils"); Object.defineProperty(exports, "extractVideoIdFromUrl", { enumerable: true, get: function () { return StreamUtils_1.extractVideoIdFromUrl; } }); Object.defineProperty(exports, "validateYouTubeUrl", { enumerable: true, get: function () { return StreamUtils_1.validateYouTubeUrl; } }); Object.defineProperty(exports, "getStreamQualityScore", { enumerable: true, get: function () { return StreamUtils_1.getStreamQualityScore; } }); Object.defineProperty(exports, "findBestAudioFormat", { enumerable: true, get: function () { return StreamUtils_1.findBestAudioFormat; } }); Object.defineProperty(exports, "findBestVideoFormat", { enumerable: true, get: function () { return StreamUtils_1.findBestVideoFormat; } }); Object.defineProperty(exports, "isEncryptedFormat", { enumerable: true, get: function () { return StreamUtils_1.isEncryptedFormat; } }); Object.defineProperty(exports, "getFormatCodecInfo", { enumerable: true, get: function () { return StreamUtils_1.getFormatCodecInfo; } }); // Advanced codec parsing and format sorting (yt-dlp inspired) var CodecUtils_1 = require("./utils/CodecUtils"); Object.defineProperty(exports, "parseCodecs", { enumerable: true, get: function () { return CodecUtils_1.parseCodecs; } }); Object.defineProperty(exports, "getCodecDescription", { enumerable: true, get: function () { return CodecUtils_1.getCodecDescription; } }); Object.defineProperty(exports, "isHDRCodec", { enumerable: true, get: function () { return CodecUtils_1.isHDRCodec; } }); Object.defineProperty(exports, "getOptimalContainer", { enumerable: true, get: function () { return CodecUtils_1.getOptimalContainer; } }); var FormatSorter_1 = require("./utils/FormatSorter"); Object.defineProperty(exports, "FormatSorter", { enumerable: true, get: function () { return FormatSorter_1.FormatSorter; } }); Object.defineProperty(exports, "FormatSorterPresets", { enumerable: true, get: function () { return FormatSorter_1.FormatSorterPresets; } }); var ThrottlingDecryptor_1 = require("./utils/ThrottlingDecryptor"); Object.defineProperty(exports, "throttlingDecryptor", { enumerable: true, get: function () { return ThrottlingDecryptor_1.throttlingDecryptor; } }); /** * Initialize NewPipe Extractor with default configuration */ function initializeNewPipe(cookieJson, userAgent, poTokenOptions) { const downloader = new Downloader_2.DefaultDownloader(undefined, userAgent); // Load cookies if provided if (cookieJson && Array.isArray(cookieJson)) { downloader.loadCookiesFromJson(cookieJson).catch(e => { console.warn('Failed to load cookies:', e); }); } NewPipe_2.NewPipe.init(downloader); // Register YouTube service with PoToken support NewPipe_2.NewPipe.registerService(new YoutubeService_2.YoutubeService(poTokenOptions)); } /** * Initialize NewPipe Extractor with enhanced PoToken configuration */ function initializeNewPipeWithPoToken(options) { return initializeNewPipe(options.cookies, options.userAgent, options.poToken); } /** * Extract stream information from a YouTube URL */ async function extractStreamInfo(url) { if (!NewPipe_2.NewPipe.getDownloader) { throw new Error('NewPipe not initialized. Call initializeNewPipe() first.'); } const service = NewPipe_2.NewPipe.getServiceByUrl(url); return await service.getStreamExtractor(url); } /** * Search YouTube for videos, channels, and playlists */ async function searchYoutube(query, contentFilters = [], localization = { languageCode: 'en', countryCode: 'US' }) { if (!NewPipe_2.NewPipe.getDownloader) { throw new Error('NewPipe not initialized. Call initializeNewPipe() first.'); } const service = NewPipe_2.NewPipe.getService(0); // YouTube service ID is 0 return await service.search(query, contentFilters, '', localization); } /** * Get YouTube search suggestions for a query */ async function getYoutubeSearchSuggestions(query, localization = { languageCode: 'en', countryCode: 'US' }) { if (!NewPipe_2.NewPipe.getDownloader) { throw new Error('NewPipe not initialized. Call initializeNewPipe() first.'); } const service = NewPipe_2.NewPipe.getService(0); // YouTube service ID is 0 return await service.getSuggestionExtractor(query, localization); } /** * Check if a URL is supported by any registered service */ function isUrlSupported(url) { return NewPipe_2.NewPipe.isUrlSupported(url); } /** * Get the best audio stream from stream info using enhanced quality scoring */ function getBestAudioStream(streamInfo) { // Use the enhanced utility function for better selection const { findBestAudioFormat } = require('./utils/StreamUtils'); return findBestAudioFormat(streamInfo.audioStreams); } /** * Get the best video stream from stream info using enhanced quality scoring */ function getBestVideoStream(streamInfo) { // Use the enhanced utility function for better selection const { findBestVideoFormat } = require('./utils/StreamUtils'); return findBestVideoFormat(streamInfo.videoStreams); } /** * Get all DASH streams from stream info (both audio and video) */ function getDashStreams(streamInfo) { // Filter streams that have DASH characteristics (initRange/indexRange or specific quality markers) const dashAudioStreams = streamInfo.audioStreams.filter(stream => stream.initRange || stream.indexRange || stream.quality === 'dash'); const dashVideoStreams = streamInfo.videoStreams.filter(stream => stream.initRange || stream.indexRange || stream.quality === 'dash'); const dashVideoOnlyStreams = streamInfo.videoOnlyStreams.filter(stream => stream.initRange || stream.indexRange || stream.quality === 'dash'); return { audioStreams: dashAudioStreams, videoStreams: dashVideoStreams, videoOnlyStreams: dashVideoOnlyStreams }; } /** * Check if StreamInfo contains DASH streams */ function hasDashStreams(streamInfo) { const dashStreams = getDashStreams(streamInfo); return dashStreams.audioStreams.length > 0 || dashStreams.videoStreams.length > 0 || dashStreams.videoOnlyStreams.length > 0; } /** * Get the best DASH audio stream (highest bitrate) */ function getBestDashAudioStream(streamInfo) { const dashStreams = getDashStreams(streamInfo); if (dashStreams.audioStreams.length === 0) { return null; } return dashStreams.audioStreams .filter(stream => stream.url) .sort((a, b) => (b.bitrate || 0) - (a.bitrate || 0))[0]; } /** * Get the best DASH video stream (highest resolution, then highest bitrate) */ function getBestDashVideoStream(streamInfo) { const dashStreams = getDashStreams(streamInfo); if (dashStreams.videoOnlyStreams.length === 0 && dashStreams.videoStreams.length === 0) { return null; } // Prefer video-only streams for better quality const allVideoStreams = [...dashStreams.videoOnlyStreams, ...dashStreams.videoStreams]; return allVideoStreams .filter(stream => stream.url) .sort((a, b) => { // First by height (resolution) const heightDiff = (b.height || 0) - (a.height || 0); if (heightDiff !== 0) return heightDiff; // Then by bitrate return (b.bitrate || 0) - (a.bitrate || 0); })[0]; } /** * Parse DASH manifest from URL */ async function parseDashManifest(manifestUrl) { const parser = new DashManifestParser_2.DashManifestParser(); try { const response = await (0, node_fetch_1.default)(manifestUrl, { headers: { 'User-Agent': 'Mozilla/5.0 (compatible; NewPipeExtractor)', 'Accept': 'application/dash+xml,application/xml,text/xml' } }); if (!response.ok) { throw new Error(`Failed to fetch DASH manifest: ${response.status}`); } const manifestXml = await response.text(); return await parser.parseDashManifest(manifestXml); } catch (error) { throw new Error(`DASH manifest parsing failed: ${error}`); } } /** * Set preferred localization */ function setPreferredLocalization(localization) { NewPipe_2.NewPipe.setPreferredLocalization(localization); } /** * Set preferred content country */ function setPreferredContentCountry(contentCountry) { NewPipe_2.NewPipe.setPreferredContentCountry(contentCountry); } // Default export exports.default = { initializeNewPipe, initializeNewPipeWithPoToken, extractStreamInfo, searchYoutube, getYoutubeSearchSuggestions, isUrlSupported, getBestAudioStream, getBestVideoStream, getDashStreams, hasDashStreams, getBestDashAudioStream, getBestDashVideoStream, parseDashManifest, setPreferredLocalization, setPreferredContentCountry, NewPipe: NewPipe_2.NewPipe, DefaultDownloader: Downloader_2.DefaultDownloader, YoutubeService: YoutubeService_2.YoutubeService }; //# sourceMappingURL=index.js.map