107 lines
3.6 KiB
JavaScript
107 lines
3.6 KiB
JavaScript
"use strict";
|
|
|
|
import { PopingNotice } from './view/poping_notice.js';
|
|
import { DownloadForm } from './view/download_form.js';
|
|
import { LoadingModal } from './view/loading_modal.js';
|
|
import { VideoContainer } from './view/video_container.js';
|
|
import { FormatSelector } from './view/format_selector.js';
|
|
|
|
class Application {
|
|
constructor() {
|
|
this.poping_notice = new PopingNotice();
|
|
this.download_form = new DownloadForm(this.onDownloadFormGot.bind(this));
|
|
this.loading_modal = new LoadingModal();
|
|
this.video_container = new VideoContainer();
|
|
this.format_selector = new FormatSelector();
|
|
}
|
|
|
|
init() {
|
|
this.popingNotice.setVisible(true);
|
|
}
|
|
|
|
onDownloadFormGot(url) {
|
|
this.dispatchURL(url);
|
|
}
|
|
|
|
dispatchURL(url, format) {
|
|
this.loadingModal.setVisible(true);
|
|
let error_str;
|
|
let success = this.queryAPI(url, format).then( (response) => {
|
|
if ( response.options !== undefined && response.options.list_formats !== undefined && response.options.list_formats ) {
|
|
if ( response.formats === undefined
|
|
|| response.formats.audio_formats === undefined
|
|
|| response.formats.video_formats === undefined ) {
|
|
throw 'Format object is not valid.';
|
|
}
|
|
this.formatSelector.prepareFormatSelector(
|
|
response.title, response.description,
|
|
response.formats.audio_formats, response.formats.video_formats,
|
|
( id ) => {
|
|
this.loadingModal.setVisible(true);
|
|
this.dispatchURL(url, id);
|
|
});
|
|
this.formatSelector.setVisible(true);
|
|
this.loadingModal.setVisible(false);
|
|
} else {
|
|
this.videoContainer.onCanPlay(this.onCanPlayVideoContainer.bind(this));
|
|
this.videoContainer.setURLVideo(response.url);
|
|
this.videoContainer.setFilename(response.filename);
|
|
}
|
|
}).catch( (error) => {
|
|
error_str = error.toString();
|
|
this.loadingModal.setVisible(false);
|
|
let input_url = document.createElement('a');
|
|
input_url.href = url;
|
|
input_url.innerText = url;
|
|
let issues_url = document.createElement('a');
|
|
issues_url.href = 'https://gitea.sergiotarxz.freemyip.com/sergiotarxz/Peertube-dl/issues';
|
|
issues_url.innerText = 'here';
|
|
this.popingNotice.setMessage( [ 'The url ', input_url, ' is not supported, the error was: ', error_str , ' if you think this is an error, report it ', issues_url, '.' ]);
|
|
this.popingNotice.setVisible(true);
|
|
});
|
|
}
|
|
|
|
onCanPlayVideoContainer() {
|
|
this.videoContainer.setVisible(true);
|
|
this.loadingModal.setVisible(false);
|
|
}
|
|
|
|
async queryAPI(url, format) {
|
|
let request = { url: url };
|
|
if (format !== undefined)
|
|
request.format = format;
|
|
const response = await fetch('/api', {
|
|
method: 'POST',
|
|
mode: 'cors',
|
|
cache: 'no-cache',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify(request),
|
|
});
|
|
return response.json();
|
|
}
|
|
|
|
get formatSelector() {
|
|
return this.format_selector;
|
|
}
|
|
|
|
get videoContainer() {
|
|
return this.video_container;
|
|
}
|
|
|
|
get downloadForm() {
|
|
return this.download_form;
|
|
}
|
|
|
|
get popingNotice() {
|
|
return this.poping_notice;
|
|
}
|
|
|
|
get loadingModal() {
|
|
return this.loading_modal;
|
|
}
|
|
}
|
|
|
|
export { Application };
|