#!/usr/bin/env node 'use strict' const url = require('url') const spawn = require('child_process').spawn const os = require('os') let arg = (process.argv[2] || '').trim() function protocol (arg, handleCb) { let yt = spawn('youtube-dl', ['--no-playlist', '--playlist-end', 1, '-j', '-f', 'best', arg]) let output = '' yt.stdout.on('data', function (chunk) { output += chunk.toString('utf8') }) yt.on('close', function () { let data = JSON.parse(output) delete data.formats fetchVideo(data, handleCb) }) } function fetchVideo (data, cb) { let tempName = os.tmpdir() + '/tmp.yt.' + data.id + '.mkv' let ffmpeg = spawn('ffmpeg', ['-hide_banner', '-i', data.url, '-codec:a', 'copy', '-codec:v', 'copy', '-y', tempName]) ffmpeg.stdout.pipe(process.stderr) ffmpeg.stderr.pipe(process.stderr) data.filename = data.url data.filename = tempName outputVideo(data, cb) } function formatter (o) { if (Array.isArray(o)) { o.forEach(formatter) return } let list = [] for (let key in o) { if (o.hasOwnProperty(key) && key !== 'source' && o[key] !== null && o[key] !== undefined) { list.push(key + '=' + JSON.stringify(o[key])) } } let out = '' if (list.length > 0) { out += 'annotate:' + list.join(',') + ':' } out += o.source console.log(out) } function outputVideo (video, cb) { cb({ title: video.title, artist: video.uploader, url: video.webpage_url, art: video.thumbnail, temporary: true, source: video.filename }) } if (arg.indexOf('youtube.com') !== -1 || arg.indexOf('youtu.be') !== -1) { protocol(arg, formatter) } else { console.log(arg) }