newpipe-extractor-js
Version:
JavaScript/Node.js port of NewPipeExtractor
149 lines (127 loc) ⢠5.77 kB
text/typescript
import {
initializeNewPipe,
extractStreamInfo,
getBestAudioStream,
getBestVideoStream,
isUrlSupported,
setPreferredLocalization
} from '../src/index';
async function main() {
try {
console.log('š NewPipe Extractor JS - Basic Usage Example\n');
// Initialize the extractor
console.log('1. Initializing NewPipe Extractor...');
initializeNewPipe();
// Set preferred localization
setPreferredLocalization({ languageCode: 'en', countryCode: 'US' });
console.log('ā
Initialized with English (US) localization\n');
// Test URLs
const testUrls = [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ', // Rick Astley - Never Gonna Give You Up
'https://youtu.be/dQw4w9WgXcQ', // Short YouTube URL
'dQw4w9WgXcQ', // Just the video ID
'https://www.example.com/not-supported' // Unsupported URL
];
// Check URL support
console.log('2. Checking URL support:');
for (const url of testUrls) {
const supported = isUrlSupported(url);
console.log(` ${supported ? 'ā
' : 'ā'} ${url}`);
}
console.log();
// Extract stream information
const videoUrl = testUrls[0]; // Use the first supported URL
console.log(`3. Extracting stream info for: ${videoUrl}`);
try {
const streamInfo = await extractStreamInfo(videoUrl);
console.log('\nšŗ Stream Information:');
console.log(` Title: ${streamInfo.name}`);
console.log(` Uploader: ${streamInfo.uploaderName}`);
console.log(` Duration: ${formatDuration(streamInfo.length)}`);
console.log(` Views: ${formatNumber(streamInfo.viewCount)}`);
console.log(` Upload Date: ${streamInfo.uploadDate || 'Unknown'}`);
console.log(` Description: ${streamInfo.description?.substring(0, 100)}...`);
console.log(` Tags: ${streamInfo.tags.slice(0, 5).join(', ')}`);
// Audio streams
console.log('\nšµ Audio Streams:');
if (streamInfo.audioStreams.length === 0) {
console.log(' No audio streams found');
} else {
console.log(` Found ${streamInfo.audioStreams.length} audio stream(s):`);
streamInfo.audioStreams.forEach((stream, index) => {
console.log(` ${index + 1}. ${stream.format} - ${stream.bitrate || 'Unknown'} bps - ${stream.quality || 'Unknown'} quality`);
});
const bestAudio = getBestAudioStream(streamInfo);
if (bestAudio) {
console.log(`\n š Best Audio Stream:`);
console.log(` Format: ${bestAudio.format}`);
console.log(` Bitrate: ${bestAudio.bitrate || 'Unknown'} bps`);
console.log(` Quality: ${bestAudio.quality || 'Unknown'}`);
console.log(` URL: ${bestAudio.url?.substring(0, 80)}...`);
}
}
// Video streams
console.log('\nš¬ Video Streams:');
if (streamInfo.videoStreams.length === 0) {
console.log(' No combined video+audio streams found');
} else {
console.log(` Found ${streamInfo.videoStreams.length} combined stream(s):`);
streamInfo.videoStreams.forEach((stream, index) => {
console.log(` ${index + 1}. ${stream.format} - ${stream.resolution || 'Unknown'} - ${stream.bitrate || 'Unknown'} bps`);
});
const bestVideo = getBestVideoStream(streamInfo);
if (bestVideo) {
console.log(`\n š Best Video Stream:`);
console.log(` Format: ${bestVideo.format}`);
console.log(` Resolution: ${bestVideo.resolution || 'Unknown'}`);
console.log(` Bitrate: ${bestVideo.bitrate || 'Unknown'} bps`);
console.log(` URL: ${bestVideo.url?.substring(0, 80)}...`);
}
}
// Video-only streams
if (streamInfo.videoOnlyStreams.length > 0) {
console.log('\nš¹ Video-Only Streams:');
console.log(` Found ${streamInfo.videoOnlyStreams.length} video-only stream(s):`);
streamInfo.videoOnlyStreams.slice(0, 5).forEach((stream, index) => {
console.log(` ${index + 1}. ${stream.format} - ${stream.resolution || 'Unknown'} - ${stream.bitrate || 'Unknown'} bps`);
});
}
// DASH/HLS manifests
if (streamInfo.dashMpdUrl) {
console.log(`\nšÆ DASH Manifest: ${streamInfo.dashMpdUrl.substring(0, 80)}...`);
}
if (streamInfo.hlsUrl) {
console.log(`šŗ HLS Manifest: ${streamInfo.hlsUrl.substring(0, 80)}...`);
}
console.log('\nā
Extraction completed successfully!');
} catch (error) {
console.error('ā Extraction failed:', error instanceof Error ? error.message : 'Unknown error');
}
} catch (error) {
console.error('ā Error:', error instanceof Error ? error.message : 'Unknown error');
}
}
function formatDuration(seconds: number): string {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = seconds % 60;
if (hours > 0) {
return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
} else {
return `${minutes}:${secs.toString().padStart(2, '0')}`;
}
}
function formatNumber(num: number): string {
if (num >= 1000000) {
return `${(num / 1000000).toFixed(1)}M`;
} else if (num >= 1000) {
return `${(num / 1000).toFixed(1)}K`;
} else {
return num.toString();
}
}
// Run the example if this file is executed directly
if (require.main === module) {
main().catch(console.error);
}