#!/usr/bin/env bun /** * Quick test script to verify the library works * * Usage: * bun run test.ts [output-dir] * * Example: * bun run test.ts ./video.mp4 ./output */ import { convertToDash, checkFFmpeg, checkNvenc, checkMP4Box } from './src/index'; import cliProgress from 'cli-progress'; const input = process.argv[2]; const outputDir = process.argv[3] || './output'; if (!input) { console.error('āŒ Usage: bun run test.ts [output-dir]'); process.exit(1); } console.log('šŸ” Checking system...\n'); const hasFFmpeg = await checkFFmpeg(); const hasNvenc = await checkNvenc(); const hasMP4Box = await checkMP4Box(); console.log(`FFmpeg: ${hasFFmpeg ? 'āœ…' : 'āŒ'}`); console.log(`NVENC: ${hasNvenc ? 'āœ… (GPU acceleration)' : 'āš ļø (CPU only)'}`); console.log(`MP4Box: ${hasMP4Box ? 'āœ…' : 'āŒ'}\n`); if (!hasFFmpeg) { console.error('āŒ FFmpeg not found. Please install FFmpeg first.'); process.exit(1); } if (!hasMP4Box) { console.error('āŒ MP4Box not found. Please install: sudo pacman -S gpac'); process.exit(1); } console.log(`šŸ“¹ Input: ${input}`); console.log(`šŸ“ Output: ${outputDir}\n`); console.log('šŸš€ Starting conversion...\n'); // Create multibar container const multibar = new cliProgress.MultiBar({ format: '{stage} | {bar} | {percentage}% | {name}', barCompleteChar: 'ā–ˆ', barIncompleteChar: 'ā–‘', hideCursor: true, clearOnComplete: false, stopOnComplete: true }, cliProgress.Presets.shades_classic); // Track progress bars for each profile const bars: Record = {}; let overallBar: any = null; try { const result = await convertToDash({ input, outputDir, segmentDuration: 2, useNvenc: hasNvenc, generateThumbnails: true, parallel: true, onProgress: (progress) => { const stageName = progress.stage === 'encoding' ? 'Encoding' : progress.stage === 'thumbnails' ? 'Thumbnails' : progress.stage === 'manifest' ? 'Manifest' : progress.stage === 'analyzing' ? 'Analyzing' : 'Complete'; // Stage 1: Encoding - show individual profile bars if (progress.stage === 'encoding' && progress.currentProfile) { if (!bars[progress.currentProfile]) { bars[progress.currentProfile] = multibar.create(100, 0, { stage: 'Encode', name: progress.currentProfile }); } // Use profilePercent (0-100) for individual bars, not overall percent const profileProgress = progress.profilePercent ?? progress.percent; bars[progress.currentProfile].update(profileProgress, { stage: 'Encode', name: progress.currentProfile }); } // Overall progress bar if (!overallBar) { overallBar = multibar.create(100, 0, { stage: stageName, name: 'Overall' }); } overallBar.update(progress.percent, { stage: stageName, name: progress.message || 'Overall' }); } }); multibar.stop(); console.log('\nāœ… Conversion completed successfully!\n'); console.log('šŸ“Š Results:'); console.log(` Manifest: ${result.manifestPath}`); console.log(` Duration: ${result.duration.toFixed(2)}s`); console.log(` Profiles: ${result.profiles.map(p => p.name).join(', ')}`); console.log(` Encoder: ${result.usedNvenc ? '⚔ NVENC (GPU)' : 'šŸ”§ libx264 (CPU)'}`); if (result.thumbnailSpritePath) { console.log(` Thumbnails: ${result.thumbnailSpritePath}`); console.log(` VTT file: ${result.thumbnailVttPath}`); } console.log('\nšŸŽ‰ Done! You can now use the manifest file in your video player.'); } catch (error) { multibar.stop(); console.error('\n\nāŒ Error during conversion:'); console.error(error); process.exit(1); }