mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-03-20 19:50:58 +03:00
281 lines
8.1 KiB
TypeScript
281 lines
8.1 KiB
TypeScript
import { Component, OnInit } from '@angular/core';
|
|
import { PostsService } from 'app/posts.services';
|
|
import { Router } from '@angular/router';
|
|
|
|
@Component({
|
|
selector: 'app-recent-videos',
|
|
templateUrl: './recent-videos.component.html',
|
|
styleUrls: ['./recent-videos.component.scss']
|
|
})
|
|
export class RecentVideosComponent implements OnInit {
|
|
|
|
cached_file_count = 0;
|
|
loading_files = null;
|
|
|
|
normal_files_received = false;
|
|
subscription_files_received = false;
|
|
files: any[] = null;
|
|
filtered_files: any[] = null;
|
|
downloading_content = {'video': {}, 'audio': {}};
|
|
search_mode = false;
|
|
search_text = '';
|
|
searchIsFocused = false;
|
|
descendingMode = true;
|
|
filterProperties = {
|
|
'registered': {
|
|
'key': 'registered',
|
|
'label': 'Download Date',
|
|
'property': 'registered'
|
|
},
|
|
'upload_date': {
|
|
'key': 'upload_date',
|
|
'label': 'Upload Date',
|
|
'property': 'upload_date'
|
|
},
|
|
'name': {
|
|
'key': 'name',
|
|
'label': 'Name',
|
|
'property': 'title'
|
|
},
|
|
'file_size': {
|
|
'key': 'file_size',
|
|
'label': 'File Size',
|
|
'property': 'size'
|
|
},
|
|
'duration': {
|
|
'key': 'duration',
|
|
'label': 'Duration',
|
|
'property': 'duration'
|
|
}
|
|
};
|
|
filterProperty = this.filterProperties['upload_date'];
|
|
|
|
constructor(public postsService: PostsService, private router: Router) {
|
|
// get cached file count
|
|
if (localStorage.getItem('cached_file_count')) {
|
|
this.cached_file_count = +localStorage.getItem('cached_file_count');
|
|
this.loading_files = Array(this.cached_file_count).fill(0);
|
|
}
|
|
}
|
|
|
|
ngOnInit(): void {
|
|
if (this.postsService.initialized) {
|
|
this.getAllFiles();
|
|
}
|
|
|
|
this.postsService.service_initialized.subscribe(init => {
|
|
if (init) {
|
|
this.getAllFiles();
|
|
}
|
|
});
|
|
|
|
|
|
// set filter property to cached
|
|
const cached_filter_property = localStorage.getItem('filter_property');
|
|
if (cached_filter_property && this.filterProperties[cached_filter_property]) {
|
|
this.filterProperty = this.filterProperties[cached_filter_property];
|
|
}
|
|
}
|
|
|
|
// search
|
|
|
|
onSearchInputChanged(newvalue) {
|
|
if (newvalue.length > 0) {
|
|
this.search_mode = true;
|
|
this.filterFiles(newvalue);
|
|
} else {
|
|
this.search_mode = false;
|
|
this.filtered_files = this.files;
|
|
}
|
|
}
|
|
|
|
private filterFiles(value: string) {
|
|
const filterValue = value.toLowerCase();
|
|
this.filtered_files = this.files.filter(option => option.id.toLowerCase().includes(filterValue));
|
|
}
|
|
|
|
filterByProperty(prop) {
|
|
if (this.descendingMode) {
|
|
this.filtered_files = this.filtered_files.sort((a, b) => (a[prop] > b[prop] ? -1 : 1));
|
|
} else {
|
|
this.filtered_files = this.filtered_files.sort((a, b) => (a[prop] > b[prop] ? 1 : -1));
|
|
}
|
|
}
|
|
|
|
filterOptionChanged(value) {
|
|
this.filterByProperty(value['property']);
|
|
localStorage.setItem('filter_property', value['key']);
|
|
}
|
|
|
|
toggleModeChange() {
|
|
this.descendingMode = !this.descendingMode;
|
|
this.filterByProperty(this.filterProperty['property']);
|
|
}
|
|
|
|
// get files
|
|
|
|
getAllFiles() {
|
|
this.normal_files_received = false;
|
|
this.postsService.getAllFiles().subscribe(res => {
|
|
this.files = res['files'];
|
|
this.files.forEach(file => {
|
|
file.duration = typeof file.duration !== 'string' ? file.duration : this.durationStringToNumber(file.duration);
|
|
});
|
|
this.files.sort(this.sortFiles);
|
|
if (this.search_mode) {
|
|
this.filterFiles(this.search_text);
|
|
} else {
|
|
this.filtered_files = this.files;
|
|
}
|
|
this.filterByProperty(this.filterProperty['property']);
|
|
|
|
// set cached file count for future use, note that we convert the amount of files to a string
|
|
localStorage.setItem('cached_file_count', '' + this.files.length);
|
|
|
|
this.normal_files_received = true;
|
|
});
|
|
}
|
|
|
|
// navigation
|
|
|
|
goToFile(file) {
|
|
if (this.postsService.config['Extra']['download_only_mode']) {
|
|
this.downloadFile(file);
|
|
} else {
|
|
this.navigateToFile(file);
|
|
}
|
|
}
|
|
|
|
navigateToFile(file) {
|
|
localStorage.setItem('player_navigator', this.router.url);
|
|
if (file.sub_id) {
|
|
const sub = this.postsService.getSubscriptionByID(file.sub_id);
|
|
if (sub.streamingOnly) {
|
|
this.router.navigate(['/player', {name: file.id,
|
|
url: file.requested_formats ? file.requested_formats[0].url : file.url}]);
|
|
} else {
|
|
this.router.navigate(['/player', {fileNames: file.id,
|
|
type: file.isAudio ? 'audio' : 'video', subscriptionName: sub.name,
|
|
subPlaylist: sub.isPlaylist}]);
|
|
}
|
|
} else {
|
|
this.router.navigate(['/player', {type: file.isAudio ? 'audio' : 'video', uid: file.uid}]);
|
|
}
|
|
}
|
|
|
|
goToSubscription(file) {
|
|
this.router.navigate(['/subscription', {id: file.sub_id}]);
|
|
}
|
|
|
|
// downloading
|
|
|
|
downloadFile(file) {
|
|
if (file.sub_id) {
|
|
this.downloadSubscriptionFile(file);
|
|
} else {
|
|
this.downloadNormalFile(file);
|
|
}
|
|
}
|
|
|
|
downloadSubscriptionFile(file) {
|
|
const type = file.isAudio ? 'audio' : 'video';
|
|
const ext = type === 'audio' ? '.mp3' : '.mp4'
|
|
const sub = this.postsService.getSubscriptionByID(file.sub_id);
|
|
this.postsService.downloadFileFromServer(file.id, type, null, null, sub.name, sub.isPlaylist,
|
|
this.postsService.user ? this.postsService.user.uid : null, null).subscribe(res => {
|
|
const blob: Blob = res;
|
|
saveAs(blob, file.id + ext);
|
|
}, err => {
|
|
console.log(err);
|
|
});
|
|
}
|
|
|
|
downloadNormalFile(file) {
|
|
const type = file.isAudio ? 'audio' : 'video';
|
|
const ext = type === 'audio' ? '.mp3' : '.mp4'
|
|
const name = file.id;
|
|
this.downloading_content[type][name] = true;
|
|
this.postsService.downloadFileFromServer(name, type).subscribe(res => {
|
|
this.downloading_content[type][name] = false;
|
|
const blob: Blob = res;
|
|
saveAs(blob, decodeURIComponent(name) + ext);
|
|
|
|
if (!this.postsService.config.Extra.file_manager_enabled) {
|
|
// tell server to delete the file once downloaded
|
|
this.postsService.deleteFile(name, false).subscribe(delRes => {
|
|
// reload mp4s
|
|
this.getAllFiles();
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
// deleting
|
|
|
|
deleteFile(args) {
|
|
const file = args.file;
|
|
const index = args.index;
|
|
const blacklistMode = args.blacklistMode;
|
|
|
|
if (file.sub_id) {
|
|
this.deleteSubscriptionFile(file, index, blacklistMode);
|
|
} else {
|
|
this.deleteNormalFile(file, index, blacklistMode);
|
|
}
|
|
}
|
|
|
|
deleteNormalFile(file, index, blacklistMode = false) {
|
|
this.postsService.deleteFile(file.uid, file.isAudio, blacklistMode).subscribe(result => {
|
|
if (result) {
|
|
this.postsService.openSnackBar('Delete success!', 'OK.');
|
|
this.files.splice(index, 1);
|
|
} else {
|
|
this.postsService.openSnackBar('Delete failed!', 'OK.');
|
|
}
|
|
}, err => {
|
|
this.postsService.openSnackBar('Delete failed!', 'OK.');
|
|
});
|
|
}
|
|
|
|
deleteSubscriptionFile(file, index, blacklistMode = false) {
|
|
if (blacklistMode) {
|
|
this.deleteForever(file, index);
|
|
} else {
|
|
this.deleteAndRedownload(file, index);
|
|
}
|
|
}
|
|
|
|
deleteAndRedownload(file, index) {
|
|
const sub = this.postsService.getSubscriptionByID(file.sub_id);
|
|
this.postsService.deleteSubscriptionFile(sub, file.id, false, file.uid).subscribe(res => {
|
|
this.postsService.openSnackBar(`Successfully deleted file: '${file.id}'`);
|
|
this.files.splice(index, 1);
|
|
});
|
|
}
|
|
|
|
deleteForever(file, index) {
|
|
const sub = this.postsService.getSubscriptionByID(file.sub_id);
|
|
this.postsService.deleteSubscriptionFile(sub, file.id, true, file.uid).subscribe(res => {
|
|
this.postsService.openSnackBar(`Successfully deleted file: '${file.id}'`);
|
|
this.files.splice(index, 1);
|
|
});
|
|
}
|
|
|
|
// sorting and filtering
|
|
|
|
sortFiles(a, b) {
|
|
// uses the 'registered' flag as the timestamp
|
|
const result = b.registered - a.registered;
|
|
return result;
|
|
}
|
|
|
|
durationStringToNumber(dur_str) {
|
|
let num_sum = 0;
|
|
const dur_str_parts = dur_str.split(':');
|
|
for (let i = dur_str_parts.length-1; i >= 0; i--) {
|
|
num_sum += parseInt(dur_str_parts[i])*(60**(dur_str_parts.length-1-i));
|
|
}
|
|
return num_sum;
|
|
}
|
|
}
|