From b323b548ca6047978e4a9779796bb9e1b51129ca Mon Sep 17 00:00:00 2001 From: Isaac Abadi Date: Sun, 1 Nov 2020 19:16:41 -0500 Subject: [PATCH] Added ability to use youtube-dl forks Downloader now defaults to youtube-dlc because of the recent DMCA requests --- backend/app.js | 68 ++++++++++++++++++------ backend/config.js | 1 + backend/consts.js | 4 ++ src/app/settings/settings.component.html | 15 ++++-- 4 files changed, 68 insertions(+), 20 deletions(-) diff --git a/backend/app.js b/backend/app.js index f5138a6..58ef417 100644 --- a/backend/app.js +++ b/backend/app.js @@ -155,8 +155,8 @@ if (just_restarted) { fs.unlinkSync('restart.json'); } -// updates & starts youtubedl -startYoutubeDL(); +// updates & starts youtubedl (commented out b/c of repo takedown) +// startYoutubeDL(); var validDownloadingAgents = [ 'aria2c', @@ -558,6 +558,9 @@ async function loadConfig() { // creates archive path if missing await fs.ensureDir(archivePath); + // now this is done here due to youtube-dl's repo takedown + await startYoutubeDL(); + // get subscriptions if (allowSubscriptions) { // runs initially, then runs every ${subscriptionCheckInterval} seconds @@ -1613,12 +1616,16 @@ function checkDownloadPercent(download) { async function startYoutubeDL() { // auto update youtube-dl - if (!debugMode) await autoUpdateYoutubeDL(); + await autoUpdateYoutubeDL(); } // auto updates the underlying youtube-dl binary, not YoutubeDL-Material async function autoUpdateYoutubeDL() { - return new Promise(resolve => { + return new Promise(async resolve => { + const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); + const using_youtube_dlc = default_downloader === 'youtube-dlc'; + const youtube_dl_tags_url = 'https://api.github.com/repos/ytdl-org/youtube-dl/tags' + const youtube_dlc_tags_url = 'https://api.github.com/repos/blackjack4494/yt-dlc/tags' // get current version let current_app_details_path = 'node_modules/youtube-dl/bin/details'; let current_app_details_exists = fs.existsSync(current_app_details_path); @@ -1645,42 +1652,69 @@ async function autoUpdateYoutubeDL() { } // got version, now let's check the latest version from the youtube-dl API - let youtubedl_api_path = 'https://api.github.com/repos/ytdl-org/youtube-dl/tags'; + let youtubedl_api_path = using_youtube_dlc ? youtube_dlc_tags_url : youtube_dl_tags_url; fetch(youtubedl_api_path, {method: 'Get'}) .then(async res => res.json()) .then(async (json) => { // check if the versions are different if (!json || !json[0]) { + logger.error(`Failed to check ${default_downloader} version for an update.`) resolve(false); return false; } const latest_update_version = json[0]['name']; if (current_version !== latest_update_version) { - let binary_path = 'node_modules/youtube-dl/bin'; // versions different, download new update - logger.info('Found new update for youtube-dl. Updating binary...'); + logger.info(`Found new update for ${default_downloader}. Updating binary...`); try { await checkExistsWithTimeout(stored_binary_path, 10000); } catch(e) { - logger.error(`Failed to update youtube-dl - ${e}`); + logger.error(`Failed to update ${default_downloader} - ${e}`); } - downloader(binary_path, function error(err, done) { - if (err) { - logger.error(err); - resolve(false); - } - logger.info(`Binary successfully updated: ${current_version} -> ${latest_update_version}`); - resolve(true); - }); + if (using_youtube_dlc) await downloadLatestYoutubeDLCBinary(latest_update_version); + else await downloadLatestYoutubeDLBinary(current_version, latest_update_version); + + resolve(true); + } else { + resolve(false); } }) .catch(err => { - logger.error('Failed to check youtube-dl version for an update.') + logger.error(`Failed to check ${default_downloader} version for an update.`) logger.error(err) }); }); } +async function downloadLatestYoutubeDLBinary(current_version, new_version) { + return new Promise(resolve => { + let binary_path = 'node_modules/youtube-dl/bin'; + downloader(binary_path, function error(err, done) { + if (err) { + logger.error(err); + resolve(false); + } + logger.info(`youtube-dl successfully updated: ${current_version} -> ${new_version}`); + resolve(true); + }); + }); +} + +async function downloadLatestYoutubeDLCBinary(new_version) { + const file_ext = is_windows ? '.exe' : ''; + + const download_url = `https://github.com/blackjack4494/yt-dlc/releases/latest/download/youtube-dlc${file_ext}`; + const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; + + await fetchFile(download_url, output_path, `youtube-dlc ${new_version}`); + + const details_path = 'node_modules/youtube-dl/bin/details'; + const details_json = fs.readJSONSync('node_modules/youtube-dl/bin/details'); + details_json['version'] = new_version; + + fs.writeJSONSync(details_path, details_json); +} + async function checkExistsWithTimeout(filePath, timeout) { return new Promise(function (resolve, reject) { diff --git a/backend/config.js b/backend/config.js index 8737785..87a44c5 100644 --- a/backend/config.js +++ b/backend/config.js @@ -226,6 +226,7 @@ DEFAULT_CONFIG = { } }, "Advanced": { + "default_downloader": "youtube-dlc", "use_default_downloading_agent": true, "custom_downloading_agent": "", "multi_user_mode": false, diff --git a/backend/consts.js b/backend/consts.js index 11ee67b..2fb5d3d 100644 --- a/backend/consts.js +++ b/backend/consts.js @@ -130,6 +130,10 @@ let CONFIG_ITEMS = { }, // Advanced + 'ytdl_default_downloader': { + 'key': 'ytdl_default_downloader', + 'path': 'YoutubeDLMaterial.Advanced.default_downloader' + }, 'ytdl_use_default_downloading_agent': { 'key': 'ytdl_use_default_downloading_agent', 'path': 'YoutubeDLMaterial.Advanced.use_default_downloading_agent' diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html index d5fccb6..53f6802 100644 --- a/src/app/settings/settings.component.html +++ b/src/app/settings/settings.component.html @@ -258,11 +258,20 @@
+ + Select a downloader + + youtube-dlc + youtube-dl + + +
+
Use default downloading agent
- Select a downloader + Select a download agent aria2c avconv @@ -274,7 +283,7 @@
-
+
Log Level @@ -286,7 +295,7 @@
-
+
Login expiration