From 2d723da9c78493d7d6032b87b7aab6f0d09bfdf8 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Tue, 2 Mar 2021 23:44:48 +0100 Subject: [PATCH] feat: add YOUTUBE_DL_HOST as binary --- package.json | 2 ++ scripts/postinstall.js | 41 ++++++++++++++++++++++------------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index eb26466..4744e6a 100644 --- a/package.json +++ b/package.json @@ -30,9 +30,11 @@ "bin-version-check-cli": "~2.0.0", "dargs": "~7.0.0", "execa": "~5.0.0", + "get-stream": "~6.0.0", "got": "~11.8.1", "is-unix": "~1.0.0", "mkdirp": "~1.0.4", + "p-event": "~4.2.0", "p-reflect": "~2.1.0" }, "devDependencies": { diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 996ad65..367cccc 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -1,12 +1,17 @@ 'use strict' -const { promisify } = require('util') -const stream = require('stream') +const getStream = require('get-stream') +const fs = require('fs/promises') +const pEvent = require('p-event') const mkdirp = require('mkdirp') + const got = require('got') -const fs = require('fs') -const pipeline = promisify(stream.pipeline) +const BINARY_CONTENT_TYPES = [ + 'binary/octet-stream', + 'application/octet-stream', + 'application/x-binary' +] const { YOUTUBE_DL_PATH, @@ -15,27 +20,25 @@ const { YOUTUBE_DL_FILENAME } = require('../src/constants') -const getBinaryUrl = async endpoint => { - const [{ assets }] = await got(endpoint, { - responseType: 'json', - resolveBodyOnly: true - }) +const getBinary = async url => { + const stream = got.stream(url) + const response = await pEvent(stream, 'response') + const contentType = response.headers['content-type'] + + if (BINARY_CONTENT_TYPES.includes(contentType)) { + return getStream(stream, { encoding: 'buffer' }) + } + const [{ assets }] = JSON.parse(await getStream(stream)) const { browser_download_url: downloadUrl } = assets.find( ({ name }) => name === YOUTUBE_DL_FILENAME ) - return downloadUrl -} -const main = async url => { - await mkdirp(YOUTUBE_DL_DIR) - return pipeline( - got.stream(url), - fs.createWriteStream(YOUTUBE_DL_PATH, { mode: 493 }) - ) + return got(downloadUrl).buffer() } -getBinaryUrl(YOUTUBE_DL_HOST) - .then(main) +mkdirp(YOUTUBE_DL_DIR) + .then(() => getBinary(YOUTUBE_DL_HOST)) + .then(buffer => fs.writeFile(YOUTUBE_DL_PATH, buffer, { mode: 493 })) .then(message => message && console.log(message)) .catch(err => console.error(err.message || err))