Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/monara/public_html/test.athavaneng.com/themes.php on line 99

Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 226

Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 227

Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 228

Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 229

Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 230

Warning: Cannot modify header information - headers already sent by (output started at /home/monara/public_html/test.athavaneng.com/themes.php:1) in /home/monara/public_html/test.athavaneng.com/themes.php on line 231
var TimelineItem = function(args) { args = args || {}; this.type = 'range'; this.group = args.group; this.id = args.id; this.start = args.start; this.end = args.end; this.className = args.group; this.title = args.title; switch (args.group) { case 'crop': this.title = 'Вырезка'; break; case 'mute': this.title = 'Отключение звука'; break; case 'overlay': this.title = 'Наложение'; break; } this.position_content = function() { if (this.group != 'overlay') return ''; return ' ' + App.utils.positionStr(this.position) + ''; }; this.time_content = function() { return ( '
' + App.utils.msToTime(this.start) + ' - ' + App.utils.msToTime(this.end) + '
' ); }; this.update_content = function() { this.content = this.title + this.position_content() + this.time_content(); // App.effects.updateItem(this); // App.effects.data.update(this); }; this.set_range = function(start, end) { this.start = start; this.end = end; this.update_content(); }; this.set_position = function(rect) { if (this.group === 'overlay') { this.position = { x1: rect.x1, y1: rect.y1, x2: rect.x2, y2: rect.y2, }; this.update_content(); } }; if (args.position) this.set_position(args.position); this.update_content(); }; var App = { dataUrl: '', streamerUrl: '', authHeader: undefined, effects: { data: [], overlayItems: {}, cropTimes: [], cropTimesCount: 0, timeline: { options: { delay: 0, paused: true, useFrames: false, smoothChildTiming: false, }, gsap: {}, update: function(callback) { var t = this.gsap.time(); this.gsap.clear(); App.effects.cropTimes = []; var i = 0; App.effects.data.forEach( function(effect) { if (effect.group == 'overlay') { App.effects.timeline.gsap.set('#overlay' + effect.id, { display: 'none' }, 0); //opacity:0 App.effects.timeline.gsap.set( '#overlay' + effect.id, { display: 'block' }, effect.start / 1000, ); App.effects.timeline.gsap.set( '#overlay' + effect.id, { display: 'none' }, effect.end / 1000, ); } else if (effect.group == 'mute') { } else { App.effects.cropTimes[i++] = [effect.start, effect.end]; } }, { type: { start: 'Number', end: 'Number' }, order: 'start' }, ); App.effects.cropTimesCount = i; this.gsap.time(t); if (typeof callback === 'function') { callback(); } }, jumpTo: function(time) { this.gsap.time(time); }, setDuration: function(duration) { this.gsap.startTime(0); this.update(); }, checkCrop: function(time) { //in ms for (i = 0; i < App.effects.cropTimesCount; i++) { if (time > App.effects.cropTimes[i][0] && time < App.effects.cropTimes[i][1]) { App.player.jumpTo(App.effects.cropTimes[i][1]); // App.player.vjs.currentTime(App.effects.cropTimes[i][1]/1000); break; } } }, checkMute: function(time) { App.player.volume || 1; var mutes = App.effects.data.get({ type: { start: 'Number', end: 'Number' }, filter: function(it) { return it.group == 'mute' && it.start <= time && it.end >= time; }, }); App.player.vjs.muted(mutes.length > 0); }, }, timeRange: { options: { type: 'double', grid: true, values_separator: ' → ', keyboard: true, drag_interval: true, min: 0, from: 1000, min_interval: 5000, force_edges: true, max: 300000, to: 30000, step: 100, keyboard_step: 1, //in % prettify_enabled: true, prettify: function(num) { return App.utils.msToTime(num); }, onChange: function(data) {}, onUpdate: function(data) {}, }, slider: {}, getValue: function() { return { start: this.slider.result.from, end: this.slider.result.to, max: this.slider.options.max, }; }, setRange: function(duration) { this.slider.update({ max: duration, }); }, }, positionRange: { options: { type: 'double', grid: true, values_separator: ' → ', keyboard: true, drag_interval: true, min: 0, from: 10, min_interval: 10, step: 1, force_edges: true, keyboard_step: 1, //in % prettify_enabled: false, postfix: 'px', onChange: function() { App.effects.container.tester.reposition(App.effects.positionRange.getValue()); }, }, optionsX: { prefix: 'X=', max: 640, to: 200, }, optionsY: { prefix: 'Y=', max: 480, to: 200, }, sliderX: {}, sliderY: {}, getValue: function() { return { x1: this.sliderX.result.from, x2: this.sliderX.result.to, y1: this.sliderY.result.from, y2: this.sliderY.result.to, }; }, setRange: function(video) { this.sliderX.update({ max: video.width, }); this.sliderY.update({ max: video.height, }); }, }, container: { element: {}, resize: function(dimentions) { this.element.height(dimentions.height); this.element.width(dimentions.width); }, tester: { element: {}, timer: {}, show: function() { clearTimeout(this.timer); this.element.css('display', 'block'); this.timer = setTimeout(function() { App.effects.container.tester.element.css('display', 'none'); }, 5000); }, reposition: function(position) { this.element.css({ left: position.x1 * App.player.currentMeta.videoScale, top: position.y1 * App.player.currentMeta.videoScale, width: (position.x2 - position.x1) * App.player.currentMeta.videoScale, height: (position.y2 - position.y1) * App.player.currentMeta.videoScale, }); this.show(); }, }, }, newItem: function(group) { var item_id = Math.floor(Math.random() * 9000) + 1000, item_time = App.effects.timeRange.getValue(), item_pos = App.effects.positionRange.getValue(); var item_title = 'Наложение'; switch (group) { case 'crop': item_title = 'Вырезка'; break; case 'mute': item_title = 'Отключение звука'; break; case 'overlay': item_title = 'Наложение'; break; } var new_item = new TimelineItem({ id: item_id, group: group, start: item_time.start, end: item_time.end, position: item_pos, }); // new_item.set_position(item_pos, true); // new_item.set_range(item_time.start, item_time.end, true); if (new_item.group != 'overlay') { this.checkCropCrossing(new_item, function(ok) { if (ok) { App.effects.data.add(new_item); } else { alert( 'Неудачно выбран диапазон.\n Попробуйте указать другой диапазон, чтобы не пересекаться с имеющимися элементами группы "' + new_item.title + '".', ); } }); } else { App.effects.data.add(new_item); App.effects.overlayItems['overlay' + item_id] = $( "
", ); App.effects.container.element.append(App.effects.overlayItems['overlay' + item_id]); App.effects.overlayItems['overlay' + item_id] .resizable({ handles: 'n, e, s, w', resize: App.effects.resizeOverlayElement, }) .css({ left: new_item.position.x1 * App.player.currentMeta.videoScale, top: new_item.position.y1 * App.player.currentMeta.videoScale, width: (new_item.position.x2 - new_item.position.x1) * App.player.currentMeta.videoScale, height: (new_item.position.y2 - new_item.position.y1) * App.player.currentMeta.videoScale, }); } this.timeline.update(); }, resizeOverlayElement: function(evt, ui) { var id = $(this).data('item'); var it = App.effects.data.get(id, { type: { start: 'Number', end: 'Number' } }); var x1 = ui.position.left; var y1 = ui.position.top; var x2 = ui.position.left + ui.size.width; var y2 = ui.position.top + ui.size.height; var video_scale = App.metaByTime(it.start).videoScale; it.set_position({ x1: (x1 / video_scale) ^ 0, y1: (y1 / video_scale) ^ 0, x2: (x2 / video_scale) ^ 0, y2: (y2 / video_scale) ^ 0, }); App.effects.updateItem(it); }, setupExternalData: function() { App.effects.data.forEach( function(effect) { if (!App.effects.overlayItems['overlay' + effect.id]) { App.effects.overlayItems['overlay' + effect.id] = $( "
", ); App.effects.container.element.append(App.effects.overlayItems['overlay' + effect.id]); } App.effects.overlayItems['overlay' + effect.id] .resizable({ handles: 'n, e, s, w', resize: App.effects.resizeOverlayElement, }) .css({ left: effect.position.x1 * App.player.currentMeta.videoScale, // App.player.source.data.video_scale, top: effect.position.y1 * App.player.currentMeta.videoScale, // App.player.source.data.video_scale, width: (effect.position.x2 - effect.position.x1) * App.player.currentMeta.videoScale, // App.player.source.data.video_scale, height: (effect.position.y2 - effect.position.y1) * App.player.currentMeta.videoScale, // App.player.source.data.video_scale }); }, { type: { start: 'Number', end: 'Number' }, order: 'start', filter: function(it) { return it.group == 'overlay'; }, }, ); App.effects.data.forEach(function(effect) { effect.update_content(); }); this.timeline.update(); }, deleteItem: function(id) { App.effects.overlayItems['overlay' + id].remove(); delete App.effects.overlayItems['overlay' + id]; this.timeline.update(); }, updateItem: function(item) { App.effects.data.update(item); var wasPlaying = !App.player.vjs.paused(); if (wasPlaying) App.player.vjs.pause(); this.timeline.update(function() { if (wasPlaying) App.player.vjs.play(); }); }, checkCropCrossing: function(checking_item, callback) { if (typeof checking_item.start != 'number') { checking_item.start = checking_item.start.getTime(); } if (typeof checking_item.start != 'number') { checking_item.end = checking_item.end.getTime(); } var crossing_items = App.effects.data.get({ type: { start: 'Number', end: 'Number' }, filter: function(filter_item) { return ( filter_item.id != checking_item.id && filter_item.group == 'crop' && checking_item.group == 'crop' && ((filter_item.start >= checking_item.start && filter_item.end <= checking_item.end) || (filter_item.start < checking_item.start && filter_item.end > checking_item.start) || (filter_item.start < checking_item.end && filter_item.end > checking_item.end) || filter_item.start == checking_item.end || filter_item.end == checking_item.start) ); }, }); if (crossing_items.length > 0) { callback(false); } else { callback(true); } }, checkUpdateAllowed: function(item, callback) { if (item.group === 'crop') { this.checkCropCrossing(item, function(ok) { if (ok) { // item.content = 'Вырезка
' + App.utils.msToTime(item.start) + ' - ' + App.utils.msToTime(item.end) +'
'; item.update_content(); callback(item); App.effects.updateItem(item); } else { callback(false); alert('Элементы даннной группы не могут пересекаться.'); } }); } else if (item.group === 'mute') { // item.content = 'Отключение звука
' + App.utils.msToTime(item.start) + ' - ' + App.utils.msToTime(item.end) +'
'; item.update_content(); callback(item); this.updateItem(item); } else { // item.content = 'Наложение ' + App.utils.positionStr(item.position) +'' + '
' + App.utils.msToTime(item.start) + ' - ' + App.utils.msToTime(item.end) +'
'; item.update_content(); callback(item); this.updateItem(item); } }, loadData: function(data) { App.effects.data.clear(); App.effects.data.add(data); this.setupExternalData(); // App.timeline.vis.fit(); }, startProcessing: function() { var data = this.getData(); $.ajax({ type: 'POST', url: `${App.streamerUrl}streamer/api/v3/file_processor/jobs`, data: JSON.stringify(data), success: function(success) { App.showModal(success.id, 'files/' + success.id); }, headers: { Authorization: App.authHeader, }, contentType: 'application/json', dataType: 'json', }); }, getData: function() { var filters = App.effects.data.get({ type: { start: 'Number', end: 'Number' }, fields: ['group', 'start', 'end', 'position', 'title'], }); const formattedFilters = filters.map((filterItem) => { let result = { group: filterItem.group, start: filterItem.start, stop: filterItem.end, }; if (filterItem.group === 'overlay') { result.position = filterItem.position; } return result; }); var data = { id: App.data.id, title: App.data.title, date: App.data.date, output_file: App.data.output_file, input_files: App.data.input_files, filters: formattedFilters, }; return data; }, returnToOpener: function() { // if (window.opener) { // if (window.opener.name) { // window.open("",window.opener.name); // } // else { // window.opener.focus(); // } // } window.close(); }, cancel: function() { var fields = ['group', 'start', 'end', 'position']; var currentFilters = JSON.stringify(this.getData().filters, fields); var originalFilters = JSON.stringify(App.originalData.filters, fields); if ( currentFilters == originalFilters || confirm('Вы уверены, что хотите закрыть редактор без сохранения данных?') ) { this.returnToOpener(); } }, saveData: function() { if (!confirm('Вы уверены, что хотите сохранить отредактированную версию видеозаписи?')) return; var self = this; var data = self.getData(); $.ajax({ type: 'PUT', xhrFields: { withCredentials: true }, url: App.dataUrl, //dataType: 'json', async: true, data: JSON.stringify(data), }) .success(function(result) { // alert('Данные успешно сохранены'); console.log('success', result); self.returnToOpener(); }) .error(function(error) { alert('Проблема при сохранении данных'); console.log('error', error); }); }, init: function(callback) { this.data = new vis.DataSet([]); this.timeline.gsap = new TimelineLite(App.effects.timeline.options); this.container.element = $('#vep_player_effects_container'); this.container.tester.element = $('#vep_player_effects_tester'); $('#effects_time_range').ionRangeSlider(this.timeRange.options); this.timeRange.slider = $('#effects_time_range').data('ionRangeSlider'); $('#effects_position_x').ionRangeSlider( $.extend({}, this.positionRange.options, this.positionRange.optionsX), ); this.positionRange.sliderX = $('#effects_position_x').data('ionRangeSlider'); $('#effects_position_y').ionRangeSlider( $.extend({}, this.positionRange.options, this.positionRange.optionsY), ); this.positionRange.sliderY = $('#effects_position_y').data('ionRangeSlider'); $('#filter_crop_add_btn').click(function() { App.effects.newItem('crop'); }); $('#filter_mute_add_btn').click(function() { App.effects.newItem('mute'); }); $('#filter_overlay_add_btn').click(function() { App.effects.newItem('overlay'); }); $('#external_data_save_btn').click(function() { App.effects.saveData(); }); $('#external_data_start_btn').click(function() { App.effects.startProcessing(); }); if (typeof callback === 'function') { callback(); } }, }, player: { options: { controls: true, autoplay: false, preload: false, poster: '', loop: false, }, vjs: {}, init: function(callback) { App.player.vjs = videojs('vep_app_player', App.player.options, function() { this.on('loadedmetadata', function() { // console.log('isLoading', App.player.isLoading, 'seekRequested', App.player.seekRequested); App.player.isLoading = false; App.effects.setupExternalData(); if (App.player.seekRequested) App.player.jumpTo(App.player.seekRequested); }); this.on('play', function() { this.autoplay(false); }); this.on('ended', function() { var t = (App.player.currentMeta.startMs + this.currentTime() * 1000) ^ 0; console.log('The audio has ended', t); this.autoplay(true); App.player.jumpTo(t); }); this.on('timeupdate', function() { // time (by player) - floating point number like 84.961814 (sec) var t = (App.player.currentMeta.startMs + this.currentTime() * 1000) ^ 0; $('#vep_player_current_time').html(App.utils.msToTime(t)); App.effects.timeline.checkCrop(t); App.effects.timeline.checkMute(t); App.timeline.playerTime.setTime(t); App.effects.timeline.jumpTo(t / 1000); }); if (typeof callback === 'function') { callback(); } }); }, source: { data: { src: '', width: 0, height: 0, duration: 0, }, }, open: function(video_meta) { this.isLoading = true; this.currentMeta = video_meta; this.vjs.src(video_meta.url); }, jumpTo: function(time) { if (this.isLoading) { this.seekRequested = time; return; } var current = App.metaByTime(time); if (!current) return; if (this.currentMeta && current.idx == this.currentMeta.idx) { var jump = time - current.startMs; this.seekRequested = false; this.vjs.currentTime(jump / 1000); } else { this.seekRequested = time; this.open(current); } // time in milliseconds }, }, timeline: { vis: {}, options: { align: 'auto', selectable: true, multiselect: false, multiselectPerGroup: false, editable: { add: false, remove: true, updateGroup: false, updateTime: true, }, groupEditable: false, groupOrder: 'order', min: 0, start: 0, end: 60000, // 1 min max: 300000, // 5 min throttleRedraw: 10, showCurrentTime: false, moveable: true, zoomable: true, zoomMax: 18000000, //5 hours zoomMin: 100, //ms orientation: { axis: 'top', item: 'top', }, margin: { axis: 5, item: { horizontal: 0, vertical: 10, }, }, showMajorLabels: false, showMinorLabels: true, format: { minorLabels: { millisecond: 'HH:mm:ss.SSS', second: 'HH:mm:ss.SS', minute: 'HH:mm:ss', hour: 'HH:mm:ss', weekday: 'ddd D', day: 'D', month: 'MMM', year: 'YYYY', }, majorLabels: { millisecond: 'HH:mm:ss', second: 'HH:mm', minute: 'HH', hour: 'ddd D MMMM', weekday: 'MMMM YYYY', day: 'MMMM YYYY', month: 'YYYY', year: '', }, }, moment: function(date) { return vis.moment(date).utc(); }, onUpdate: function(item, callback) { App.effects.checkUpdateAllowed(item, function(checked_item) { if (checked_item) { callback(checked_item); App.effects.updateItem(item); } else { callback(null); } }); }, onMove: function(item, callback) { App.effects.checkUpdateAllowed(item, function(checked_item) { if (checked_item) { callback(checked_item); App.effects.updateItem(item); } else { callback(null); } }); }, onRemove: function(item, callback) { if (item.group == 'overlay') { App.effects.deleteItem(item.id); } callback(item); }, }, onSelect: function(item) {}, playerTime: { id: 'ved_timeline_player_time', setTime: function(ms) { App.timeline.vis.setCustomTime(ms, this.id); App.timeline.vis.moveTo(ms, false); }, setDuration: function(duration) { App.timeline.vis.setOptions({ end: duration, max: duration, }); }, }, init: function(callback) { this.vis = new vis.Timeline( document.getElementById('vep_timeline'), App.effects.data, this.options, ); var groups = [ { id: 'crop', content: 'Вырезка', className: 'crop-group', title: 'Группа фильтров обрезки видео', }, { id: 'mute', content: 'Отключение звука', className: 'mute-group', title: 'Группа фильтров тишины', }, { id: 'overlay', content: 'Наложение', className: 'overlay-group', title: 'Группа фильтров наложения', }, ]; this.vis.setGroups(groups); this.playerTime.id = this.vis.addCustomTime(1, this.playerTime.id); this.vis.on('timechange', function(event) { App.player.jumpTo(event.time.getTime()); }); this.vis.on('select', function(evt) { if (evt.items.length == 1) { App.timeline.onSelect(App.effects.data.get(evt.items[0])); } }); if (typeof callback === 'function') { callback(); } }, }, utils: { msToTime: function(mill) { var ms, secs, mins, hrs; ms = mill % 1000; s = (mill - ms) / 1000; secs = s % 60; s = (s - secs) / 60; mins = s % 60; hrs = (s - mins) / 60; return ( (hrs < 10 ? '0' : '') + hrs + ':' + ((mins < 10 ? '0' : '') + mins) + ':' + ((secs < 10 ? '0' : '') + secs) + '.' + ((ms < 10 ? '00' : ms < 100 ? '0' : '') + ms) ); }, positionStr: function(it) { return it.x1 + ',' + it.y1 + '-' + it.x2 + ',' + it.y2; }, }, modalCheckTimer: null, closeModal: function() { clearTimeout(this.modalCheckTimer); this.modalCheckTimer = null; $('.vep-modal-title').text(''); $('.vep-modal-title').attr('href', ''); $('.vep-modal-video').attr('src', ''); $('.vep-modal').addClass('hidden'); }, showModal: function(id, src) { $('.vep-modal-title').text(id); $('.vep-modal').removeClass('hidden'); $('.vep-modal-progress').val(0); var fnCheck = function() { const self = this; clearTimeout(this.modalCheckTimer); self.modalCheckTimer = null; $.ajax({ type: 'GET', url: `${App.streamerUrl}streamer/api/v3/file_processor/jobs/${encodeURIComponent(id)}`, success: function(response) { if (response.status === 'done') { $('.vep-modal-title').attr('href', src); $('.vep-modal-video') .show() .attr('src', src); $('.vep-modal-progress').val(100); } else if (response.status === 'error') { $('.vep-modal-video').hide(); $('.vep-modal-video-container') .append($('

Error

')) .append( $('
').text( response.errors.map((errorItem) => errorItem.title).join(', '), ), ); } else if (response.progress >= 0) { $('.vep-modal-progress').val(response.progress); self.modalCheckTimer = setTimeout(fnCheck, 1000); } }, headers: { Authorization: App.authHeader, }, contentType: 'application/json', dataType: 'json', }); }; fnCheck.bind(this)(); }, setActiveTab: function(target_id) { $('#filter_pane_' + target_id) .siblings() .slideUp('slow', function() { $('#filter_pane_' + target_id).slideDown('slow'); }); $(); $('#filter_tab_' + target_id) .addClass('active') .siblings() .removeClass('active'); }, title: function(title, date) { $('head title').text('Дело ' + title + ' от ' + date); $('.project-title .title').text(title); $('.project-title .date').text(date); }, error: function(text) { $('.vep-player-not-initialized span').html(text); }, metaByTime: function(timeMs) { var files = App.data.videoInfo.metadata; var selected = files.filter(function(it) { return timeMs >= it.startMs && timeMs < it.stopMs; }); if (selected.length == 0) return null; return selected[0]; }, init: function(callback) { var totalDuration = App.data.videoInfo.totalDuration; var firstVideo = App.data.videoInfo.metadata[0]; var videoWidth = firstVideo.width * firstVideo.videoScale; var videoHeight = firstVideo.height * firstVideo.videoScale; $('#project_video_items').css('opacity', '1'); $('.filter-nav .nav-item:not(active)').click(function() { var target_id = $(this).attr('target'); App.setActiveTab(target_id); }); App.effects.init(function() { App.timeline.init(function() { App.timeline.playerTime.setDuration((totalDuration * 1000) ^ 0); App.effects.timeRange.setRange((totalDuration * 1000) ^ 0); App.effects.timeline.setDuration(totalDuration); App.effects.setupExternalData(); App.effects.positionRange.setRange({ width: firstVideo.width, height: firstVideo.height, }); App.effects.container.resize({ width: videoWidth, height: videoHeight, }); App.player.init(function() { var $content = $(App.player.vjs.contentEl()); setTimeout(function() { $content.height(videoHeight); $content.width(videoWidth); }, 1); $('.vep-modal-close').click(function() { App.closeModal(); }); $('.vep-player-not-initialized').fadeOut(); $("#project_video_items option[value='']").remove(); $('.filter-container').css('opacity', '1'); App.player.jumpTo(0); if (typeof callback === 'function') { callback(); } }); }); }); }, }; function loadData(url) { return $.ajax({ url: url, xhrFields: { withCredentials: true } }); } function isDebug() { var found = window.location.search.match(/debug=([^&]+)/); return found && found[1] == '1'; } function calcDurationAsync(urls, timeout) { timeout = timeout || 3000; var result = $.Deferred(); var loadPromises = urls.map(function(url, idx) { var vid = document.createElement('video'); vid.autoPlay = false; var d = $.Deferred(); var t = setTimeout(function() { d.reject({ msg: 'Таймаут ожидания загрузки видео (' + idx + ')', data: url }); }, timeout); vid.onerror = function() { clearTimeout(t); d.reject({ msg: 'Проблема загрузки видео (' + idx + ')', data: url, args: Array.prototype.slice.call(arguments), }); }; vid.onloadedmetadata = function() { clearTimeout(t); d.resolve({ idx: idx, url: url, duration: vid.duration, width: vid.videoWidth, height: vid.videoHeight, videoScale: 480 / vid.videoHeight, }); vid = null; }; vid.src = url; return d; }); var total_timeout = setTimeout(function() { result.reject('Таймаут ожидания загрузки видео'); }, timeout * 3); $.when .apply($, loadPromises) .fail(function(f) { result.reject(f); }) .then(function() { window.clearTimeout(total_timeout); var metadata = Array.prototype.slice.call(arguments); metadata.forEach(function(it, idx) { var prev = idx == 0 ? { stopMs: 0 } : metadata[idx - 1]; it.startMs = prev.stopMs; it.stopMs = (it.startMs + it.duration * 1000) ^ 0; }); var totalDuration = metadata.reduce(function(acc, m) { return m.duration + acc; }, 0); result.resolve({ totalDuration: totalDuration, metadata: metadata, }); }); return result; } $(function() { $('#external_data_cancel_btn').click(function() { App.effects.cancel(); }); const searchParams = new URLSearchParams(window.location.search); App.dataUrl = decodeURIComponent(searchParams.get('data-url') ?? ''); const streamerUrl = decodeURIComponent(searchParams.get('streamer-url') ?? ''); if (streamerUrl) { const streamerUrlOb = new URL(streamerUrl); const login = decodeURIComponent(streamerUrlOb.username); const password = decodeURIComponent(streamerUrlOb.password); if (login && password) { App.authHeader = `Basic ${window.btoa(`${login}:${password}`)}`; } App.streamerUrl = `${streamerUrlOb.origin}${streamerUrlOb.pathname}`; } else { // если не указан streamerUrl, то используем dataUrl App.streamerUrl = App.dataUrl; } if (isDebug()) { $('#external_data_save_btn').show(); } if (!App.dataUrl) { App.error('Сервер данных недоступен'); return; } loadData(App.dataUrl) .error(function() { console.log('error', arguments); App.error('Сервер данных недоступен'); }) .success(function(data) { if (typeof data != 'object') { App.error('Некорректные начальные данные'); return; } calcDurationAsync(data.input_files) .fail(function(fail) { console.log('video error', fail); if (typeof fail == 'object' && fail.msg) { App.error(fail.msg); } else { App.error(fail); } }) .then(function(info) { $('#external_data_save_btn').show(); App.data = data; App.originalData = JSON.parse(JSON.stringify(data)); App.data.videoInfo = info; App.title(data.title || 'не указано', data.date || 'не указано'); App.init(function() { App.effects.loadData( data.filters.map(function(it) { return new TimelineItem(it); }), ); }); }); }); });