Added Playlist Strict mode and Item limits

This commit is contained in:
Pawel Derehajlo
2024-08-18 11:07:59 +02:00
parent ceede47841
commit c675db1ae5
7 changed files with 94 additions and 20 deletions

View File

@@ -94,6 +94,24 @@
<span class="input-group-text">Custom Name Prefix</span>
<input type="text" autocomplete="off" spellcheck="false" class="form-control" placeholder="Default" name="customNamePrefix" [(ngModel)]="customNamePrefix" [disabled]="addInProgress || downloads.loading">
</div>
<div class="add-url-component">
<div class="row align-items-center">
<div class="col-6">
<div class="input-group ms-1">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" name="playlistStrictMode" [(ngModel)]="playlistStrictMode" [disabled]="addInProgress || downloads.loading">
<label class="form-check-label">Strict Playlist mode</label>
</div>
</div>
</div>
<div class="col-6">
<div class="input-group">
<span class="input-group-text">Items limit</span>
<input type="number" min="0" autocomplete="off" class="form-control" placeholder="Default" name="playlistItemLimit" (keydown)="isNumber($event)" [(ngModel)]="playlistItemLimit" [disabled]="addInProgress || downloads.loading">
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -55,3 +55,7 @@ td
.disabled
opacity: 0.5
pointer-events: none
.form-switch
input
margin-top: 5px

View File

@@ -24,6 +24,8 @@ export class AppComponent implements AfterViewInit {
folder: string;
customNamePrefix: string;
autoStart: boolean;
playlistStrictMode: boolean;
playlistItemLimit: number;
addInProgress = false;
themes: Theme[] = Themes;
activeTheme: Theme;
@@ -37,7 +39,6 @@ export class AppComponent implements AfterViewInit {
@ViewChild('doneClearFailed') doneClearFailed: ElementRef;
@ViewChild('doneRetryFailed') doneRetryFailed: ElementRef;
faTrashAlt = faTrashAlt;
faCheckCircle = faCheckCircle;
faTimesCircle = faTimesCircle;
@@ -60,6 +61,7 @@ export class AppComponent implements AfterViewInit {
}
ngOnInit() {
this.getConfiguration();
this.customDirs$ = this.getMatchingCustomDir();
this.setTheme(this.activeTheme);
@@ -129,6 +131,18 @@ export class AppComponent implements AfterViewInit {
}));
}
getConfiguration() {
this.downloads.configurationChanged.subscribe({
next: (config) => {
this.playlistStrictMode = config['DEFAULT_OPTION_PLAYLIST_STRICT_MODE'];
const playlistItemLimit = config['DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT'];
if (playlistItemLimit !== '0') {
this.playlistItemLimit = playlistItemLimit;
}
}
});
}
getPreferredTheme(cookieService: CookieService) {
let theme = 'auto';
if (cookieService.check('metube_theme')) {
@@ -179,17 +193,19 @@ export class AppComponent implements AfterViewInit {
this.quality = exists ? this.quality : 'best'
}
addDownload(url?: string, quality?: string, format?: string, folder?: string, customNamePrefix?: string, autoStart?: boolean) {
addDownload(url?: string, quality?: string, format?: string, folder?: string, customNamePrefix?: string, playlistStrictMode?: boolean, playlistItemLimit?: number, autoStart?: boolean) {
url = url ?? this.addUrl
quality = quality ?? this.quality
format = format ?? this.format
folder = folder ?? this.folder
customNamePrefix = customNamePrefix ?? this.customNamePrefix
playlistStrictMode = playlistStrictMode ?? this.playlistStrictMode
playlistItemLimit = playlistItemLimit ?? this.playlistItemLimit
autoStart = autoStart ?? this.autoStart
console.debug('Downloading: url='+url+' quality='+quality+' format='+format+' folder='+folder+' customNamePrefix='+customNamePrefix+' autoStart='+autoStart);
console.debug('Downloading: url='+url+' quality='+quality+' format='+format+' folder='+folder+' customNamePrefix='+customNamePrefix+' playlistStrictMode='+playlistStrictMode+' playlistItemLimit='+playlistItemLimit+' autoStart='+autoStart);
this.addInProgress = true;
this.downloads.add(url, quality, format, folder, customNamePrefix, autoStart).subscribe((status: Status) => {
this.downloads.add(url, quality, format, folder, customNamePrefix, playlistStrictMode, playlistItemLimit, autoStart).subscribe((status: Status) => {
if (status.status === 'error') {
alert(`Error adding URL: ${status.msg}`);
} else {
@@ -204,7 +220,7 @@ export class AppComponent implements AfterViewInit {
}
retryDownload(key: string, download: Download) {
this.addDownload(download.url, download.quality, download.format, download.folder, download.custom_name_prefix, true);
this.addDownload(download.url, download.quality, download.format, download.folder, download.custom_name_prefix, download.playlist_strict_mode, download.playlist_item_limit, true);
this.downloads.delById('done', [key]).subscribe();
}
@@ -248,4 +264,11 @@ export class AppComponent implements AfterViewInit {
identifyDownloadRow(index: number, row: KeyValue<string, Download>) {
return row.key;
}
isNumber(event) {
const charCode = (event.which) ? event.which : event.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
event.preventDefault();
}
}
}

View File

@@ -17,6 +17,8 @@ export interface Download {
format: string;
folder: string;
custom_name_prefix: string;
playlist_strict_mode: boolean;
playlist_item_limit: number;
status: string;
msg: string;
percent: number;
@@ -37,6 +39,7 @@ export class DownloadsService {
queueChanged = new Subject();
doneChanged = new Subject();
customDirsChanged = new Subject();
configurationChanged = new Subject();
configuration = {};
customDirs = {};
@@ -85,6 +88,7 @@ export class DownloadsService {
let data = JSON.parse(strdata);
console.debug("got configuration:", data);
this.configuration = data;
this.configurationChanged.next(data);
});
socket.fromEvent('custom_dirs').subscribe((strdata: string) => {
let data = JSON.parse(strdata);
@@ -99,8 +103,8 @@ export class DownloadsService {
return of({status: 'error', msg: msg})
}
public add(url: string, quality: string, format: string, folder: string, customNamePrefix: string, autoStart: boolean) {
return this.http.post<Status>('add', {url: url, quality: quality, format: format, folder: folder, custom_name_prefix: customNamePrefix, auto_start: autoStart}).pipe(
public add(url: string, quality: string, format: string, folder: string, customNamePrefix: string, playlistStrictMode: boolean, playlistItemLimit: number, autoStart: boolean) {
return this.http.post<Status>('add', {url: url, quality: quality, format: format, folder: folder, custom_name_prefix: customNamePrefix, playlist_strict_mode: playlistStrictMode, playlist_item_limit: playlistItemLimit, auto_start: autoStart}).pipe(
catchError(this.handleHTTPError)
);
}