#!/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)
}