"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 };