function call (urls, args1, args2, options = {}, cb) {
  let args = args1
  if (args2) args = args.concat(args2)

  // check if encoding is already set
  if (isWin && !args.includes('--encoding')) {
    args.push('--encoding')
    args.push('utf8')
  }

  if (urls !== null) {
    if (isString(urls)) urls = [urls]

    for (let i = 0; i < urls.length; i++) {
      const video = urls[i]
      if (isYouTubeRegex.test(video)) {
        // Get possible IDs.
        const videoUrlObj = new URL(video)
        let id = videoUrlObj.searchParams.get('v') || ''
        if (id) {
          args.push('http://www.youtube.com/watch?v=' + id)
        } else {
          // Get possible IDs for youtu.be from urladdr.
          id = videoUrlObj.pathname.slice(1).replace(/^v\//, '')
          if (id) {
            args.push(video)
            args.unshift('-i')
          }
        }
      } else {
        if (i === 0) args.push('--')
        args.push(video)
      }
    }
  }

  return youtubeDl(args, options, cb)
}
Calls youtube-dl with some arguments and the `cb`
gets called with the output.

@param {String|Array.<String>}
@param {Array.<String>} args
@param {Array.<String>} args2
@param {Object} options
@param {Function(!Error, String)} cb