From 3cbb517d640a188d6e5b43da9735f61b2f4af910 Mon Sep 17 00:00:00 2001 From: Isaac Grynsztein Date: Sun, 8 Mar 2020 22:21:34 -0400 Subject: [PATCH] cleaned up some code youtube-dl commands are now simulated and displayed in the advanced panel --- src/app/main/main.component.html | 1 + src/app/main/main.component.ts | 121 +++++++++++++++++++++++++++---- 2 files changed, 107 insertions(+), 15 deletions(-) diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index 0e51343..4c6807a 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -69,6 +69,7 @@ Advanced +

Simulated command: {{this.simulatedOutput}}

diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 4a8d950..41c33f4 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ElementRef, ViewChild, ViewChildren, QueryList, isDevMode } from '@angular/core'; +import { Component, OnInit, ElementRef, ViewChild, ViewChildren, QueryList } from '@angular/core'; import {PostsService} from '../posts.services'; import {FileCardComponent} from '../file-card/file-card.component'; import { Observable } from 'rxjs/Observable'; @@ -45,6 +45,7 @@ export class MainComponent implements OnInit { iOS = false; + // local settings determinateProgress = false; downloadingfile = false; audioOnly: boolean; @@ -63,15 +64,19 @@ export class MainComponent implements OnInit { percentDownloaded: number; autoStartDownload = false; - // settings + // global settings fileManagerEnabled = false; allowQualitySelect = false; downloadOnlyMode = false; allowMultiDownloadMode = false; audioFolderPath; videoFolderPath; + globalCustomArgs = null; allowAdvancedDownload = false; + useDefaultDownloadingAgent = true; + customDownloadingAgent = null; + // formats cache cachedAvailableFormats = {}; // youtube api @@ -202,6 +207,8 @@ export class MainComponent implements OnInit { is_playlist: false }; + simulatedOutput = ''; + constructor(private postsService: PostsService, private youtubeSearch: YoutubeSearchService, public snackBar: MatSnackBar, private router: Router, public dialog: MatDialog, private platform: Platform, private route: ActivatedRoute) { this.audioOnly = false; @@ -214,11 +221,15 @@ export class MainComponent implements OnInit { this.allowMultiDownloadMode = result['YoutubeDLMaterial']['Extra']['allow_multi_download_mode']; this.audioFolderPath = result['YoutubeDLMaterial']['Downloader']['path-audio']; this.videoFolderPath = result['YoutubeDLMaterial']['Downloader']['path-video']; + this.globalCustomArgs = result['YoutubeDLMaterial']['Downloader']['custom_args']; this.youtubeSearchEnabled = result['YoutubeDLMaterial']['API'] && result['YoutubeDLMaterial']['API']['use_youtube_API'] && result['YoutubeDLMaterial']['API']['youtube_API_key']; this.youtubeAPIKey = this.youtubeSearchEnabled ? result['YoutubeDLMaterial']['API']['youtube_API_key'] : null; this.allowQualitySelect = result['YoutubeDLMaterial']['Extra']['allow_quality_select']; this.allowAdvancedDownload = result['YoutubeDLMaterial']['Advanced']['allow_advanced_download']; + this.useDefaultDownloadingAgent = result['YoutubeDLMaterial']['Advanced']['use_default_downloading_agent']; + this.customDownloadingAgent = result['YoutubeDLMaterial']['Advanced']['custom_downloading_agent']; + if (this.fileManagerEnabled) { @@ -259,6 +270,8 @@ export class MainComponent implements OnInit { this.downloadClicked(); } + setInterval(() => this.getSimulatedOutput(), 1000); + }, error => { console.log(error); }); @@ -547,11 +560,7 @@ export class MainComponent implements OnInit { let customQualityConfiguration = null; if (this.selectedQuality !== '') { - const cachedFormatsExists = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; - if (cachedFormatsExists) { - const audio_formats = this.cachedAvailableFormats[this.url]['formats']['audio']; - customQualityConfiguration = audio_formats[this.selectedQuality]['format_id']; - } + customQualityConfiguration = this.getSelectedAudioFormat(); } this.postsService.makeMP3(this.url, (this.selectedQuality === '' ? null : this.selectedQuality), @@ -584,14 +593,7 @@ export class MainComponent implements OnInit { if (!this.current_download && !this.multiDownloadMode) { this.current_download = new_download }; this.downloadingfile = true; - let customQualityConfiguration = null; - const cachedFormatsExists = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; - if (cachedFormatsExists) { - const video_formats = this.cachedAvailableFormats[this.url]['formats']['video']; - if (video_formats['best_audio_format'] && this.selectedQuality !== '') { - customQualityConfiguration = video_formats[this.selectedQuality]['format_id'] + '+' + video_formats['best_audio_format']; - } - } + const customQualityConfiguration = this.getSelectedVideoFormat(); this.postsService.makeMP4(this.url, (this.selectedQuality === '' ? null : this.selectedQuality), customQualityConfiguration, customArgs, customOutput, youtubeUsername, youtubePassword).subscribe(posts => { @@ -632,6 +634,29 @@ export class MainComponent implements OnInit { this.current_download = null; } + getSelectedAudioFormat() { + if (this.selectedQuality === '') { return null }; + const cachedFormatsExists = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; + if (cachedFormatsExists) { + const audio_formats = this.cachedAvailableFormats[this.url]['formats']['audio']; + return audio_formats[this.selectedQuality]['format_id']; + } else { + return null; + } + } + + getSelectedVideoFormat() { + if (this.selectedQuality === '') { return null }; + const cachedFormatsExists = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; + if (cachedFormatsExists) { + const video_formats = this.cachedAvailableFormats[this.url]['formats']['video']; + if (video_formats['best_audio_format'] && this.selectedQuality !== '') { + return video_formats[this.selectedQuality]['format_id'] + '+' + video_formats['best_audio_format']; + } + } + return null; + } + getDownloadByUID(uid) { const index = this.downloads.findIndex(download => download.uid === uid); if (index !== -1) { @@ -774,6 +799,72 @@ export class MainComponent implements OnInit { } } + getSimulatedOutput() { + const customArgsExists = this.customArgsEnabled && this.customArgs; + + const full_string_array: string[] = []; + const base_string_array = ['youtube-dl', this.url]; + + if (customArgsExists) { + this.simulatedOutput = base_string_array.join(' ') + ' ' + this.customArgs; + return this.simulatedOutput; + } + + full_string_array.push(...base_string_array); + + const base_path = this.audioOnly ? this.audioFolderPath : this.videoFolderPath; + const ext = this.audioOnly ? '.mp3' : '.mp4'; + // gets output + let output_string_array = ['-o', base_path + '%(title)s' + ext]; + if (this.customOutputEnabled && this.customOutput) { + output_string_array = ['-o', this.customOutput + ext]; + } + // before pushing output, should check if using an external downloader + if (!this.useDefaultDownloadingAgent && this.customDownloadingAgent === 'aria2c') { + full_string_array.push('--external-downloader', 'aria2c'); + } + // pushes output + full_string_array.push(...output_string_array); + + // logic splits into audio and video modes + if (this.audioOnly) { + // adds base audio string + const format_array = []; + const audio_format = this.getSelectedAudioFormat(); + if (audio_format) { + format_array.push('-f', audio_format); + } else if (this.selectedQuality) { + format_array.push('--audio-quality', this.selectedQuality); + } + + // pushes formats + full_string_array.splice(2, 0, ...format_array); + + const additional_params = ['-x', '--audio-format', 'mp3', '--write-info-json', '--print-json']; + + full_string_array.push(...additional_params); + } else { + // adds base video string + let format_array = ['-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4']; + const video_format = this.getSelectedVideoFormat(); + if (video_format) { + format_array = ['-f', video_format]; + } else if (this.selectedQuality) { + format_array = [`bestvideo[height=${this.selectedQuality}]+bestaudio/best[height=${this.selectedQuality}]`]; + } + + // pushes formats + full_string_array.splice(2, 0, ...format_array); + + const additional_params = ['--write-info-json', '--print-json']; + + full_string_array.push(...additional_params); + } + + this.simulatedOutput = full_string_array.join(' '); + return this.simulatedOutput; + } + errorFormats(url) { this.cachedAvailableFormats[url]['formats_loading'] = false; console.error('Could not load formats for url ' + url);