mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-04-08 02:41:27 +03:00
Added methods to modify download state
Added missing optionalJwt calls in several routes
This commit is contained in:
@@ -1608,7 +1608,7 @@ app.post('/api/downloadFileFromServer', optionalJwt, async (req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
app.post('/api/downloadArchive', async (req, res) => {
|
||||
app.post('/api/downloadArchive', optionalJwt, async (req, res) => {
|
||||
let sub = req.body.sub;
|
||||
let archive_dir = sub.archive;
|
||||
|
||||
@@ -1643,7 +1643,7 @@ app.post('/api/uploadCookies', upload_multer.single('cookies'), async (req, res)
|
||||
|
||||
// Updater API calls
|
||||
|
||||
app.get('/api/updaterStatus', async (req, res) => {
|
||||
app.get('/api/updaterStatus', optionalJwt, async (req, res) => {
|
||||
let status = updaterStatus;
|
||||
|
||||
if (status) {
|
||||
@@ -1654,7 +1654,7 @@ app.get('/api/updaterStatus', async (req, res) => {
|
||||
|
||||
});
|
||||
|
||||
app.post('/api/updateServer', async (req, res) => {
|
||||
app.post('/api/updateServer', optionalJwt, async (req, res) => {
|
||||
let tag = req.body.tag;
|
||||
|
||||
updateServer(tag);
|
||||
@@ -1667,7 +1667,7 @@ app.post('/api/updateServer', async (req, res) => {
|
||||
|
||||
// API Key API calls
|
||||
|
||||
app.post('/api/generateNewAPIKey', function (req, res) {
|
||||
app.post('/api/generateNewAPIKey', optionalJwt, function (req, res) {
|
||||
const new_api_key = uuid();
|
||||
config_api.setConfigItem('ytdl_api_key', new_api_key);
|
||||
res.send({new_api_key: new_api_key});
|
||||
@@ -1739,12 +1739,12 @@ app.get('/api/thumbnail/:path', optionalJwt, async (req, res) => {
|
||||
|
||||
// Downloads management
|
||||
|
||||
app.get('/api/downloads', async (req, res) => {
|
||||
app.get('/api/downloads', optionalJwt, async (req, res) => {
|
||||
const downloads = await db_api.getRecords('download_queue');
|
||||
res.send({downloads: downloads});
|
||||
});
|
||||
});
|
||||
|
||||
app.post('/api/download', async (req, res) => {
|
||||
app.post('/api/download', optionalJwt, async (req, res) => {
|
||||
const download_uid = req.body.download_uid;
|
||||
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
@@ -1754,15 +1754,46 @@ app.get('/api/thumbnail/:path', optionalJwt, async (req, res) => {
|
||||
} else {
|
||||
res.send({download: null});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.post('/api/clearFinishedDownloads', async (req, res) => {
|
||||
app.post('/api/clearFinishedDownloads', optionalJwt, async (req, res) => {
|
||||
const success = db_api.removeAllRecords('download_queue', {finished: true});
|
||||
res.send({success: success});
|
||||
});
|
||||
|
||||
});
|
||||
app.post('/api/clearDownload', optionalJwt, async (req, res) => {
|
||||
const download_uid = req.body.download_uid;
|
||||
const success = await downloader_api.clearDownload(download_uid);
|
||||
res.send({success: success});
|
||||
});
|
||||
|
||||
app.post('/api/pauseDownload', optionalJwt, async (req, res) => {
|
||||
const download_uid = req.body.download_uid;
|
||||
const success = await downloader_api.pauseDownload(download_uid);
|
||||
res.send({success: success});
|
||||
});
|
||||
|
||||
app.post('/api/resumeDownload', optionalJwt, async (req, res) => {
|
||||
const download_uid = req.body.download_uid;
|
||||
const success = await downloader_api.resumeDownload(download_uid);
|
||||
res.send({success: success});
|
||||
});
|
||||
|
||||
app.post('/api/restartDownload', optionalJwt, async (req, res) => {
|
||||
const download_uid = req.body.download_uid;
|
||||
const success = await downloader_api.restartDownload(download_uid);
|
||||
res.send({success: success});
|
||||
});
|
||||
|
||||
app.post('/api/cancelDownload', optionalJwt, async (req, res) => {
|
||||
const download_uid = req.body.download_uid;
|
||||
const success = await downloader_api.cancelDownload(download_uid);
|
||||
res.send({success: success});
|
||||
});
|
||||
|
||||
// logs management
|
||||
|
||||
app.post('/api/logs', async function(req, res) {
|
||||
app.post('/api/logs', optionalJwt, async function(req, res) {
|
||||
let logs = null;
|
||||
let lines = req.body.lines;
|
||||
const logs_path = path.join('appdata', 'logs', 'combined.log')
|
||||
@@ -1779,7 +1810,7 @@ app.post('/api/logs', async function(req, res) {
|
||||
});
|
||||
});
|
||||
|
||||
app.post('/api/clearAllLogs', async function(req, res) {
|
||||
app.post('/api/clearAllLogs', optionalJwt, async function(req, res) {
|
||||
const logs_path = path.join('appdata', 'logs', 'combined.log');
|
||||
const logs_err_path = path.join('appdata', 'logs', 'error.log');
|
||||
let success = false;
|
||||
@@ -1798,7 +1829,7 @@ app.post('/api/clearAllLogs', async function(req, res) {
|
||||
});
|
||||
});
|
||||
|
||||
app.post('/api/getFileFormats', async (req, res) => {
|
||||
app.post('/api/getFileFormats', optionalJwt, async (req, res) => {
|
||||
let url = req.body.url;
|
||||
let result = await getUrlInfos(url);
|
||||
res.send({
|
||||
|
||||
@@ -15,22 +15,23 @@ const utils = require('./utils');
|
||||
|
||||
let db_api = null;
|
||||
|
||||
let downloads_setup_done = false;
|
||||
|
||||
const archivePath = path.join(__dirname, 'appdata', 'archives');
|
||||
|
||||
function setDB(input_db_api) { db_api = input_db_api }
|
||||
|
||||
exports.initialize = (input_db_api) => {
|
||||
setDB(input_db_api);
|
||||
setInterval(checkDownloads, 10000);
|
||||
categories_api.initialize(db_api);
|
||||
// temporary
|
||||
db_api.removeAllRecords('download_queue');
|
||||
setupDownloads();
|
||||
}
|
||||
|
||||
exports.createDownload = async (url, type, options) => {
|
||||
const download = {
|
||||
url: url,
|
||||
type: type,
|
||||
title: '',
|
||||
options: options,
|
||||
uid: uuid(),
|
||||
step_index: 0,
|
||||
@@ -45,15 +46,80 @@ exports.createDownload = async (url, type, options) => {
|
||||
return download;
|
||||
}
|
||||
|
||||
exports.pauseDownload = () => {
|
||||
exports.pauseDownload = async (download_uid) => {
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
if (download['paused']) {
|
||||
logger.warn(`Download ${download_uid} is already paused!`);
|
||||
return false;
|
||||
} else if (download['finished']) {
|
||||
logger.info(`Download ${download_uid} could not be paused before completing.`);
|
||||
return false;
|
||||
}
|
||||
|
||||
return await db_api.updateRecord('download_queue', {uid: download_uid}, {paused: true});
|
||||
}
|
||||
|
||||
exports.resumeDownload = async (download_uid) => {
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
if (!download['paused']) {
|
||||
logger.warn(`Download ${download_uid} is not paused!`);
|
||||
return false;
|
||||
}
|
||||
|
||||
return await db_api.updateRecord('download_queue', {uid: download_uid}, {paused: false});
|
||||
}
|
||||
|
||||
exports.restartDownload = async (download_uid) => {
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
await exports.clearDownload(download_uid);
|
||||
const success = !!(await exports.createDownload(download['url'], download['type'], download['options']));
|
||||
return success;
|
||||
}
|
||||
|
||||
exports.cancelDownload = async (download_uid) => {
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
if (download['cancelled']) {
|
||||
logger.warn(`Download ${download_uid} is already cancelled!`);
|
||||
return false;
|
||||
} else if (download['finished']) {
|
||||
logger.info(`Download ${download_uid} could not be cancelled before completing.`);
|
||||
return false;
|
||||
}
|
||||
return await db_api.updateRecord('download_queue', {uid: download_uid}, {cancelled: true});
|
||||
}
|
||||
|
||||
exports.clearDownload = async (download_uid) => {
|
||||
return await db_api.removeRecord('download_queue', {uid: download_uid});
|
||||
}
|
||||
|
||||
// questions
|
||||
// how do we want to manage queued downloads that errored in any step? do we set the index back and finished_step to true or let the manager do it?
|
||||
|
||||
async function setupDownloads() {
|
||||
await fixDownloadState();
|
||||
setInterval(checkDownloads, 10000);
|
||||
}
|
||||
|
||||
async function fixDownloadState() {
|
||||
const downloads = await db_api.getRecords('download_queue');
|
||||
downloads.sort((download1, download2) => download1.timestamp_start - download2.timestamp_start);
|
||||
const running_downloads = downloads.filter(download => !download['finished_step']);
|
||||
for (let i = 0; i < running_downloads.length; i++) {
|
||||
const running_download = running_downloads[i];
|
||||
const update_obj = {finished_step: true, paused: true};
|
||||
if (running_download['step_index'] > 0) {
|
||||
update_obj['step_index'] = running_download['step_index'] - 1;
|
||||
}
|
||||
await db_api.updateRecord('download_queue', {uid: running_download['uid']}, update_obj);
|
||||
}
|
||||
}
|
||||
|
||||
async function checkDownloads() {
|
||||
logger.verbose('Checking downloads');
|
||||
if (!downloads_setup_done) {
|
||||
await setupDownloads();
|
||||
downloads_setup_done = true;
|
||||
}
|
||||
|
||||
const downloads = await db_api.getRecords('download_queue');
|
||||
downloads.sort((download1, download2) => download1.timestamp_start - download2.timestamp_start);
|
||||
const running_downloads = downloads.filter(download => !download['paused'] && download['finished_step']);
|
||||
@@ -65,7 +131,6 @@ async function checkDownloads() {
|
||||
// move to next step
|
||||
|
||||
if (running_download['step_index'] === 0) {
|
||||
|
||||
collectInfo(running_download['uid']);
|
||||
} else if (running_download['step_index'] === 1) {
|
||||
downloadQueuedFile(running_download['uid']);
|
||||
@@ -75,9 +140,12 @@ async function checkDownloads() {
|
||||
}
|
||||
|
||||
async function collectInfo(download_uid) {
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
if (download['paused']) {
|
||||
return;
|
||||
}
|
||||
logger.verbose(`Collecting info for download ${download_uid}`);
|
||||
await db_api.updateRecord('download_queue', {uid: download_uid}, {step_index: 1, finished_step: false});
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
|
||||
const url = download['url'];
|
||||
const type = download['type'];
|
||||
@@ -127,21 +195,26 @@ async function collectInfo(download_uid) {
|
||||
files_to_check_for_progress.push(utils.removeFileExtension(info['_filename']));
|
||||
}
|
||||
|
||||
const playlist_title = Array.isArray(info) ? info[0]['playlist_title'] || info[0]['playlist'] : null;
|
||||
await db_api.updateRecord('download_queue', {uid: download_uid}, {args: args,
|
||||
finished_step: true,
|
||||
options: options,
|
||||
files_to_check_for_progress: files_to_check_for_progress,
|
||||
expected_file_size: expected_file_size
|
||||
expected_file_size: expected_file_size,
|
||||
title: playlist_title ? playlist_title : info['title']
|
||||
});
|
||||
}
|
||||
|
||||
async function downloadQueuedFile(download_uid) {
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
if (download['paused']) {
|
||||
return;
|
||||
}
|
||||
logger.verbose(`Downloading ${download_uid}`);
|
||||
return new Promise(async resolve => {
|
||||
const audioFolderPath = config_api.getConfigItem('ytdl_audio_folder_path');
|
||||
const videoFolderPath = config_api.getConfigItem('ytdl_video_folder_path');
|
||||
await db_api.updateRecord('download_queue', {uid: download_uid}, {step_index: 2, finished_step: false});
|
||||
const download = await db_api.getRecord('download_queue', {uid: download_uid});
|
||||
|
||||
const url = download['url'];
|
||||
const type = download['type'];
|
||||
|
||||
Reference in New Issue
Block a user