mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-04-14 18:21:29 +03:00
Deprecates normal downloading method. The "safe" method is now always used, and download progress is now estimated using the predicted end file size Thumbnails are now auto downloaded along with the other metadata
124 lines
3.0 KiB
TypeScript
124 lines
3.0 KiB
TypeScript
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
|
|
import { MatDialog } from '@angular/material/dialog';
|
|
import { VideoInfoDialogComponent } from 'app/dialogs/video-info-dialog/video-info-dialog.component';
|
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
|
|
@Component({
|
|
selector: 'app-unified-file-card',
|
|
templateUrl: './unified-file-card.component.html',
|
|
styleUrls: ['./unified-file-card.component.scss']
|
|
})
|
|
export class UnifiedFileCardComponent implements OnInit {
|
|
|
|
// required info
|
|
file_title = '';
|
|
file_length = '';
|
|
file_thumbnail = '';
|
|
type = null;
|
|
elevated = false;
|
|
|
|
// optional vars
|
|
thumbnailBlobURL = null;
|
|
|
|
// input/output
|
|
@Input() loading = true;
|
|
@Input() theme = null;
|
|
@Input() file_obj = null;
|
|
@Input() card_size = 'medium';
|
|
@Input() use_youtubedl_archive = false;
|
|
@Input() is_playlist = false;
|
|
@Input() index: number;
|
|
@Output() goToFile = new EventEmitter<any>();
|
|
@Output() goToSubscription = new EventEmitter<any>();
|
|
@Output() deleteFile = new EventEmitter<any>();
|
|
@Output() editPlaylist = new EventEmitter<any>();
|
|
|
|
/*
|
|
Planned sizes:
|
|
small: 150x175
|
|
medium: 200x200
|
|
big: 250x200
|
|
*/
|
|
|
|
constructor(private dialog: MatDialog, private sanitizer: DomSanitizer) { }
|
|
|
|
ngOnInit(): void {
|
|
if (!this.loading) {
|
|
this.file_length = fancyTimeFormat(this.file_obj.duration);
|
|
}
|
|
|
|
if (this.file_obj && this.file_obj.thumbnailBlob) {
|
|
const mime = getMimeByFilename(this.file_obj.thumbnailPath);
|
|
const blob = new Blob([new Uint8Array(this.file_obj.thumbnailBlob.data)], {type: mime});
|
|
const bloburl = URL.createObjectURL(blob);
|
|
this.thumbnailBlobURL = this.sanitizer.bypassSecurityTrustUrl(bloburl);
|
|
}
|
|
}
|
|
|
|
emitDeleteFile(blacklistMode = false) {
|
|
this.deleteFile.emit({
|
|
file: this.file_obj,
|
|
index: this.index,
|
|
blacklistMode: blacklistMode
|
|
});
|
|
}
|
|
|
|
navigateToFile() {
|
|
this.goToFile.emit(this.file_obj);
|
|
}
|
|
|
|
navigateToSubscription() {
|
|
this.goToSubscription.emit(this.file_obj);
|
|
}
|
|
|
|
openFileInfoDialog() {
|
|
this.dialog.open(VideoInfoDialogComponent, {
|
|
data: {
|
|
file: this.file_obj,
|
|
},
|
|
minWidth: '50vw'
|
|
})
|
|
}
|
|
|
|
emitEditPlaylist() {
|
|
this.editPlaylist.emit({
|
|
playlist: this.file_obj,
|
|
index: this.index
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
function fancyTimeFormat(time) {
|
|
if (typeof time === 'string') {
|
|
return time;
|
|
}
|
|
// Hours, minutes and seconds
|
|
const hrs = ~~(time / 3600);
|
|
const mins = ~~((time % 3600) / 60);
|
|
const secs = ~~time % 60;
|
|
|
|
// Output like "1:01" or "4:03:59" or "123:03:59"
|
|
let ret = '';
|
|
|
|
if (hrs > 0) {
|
|
ret += '' + hrs + ':' + (mins < 10 ? '0' : '');
|
|
}
|
|
|
|
ret += '' + mins + ':' + (secs < 10 ? '0' : '');
|
|
ret += '' + secs;
|
|
return ret;
|
|
}
|
|
|
|
function getMimeByFilename(name) {
|
|
switch (name.substring(name.length-4, name.length)) {
|
|
case '.jpg':
|
|
return 'image/jpeg';
|
|
case '.png':
|
|
return 'image/png';
|
|
case 'webp':
|
|
return 'image/webp';
|
|
default:
|
|
return null;
|
|
}
|
|
} |