diff --git a/backend/app.js b/backend/app.js index ef87782..98facb1 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1117,6 +1117,7 @@ async function downloadFileByURL_exec(url, type, options, sessionID = null) { if (!downloads[session]) downloads[session] = {}; downloads[session][download_uid] = { uid: download_uid, + ui_uid: options.ui_uid, downloading: true, complete: false, url: url, @@ -1231,6 +1232,7 @@ async function downloadFileByURL_normal(url, type, options, sessionID = null) { if (!downloads[session]) downloads[session] = {}; downloads[session][download_uid] = { uid: download_uid, + ui_uid: options.ui_uid, downloading: true, complete: false, url: url, @@ -1686,7 +1688,8 @@ app.post('/api/tomp3', async function(req, res) { maxBitrate: req.body.maxBitrate, customQualityConfiguration: req.body.customQualityConfiguration, youtubeUsername: req.body.youtubeUsername, - youtubePassword: req.body.youtubePassword + youtubePassword: req.body.youtubePassword, + ui_uid: req.body.ui_uid } const is_playlist = url.includes('playlist'); @@ -1711,7 +1714,8 @@ app.post('/api/tomp4', async function(req, res) { selectedHeight: req.body.selectedHeight, customQualityConfiguration: req.body.customQualityConfiguration, youtubeUsername: req.body.youtubeUsername, - youtubePassword: req.body.youtubePassword + youtubePassword: req.body.youtubePassword, + ui_uid: req.body.ui_uid } const is_playlist = url.includes('playlist'); @@ -2443,6 +2447,30 @@ app.get('/api/audio/:id', function(req , res){ res.send({downloads: downloads}); }); + app.post('/api/download', async (req, res) => { + var session_id = req.body.session_id; + var download_id = req.body.download_id; + let found_download = null; + + // find download + if (downloads[session_id] && Object.keys(downloads[session_id])) { + let session_downloads = Object.values(downloads[session_id]); + for (let i = 0; i < session_downloads.length; i++) { + let session_download = session_downloads[i]; + if (session_download && session_download['ui_uid'] === download_id) { + found_download = session_download; + break; + } + } + } + + if (found_download) { + res.send({download: found_download}); + } else { + res.send({download: null}); + } + }); + app.post('/api/clearDownloads', async (req, res) => { let success = false; var delete_all = req.body.delete_all; diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index 84fe86e..46079fa 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -170,11 +170,11 @@
-
- +
+
-
+
diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 69d4813..708674b 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -284,6 +284,13 @@ export class MainComponent implements OnInit { if (youtubeUsername && youtubeUsername !== 'null') { this.youtubeUsername = youtubeUsername }; } + // get downloads routine + setInterval(() => { + if (this.current_download) { + this.getCurrentDownload(); + } + }, 500); + return true; }, error => { @@ -587,7 +594,7 @@ export class MainComponent implements OnInit { } this.postsService.makeMP3(this.url, (this.selectedQuality === '' ? null : this.selectedQuality), - customQualityConfiguration, customArgs, customOutput, youtubeUsername, youtubePassword).subscribe(posts => { + customQualityConfiguration, customArgs, customOutput, youtubeUsername, youtubePassword, new_download.uid).subscribe(posts => { // update download object new_download.downloading = false; new_download.percent_complete = 100; @@ -595,6 +602,8 @@ export class MainComponent implements OnInit { const is_playlist = !!(posts['file_names']); this.path = is_playlist ? posts['file_names'] : posts['audiopathEncoded']; + this.current_download = null; + if (this.path !== '-1') { this.downloadHelperMp3(this.path, posts['uid'], is_playlist, false, new_download); } @@ -627,7 +636,7 @@ export class MainComponent implements OnInit { const customQualityConfiguration = this.getSelectedVideoFormat(); this.postsService.makeMP4(this.url, (this.selectedQuality === '' ? null : this.selectedQuality), - customQualityConfiguration, customArgs, customOutput, youtubeUsername, youtubePassword).subscribe(posts => { + customQualityConfiguration, customArgs, customOutput, youtubeUsername, youtubePassword, new_download.uid).subscribe(posts => { // update download object new_download.downloading = false; new_download.percent_complete = 100; @@ -635,6 +644,8 @@ export class MainComponent implements OnInit { const is_playlist = !!(posts['file_names']); this.path = is_playlist ? posts['file_names'] : posts['videopathEncoded']; + this.current_download = null; + if (this.path !== '-1') { this.downloadHelperMp4(this.path, posts['uid'], is_playlist, false, new_download); } @@ -1124,4 +1135,21 @@ export class MainComponent implements OnInit { } }); } + + getCurrentDownload() { + this.postsService.getCurrentDownload(this.postsService.session_id, + this.current_download['ui_uid'] ? this.current_download['ui_uid'] : this.current_download['uid']).subscribe(res => { + const ui_uid = this.current_download['ui_uid'] ? this.current_download['ui_uid'] : this.current_download['uid']; + if (res['download']) { + console.log('got new download'); + if (ui_uid === res['download']['ui_uid']) { + this.current_download = res['download']; + this.percentDownloaded = this.current_download.percent_complete; + console.log(this.percentDownloaded); + } + } else { + console.log('failed to get new download'); + } + }); + } } diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index a34de62..2a0b997 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -68,25 +68,27 @@ export class PostsService { } // tslint:disable-next-line: max-line-length - makeMP3(url: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null) { + makeMP3(url: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, ui_uid = null) { return this.http.post(this.path + 'tomp3', {url: url, maxBitrate: selectedQuality, customQualityConfiguration: customQualityConfiguration, customArgs: customArgs, customOutput: customOutput, youtubeUsername: youtubeUsername, - youtubePassword: youtubePassword}, this.httpOptions); + youtubePassword: youtubePassword, + ui_uid: ui_uid}, this.httpOptions); } // tslint:disable-next-line: max-line-length - makeMP4(url: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null) { + makeMP4(url: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, ui_uid = null) { return this.http.post(this.path + 'tomp4', {url: url, selectedHeight: selectedQuality, customQualityConfiguration: customQualityConfiguration, customArgs: customArgs, customOutput: customOutput, youtubeUsername: youtubeUsername, - youtubePassword: youtubePassword}, this.httpOptions); + youtubePassword: youtubePassword, + ui_uid: ui_uid}, this.httpOptions); } getFileStatusMp3(name: string) { @@ -225,6 +227,11 @@ export class PostsService { return this.http.get(this.path + 'downloads', this.httpOptions); } + // current download + getCurrentDownload(session_id, download_id) { + return this.http.post(this.path + 'download', {download_id: download_id, session_id: session_id}, this.httpOptions); + } + // clear downloads. download_id is optional, if it exists only 1 download will be cleared clearDownloads(delete_all = false, session_id = null, download_id = null) { return this.http.post(this.path + 'clearDownloads', {delete_all: delete_all,