@ -48,6 +48,7 @@ exports.createDownload = async (url, type, options, user_uid = null, sub_id = nu
uid : uuid ( ) ,
step _index : 0 ,
paused : false ,
running : false ,
finished _step : true ,
error : null ,
percent _complete : null ,
@ -71,7 +72,7 @@ exports.pauseDownload = async (download_uid) => {
return false ;
}
return await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { paused : true }) ;
return await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { paused : true , running : false }) ;
}
exports . resumeDownload = async ( download _uid ) => {
@ -106,7 +107,7 @@ exports.cancelDownload = async (download_uid) => {
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 }) ;
return await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { cancelled : true , running : false }) ;
}
exports . clearDownload = async ( download _uid ) => {
@ -127,7 +128,7 @@ async function fixDownloadState() {
const running _downloads = downloads . filter ( download => ! download [ 'finished' ] && ! download [ 'error' ] ) ;
for ( let i = 0 ; i < running _downloads . length ; i ++ ) {
const running _download = running _downloads [ i ] ;
const update _obj = { finished _step : true , paused : true };
const update _obj = { finished _step : true , paused : true , running : false };
if ( running _download [ 'step_index' ] > 0 ) {
update _obj [ 'step_index' ] = running _download [ 'step_index' ] - 1 ;
}
@ -151,18 +152,19 @@ async function checkDownloads() {
return ;
} ) ;
let running _downloads _count = downloads . filter ( download => download [ 'running' ] ) . length ;
const waiting _downloads = downloads . filter ( download => ! download [ 'paused' ] && download [ 'finished_step' ] && ! download [ 'finished' ] ) ;
for ( let i = 0 ; i < waiting _downloads . length ; i ++ ) {
const runn ing_download = waiting _downloads [ i ] ;
if ( i == = 5 /*config_api.getConfigItem('ytdl_max_concurrent_downloads')*/ ) break ;
const wait ing_download = waiting _downloads [ i ] ;
if ( running_downloads _count > = 5 /*config_api.getConfigItem('ytdl_max_concurrent_downloads')*/ ) break ;
if ( runn ing_download [ 'finished_step' ] && ! runn ing_download [ 'finished' ] ) {
if ( wait ing_download [ 'finished_step' ] && ! wait ing_download [ 'finished' ] ) {
// move to next step
if ( runn ing_download [ 'step_index' ] === 0 ) {
collectInfo ( runn ing_download [ 'uid' ] ) ;
} else if ( runn ing_download [ 'step_index' ] === 1 ) {
downloadQueuedFile ( runn ing_download [ 'uid' ] ) ;
running _downloads _count ++ ;
if ( wait ing_download [ 'step_index' ] === 0 ) {
collectInfo ( wait ing_download [ 'uid' ] ) ;
} else if ( wait ing_download [ 'step_index' ] === 1 ) {
downloadQueuedFile ( wait ing_download [ 'uid' ] ) ;
}
}
}
@ -174,7 +176,7 @@ async function collectInfo(download_uid) {
return ;
}
logger . verbose ( ` Collecting info for download ${ download _uid } ` ) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { step _index : 1 , finished _step : false }) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { step _index : 1 , finished _step : false , running : true }) ;
const url = download [ 'url' ] ;
const type = download [ 'type' ] ;
@ -194,7 +196,7 @@ async function collectInfo(download_uid) {
if ( ! info ) {
// info failed, record error and pause download
const error = 'Failed to get info, see server logs for specific error.' ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { error : error , paused : true }) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { error : error , paused : true , running : false }) ;
return ;
}
@ -227,6 +229,7 @@ async function collectInfo(download_uid) {
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 ,
running : false ,
options : options ,
files _to _check _for _progress : files _to _check _for _progress ,
expected _file _size : expected _file _size ,
@ -243,7 +246,7 @@ async function downloadQueuedFile(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 }) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { step _index : 2 , finished _step : false , running : true }) ;
const url = download [ 'url' ] ;
const type = download [ 'type' ] ;
@ -355,7 +358,7 @@ async function downloadQueuedFile(download_uid) {
}
const file _uids = file _objs . map ( file _obj => file _obj . uid ) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { finished _step : true , finished : true , step_index : 3 , percent _complete : 100 , file _uids : file _uids , container : container } ) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { finished _step : true , finished : true , running: false , step_index : 3 , percent _complete : 100 , file _uids : file _uids , container : container } ) ;
resolve ( ) ;
}
} ) ;
@ -544,7 +547,7 @@ async function getVideoInfoByURL(url, args = [], download_uid = null) {
logger . error ( ` Error while retrieving info on video with URL ${ url } with the following message: output JSON could not be parsed. Output JSON: ${ output } ` ) ;
if ( download _uid ) {
const error = 'Failed to get info, see server logs for specific error.' ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { error : error , paused : true }) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { error : error , paused : true , running : false }) ;
}
resolve ( null ) ;
}
@ -555,7 +558,7 @@ async function getVideoInfoByURL(url, args = [], download_uid = null) {
}
if ( download _uid ) {
const error = 'Failed to get info, see server logs for specific error.' ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { error : error , paused : true }) ;
await db _api . updateRecord ( 'download_queue' , { uid : download _uid } , { error : error , paused : true , running : false }) ;
}
resolve ( null ) ;
}