newpipe-extractor-js
Version:
JavaScript/Node.js port of NewPipeExtractor
283 lines • 15.7 kB
JavaScript
;
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