diff --git a/backend/app.js b/backend/app.js index 86c0f89..5ad256f 100644 --- a/backend/app.js +++ b/backend/app.js @@ -29,8 +29,7 @@ const read_last_lines = require('read-last-lines'); var ps = require('ps-node'); // needed if bin/details somehow gets deleted -const DETAILS_BIN_PATH = 'node_modules/youtube-dl/bin/details' -if (!fs.existsSync(DETAILS_BIN_PATH)) fs.writeJSONSync(DETAILS_BIN_PATH, {"version":"2000.06.06","path":"node_modules\\youtube-dl\\bin\\youtube-dl.exe","exec":"youtube-dl.exe","downloader":"youtube-dl"}) +if (!fs.existsSync(CONSTS.DETAILS_BIN_PATH)) fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2000.06.06","path":"node_modules\\youtube-dl\\bin\\youtube-dl.exe","exec":"youtube-dl.exe","downloader":"youtube-dl"}) var youtubedl = require('youtube-dl'); @@ -1180,7 +1179,7 @@ async function generateArgs(url, type, options) { downloadConfig = downloadConfig.concat(globalArgs.split(',,')); } - const default_downloader = getCurrentDownloader() || config_api.getConfigItem('ytdl_default_downloader'); + const default_downloader = utils.getCurrentDownloader() || config_api.getConfigItem('ytdl_default_downloader'); if (default_downloader === 'yt-dlp') { downloadConfig.push('--no-clean-infojson'); } @@ -1361,17 +1360,17 @@ async function autoUpdateYoutubeDL() { const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); const tags_url = download_sources[default_downloader]['tags_url']; // get current version - let current_app_details_exists = fs.existsSync(DETAILS_BIN_PATH); + let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH); if (!current_app_details_exists) { - logger.warn(`Failed to get youtube-dl binary details at location '${DETAILS_BIN_PATH}'. Generating file...`); - fs.writeJSONSync(DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); + logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`); + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); } - let current_app_details = JSON.parse(fs.readFileSync(DETAILS_BIN_PATH)); + let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH)); let current_version = current_app_details['version']; let current_downloader = current_app_details['downloader']; let stored_binary_path = current_app_details['path']; if (!stored_binary_path || typeof stored_binary_path !== 'string') { - // logger.info(`INFO: Failed to get youtube-dl binary path at location: ${DETAILS_BIN_PATH}, attempting to guess actual path...`); + // logger.info(`INFO: Failed to get youtube-dl binary path at location: ${CONSTS.DETAILS_BIN_PATH}, attempting to guess actual path...`); const guessed_base_path = 'node_modules/youtube-dl/bin/'; const guessed_file_path = guessed_base_path + 'youtube-dl' + (is_windows ? '.exe' : ''); if (fs.existsSync(guessed_file_path)) { @@ -1454,15 +1453,10 @@ async function downloadLatestYoutubeDLPBinary(new_version) { } function updateDetailsJSON(new_version, downloader) { - const details_json = fs.readJSONSync(DETAILS_BIN_PATH); + const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); if (new_version) details_json['version'] = new_version; details_json['downloader'] = downloader; - fs.writeJSONSync(DETAILS_BIN_PATH, details_json); -} - -function getCurrentDownloader() { - const details_json = fs.readJSONSync(DETAILS_BIN_PATH); - return details_json['downloader']; + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json); } async function checkExistsWithTimeout(filePath, timeout) { diff --git a/backend/consts.js b/backend/consts.js index 91cfc75..36ffd7d 100644 --- a/backend/consts.js +++ b/backend/consts.js @@ -207,8 +207,11 @@ AVAILABLE_PERMISSIONS = [ 'downloads_manager' ]; +const DETAILS_BIN_PATH = 'node_modules/youtube-dl/bin/details' + module.exports = { CONFIG_ITEMS: CONFIG_ITEMS, AVAILABLE_PERMISSIONS: AVAILABLE_PERMISSIONS, - CURRENT_VERSION: 'v4.2' + CURRENT_VERSION: 'v4.2', + DETAILS_BIN_PATH: DETAILS_BIN_PATH } diff --git a/backend/db.js b/backend/db.js index c2a80f3..51393a6 100644 --- a/backend/db.js +++ b/backend/db.js @@ -256,6 +256,9 @@ function generateFileObject2(file_path, type) { var jsonobj = utils.getJSON(file_path, type); if (!jsonobj) { return null; + } else if (!jsonobj['_filename']) { + logger.error(`Failed to get filename from info JSON! File ${jsonobj['title']} could not be added.`); + return null; } const ext = (type === 'audio') ? '.mp3' : '.mp4' const true_file_path = utils.getTrueFileName(jsonobj['_filename'], type); @@ -781,26 +784,26 @@ exports.removeRecord = async (table, filter_obj) => { return !!(output['result']['ok']); } -exports.removeAllRecords = async (table = null) => { +exports.removeAllRecords = async (table = null, filter_obj = null) => { // local db override const tables_to_remove = table ? [table] : tables_list; + logger.debug(`Removing all records from: ${tables_to_remove} with filter: ${JSON.stringify(filter_obj)}`) if (using_local_db) { - logger.debug(`Removing all records from: ${tables_to_remove}`) for (let i = 0; i < tables_to_remove.length; i++) { const table_to_remove = tables_to_remove[i]; - local_db.assign({[table_to_remove]: []}).write(); - logger.debug(`Removed all records from ${table_to_remove}`); + if (filter_obj) applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write(); + else local_db.assign({[table_to_remove]: []}).write(); + logger.debug(`Successfully removed records from ${table_to_remove}`); } return true; } let success = true; - logger.debug(`Removing all records from: ${tables_to_remove}`) for (let i = 0; i < tables_to_remove.length; i++) { const table_to_remove = tables_to_remove[i]; - const output = await database.collection(table_to_remove).deleteMany({}); - logger.debug(`Removed all records from ${table_to_remove}`); + const output = await database.collection(table_to_remove).deleteMany(filter_obj ? filter_obj : {}); + logger.debug(`Successfully removed records from ${table_to_remove}`); success &= !!(output['result']['ok']); } return success; @@ -988,6 +991,8 @@ exports.transferDB = async (local_to_remote) => { config_api.setConfigItem('ytdl_use_local_db', using_local_db); + logger.debug('Transfer finished!'); + return success; } diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 30786bf..537c516 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -413,6 +413,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de downloadConfig.push('--write-thumbnail'); } + const default_downloader = utils.getCurrentDownloader() || config_api.getConfigItem('ytdl_default_downloader'); + if (default_downloader === 'yt-dlp') { + downloadConfig.push('--no-clean-infojson'); + } + return downloadConfig; } diff --git a/backend/utils.js b/backend/utils.js index dc425e8..9370cf4 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -1,6 +1,7 @@ const fs = require('fs-extra') const path = require('path') const config_api = require('./config'); +const CONSTS = require('./consts') const archiver = require('archiver'); const is_windows = process.platform === 'win32'; @@ -315,6 +316,11 @@ function addUIDsToCategory(category, files) { return files_that_match; } +function getCurrentDownloader() { + const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); + return details_json['downloader']; +} + async function recFindByExt(base,ext,files,result) { files = files || (await fs.readdir(base)) @@ -390,6 +396,7 @@ module.exports = { durationStringToNumber: durationStringToNumber, getMatchingCategoryFiles: getMatchingCategoryFiles, addUIDsToCategory: addUIDsToCategory, + getCurrentDownloader: getCurrentDownloader, recFindByExt: recFindByExt, removeFileExtension: removeFileExtension, wait: wait,