From b3c91abab3b69bb9417fffdeeb72aeb640fe6f3b Mon Sep 17 00:00:00 2001 From: yumata <91452496+yumata@users.noreply.github.com> Date: Fri, 24 Oct 2025 17:25:44 +0300 Subject: [PATCH] Release of the new version 3.0 --- app.min.js | 37173 +++++++++++++++++++++++++++--------------------- assembly.json | 12 +- css/app.css | 1665 ++- lang/be.js | 60 +- lang/bg.js | 59 +- lang/cs.js | 59 +- lang/en.js | 59 +- lang/he.js | 59 +- lang/pt.js | 59 +- lang/ru.js | 59 +- lang/uk.js | 59 +- lang/zh.js | 59 +- 12 files changed, 22936 insertions(+), 16446 deletions(-) diff --git a/app.min.js b/app.min.js index 29837c0..46f05c3 100644 --- a/app.min.js +++ b/app.min.js @@ -102,6 +102,13 @@ }; } + if (!('replaceWith' in Element.prototype)) { + Element.prototype.replaceWith = function (newElem) { + if (this.parentNode) this.parentNode.replaceChild(newElem instanceof jQuery ? newElem[0] : newElem, this); + return this; + }; + } + if (!('empty' in Element.prototype)) { Element.prototype.empty = function () { this.innerHTML = ''; @@ -109,19 +116,40 @@ }; } - if (!('append' in Element.prototype)) { - Element.prototype.append = function (child) { - this.appendChild(child); - return this; - }; - } + Element.prototype.append = function (child) { + var _this4 = this; + + if (Object.prototype.toString.call(child) === '[object Array]') { + child.forEach(function (c) { + _this4.appendChild(c instanceof jQuery ? c[0] : c); + }); + } else this.appendChild(child instanceof jQuery ? child[0] : child); + + return this; + }; + + Element.prototype.prepend = function (child) { + var _this5 = this; + + if (Object.prototype.toString.call(child) === '[object Array]') { + child.forEach(function (c) { + _this5.insertBefore(c instanceof jQuery ? c[0] : c, _this5.firstChild); + }); + } else this.insertBefore(child instanceof jQuery ? child[0] : child, this.firstChild); + + return this; + }; + + Element.prototype.hasClass = function (className) { + return this.classList.contains(className); + }; if (!('on' in Element.prototype)) { Element.prototype.on = function (on, call, options) { - var _this4 = this; + var _this6 = this; on.split(' ').forEach(function (e) { - _this4.addEventListener(e, call, options); + _this6.addEventListener(e, call, options); }); return this; }; @@ -144,7 +172,14 @@ v = +v; return v - v % 1 || (!isFinite(v) || v === 0 ? v : v < 0 ? -0 : 0); }; - } + } // Polyfill для requestAnimationFrame + + + window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { + return setTimeout(function () { + callback(Date.now()); + }, 1000 / 60); + }; if (!Array.from) { Array.from = function () { @@ -1550,6 +1585,63 @@ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + function _createForOfIteratorHelper(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + + if (!it) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + + var F = function () {}; + + return { + s: F, + n: function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }, + e: function (e) { + throw e; + }, + f: F + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var normalCompletion = true, + didErr = false, + err; + return { + s: function () { + it = it.call(o); + }, + n: function () { + var step = it.next(); + normalCompletion = step.done; + return step; + }, + e: function (e) { + didErr = true; + err = e; + }, + f: function () { + try { + if (!normalCompletion && it.return != null) it.return(); + } finally { + if (didErr) throw err; + } + } + }; + } + /** * @this {Promise} */ @@ -1957,11 +2049,9 @@ var object$2 = { author: 'Yumata', github: 'https://github.com/yumata/lampa-source', - github_lampa: 'https://yumata.github.io/lampa/', - css_version: '2.7.0', - app_version: '2.4.7', - cub_site: 'cub.rip', - cdn_url: 'http://lampa.mx/' + css_version: '3.0.0', + app_version: '3.0.0', + cub_site: 'cub.rip' }; var plugins$1 = []; Object.defineProperty(object$2, 'app_digital', { @@ -1984,6 +2074,16 @@ } } }); + /** + * Ссылка на GitHub с файлами приложения + */ + + Object.defineProperty(object$2, 'github_lampa', { + get: function get() { + return window.lampa_settings.fix_widget ? 'http://lampa.mx/' : 'https://yumata.github.io/lampa/'; + }, + set: function set() {} + }); /** * Старые зеркала, которые не используются больше, но могут быть полезны для обратной совместимости */ @@ -2037,177 +2137,29 @@ return object$2.cub_mirrors.indexOf(use) > -1 ? use : object$2.cub_mirrors[0]; } }); + /** + * Ссылка на сайт CUB + */ - function toObject(a) { - if (Object.prototype.toString.call(a) === '[object Object]') return a;else { - a = {}; - return a; + Object.defineProperty(object$2, 'qr_site', { + get: function get() { + return object$2.cub_domain + '/img/other/qr-code-strong.png'; } - } + }); + /** + * Ссылка на QR для добавления устройства + */ - function toArray(a) { - if (Object.prototype.toString.call(a) === '[object Object]') { - var b = []; - - for (var i in a) { - b.push(a[i]); - } - - return b; - } else if (typeof a == 'string' || a == null || typeof a == 'number' || typeof a == 'undefined') return [];else return a; - } - - function decodeJson(string, empty) { - var json = empty || {}; - - if (string) { - try { - json = JSON.parse(string); - } catch (e) {} + Object.defineProperty(object$2, 'qr_device_add', { + get: function get() { + return object$2.cub_domain + '/img/other/qr-add-device.png'; } + }); - return json; - } - - function isObject(a) { - return Object.prototype.toString.call(a) === '[object Object]'; - } - - function isArray(a) { - return Object.prototype.toString.call(a) === '[object Array]'; - } - - function extend(a, b, replase) { - for (var i in b) { - if (_typeof(b[i]) == 'object') { - if (a[i] == undefined) a[i] = Object.prototype.toString.call(b[i]) == '[object Array]' ? [] : {}; - this.extend(a[i], b[i], replase); - } else if (a[i] == undefined || replase) a[i] = b[i]; - } - } - - function empty$1(a, b) { - for (var i in b) { - if (!a[i]) a[i] = b[i]; - } - } - - function getKeys(a, add) { - var k = add || []; - - for (var i in a) { - k.push(i); - } - - return k; - } - - function getValues(a, add) { - var k = add || []; - - for (var i in a) { - k.push(a[i]); - } - - return k; - } - - function remove$4(from, need) { - var inx = from.indexOf(need); - if (inx >= 0) from.splice(inx, 1); - } - - function clone$1(a) { - return JSON.parse(JSON.stringify(a)); - } - - function insert(where, index, item) { - where.splice(index, 0, item); - } - - function destroy$b(arr) { - var call_function = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'destroy'; - var value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - var where = toArray(arr); - - for (var i = where.length - 1; i >= 0; i--) { - if (where[i] && where[i][call_function]) where[i][call_function](value); - } - } - - function groupBy(xs, key) { - return xs.reduce(function (rv, x) { - (rv[x[key]] = rv[x[key]] || []).push(x); - return rv; - }, {}); - } - - function removeNoIncludes(where, items) { - for (var i = where.length - 1; i >= 0; i--) { - if (items.indexOf(where[i]) === -1) remove$4(where, where[i]); - } - - return where; - } - - function shuffle(array) { - for (var i = array.length - 1; i > 0; i--) { - var j = Math.floor(Math.random() * (i + 1)); - var temp = array[i]; - array[i] = array[j]; - array[j] = temp; - } - - return array; - } - - function shuffleArrayFromIndex(array, startIndex) { - if (startIndex < 0 || startIndex >= array.length) { - return; - } - - for (var i = array.length - 1; i > startIndex; i--) { - // Выбираем случайный индекс от startIndex до i - var j = Math.floor(Math.random() * (i - startIndex + 1)) + startIndex; // Меняем местами элементы array[i] и array[j] - - var _ref = [array[j], array[i]]; - array[i] = _ref[0]; - array[j] = _ref[1]; - } - } - - function removeDuplicates(array, key) { - var seen = []; - return array.filter(function (a) { - if (seen.indexOf(a[key]) == -1) { - seen.push(a[key]); - return true; - } else return false; - }); - } - - var Arrays = { - toObject: toObject, - toArray: toArray, - decodeJson: decodeJson, - isObject: isObject, - isArray: isArray, - extend: extend, - getKeys: getKeys, - getValues: getValues, - insert: insert, - clone: clone$1, - remove: remove$4, - destroy: destroy$b, - empty: empty$1, - groupBy: groupBy, - removeNoIncludes: removeNoIncludes, - shuffle: shuffle, - shuffleArrayFromIndex: shuffleArrayFromIndex, - removeDuplicates: removeDuplicates - }; - - function Subscribe() { + /** + * Подписка на события + */ + function Subscribe$1() { this.add = function (type, listener) { if (this._listeners === undefined) this._listeners = {}; var listeners = this._listeners; @@ -2270,347 +2222,615 @@ }; } - function start$8() { - return new Subscribe(); + var Subscribe$2 = (function () { + return new Subscribe$1(); + }); + + function toObject(a) { + if (Object.prototype.toString.call(a) === '[object Object]') return a;else { + a = {}; + return a; + } } - var html$23 = "
\n
\n
\n \n\n
\n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n
\n \n \n \n \n \n
\n
\n\n
\n \n \n \n
\n\n
\n \n
\n
\n \n \n \n \n
\n\n
\n \n \n \n \n
\n\n
\n \n \n \n \n
\n\n
\n \n \n \n
\n\n
\n \n \n \n
\n\n
\n \n \n \n \n
\n\n
\n \n
\n\n
\n \n \n \n \n \n \n
\n
\n\n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
"; + function toArray(a) { + if (Object.prototype.toString.call(a) === '[object Object]') { + var b = []; + + for (var i in a) { + b.push(a[i]); + } + + return b; + } else if (typeof a == 'string' || a == null || typeof a == 'number' || typeof a == 'undefined') return [];else return a; + } + + function decodeJson(string, empty) { + var json = empty || {}; + + if (string) { + try { + json = JSON.parse(string); + } catch (e) {} + } + + return json; + } + + function isObject(a) { + return Object.prototype.toString.call(a) === '[object Object]'; + } + + function isArray(a) { + return Object.prototype.toString.call(a) === '[object Array]'; + } + + function extend(a, b, replase) { + for (var i in b) { + if (isObject(b[i])) { + if (a[i] == undefined) a[i] = {}; + this.extend(a[i], b[i], replase); + } else if (a[i] == undefined || replase) a[i] = b[i]; + } + } + + function empty$1(a, b) { + for (var i in b) { + if (!a[i]) a[i] = b[i]; + } + } + + function getKeys(a, add) { + var k = add || []; + + for (var i in a) { + k.push(i); + } + + return k; + } + + function getValues(a, add) { + var k = add || []; + + for (var i in a) { + k.push(a[i]); + } + + return k; + } + + function remove$6(from, need) { + var inx = from.indexOf(need); + if (inx >= 0) from.splice(inx, 1); + } + + function clone$1(a) { + return JSON.parse(JSON.stringify(a)); + } + + function insert(where, index, item) { + where.splice(index, 0, item); + } + + function destroy$b(arr) { + var call_function = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'destroy'; + var value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var where = toArray(arr); + + for (var i = where.length - 1; i >= 0; i--) { + if (where[i] && where[i][call_function]) where[i][call_function](value); + } + } + + function groupBy(xs, key) { + return xs.reduce(function (rv, x) { + (rv[x[key]] = rv[x[key]] || []).push(x); + return rv; + }, {}); + } + + function removeNoIncludes(where, items) { + for (var i = where.length - 1; i >= 0; i--) { + if (items.indexOf(where[i]) === -1) remove$6(where, where[i]); + } + + return where; + } + + function shuffle(array) { + for (var i = array.length - 1; i > 0; i--) { + var j = Math.floor(Math.random() * (i + 1)); + var temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + return array; + } + + function shuffleArrayFromIndex(array, startIndex) { + if (startIndex < 0 || startIndex >= array.length) { + return; + } + + for (var i = array.length - 1; i > startIndex; i--) { + // Выбираем случайный индекс от startIndex до i + var j = Math.floor(Math.random() * (i - startIndex + 1)) + startIndex; // Меняем местами элементы array[i] и array[j] + + var _ref = [array[j], array[i]]; + array[i] = _ref[0]; + array[j] = _ref[1]; + } + } - var html$22 = "
\n
\n
\n
"; + function removeDuplicates(array, key) { + var seen = []; + return array.filter(function (a) { + if (seen.indexOf(a[key]) == -1) { + seen.push(a[key]); + return true; + } else return false; + }); + } - var html$21 = "
\n\n
\n \n
\n\n
\n\n
\n \n
\n
"; + function flatMap(arr, add) { + var result = []; - var html$20 = "
\n
\n
"; + for (var i = 0; i < arr.length; i++) { + result.push(arr[i]); - var html$1$ = "
\n
\n
\n
"; + if (i < arr.length - 1) { + if (add && typeof add == 'function') { + result.push(add(arr[i], arr[i + 1])); + } else { + result.push(add || null); + } + } + } - var html$1_ = "
\n
\u041E\u0436\u0438\u0434\u0430\u044E
\n
\u041D\u0430\u0436\u043C\u0438\u0442\u0435 (\u0432\u043D\u0438\u0437) \u0434\u043B\u044F \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438.
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"; + return result; + } - var html$1Z = "
\n
\n
\n \n
\n
\n
"; + function unique(arr) { + return arr.filter(function (item, pos) { + return arr.indexOf(item) === pos; + }); + } - var html$1Y = "
\n
\n
\n
\n
#{title_settings}
\n
\n
\n
\n
"; + var Arrays = { + toObject: toObject, + toArray: toArray, + decodeJson: decodeJson, + isObject: isObject, + isArray: isArray, + extend: extend, + getKeys: getKeys, + getValues: getValues, + insert: insert, + clone: clone$1, + remove: remove$6, + destroy: destroy$b, + empty: empty$1, + groupBy: groupBy, + removeNoIncludes: removeNoIncludes, + shuffle: shuffle, + shuffleArrayFromIndex: shuffleArrayFromIndex, + removeDuplicates: removeDuplicates, + flatMap: flatMap, + unique: unique + }; - var html$1X = "
\n
\n
\n \n \n \n \n \n \n
\n
#{settings_cub_sync}
\n
\n
\n
\n \n
\n
#{settings_main_interface}
\n
\n
\n
\n \n
\n
#{settings_main_player}
\n
\n
\n
\n \n
\n
#{settings_main_parser}
\n
\n
\n
\n \n
\n
#{settings_main_torrserver}
\n
\n
\n
\n \n \n \n
\n
TMDB
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n
#{settings_main_plugins}
\n
\n
\n
\n \n
\n
#{title_parental_control}
\n
\n
\n
\n \n
\n
#{settings_main_rest}
\n
\n \n
"; + var html$2q = "
\n
\n
\n \n
\n\n
\n \n
\n\n
\n \n
\n
\n \n
\n
\n\n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
"; - var html$1W = "
\n
\n
#{settings_interface_lang}
\n
\n
\n\n
\n
#{settings_interface_type}
\n
\n
\n\n
\n
#{settings_interface_size}
\n
\n
\n\n
#{settings_interface_background}
\n\n
\n
#{settings_interface_background_use}
\n
\n
\n\n
\n
#{settings_interface_background_type}
\n
\n
\n\n
\n
#{settings_interface_black_style}
\n
\n
\n\n
#{title_card}
\n\n
\n
#{settings_interface_card_interfice}
\n
\n
\n\n
\n
#{settings_interface_card_poster}
\n
\n
\n\n
\n
#{settings_interface_card_cover}
\n
\n
\n\n
\n
#{settings_interface_card_reactions}
\n
\n
\n\n
#{settings_interface_glass}
\n\n
\n
#{settings_interface_glass}
\n
\n
#{settings_interface_glass_descr}
\n
\n\n
\n
#{settings_interface_glass_opacity}
\n
\n
\n\n
\n
#{settings_interface_sound}
\n\n
\n
#{settings_interface_sound_play}
\n
\n
\n\n
\n
#{settings_interface_sound_level}
\n
\n
\n
\n\n
#{settings_interface_performance}
\n\n\n
\n
#{settings_interface_animation}
\n
\n
#{settings_interface_animation_descr}
\n
\n\n
\n
#{settings_interface_advanced_animation}
\n
\n
\n\n
\n
#{settings_interface_attenuation}
\n
\n
#{settings_interface_attenuation_descr}
\n
\n\n
\n
#{settings_interface_scroll}
\n
\n
\n\n
\n
#{settings_interface_view_card}
\n
\n
#{settings_interface_view_card_descr}
\n
\n\n
\n
#{settings_interface_hide_outside_the_screen}
\n
\n
#{settings_interface_hide_outside_the_screen_descr}
\n
\n
"; + var html$2p = "
\n
\n
\n
"; - var html$1V = "
\n
\n
#{settings_parser_use}
\n
\n
#{settings_parser_use_descr}
\n
\n
\n
\n
#{settings_parser_type}
\n
\n
\n\n
\n
Jackett
\n\n
\n
#{settings_parser_jackett_link}
\n
\n
#{settings_parser_jackett_link_descr}
\n
\n\n
\n
#{settings_parser_jackett_key}
\n
\n
#{settings_parser_jackett_key_descr}
\n
\n\n
\n
#{settings_parser_jackett_interview}
\n
\n
\n
\n \n
\n
Prowlarr
\n\n
\n
#{settings_parser_jackett_link}
\n
\n
#{settings_parser_prowlarr_link_descr}
\n
\n\n
\n
#{settings_parser_jackett_key}
\n
\n
#{settings_parser_prowlarr_key_descr}
\n
\n
\n\n
#{more}
\n\n
\n
#{settings_parser_search}
\n
\n
#{settings_parser_search_descr}
\n
\n
\n
#{settings_parser_timeout_title}
\n
\n
#{settings_parser_timeout_descr}
\n
\n
\n
#{settings_parser_in_search}
\n
\n
#{settings_parser_in_search_descr}
\n
\n
\n
"; + var html$2o = "
\n\n
\n \n
\n\n
\n\n
\n \n
\n\n
\n\n
\n \n
\n
"; - var html$1U = "
\n
\n
#{settings_server_client}
\n
\n
#{settings_server_client_descr}
\n
\n\n
\n
\n
#{settings_server_link}
\n
\n
\n\n
#{settings_server_links}
\n\n
\n
#{settings_server_link_one}
\n
\n
#{settings_server_link_one_descr}
\n
\n
\n\n
\n
#{settings_server_link_two}
\n
\n
#{settings_server_link_two_descr}
\n
\n
\n \n \n
#{settings_server_additionally}
\n\n
\n
#{settings_server_base}
\n
\n
#{settings_server_base_descr}
\n
\n \n
\n
#{settings_server_preload}
\n
\n
#{settings_server_preload_descr}
\n
\n\n
#{settings_server_auth}
\n\n
\n
#{settings_server_password_use}
\n
\n
\n \n
\n
\n
#{settings_server_login}
\n
\n
\n\n
\n
#{settings_server_password}
\n
\n
\n
\n
\n
"; + var html$2n = "
\n
\n
"; - var html$1T = "
\n
\n
#{settings_player_type}
\n
\n
#{settings_player_type_descr}
\n
\n\n
\n
#{settings_player_iptv_type}
\n
\n
#{settings_player_iptv_type_descr}
\n
\n\n
\n
#{settings_player_torrent_type}
\n
\n
#{settings_player_torrent_type_descr}
\n
\n\n
\n
#{settings_player_launch_trailers}
\n
\n
\n \n
\n
#{settings_player_reset}
\n
\n
#{settings_player_reset_descr}
\n
\n\n
\n
#{settings_player_path}
\n
\n
#{settings_player_path_descr}
\n
\n\n
\n
#{settings_player_normalization}
\n
\n
#{settings_player_normalization_descr}
\n
\n \n
\n
#{settings_player_next_episode}
\n
\n
#{settings_player_next_episode_descr}
\n
\n\n
\n
#{settings_player_timecode}
\n
\n
#{settings_player_timecode_descr}
\n
\n\n
\n
#{settings_player_scale}
\n
\n
#{settings_player_scale_descr}
\n
\n\n
\n
#{settings_player_hls_title}
\n
\n
#{settings_player_hls_descr}
\n
\n\n
\n
#{settings_player_rewind_title}
\n
\n
#{settings_player_rewind_descr}
\n
\n \n
\n
#{settings_player_subs}
\n\n
\n
#{settings_player_subs_use}
\n
\n
#{settings_player_subs_use_descr}
\n
\n\n
\n
#{settings_player_subs_size}
\n
\n
#{settings_player_subs_size_descr}
\n
\n \n
\n
#{settings_player_subs_stroke_use}
\n
\n
#{settings_player_subs_stroke_use_descr}
\n
\n \n
\n
#{settings_player_subs_backdrop_use}
\n
\n
#{settings_player_subs_backdrop_use_descr}
\n
\n
\n\n
#{more}
\n\n
\n
#{settings_player_quality}
\n
\n
#{settings_player_quality_descr}
\n
\n
"; + var html$2m = "
\n
\n
\n
"; - var html$1S = "
\n
\n
#{settings_rest_start}
\n
\n
#{settings_rest_start_descr}
\n
\n\n
\n
#{settings_rest_source_use}
\n
\n
#{settings_rest_source_descr}
\n
\n\n
\n
#{settings_rest_protocol_use}
\n
\n
#{settings_rest_protocol_descr}
\n
\n\n
\n
#{settings_rest_cache_images}
\n
\n
#{settings_rest_cache_images_descr}
\n
\n\n
#{settings_rest_screensaver}
\n\n
\n
#{settings_rest_screensaver_use}
\n
\n
\n\n
\n
#{settings_rest_screensaver_type}
\n
\n
\n\n
\n
#{settings_rest_screensaver_time}
\n
\n
\n\n
#{settings_rest_helper}
\n\n
\n
#{settings_rest_helper_use}
\n
\n
\n\n
\n
#{settings_rest_helper_reset}
\n
\n \n
#{more}
\n\n
\n
#{settings_rest_pages}
\n
\n
#{settings_rest_pages_descr}
\n
\n\n
\n
#{settings_rest_time}
\n
\n
\n\n
\n
#{settings_rest_navigation}
\n
\n
\n\n
\n
#{settings_rest_keyboard}
\n
\n
\n\n\n
\n
#{settings_rest_card_quality}
\n
\n
#{settings_rest_card_quality_descr}
\n
\n\n
\n
#{settings_rest_card_episodes}
\n
\n
#{settings_rest_card_episodes_descr}
\n
\n\n
\n
#{settings_rest_device}
\n
\n
\n\n
\n
#{settings_rest_cache}
\n
#{title_left} - #{player_unknown}
\n
\n
"; + var html$2l = "
\n
\u041E\u0436\u0438\u0434\u0430\u044E
\n
\u041D\u0430\u0436\u043C\u0438\u0442\u0435 (\u0432\u043D\u0438\u0437) \u0434\u043B\u044F \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438.
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"; - var html$1R = "
\n
\n
TMDB
\n
\n
#{settings_rest_tmdb_lang}
\n
\n\n
\n
#{settings_rest_tmdb_posters}
\n
\n
\n\n
\n
#{settings_rest_tmdb_prox_auto}
\n
\n
\n\n
\n
#{settings_rest_tmdb_prox}
\n
\n
\n\n
\n
Api
\n
\n
#{settings_rest_tmdb_api_descr}
\n
\n\n
\n
Image
\n
\n
#{settings_rest_tmdb_image_descr}
\n
\n
"; + var html$2k = "
\n
\n
\n \n
\n
\n
"; - var html$1Q = "
\n
\n
#{settings_plugins_add}
\n
#{settings_plugins_add_descr}
\n
\n
\n
#{settings_plugins_install}
\n
#{settings_plugins_install_descr}
\n
\n
"; + var html$2j = "
\n
\n
\n
\n
#{title_settings}
\n
\n
\n
\n
"; - var html$1P = "
\n
\n
\n
https://{site}
\n #{settings_cub_sync_descr}\n
\n \n
\n\n
\n
#{settings_cub_sync}
\n
\n
\n\n
#{settings_cub_account} Premium
\n\n
\n
#{settings_cub_domain}
\n
\n
\n\n
\n
#{settings_cub_logged_in_as}
\n
\n
\n\n
\n
#{settings_cub_profile}
\n
\n
\n\n
\n
#{settings_cub_logout}
\n
\n\n
#{settings_cub_signin}
\n\n
\n
#{settings_cub_signin_button}
\n
\n
\n\n
#{settings_cub_status}
\n\n
\n
\n
\n
\n\n
#{more}
\n\n
\n
#{settings_cub_sync_btn}
\n
#{settings_cub_sync_btn_descr}
\n
\n\n
\n
#{settings_cub_backup}
\n
#{settings_cub_backup_descr}
\n
\n\n
CUB Premium
\n\n
\n
#{settings_cub_sync_filters}
\n
\n
\n
\n
#{settings_cub_sync_calendar}
\n
\n
\n
\n
#{settings_cub_sync_timecodes}
\n
\n
\n
\n
#{settings_cub_sync_search}
\n
\n
\n
"; + var html$2i = "
\n
\n
\n \n \n \n \n \n \n
\n
#{settings_cub_sync}
\n
\n
\n
\n \n \n \n
\n
#{settings_main_interface}
\n
\n
\n
\n \n
\n
#{settings_main_player}
\n
\n
\n
\n \n
\n
#{settings_main_parser}
\n
\n
\n
\n \n
\n
#{settings_main_torrserver}
\n
\n
\n
\n \n \n \n
\n
TMDB
\n
\n
\n
\n \n \n \n \n \n
\n
#{settings_main_plugins}
\n
\n
\n
\n \n \n \n \n
\n
#{title_parental_control}
\n
\n
\n
\n \n
\n
#{settings_main_rest}
\n
\n \n
"; - var html$1O = "
\n
\n
{title}
\n
\n
\n
"; + var html$2h = "
\n
\n
#{settings_interface_lang}
\n
\n
\n\n
\n
#{settings_interface_type}
\n
\n
\n\n
\n
#{settings_interface_size}
\n
\n
\n\n
#{settings_interface_background}
\n\n
\n
#{settings_interface_background_use}
\n
\n
\n\n
\n
#{settings_interface_background_type}
\n
\n
\n\n
\n
#{settings_interface_black_style}
\n
\n
\n\n
#{title_card}
\n\n
\n
#{settings_interface_card_poster}
\n
\n
\n\n
\n
#{settings_interface_card_cover}
\n
\n
\n\n
\n
#{settings_interface_card_reactions}
\n
\n
\n\n
#{settings_interface_glass}
\n\n
\n
#{settings_interface_glass}
\n
\n
#{settings_interface_glass_descr}
\n
\n\n
\n
#{settings_interface_glass_opacity}
\n
\n
\n\n
\n
#{settings_interface_sound}
\n\n
\n
#{settings_interface_sound_play}
\n
\n
\n\n
\n
#{settings_interface_sound_level}
\n
\n
\n
\n\n
#{settings_interface_performance}
\n\n\n
\n
#{settings_interface_animation}
\n
\n
#{settings_interface_animation_descr}
\n
\n\n
\n
#{settings_interface_advanced_animation}
\n
\n
\n\n
\n
#{settings_interface_attenuation}
\n
\n
#{settings_interface_attenuation_descr}
\n
\n\n
\n
#{settings_interface_scroll}
\n
\n
\n
"; - var html$1N = "
\n
\n \n\n
\n
\n \n
\n
\n
\n\n
{title}
\n
{release_year}
\n
"; + var html$2g = "
\n
\n
#{settings_parser_use}
\n
\n
#{settings_parser_use_descr}
\n
\n
\n
\n
#{settings_parser_type}
\n
\n
\n\n
\n
Jackett
\n\n
\n
#{settings_parser_jackett_link}
\n
\n
#{settings_parser_jackett_link_descr}
\n
\n\n
\n
#{settings_parser_jackett_key}
\n
\n
#{settings_parser_jackett_key_descr}
\n
\n\n
\n
#{settings_parser_jackett_interview}
\n
\n
\n
\n \n
\n
Prowlarr
\n\n
\n
#{settings_parser_jackett_link}
\n
\n
#{settings_parser_prowlarr_link_descr}
\n
\n\n
\n
#{settings_parser_jackett_key}
\n
\n
#{settings_parser_prowlarr_key_descr}
\n
\n
\n\n
#{more}
\n\n
\n
#{settings_parser_search}
\n
\n
#{settings_parser_search_descr}
\n
\n
\n
#{settings_parser_timeout_title}
\n
\n
#{settings_parser_timeout_descr}
\n
\n
\n
#{settings_parser_in_search}
\n
\n
#{settings_parser_in_search_descr}
\n
\n
\n
"; - var html$1M = "
\n
{Title}
\n\n
\n
\n
#{torrent_item_seeds}: {Seeders}
\n
#{torrent_item_grabs}: {Peers}
\n
\n
{size}
\n
\n
"; + var html$2f = "
\n
\n
#{settings_server_client}
\n
\n
#{settings_server_client_descr}
\n
\n\n
\n
\n
#{settings_server_link}
\n
\n
\n\n
#{settings_server_links}
\n\n
\n
#{settings_server_link_one}
\n
\n
#{settings_server_link_one_descr}
\n
\n
\n\n
\n
#{settings_server_link_two}
\n
\n
#{settings_server_link_two_descr}
\n
\n
\n \n \n
#{settings_server_additionally}
\n\n
\n
#{settings_server_base}
\n
\n
#{settings_server_base_descr}
\n
\n \n
\n
#{settings_server_preload}
\n
\n
#{settings_server_preload_descr}
\n
\n\n
#{settings_server_auth}
\n\n
\n
#{settings_server_password_use}
\n
\n
\n \n
\n
\n
#{settings_server_login}
\n
\n
\n\n
\n
#{settings_server_password}
\n
\n
\n
\n
\n
"; - var html$1L = "
\n
\n
\n
\n
"; + var html$2e = "
\n
\n
#{settings_player_type}
\n
\n
#{settings_player_type_descr}
\n
\n\n
\n
#{settings_player_iptv_type}
\n
\n
#{settings_player_iptv_type_descr}
\n
\n\n
\n
#{settings_player_torrent_type}
\n
\n
#{settings_player_torrent_type_descr}
\n
\n\n
\n
#{settings_player_launch_trailers}
\n
\n
\n \n
\n
#{settings_player_reset}
\n
\n
#{settings_player_reset_descr}
\n
\n\n
\n
#{settings_player_path}
\n
\n
#{settings_player_path_descr}
\n
\n\n
\n
#{settings_player_normalization}
\n
\n
#{settings_player_normalization_descr}
\n
\n \n
\n
#{settings_player_next_episode}
\n
\n
#{settings_player_next_episode_descr}
\n
\n\n
\n
#{settings_player_timecode}
\n
\n
#{settings_player_timecode_descr}
\n
\n\n
\n
#{settings_player_scale}
\n
\n
#{settings_player_scale_descr}
\n
\n\n
\n
#{settings_player_hls_title}
\n
\n
#{settings_player_hls_descr}
\n
\n\n
\n
#{settings_player_rewind_title}
\n
\n
#{settings_player_rewind_descr}
\n
\n \n
\n
#{settings_player_subs}
\n\n
\n
#{settings_player_subs_use}
\n
\n
#{settings_player_subs_use_descr}
\n
\n
\n\n
#{more}
\n\n
\n
#{settings_player_quality}
\n
\n
#{settings_player_quality_descr}
\n
\n
"; - var html$1K = "
\n
\n
\n
\n \n
\n\n
\n
{num}
\n
{name}
\n
{date}
\n
\n
\n
\n
\n
\n
\n \n
\n
\n\n
\n
{title}
\n
{release_year}
\n
\n
\n
"; + var html$2d = "
\n
\n
#{settings_rest_start}
\n
\n
#{settings_rest_start_descr}
\n
\n\n
\n
#{settings_rest_source_use}
\n
\n
#{settings_rest_source_descr}
\n
\n\n
\n
#{settings_rest_protocol_use}
\n
\n
#{settings_rest_protocol_descr}
\n
\n\n
#{settings_rest_screensaver}
\n\n
\n
#{settings_rest_screensaver_use}
\n
\n
\n\n
\n
#{settings_rest_screensaver_type}
\n
\n
\n\n
\n
#{settings_rest_screensaver_time}
\n
\n
\n\n \n
#{more}
\n\n
\n
#{settings_rest_pages}
\n
\n
#{settings_rest_pages_descr}
\n
\n\n
\n
#{settings_rest_time}
\n
\n
\n\n
\n
#{settings_rest_navigation}
\n
\n
\n\n
\n
#{settings_rest_keyboard}
\n
\n
\n\n\n
\n
#{settings_rest_card_quality}
\n
\n
#{settings_rest_card_quality_descr}
\n
\n\n
\n
#{settings_rest_card_episodes}
\n
\n
#{settings_rest_card_episodes_descr}
\n
\n\n
\n
#{settings_rest_device}
\n
\n
\n
"; - var html$1J = "
\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
{rating}
TMDB
\n\n
IMDB
\n
KP
\n\n
\n
\n\n
{title}
\n
{original_title}
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
{countries}
\n
\n
\n
{genres}
\n
\n
\n
{time}
\n
\n
\n
{seasons}
\n
\n
\n
{episodes}
\n
\n
\n
\n
\n
\n\n
\n
#{reactions_none}
\n
\n\n \n
\n
\n\n
\n
\n\n
\n
\n \n \n \n\n #{full_torrents}\n
\n\n
\n \n \n \n\n #{full_trailers}\n
\n\n
\n \n \n \n\n
\n\n
\n \n \n \n \n\n
\n\n
\n \n \n \n \n
\n\n
\n \n \n \n \n \n
\n
\n
\n
"; + var html$2c = "
\n
\n
TMDB
\n
\n
#{settings_rest_tmdb_lang}
\n
\n\n
\n
#{settings_rest_tmdb_posters}
\n
\n
\n\n
\n
#{settings_rest_tmdb_prox_auto}
\n
\n
\n\n
\n
#{settings_rest_tmdb_prox}
\n
\n
\n\n
\n
Api
\n
\n
#{settings_rest_tmdb_api_descr}
\n
\n\n
\n
Image
\n
\n
#{settings_rest_tmdb_image_descr}
\n
\n
"; - var html$1I = "
\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
{title}
\n
{tagline}
\n
\n
{rating}
TMDB
\n
IMDB
\n
KP
\n\n
\n
\n
\n
\n
\n
#{reactions_none}
\n
\n\n
\n
\n \n \n \n \n\n #{title_watch}\n
\n\n
\n \n \n \n\n #{settings_input_links}\n
\n\n
\n \n \n \n \n\n #{title_reactions}\n
\n\n
\n \n \n \n \n\n #{title_subscribe}\n
\n\n
\n \n \n \n \n \n
\n
\n
\n
\n\n
\n
\n \n \n \n\n #{full_torrents}\n
\n\n
\n \n \n \n\n #{full_trailers}\n
\n
\n
"; + var html$2b = "
\n
\n
#{settings_plugins_add}
\n
#{settings_plugins_add_descr}
\n
\n
\n
#{settings_plugins_install}
\n
#{settings_plugins_install_descr}
\n
\n
"; - var html$1H = "
\n
\n
{text}
\n\n
\n
\n
#{full_date_of_release}
\n
{relise}
\n
\n\n
\n
#{full_budget}
\n
{budget}
\n
\n\n
\n
#{full_countries}
\n
{countries}
\n
\n
\n\n
\n
\n\n \n
"; + var html$2a = "
\n
\n
\n
https://{site}
\n #{settings_cub_sync_descr}\n
\n
\n
\n
\n\n
\n
#{settings_cub_sync}
\n
\n
\n\n
#{settings_cub_account} Premium
\n\n
\n
#{settings_cub_domain}
\n
\n
\n\n
\n
#{settings_cub_logged_in_as}
\n
\n
\n\n
\n
#{settings_cub_profile}
\n
\n
\n\n
\n
#{settings_cub_logout}
\n
\n\n
#{settings_cub_signin}
\n\n
\n
#{settings_cub_signin_button}
\n
\n
\n\n
#{more}
\n\n
\n
#{settings_cub_sync_btn}
\n
#{settings_cub_sync_btn_descr}
\n
\n\n
\n
#{settings_cub_backup}
\n
#{settings_cub_backup_descr}
\n
\n
"; - var html$1G = "
\n
\n \n
\n\n
\n
{name}
\n
{role}
\n
\n
"; + var html$29 = "
\n
\n
{title}
\n
\n
\n
"; - var html$1F = "
\n
{text}
\n\n
#{full_like}: {like_count}
\n
"; + var html$28 = "
\n
\n \n\n
\n
\n \n
\n
\n
\n\n
{title}
\n
{release_year}
\n
"; - var html$1E = "
\n
\n \n
\n\n
\n
{num}
\n
{name}
\n
{date}
\n
\n
"; + var html$27 = "
\n
{Title}
\n\n
\n
\n
#{torrent_item_seeds}: {Seeders}
\n
#{torrent_item_grabs}: {Peers}
\n
\n
{size}
\n
\n
"; - var html$1D = "
\n \n
"; + var html$26 = "
\n
\n
\n
\n
"; - var html$1C = "
\n\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n \n \n \n
\n
001
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n
auto
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n
"; + var html$25 = "
\n
\n
\n
\n \n
\n\n
\n
{num}
\n
{name}
\n
{date}
\n
\n
\n
\n
\n
\n
\n \n
\n
\n\n
\n
{title}
\n
{release_year}
\n
\n
\n
"; - var html$1B = "
\n
\n
\n
\n \n \n \n \n
\n
\n \u25C0\u25C0\u25C0\n
\n
\n \u25B6\u25B6\u25B6\n
\n
\n
\n
\n
"; + var html$24 = "
\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
{title}
\n
{tagline}
\n
\n
{rating}
TMDB
\n
IMDB
\n
KP
\n\n
\n
\n
\n
\n
\n
#{reactions_none}
\n
\n\n
\n
\n \n\n #{title_watch}\n
\n\n
\n \n \n \n\n #{settings_input_links}\n
\n\n
\n \n\n #{title_reactions}\n
\n\n
\n \n \n \n \n\n #{title_subscribe}\n
\n\n
\n \n
\n
\n
\n
\n\n
\n
\n \n\n #{full_torrents}\n
\n\n
\n \n\n #{full_trailers}\n
\n
\n
"; - var html$1A = "
\n
\n
\n
\n
\n
\n\n
\n
\n #{loading}...\n
\n
\n \n
\n
\n \n
\n
\n
\n\n
\n
\n
"; + var html$23 = "
\n
\n
{text}
\n\n
\n
\n
#{full_date_of_release}
\n
{relise}
\n
\n\n
\n
#{full_budget}
\n
{budget}
\n
\n\n
\n
#{full_countries}
\n
{countries}
\n
\n
\n\n
\n
\n\n \n
"; - var html$1z = "
\n \n
"; + var html$22 = "
\n
\n \n
\n\n
\n
{name}
\n
{role}
\n
\n
"; - var html$1y = ""; + var html$21 = "
\n
{text}
\n\n
#{full_like}: {like_count}
\n
"; - var html$1x = "
\n
\n
\n
\n
\n
\n
\n
\n
"; + var html$20 = "
\n
\n \n
\n\n
\n
{num}
\n
{name}
\n
{date}
\n
\n
"; - var html$1w = "
\n
{title}
\n
{subtitle}
\n
"; + var html$1$ = "
\n \n
"; - var html$1v = "
\n
{icon}
\n
\n
{title}
\n
{subtitle}
\n
\n
"; + var html$1_ = "
\n\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n \n \n \n
\n
001
\n
\n \n \n \n
\n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n\n
\n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n
auto
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n
\n \n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n
"; - var html$1u = "
\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"; + var html$1Z = "
\n
\n
\n
\n \n \n \n \n
\n
\n \u25C0\u25C0\u25C0\n
\n
\n \u25B6\u25B6\u25B6\n
\n
\n
\n
\n
"; - var html$1t = "
\n
\n \n \n \n \n
\n
\n
\n #{filter_sorted}
\n
\n\n
\n #{filter_filtred}
\n
\n
"; + var html$1Y = "
\n
\n
\n
\n
\n
\n\n
\n
\n #{loading}...\n
\n
\n \n
\n
\n \n
\n
\n
\n\n
\n
\n
"; - var html$1s = "
\n
\n
\n #{more}\n
\n
\n
"; + var html$1X = "
\n \n
"; - var html$1r = "
\n
#{search_input}...
\n
\n
\n
\n
\n
"; + var html$1W = ""; - var html$1q = "
\n
\n
\n\n
\n\n
#{settings_input_links}
\n
\n
"; + var html$1V = "
\n
\n
\n
\n
\n
\n
\n
\n
"; - var html$1p = "
\n
\n
\n
{title}
\n
\n
\n \n
\n
\n
"; + var html$1U = "
\n
{title}
\n
{subtitle}
\n
"; - var html$1o = "
\n
\n
\n \n
\n
\n\n
\n
{name}
\n
{place}
\n
\n
"; + var html$1T = "
\n
{icon}
\n
\n
{title}
\n
{subtitle}
\n
\n
"; - var html$1n = "
\n \n
"; + var html$1S = "
\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"; - var html$1m = "
\n
\n
{text}
\n
"; + var html$1R = "
\n
\n \n
\n
\n
\n #{filter_sorted}
\n
\n\n
\n #{filter_filtred}
\n
\n
"; - var html$1l = "
\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
\n
{birthday}
\n
\n
\n \n
{name}
\n
{place}
\n\n
\n
\n \n \n \n
\n\n
\n \n \n \n \n\n \n
\n
\n
\n
\n
"; + var html$1Q = "
\n
\n
\n #{more}\n
\n
\n
"; - var html$1k = "
\n
\n
{title}
\n
{descr}
\n
"; + var html$1P = "
\n
#{search_input}...
\n
\n
\n
\n
\n
"; - var html$1j = "
\n
#{empty_title}
\n
#{empty_text}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"; + var html$1O = "
\n
\n
\n\n
\n\n
#{settings_input_links}
\n
\n
"; - var html$1i = "
\n
\n
{title}
\n
{time}
\n
\n \n
{descr}
\n
"; + var html$1N = "
\n
\n
\n
{title}
\n
\n
\n \n
\n
\n
"; - var html$1h = "
\n
\n
\n \n
\n
\n
\n
\n
{title}
\n
{time}
\n
\n \n
{descr}
\n
\n
"; + var html$1M = "
\n
\n
\n \n
\n
\n\n
\n
{name}
\n
{place}
\n
\n
"; - var html$1g = "
\n
{title}
\n
\n
\n
{date}
\n
{tracker}
\n\n
#{torrent_item_bitrate}: {bitrate} #{torrent_item_mb}
\n
#{torrent_item_seeds}: {seeds}
\n
#{torrent_item_grabs}: {grabs}
\n \n
{size}
\n
\n
"; + var html$1L = "
\n \n
"; - var html$1f = "
\n
{title}.{exe}
\n
{size}
\n
"; + var html$1K = "
\n
\n
{text}
\n
"; - var html$1e = "
\n
\n
\n \n
\n\n
\n
{title}
\n
{original_title}
\n
\n
\n
\n \n
\n
"; + var html$1J = "
\n
\n \n
\n
{qr_text}
\n
\n\n
\n
{title}
\n
{text}
\n
\n
"; - var html$1d = "
\n
#{about_text}
\n\n\n
\n
\n
\n #{about_channel}
\n @lampa_channel\n
\n\n
\n #{about_group}
\n @lampa_group\n
\n\n
\n #{about_version}
\n \n
\n\n
\n #{about_version} Android APK
\n \n
\n
\n
\n\n
\n

#{termsofuse_t_01}

\n\n

#{termsofuse_t_02}

\n\n
    \n
  1. \n
    #{termsofuse_t_03}
    \n\n
      \n
    1. #{termsofuse_t_04}

    2. \n\n
    3. #{termsofuse_t_05}

    4. \n\n
    5. #{termsofuse_t_06}

    6. \n\n
    7. #{termsofuse_t_07}

    8. \n
    \n \n
  2. \n\n
  3. \n
    #{termsofuse_t_08}
    \n\n
      \n
    1. #{termsofuse_t_09}

    2. \n
    3. #{termsofuse_t_10}

    4. \n
    \n
  4. \n\n
  5. \n
    #{termsofuse_t_11}
    \n\n
      \n
    1. #{termsofuse_t_12}

    2. \n
    3. #{termsofuse_t_13}

    4. \n
    \n
  6. \n
\n
\n
"; + var html$1I = "
\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
\n
{birthday}
\n
\n
\n \n
{name}
\n
{place}
\n\n
\n
\n \n \n \n
\n\n
\n \n \n \n \n \n
\n
\n
\n
\n
"; - var html$1c = "
\n
\n
\n
{title}
\n
{text}
\n
\n
"; + var html$1H = "
\n
\n
\n
{title}
\n
{descr}
\n
"; - var html$1b = "
\n
\n \"\"\n
\n
\n
\n
\n
{title}
\n
{time}
\n
\n\n
\n\n
\n
{info}
\n
{quality}
\n
\n
\n
"; + var html$1G = "
\n
{title}
\n
{text}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"; - var html$1a = "
\n \n \n \n {rate}\n
"; + var html$1F = "
\n
\n
{title}
\n
{time}
\n
\n \n
{descr}
\n
"; - var html$19 = "
\n
{name}
\n
{head}
\n
{overview}
\n
"; + var html$1E = "
\n
\n
\n \n
\n
\n
\n
\n
{title}
\n
{time}
\n
\n \n
{descr}
\n
\n
"; - var html$18 = "
\n
\n
\n
{title}
\n
{text}
\n
\n
\n\n
\n
\n
\u041F\u0440\u0438\u0447\u0438\u043D\u044B
\n \n
\n\n
\n
\u041A\u0430\u043A \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E?
\n \n
\n\n
\n
\u041A\u0430\u043A \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C?
\n \n
\n
"; + var html$1D = "
\n
{title}
\n
\n
\n
{date}
\n
{tracker}
\n\n
#{torrent_item_bitrate}: {bitrate} #{torrent_item_mb}
\n
#{torrent_item_seeds}: {seeds}
\n
#{torrent_item_grabs}: {grabs}
\n \n
{size}
\n
\n
"; - var html$17 = "
\n
\n
\n
{title}
\n
{text}
\n
\n
\n\n
\n
\n
\u041F\u0440\u0438\u0447\u0438\u043D\u044B
\n \n
\n\n
\n
\u0427\u0442\u043E \u0434\u0435\u043B\u0430\u0442\u044C?
\n \n
\n\n
\n
\u041A\u0430\u043A \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C?
\n \n
\n
"; + var html$1C = "
\n
{title}.{exe}
\n
{size}
\n
"; - var html$16 = "
\n
\n
\n
{title}
\n
{text}
\n
\n
\n\n
\n
\n
#{torent_nohash_reasons}
\n \n
\n\n
\n
#{torent_nohash_do}
\n \n
\n\n
\n
#{torent_nohash_do}
\n \n
\n
"; + var html$1B = "
\n
\n
\n \n
\n\n
\n
{title}
\n
{original_title}
\n
\n
\n
\n \n
\n
"; - var html$15 = "
\n
\n \n
\n
\n
#{torrent_install_need}
\n
#{torrent_install_text}
\n \n
#{torrent_install_contact}
\n\n
\n
\n
LG - Samsung
\n
@lampa_group
\n
\n
\n
\n
"; + var html$1A = "
\n
#{about_text}
\n\n\n
\n
\n
\n #{about_channel}
\n @lampa_channel\n
\n\n
\n #{about_group}
\n @lampa_group\n
\n\n
\n #{about_version}
\n \n
\n\n
\n #{about_version} Android APK
\n \n
\n\n
\n Hash
\n 0c13e011cb0842f252e2d35c51b914a8\n
\n\n
\n Builded
\n 2025-10-24 17:24\n
\n
\n
\n\n
\n

#{termsofuse_t_01}

\n\n

#{termsofuse_t_02}

\n\n
    \n
  1. \n
    #{termsofuse_t_03}
    \n\n
      \n
    1. #{termsofuse_t_04}

    2. \n\n
    3. #{termsofuse_t_05}

    4. \n\n
    5. #{termsofuse_t_06}

    6. \n\n
    7. #{termsofuse_t_07}

    8. \n
    \n \n
  2. \n\n
  3. \n
    #{termsofuse_t_08}
    \n\n
      \n
    1. #{termsofuse_t_09}

    2. \n
    3. #{termsofuse_t_10}

    4. \n
    \n
  4. \n\n
  5. \n
    #{termsofuse_t_11}
    \n\n
      \n
    1. #{termsofuse_t_12}

    2. \n
    3. #{termsofuse_t_13}

    4. \n
    \n
  6. \n
\n
\n
"; - var html$14 = "
\n
#{torrent_error_text}
\n\n
\n
\n
\n
\n\n
\n
\n
    \n
  • #{torrent_error_step_1}
  • \n
  • #{torrent_error_step_2}
  • \n
  • #{torrent_error_step_3}
  • \n
  • #{torrent_error_step_4}
  • \n
  • #{torrent_error_step_5}
  • \n
  • #{torrent_error_step_6}
  • \n
\n
\n\n
\n
#{torrent_error_info_1}
\n
#{torrent_error_info_2}
\n
#{torrent_error_info_3}
\n
#{torrent_error_info_4}
\n
#{torrent_error_info_5}
\n
#{torrent_error_info_6}
\n
#{torrent_error_info_7}
\n
\n
\n\n
\n
#{torrent_error_start}
\n
\n
"; + var html$1z = "
\n
\n
\n
{title}
\n
{text}
\n
\n
"; - var html$13 = "
\n \n
\n
\n
{fname}
\n
#{torrent_serial_season} - {season}#{torrent_serial_date} - {air_date}
\n
\n
\n
{size}
\n
.{exe}
\n
\n
\n
\n
{episode}
\n
"; + var html$1y = "
\n
\n \"\"\n
\n
\n
\n
\n
{title}
\n
{time}
\n
\n\n
\n\n
\n
{info}
\n
{quality}
\n
\n
\n
"; - var html$12 = "
\n
\n
\n
"; + var html$1x = "
\n \n {rate}\n
"; - var html$11 = "
\n
\n
\n
"; + var html$1w = "
\n
{name}
\n
{head}
\n
{overview}
\n
"; - var html$10 = "\n\n\n\n"; + var html$1v = "
\n
\n
\n
{title}
\n
{text}
\n
\n
\n\n
\n
\n
\u041F\u0440\u0438\u0447\u0438\u043D\u044B
\n \n
\n\n
\n
\u041A\u0430\u043A \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E?
\n \n
\n\n
\n
\u041A\u0430\u043A \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C?
\n \n
\n
"; - var html$$ = "\n\n\n\n\n"; + var html$1u = "
\n
\n
\n
{title}
\n
{text}
\n
\n
\n\n
\n
\n
\u041F\u0440\u0438\u0447\u0438\u043D\u044B
\n \n
\n\n
\n
\u0427\u0442\u043E \u0434\u0435\u043B\u0430\u0442\u044C?
\n \n
\n\n
\n
\u041A\u0430\u043A \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C?
\n \n
\n
"; - var html$_ = "\n\n"; + var html$1t = "
\n
\n
\n
{title}
\n
{text}
\n
\n
\n\n
\n
\n
#{torent_nohash_reasons}
\n \n
\n\n
\n
#{torent_nohash_do}
\n \n
\n\n
\n
#{torent_nohash_do}
\n \n
\n
"; - var html$Z = "\n\n\n\n"; + var html$1s = "
\n
\n \n
\n
\n
#{torrent_install_need}
\n
#{torrent_install_text}
\n \n
#{torrent_install_contact}
\n\n
\n
\n
LG - Samsung
\n
@lampa_group
\n
\n
\n
\n
"; - var html$Y = "\n \n \n \n \n \n \n \n"; + var html$1r = "
\n
#{torrent_error_text}
\n\n
\n
\n
\n
\n\n
\n
\n
    \n
  • #{torrent_error_step_1}
  • \n
  • #{torrent_error_step_2}
  • \n
  • #{torrent_error_step_3}
  • \n
  • #{torrent_error_step_4}
  • \n
  • #{torrent_error_step_5}
  • \n
  • #{torrent_error_step_6}
  • \n
\n
\n\n
\n
#{torrent_error_info_1}
\n
#{torrent_error_info_2}
\n
#{torrent_error_info_3}
\n
#{torrent_error_info_4}
\n
#{torrent_error_info_5}
\n
#{torrent_error_info_6}
\n
#{torrent_error_info_7}
\n
\n
\n\n
\n
#{torrent_error_start}
\n
\n
"; - var html$X = "\n \n \n \n"; + var html$1q = "
\n \n
\n
\n
{fname}
\n
#{torrent_serial_season} - {season}#{torrent_serial_date} - {air_date}
\n
\n
\n
{size}
\n
.{exe}
\n
\n
\n
\n
{episode}
\n
"; - var html$W = "
\n
\n
"; + var html$1p = "
\n
\n
\n
"; - var html$V = "\n#{time_viewed} - {time} #{time_from} {duration} / {percent}\n"; + var html$1o = "
\n
\n
\n
"; - var html$U = "
\n
#{empty_title}
\n
#{empty_text}
\n
"; + var html$1n = "\n\n"; - var html$T = "
\n
\n \n \n
\n
\n
\n
\n
\n
\n
"; + var html$1m = "\n\n"; - var html$S = "
\n\n
\n
#{plugins_catalog_work}
\n
#{plugins_catalog_work_descr}
\n
\n \n
\n
\n\n
\n
#{plugins_catalog_popular}
\n
#{plugins_catalog_popular_descr}
\n
\n \n
\n
\n
"; + var html$1l = "\n\n"; - var html$R = "
\n
{text}
\n\n
\n\n
\n \n
\n
"; + var html$1k = "\n\n"; - var html$Q = "
\n
\n
\n \n
\n
\n
\n
\n
\n
"; + var html$1j = "\n \n \n \n \n \n \n \n"; - var html$P = "
\n
\n
"; + var html$1i = "\n \n \n \n"; - var html$O = "
\n
\n
{title}
\n
\n
\n
"; + var html$1h = "\n\n"; - var html$N = "
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n
#{player_disabled}
\n
\n
"; + var html$1g = "\n\n"; - var html$M = "
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
#{player_disabled}
\n
\n
\n
"; + var html$1f = "\n\n"; - var html$L = "
\n
\n
\n\n
\n
"; + var html$1e = "\n\n"; - var html$K = "
\n
\n \n
\n
\n
\n
\n
"; + var html$1d = "\n\n"; - var html$J = "
\n
\n \n
\n
\n
\n
\n
\n
"; + var html$1c = "\n\n"; - var html$I = "
\n
\n \n
\n
"; + var html$1b = "\n\n"; - var html$H = "
\n
\n \n \n \n \n
\n\n
\n #{account_create}\n
\n
"; + var html$1a = "\n\n\n\n\n"; - var html$G = "
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n #{account_limited}\n
\n
"; + var html$19 = "\n\n"; - var html$F = "
\n
CUB Premium
\n
\n #{account_premium}\n
\n
#{account_premium_more}
\n
{site}/premium
\n
"; + var html$18 = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; - var html$E = "
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n CUB Premium\n
\n
\n #{account_premium}\n
\n
\n
\n
#{account_premium_include_1}#{account_premium_include_text_1}
\n
#{filter_rating_from} 360 #{filter_rating_to} 5 040
\n
\n
\n
#{account_premium_include_2}#{account_premium_include_text_2}
\n
#{filter_rating_from} 100 #{filter_rating_to} 500
\n
\n
\n
#{account_premium_include_3}#{account_premium_include_text_3}
\n
#{filter_rating_from} 1 000 #{filter_rating_to} 10 000
\n
\n
\n
#{account_premium_include_4}#{account_premium_include_text_4}
\n
#{filter_rating_from} 3 #{filter_rating_to} 8
\n
\n
\n
#{account_premium_include_5}#{account_premium_include_text_5}
\n
\n
\n
\n
#{account_premium_include_6}#{account_premium_include_text_6}
\n
\n
\n
\n
#{account_premium_more}
\n
{site}/premium
\n
"; + var html$17 = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; - var html$D = "
\n
\n
\n
\n
\n
\n
\n \"\"\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
"; + var html$16 = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; - var html$C = "
\n \n \n \n \n \n \n
"; + var html$15 = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; - var html$B = "
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n #{https_text}\n
\n
"; + var html$14 = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; - var html$A = "
\n
\n
\n
\n \n \n \n
\n
#{back}
\n
\n\n
\n
\n \n \n \n
\n
#{title_main}
\n
\n\n
\n
\n \n \n \n \n
\n
#{search}
\n
\n\n
\n
\n \n \n \n \n
\n
#{menu_settings}
\n
\n
\n
"; + var html$13 = "\n\n\n\n\n"; - var html$z = "
\n
\n \n \n \n
\n
{title}
\n
"; + var html$12 = "\n\n \n \n\n"; - var html$y = "
\n \n\n
\n #{account_code_where}\n
\n\n
#{account_code_input}
\n
"; + var html$11 = "
\n
\n
"; - var html$x = "
\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n \n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
"; + var html$10 = "\n#{time_viewed} - {time} #{time_from} {duration} / {percent}\n"; - var html$w = "
\n
\n \n
\n\n
\n
\n
\n
\n
"; + var html$$ = "
\n
#{empty_title}
\n
#{empty_text}
\n
"; - var html$v = "
\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
"; + var html$_ = "
\n
\n \n \n
\n
\n
\n
\n
\n
\n
"; - var html$u = "
\n
\n
\n
"; + var html$Z = "
\n\n
\n
#{plugins_catalog_work}
\n
#{plugins_catalog_work_descr}
\n
\n \n
\n
\n\n
\n
#{plugins_catalog_popular}
\n
#{plugins_catalog_popular_descr}
\n
\n \n
\n
\n
"; - var html$t = "
\n
\n \n \n \n \n \n \n \n \n\n \n 0\n \n \n 5\n \n \n 10\n \n \n 15\n \n \n 20\n \n \n 30\n \n \n 60\n \n \n 100\n \n \n 200\n \n \n 500\n \n \n 0.000\n Mbps\n \n \n\n \n \n \n
\n
"; + var html$Y = "
\n
{text}
\n\n
\n\n
\n \n
\n
"; - var html$s = "
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
"; + var html$X = "
\n
\n
\n \n
\n
\n
\n
\n
\n
"; - var html$r = "
\n
\n\n \n\n
\n\n
\n \n \n \n \n
\n\n
\n
\n
\n
\n
\n
\n\n
\n\n
\n
"; + var html$W = "
\n
\n
"; - var html$q = "
\n
\n
\n #{discuss_rules_title}\n
\n\n
\n
#{discuss_rules_rule_1}
\n
#{discuss_rules_rule_2}
\n
#{discuss_rules_rule_3}
\n
#{discuss_rules_rule_4}
\n
#{discuss_rules_rule_5}
\n
#{discuss_rules_rule_6}
\n
#{discuss_rules_rule_7}
\n
\n
\n
"; + var html$V = "
\n
\n
{title}
\n
\n
\n
"; - var html$p = "
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
"; + var html$U = "
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n
\n
\n
#{player_disabled}
\n
\n
"; - var html$o = "
\n
{icon}
\n
\n \n \n \n \n
\n
"; + var html$T = "
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
#{player_disabled}
\n
\n
\n
"; - var html$n = "
\n
#{install_extension_rule_2}
\n\n

#{install_extension_rule_3}

\n\n

#{install_extension_rule_4}

\n\n

#{install_extension_rule_5}

\n\n

#{install_extension_rule_7}

\n
"; + var html$S = "
\n
\n
\n\n
\n
"; + + var html$R = "
\n
\n \n
\n
\n
\n
\n
"; + + var html$Q = "
\n
\n \n
\n
\n
\n
\n
\n
"; + + var html$P = "
\n
\n \n
\n
"; + + var html$O = "
\n
\n \n \n \n \n
\n\n
\n #{account_create}\n
\n
"; + + var html$N = "
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n\n
\n #{account_limited}\n
\n
"; + + var html$M = "
\n
\n \n
\n
#{account_qr_create}
\n
\n\n
\n
#{account_none_title}
\n
#{account_create}
\n
- #{account_none_include_1}\n
- #{account_none_include_2}\n
- #{account_none_include_3}\n
- #{account_none_include_4}\n
\n\n
#{settings_cub_signin_button}
\n
\n
"; + + var html$L = "
\n
\n \n
\n
#{account_qr_premium}
\n
\n\n
\n
CUB Premium
\n
#{account_premium}
\n
- #{account_premium_include_1}\n
- #{account_premium_include_2}\n
- #{account_premium_include_4}\n
\n
\n
"; + + var html$K = "
\n
CUB Premium
\n
\n #{account_premium}\n
\n
#{account_premium_more}
\n
{site}/premium
\n
"; + + var html$J = "
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n CUB Premium\n
\n
\n #{account_premium}\n
\n
\n
\n
#{account_premium_include_1}#{account_premium_include_text_1}
\n
#{filter_rating_from} 360 #{filter_rating_to} 5 040
\n
\n
\n
#{account_premium_include_2}#{account_premium_include_text_2}
\n
#{filter_rating_from} 100 #{filter_rating_to} 500
\n
\n
\n
#{account_premium_include_3}#{account_premium_include_text_3}
\n
#{filter_rating_from} 1 000 #{filter_rating_to} 10 000
\n
\n
\n
#{account_premium_include_4}#{account_premium_include_text_4}
\n
#{filter_rating_from} 3 #{filter_rating_to} 8
\n
\n
\n
#{account_premium_include_5}#{account_premium_include_text_5}
\n
\n
\n
\n
#{account_premium_include_6}#{account_premium_include_text_6}
\n
\n
\n
\n
#{account_premium_more}
\n
{site}/premium
\n
"; + + var html$I = "
\n
\n
\n
\n
\n
\n
\n \"\"\n
\n
\n
\n
\n
\n \n \n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
"; + + var html$H = "
\n \n \n \n \n \n \n
"; + + var html$G = "
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n #{https_text}\n
\n
"; + + var html$F = "
\n
\n
\n
\n \n
\n
#{back}
\n
\n\n
\n
\n \n
\n
#{title_main}
\n
\n\n
\n
\n \n
\n
#{search}
\n
\n\n
\n
\n \n
\n
#{menu_settings}
\n
\n
\n
"; + + var html$E = "
\n
\n \n
\n
{title}
\n
"; + + var html$D = "
\n \n\n
\n #{account_code_where}\n
\n\n
#{account_code_input}
\n
"; + + var html$C = "
\n
\n \n
\n
#{account_qr_code}
\n
\n\n
\n
#{account_add_device_title}
\n
#{account_add_device_text}
\n\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n
"; + + var html$B = "
\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n \n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
"; + + var html$A = "
\n
\n \n
\n\n
\n
\n
\n
\n
"; + + var html$z = "
\n
\n
\n \n \n \n
\n
\n
\n\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
"; + + var html$y = "
\n
\n
\n
"; + + var html$x = "
\n
\n \n \n \n \n \n \n \n \n\n \n 0\n \n \n 5\n \n \n 10\n \n \n 15\n \n \n 20\n \n \n 30\n \n \n 60\n \n \n 100\n \n \n 200\n \n \n 500\n \n \n 0.000\n Mbps\n \n \n\n \n \n \n
\n
"; + + var html$w = "
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
"; + + var html$v = "
\n
\n\n \n\n
\n\n
\n \n \n \n \n
\n\n
\n
\n
\n
\n
\n
\n\n
\n\n
\n
"; + + var html$u = "
\n
\n
\n #{discuss_rules_title}\n
\n\n
\n
#{discuss_rules_rule_1}
\n
#{discuss_rules_rule_2}
\n
#{discuss_rules_rule_3}
\n
#{discuss_rules_rule_4}
\n
#{discuss_rules_rule_5}
\n
#{discuss_rules_rule_6}
\n
#{discuss_rules_rule_7}
\n
\n
\n
"; + + var html$t = "
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
"; + + var html$s = "
\n
{icon}
\n
\n \n \n \n \n
\n
"; + + var html$r = "
\n
#{install_extension_rule_2}
\n\n

#{install_extension_rule_3}

\n\n

#{install_extension_rule_4}

\n\n

#{install_extension_rule_5}

\n\n

#{install_extension_rule_7}

\n
"; + + var html$q = "
\n
\n
{text}
\n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n
"; + + var html$p = "
\n
\n \n
\n
\n \n
\n
"; + + var html$o = "\n\n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n\n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n\n\n"; var templates = { - head: html$23, - wrap: html$22, - menu: html$21, - activitys: html$20, - activity: html$1$, - activity_wait_refresh: html$1_, - settings: html$1Y, - settings_main: html$1X, - settings_interface: html$1W, - settings_parser: html$1V, - settings_server: html$1U, - settings_player: html$1T, - settings_more: html$1S, - settings_tmdb: html$1R, - settings_plugins: html$1Q, - settings_account: html$1P, - scroll: html$1Z, - items_line: html$1O, - card: html$1N, - card_parser: html$1M, - card_watched: html$1L, - card_episode: html$1K, - full_start: html$1J, - full_start_new: html$1I, - full_descr: html$1H, - full_person: html$1G, - full_review: html$1F, - full_episode: html$1E, - player: html$1D, - player_panel: html$1C, - player_video: html$1B, - player_info: html$1A, - player_footer: html$1z, - player_footer_card: html$1y, - selectbox: html$1x, - selectbox_item: html$1w, - info: html$1u, - more: html$1s, - search: html$1r, - settings_input: html$1q, - modal: html$1p, - company: html$1o, - modal_loading: html$1n, - modal_pending: html$1m, - person_start: html$1l, - empty: html$1k, - empty_filter: html$1j, - notice: html$1i, - notice_card: html$1h, - torrent: html$1g, - torrent_file: html$1f, - files: html$1e, - about: html$1d, - error: html$1c, - torrent_noconnect: html$18, - torrent_file_serial: html$13, - torrent_nocheck: html$17, - torrent_nohash: html$16, - torrent_install: html$15, - torrent_error: html$14, - filter: html$1t, - search_box: html$12, - console: html$11, - icon_star: html$10, - icon_viewed: html$$, - icon_lock: html$_, - icon_like: html$Z, - icon_text: html$Y, - icon_card: html$X, - timeline: html$W, - timeline_details: html$V, - list_empty: html$U, - screensaver: html$T, - plugins_catalog: html$S, - broadcast: html$R, - lang_choice: html$Q, - extensions: html$P, - extensions_block: html$O, - extensions_item: html$N, - extensions_recomend: html$M, - extensions_info: html$L, - extensions_theme: html$K, - extensions_screensaver: html$J, - iframe: html$I, - account: html$H, - account_limited: html$G, - cub_premium: html$F, - cub_premium_modal: html$E, - selectbox_icon: html$1v, - explorer: html$D, - explorer_button_back: html$C, - https: html$B, - navigation_bar: html$A, - head_backward: html$z, - account_add_device: html$y, - feed_item: html$x, - feed_head: html$w, - feed_episode: html$v, - register: html$u, - speedtest: html$t, - season_episode: html$1b, - season_episode_rate: html$1a, - season_info: html$19, - ad_bot: html$s, - ad_video_block: html$r, - discuss_rules: html$q, - bookmarks_folder: html$p, - ai_search_animation: html$o, - plugins_rules: html$n + head: html$2q, + wrap: html$2p, + menu: html$2o, + activitys: html$2n, + activity: html$2m, + activity_wait_refresh: html$2l, + settings: html$2j, + settings_main: html$2i, + settings_interface: html$2h, + settings_parser: html$2g, + settings_server: html$2f, + settings_player: html$2e, + settings_more: html$2d, + settings_tmdb: html$2c, + settings_plugins: html$2b, + settings_account: html$2a, + scroll: html$2k, + items_line: html$29, + card: html$28, + card_parser: html$27, + card_watched: html$26, + card_episode: html$25, + full_start_new: html$24, + full_descr: html$23, + full_person: html$22, + full_review: html$21, + full_episode: html$20, + player: html$1$, + player_panel: html$1_, + player_video: html$1Z, + player_info: html$1Y, + player_footer: html$1X, + player_footer_card: html$1W, + selectbox: html$1V, + selectbox_item: html$1U, + info: html$1S, + more: html$1Q, + search: html$1P, + settings_input: html$1O, + modal: html$1N, + company: html$1M, + modal_loading: html$1L, + modal_pending: html$1K, + modal_qr: html$1J, + person_start: html$1I, + empty: html$1H, + empty_filter: html$1G, + notice: html$1F, + notice_card: html$1E, + torrent: html$1D, + torrent_file: html$1C, + files: html$1B, + about: html$1A, + error: html$1z, + torrent_noconnect: html$1v, + torrent_file_serial: html$1q, + torrent_nocheck: html$1u, + torrent_nohash: html$1t, + torrent_install: html$1s, + torrent_error: html$1r, + filter: html$1R, + search_box: html$1p, + console: html$1o, + icon_star: html$1n, + icon_viewed: html$1m, + icon_lock: html$1l, + icon_like: html$1k, + icon_text: html$1j, + icon_card: html$1i, + icon_top: html$1h, + icon_fire: html$1g, + icon_hd: html$1f, + icon_collection: html$1e, + icon_search: html$1d, + icon_settings: html$1c, + icon_bell: html$1b, + icon_bell_plus: html$1a, + icon_broadcast: html$19, + icon_create_account: html$18, + icon_empty_subscribe: html$17, + icon_empty_bookmarks: html$16, + icon_empty_history: html$15, + icon_empty_torrents: html$14, + icon_profile: html$13, + icon_back: html$12, + timeline: html$11, + timeline_details: html$10, + list_empty: html$$, + screensaver: html$_, + plugins_catalog: html$Z, + broadcast: html$Y, + lang_choice: html$X, + extensions: html$W, + extensions_block: html$V, + extensions_item: html$U, + extensions_recomend: html$T, + extensions_info: html$S, + extensions_theme: html$R, + extensions_screensaver: html$Q, + iframe: html$P, + account: html$O, + account_limited: html$N, + account_none: html$M, + account_premium: html$L, + cub_premium: html$K, + cub_premium_modal: html$J, + selectbox_icon: html$1T, + explorer: html$I, + explorer_button_back: html$H, + https: html$G, + navigation_bar: html$F, + head_backward: html$E, + account_add_device: html$D, + account_add_device_new: html$C, + feed_item: html$B, + feed_head: html$A, + feed_episode: html$z, + register: html$y, + speedtest: html$x, + season_episode: html$1y, + season_episode_rate: html$1x, + season_info: html$1w, + ad_bot: html$w, + ad_video_block: html$v, + discuss_rules: html$u, + bookmarks_folder: html$t, + ai_search_animation: html$s, + plugins_rules: html$r, + remote_helper: html$q, + watched_history: html$p, + icons_sprite: html$o }; var created = {}; + /** + * Получить шаблон + * @param {string} name - имя шаблона + * @param {object} [vars] - переменные для подстановки + * @param {boolean} [like_static=false] - вернуть как строку, а не jQuery объект + * @returns {jQuery|string} - jQuery объект или строка + */ - function get$f(name) { + function get$h(name) { var vars = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var like_static = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var tpl = templates[name]; if (!tpl) throw 'Template [' + name + '] not found'; - tpl = Lang.translate(tpl); + tpl = Lang$1.translate(tpl); for (var n in vars) { tpl = tpl.replace(new RegExp('{' + n + '}', 'g'), vars[n]); @@ -2621,68 +2841,246 @@ }); return like_static ? tpl : $(tpl); } + /** + * Получить шаблон как DOM элемент с возможностью подстановки переменных и вложенных DOM элементов + * @param {string} name - имя шаблона + * @param {object} [vars] - переменные для подстановки. Если значение - DOM элемент, он будет вставлен в шаблон + * @returns {HTMLElement} - DOM элемент + */ - function build$a(tree) { - function create(item) { - var elem = item.elem.cloneNode(); //document.createElement(item.tag) - /* - if(!item.elem && item.attributes){ - for(let i = 0; i < item.attributes.length; i++){ - elem.setAttribute(item.attributes[i].name, item.attributes[i].value) - } - } - */ + function js(name) { + var vars = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - item.clildrens.forEach(function (child_data) { - var child = create(child_data); - elem.appendChild(child); - }); - return elem; + if (!created[name]) { + // создаём чистый шаблон без переменных + var raw = get$h(name, {}, false)[0]; + created[name] = raw.cloneNode(true); // кэшируем "чистый" DOM + } // клонируем кэш + + + var cloned = created[name].cloneNode(true); // подставим значения + + if (vars && Object.keys(vars).length > 0) { + replaceVars(cloned, vars); } - var root = create(tree); - return root; + return cloned; } - function js(name, vars) { - if (!created[name]) { - var extract = function extract(elem) { - var data = { - tag: elem.tagName, - attributes: elem.attributes, - elem: elem, - clildrens: [] - }; + function getValueFromPath(obj, path) { + return path.split('.').reduce(function (acc, key) { + return acc && acc[key] != null ? acc[key] : ''; + }, obj); + } - for (var i = 0; i < elem.childNodes.length; i++) { - if (elem.childNodes[i].tagName) data.clildrens.push(extract(elem.childNodes[i])); + function replaceVars(root, vars) { + var varRegex = /\{\{([a-zA-Z0-9_.]+)\}\}|\{([a-zA-Z0-9_]+)\}/g; + + function processNode(node) { + // Если это текстовый узел и в нём есть подстановки + if (node.nodeType === Node.TEXT_NODE) { + var text = node.textContent; + var matches = []; + var m; // эквивалент [...text.matchAll(varRegex)] + + while ((m = varRegex.exec(text)) !== null) { + matches.push(m); } - return data; - }; + if (matches.length > 0) { + var parent = node.parentNode; // создаём новый документ-фрагмент для вставки - var tpl = get$f(name); - var tree = extract(tpl[0]); - created[name] = tree; + var fragment = document.createDocumentFragment(); + var lastIndex = 0; + + var _iterator = _createForOfIteratorHelper(matches), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var match = _step.value; + var index = match.index; + var raw = match[0]; + var key = match[1] || match[2]; + var value = getValueFromPath(vars, key); // Добавляем текст до переменной + + if (index > lastIndex) { + fragment.appendChild(document.createTextNode(text.slice(lastIndex, index))); + } // Вставляем значение + + + if (value instanceof Node) { + fragment.appendChild(value.cloneNode(true)); // вставляем DOM + } else { + fragment.appendChild(document.createTextNode(String(value))); + } + + lastIndex = index + raw.length; + } // Добавляем оставшийся текст + + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + if (lastIndex < text.length) { + fragment.appendChild(document.createTextNode(text.slice(lastIndex))); + } // заменяем оригинальный текстовый узел + + + parent.replaceChild(fragment, node); + return; // больше не обрабатывать + } + } // Если есть атрибуты — заменим только строки + // Не работает на старых браузерах, и не помню что оно делает + // if (node.attributes) { + // for (let attr of node.attributes) { + // attr.value = attr.value.replace(varRegex, (_, nested, flat) => { + // const key = nested || flat; + // const value = getValueFromPath(vars, key); + // return value instanceof Node ? '' : String(value); + // }); + // } + // } + // Рекурсивно обрабатываем детей + + + for (var _i = 0, _Array$from = Array.from(node.childNodes); _i < _Array$from.length; _i++) { + var child = _Array$from[_i]; + processNode(child); + } } - return build$a(created[name]); + processNode(root); } + /** + * Найти элементы по префиксу класса + * @param {HTMLElement|jQuery} root - корневой элемент для поиска + * @param {string} pref - префикс класса + * @return {object} - объект с найденными элементами, ключи - части классов после префикса + */ - function add$e(name, html) { + + function prefix(root, pref) { + var result = {}; // поддержка и для jQuery, и для обычного DOM + + var base = root instanceof jQuery ? root[0] : root; + Array.from(base.querySelectorAll("[class*=\"".concat(pref, "__\"]"))).forEach(function (elem) { + Array.from(elem.classList).forEach(function (cls) { + if (cls.indexOf(pref + '__') === 0) { + var key = cls.slice(pref.length + 2); // удалить pref__ + + result[key] = elem; + } + }); + }); + return result; + } + /** + * Создать DOM элемент с возможностью добавления классов, атрибутов, текста, HTML и детей + * @param {string} tag - имя тега + * @param {object} [options] - опции для создания элемента + * @param {string|string[]} [options.class] - класс или массив классов + * @param {object} [options.attrs] - атрибуты в формате {имя: значение} + * @param {string} [options.text] - текстовое содержимое + * @param {string} [options.html] - HTML содержимое + * @param {HTMLElement|jQuery|Array} [options.children] - дочерний элемент, jQuery объект или массив из них + * @returns {HTMLElement} - созданный DOM элемент + */ + + + function elem(tag) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var element = document.createElement(tag); // Добавляем классы + + if (options["class"]) { + element.addClass(options["class"]); + } // Добавляем атрибуты + + + if (options.attrs) { + for (var _i2 = 0, _Object$entries = Object.entries(options.attrs); _i2 < _Object$entries.length; _i2++) { + var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2), + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + + element.setAttribute(key, value); + } + } // Текст + + + if (options.text) { + element.textContent = options.text; + } // HTML + + + if (options.html) { + element.innerHTML = options.html; + } // Дети + + + if (options.children) { + var children = Array.isArray(options.children) ? options.children : [options.children]; + + var _iterator2 = _createForOfIteratorHelper(children), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var child = _step2.value; + element.appendChild(child); + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + } + + return element; + } + /** + * Добавить или обновить шаблон + * @param {string} name - имя шаблона + * @param {string} html - HTML шаблона + * @returns {void} + */ + + + function add$h(name, html) { + delete created[name]; templates[name] = html; } + /** + * Получить все шаблоны + * @returns {object} - объект со всеми шаблонами + */ - function all$4() { + + function all$5() { return templates; } + /** + * Получить строковое представление шаблона + * @param {string} name - имя шаблона + * @returns {string} - HTML шаблона + */ + + + function string(name) { + return templates[name] || ''; + } var Template = { - get: get$f, + get: get$h, js: js, - add: add$e, - all: all$4 + add: add$h, + all: all$5, + string: string, + prefix: prefix, + elem: elem }; var Base64 = { @@ -2797,31 +3195,106 @@ } }; - var html$m = $('
'), - body$3 = html$m.find('.noty__text'), + var html$n = $('
'), + body$2 = html$n.find('.noty__text'), time$4; + /** + * Отображает уведомление + * @param {string} text - текст уведомления + * @param {Object} [params] - дополнительные параметры + * @param {string} [params.style] - стиль уведомления, например 'error', 'success' и т.д. + * @param {number} [params.time=3000] - время отображения уведомления в миллисекундах + * @returns {void} + */ - function show$a(text) { + function show$c(text) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; clearTimeout(time$4); - html$m.attr('class', 'noty'); - if (params.style) html$m.addClass('noty--style--' + params.style); + html$n.attr('class', 'noty'); + if (params.style) html$n.addClass('noty--style--' + params.style); time$4 = setTimeout(function () { - html$m.removeClass('noty--visible'); + html$n.removeClass('noty--visible'); }, params.time || 3000); - body$3.html(text); - html$m.addClass('noty--visible'); + body$2.html(text); + html$n.addClass('noty--visible'); } function render$i() { - return html$m; + return html$n; } var Noty = { - show: show$a, + show: show$c, render: render$i }; + var timers$1 = []; + var paused$1 = false; + + function init$19() { + setInterval(function () { + if (paused$1) return; + var now = Date.now(); + timers$1.forEach(function (t) { + if (now - t.last >= t.interval) { + t.last = now; + + try { + t.call(); + } catch (e) { + console.error('Timer', 'call error:', e); + } + } + }); + }, 1000); + document.addEventListener('visibilitychange', function () { + paused$1 = document.visibilityState !== 'visible'; // Обновить метки времени, чтобы таймеры не "догоняли" + + timers$1.forEach(function (t) { + return t.last = Date.now(); + }); // Вызвать отложенные таймеры + + if (document.visibilityState == 'visible') timers$1.forEach(function (t) { + return t.immediate && t.call(); + }); + }); + } + /** + * Добавить таймер + * @param {integer} interval - интервал в миллисекундах + * @param {function} call - функция для вызова + * @returns {void} + */ + + + function add$g(interval, call) { + var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + timers$1.push({ + interval: interval, + call: call, + last: Date.now(), + immediate: immediate + }); + } + /** + * Удалить таймер + * @param {function} call - функция для вызова + * @returns {void} + */ + + + function remove$5(call) { + timers$1 = timers$1.filter(function (t) { + return t.call !== call; + }); + } + + var Timer = { + init: init$19, + add: add$g, + remove: remove$5 + }; + var card_fields = ['poster_path', 'overview', 'release_date', 'genre_ids', 'id', 'original_title', 'original_language', 'title', 'backdrop_path', 'popularity', 'vote_count', 'vote_average', 'imdb_id', 'kinopoisk_id', 'original_name', 'name', 'first_air_date', 'origin_country', 'status', 'pg', 'release_quality', 'imdb_rating', 'kp_rating', 'source', 'number_of_seasons', 'number_of_episodes', 'next_episode_to_air', 'img', 'poster', 'background_image']; /** * Преобразование секунд в формат времени @@ -2893,15 +3366,15 @@ function bytesToSize(bytes, speed) { if (bytes == 0) { - return Lang.translate('size_zero'); + return Lang$1.translate('size_zero'); } var unitMultiple = 1024; - var unitNames = [Lang.translate('size_byte'), Lang.translate('size_kb'), Lang.translate('size_mb'), Lang.translate('size_gb'), Lang.translate('size_tb'), Lang.translate('size_pp')]; + var unitNames = [Lang$1.translate('size_byte'), Lang$1.translate('size_kb'), Lang$1.translate('size_mb'), Lang$1.translate('size_gb'), Lang$1.translate('size_tb'), Lang$1.translate('size_pp')]; if (speed) { unitMultiple = 1000; - unitNames = [Lang.translate('speed_bit'), Lang.translate('speed_kb'), Lang.translate('speed_mb'), Lang.translate('speed_gb'), Lang.translate('speed_tb'), Lang.translate('speed_pp')]; + unitNames = [Lang$1.translate('speed_bit'), Lang$1.translate('speed_kb'), Lang$1.translate('speed_mb'), Lang$1.translate('speed_gb'), Lang$1.translate('speed_tb'), Lang$1.translate('speed_pp')]; } var unitChanges = Math.floor(Math.log(bytes) / Math.log(unitMultiple)); @@ -2933,7 +3406,7 @@ var all = []; for (var i = 1; i <= 12; i++) { - all.push(Lang.translate('month_' + i + need)); + all.push(Lang$1.translate('month_' + i + need)); } return all; @@ -2944,7 +3417,7 @@ var where = html instanceof jQuery ? html[0] : html; var months = getMoths(); var months_end = getMoths(true); - var days = [Lang.translate('day_7'), Lang.translate('day_1'), Lang.translate('day_2'), Lang.translate('day_3'), Lang.translate('day_4'), Lang.translate('day_5'), Lang.translate('day_6')]; + var days = [Lang$1.translate('day_7'), Lang$1.translate('day_1'), Lang$1.translate('day_2'), Lang$1.translate('day_3'), Lang$1.translate('day_4'), Lang$1.translate('day_5'), Lang$1.translate('day_6')]; var elem_clock = where.querySelector('.time--clock'); var elem_week = where.querySelector('.time--week'); var elem_day = where.querySelector('.time--day'); @@ -2980,7 +3453,11 @@ if (elem_full) elem_full.innerText = current_day + ' ' + months_end[date.getMonth()] + ' ' + time[3]; }; - this.timer = setInterval(this.tik.bind(this), 60000); + this.destroy = function () { + Timer.remove(this.tik); + }; + + Timer.add(60000, this.tik, true); this.tik(); }; @@ -2998,7 +3475,7 @@ function parseTime(str) { var months = getMoths(); var months_end = getMoths(true); - var days = [Lang.translate('day_7'), Lang.translate('day_1'), Lang.translate('day_2'), Lang.translate('day_3'), Lang.translate('day_4'), Lang.translate('day_5'), Lang.translate('day_6')]; + var days = [Lang$1.translate('day_7'), Lang$1.translate('day_1'), Lang$1.translate('day_2'), Lang$1.translate('day_3'), Lang$1.translate('day_4'), Lang$1.translate('day_5'), Lang$1.translate('day_6')]; var date = parseToDate(str); var time = [date.getHours(), date.getMinutes(), date.getSeconds(), date.getFullYear()]; @@ -3039,7 +3516,7 @@ var seconds = Math.round(sec_num % 60); // Остаток от деления для секунд - return (hours ? hours + ' ' + Lang.translate('time_h') + ' ' : '') + (minutes ? minutes + ' ' + Lang.translate('time_m') + ' ' : '') + (hours === 0 && minutes === 0 ? seconds + ' ' + Lang.translate('time_s') : ''); + return (hours ? hours + ' ' + Lang$1.translate('time_h') + ' ' : '') + (minutes ? minutes + ' ' + Lang$1.translate('time_m') + ' ' : '') + (hours === 0 && minutes === 0 ? seconds + ' ' + Lang$1.translate('time_s') : ''); } function strToTime(str) { @@ -3118,7 +3595,7 @@ }; s.onerror = function () { - if (l) console.log('Script', 'error:', u); + if (l) console.warn('Script', 'error:', u); if (error) error(u); next(); }; @@ -3152,7 +3629,7 @@ }; s.onerror = function () { - if (l) console.log('Script', 'error:', u); + if (l) console.warn('Script', 'error:', u); if (error) error(u); check(); }; @@ -3291,25 +3768,25 @@ } function imgLoad(image, src, onload, onerror) { - var img = $(image)[0]; + var img = image instanceof jQuery ? image[0] : image; img.onload = function () { - if (onload) onload(); + onload && onload(img); }; - img.onerror = function (e) { + img.onerror = function () { img.src = './img/img_broken.svg'; - if (onerror) onerror(); + onerror && onerror(img); }; img.src = src; } function isTouchDevice() { - var touch = ('ontouchstart' in window); + if (!('ontouchstart' in window)) return false; var points = navigator.maxTouchPoints > 0 && navigator.maxTouchPoints !== 256 || navigator.msMaxTouchPoints > 0 && navigator.msMaxTouchPoints !== 256; var win = navigator.userAgent.toLowerCase().indexOf('windows nt') !== -1; - return touch || points && !win; + return points && !win; } function canFullScreen() { @@ -3585,7 +4062,80 @@ return gi; } - var Utils$2 = { + function createInstance(BaseClass, element) { + var add_params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var replace = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + Arrays.extend(element, { + params: {} + }); + Arrays.extend(element.params, add_params, replace); + var item = typeof element.params.createInstance == 'function' ? element.params.createInstance(element) : new BaseClass(element); + if (!item) return console.error('createInstance function must return class', element); + + if (element.params.emit && _typeof(element.params.emit) == 'object' && typeof item.use == 'function') { + item.use(element.params.emit); + + if (typeof element.params.emit.onInit == 'function') { + element.params.emit.onInit(item); + } + } + + return item; + } + + function extendParams(element) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + Arrays.extend(element, { + params: {} + }); + Arrays.extend(element.params, params, replace); + } + + function extendItemsParams(items) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (!items || !items.length) return; + + for (var i = 0; i < items.length; i++) { + if (!items[i]) continue; + extendParams(items[i], params, replace); + } + } + + function qrcode(text, element, error) { + try { + var qr = window.qrcode(0, 'H'); + qr.addData(text, 'Byte'); + qr.make(); + if (element instanceof jQuery) element = element[0]; + element.innerHTML = qr.createSvgTag({ + cellSize: 8, + margin: 10 + }); + } catch (e) { + error && error(e); + } + } + + function onceInit(func) { + var inited = false; + return function () { + if (inited) return; + inited = true; + return func.apply(void 0, arguments); + }; + } + + function containsJapanese(text) { + return /[\u3040-\u30FF\u31F0-\u31FF\uFF66-\uFF9F\u4E00-\u9FFF]/.test(text); + } + + function randomMinMax(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min); + } + + var Utils$1 = { secondsToTime: secondsToTime, secondsToTimeHuman: secondsToTimeHuman, capitalizeFirstLetter: capitalizeFirstLetter, @@ -3636,7 +4186,14 @@ fixMirrorLink: fixMirrorLink, callWaiting: callWaiting, clearCard: clearCard, - qualityToText: qualityToText + qualityToText: qualityToText, + createInstance: createInstance, + extendParams: extendParams, + extendItemsParams: extendItemsParams, + qrcode: qrcode, + onceInit: onceInit, + containsJapanese: containsJapanese, + randomMinMax: randomMinMax }; var widgetAPI, @@ -3646,9 +4203,9 @@ orsay_loaded, orsay_call = Date.now(); - function init$Y() { + function init$18() { $('body').append($("
\n \n \n \n
")); - Utils$2.putScript(['$MANAGER_WIDGET/Common/API/Widget.js', '$MANAGER_WIDGET/Common/API/TVKeyValue.js', '$MANAGER_WIDGET/Common/API/Plugin.js', '$MANAGER_WIDGET/Common/webapi/1.0/webapis.js', '$MANAGER_WIDGET/Common/IME_XT9/ime.js', '$MANAGER_WIDGET/Common/IME_XT9/inputCommon/ime_input.js'], function () { + Utils$1.putScript(['$MANAGER_WIDGET/Common/API/Widget.js', '$MANAGER_WIDGET/Common/API/TVKeyValue.js', '$MANAGER_WIDGET/Common/API/Plugin.js', '$MANAGER_WIDGET/Common/webapi/1.0/webapis.js', '$MANAGER_WIDGET/Common/IME_XT9/ime.js', '$MANAGER_WIDGET/Common/IME_XT9/inputCommon/ime_input.js'], function () { try { if (typeof Common !== 'undefined' && Common.API && Common.API.TVKeyValue && Common.API.Plugin && Common.API.Widget) { widgetAPI = new Common.API.Widget(); @@ -3738,7 +4295,7 @@ } var Orsay = { - init: init$Y, + init: init$18, isNewWidget: isNewWidget, getLoaderUrl: getLoaderUrl, setLoaderUrl: setLoaderUrl, @@ -4574,10 +5131,10 @@ imageDataRGB: processImageDataRGB }; - var canvas$1 = document.createElement('canvas'), - ctx$1 = canvas$1.getContext('2d'); - canvas$1.width = 30; - canvas$1.height = 17; + var canvas = document.createElement('canvas'), + ctx = canvas.getContext('2d'); + canvas.width = 30; + canvas.height = 17; var canvas_poster = document.createElement('canvas'), ctx_poster = canvas_poster.getContext('2d'); @@ -4741,30 +5298,30 @@ } function reset$1(width, height) { - canvas$1.width = width; - canvas$1.height = height; + canvas.width = width; + canvas.height = height; } - function get$e(img) { + function get$g(img) { reset$1(30, 17); - var ratio = Math.max(canvas$1.width / img.width, canvas$1.height / img.height); + var ratio = Math.max(canvas.width / img.width, canvas.height / img.height); var nw = img.width * ratio, nh = img.height * ratio; - ctx$1.drawImage(img, -(nw - canvas$1.width) / 2, -(nh - canvas$1.height) / 2, nw, nh); - return extract$2(ctx$1.getImageData(0, 0, canvas$1.width, canvas$1.height)); + ctx.drawImage(img, -(nw - canvas.width) / 2, -(nh - canvas.height) / 2, nw, nh); + return extract$2(ctx.getImageData(0, 0, canvas.width, canvas.height)); } function blur$1(img, callback) { reset$1(200, 130); - var ratio = Math.max(canvas$1.width / img.width, canvas$1.height / img.height); + var ratio = Math.max(canvas.width / img.width, canvas.height / img.height); var nw = img.width * ratio, nh = img.height * ratio; - ctx$1.drawImage(img, -(nw - canvas$1.width) / 2, -(nh - canvas$1.height) / 2, nw, nh); - Blur.canvasRGB(canvas$1, 0, 0, canvas$1.width, canvas$1.height, 80, function () { + ctx.drawImage(img, -(nw - canvas.width) / 2, -(nh - canvas.height) / 2, nw, nh); + Blur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 80, function () { var nimg = new Image(); try { - nimg.src = canvas$1.toDataURL(); + nimg.src = canvas.toDataURL(); } catch (e) {} setTimeout(function () { @@ -4827,7 +5384,7 @@ } var Color = { - get: get$e, + get: get$g, extract: extract$2, palette: palette, rgba: rgba, @@ -4839,357 +5396,12 @@ blurPoster: blurPoster }; - var IndexedDB = /*#__PURE__*/function () { - function IndexedDB(database_name) { - var tables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - var version = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3; - - _classCallCheck(this, IndexedDB); - - this.listener = start$8(); - this.database_name = 'lampa_' + database_name; - this.tables = tables; - this.version = version; - this.db = null; - this.logs = true; - } - - _createClass(IndexedDB, [{ - key: "log", - value: function log(err, store_name, key) { - if (this.logs) console.log('DB', this.database_name + (store_name ? '_' + store_name : '') + (key ? ' -> [' + key + ']' : ''), err); - } - }, { - key: "openDatabase", - value: function openDatabase() { - var _this = this; - - return new Promise(function (resolve, reject) { - if (!('indexedDB' in window)) return _this.log('Not supported'), reject('Not supported'); - if (!_this.tables.length) return _this.log('No tables'), reject('No tables'); - var request = indexedDB.open(_this.database_name, _this.version); - - request.onerror = function (event) { - _this.log(request.error || 'An error occurred while opening the database'); - - reject(request.error || 'An error occurred while opening the database'); - }; - - request.onsuccess = function (event) { - _this.db = event.target.result; - resolve(); - }; - - request.onupgradeneeded = function (event) { - var db = event.target.result; - - _this.log('OnUpgradeNeeded'); - - _this.tables.forEach(function (name) { - if (!db.objectStoreNames.contains(name)) { - _this.log('Create table - ' + name); - - db.createObjectStore(name, { - keyPath: 'key' - }); - } - }); - }; - }); - } - }, { - key: "addData", - value: function addData(store_name, key, value) { - var _this2 = this; - - return new Promise(function (resolve, reject) { - if (!_this2.db) { - return _this2.log('Database not open', store_name, key), reject('Database not open'); - } - - var transaction = _this2.db.transaction([store_name], 'readwrite'); - - var objectStore = transaction.objectStore(store_name); - var addRequest = objectStore.add({ - key: key, - value: value, - time: Date.now() - }); - - addRequest.onerror = function (event) { - _this2.log(addRequest.error || 'An error occurred while adding data', store_name, key); - - reject(addRequest.error || 'An error occurred while adding data'); - }; - - addRequest.onsuccess = resolve; - }); - } - }, { - key: "getData", - value: function getData(store_name, key) { - var _this3 = this; - - var life_time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1; - return new Promise(function (resolve, reject) { - if (!_this3.db) { - return _this3.log('Database not open', store_name, key), reject('Database not open'); - } - - var transaction = _this3.db.transaction([store_name], 'readonly'); - - var objectStore = transaction.objectStore(store_name); - var getRequest = key ? objectStore.get(key) : objectStore.getAll(); - - getRequest.onerror = function (event) { - _this3.log(getRequest.error || 'An error occurred while retrieving data', store_name, key); - - reject(getRequest.error || 'An error occurred while retrieving data'); - }; - - getRequest.onsuccess = function (event) { - var result = event.target.result; - - if (result) { - if (key) { - if (life_time == -1) resolve(result.value);else { - if (Date.now() < result.time + life_time * 1000 * 60) resolve(result.value);else resolve(null); - } - } else resolve(result.map(function (r) { - return r.value; - })); - } else { - resolve(null); - } - }; - }); - } - }, { - key: "getDataAnyCase", - value: function getDataAnyCase(store_name, key, life_time) { - var _this4 = this; - - return new Promise(function (resolve, reject) { - _this4.getData(store_name, key, life_time).then(resolve)["catch"](function () { - resolve(null); - }); - }); - } - }, { - key: "updateData", - value: function updateData(store_name, key, value) { - var _this5 = this; - - return new Promise(function (resolve, reject) { - if (!_this5.db) { - return _this5.log('Database not open', store_name, key), reject('Database not open'); - } - - var transaction = _this5.db.transaction([store_name], 'readwrite'); - - var objectStore = transaction.objectStore(store_name); - var getRequest = objectStore.get(key); - - getRequest.onerror = function (event) { - _this5.log(getRequest.error || 'An error occurred while updating data', store_name, key); - - reject(getRequest.error || 'An error occurred while updating data'); - }; - - getRequest.onsuccess = function (event) { - var result = event.target.result; - - if (result) { - result.value = value; - result.time = Date.now(); - var updateRequest = objectStore.put(result); - - updateRequest.onerror = function (event) { - _this5.log(updateRequest.error || 'An error occurred while updating data', store_name, key); - - reject(updateRequest.error || 'An error occurred while updating data'); - }; - - updateRequest.onsuccess = resolve; - } else { - _this5.log('No data found with the given key', store_name, key); - - reject('No data found with the given key'); - } - }; - }); - } - }, { - key: "rewriteData", - value: function rewriteData(store_name, key, value) { - var _this6 = this; - - return new Promise(function (resolve, reject) { - if (!_this6.db) { - return _this6.log('Database not open', store_name, key), reject('Database not open'); - } - - var transaction = _this6.db.transaction([store_name], 'readwrite'); - - var objectStore = transaction.objectStore(store_name); - var addRequest = objectStore.put({ - key: key, - value: value, - time: Date.now() - }); - - addRequest.onerror = function (event) { - _this6.log(addRequest.error || 'An error occurred while rewrite data', store_name, key); - - reject(addRequest.error || 'An error occurred while rewrite data'); - }; - - addRequest.onsuccess = resolve; - }); - } - }, { - key: "deleteData", - value: function deleteData(store_name, key) { - var _this7 = this; - - return new Promise(function (resolve, reject) { - if (!_this7.db) { - return _this7.log('Database not open', store_name, key), reject('Database not open'); - } - - var transaction = _this7.db.transaction([store_name], 'readwrite'); - - var objectStore = transaction.objectStore(store_name); - var deleteRequest = objectStore["delete"](key); - - deleteRequest.onerror = function (event) { - _this7.log(deleteRequest.error || 'An error occurred while deleting data', store_name, key); - - reject(deleteRequest.error || 'An error occurred while deleting data'); - }; - - deleteRequest.onsuccess = resolve; - }); - } - }, { - key: "clearTable", - value: function clearTable(store_name) { - var _this8 = this; - - return new Promise(function (resolve, reject) { - if (!_this8.db) { - return _this8.log('Database not open', store_name), reject('Database not open'); - } - - var transaction = _this8.db.transaction([store_name], 'readwrite'); - - var objectStore = transaction.objectStore(store_name); - var clearRequest = objectStore.clear(); - - clearRequest.onerror = function (event) { - _this8.log(clearRequest.error || 'An error occurred while clearing the table', store_name); - - reject(clearRequest.error || 'An error occurred while clearing the table'); - }; - - clearRequest.onsuccess = function () { - resolve(); - }; - }); - } - }, { - key: "clearAll", - value: function clearAll() { - var _this9 = this; - - return new Promise(function (resolve, reject) { - if (!_this9.db) { - return _this9.log('Database not open'), reject('Database not open'); - } - - var objectStoreNames = _this9.db.objectStoreNames; - var tableNames = Array.from(objectStoreNames); - tableNames.forEach(function (n) { - _this9.clearTable(n); - }); - resolve(); - }); - } - }]); - - return IndexedDB; - }(); - - var Cache = new IndexedDB('cache', ['screensavers', 'plugins', 'backgrounds', 'images', 'themes', 'other', 'timetable', 'cards', 'storage'], 7); - Cache.openDatabase().then(function () { - console.log('Cache', 'worked'); - })["catch"](function () { - console.log('Cache', 'error', 'no open database'); - }); - - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - var waiting = {}; - - function write(img, src) { - if (!Storage.field('cache_images')) return; - - if (src.indexOf('http') === 0) { - if (waiting[src]) return; - waiting[src] = true; - img.crossOrigin = "Anonymous"; - Cache.getData('images', src).then(function (str) { - if (!str || typeof src == 'string') { - setTimeout(function () { - canvas.width = img.naturalWidth || img.width; - canvas.height = img.naturalHeight || img.height; - - try { - ctx.drawImage(img, 0, 0, canvas.width, canvas.height); - canvas.toBlob(function (blob) { - Cache.addData('images', src, blob).then(function () { - console.log('ImagesCache', 'save to cache', src); - delete waiting[src]; - })["catch"](function () { - delete waiting[src]; - }); - }, 'image/jpeg', 1); - } catch (e) { - delete waiting[src]; - } - }, 1500 + Math.round(500 * Math.random())); - } else delete waiting[src]; - })["catch"](function (e) { - delete waiting[src]; - }); - } - } - - function read$1(img, src) { - if (Storage.field('cache_images')) { - Cache.getData('images', src).then(function (str) { - if (str) { - if (typeof str == 'string') img.src = str;else { - img.src = URL.createObjectURL(str); - } - } else img.src = src; - })["catch"](function () { - img.src = src; - }); - } else img.src = src; - } - - var ImageCache = { - write: write, - read: read$1 - }; - function AVPlay$1(call_video) { var stream_url, loaded; console.log('Player', 'run Tizen'); var object = $(''); var video = object[0]; - var listener = start$8(); + var listener = Subscribe$2(); var change_scale_later; var change_speed_later; object.width(window.innerWidth); @@ -5572,7 +5784,31 @@ return object; } - function create$p(object) { + /** + * Статическая машина состояний + * @param {Object} object - Объект состояний и переходов + * @example + let fsm = new StateMachine({ + state: 'idle', //начальное состояние + transitions: { + idle: function() { + console.log('idle') + this.state = 'loading' + this.dispath(this.state) + }, + loading: function() { + console.log('loading') + this.state = 'complete' + this.dispath(this.state) + }, + complete: function() { + console.log('complete') + } + } + }) + fsm.start() // запустить машину + */ + function StateMachine(object) { this.state = object.state; this.start = function () { @@ -5647,15 +5883,15 @@ return this; } - function init$X() { + function init$17() { if (Platform.is('android') || Platform.is('browser') || Platform.is('apple_tv') || Platform.desktop()) { - add$d('hover', { + add$f('hover', { url: object$2.github_lampa + 'sound/hover.ogg' }); - add$d('enter', { + add$f('enter', { url: object$2.github_lampa + 'sound/hover.ogg' }); - add$d('bell', { + add$f('bell', { url: object$2.github_lampa + 'sound/bell.ogg' }); } @@ -5665,7 +5901,7 @@ if (sounds[name] && Storage.field('interface_sound_play')) sounds[name].play(); } - function add$d(name, params) { + function add$f(name, params) { try { sounds[name] = new Sound(params); return sounds[name]; @@ -5675,8 +5911,8 @@ } var Sound$1 = { - init: init$X, - add: add$d, + init: init$17, + add: add$f, play: play$4 }; @@ -5687,16 +5923,15 @@ play_pause: typeof VK_PLAY_PAUSE !== 'undefined' ? VK_PLAY_PAUSE : typeof KEYCODE_MEDIA_PLAY_PAUSE !== 'undefined' ? KEYCODE_MEDIA_PLAY_PAUSE : -1 }; var enabled$2 = false; - var listener$m = start$8(); + var listener$m = Subscribe$2(); var time$2 = 0; var lastdown = 0; - var timer$7; + var timer$8; var longpress; var keydown = false; - var canianimate$1 = typeof requestAnimationFrame !== 'undefined'; var frame_time = 0; - function toggle$b(new_status) { + function toggle$c(new_status) { enabled$2 = new_status; listener$m.send('toggle', { status: enabled$2 @@ -5704,11 +5939,11 @@ } function enable$1() { - toggle$b(true); + toggle$c(true); } function disable() { - toggle$b(false); + toggle$c(false); } function isEnter(keycode) { @@ -5734,7 +5969,7 @@ } function keydownTrigger(e) { - var keycode = keyCode(e); //Noty.show(keycode) + var keycode = keyCode(e); if (time$2 > Date.now() - 100) return; time$2 = Date.now(); listener$m.send('keydown', { @@ -5749,18 +5984,33 @@ if (keycode == 37 || keycode == 4) { Sound$1.play('hover'); + listener$m.send('left', { + code: keycode, + enabled: enabled$2, + event: e + }); Controller.move('left'); } //29460 - Samsung orsay if (keycode == 38 || keycode == 29460) { Sound$1.play('hover'); + listener$m.send('up', { + code: keycode, + enabled: enabled$2, + event: e + }); Controller.move('up'); } //5 - Samsung orsay if (keycode == 39 || keycode == 5) { Sound$1.play('hover'); + listener$m.send('right', { + code: keycode, + enabled: enabled$2, + event: e + }); Controller.move('right'); } //5 - Samsung orsay //29461 - Samsung orsay @@ -5768,18 +6018,33 @@ if (keycode == 40 || keycode == 29461) { Sound$1.play('hover'); + listener$m.send('down', { + code: keycode, + enabled: enabled$2, + event: e + }); Controller.move('down'); } //33 - LG; 427 - Samsung if (keycode == 33 || keycode == 427) { Sound$1.play('hover'); + listener$m.send('toup', { + code: keycode, + enabled: enabled$2, + event: e + }); Controller.move('toup'); } //34 - LG; 428 - Samsung if (keycode == 34 || keycode == 428) { Sound$1.play('hover'); + listener$m.send('todown', { + code: keycode, + enabled: enabled$2, + event: e + }); Controller.move('todown'); } //Абсолютный Enter //10252 - Samsung tizen @@ -5837,7 +6102,11 @@ if (keycode == 8 || keycode == 27 || keycode == 461 || keycode == 10009 || keycode == 88) { e.preventDefault(); - if (window.god_enabled) Lampa.Noty.show('Keypad - [' + keycode + ']' + '[' + window.appready + '] run controller back'); + listener$m.send('back', { + code: keycode, + enabled: enabled$2, + event: e + }); if (window.appready) Controller.back(); return false; } //Exit orsay @@ -5858,24 +6127,28 @@ e.preventDefault(); } - function init$W() { + function init$16() { window.addEventListener("keydown", function (e) { lastdown = keyCode(e); - if (!timer$7) { - timer$7 = setTimeout(function () { + if (!timer$8) { + timer$8 = setTimeout(function () { if (isEnter(lastdown)) { longpress = true; - listener$m.send('longdown', {}); + listener$m.send('longdown', { + code: lastdown, + enabled: enabled$2, + event: e + }); Controller["long"](); } }, 800); } }); window.addEventListener("keyup", function (e) { - clearTimeout(timer$7); + clearTimeout(timer$8); time$2 = 0; - timer$7 = null; + timer$8 = null; listener$m.send('keyup', { code: keyCode(e), enabled: enabled$2, @@ -5885,28 +6158,29 @@ if (!longpress) { if (isEnter(keyCode(e)) && !e.defaultPrevented) { Sound$1.play('enter'); + listener$m.send('enter', { + code: keyCode(e), + enabled: enabled$2, + event: e + }); Controller.enter(); } } else longpress = false; }); window.addEventListener("keydown", function (e) { - if (canianimate$1) { - var cannow = Date.now() - frame_time > 500; - var presed = keydown; - keydown = e; + var cannow = Date.now() - frame_time > 500; + var presed = keydown; + keydown = e; - if (presed === false) { - if (cannow) requestFrame$1();else requestAnimationFrame(requestFrame$1); - } - } else { - keydownTrigger(e); + if (presed === false) { + if (cannow) requestFrame$1();else requestAnimationFrame(requestFrame$1); } }); } var Keypad = { listener: listener$m, - init: init$W, + init: init$16, enable: enable$1, disable: disable }; @@ -5916,7 +6190,7 @@ var move_time = 0; var touch = false; - function init$V() { + function init$15() { Keypad.listener.follow('keydown', function () { keydown_time = Date.now(); move_time = 0; @@ -5926,77 +6200,21 @@ }).on('touchstart', function () { touch = true; }); - detect$9(); - } - - function showModal$1(text, onselect) { - var controller = Controller.enabled().name; - Modal.open({ - title: '', - align: 'center', - zIndex: 300, - html: $('
' + text + '
'), - buttons: [{ - name: Lang.translate('settings_param_no'), - onSelect: function onSelect() { - Modal.close(); - Controller.toggle(controller); - } - }, { - name: Lang.translate('settings_param_yes'), - onSelect: onselect - }], - onBack: function onBack() { - Modal.close(); - Controller.toggle(controller); - } - }); - } - - function detect$9() { - var show_touch, show_mouse, show_remote; - $(document).on('touchstart', function (e) { - if ($('.modal').length || show_touch) return; - - if (!Storage.get('is_true_mobile', 'false') && Platform.screen('tv')) { - show_touch = true; - showModal$1(Lang.translate('input_detection_touch'), function () { - Storage.set('is_true_mobile', 'true'); - window.location.reload(); - }); - } - }).on('click', function (e) { - if ($('.modal').length || show_mouse || !canClick(e.originalEvent)) return; - - if (Storage.field('navigation_type') !== 'mouse' && Platform.screen('tv')) { - show_mouse = true; - showModal$1(Lang.translate('input_detection_mouse'), function () { - Storage.set('navigation_type', 'mouse'); - window.location.reload(); - }); - } - }); - Keypad.listener.follow('keydown', function () { - if ($('.modal').length || show_remote || document.activeElement.tagName == 'INPUT') return; - - if (Storage.get('is_true_mobile', 'false')) { - show_remote = true; - showModal$1(Lang.translate('input_detection_remote'), function () { - Storage.set('is_true_mobile', 'false'); - window.location.reload(); - }); + Storage.listener.follow('change', function (e) { + if (e.name == 'navigation_type') { + Storage.set('is_true_mobile', Boolean(e.value == 'touch'), true); + Controller.toContent(); + window.location.reload(); } }); } function canClick(e) { - //Noty.show('pointerType: ' + e.pointerType + '; type: ' + e.type + '; isTrusted: ' + e.isTrusted) - if (e && e.custom_trigger) return true; - return Date.now() - keydown_time < 500 ? false : touch || Platform.is('browser') || Platform.tv() || Platform.desktop() || Date.now() - move_time < 500; + return Date.now() - keydown_time < 200 ? false : touch || Platform.is('browser') || Platform.tv() || Platform.desktop() || Date.now() - move_time < 200; } function noDubleClick(e) { - if (Date.now() - duble_click_time < 500) { + if (Date.now() - duble_click_time < 200) { e.preventDefault(); e.stopPropagation(); return false; @@ -6007,42 +6225,52 @@ } var DeviceInput = { - init: init$V, + init: init$15, canClick: canClick, noDubleClick: noDubleClick }; - var html$l; + var html$m; var scroll$3; var active$7; - var listener$l = start$8(); + var listener$l = Subscribe$2(); + /** + * Инициализирует селектбокс + * @returns {void} + */ - function init$U() { - html$l = Template.get('selectbox'); - scroll$3 = new create$f({ + function init$14() { + html$m = Template.get('selectbox'); + scroll$3 = new Scroll({ mask: true, over: true }); - html$l.find('.selectbox__body').append(scroll$3.render()); - html$l.find('.selectbox__layer').on('click', function (e) { + html$m.find('.selectbox__body').append(scroll$3.render()); + html$m.find('.selectbox__layer').on('click', function (e) { if (DeviceInput.canClick(e.originalEvent)) Controller.back(); }); scroll$3.addSwipeDown(function () { - html$l.addClass('animate-down'); + html$m.addClass('animate-down'); setTimeout(function () { Controller.back(); }, 200); }); - $('body').append(html$l); + $('body').append(html$m); } + /** + * Заполняет селектбокс элементами + * @returns {void} + */ + function bind$3() { scroll$3.clear(); - html$l.find('.selectbox__title').text(active$7.title); - html$l.toggleClass('selectbox--fullsize', active$7.fullsize ? true : false); + scroll$3.reset(); + html$m.find('.selectbox__title').text(active$7.title); + html$m.toggleClass('selectbox--fullsize', active$7.fullsize ? true : false); active$7.items.forEach(function (element) { if (element.hide) return; - element.title = Utils$2.capitalizeFirstLetter(element.title || ''); + element.title = Utils$1.capitalizeFirstLetter(element.title || ''); if (element.separator) { var _item = $('
' + element.title + '
'); @@ -6067,7 +6295,7 @@ if (!element.noenter) { var goclose = function goclose() { - if (!active$7.nohide) hide$2();else { + if (!active$7.nohide) hide$3();else { scroll$3.render().find('.selected').removeClass('selected'); item.addClass('selected'); } @@ -6090,38 +6318,63 @@ if (element.selected) item.addClass('selected'); if (element.picked) item.addClass('picked'); if (active$7.nomark) item.addClass('nomark'); - if (active$7.onDraw) active$7.onDraw(item, element); + if (element.onDraw) element.onDraw(item, element);else if (active$7.onDraw) active$7.onDraw(item, element); scroll$3.append(item); }); if (active$7.onFullDraw) active$7.onFullDraw(scroll$3); } + /** + * Отображает селектбокс + * @param {object} object - параметры селектбокса + * @param {string} object.title - заголовок селектбокса + * @param {boolean} [object.fullsize=false] - использовать весь экран + * @param {Array} object.items - массив элементов + * @param {boolean} [object.nomark=false] - не выделять выбранный элемент + * @param {boolean} [object.nohide=false] - не закрывать селектбокс после выбора элемента + * @param {function} [object.onSelect] - вызывается при выборе элемента + * @param {function} [object.onCheck] - вызывается при изменении состояния чекбокса + * @param {function} [object.onFocus] - вызывается при фокусе на элементе + * @param {function} [object.onLong] - вызывается при долгом нажатии на элемент + * @param {function} [object.onBack] - вызывается при закрытии селектбокса + * @param {function} [object.onDraw] - вызывается при отрисовке элемента + * @param {function} [object.onFullDraw] - вызывается после полной отрисовки всех элементов + * @param {function} [object.onBeforeClose] - вызывается перед закрытием селектбокса, если возвращает true, селектбокс закроется + * @param {boolean} [object.noenter=false] - отключить выбор элемента по кнопке ОК/Enter + * @returns {void} + */ - function show$9(object) { + + function show$b(object) { active$7 = object; listener$l.send('preshow', { active: active$7 }); bind$3(); $('body').toggleClass('selectbox--open', true); - html$l.find('.selectbox__body').addClass('layer--wheight').css('max-height', window.innerWidth <= 480 ? window.innerHeight * 0.6 : 'unset').data('mheight', html$l.find('.selectbox__head')); - html$l.addClass('animate'); - Activity$1.mixState('select=open'); + html$m.find('.selectbox__body').addClass('layer--wheight').css('max-height', window.innerWidth <= 480 ? window.innerHeight * 0.6 : 'unset').data('mheight', html$m.find('.selectbox__head')); + html$m.addClass('animate'); + Activity.mixState('select=open'); listener$l.send('fullshow', { active: active$7, - html: html$l + html: html$m }); - toggle$a(); + toggle$b(); } + /** + * Переключает контроллер на селектбокс + * @returns {void} + */ - function toggle$a() { + + function toggle$b() { Controller.add('select', { toggle: function toggle() { var selected = scroll$3.render().find('.selected'); - Controller.collectionSet(html$l); - Controller.collectionFocus(selected.length ? selected[0] : false, html$l); + Controller.collectionSet(html$m); + Controller.collectionFocus(selected.length ? selected[0] : false, html$m); listener$l.send('toggle', { active: active$7, - html: html$l + html: html$m }); }, up: function up() { @@ -6130,44 +6383,60 @@ down: function down() { Navigator.move('down'); }, - left: close$9, - back: close$9 + left: close$a, + back: close$a }); Controller.toggle('select'); } + /** + * Скрывает селектбокс + * @returns {void} + */ - function hide$2() { + + function hide$3() { $('body').toggleClass('selectbox--open', false); - html$l.removeClass('animate animate-down'); + html$m.removeClass('animate animate-down'); listener$l.send('hide', { active: active$7 }); } + /** + * Закрывает селектбокс + * @returns {void} + */ - function close$9() { - hide$2(); - Activity$1.mixState(); + + function close$a() { + hide$3(); + Activity.mixState(); if (active$7.onBack) active$7.onBack(); listener$l.send('close', { active: active$7 }); } + /** + * Возвращает HTML селектбокса + * @param {boolean} [js=false] - вернуть DOM-элемент вместо jQuery + * @returns {jQuery|HTMLElement} - HTML селектбокса + */ - function render$h() { - return html$l; + + function render$h(js) { + return js ? html$m[0] : html$m; } var Select = { listener: listener$l, - init: init$U, - show: show$9, - hide: hide$2, - close: close$9, + init: init$14, + show: show$b, + hide: hide$3, + close: close$a, render: render$h }; - var listener$k = start$8(); - var status$3 = { + var listener$k = Subscribe$2(); + var status$2 = { active: false, channel: false, select: false, @@ -6178,7 +6447,7 @@ prev: '' }; - function init$T() { + function init$13() { Keypad.listener.follow('keydown', function (e) { if (!playning()) return; PlayerPanel.rewind(); //PG- @@ -6210,58 +6479,58 @@ } function start$7(object) { - status$3.position_view = object.position; - status$3.position_channel = object.position; - status$3.active = object; - status$3.channel = channel$1(); + status$2.position_view = object.position; + status$2.position_channel = object.position; + status$2.active = object; + status$2.channel = channel$1(); listener$k.send('channel', { - channel: status$3.channel, + channel: status$2.channel, dir: 0, - position: status$3.position_view + position: status$2.position_view }); - if (status$3.active.onPlay) status$3.active.onPlay(status$3.channel); + if (status$2.active.onPlay) status$2.active.onPlay(status$2.channel); listener$k.send('play', { - channel: status$3.channel, - position: status$3.position_view + channel: status$2.channel, + position: status$2.position_view }); } function playning() { - return status$3.active; + return status$2.active; } function channel$1(position) { - status$3.select = status$3.active.onGetChannel(position || status$3.position_view); - return status$3.select; + status$2.select = status$2.active.onGetChannel(position || status$2.position_view); + return status$2.select; } function play$3() { - if (status$3.select !== status$3.channel) { - status$3.channel = status$3.select; - status$3.position_channel = status$3.position_view; - if (status$3.active.onPlay) status$3.active.onPlay(status$3.channel); + if (status$2.select !== status$2.channel) { + status$2.channel = status$2.select; + status$2.position_channel = status$2.position_view; + if (status$2.active.onPlay) status$2.active.onPlay(status$2.channel); listener$k.send('play', { - channel: status$3.channel, - position: status$3.position_view + channel: status$2.channel, + position: status$2.position_view }); } } function playDelay() { - clearTimeout(status$3.timer); - status$3.timer = setTimeout(play$3, 2000); + clearTimeout(status$2.timer); + status$2.timer = setTimeout(play$3, 2000); } function reset() { - status$3.position_view = status$3.position_channel; + status$2.position_view = status$2.position_channel; moveChannel(0); } function programReady(data) { setTimeout(function () { - if (status$3.select == data.channel) { - status$3.program = data; - status$3.position_program = data.position; + if (status$2.select == data.channel) { + status$2.program = data; + status$2.position_program = data.position; listener$k.send('draw-program', { dir: 0 }); @@ -6269,29 +6538,29 @@ }, 10); } - function select$2() { - return status$3.select; + function select$4() { + return status$2.select; } function moveChannel(dir) { - channel$1(status$3.position_view); + channel$1(status$2.position_view); listener$k.send('channel', { - channel: status$3.select, + channel: status$2.select, dir: dir, - position: status$3.position_view + position: status$2.position_view }); } function nextChannel() { - if (status$3.position_view + 1 < status$3.active.total) { - status$3.position_view++; + if (status$2.position_view + 1 < status$2.active.total) { + status$2.position_view++; moveChannel(1); } } function prevChannel() { - if (status$3.position_view - 1 >= 0) { - status$3.position_view--; + if (status$2.position_view - 1 >= 0) { + status$2.position_view--; moveChannel(-1); } } @@ -6299,8 +6568,8 @@ function toChannel(num) { num = Math.max(1, num); - if (num <= status$3.active.total) { - status$3.position_view = num - 1; + if (num <= status$2.active.total) { + status$2.position_view = num - 1; moveChannel(1); } } @@ -6310,9 +6579,9 @@ } function moveProgram(dir) { - if (status$3.program) { - status$3.position_program += dir; - status$3.position_program = Math.max(0, Math.min(status$3.program.total, status$3.position_program)); + if (status$2.program) { + status$2.position_program += dir; + status$2.position_program = Math.max(0, Math.min(status$2.program.total, status$2.position_program)); listener$k.send('draw-program', { dir: dir }); @@ -6328,21 +6597,21 @@ } function drawProgram(container) { - status$3.active.onGetProgram(status$3.select, status$3.position_program, container); + status$2.active.onGetProgram(status$2.select, status$2.position_program, container); } function playlistProgram() { - if (status$3.active.onPlaylistProgram) status$3.active.onPlaylistProgram(status$3.select, status$3.position_program); + if (status$2.active.onPlaylistProgram) status$2.active.onPlaylistProgram(status$2.select, status$2.position_program); } function openMenu() { - if (status$3.active.onMenu) status$3.active.onMenu(status$3.select, status$3.position_program);else if (status$3.active.onPlaylistProgram) status$3.active.onPlaylistProgram(status$3.select, status$3.position_program); + if (status$2.active.onMenu) status$2.active.onMenu(status$2.select, status$2.position_program);else if (status$2.active.onPlaylistProgram) status$2.active.onPlaylistProgram(status$2.select, status$2.position_program); } function destroy$a() { - clearTimeout(status$3.timer); + clearTimeout(status$2.timer); clearTimeout(numpad.timer); - status$3 = { + status$2 = { active: false, channel: false, select: false, @@ -6352,14 +6621,14 @@ var PlayerIPTV = { listener: listener$k, - init: init$T, + init: init$13, start: start$7, playning: playning, channel: channel$1, programReady: programReady, reset: reset, play: play$3, - select: select$2, + select: select$4, nextChannel: nextChannel, prevChannel: prevChannel, prevProgram: prevProgram, @@ -6371,6926 +6640,450 @@ destroy: destroy$a }; - var components$2 = {}; - var params$2 = {}; /** - * Добавить компонент - * @param {{component:string, icon:string, name:string}} data + * События для компонентов + * Компоненты - классы с методами onEvent и onlyEvent + * onEvent - событие, которое вызывается у всех компонентов + * onlyEvent - событие, которое вызывается только у одного компонента + * Если несколько компонентов реализуют onlyEvent, то будет вызван только первый */ + var Emit = /*#__PURE__*/function () { + function Emit() { + _classCallCheck(this, Emit); - function addComponent(data) { - components$2[data.component] = data; - Template.add('settings_' + data.component, '
'); - } - /** - * Получить компонент - * @param {string} component - * @returns {{component:string, icon:string, name:string}} - */ - - - function getComponent(component) { - return components$2[component]; - } - /** - * Добавить параметр - * @param {{component:string, param:{name:string, type:string, values:string|object, default:string|boolean}, field:{name:string, description:string|undefined}, onRender:((item)=>void)|undefined, onChange?:((e)=>void)|undefined}} data - */ - - - function addParam(data) { - if (!params$2[data.component]) params$2[data.component] = []; - params$2[data.component].push(data); - if (data.param.type == 'select' || data.param.type == 'input') Params.select(data.param.name, data.param.values, data.param["default"]); - if (data.param.type == 'trigger') Params.trigger(data.param.name, data.param["default"]); - } - /** - * Получить параметры - * @param {string} component - * @returns {[{component:string, param:{name:string, type:string, values:string|object, default:string|boolean}, field:{name:string, description:string|undefined}, onRender:((item)=>void)|undefined, onChange?:((e)=>void)|undefined}]} - */ - - - function getParam(component) { - return params$2[component]; - } - /** - * Получить все компоненты - * @returns {{name:{component:string, icon:string, name:string}}} - */ - - - function allComponents() { - return components$2; - } - /** - * Получить все параметры - * @returns {{component:[{component:string, param:{name:string, type:string, values:string|object, default:string|boolean}, field:{name:string, description:string|undefined}, onRender:((item)=>void)|undefined, onChange?:((e)=>void)|undefined}]}} - */ - - - function allParams() { - return params$2; - } - - var SettingsApi = { - allComponents: allComponents, - allParams: allParams, - addComponent: addComponent, - addParam: addParam, - getComponent: getComponent, - getParam: getParam - }; - - var html$k; - var controll$1; - var active$6 = {}; - - function open$7() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - active$6 = params; - controll$1 = Controller.enabled().name; - html$k = $('
'); - var keys = Object.keys(localStorage); - keys.sort(function (a, b) { - return a.localeCompare(b); - }); - keys.forEach(function (key) { - var value = Utils$2.shortText(localStorage.getItem(key), 50); - var line = $('
' + key + ' ' + value + '
'); - line.on('hover:enter', function () { - Select.show({ - title: key, - items: [{ - title: Lang.translate('settings_remove'), - action: 'delete' - }], - onSelect: function onSelect(selected) { - Controller.toggle('modal'); - - if (selected.action == 'delete') { - localStorage.removeItem(key); - line.remove(); - } - }, - onBack: function onBack() { - Controller.toggle('modal'); - } - }); - }); - html$k.append(line); - }); - Modal.open({ - title: 'StorageManager', - size: 'large', - html: html$k, - onBack: close$8 - }); - } - - function close$8() { - html$k.remove(); - Modal.close(); - if (active$6.onBack) active$6.onBack();else Controller.toggle(controll$1); - active$6 = {}; - } - - var StorageMenager = { - close: close$8, - open: open$7 - }; - - function Component$1(name) { - var component_params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var scrl = new create$f({ - mask: true, - over: true, - step: 200 - }); - var comp = Template.get('settings_' + name); - var last; - scrl.addSwipeDown(function () { - Controller.back(); - }); - /** - * Обновить скролл - */ - - function updateScroll() { - comp.find('.selector').unbind('hover:focus').on('hover:focus', function (e) { - last = e.target; - scrl.update($(e.target), true); - }).unbind('hover:hover hover:touch').on('hover:hover hover:touch', function (e) { - last = e.target; - }); + this.components = []; } /** - * Билдим все события + * Добавляет компонент + * @param {class|object} Module - класс или объект компонента + * @param {number|null} position - позиция в массиве компонентов, по умолчанию в конец + * @return {void} */ - function buildEvents() { - if (!Platform.is('android')) { - comp.find('.is--android').remove(); - } - - if (!Platform.any()) { - comp.find('.is--player').remove(); - } - - if (!Platform.desktop() || Platform.macOS()) { - comp.find('.is--nw').remove(); - } - - if (!(Platform.is('android') || Platform.is('browser') || Platform.is('apple_tv') || Platform.desktop())) { - comp.find('.is--sound').remove(); - } - - if (!window.lampa_settings.lang_use) comp.find('[data-name="light_version"]').prev().remove(); - scrl.render().find('.scroll__content').addClass('layer--wheight').data('mheight', $('.settings__head')); - scrl.render().css('max-height', window.innerWidth <= 480 ? window.innerHeight * 0.6 : 'unset'); - var clear = comp.find('.clear-storage'); - clear.on('hover:enter', function () { - var controller = Controller.enabled().name; - var status = clear.find('.settings-param__descr'); - Select.show({ - title: Lang.translate('settings_rest_cache'), - items: [{ - title: Lang.translate('settings_rest_cache_calculate'), - action: 'calculate' - }, { - title: Lang.translate('extensions_edit'), - action: 'manager' - }, { - title: Lang.translate('more'), - separator: true - }, { - title: Lang.translate('settings_rest_cache_only'), - subtitle: Lang.translate('settings_rest_cache_only_descr') - }, { - title: Lang.translate('settings_rest_cache_all'), - subtitle: Lang.translate('settings_rest_cache_all_descr'), - full: true - }], - onSelect: function onSelect(a) { - Controller.toggle(controller); - - if (a.action == 'calculate') { - Storage.getsize(function (size) { - status.text(Lang.translate('title_left') + ' - ' + Lampa.Utils.bytesToSize(size)); - }); - } else if (a.action == 'manager') { - StorageMenager.open({ - onBack: function onBack() { - Controller.toggle(controller); - } - }); - } else { - Storage.clear(a.full); - Cache.clearAll(); - } - }, - onBack: function onBack() { - Controller.toggle(controller); - } - }); - }); - Params.bind(comp.find('.selector'), comp); - Params.listener.follow('update_scroll', updateScroll); - Params.listener.follow('update_scroll_position', function () { - if (last) scrl.update($(last), true); - }); - updateScroll(); - } - /** - * Добавляем пользовательские параметры - */ - - - function addParams() { - var params = SettingsApi.getParam(name); - - if (params) { - params.forEach(function (data) { - var item; - - if (data.param.type == 'select') { - item = $("
\n
").concat(data.field.name, "
\n
\n
")); - } - - if (data.param.type == 'trigger') { - item = $("
\n
").concat(data.field.name, "
\n
\n
")); - } - - if (data.param.type == 'input') { - item = $("
\n
").concat(data.field.name, "
\n
\n
")); - } - - if (data.param.type == 'title') { - item = $("
".concat(data.field.name, "
")); - } - - if (data.param.type == 'static') { - item = $("
\n
".concat(data.field.name, "
\n
")); - } - - if (data.param.type == 'button') { - item = $("
\n
").concat(data.field.name, "
\n
")); - } - - if (item) { - if (data.field.description) item.append("
".concat(data.field.description, "
")); - if (typeof data.onRender == 'function') data.onRender(item); - if (typeof data.onChange == 'function') item.data('onChange', data.onChange); - comp.append(item); - } - }); - } - } - /** - * Стартуем - */ - - - function start() { - addParams(); - buildEvents(); - if (typeof component_params.last_index !== 'undefined' && component_params.last_index > 0) last = comp.find('.selector').eq(component_params.last_index)[0]; - Controller.add('settings_component', { - toggle: function toggle() { - Controller.collectionSet(comp); - Controller.collectionFocus(last, comp); - }, - up: function up() { - Navigator.move('up'); - }, - down: function down() { - Navigator.move('down'); - }, - back: function back() { - scrl.destroy(); - comp.remove(); - Params.listener.remove('update_scroll', updateScroll); - if (component_params.onBack) component_params.onBack();else Controller.toggle('settings'); - } - }); - } - - start(); - /** - * Уничтожить - */ - - this.destroy = function () { - scrl.destroy(); - comp.remove(); - comp = null; - Params.listener.remove('update_scroll', updateScroll); - }; - /** - * Рендер - * @returns {object} - */ - - - this.render = function () { - scrl.append(comp); - return scrl.render(); - }; - } - - function Main$1() { - var _this = this; - - var comp; - var scrl = new create$f({ - mask: true, - over: true, - step: 200 - }); - var last; - /** - * Создать - */ - - this.create = function () { - comp = Template.get('settings_main'); - if (!window.lampa_settings.account_use) comp.find('[data-component="account"]').remove(); - if (!window.lampa_settings.plugins_use) comp.find('[data-component="plugins"]').remove(); - - if (!window.lampa_settings.torrents_use) { - comp.find('[data-component="parser"]').remove(); - comp.find('[data-component="server"]').remove(); - } - - scrl.render().css('max-height', window.innerWidth <= 480 ? window.innerHeight * 0.6 : 'unset'); - scrl.append(comp); - scrl.addSwipeDown(_this.swipeAction); - - _this.update(); - }; - /** - * Обновить события - */ - - - this.update = function () { - var components = SettingsApi.allComponents(); - - for (var name in components) { - var aded = components[name]; - - if (!comp.find('[data-component="' + name + '"]').length) { - var item = $("
\n
\n ").concat(aded.icon, "\n
\n
").concat(aded.name, "
\n
")); - if (aded.before) comp.find('[data-component="' + aded.before + '"]').before(item);else if (aded.after) comp.find('[data-component="' + aded.after + '"]').after(item);else comp.append(item); - } - } - - comp.find('.selector').unbind('hover:focus').on('hover:focus', function (event) { - last = event.target; - scrl.update($(event.target), true); - }).unbind('hover:hover hover:touch').on('hover:hover hover:touch', function (event) { - last = event.target; - Navigator.focused(event.target); - }).not('[data-static]').unbind('hover:enter').on('hover:enter', function (event) { - _this.render().detach(); - - _this.onCreate($(event.target).data('component')); - }); - }; - /** - * Сделать активным - */ - - - this.active = function () { - Controller.collectionSet(comp); - Controller.collectionFocus(last, comp); - scrl.height($('.settings__head')); - }; - /** - * Рендер - * @returns {object} - */ - - - this.render = function () { - return scrl.render(); - }; - } - - var already_requested = false; - var last_time_requested = 0; - var personal_codes = {}; - - function init$S() { - Params.trigger('parental_control', false); - Params.select('parental_control_time', { - 'always': '#{settings_parental_control_param_time_always}', - 'once': '#{settings_parental_control_param_time_once}', - '10': '#{settings_parental_control_param_time_10}', - '20': '#{settings_parental_control_param_time_20}', - '30': '#{settings_parental_control_param_time_30}', - '60': '#{settings_parental_control_param_time_60}', - '120': '#{settings_parental_control_param_time_120}' - }, 'once'); - Template.add('settings_parental_control', "
\n
\n
#{title_parental_control}
\n
\n
\n
\n
\n
#{settings_parental_control_change_pin}
\n
\n
\n
#{settings_parental_control_demand_title}
\n
\n
#{settings_parental_control_demand_descr}
\n
\n
\n
#{settings_parental_control_where}
\n
\n
\n
\n
"); - Settings.listener.follow('open', function (e) { - if (e.name == 'parental_control') { - var toggle = e.body.find('.parental-control-toggle'); - var change = e.body.find('.parental-control-change'); - var other = e.body.find('.parental-control-other'); - var active; - - var updateStatus = function updateStatus() { - toggle.find('.settings-param__value').text(Lang.translate(Storage.field('parental_control') ? 'settings_parental_control_enabled' : 'settings_parental_control_disabled')); - other.toggleClass('hide', !Boolean(Storage.field('parental_control'))); - }; - - var drawPersonalList = function drawPersonalList() { - var enabled = Storage.get('parental_control_personal', '[]'); - var list = e.body.find('.parental-control-personal-list'); - - var item = function item(name, data) { - var line = $("
\n
".concat(Lang.translate(data.title), "
\n
\n
")); - if (enabled.indexOf(name) >= 0) line.addClass('selectbox-item--checked'); - line.on('hover:enter', function () { - active = Controller.enabled().name; - query(function () { - enabled = Storage.get('parental_control_personal', '[]'); - - if (enabled.indexOf(name) >= 0) { - Arrays.remove(enabled, name); - Storage.set('parental_control_personal', enabled); - line.removeClass('selectbox-item--checked'); - } else { - Storage.add('parental_control_personal', name); - line.addClass('selectbox-item--checked'); - } - - Controller.toggle(active); - }, function () { - Controller.toggle(active); - }); - }); - list.append(line); - }; - - for (var name in personal_codes) { - item(name, personal_codes[name]); - } - - Params.listener.send('update_scroll'); - }; - - toggle.on('hover:enter', function () { - active = Controller.enabled().name; - - if (Storage.field('parental_control')) { - request(function () { - Storage.set('parental_control', false); - updateStatus(); - Controller.toggle(active); - }, function () { - Controller.toggle(active); - }); - } else if (!Storage.value('parental_control_pin')) { - set$3(function (code) { - if (code) { - Storage.set('parental_control_pin', code); - Storage.set('parental_control', true); - updateStatus(); - } - }); - } else { - Storage.set('parental_control', true); - updateStatus(); - } - }); - change.on('hover:enter', function () { - active = Controller.enabled().name; - - if (Storage.value('parental_control_pin')) { - request(function () { - set$3(function (code) { - if (code) { - Storage.set('parental_control_pin', code); - } - - Controller.toggle(active); - }); - }, function () { - Controller.toggle(active); - }); - } - }); - updateStatus(); - drawPersonalList(); - } - }); - add$c('bookmarks', { - title: 'settings_input_links' - }); - } - /** - * Запрос на установку PIN-кода - * @param {function} call - вызов - */ - - - function set$3(call) { - var active = Controller.enabled().name; - pin(Lang.translate('parental_control_input_new_code'), function (code_one) { - if (code_one) { - pin(Lang.translate('parental_control_confirm_new_code'), function (code_two) { - if (code_one == code_two) { - Controller.toggle(active); - call(code_two); - } else { - Controller.toggle(active); - Noty.show(Lang.translate('parental_control_no_match_code')); - call(); - } - }); - } else { - Controller.toggle(active); - call(); - } - }); - } - /** - * Показать экран ввода пина - * @param {string} title - заголовок - * @param {function} call - вызов - */ - - - function pin(title, call) { - var input = ''; - var html_layer = $("
\n
\n
".concat(title, "
\n
\n
")); - var html_code = $("
\n
\n
\n
\n
\n
"); - - var drawPin = function drawPin() { - var div = html_code.find('div').removeClass('fill'); - - for (var i = 0; i < 4; i++) { - if (input[i]) div.eq(i).addClass('fill'); - } - }; - - var removeNum = function removeNum() { - input = input.slice(0, Math.max(0, input.length - 1)); - drawPin(); - if (!input) callClose(); - }; - - var callClose = function callClose() { - html_layer.remove(); - call(input); - }; - - if (Platform.screen('tv')) { - var html_body = $("
\n
\n
\n ".concat(Lang.translate('pincode_use_remote'), "\n
\n
\n ").concat(Lang.translate('pincode_use_toggle'), "\n
\n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n
1
\n
\n
4
\n
0
\n
2
\n
\n
3
\n
\n
\n\n
\n
\n \n \n \n \n \n
\n
").concat(Lang.translate('settings_remove'), "
\n
\n
\n
\n
")); - html_body.find('.pincode__left').prepend(html_code); - html_layer.find('.pincode__container').append(html_body); - var layout_active = 0; - var layout_keys = [[1, 2, 3, 4, '0'], [5, 6, 7, 8, 9]]; - - var drawLayout = function drawLayout() { - var keys = layout_keys[layout_active]; - html_body.find('.pincode-remote__num-top span').text(keys[0]); - html_body.find('.pincode-remote__num-right span').text(keys[1]); - html_body.find('.pincode-remote__num-bottom span').text(keys[2]); - html_body.find('.pincode-remote__num-left span').text(keys[3]); - html_body.find('.pincode-remote__num-center span').text(keys[4]); - }; - - var animate = function animate() { - var elem = html_body.find('.pincode-remote').removeClass('push'); - setTimeout(function () { - elem.addClass('push'); - }, 60); - }; - - var writeNum = function writeNum(key) { - input = input + layout_keys[layout_active][key]; - drawPin(); - if (input.length == 4) callClose();else animate(); - }; - - drawLayout(); - Controller.add('parental_controll', { - toggle: function toggle() { - Controller.clear(); - }, - "long": function long() { - layout_active++; - if (layout_active >= layout_keys.length) layout_active = 0; - drawLayout(); - }, - enter: function enter() { - writeNum(4); - }, - left: function left() { - writeNum(3); - }, - up: function up() { - writeNum(0); - }, - down: function down() { - writeNum(2); - }, - right: function right() { - writeNum(1); - }, - back: function back() { - removeNum(); - } - }); - Lampa.Controller.toggle('parental_controll'); - } else { - html_layer.addClass('mobile'); - var html_keyboard = $("
\n
1
\n
2
\n
3
\n
4
\n
5
\n
6
\n
7
\n
8
\n
9
\n
0
\n
\n
\n \n \n \n \n
\n
"); - html_keyboard.find('[data-key]').on('hover:enter', function () { - input = input + $(this).data('key'); - drawPin(); - if (input.length == 4) callClose(); - }); - html_keyboard.find('.remove').on('hover:enter', removeNum); - html_layer.find('.pincode__container').append(html_code).append(html_keyboard); - Controller.add('parental_controll', { - toggle: function toggle() { - Controller.collectionSet(html_keyboard); - }, - back: function back() { - call(''); - } - }); - Lampa.Controller.toggle('parental_controll'); - } - - $('body').append(html_layer); - setTimeout(function () { - html_layer.addClass('animate'); - }, 100); - } - /** - * Устаревший метод, но все еще используется, - * если пароль состоит не из 4 цифр - * @param {string} title - * @param {function} call - */ - - - function pinFree(title, call) { - Input.edit({ - free: true, - title: title, - nosave: true, - value: '', - layout: 'nums', - keyboard: 'lampa', - password: true - }, call); - } - /** - * Запросить PIN-код для настроек - * @param {string} title - заголовок - * @param {function} call - вызов - */ - - - function request(call, error) { - if (Storage.field('parental_control')) { - var called = Storage.value('parental_control_pin').length == 4 ? pin : pinFree; - called(Lang.translate('parental_control_input_code'), function (code) { - if (code == Storage.value('parental_control_pin')) { - call(); - } else if (code) { - Noty.show(Lang.translate('parental_control_input_error')); - if (error) error(); - } else if (error) error(); - }); - } else { - call(); - } - } - /** - * Запросить PIN-код (Обший) - * @param {function} call - если pin верный - * @param {function} error - если нет - * @param {boolean} save_controller - переключить на прошлый контроллер - */ - - - function query(call, error, save_controller) { - if (Storage.field('parental_control')) { - var type = Storage.field('parental_control_time'); - var active = Controller.enabled().name; - - if (type !== 'always') { - if (type == 'once') { - if (already_requested) return call(); + _createClass(Emit, [{ + key: "use", + value: function use(Module) { + var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + var instance = typeof Module === 'function' ? new Module(this) : Module; + if (this.components.includes(instance)) return; + + if (position === null) { + this.components.push(instance); } else { - if (last_time_requested + 1000 * 60 * parseInt(type) > Date.now()) return call(); + this.components.splice(position, 0, instance); } } + /** + * Удаляет компонент + * @param {class|object} Module - класс или объект компонента + * @return {void} + */ - request(function () { - already_requested = true; - last_time_requested = Date.now(); - if (save_controller) Controller.toggle(active); - call(); - }, function () { - if (save_controller) Controller.toggle(active); - if (error) error(); - }); - } else { - call(); - } - } - /** - * Запросить PIN-код (Персональный) - * @param {string} name - название модуля - * @param {function} call - если pin верный - * @param {function} error - если нет - * @param {boolean} save_controller - переключить на прошлый контроллер - */ - - - function personal(name, call, error, save_controller) { - var enabled = Storage.get('parental_control_personal', '[]'); - if (enabled.indexOf(name) !== -1) query(call, error, save_controller);else call(); - } - /** - * Запрос на установку PIN-кода, перед этим нужно проверить через enabled() - * @param {function} call - callback - */ - - - function install$2(call) { - set$3(function (code) { - if (code) { - Storage.set('parental_control_pin', code); - Storage.set('parental_control', true); - } - - call(Boolean(code)); - }); - } - /** - * Добавить персональный PIN-код для запроса - * @param {string} name - название модуля - * @param {object} data - данные - */ - - - function add$c(name, data) { - Arrays.extend(data, { - title: Lang.translate('player_unknown'), - "default": false - }); - if (data["default"]) Storage.add('parental_control_personal', name); - personal_codes[name] = data; - } - /** - * Проверить, установлен ли контроль - * @returns bollean - */ - - - function enabled$1() { - return Storage.field('parental_control'); - } - - var ParentalControl = { - init: init$S, - query: query, - personal: personal, - enabled: enabled$1, - install: install$2, - add: add$c - }; - - var html$j; - var body$2; - var listener$j = start$8(); - var last$4 = ''; - - var _main; - /** - * Запуск - */ - - - function init$R() { - html$j = Template.get('settings'); - body$2 = html$j.find('.settings__body'); - html$j.find('.settings__layer').on('click', function (e) { - if (DeviceInput.canClick(e.originalEvent)) Controller.back(); - }); - _main = new Main$1(); - _main.onCreate = create$o; - _main.swipeAction = swipeAction; - - _main.create(); - - Controller.add('settings', { - toggle: function toggle() { - _main.render().detach(); - - _main.update(); - - listener$j.send('open', { - name: 'main', - body: _main.render() - }); - body$2.empty().append(_main.render()); - - _main.active(); - - $('body').toggleClass('settings--open', true); - html$j.addClass('animate'); - Activity$1.mixState('settings=main'); - }, - up: function up() { - Navigator.move('up'); - }, - down: function down() { - Navigator.move('down'); - }, - left: function left() { - _main.render().detach(); - - Controller.toggle('content'); - }, - gone: function gone(to) { - if (to !== 'settings_component') { - $('body').toggleClass('settings--open', false); - html$j.removeClass('animate').removeClass('animate-down'); - } - }, - back: function back() { - _main.render().detach(); - - Controller.toggle('head'); - Activity$1.mixState(); - } - }); - ParentalControl.add('settings', { - title: 'title_settings' - }); - } - - function swipeAction() { - html$j.addClass('animate-down'); - setTimeout(function () { - Controller.back(); - }, 200); - } - /** - * Создать компонент - * @param {string} name - * @param {{last_index:integer}} params - */ - - - function create$o(name) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var comp = new Component$1(name, params); - body$2.empty().append(comp.render()); - listener$j.send('open', { - name: name, - body: comp.render(), - params: params - }); - last$4 = name; - Controller.toggle('settings_component'); - Activity$1.mixState('settings=' + name); - } - /** - * Обновить открытый компонент - */ - - - function update$b() { - var selects = body$2.find('.selector'); - var lastinx = selects.index(body$2.find('.selector.focus')); - create$o(last$4, { - last_index: lastinx - }); - } - /** - * Рендер - * @returns {object} - */ - - - function render$g() { - return html$j; - } - - var Settings = { - listener: listener$j, - init: init$R, - render: render$g, - update: update$b, - create: create$o, - main: function main() { - return _main; - } - }; - - var listener$i = start$8(); - - function filename() { - var acc = Account.canSync(); - var name = 'file_view' + (acc ? '_' + acc.profile.id : ''); // if(window.localStorage.getItem(name) === null && acc){ - // Storage.set(name, Arrays.clone(Storage.cache('file_view',10000,{}))) - // } - - return name; - } - - function update$a(params) { - if (params.hash == 0) return; - var viewed = Storage.cache(filename(), 10000, {}); - var road = viewed[params.hash]; - - if (typeof road == 'undefined' || typeof road == 'number') { - road = { - duration: 0, - time: 0, - percent: 0, - profile: 0 - }; - viewed[params.hash] = road; - } - - road.percent = params.percent; - if (typeof params.time !== 'undefined') road.time = params.time; - if (typeof params.duration !== 'undefined') road.duration = params.duration; - if (typeof params.profile !== 'undefined') road.profile = params.profile; - Storage.set(filename(), viewed); - var line = $('.time-line[data-hash="' + params.hash + '"]').toggleClass('hide', params.percent ? false : true); - $('> div', line).css({ - width: params.percent + '%' - }); - $('.time-line-details[data-hash="' + params.hash + '"]').each(function () { - var f = format(road); - $(this).find('[a="t"]').text(f.time); - $(this).find('[a="p"]').text(f.percent); - $(this).find('[a="d"]').text(f.duration); - $(this).toggleClass('hide', road.duration ? false : true); - }); - listener$i.send('update', { - data: { - hash: params.hash, - road: road - } - }); - if (!params.received && Account.hasPremium()) Socket.send('timeline', { - params: params - }); - } - - function view$1(hash) { - var viewed = Storage.cache(filename(), 10000, {}), - curent = typeof viewed[hash] !== 'undefined' ? viewed[hash] : 0; - var account = Account.canSync(); - var profile = account && account.profile ? account.profile.id : 0; - var road = { - percent: 0, - time: 0, - duration: 0, - profile: 0 - }; - - if (_typeof(curent) == 'object') { - road.percent = curent.percent; - road.time = curent.time; - road.duration = curent.duration; - road.profile = curent.profile || profile; - } else { - road.percent = curent || 0; - road.profile = profile; - } - - listener$i.send('view', { - data: { - hash: hash, - road: road - } - }); - return { - hash: hash, - percent: road.percent, - time: road.time, - duration: road.duration, - profile: road.profile, - handler: function handler(percent, time, duration) { - return update$a({ - hash: hash, - percent: percent, - time: time, - duration: duration, - profile: road.profile + }, { + key: "unuse", + value: function unuse(Module) { + this.components = this.components.filter(function (c) { + return c !== Module; }); } - }; - } + /** + * Проверяет наличие компонента + * @param {class|object} Module - класс или объект компонента + * @return {boolean} + */ - function render$f(params) { - var line = Template.get('timeline', params); - line.toggleClass('hide', params.percent ? false : true); - return line; - } - - function details(params) { - var str = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var line = Template.get('timeline_details', format(params)); - if (str) line.prepend(str); - line.attr('data-hash', params.hash); - line.toggleClass('hide', params.duration ? false : true); - return line; - } - - function watched(card) { - var hash = Lampa.Utils.hash(card.original_name ? [1, 1, card.original_name].join('') : card.original_title); - return view$1(hash).percent; - } - - function format(params) { - var road = { - percent: params.percent + '%', - time: Utils$2.secondsToTimeHuman(params.time), - duration: Utils$2.secondsToTimeHuman(params.duration) - }; - return road; - } - - var Timeline$1 = { - listener: listener$i, - render: render$f, - update: update$a, - view: view$1, - details: details, - format: format, - watched: watched, - filename: filename - }; - - var broken_images = 0; - - function proxy(name) { - var proxy = Storage.field(name); - - if (proxy.length > 0 && proxy.charAt(proxy.length - 1) == '/') { - proxy = proxy.substring(0, proxy.length - 1); - } - - return Utils$2.checkHttp(proxy); - } - - function api$3(url) { - var base = Utils$2.protocol() + 'api.themoviedb.org/3/' + url; - return Storage.field('proxy_tmdb') && Storage.field('tmdb_proxy_api') ? proxy('tmdb_proxy_api') + '/' + base : base; - } - - function image(url) { - var base = Utils$2.protocol() + 'image.tmdb.org/' + url; - return Storage.field('proxy_tmdb') && Storage.field('tmdb_proxy_image') ? proxy('tmdb_proxy_image') + '/' + base : base; - } - - function broken() { - broken_images++; - - if (broken_images > 50) { - broken_images = 0; - if (Storage.field('tmdb_proxy_image') && Storage.field('proxy_tmdb_auto')) Storage.set('proxy_tmdb', true); - } - } - - function key() { - return '4ef0d7355d9ffb5151e987764708ce96'; - } - - var TMDB$1 = { - api: api$3, - key: key, - image: image, - broken: broken - }; - - var NoticeClass = /*#__PURE__*/function () { - function NoticeClass() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - _classCallCheck(this, NoticeClass); - - this.params = params; - this.name = 'Noname'; - } - - _createClass(NoticeClass, [{ - key: "active", - value: function active() { - return true; - } }, { - key: "push", - value: function push(element, resolve, reject) { - resolve(); - } - }, { - key: "empty", - value: function empty() { - return Lang.translate('notice_none_system'); - } - }, { - key: "viewed", - value: function viewed() {} - }, { - key: "items", - value: function items() { - return []; - } - }, { - key: "count", - value: function count() { - return 0; - } - }]); - - return NoticeClass; - }(); - - var NoticeAll = /*#__PURE__*/function (_NoticeClass) { - _inherits(NoticeAll, _NoticeClass); - - var _super = _createSuper(NoticeAll); - - function NoticeAll() { - var _this; - - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - _classCallCheck(this, NoticeAll); - - _this = _super.call(this, params); - _this.name = Lang.translate('settings_param_jackett_interview_all'); - return _this; - } - - _createClass(NoticeAll, [{ - key: "active", - value: function active() { - return false; - } - }, { - key: "count", - value: function count() { - return Notice$1.count(); - } - }, { - key: "viewed", - value: function viewed() { - for (var name in Notice$1.classes) { - if (Notice$1.classes[name] !== this) { - Notice$1.classes[name].viewed(); - } - } - } - }, { - key: "items", - value: function items() { - var _this2 = this; - - var items = []; - - var _loop = function _loop(name) { - if (Notice$1.classes[name] !== _this2) { - items = items.concat(Notice$1.classes[name].items().map(function (item) { - var new_item = Arrays.clone(item); - new_item.display = name; - return new_item; - })); - } - }; - - for (var name in Notice$1.classes) { - _loop(name); - } - - items.sort(function (a, b) { - return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; - }); - return items; - } - }]); - - return NoticeAll; - }(NoticeClass); - - var NoticeLampa = /*#__PURE__*/function (_NoticeClass) { - _inherits(NoticeLampa, _NoticeClass); - - var _super = _createSuper(NoticeLampa); - - function NoticeLampa() { - var _this; - - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - _classCallCheck(this, NoticeLampa); - - _this = _super.call(this, params); - _this.name = params.name || 'Lampa'; - _this.time = 0; - _this.view = 0; - _this.db_name = params.db_name || 'notice'; - _this.notices = []; - - _this.connect(); - - return _this; - } - - _createClass(NoticeLampa, [{ - key: "connect", - value: function connect() { - this.db = new IndexedDB(this.db_name, ['all', 'readed'], 2); - this.db.openDatabase().then(this.update.bind(this))["catch"](function () { - return console.log('Notice', 'error', 'no open database'); + key: "has", + value: function has(Module) { + return this.components.some(function (c) { + return c === Module || typeof Module === 'function' && c instanceof Module; }); } + /** + * Вызывает событие у компонентов + * @param {string} event - имя события + * @param {...any} args - аргументы события + * @return {void} + */ + }, { - key: "update", - value: function update() { - var _this2 = this; - - this.db.getData('readed', 'time').then(function (time) { - _this2.time = time || 0; - return _this2.db.getData('all'); - }).then(function (result) { - result.sort(function (a, b) { - return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; - }); - _this2.notices = result; - _this2.view = result.filter(function (n) { - return n.time > _this2.time; - }).length; - Notice$1.drawCount(); - })["catch"](function (e) {}); - } - }, { - key: "count", - value: function count() { - return this.view; - } - }, { - key: "push", - value: function push(element, resolve, reject) { - if (!(element.id && element.from)) { - if (reject) reject('No (id) or (from)'); - return; - } - - if (!this.notices.find(function (n) { - return n.id == element.id; - })) { - this.db.addData('all', element.id, element).then(this.update.bind(this)).then(function (e) { - if (resolve) resolve(e); - })["catch"](function (e) { - if (reject) reject(e); - }); - } else if (reject) reject('Already added'); - } - }, { - key: "viewed", - value: function viewed() { - this.db.rewriteData('readed', 'time', Date.now()); - this.view = 0; - this.time = Date.now(); - Notice$1.drawCount(); - } - }, { - key: "items", - value: function items() { - return this.notices; - } - }]); - - return NoticeLampa; - }(NoticeClass); - - var NoticeCub = /*#__PURE__*/function (_NoticeClass) { - _inherits(NoticeCub, _NoticeClass); - - var _super = _createSuper(NoticeCub); - - function NoticeCub() { - var _this; - - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - _classCallCheck(this, NoticeCub); - - _this = _super.call(this, params); - _this.name = 'CUB'; - _this.time = Storage.get('cub_notice_time', '0'); - _this.notices = []; - setInterval(_this.update.bind(_assertThisInitialized(_this)), 1000 * 60 * 5); - - _this.update(); - - return _this; - } - - _createClass(NoticeCub, [{ - key: "update", - value: function update() { - var _this2 = this; - - Account.notice(function (result) { - _this2.notices = result.map(function (item) { - var data = JSON.parse(item.data); - var text = Lang.translate('notice_new_quality'); - var labels = []; - - if (data.card.seasons) { - var k = []; - - for (var i in data.card.seasons) { - k.push(i); - } - - var s = k.pop(); - labels.push('S - ' + s + ''); - labels.push('E - ' + data.card.seasons[s] + ''); - if (data.voice) labels.push(data.voice); - text = Lang.translate('notice_new_episode'); - } else { - labels.push(Lang.translate('notice_quality') + ' - ' + data.card.quality + ''); - } - - return { - time: item.time || Utils.parseToDate(item.date).getTime(), - title: !Lang.selected(['ru', 'uk', 'be']) ? data.card.original_title || data.card.original_name : data.card.title || data.card.name, - text: text, - poster: data.card.poster ? data.card.poster : data.card.img ? data.card.img : data.card.poster_path, - card: data.card, - labels: labels - }; - }); - - _this2.notices.sort(function (a, b) { - return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; - }); - - Notice$1.drawCount(); - }); - } - }, { - key: "viewed", - value: function viewed() { - Storage.set('cub_notice_time', Date.now()); - this.time = Date.now(); - Notice$1.drawCount(); - } - }, { - key: "empty", - value: function empty() { - return Lang.translate(Account.logged() ? 'notice_none_account' : 'notice_none'); - } - }, { - key: "count", - value: function count() { - var _this3 = this; - - return this.notices.filter(function (n) { - return n.time > _this3.time; - }).length; - } - }, { - key: "items", - value: function items() { - return this.notices; - } - }]); - - return NoticeCub; - }(NoticeClass); - - function translate$1(str) { - if (Arrays.isObject(str)) { - var code = Lampa.Storage.get('language', 'ru'); - if (str[code]) return str[code];else if (str.ru) return str.ru;else return str[Arrays.getKeys(str)[0]]; - } - - return str; - } - - var Notice = /*#__PURE__*/function () { - function Notice() { - _classCallCheck(this, Notice); - - this.listener = start$8(); - this.display = 'all'; - this.classes = {}; - } - - _createClass(Notice, [{ - key: "init", - value: function init() { + key: "emit", + value: function emit(event) { var _this = this; - this.classes.all = new NoticeAll(); - this.classes.lampa = new NoticeLampa(); - this.classes.cub = new NoticeCub(); - Lampa.Listener.follow('app', function (e) { - if (e.type == 'ready') _this.drawCount(); - }); - } - }, { - key: "open", - value: function open() { - var _this2 = this; - - if (Lampa.Controller.enabled().name == 'modal') Modal.close(); - var html = $('
'); - var tabs = []; - var viever = this.classes[this.display]; - var items = viever.items(); - var navigation = $(''); - - for (var name in this.classes) { - var count = this.classes[name].count(); - var tab = { - name: name, - count: count - }; - tabs.push(tab); + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; } - tabs.forEach(function (tab, i) { - var button = $(''); - if (tab.count) button.append('' + tab.count + ''); - button.on('hover:enter', function () { - _this2.display = tab.name; + var name = event.charAt(0).toUpperCase() + event.slice(1); + var only = false; + this.components.forEach(function (c) { + var handler = c["only".concat(name)]; - _this2.open(); - }); - if (tab.name == _this2.display) button.addClass('active'); - if (i > 0) navigation.append(''); - navigation.append(button); - }); - html.append(navigation); - items.forEach(function (element) { - var item = Template.get('notice_card', {}); - var icon = element.poster || element.icon || element.img; - var author_data = {}; - var author_html; - item.addClass('image--' + (element.poster ? 'poster' : element.icon ? 'icon' : element.img ? 'img' : 'none')); - item.find('.notice__title').html(translate$1(element.title)); - item.find('.notice__descr').html(translate$1(element.text)); - item.find('.notice__time').html(Utils$2.parseTime(element.time)["short"]); - if (element.labels) item.find('.notice__descr').append($('')); - - if (element.author) { - author_data = translate$1(element.author); - author_html = $("
\n
\n \n
\n
\n
\n
\n
\n
"); - author_html.find('.notice__author-name').html(author_data.name); - author_html.find('.notice__author-text').html(author_data.text); - item.find('.notice__body').append(author_html); + if (typeof handler === 'function') { + only = handler; } - - item.on('hover:enter', function () { - if (element.card) { - _this2.close(); - - Activity$1.push({ - url: '', - component: 'full', - id: element.card.id, - method: element.card.number_of_seasons || element.card.seasons ? 'tv' : 'movie', - card: element.card, - source: Lang.selected(['ru', 'uk', 'be']) ? 'cub' : '' - }); - } else _this2.listener.send('select', { - display: element.display || _this2.display, - element: element - }); - }).on('visible', function () { - if (icon) { - icon = translate$1(icon); - if (icon.indexOf('http') == -1) icon = TMDB$1.image('t/p/w300/' + icon); - var img_icon = item.find('.notice__left img')[0] || {}; - var img_author = item.find('.notice__author img')[0] || {}; - - img_icon.onload = function () { - item.addClass('image--loaded'); - }; - - img_icon.onerror = function () { - img_icon.src = './img/img_broken.svg'; - }; - - img_author.onload = function () { - item.addClass('image-author--loaded'); - }; - - img_author.onerror = function () { - img_author.src = './img/img_broken.svg'; - }; - - img_icon.src = Utils$2.fixProtocolLink(icon); - if (element.author) img_author.src = Utils$2.fixProtocolLink(author_data.img.indexOf('http') >= 0 ? author_data.img : TMDB$1.image('t/p/w200/' + author_data.img)); - } - }); - html.append(item); }); - if (!items.length) { - var empty = $('
'); - empty.append(viever.empty()); - html.append(empty); + if (only) { + var _only; + + return (_only = only).call.apply(_only, [this].concat(args)); } - viever.viewed(); - this.listener.send('viewed', { - display: this.display + this.components.forEach(function (c) { + var handler = c["on".concat(name)]; + + if (typeof handler === 'function') { + handler.call.apply(handler, [_this].concat(args)); + } }); - Modal.open({ - title: Lang.translate('title_notice'), - select: html.find('.navigation-tabs .active')[0], - size: 'medium', - html: html, - onBack: this.close.bind(this) - }); - } - }, { - key: "count", - value: function count() { - var all = 0; - - for (var name in this.classes) { - if (this.classes[name].active()) all += this.classes[name].count(); - } - - return all; - } - }, { - key: "close", - value: function close() { - Modal.close(); - Controller.toggle('head'); - } - }, { - key: "drawCount", - value: function drawCount() { - var status = Boolean(this.count()); - var icon = $('.head .notice--icon'); - icon.toggleClass('active', status); - clearInterval(this.blick_timer); - - if (status) { - this.blick_timer = setInterval(function () { - icon.addClass('animate'); - setTimeout(function () { - icon.removeClass('animate'); - }, 1000); - }, 1000 * 15); - } - } - }, { - key: "addClass", - value: function addClass(class_name, noticeClass) { - this.classes[class_name] = noticeClass; - } - }, { - key: "pushNotice", - value: function pushNotice(class_name, data, resolve, reject) { - if (this.classes[class_name] && this.classes[class_name].push) { - this.classes[class_name].push(data, resolve, reject); - } else if (reject) reject('No find class'); } }]); - return Notice; + return Emit; }(); - var Notice$1 = new Notice(); - - var timer$6; - var listener$h; /** - * Открыть окно - * @param {{type:string, object:{}}} params + * Для работы с битовыми масками + * @example + * import Mask from '../utils/mask' + * import Arrays from '../utils/arrays' + * const Helper = new Mask(Arrays.getKeys(Map)) + * // где Map - объект с модулями + * // например: {Mark:..., Watchlist:..., Favorite:...} + * // теперь можно использовать Helper для работы с масками + * // например: + * // Helper.MASK.Mark - битовая маска для модуля Mark + * // Helper.MASK.Favorite - битовая маска для модуля Favorite + * // Helper.MASK.all - битовая маска для всех модулей + * // Helper.MASK.none - битовая маска для отсутствия модулей + * // Helper.only('Mark','Favorite') - битовая маска только для модулей Mark и Favorite + * // Helper.add(mask,'Watchlist') - добавляет модуль Watchlist к маске mask + * // Helper.remove(mask,'Mark') - удаляет модуль Mark из маски mask + * // Helper.toggle(mask,'Favorite') - переключает наличие модуля Favorite в маске mask + * // Helper.except('Mark') - битовая маска для всех модулей кроме Mark + * // Helper.has(mask,'Mark') - проверяет наличие модуля Mark в маске mask + * // Helper.getNames(mask) - возвращает массив названий модулей, присутствующих в маске mask + * // Helper.toObject(mask) - возвращает объект с названиями модулей и булевыми значениями их наличия в маске mask + * // Helper.describe(mask) - возвращает строковое описание модулей, присутствующих в маске mask */ - - function open$6(params) { - var enabled = Controller.enabled().name; - var text = params.type == 'card' ? Lang.translate('broadcast_open') : params.type == 'play' ? Lang.translate('broadcast_play') : ''; - var temp = Template.get('broadcast', { - text: text - }); - var list = temp.find('.broadcast__devices'); - var last = ''; - if (!text) temp.find('.about').remove(); - Socket.send('devices', {}); - timer$6 = setInterval(function () { - Socket.send('devices', {}); - }, 3000); - - listener$h = function listener(e) { - if (e.method == 'devices') { - var devices = e.data.filter(function (d) { - return !(d.name == 'CUB' || d.device_id == Socket.uid()); - }); - var select; - list.empty(); - devices.forEach(function (device) { - var item = $('
' + device.name + '
'); - item.on('hover:enter', function () { - close$7(); - Controller.toggle(enabled); - - if (params.type == 'card') { - var object = Arrays.clone(params.object); - var card = { - id: object.card.id, - source: object.card.source || 'tmdb' - }; - object.card = card; - Socket.send('open', { - params: object, - uid: device.uid - }); - } - - if (params.type == 'play') { - Socket.send('other', { - params: { - submethod: 'play', - object: params.object - }, - uid: device.uid - }); - } - }).on('hover:focus', function () { - last = device.uid; - }); - list.append(item); - if (last == device.uid) select = item[0]; - }); - Modal.toggle(select); - } - }; - - Modal.open({ - title: '', - html: temp, - size: 'small', - mask: true, - onBack: function onBack() { - close$7(); - Controller.toggle(enabled); - } - }); - listener$h({ - method: 'devices', - data: Socket.devices() - }); - Socket.listener.follow('message', listener$h); - } - /** - * Закрыть окно - */ - - - function close$7() { - Socket.listener.remove('message', listener$h); - clearInterval(timer$6); - Modal.close(); - listener$h = null; - } - - var Broadcast = { - open: open$6 - }; - - function create$n(source) { - var timer, - html = $('
'), - items = [], - active = 0, - query; - var source_name = 'search_' + source.title.toLowerCase(); - this.listener = start$8(); - this.params = source.params; - - this.create = function () { - this.empty(); - }; - - this.recall = function (last_query) { + var Mask = /*#__PURE__*/function () { + function Mask(moduleNames) { var _this = this; - Cache.getData('other', source_name + '_' + (last_query || 'last'), 60 * 24).then(function (data) { - _this.clear(); + _classCallCheck(this, Mask); - html.empty(); - data.forEach(_this.build.bind(_this)); - - _this.listener.send('finded', { - count: _this.count(data), - data: data - }); - })["catch"](function () {}); - }; - - this.empty = function () { - html.empty().append($('
' + Lang.translate(query ? source.params.nofound || 'search_nofound' : source.params.start_typing || 'search_start_typing') + '
')); - }; - - this.loading = function () { - this.listener.send('start'); - html.empty().append($('
' + Lang.translate('search_searching') + '
')); - }; - - this.cancel = function () { - clearTimeout(timer); - if (source.onCancel) source.onCancel(); - }; - - this.search = function (value, immediately) { - var _this2 = this; - - clearTimeout(timer); - - if (value.length >= 3) { - timer = setTimeout(function () { - if (query == value) return; - query = value; - - _this2.loading(); - - source.search({ - query: encodeURIComponent(value) - }, function (data) { - _this2.clear(); - - _this2.dmca(data); - - var count = _this2.count(data); - - if (count > 0) { - html.empty(); - var copy = Arrays.clone(data); - Cache.rewriteData('other', source_name + '_' + value, copy)["catch"](function () {}); - Cache.rewriteData('other', source_name + '_last', copy)["catch"](function () {}); - data.forEach(_this2.build.bind(_this2)); - } else _this2.empty(); - - _this2.listener.send('finded', { - count: count, - data: data - }); - }); - }, immediately ? 10 : 2500); - } else { - query = value; - this.clear(); - if (!value) this.recall(''); - } - }; - - this.count = function (result) { - var count = 0; - result.forEach(function (data) { - count += data.results.length; - }); - return count; - }; - - this.dmca = function (result) { - if (Arrays.isArray(window.lampa_settings.dcma)) { - result.forEach(function (data) { - data.results = data.results.filter(function (item) { - return !window.lampa_settings.dcma.find(function (b) { - return b.id == item.id && b.cat == (item.name ? 'tv' : 'movie'); - }); - }); - }); - } - }; - - this.build = function (data) { - var _this3 = this; - - data.noimage = true; - source.params.card_view = 6; - - if (Arrays.isArray(window.lampa_settings.dcma)) { - data.results = data.results.filter(function (item) { - return !window.lampa_settings.dcma.find(function (b) { - return b.id == item.id && b.cat == (item.name ? 'tv' : 'movie'); - }); - }); - } - - var line = new create$i(data, source.params); - line.onDown = this.down.bind(this); - line.onUp = this.up.bind(this); - line.onBack = this.back.bind(this); - - line.onLeft = function () {}; - - line.onMore = function () { - if (source.onMore) source.onMore({ - data: data, - line: line, - query: query - }, function () { - _this3.listener.send('select'); - }); - }; - - if (source.onSelect) { - line.onSelect = function (e, element) { - source.onSelect({ - data: data, - line: line, - query: query, - element: element - }, function () { - _this3.listener.send('select'); - }); - }; - } else { - line.onEnter = function () { - _this3.listener.send('select'); - }; - } - - if (source.onRender) source.onRender(line); - if (source.onAppend) line.onAppend = source.onAppend; - line.create(); - items.push(line); - html.append(line.render()); - }; - - this.any = function () { - return items.length; - }; - - this.back = function () { - this.listener.send('back'); - }; - - this.down = function () { - active++; - active = Math.min(active, items.length - 1); - items[active].toggle(); - this.listener.send('toggle', { - element: items[active].render() - }); - }; - - this.up = function () { - active--; - if (active < 0) this.listener.send('up'); - - if (active < 0) { - active = 0; - } else { - items[active].toggle(); - this.listener.send('toggle', { - element: items[active].render() - }); - } - }; - - this.clear = function () { - this.empty(); - active = 0; - Arrays.destroy(items); - items = []; - this.listener.send('clear'); - }; - - this.toggle = function () { - var _this4 = this; - - Controller.add('search_results', { - invisible: true, - toggle: function toggle() { - Controller.collectionSet(html); - - if (items.length) { - items[active].toggle(); - - _this4.listener.send('toggle', { - element: items[active].render() - }); - } - }, - back: function back() { - _this4.listener.send('back'); - } - }); - Controller.toggle('search_results'); - }; - - this.render = function () { - return html; - }; - - this.destroy = function () { - clearTimeout(timer); - this.clear(); - this.listener.destroy(); - }; - } - - var stop_keys = ['пор', 'порн', 'порно', 'секс', 'член', 'por', 'porn', 'porno', 'sex', 'hot', 'xxx']; - - function create$m() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var scroll, - last, - active, - last_query = ''; - var html = $('
'), - results = []; - this.listener = start$8(); - - this.create = function () { - scroll = new create$f({ - over: true, - mask: false, - horizontal: true - }); - var sources = params.sources || Api.availableDiscovery(); - sources.forEach(this.build.bind(this)); - - if (!params.sources) { - params.additional.forEach(this.build.bind(this)); - } - - this.enable(results[0]); - - if (results.length < 2) { - scroll.render().addClass('hide'); - html.addClass('search__results-offset'); - } - - results.forEach(function (source) { - source.recall(last_query); - }); - }; - - this.enable = function (result) { - if (active) active.render().detach(); - active = result; - if (active.params.lazy && last_query) active.search(last_query, true); - html.empty().append(result.render()); - scroll.render().find('.search-source').removeClass('active').eq(results.indexOf(result)).addClass('active'); - Layer.visible(result.render()); - }; - - this.build = function (source) { - var _this = this; - - var tab = $('
' + source.title + '
0
'); - var result = new create$n(source); - result.create(); - if (source.params.lazy) tab.find('.search-source__count').remove(); - result.listener.follow('start', function () { - tab.addClass('search-source--loading'); - tab.find('.search-source__count').html(' '); - }); - result.listener.follow('clear', function () { - tab.find('.search-source__count').text(0); - }); - result.listener.follow('finded', function (e) { - tab.removeClass('search-source--loading'); - tab.find('.search-source__count').text(e.count); - if (active == result) Layer.visible(result.render()); - - _this.listener.send('finded', { - source: source, - result: result, - count: e.count, - data: e.data - }); - }); - result.listener.follow('up', function (e) { - if (results.length < 2) _this.listener.send('up');else _this.toggle(); - }); - result.listener.follow('select', this.listener.send.bind(this.listener, 'select')); - result.listener.follow('back', this.listener.send.bind(this.listener, 'back')); - result.listener.follow('toggle', function (e) { - _this.listener.send('toggle', { - source: source, - result: e.result, - element: e.element - }); - }); - tab.on('hover:enter', function () { - _this.enable(result); - }).on('hover:focus', function (e) { - last = e.target; - scroll.update($(e.target)); - }); - scroll.append(tab); - results.push(result); - this.listener.send('create', { - source: source, - result: result - }); - }; - - this.toggle = function (from_search) { - var _this2 = this; - - Controller.add('search_sources', { - toggle: function toggle() { - Controller.collectionSet(scroll.render()); - Controller.collectionFocus(last, scroll.render()); - if (from_search && results.length < 2 && active.any()) active.toggle(); - }, - update: function update() {}, - up: function up() { - _this2.listener.send('up'); - }, - down: function down() { - if (active.any()) active.toggle(); - }, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - Navigator.move('left'); - }, - back: function back() { - _this2.listener.send('back'); - } - }); - Controller.toggle('search_sources'); - }; - - this.search = function (query, immediately) { - results.forEach(function (result) { - return result.cancel(); - }); - - if (!stop_keys.find(function (k) { - return k == query.toLowerCase(); - })) { - last_query = query; - this.listener.send('search', { - query: query, - immediately: immediately - }); - results.forEach(function (result) { - if (!result.params.lazy || active === result) result.search(query, immediately); - }); - } - }; - - this.cancel = function () { - results.forEach(function (result) { - return result.cancel(); - }); - }; - - this.tabs = function () { - return scroll.render(); - }; - - this.render = function () { - return html; - }; - - this.destroy = function () { - scroll.destroy(); - results.forEach(function (result) { - return result.cancel(); - }); - this.listener.destroy(); - }; - } - - function create$l() { - var scroll, - last, - keys = []; - this.listener = start$8(); - - this.create = function () { - var _this = this; - - scroll = new create$f({ - over: true, - mask: false, - horizontal: true - }); - - scroll.onWheel = function (step) { - _this.toggle(); - - Controller.enabled().controller[step > 0 ? 'right' : 'left'](); - }; - - scroll.onScroll = function (step) {}; - - keys = Storage.get('search_history', '[]'); - keys.map(function (v) { - return v; - }).reverse().slice(0, 15).forEach(function (key) { - _this.append(key); - }); - if (!keys.length) scroll.append($('
' + Lang.translate('search_empty') + '
')); - }; - - this.append = function (value) { - var _this2 = this; - - var key = $('
' + value + '
'); - key.on('hover:enter', function () { - _this2.listener.send('enter', { - value: value - }); - }).on('hover:focus', function (e) { - last = e.target; - scroll.update($(e.target), true); - }).on('hover:long', function () { - var selc = scroll.render().find('.selector'); - Arrays.remove(keys, value); - Storage.set('search_history', keys); - Storage.remove('search_history', value); - var index = selc.index(key); - if (index > 0) last = selc.eq(index - 1)[0];else if (selc[index + 1]) last = selc.eq(index + 1)[0]; - key.remove(); - if (selc.length - 1 <= 0) last = false; - Controller.collectionFocus(last, scroll.render()); - }); - scroll.append(key); - }; - - this.add = function (value) { - var inx = keys.indexOf(value); - - if (inx == -1) { - keys.push(value); - } else { - Arrays.remove(keys, value); - keys.push(value); - } - - Storage.set('search_history', keys); - }; - - this.toggle = function () { - var _this3 = this; - - Controller.add('search_history', { - toggle: function toggle() { - Controller.collectionSet(scroll.render()); - Controller.collectionFocus(last, scroll.render()); - }, - update: function update() {}, - up: function up() { - _this3.listener.send('up'); - }, - down: function down() { - _this3.listener.send('down'); - }, - right: function right() { - Navigator.move('right'); - }, - back: function back() { - _this3.listener.send('back'); - }, - left: function left() { - Navigator.move('left'); - } - }); - Controller.toggle('search_history'); - }; - - this.any = function () { - return keys.length; - }; - - this.render = function () { - return scroll.render(); - }; - - this.destroy = function () { - scroll.destroy(); - this.listener.destroy(); - keys = null; - last = null; - }; - } - - function HeadBackward (title, use_js) { - var head = Template[use_js ? 'js' : 'get']('head_backward', { - title: title - }); - - if (use_js) { - head.querySelector('.head-backward__button').addEventListener('click', function () { - Controller.back(); - }); - head.querySelector('.head-backward__title').innerText = title; - } else { - head.find('.head-backward__button').on('click', function () { - Controller.back(); + this.moduleNames = moduleNames; + this.nameToBit = {}; + this.bitToName = {}; + this.MASK = {}; + moduleNames.forEach(function (name, index) { + var bit = 1 << index; + _this.nameToBit[name] = bit; + _this.bitToName[bit] = name; + _this.MASK[name] = bit; }); + this.MASK.all = (1 << moduleNames.length) - 1; + this.MASK.none = 0; } - return head; - } + _createClass(Mask, [{ + key: "only", + value: function only() { + var _this2 = this; - var html$i = $(''), - search$6, - history, - sources$1, - keyboard$1, - scroll$2, - input$1 = '', - params$1 = {}, - additional = [], - listener$g = start$8(); - - function open$5() { - var use_params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - params$1 = use_params; - input$1 = use_params.input || ''; - $('body').toggleClass('ambience--enable', true); - $('body').toggleClass('search--open', true); - create$k(); - toggle$9(); - Layer.update(html$i[0]); - listener$g.send('open'); - } - - function toggle$9() { - Controller.add('search', { - invisible: true, - toggle: function toggle() { - keyboard$1.toggle(); - }, - update: function update() {}, - back: destroy$9 - }); - Controller.toggle('search'); - } - - function scrollTo(element) { - scroll$2.update(element ? element : search$6.find('.search__input'), true); - } - - function create$k() { - search$6 = Template.get('search'); - scroll$2 = new create$f({ - step: 300 - }); - scroll$2.height(); - scroll$2.render().addClass('search'); - scroll$2.append(HeadBackward(Lang.translate('search'))); - scroll$2.append(search$6); - html$i.append(scroll$2.render()); - - scroll$2.onScroll = function (step) { - Layer.visible(scroll$2.render(true)); - }; - - if (Storage.field('keyboard_type') !== 'lampa') search$6.find('.search__input').hide(); - createKeyboard(); - createHistory(); - createSources(); - keyboard$1.value(input$1); - sources$1.search(input$1, true); - } - - function createSources() { - sources$1 = new create$m({ - sources: params$1.sources, - additional: additional - }); - listener$g.send('sources', { - sources: sources$1 - }); - sources$1.create(); - sources$1.listener.follow('back', destroy$9); - sources$1.listener.follow('up', function () { - if (history.any()) history.toggle();else keyboard$1.toggle(); - scrollTo(); - }); - sources$1.listener.follow('toggle', function (e) { - scrollTo(e.element); - }); - sources$1.listener.follow('select', function (e) { - if (input$1) history.add(input$1); - destroy$9(); - }); - search$6.find('.search__sources').append(sources$1.tabs()); - search$6.find('.search__results').append(sources$1.render()); - } - - function createHistory() { - history = new create$l(); - history.create(); - history.listener.follow('down', function () { - sources$1.toggle(true); - }); - history.listener.follow('up', function () { - keyboard$1.toggle(); - }); - history.listener.follow('enter', function (event) { - keyboard$1.value(event.value); - sources$1.search(event.value, true); - }); - history.listener.follow('back', destroy$9); - search$6.find('.search__history').append(history.render()); - } - - function createKeyboard() { - keyboard$1 = new create$2({ - layout: 'search' - }); - keyboard$1.create(); - keyboard$1.listener.follow('change', function (event) { - input$1 = event.value; - - if (input$1) { - search$6.find('.search__input').toggleClass('filled', true).html(input$1.replace(/\s/g, ' ')); - sources$1.search(input$1); - } else { - search$6.find('.search__input').toggleClass('filled', false).text(Lang.translate('search_input') + '...'); - sources$1.search(''); - } - }); - keyboard$1.listener.follow('down', function () { - if (history.any()) history.toggle();else sources$1.toggle(); - }); - keyboard$1.listener.follow('hover', function () { - input$1.length <= 2 ? sources$1.cancel() : sources$1.search(input$1); - }); - keyboard$1.listener.follow('back', destroy$9); - } - - function addSource(source) { - additional.push(source); - } - - function removeSource(source) { - Arrays.remove(additional, source); - } - - function render$e() { - return html$i; - } - - function destroy$9() { - keyboard$1.destroy(); - history.destroy(); - sources$1.destroy(); - search$6.remove(); - html$i.empty(); - $('body').toggleClass('ambience--enable', false); - $('body').toggleClass('search--open', false); - if (params$1.onBack) params$1.onBack();else Controller.toggle('content'); - params$1 = {}; - input$1 = ''; - listener$g.send('close'); - } - - function close$6() { - destroy$9(); - } - - var Search = { - listener: listener$g, - open: open$5, - render: render$e, - addSource: addSource, - removeSource: removeSource, - close: close$6 - }; - - var html$h = $('
'), - text = html$h.find('.processing__text'); - var processing = []; - - function init$Q() { - update$9(); - } - - function update$9() { - if (processing.length) { - text.text(processing.length > 1 ? processing.length : '1 / ' + Math.round(processing[0].percent) + '%'); - var complite = processing.find(function (a) { - return a.percent >= 100; - }); - if (complite) Lampa.Arrays.remove(processing, complite); - requestAnimationFrame(update$9); - } else html$h.addClass('hide'); - } - - function push$5(id, percent) { - var find = processing.find(function (a) { - return a.id == id; - }); - - if (!find) { - processing.push({ - id: id, - percent: percent, - start: Date.now() - }); - html$h.removeClass('hide'); - update$9(); - } else find.percent = percent; - } - - function render$d(js) { - return js ? html$h[0] : html$h; - } - - var Processing = { - init: init$Q, - push: push$5, - render: render$d - }; - - var html$g; - var last$3; - var activi = false; - - function observe$2() { - if (typeof MutationObserver == 'undefined') return; - var observer = new MutationObserver(function (mutations) { - for (var i = 0; i < mutations.length; i++) { - var mutation = mutations[i]; - - if (mutation.type == 'childList' && !mutation.removedNodes.length) { - var selectors = Array.from(mutation.target.querySelectorAll('.selector')); - selectors.forEach(function (s) { - $(s).unbind('hover:focus hover:hover hover:touch').on('hover:focus hover:hover hover:touch', function (e) { - last$3 = e.target; - }); - }); + for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) { + names[_key] = arguments[_key]; } - } - }); - observer.observe(html$g[0], { - childList: true, - subtree: true - }); - } - function init$P() { - html$g = Template.get('head'); - if (!window.lampa_settings.feed) html$g.find('.open--feed').remove(); - if (!window.lampa_settings.account_use || window.lampa_settings.disable_features.ads) html$g.find('.open--premium').remove(); - if (window.local_lampa) html$g.find('.head__logo-icon').append('local'); - html$g.find('.head__actions').prepend(Processing.render()); - Utils$2.time(html$g); - html$g.find('.selector').data('controller', 'head').on('hover:focus hover:hover hover:touch', function (event) { - last$3 = event.target; - }); - observe$2(); - html$g.find('.open--settings').on('hover:enter', function () { - ParentalControl.personal('settings', function () { - Controller.toggle('settings'); - }, false, true); - }); - html$g.find('.open--notice').on('hover:enter', Notice$1.open.bind(Notice$1)); - html$g.find('.open--search').on('hover:enter', Search.open.bind(Search)); - html$g.find('.head__logo-icon,.head__menu-icon').on('click', function (e) { - if (DeviceInput.canClick(e.originalEvent)) Controller.toggle('menu'); - }); - Storage.listener.follow('change', function (e) { - if (e.name == 'account') { - html$g.find('.open--profile').toggleClass('hide', e.value.token && window.lampa_settings.account_use ? false : true); + return names.reduce(function (mask, name) { + return mask | _this2._bit(name); + }, 0); } + }, { + key: "add", + value: function add(mask) { + for (var _len2 = arguments.length, names = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + names[_key2 - 1] = arguments[_key2]; + } - if (e.name == 'account_user') { - html$g.find('.open--premium').toggleClass('hide', Account.hasPremium() || window.lampa_settings.white_use ? true : !Lang.selected(['ru', 'uk', 'be'])); + return mask | this.only.apply(this, names); } - }); - html$g.find('.full-screen').on('hover:enter', function () { - Utils$2.toggleFullscreen(); - }).toggleClass('hide', Platform.tv() || Platform.is('android') || !Utils$2.canFullScreen()); + }, { + key: "remove", + value: function remove(mask) { + var _this3 = this; - if (!Lang.selected(['ru', 'uk', 'be'])) { - html$g.find('.open--feed').remove(); - } else { - html$g.find('.open--feed').on('hover:enter', function () { - Activity$1.push({ - url: '', - title: Lang.translate('menu_feed'), - component: 'feed', - page: 1 + for (var _len3 = arguments.length, names = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + names[_key3 - 1] = arguments[_key3]; + } + + return names.reduce(function (acc, name) { + return acc & ~_this3._bit(name); + }, mask); + } + }, { + key: "toggle", + value: function toggle(mask) { + var _this4 = this; + + for (var _len4 = arguments.length, names = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + names[_key4 - 1] = arguments[_key4]; + } + + return names.reduce(function (acc, name) { + return acc ^ _this4._bit(name); + }, mask); + } + }, { + key: "except", + value: function except() { + for (var _len5 = arguments.length, names = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + names[_key5] = arguments[_key5]; + } + + return this.remove.apply(this, [this.MASK.all].concat(names)); + } + }, { + key: "has", + value: function has(mask, name) { + return (mask & this._bit(name)) !== 0; + } + }, { + key: "getNames", + value: function getNames(mask) { + var _this5 = this; + + return this.moduleNames.filter(function (name) { + return _this5.has(mask, name); }); - }); - } - - html$g.find('.open--premium').toggleClass('hide', Account.hasPremium() || window.lampa_settings.white_use ? true : !Lang.selected(['ru', 'uk', 'be'])).on('hover:enter', function () { - Modal.open({ - title: '', - size: 'full', - mask: true, - html: Template.get('cub_premium_modal'), - onBack: function onBack() { - Modal.close(); - Controller.toggle('head'); - } - }); - }); - Controller.add('head', { - toggle: function toggle() { - Controller.collectionSet(html$g, false, true); - Controller.collectionFocus(last$3, html$g, true); - }, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: function down() { - Controller.toggle('content'); - }, - back: function back() { - Activity$1.backward(); } - }); - var timer; - var broadcast = html$g.find('.open--broadcast').hide(); - broadcast.on('hover:enter', function () { - Broadcast.open({ - type: 'card', - object: Activity$1.extractObject(activi) - }); - }); - Lampa.Listener.follow('activity', function (e) { - if (e.type == 'start') activi = e.object; - clearTimeout(timer); - timer = setTimeout(function () { - if (activi) { - if (activi.component !== 'full') { - broadcast.hide(); - activi = false; - } - } - }, 1000); + }, { + key: "toObject", + value: function toObject(mask) { + var _this6 = this; - if (e.type == 'start' && e.component == 'full') { - broadcast.show(); - activi = e.object; - } - }); - } - - function title$1(title) { - html$g.find('.head__title').text(title || ''); - } - - function render$c() { - return html$g; - } - - var Head = { - render: render$c, - title: title$1, - init: init$P - }; - - var markers = ['socket', 'mirrors', 'request']; - var markers_object = {}; - markers.forEach(function (marker) { - markers_object[marker] = { - error: false, - live: false, - pass_count: 0, - pass_time: 0, - status_now: '', - status_prev: '' - }; - }); - - function init$O() { - markers.forEach(function (marker) { - markers_object[marker].element = Head.render()[0].querySelector('.head__markers .item--' + marker); - }); - - if (typeof requestAnimationFrame !== 'undefined') { - requestAnimationFrame(function updateMarkers() { - markers.forEach(function (marker) { - var marker_data = markers_object[marker]; - var status = marker_data.pass_count > 0 ? 'status--pass' : marker_data.live ? 'status--live' : marker_data.error ? 'status--error' : ''; - - if (status !== marker_data.status_now) { - marker_data.status_prev = marker_data.status_now; - marker_data.status_now = status; - updateStatus(marker); - } - - if (status == 'status--pass' && marker_data.pass_time < Date.now() - 100) { - marker_data.pass_count--; - marker_data.pass_time = Date.now(); - } + var obj = {}; + this.moduleNames.forEach(function (name) { + obj[name] = _this6.has(mask, name); }); - requestAnimationFrame(updateMarkers); - }); - Lampa.Listener.follow('request_error', function (e) { - if (e.params.url.indexOf(object$2.cub_domain) > -1 && e.error.status == 0 && e.exception !== 'timeout') { - error$2('request'); - } - }); - Lampa.Listener.follow('request_secuses', function (e) { - if (e.params.url.indexOf(object$2.cub_domain) > -1) { - pass('request'); - normal('request'); - } - }); - } - } - - function updateStatus(marker) { - var marker_data = markers_object[marker]; - if (!marker_data.element) return; - var status = marker_data.pass_count > 0 ? 'status--pass' : marker_data.live ? 'status--live' : marker_data.error ? 'status--error' : ''; - marker_data.element.classList.remove('status--error', 'status--live', 'status--pass'); - if (status) marker_data.element.classList.add(status); - } - - function error$2(who) { - markers_object[who].error = true; - markers_object[who].live = false; - } - - function pass(who) { - markers_object[who].pass_count = Math.min(markers_object[who].pass_count + 1, 20); - } - - function live(who) { - markers_object[who].error = false; - markers_object[who].live = true; - } - - function normal(who) { - markers_object[who].error = false; - markers_object[who].live = false; - } - - var Markers = { - init: init$O, - error: error$2, - pass: pass, - live: live, - normal: normal - }; - - var socket; - var ping; - - var _uid = Utils$2.uid(); - - var _devices = []; - var listener$f = start$8(); - var expects = []; - var timeping = 5000; - var timeout; - var used_mirrors = -1; - var terminal_access = false; - - function connect$1() { - if (!window.lampa_settings.socket_use) return; - var ws = Platform.is('orsay') || Platform.is('netcast') ? 'ws://' : 'wss://'; - var pt = Platform.is('orsay') || Platform.is('netcast') ? ':8080' : ':8443'; - var mirrors = object$2.soc_mirrors; - var mirror = mirrors[used_mirrors + 1] || mirrors[0]; - used_mirrors = (used_mirrors + 1) % mirrors.length; - var socket_url = ws + mirror + pt; - if (window.lampa_settings.socket_url) socket_url = window.lampa_settings.socket_url; - clearInterval(ping); - clearTimeout(timeout); - timeout = setTimeout(function () { - console.log('Socket', 'timeout close'); - if (socket) socket.close(); - }, 10000); - - try { - socket = new WebSocket(socket_url); - } catch (e) { - console.log('Socket', 'not work'); - } - - if (!socket) return; - socket.addEventListener('open', function (event) { - console.log('Socket', 'open on ' + socket_url); - timeping = 5000; - clearTimeout(timeout); - send('start', {}); - listener$f.send('open', {}); - Markers.live('socket'); - }); - socket.addEventListener('close', function (event) { - console.log('Socket', 'close', event.code); - clearTimeout(timeout); - listener$f.send('close', {}); - timeping = Math.min(1000 * 60 * 5, timeping); - console.log('Socket', 'try connect to ' + socket_url + ' after', Math.round(timeping) / 1000, 'sec.'); - setTimeout(connect$1, Math.round(timeping)); - timeping *= 2; - Markers.error('socket'); - }); - socket.addEventListener('error', function (event) { - console.log('Socket', 'error:', 'maybe there is no connection to the server'); - socket.close(); - }, false); - socket.addEventListener('message', function (event) { - var result = JSON.parse(event.data); - - if (window.lampa_settings.socket_methods) { - if (result.method == 'devices') { - _devices = result.data; - } else if (result.method == 'open') { - Controller.toContent(); - Activity$1.push(result.data); - } else if (result.method == 'timeline') { - result.data.received = true; //чтоб снова не остправлять и не зациклить - - var account = Account.canSync(); - - if (account && account.profile && account.profile.id == result.data.profile) { - Timeline$1.update(result.data); - } - } else if (result.method == 'bookmarks') { - Account.update(); - } else if (result.method == 'terminal_activate') { - if (Storage.get('terminal_access', '') == result.data.code) { - terminal_access = true; - send('terminal_result', { - result: 'Terminal access activated' - }); - } - } else if (result.method == 'terminal_eval') { - if (Storage.get('terminal_access', '') == result.data.code) { - var stroke = ''; - var tojson = {}; - console.log('Socket', 'terminal eval', result.data.eval); - - try { - stroke = eval(result.data.eval); - } catch (e) { - stroke = e.message + ' ' + e.stack; - } - - try { - if (Arrays.isObject(stroke) || Arrays.isArray(stroke)) tojson = JSON.stringify(stroke); - } catch (e) { - tojson = stroke; - } - - if (typeof stroke == 'function') { - tojson = 'Function cannot be converted to JSON'; - } - - if (typeof stroke == 'string' || typeof stroke == 'number' || typeof stroke == 'boolean') { - tojson = stroke; - } else if (stroke === undefined) { - tojson = 'undefined'; - } else if (stroke === null) { - tojson = 'null'; - } else tojson = 'unknown type'; - - console.log('Socket', 'terminal eval result', tojson); - send('terminal_result', { - result: tojson - }); - } - } else if (result.method == 'logoff') { - Account.logoff(result.data); - } else if (result.method == 'info') { - console.log('Socket', 'info', result.data); - } else if (result.method == 'other' && result.data.submethod == 'play') { - Controller.toContent(); - Modal.open({ - title: '', - align: 'center', - html: $('
' + Lang.translate('confirm_open_player') + '
'), - buttons: [{ - name: Lampa.Lang.translate('settings_param_no'), - onSelect: function onSelect() { - Modal.close(); - Controller.toggle('content'); - } - }, { - name: Lampa.Lang.translate('settings_param_yes'), - onSelect: function onSelect() { - Modal.close(); - Controller.toggle('content'); - Player.play(result.data.object.player); - Player.playlist(result.data.object.playlist); - } - }], - onBack: function onBack() { - Modal.close(); - Controller.toggle('content'); - } - }); - } + return obj; } - - Markers.pass('socket'); - listener$f.send('message', result); - }); - setInterval(function () { - if (expects.length > 50) expects = expects.slice(-50); - - if (socket && socket.readyState == 1 && expects.length) { - var msg = expects.shift(); - console.log('Socket', 'sent with a delay:', msg.method); - send(msg.method, msg); + }, { + key: "describe", + value: function describe(mask) { + var names = this.getNames(mask); + return names.length ? names.join(', ') : '(none)'; } - }, 1000); - } - - function send(method, data) { - var name_devise = Platform.get() ? Platform.get() : navigator.userAgent.toLowerCase().indexOf('mobile') > -1 ? 'mobile' : navigator.userAgent.toLowerCase().indexOf('x11') > -1 ? 'chrome' : 'other'; - data.device_id = _uid; - data.name = Utils$2.capitalizeFirstLetter(name_devise) + ' - ' + Storage.field('device_name'); - data.method = method; - data.version = 1; - data.account = Storage.get('account', '{}'); - data.premium = Account.hasPremium(); - data.terminal = Storage.get('terminal_access', ''); - if (socket && socket.readyState == 1) socket.send(JSON.stringify(data));else expects.push(data); - Markers.pass('socket'); - } - - function restart() { - if (socket) socket.close(); - connect$1(); - } - - var Socket = { - listener: listener$f, - init: connect$1, - send: send, - uid: function uid() { - return _uid; - }, - devices: function devices() { - return _devices; - }, - restart: restart, - terminalAccess: function terminalAccess() { - return terminal_access; - } - }; - - var callback_cancel, controller_enabled, loader$1, timer$5; - - function start$6(on_cancel, text) { - callback_cancel = on_cancel; - controller_enabled = Controller.enabled().name; - loader$1 = $("
\n
\n
".concat(Lang.translate('loading'), "
\n
\n
\n
")); - if (text) loader$1.find('.loading-layer__text').text(text); - loader$1.on('click', function (e) { - if (DeviceInput.canClick(e.originalEvent)) cancel(); - }); - clearTimeout(timer$5); - timer$5 = setTimeout(function () { - $('body').append(loader$1); - }, 500); - toggle$8(); - } - - function toggle$8() { - Controller.add('loading', { - invisible: true, - toggle: function toggle() { - Controller.clear(); - }, - back: cancel, - up: cancel, - down: cancel, - left: cancel, - right: cancel - }); - Controller.toggle('loading'); - } - - function cancel() { - if (callback_cancel) callback_cancel(); - } - - function stop() { - if (loader$1) loader$1.remove(); - clearTimeout(timer$5); - if (controller_enabled) Controller.toggle(controller_enabled); - } - - function setText(text) { - if (loader$1) loader$1.find('.loading-layer__text').text(text); - } - - var Loading = { - start: start$6, - stop: stop, - setText: setText - }; - - var permit = {}; - Object.defineProperty(permit, 'account', { - get: function get() { - return Storage.get('account', '{}'); - } - }); - Object.defineProperty(permit, 'token', { - get: function get() { - return permit.account.token; - } - }); - Object.defineProperty(permit, 'use', { - get: function get() { - return permit.token && Storage.field('account_use') && window.lampa_settings.account_use; - } - }); - Object.defineProperty(permit, 'sync', { - get: function get() { - return permit.use && window.lampa_settings.account_sync; - } - }); - - var network$c = new create$e(); - - function url$6() { - return Utils$2.protocol() + object$2.cub_domain + '/api/'; - } - - function load$4(path) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - return new Promise(function (resolve, reject) { - if (permit.token) { - var account = permit.account; - Arrays.extend(params, { - headers: { - token: account.token, - profile: account.profile.id - }, - timeout: 8000 - }); - network$c.silent(url$6() + path, resolve, function (e) { - reject(network$c.errorCode(e)); - }, false, params); - } else { - reject(403); + }, { + key: "_bit", + value: function _bit(name) { + if (!(name in this.nameToBit)) throw new Error("Unknown module name: ".concat(name)); + return this.nameToBit[name]; } - }); - } + }]); - var Api$1 = { - url: url$6, - load: load$4 - }; + return Mask; + }(); /** - * Обновить таймлайн - * @param {Boolean} full обновить полностью или только новые элементы - * @param {Boolean} visual обновить визуально Timeline.update когда socket открылся + * Конструктор модуля + * @param {*} Map - карта модулей + * @returns {Class} - класс модуля */ - function update$8() { - var full = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var visual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + function Constructor() { + var Map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var Helper = new Mask(Arrays.getKeys(Map)); + return /*#__PURE__*/function (_Emit) { + _inherits(Contrucor, _Emit); - if (permit.sync) { - var url = 'timeline/all'; - var all = full; - console.log('Timeline', 'full update:', Utils$2.parseTime(Storage.get('timeline_full_update_time', '0')).briefly); - if (Storage.get('timeline_full_update_time', '0') + 1000 * 60 * 60 * 24 < Date.now() && !visual) all = true; - if (all) url = url + '?full=true'; - Api$1.load(url).then(function (result) { - var name = 'file_view_' + permit.account.profile.id; + var _super = _createSuper(Contrucor); - if (visual) { - for (var i in result.timelines) { - var time = result.timelines[i]; - time.received = true; - Timeline$1.update(time); - } - } else { - if (window.localStorage.getItem(name) === null) { - Storage.set(name, Arrays.clone(Storage.cache('file_view', 10000, {}))); - } + function Contrucor(data) { + var _this; - var viewed = Storage.cache(name, 10000, {}); + _classCallCheck(this, Contrucor); - for (var _i in result.timelines) { - var _time = result.timelines[_i]; - viewed[_i] = _time; - Arrays.extend(viewed[_i], { - duration: 0, - time: 0, - percent: 0 - }); - delete viewed[_i].hash; - } - - if (all) Storage.set('timeline_full_update_time', Date.now()); - Storage.set(name, viewed, false, function () { - Storage.set('timeline_full_update_time', 0); - }); - } - - console.log('Timeline', 'update success: total', Arrays.getKeys(Storage.get(name, '{}')).length, 'items', 'load:', Arrays.getKeys(result.timelines).length, 'items'); - })["catch"](function (e) { - if (e == 403) { - Storage.set('timeline_full_update_time', 0); - } else { - console.log('Timeline', 'update error:', e); - } - }); - } - } - - var Timeline = { - update: update$8 - }; - - var body$1; - var network$b = new create$e(); - var listener$e = start$8(); - var start_time = Date.now(); - var user_data; - var notice_load = { - time: 0, - data: [] - }; - var bookmarks = []; - - function api$2() { - return Utils$2.protocol() + object$2.cub_domain + '/api/'; - } - /** - * Запуск - */ - - - function init$N() { - if (!window.lampa_settings.account_use) return; - Settings.listener.follow('open', function (e) { - body$1 = null; - - if (e.name == 'account') { - body$1 = e.body; - renderPanel(); - check$3(); - } - }); - Storage.listener.follow('change', function (e) { - if (e.name == 'account_use') Timeline.update(true); - - if (e.name == 'account') { - Timeline.update(true); - updateProfileIcon(); - } - - if (e.name == 'cub_domain') { - Noty.show(Lang.translate('account_reload_after')); - setTimeout(function () { - window.location.reload(); - }, 5000); - } - - if (e.name == 'protocol') { - updateProfileIcon(); - update$7(); - } - }); - Socket.listener.follow('open', checkValidAccount); - Socket.listener.follow('open', function () { - if (Date.now() - start_time > 1000 * 60 * 5) Timeline.update(false, true); - }); - Favorite.listener.follow('add,added', function (e) { - save$4('add', e.where, e.card); - }); - Favorite.listener.follow('remove', function (e) { - if (e.method == 'id') save$4('remove', e.where, e.card); - }); - Head.render().find('.head__body .open--profile').on('hover:enter', function () { - showProfiles('head'); - }); - - if (!window.lampa_settings.disable_features.dmca) { - network$b.silent(Utils$2.protocol() + 'tmdb.' + object$2.cub_domain + '/blocked', function (dcma) { - window.lampa_settings.dcma = dcma; - }); - } - - setInterval(checkValidAccount, 1000 * 60 * 10); - notice_load.data = Storage.get('account_notice', '[]'); - checkProfile(function () { - getUser(); - Timeline.update(); - updateProfileIcon(); - persons(); - }); - ParentalControl.add('account_profiles', { - title: 'account_profiles' - }); - } - - function task$3(call) { - if (!window.lampa_settings.account_use) return call(); - update$7(call); - } - - function checkProfile(call) { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use) { - if (account.profile.id) call();else { - network$b.silent(api$2() + 'profiles/all', function (result) { - var main = result.profiles.find(function (p) { - return p.main; - }); - - if (main) { - account.profile = main; - Storage.set('account', account, true); - } - - call(); - }, function () { - setTimeout(checkProfile.bind(checkProfile, call), 1000 * 60); - }, false, { - headers: { - token: account.token - }, - timeout: 5000 + _this = _super.call(this, data); + Arrays.extend(data, { + params: {} }); + _this.data = data; + _this.params = data.params; + var module = typeof _this.params.module !== 'undefined' ? _this.params.module : Helper.MASK.none; + Helper.getNames(module).map(function (name) { + return Map[name]; + }).forEach(function (mod) { + return _this.use(mod); + }); + + _this.emit('init'); + + return _this; } - } else { - Storage.set('account_user', ''); - } - } - function checkValidAccount() { - var account = Storage.get('account', '{}'); - - if (account.token) { - Socket.send('check_token', {}); - } - } - - function updateProfileIcon() { - var account = Storage.get('account', '{}'); - var button = Head.render().find('.head__body .open--profile').toggleClass('hide', !Boolean(account.token)); - - if (account.token) { - var img = button.find('img')[0]; - - img.onerror = function () { - img.src = './img/img_load.svg'; - }; - - img.src = Utils$2.protocol() + object$2.cub_domain + '/img/profiles/' + (account.profile.icon || 'l_1') + '.png'; - } - } - - function persons(secuses, error) { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use && !window.lampa_settings.disable_features.persons) { - network$b.silent(api$2() + 'person/list', function (data) { - Storage.set('person_subscribes_id', data.results.map(function (a) { - return a.person_id; - })); - if (secuses) secuses(data.results); - }, error ? error : false, false, { - headers: { - token: account.token + _createClass(Contrucor, [{ + key: "toggle", + value: function toggle() { + this.emit('toggle'); } - }); - } else if (error) error(); - } - - function getUser() { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use) { - $.ajax({ - url: api$2() + 'users/get', - type: 'GET', - dataType: 'json', - timeout: 10000, - headers: { - token: account.token - }, - success: function success(data) { - user_data = data.user; - Storage.set('account_user', JSON.stringify(data.user)); - } - }); - } - } - - function checkPremium() { - var user = user_data || Storage.get('account_user', '{}'); - return user.id ? Utils$2.countDays(Date.now(), user.premium) : 0; - } - - function save$4(method, type, card) { - var account = workingAccount(); - - if (account) { - var find = bookmarks.find(function (elem) { - return elem.card_id == card.id && elem.type == type; - }); - network$b.clear(); - network$b.silent(api$2() + 'bookmarks/' + method, false, false, { - type: type, - data: JSON.stringify(Utils$2.clearCard(Arrays.clone(card))), - card_id: card.id, - id: find ? find.id : 0 }, { - headers: { - token: account.token, - profile: account.profile.id + key: "create", + value: function create() { + this.html = document.createElement('div'); + this.emit('create'); } - }); - - if (method == 'remove') { - if (find) { - Arrays.remove(bookmarks, find); - } - } else { - if (find) Arrays.remove(bookmarks, find); - Arrays.insert(bookmarks, 0, { - id: find ? find.id : 0, - cid: find ? find.cid : account.id, - card_id: card.id, - type: type, - data: Utils$2.clearCard(Arrays.clone(card)), - profile: account.profile.id, - time: Date.now() - }); - bookmarks.filter(function (elem) { - return elem.card_id == card.id; - }).forEach(function (elem) { - elem.time = Date.now(); - }); - bookmarks.sort(function (a, b) { - return b.time - a.time; - }); - } - - updateChannels(); - Socket.send('bookmarks', {}); - } - } - - function clear$9(where) { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use && window.lampa_settings.account_sync) { - network$b.silent(api$2() + 'bookmarks/clear', function (result) { - if (result.secuses) update$7(); - }, false, { - type: 'group', - group: where }, { - headers: { - token: account.token, - profile: account.profile.id + key: "render", + value: function render(js) { + return js ? this.html : $(this.html); } - }); - } - } - - function update$7(call) { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use && window.lampa_settings.account_sync) { - network$b.silent(api$2() + 'bookmarks/all?full=1', function (result) { - AppWorker.json({ - type: 'parse', - data: result - }, function (e) { - updateBookmarks(e.data.bookmarks, function () { - if (call && typeof call == 'function') call(); - }); - }); - }, function () { - if (call && typeof call == 'function') call(); - }, false, { - dataType: 'text', - timeout: 30000, - headers: { - token: account.token, - profile: account.profile.id - } - }); - } else { - updateBookmarks([], function () { - if (call && typeof call == 'function') call(); - }); - } - } - - function plugins(call) { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use) { - network$b.timeout(3000); - network$b.silent(api$2() + 'plugins/all', function (result) { - if (result.secuses) { - Storage.set('account_plugins', result.plugins); - call(result.plugins); - } else { - call(Storage.get('account_plugins', '[]')); - } - }, function () { - call(Storage.get('account_plugins', '[]')); - }, false, { - headers: { - token: account.token, - profile: account.profile.id - } - }); - } else { - call([]); - } - } - - function extensions$1(call) { - var account = Storage.get('account', '{}'); - var headers = {}; - - if (account.token && window.lampa_settings.account_use) { - headers = { - headers: { - token: account.token, - profile: account.profile.id - } - }; - } - - network$b.timeout(5000); - network$b.silent(api$2() + 'extensions/list', function (result) { - if (result.secuses) { - if (window.lampa_settings.white_use) { - var forbidden = [9, 10, 12, 180, 5, 149, 13, 158, 179]; - result.results.forEach(function (elem) { - elem.results = elem.results.filter(function (plug) { - return forbidden.indexOf(plug.id) == -1; - }); - }); - } - - Storage.set('account_extensions', result); - call(result); - } else { - call(Storage.get('account_extensions', '{}')); - } - }, function () { - call(Storage.get('account_extensions', '{}')); - }, false, headers); - } - - function pluginsStatus(plugin, status) { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use) { - network$b.silent(api$2() + (plugin.author ? 'extensions' : 'plugins') + '/status', false, false, { - id: plugin.id, - status: status }, { - headers: { - token: account.token, - profile: account.profile.id + key: "destroy", + value: function destroy() { + this.html.remove(); + this.emit('destroy'); } - }); - } - } - /** - * Статус - */ + }]); - - function renderStatus(name) { - var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - - if (body$1) { - body$1.find('.settings--account-status .settings-param__value').text(name); - body$1.find('.settings--account-status .settings-param__descr').text(value); - } + return Contrucor; + }(Emit); } - function addDevice() { - var displayModal = function displayModal() { - var html = Template.get('account_add_device'); - Utils$2.imgLoad(html.find('img'), Utils$2.protocol() + object$2.cub_domain + '/img/other/qr-add-device.png', function () { - html.addClass('loaded'); - }); - html.find('.simple-button').on('hover:enter', function () { - Modal.close(); - Input.edit({ - free: true, - title: Lang.translate('account_code_enter'), - nosave: true, - value: '', - layout: 'nums', - keyboard: 'lampa' - }, function (new_value) { - var code = parseInt(new_value); + var Row = /*#__PURE__*/function (_Constructor) { + _inherits(Row, _Constructor); - if (new_value && new_value.length == 6 && !isNaN(code)) { - var login = function login(error) { - network$b.silent(api$2() + 'device/add', function (result) { - Loading.stop(); - Storage.set('account', result, true); - Storage.set('account_email', result.email, true); - window.location.reload(); - }, error, { - code: code - }); - }; + var _super = _createSuper(Row); - Loading.start(function () { - network$b.clear(); - Loading.stop(); - }); - network$b.clear(); - login(function () { - localStorage.setItem('protocol', window.location.protocol == 'https:' ? 'https' : 'http'); - login(function (e) { - Loading.stop(); - Noty.show(Lang.translate(network$b.errorCode(e) == 200 ? 'account_code_error' : 'network_noconnect')); - }); - }); - } else { - displayModal(); - if (new_value) Noty.show(Lang.translate('account_code_wrong')); - } - }); - }); - Modal.open({ - title: '', - html: html, - size: 'small', - onBack: function onBack() { - Modal.close(); - Controller.toggle('settings_component'); - } - }); - }; + function Row() { + _classCallCheck(this, Row); - displayModal(); - } - - function renderPanel() { - if (body$1) { - var account = Storage.get('account', '{}'); - var signed = account.token ? true : false; - - if (!window.lampa_settings.account_sync) { - body$1.find('[data-name="account_use"]').remove(); - body$1.find('.settings--account-status').nextAll().remove(); - } - - body$1.find('.settings--account-signin').toggleClass('hide', signed); - body$1.find('.settings--account-user').toggleClass('hide', !signed); - body$1.find('.settings--account-premium').toggleClass('selectbox-item--checked', Boolean(checkPremium())); - body$1.find('.settings-param__label').toggleClass('hide', !Boolean(checkPremium())); - - if (!checkPremium()) { - body$1.find('.selectbox-item').on('hover:enter', showCubPremium); - } - - body$1.find('.settings--account-device-add').on('hover:enter', addDevice); - - if (account.token) { - body$1.find('.settings--account-user-info .settings-param__value').text(account.email); - body$1.find('.settings--account-user-profile .settings-param__value').text(account.profile.name); - body$1.find('.settings--account-user-out').on('hover:enter', function () { - Storage.set('account', ''); - Storage.set('account_user', ''); - Storage.set('account_email', ''); - Settings.update(); - update$7(); - }); - body$1.find('.settings--account-user-sync').on('hover:enter', function () { - account = Storage.get('account', '{}'); - Select.show({ - title: Lang.translate('settings_cub_sync'), - items: [{ - title: Lang.translate('confirm'), - subtitle: Lang.translate('account_sync_to_profile') + ' (' + account.profile.name + ')', - confirm: true - }, { - title: Lang.translate('cancel') - }], - onSelect: function onSelect(a) { - if (a.confirm) { - var file; - - try { - file = new File([localStorage.getItem('favorite') || '{}'], "bookmarks.json", { - type: "text/plain" - }); - } catch (e) {} - - if (!file) { - try { - file = new Blob([localStorage.getItem('favorite') || '{}'], { - type: 'text/plain' - }); - file.lastModifiedDate = new Date(); - } catch (e) { - Noty.show(Lang.translate('account_export_fail')); - } - } - - if (file) { - var formData = new FormData($('
')[0]); - formData.append("file", file, "bookmarks.json"); - var loader = $('
'); - body$1.find('.settings--account-user-sync').append(loader); - $.ajax({ - url: api$2() + 'bookmarks/sync', - type: 'POST', - data: formData, - async: true, - cache: false, - contentType: false, - enctype: 'multipart/form-data', - processData: false, - headers: { - token: account.token, - profile: account.profile.id - }, - success: function success(j) { - if (j.secuses) { - Noty.show(Lang.translate('account_sync_secuses')); - update$7(); - loader.remove(); - } - }, - error: function error() { - Noty.show(Lang.translate('account_export_fail')); - loader.remove(); - } - }); - } - } - - Controller.toggle('settings_component'); - }, - onBack: function onBack() { - Controller.toggle('settings_component'); - } - }); - }); - body$1.find('.settings--account-user-backup').on('hover:enter', backup); - profile(); - } else check$3(); - } - } - - function profile() { - var account = Storage.get('account', '{}'); - body$1.find('.settings--account-user-profile .settings-param__value').text(account.profile.name); - body$1.find('.settings--account-user-profile').on('hover:enter', function () { - showProfiles('settings_component'); - }); - } - - function showProfiles(controller) { - ParentalControl.personal('account_profiles', function () { - var account = Storage.get('account', '{}'); - Loading.start(function () { - network$b.clear(); - Loading.stop(); - }); - network$b.clear(); - network$b.silent(api$2() + 'profiles/all', function (result) { - Loading.stop(); - - if (result.secuses) { - var items = Arrays.clone(result.profiles); - var clone = Arrays.clone(result.profiles); - items.reverse(); - clone.reverse(); - Select.show({ - title: Lang.translate('account_profiles'), - items: items.map(function (elem, index) { - elem.title = elem.name; - elem.template = 'selectbox_icon'; - elem.icon = ''; - elem.index = index; - elem.selected = account.profile.id == elem.id; - return elem; - }), - onSelect: function onSelect(a) { - account.profile = clone[a.index]; - Storage.set('account', account); - if (body$1) body$1.find('.settings--account-user-profile .settings-param__value').text(a.name); - notice_load.time = 0; - Controller.toggle(controller); - update$7(); - }, - onBack: function onBack() { - Controller.toggle(controller); - } - }); - } else { - Noty.show(result.text); - } - }, function () { - Loading.stop(); - Noty.show(Lang.translate('account_profiles_empty')); - }, false, { - headers: { - token: account.token - } - }); - }, false, true); - } - - function check$3() { - var account = Storage.get('account', '{}'); - - if (account.token) { - renderStatus(Lang.translate('account_authorized'), Lang.translate('account_logged_in') + ' ' + account.email); - } else { - renderStatus(Lang.translate('account_login_failed'), Lang.translate('account_login_wait')); - } - } - - function working() { - return Storage.get('account', '{}').token && Storage.field('account_use') && window.lampa_settings.account_use && window.lampa_settings.account_sync; - } - - function canSync(logged_check) { - return (logged_check ? logged() && window.lampa_settings.account_sync : working()) ? Storage.get('account', '{}') : false; - } - - function workingAccount() { - return working() ? Storage.get('account', '{}') : false; - } - - function logged() { - return Storage.get('account', '{}').token ? window.lampa_settings.account_use : false; - } - - function get$d(params) { - return bookmarks.filter(function (elem) { - return elem.type == params.type; - }).map(function (elem) { - return elem.data; - }); - } - - function all$3() { - return bookmarks.map(function (elem) { - return elem.data; - }); - } - - function addDiscuss(params, call) { - var account = Storage.get('account', '{}'); - - if (account.token) { - network$b.silent(api$2() + 'discuss/add', function (data) { - data.result.icon = account.profile.icon; - call(data.result); - }, function (j, e) { - Noty.show(network$b.errorJSON(j).text || Lang.translate('network_500'), { - time: 5000 - }); - }, { - id: [params.method, params.id].join('_'), - comment: params.comment, - lang: Storage.field('language') - }, { - headers: { - token: account.token, - profile: account.profile.id - } - }); - } - } - - function voiteDiscuss(params, call) { - var account = Storage.get('account', '{}'); - - if (account.token) { - network$b.silent(api$2() + 'discuss/voite', call, function (j, e) { - Noty.show(network$b.errorJSON(j).text || Lang.translate('network_500')); - }, params, { - headers: { - token: account.token, - profile: account.profile.id - } - }); - } - } - - function updateChannels() { - if (Platform.is('android') && typeof AndroidJS.saveBookmarks !== 'undefined' && bookmarks.length) { - AppWorker.json({ - type: 'stringify', - data: bookmarks - }, function (j) { - AndroidJS.saveBookmarks(j.data); - }); - } - } - - function updateBookmarks(rows, call) { - AppWorker.utils({ - type: 'account_bookmarks_parse', - data: rows - }, function (e) { - bookmarks = e.data; - bookmarks.forEach(function (elem) { - elem.data = Utils$2.clearCard(elem.data); - }); - updateChannels(); - if (call) call(); - listener$e.send('update_bookmarks', { - rows: rows, - bookmarks: bookmarks - }); - }); - } - - function notice(call) { - var account = Storage.get('account', '{}'); - - if (account.token && window.lampa_settings.account_use && window.lampa_settings.account_sync) { - if (notice_load.time + 1000 * 60 * 10 < Date.now()) { - network$b.timeout(5000); - network$b.silent(api$2() + 'notice/all', function (result) { - if (result.secuses) { - notice_load.time = Date.now(); - notice_load.data = result.notice; - Storage.set('account_notice', result.notice.map(function (n) { - return n; - })); - call(result.notice); - } else call(notice_load.data); - }, function () { - call(notice_load.data); - }, false, { - headers: { - token: account.token, - profile: account.profile.id - } - }); - } else call(notice_load.data); - } else call([]); - } - - function backup() { - var account = Storage.get('account', '{}'); - - if (account.token) { - Select.show({ - title: Lang.translate('settings_cub_backup'), - nomark: true, - items: [{ - title: Lang.translate('settings_cub_backup_export'), - subtitle: Lang.translate('settings_cub_backup_export_descr'), - "export": true, - selected: true - }, { - title: Lang.translate('settings_cub_backup_import'), - subtitle: Lang.translate('settings_cub_backup_import_descr'), - "import": true - }, { - title: Lang.translate('cancel') - }], - onSelect: function onSelect(a) { - if (a["export"]) { - Select.show({ - title: Lang.translate('sure'), - nomark: true, - items: [{ - title: Lang.translate('confirm'), - "export": true, - selected: true - }, { - title: Lang.translate('cancel') - }], - onSelect: function onSelect(a) { - if (a["export"]) { - var file; - - try { - file = new File([JSON.stringify(localStorage)], "backup.json", { - type: "text/plain" - }); - } catch (e) { - console.log('Backup', 'file create error', e.message); - } - - if (!file) { - try { - file = new Blob([JSON.stringify(localStorage)], { - type: 'text/plain' - }); - file.lastModifiedDate = new Date(); - } catch (e) { - console.log('Backup', 'file create error', e.message); - Noty.show(Lang.translate('account_export_fail')); - } - } - - if (file) { - var formData = new FormData($('
')[0]); - formData.append("file", file, "backup.json"); - var loader = $('
'); - body$1.find('.settings--account-user-backup').append(loader); - $.ajax({ - url: api$2() + 'users/backup/export', - type: 'POST', - data: formData, - async: true, - cache: false, - contentType: false, - enctype: 'multipart/form-data', - processData: false, - headers: { - token: account.token - }, - success: function success(j) { - if (j.secuses) { - if (j.limited) showLimitedAccount();else Noty.show(Lang.translate('account_export_secuses')); - } else Noty.show(Lang.translate('account_export_fail')); - - loader.remove(); - }, - error: function error(e, x) { - console.log('Backup', 'network error', network$b.errorDecode(e, x)); - Noty.show(Lang.translate('account_export_fail_' + (network$b.errorJSON(e).code || 500))); - loader.remove(); - } - }); - } else { - console.log('Backup', 'file not created'); - } - } - - Controller.toggle('settings_component'); - }, - onBack: function onBack() { - Controller.toggle('settings_component'); - } - }); - } else if (a["import"]) { - network$b.silent(api$2() + 'users/backup/import', function (data) { - if (data.data) { - var imp = 0; - var ers = 0; - - for (var i in data.data) { - try { - localStorage.setItem(i, data.data[i]); - imp++; - } catch (e) { - ers++; - } - } - - Noty.show(Lang.translate('account_import_secuses') + ' - ' + Lang.translate('account_imported') + ' (' + imp + '/' + ers + ') - ' + Lang.translate('account_reload_after')); - setTimeout(function () { - window.location.reload(); - }, 5000); - } else Noty.show(Lang.translate('nodata')); - }, function () { - Noty.show(Lang.translate('account_import_fail')); - }, false, { - headers: { - token: account.token - } - }); - Controller.toggle('settings_component'); - } else { - Controller.toggle('settings_component'); - } - }, - onBack: function onBack() { - Controller.toggle('settings_component'); - } - }); - } - } - - function subscribes(params, secuses, error) { - var account = canSync(true); - - if (account) { - network$b.silent(api$2() + 'notifications/all', function (result) { - secuses({ - results: result.notifications.map(function (r) { - return Arrays.decodeJson(r.card, {}); - }) - }); - }, error, false, { - headers: { - token: account.token, - profile: account.profile.id - } - }); - } else error(); - } - - function showModal(template_name) { - var enabled = Controller.enabled().name; - Modal.open({ - title: '', - html: Template.get(template_name), - onBack: function onBack() { - Modal.close(); - Controller.toggle(enabled); - } - }); - } - - function showNoAccount() { - showModal('account'); - } - - function showLimitedAccount() { - showModal('account_limited'); - } - - function showCubPremium() { - var enabled = Controller.enabled().name; - Modal.open({ - title: '', - html: Template.get('cub_premium'), - onBack: function onBack() { - Modal.close(); - Controller.toggle(enabled); - } - }); - Modal.render().addClass('modal--cub-premium').find('.modal__content').before(''); - } - - function subscribeToTranslation() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var call = arguments.length > 1 ? arguments[1] : undefined; - var error = arguments.length > 2 ? arguments[2] : undefined; - var account = canSync(true); - - if (account && params.voice) { - network$b.timeout(5000); - network$b.silent(api$2() + 'notifications/add', function (result) { - if (result.limited) showLimitedAccount();else if (call) call(); - }, function () { - if (error) error(); - }, { - voice: params.voice, - data: JSON.stringify(params.card), - episode: params.episode, - season: params.season - }, { - headers: { - token: account.token - } - }); - } else if (error) error(); - } - - function logoff(data) { - var account = Storage.get('account', '{}'); - - if (account.token && account.email == data.email) { - Storage.set('account', '', true); - Storage.set('account_use', false, true); - Storage.set('account_user', '', true); - Storage.set('account_email', '', true); - Storage.set('account_notice', '', true); - Storage.set('account_bookmarks', '', true); - $('.head .open--profile').addClass('hide'); - window.location.reload(); - } - } - - function test$1(call) { - var account = Storage.get('account', '{}'); - console.log('Account', 'start test'); - - if (account.token && window.lampa_settings.account_use && window.lampa_settings.account_sync) { - network$b.silent(api$2() + 'bookmarks/all?full=1', function (result) { - console.log('Account', 'test bookmarks:', Utils$2.shortText(result, 300)); - if (call) call(); - }, function () { - console.log('Account', 'test bookmarks: error'); - if (call) call(); - }, false, { - dataType: 'text', - timeout: 8000, - headers: { - token: account.token, - profile: account.profile.id - } - }); - } else { - console.log('Account', 'test bookmarks: no sync'); - if (call) call(); - } - } - - var Account = { - listener: listener$e, - init: init$N, - task: task$3, - working: working, - canSync: canSync, - workingAccount: workingAccount, - get: get$d, - all: all$3, - plugins: plugins, - notice: notice, - pluginsStatus: pluginsStatus, - showProfiles: showProfiles, - clear: clear$9, - update: update$7, - network: network$b, - backup: backup, - extensions: extensions$1, - subscribeToTranslation: subscribeToTranslation, - subscribes: subscribes, - showNoAccount: showNoAccount, - showCubPremium: showCubPremium, - showLimitedAccount: showLimitedAccount, - logged: logged, - removeStorage: function removeStorage() {}, - //устарело - logoff: logoff, - persons: persons, - addDiscuss: addDiscuss, - voiteDiscuss: voiteDiscuss, - updateUser: function updateUser() { - getUser(); - }, - test: test$1 - }; - Object.defineProperty(Account, 'hasPremium', { - value: function value() { - return checkPremium(); - }, - writable: false - }); - - var data$3 = {}; - var listener$d = start$8(); - var category$3 = ['like', 'wath', 'book', 'history', 'look', 'viewed', 'scheduled', 'continued', 'thrown']; - var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; - - function save$3() { - Storage.set('favorite', data$3); - } - /** - * Добавить - * @param {String} where - * @param {Object} card - */ - - - function add$b(where, card, limit) { - if (Account.working()) { - listener$d.send('add', { - where: where, - card: card - }); - } else { - //read() - var find = data$3[where].find(function (id) { - return id == card.id; - }); - - if (!find) { - Arrays.insert(data$3[where], 0, card.id); - listener$d.send('add', { - where: where, - card: card - }); - if (!search$5(card.id)) data$3.card.push(card); - - if (limit) { - var excess = data$3[where].slice(limit); - - for (var i = excess.length - 1; i >= 0; i--) { - remove$3(where, { - id: excess[i] - }); - } - } - - save$3(); - } else { - Arrays.remove(data$3[where], card.id); - Arrays.insert(data$3[where], 0, card.id); - save$3(); - listener$d.send('added', { - where: where, - card: card - }); - } - } - } - /** - * Удалить - * @param {String} where - * @param {Object} card - */ - - - function remove$3(where, card) { - if (Account.working()) { - listener$d.send('remove', { - where: where, - card: card, - method: 'id' - }); - } else { - //read() - Arrays.remove(data$3[where], card.id); - listener$d.send('remove', { - where: where, - card: card, - method: 'id' - }); - - for (var i = data$3.card.length - 1; i >= 0; i--) { - var element = data$3.card[i]; - - if (!check$2(element).any) { - Arrays.remove(data$3.card, element); - listener$d.send('remove', { - where: where, - card: element, - method: 'card' - }); - } - } - - save$3(); - } - } - /** - * Найти - * @param {integer} id - * @returns Object - */ - - - function search$5(id) { - var found; - - for (var index = 0; index < data$3.card.length; index++) { - var element = data$3.card[index]; - - if (element.id == id) { - found = element; - break; - } + return _super.apply(this, arguments); } - return found; - } - /** - * Переключить - * @param {String} where - * @param {Object} card - */ + return Row; + }(Constructor({})); - - function toggle$7(where, card) { - //if(!Account.working()) read() - var find = cloud(card); - - if (marks.find(function (a) { - return a == where; - })) { - var added = marks.find(function (a) { - return find[a]; - }); - if (added && added !== where) remove$3(added, card); - } - - if (find[where]) remove$3(where, card);else add$b(where, card); - return find[where] ? false : true; - } - /** - * Проверить - * @param {Object} card - * @returns Object - */ - - - function check$2(card) { - var result = { - any: false - }; - category$3.forEach(function (a) { - result[a] = data$3[a].find(function (id) { - return id == card.id; - }); - if (result[a]) result.any = true; - }); - return result; - } - /** - * Проверить есть ли карточка где либо кроме истории - * @param {Object} status - * @returns {Boolean} - */ - - - function checkAnyNotHistory(status) { - var any = false; - category$3.filter(function (a) { - return a !== 'history'; - }).forEach(function (a) { - if (status[a]) any = true; - }); - return any; - } - /** - * Облако, закладки из cub - * @param {Object} card - * @returns {Object} - */ - - - function cloud(card) { - if (Account.working()) { - var result = { - any: true - }; - category$3.forEach(function (a) { - result[a] = Boolean(Account.get({ - type: a - }).find(function (elem) { - return elem.id == card.id; - })); - if (result[a]) result.any = true; - }); - return result; - } else return check$2(card); - } - /** - * Получить списаок по типу - * @param {String} params.type - тип - * @returns Object - */ - - - function get$c(params) { - if (Account.working()) { - return Account.get(params); - } else { - //read() - var result = []; - var ids = data$3[params.type]; - ids.forEach(function (id) { - for (var i = 0; i < data$3.card.length; i++) { - var card = data$3.card[i]; - if (card.id == id) result.push(card); - } - }); - return result; - } - } - /** - * Очистить - * @param {String} where - * @param {Object} card - */ - - - function clear$8(where, card) { - if (Account.working()) { - Account.clear(where); - } else { - //read() - if (card) remove$3(where, card);else { - for (var i = data$3[where].length - 1; i >= 0; i--) { - var _card = search$5(data$3[where][i]); - - if (_card) remove$3(where, _card); - } - } - } - } - /** - * Считать последние данные - */ - - - function read() { - data$3 = Storage.get('favorite', '{}'); - var empty = { - card: [] - }; - category$3.forEach(function (a) { - empty[a] = []; - }); - Arrays.extend(data$3, empty); - } - /** - * Получить весь список что есть - */ - - - function full$3() { - var empty = { - card: [] - }; - category$3.forEach(function (a) { - empty[a] = []; - }); - Arrays.extend(data$3, empty); - return data$3; - } - - function all$2() { - var result = {}; - category$3.forEach(function (a) { - result[a] = get$c({ - type: a - }); - }); - return result; - } - - function continues(type) { - return Arrays.clone(get$c({ - type: 'history' - }).filter(function (e) { - return type == 'tv' ? e.number_of_seasons || e.first_air_date : !(e.number_of_seasons || e.first_air_date); - }).slice(0, 19)).map(function (e) { - e.check_new_episode = true; - return e; - }).map(function (c) { - delete c.ready; - return c; - }); - } - /** - * Запуск - */ - - - function init$M() { - read(); - } - - var Favorite = { - listener: listener$d, - check: cloud, - add: add$b, - remove: remove$3, - toggle: toggle$7, - get: get$c, - init: init$M, - clear: clear$8, - continues: continues, - full: full$3, - checkAnyNotHistory: checkAnyNotHistory, - all: all$2 - }; - - function status$2(need) { - this.data = {}; - this.work = 0; - this.need = need; - this.complited = false; - - this.check = function () { - if (this.stopped) return; - - if (this.work >= this.need && !this.complited) { - this.complited = true; - this.onComplite(this.data); - } - }; - - this.append = function (name, json) { - this.work++; - this.data[name] = json; - this.check(); - }; - - this.error = function () { - this.work++; - this.check(); - }; - - this.stop = function () { - this.stopped = true; - }; - } - - var data$2 = []; - /** - * Запуск - */ - - function init$L() { - data$2 = Storage.cache('recomends_scan', 300, []); - setInterval(function () { - var history = Favorite.get({ - type: 'history' - }); - var added = 0; - console.log('Recomendations', 'find history:', history.length); - history.forEach(function (elem) { - if (['cub', 'tmdb'].indexOf(elem.source) >= 0) { - var id = data$2.filter(function (a) { - return a.id == elem.id; - }); - - if (!id.length) { - data$2.push({ - id: elem.id, - tv: elem.number_of_seasons || elem.seasons - }); - added++; - } - } - }); - console.log('Recomendations', 'added to scan:', added, 'ready:', data$2.length); - Storage.set('recomends_scan', data$2); - search$4(); - }, 120 * 1000); - } - - function search$4() { - var ids = data$2.filter(function (e) { - return !e.scan; - }); - - if (ids.length) { - var elem = ids[0]; - elem.scan = 1; - console.log('Recomendations', 'scan:', elem.id, elem.title || elem.name); - TMDB.get((elem.tv ? 'tv' : 'movie') + '/' + elem.id + '/recommendations', {}, function (json) { - console.log('Recomendations', 'result:', json.results && json.results.length ? json.results.length : 0); - - if (json.results && json.results.length) { - var recomend = Storage.cache('recomends_list', 100, []); - var favorite = Favorite.get({ - type: 'history' - }); - json.results.forEach(function (e) { - if (!recomend.filter(function (r) { - return r.id == e.id; - }).length && !favorite.filter(function (h) { - return h.id == e.id; - }).length) { - recomend.push(e); - } - }); - Storage.set('recomends_list', recomend); - } - }); - } else { - data$2.forEach(function (a) { - return a.scan = 0; - }); - } - - Storage.set('recomends_scan', data$2); - } - - function get$b(type) { - var all = Storage.get('recomends_list', '[]'); - var items = all.filter(function (e) { - return type == 'tv' ? e.number_of_seasons || e.first_air_date : !(e.number_of_seasons || e.first_air_date); - }).reverse(); - items.forEach(function (item) { - item.ready = false; - }); - return items; - } - - var Recomends = { - init: init$L, - get: get$b - }; - - /** - * Карточка - * @param {object} data - * @param {{isparser:boolean, card_small:boolean, card_category:boolean, card_collection:boolean, card_wide:true}} params - */ - - function Episode(data) { - var card = data.card; - var episode = data.episode; - Arrays.extend(card, { - title: card.name, - original_title: card.original_name, - release_date: card.first_air_date - }); - card.release_year = ((card.release_date || '0000') + '').slice(0, 4); - - function remove(elem) { - if (elem) elem.remove(); - } - /** - * Загрузить шаблон - */ - - - this.build = function () { - this.card = Template.js('card_episode'); - this.img_poster = this.card.querySelector('.card__img') || {}; - this.img_episode = this.card.querySelector('.full-episode__img img') || {}; - this.card.querySelector('.card__title').innerText = card.title; - this.card.querySelector('.full-episode__name').innerText = episode.name || Lang.translate('noname'); - this.card.querySelector('.full-episode__num').innerText = episode.episode_number || ''; - this.card.querySelector('.full-episode__date').innerText = episode.air_date ? Utils$2.parseTime(episode.air_date).full : '----'; - - if (card.release_year == '0000') { - remove(this.card.querySelector('.card__age')); - } else { - this.card.querySelector('.card__age').innerText = card.release_year; - } - - this.card.addEventListener('visible', this.visible.bind(this)); - }; - /** - * Загрузить картинку - */ - - - this.image = function () { - var _this = this; - - this.img_poster.onload = function () {//this.card.classList.add('card--loaded') - }; - - this.img_poster.onerror = function () { - _this.img_poster.src = './img/img_broken.svg'; - }; - - this.img_episode.onload = function () { - _this.card.querySelector('.full-episode__img').classList.add('full-episode__img--loaded'); - }; - - this.img_episode.onerror = function () { - _this.img_episode.src = './img/img_broken.svg'; - }; - }; - /** - * Создать - */ - - - this.create = function () { - var _this2 = this; - - this.build(); - this.card.addEventListener('hover:focus', function () { - if (_this2.onFocus) _this2.onFocus(_this2.card, card); - }); - this.card.addEventListener('hover:hover', function () { - if (_this2.onHover) _this2.onHover(_this2.card, card); - }); - this.card.addEventListener('hover:enter', function () { - if (_this2.onEnter) _this2.onEnter(_this2.card, card); - }); - this.image(); - }; - /** - * Загружать картинку если видна карточка - */ - - - this.visible = function () { - if (card.poster_path) this.img_poster.src = Api.img(card.poster_path);else if (card.profile_path) this.img_poster.src = Api.img(card.profile_path);else if (card.poster) this.img_poster.src = card.poster;else if (card.img) this.img_poster.src = card.img;else this.img_poster.src = './img/img_broken.svg'; - if (episode.still_path) this.img_episode.src = Api.img(episode.still_path, 'w300');else if (card.backdrop_path) this.img_episode.src = Api.img(card.backdrop_path, 'w300');else this.img_episode.src = './img/img_broken.svg'; - if (this.onVisible) this.onVisible(this.card, card); - }; - /** - * Уничтожить - */ - - - this.destroy = function () { - this.img_poster.onerror = function () {}; - - this.img_poster.onload = function () {}; - - this.img_episode.onerror = function () {}; - - this.img_episode.onload = function () {}; - - this.img_poster.src = ''; - this.img_episode.src = ''; - remove(this.card); - this.card = null; - this.img_poster = null; - this.img_episode = null; - }; - /** - * Рендер - * @returns {object} - */ - - - this.render = function (js) { - return js ? this.card : $(this.card); - }; - } - - var network$a = new create$e(); - var menu_list = []; - var genres$1 = { - movie: [{ - "id": 28, - "title": "#{filter_genre_ac}" - }, { - "id": 12, - "title": "#{filter_genre_ad}" - }, { - "id": 16, - "title": "#{filter_genre_mv}" - }, { - "id": 35, - "title": "#{filter_genre_cm}" - }, { - "id": 80, - "title": "#{filter_genre_cr}" - }, { - "id": 99, - "title": "#{filter_genre_dc}" - }, { - "id": 18, - "title": "#{filter_genre_dr}" - }, { - "id": 10751, - "title": "#{filter_genre_fm}" - }, { - "id": 14, - "title": "#{filter_genre_fe}" - }, { - "id": 36, - "title": "#{filter_genre_hi}" - }, { - "id": 27, - "title": "#{filter_genre_ho}" - }, { - "id": 10402, - "title": "#{filter_genre_mu}" - }, { - "id": 9648, - "title": "#{filter_genre_de}" - }, { - "id": 10749, - "title": "#{filter_genre_md}" - }, { - "id": 878, - "title": "#{filter_genre_fa}" - }, { - "id": 10770, - "title": "#{filter_genre_tv}" - }, { - "id": 53, - "title": "#{filter_genre_tr}" - }, { - "id": 10752, - "title": "#{filter_genre_mi}" - }, { - "id": 37, - "title": "#{filter_genre_ve}" - }], - tv: [{ - "id": 10759, - "title": "#{filter_genre_aa}" - }, { - "id": 16, - "title": "#{filter_genre_mv}" - }, { - "id": 35, - "title": "#{filter_genre_cm}" - }, { - "id": 80, - "title": "#{filter_genre_cr}" - }, { - "id": 99, - "title": "#{filter_genre_dc}" - }, { - "id": 18, - "title": "#{filter_genre_dr}" - }, { - "id": 10751, - "title": "#{filter_genre_fm}" - }, { - "id": 10762, - "title": "#{filter_genre_ch}" - }, { - "id": 9648, - "title": "#{filter_genre_de}" - }, { - "id": 10763, - "title": "#{filter_genre_nw}" - }, { - "id": 10764, - "title": "#{filter_genre_rs}" - }, { - "id": 10765, - "title": "#{filter_genre_hf}" - }, { - "id": 10766, - "title": "#{filter_genre_op}" - }, { - "id": 10767, - "title": "#{filter_genre_tc}" - }, { - "id": 10768, - "title": "#{filter_genre_mp}" - }, { - "id": 37, - "title": "#{filter_genre_ve}" - }] - }; - - function url$5(u) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var ln = [Storage.field('tmdb_lang')]; - if (params.langs) ln = typeof params.langs == 'string' ? [params.langs] : ln.concat(params.langs.filter(function (n) { - return n !== ln[0]; - })); - u = add$a(u, 'api_key=' + TMDB$1.key()); - u = add$a(u, 'language=' + ln.join(',')); // Оставлю на потом для детского профиля - //if(!params.networks) u = add(u, 'certification_country=RU&certification.lte=18') - - if (params.genres && u.indexOf('with_genres') == -1) u = add$a(u, 'with_genres=' + params.genres); - if (params.page) u = add$a(u, 'page=' + params.page); - if (params.query) u = add$a(u, 'query=' + params.query); - if (params.keywords) u = add$a(u, 'with_keywords=' + params.keywords); - if (params.watch_region) u = add$a(u, 'watch_region=' + params.watch_region); - if (params.watch_providers) u = add$a(u, 'with_watch_providers=' + params.watch_providers); - if (params.networks) u = add$a(u, 'with_networks=' + params.networks); - if (params.sort_by) u = add$a(u, 'sort_by=' + params.sort_by); - - if (params.filter) { - for (var i in params.filter) { - u = add$a(u, i + '=' + params.filter[i]); - } - } // Добавляем проверку для запросов по жанрам - - - if (params.genres && u.indexOf('discover/') !== 0) { - u = 'discover/' + u; - } - - return TMDB$1.api(u); - } - - function add$a(u, params) { - return u + (/\?/.test(u) ? '&' : '?') + params; - } - - function img(src, size) { - var poster_size = Storage.field('poster_size'); - var baseimg = 't/p/' + poster_size + '/'; - var path = baseimg; - if (size) path = path.replace(new RegExp(poster_size, 'g'), size); - return src ? TMDB$1.image(path + src) : ''; - } - - function find$1(find) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var finded; - - var filtred = function filtred(items) { - for (var i = 0; i < items.length; i++) { - var item = items[i]; - - if (params.original_title == item.original_title || params.title == item.title) { - finded = item; - break; - } - } - }; - - if (find.movie && find.movie.results.length) filtred(find.movie.results); - if (find.tv && find.tv.results.length && !finded) filtred(find.tv.results); - return finded; - } - - function main$3() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var onerror = arguments.length > 2 ? arguments[2] : undefined; - var parts_limit = 6; - var parts_data = [function (call) { - get$a('movie/now_playing', params, function (json) { - json.title = Lang.translate('title_now_watch'); - call(json); - }, call); - }, function (call) { - call({ - results: TimeTable.lately().slice(0, 20), - title: Lang.translate('title_upcoming_episodes'), - nomore: true, - cardClass: function cardClass(_elem, _params) { - return new Episode(_elem, _params); - } - }); - }, function (call) { - get$a('trending/movie/day', params, function (json) { - json.title = Lang.translate('title_trend_day'); - call(json); - }, call); - }, function (call) { - get$a('trending/movie/week', params, function (json) { - json.title = Lang.translate('title_trend_week'); - call(json); - }, call); - }, function (call) { - get$a('movie/upcoming', params, function (json) { - json.title = Lang.translate('title_upcoming'); - call(json); - }, call); - }, function (call) { - get$a('movie/popular', params, function (json) { - json.title = Lang.translate('title_popular_movie'); - call(json); - }, call); - }, function (call) { - get$a('trending/tv/week', params, function (json) { - json.title = Lang.translate('title_popular_tv'); - call(json); - }, call); - }, function (call) { - get$a('movie/top_rated', params, function (json) { - json.title = Lang.translate('title_top_movie'); - json.line_type = 'top'; - call(json); - }, call); - }, function (call) { - get$a('tv/top_rated', params, function (json) { - json.title = Lang.translate('title_top_tv'); - json.line_type = 'top'; - call(json); - }, call); - }]; - var start_shuffle = parts_data.length + 1; - Arrays.insert(parts_data, 0, Api.partPersons(parts_data, parts_limit, 'movie', start_shuffle)); - genres$1.movie.forEach(function (genre) { - var event = function event(call) { - get$a('discover/movie?with_genres=' + genre.id, params, function (json) { - json.title = Lang.translate(genre.title.replace(/[^a-z_]/g, '')); - call(json); - }, call); - }; - - parts_data.push(event); - }); - - function loadPart(partLoaded, partEmpty) { - Api.partNext(parts_data, parts_limit, partLoaded, partEmpty); - } - - loadPart(oncomplite, onerror); - return loadPart; - } - - function category$2() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var onerror = arguments.length > 2 ? arguments[2] : undefined; - var fullcat = !(params.genres || params.keywords); - var show = ['movie', 'tv'].indexOf(params.url) > -1 && fullcat; - var books = show ? Favorite.continues(params.url) : []; - var recomend = show ? Arrays.shuffle(Recomends.get(params.url)).slice(0, 19) : []; - var parts_limit = 6; - var parts_data = [function (call) { - var json = { - results: books, - title: params.url == 'tv' ? Lang.translate('title_continue') : Lang.translate('title_watched') - }; - - if (params.url == 'tv') { - json.ad = 'notice', json.type = params.url; - } - - call(json); - }, function (call) { - if (params.url == 'tv' || params.url == 'anime') { - call({ - results: TimeTable.lately().slice(0, 20), - title: Lang.translate('title_upcoming_episodes'), - nomore: true, - cardClass: function cardClass(_elem, _params) { - return new Episode(_elem, _params); - } - }); - } else { - call(); - } - }, function (call) { - call({ - results: recomend, - title: Lang.translate('title_recomend_watch') - }); - }, function (call) { - if (params.url == 'movie') { - get$a('discover/' + params.url + '?with_release_type=1', params, function (json) { - json.title = Lang.translate('title_now_watch'); - call(json); - }, call); - } else call(); - }, function (call) { - get$a(params.url == 'movie' ? 'trending/movie/week' : 'trending/tv/week', params, function (json) { - json.title = Lang.translate('title_popular'); - - if (params.url == 'tv') { - json.ad = 'bot'; - json.type = params.url; - } - - call(json); - }, call); - }, function (call) { - get$a('discover/' + params.url + '?' + (params.url == 'movie' ? 'primary_release_year' : 'first_air_date_year') + '=' + (new Date().getFullYear() - 1), params, function (json) { - json.title = Lang.translate('title_last_year'); - call(json); - }, call); - }, function (call) { - var lte = new Date().getFullYear() - 2 + '-12-31'; - var gte = new Date().getFullYear() - 7 + '-01-01'; - var reg = params.url == 'movie' ? 'primary_release_date' : 'first_air_date'; - lte = reg + '.lte=' + lte; - gte = reg + '.gte=' + gte; - get$a('discover/' + params.url + '?' + lte + '&' + gte, params, function (json) { - json.title = Lang.translate('title_worth_rewatch'); - call(json); - }, call); - }, function (call) { - var lte = new Date().getFullYear() - 2 + '-12-31'; - var gte = new Date().getFullYear() - 7 + '-01-01'; - var reg = params.url == 'movie' ? 'primary_release_date' : 'first_air_date'; - lte = reg + '.lte=' + lte; - gte = reg + '.gte=' + gte; - get$a('discover/' + params.url + '?' + lte + '&' + gte + '&vote_average.gte=8&vote_average.lte=9', params, function (json) { - json.title = Lang.translate('title_hight_voite'); - json.line_type = 'top'; - call(json); - }, call); - }, function (call) { - if (params.genres) return call(); - - if (params.url == 'tv') { - get$a('trending/tv/week', params, function (json) { - json.title = Lang.translate('title_this_week'); - call(json); - }, call); - } else { - get$a('movie/upcoming', params, function (json) { - json.title = Lang.translate('title_upcoming'); - json.small = true; - json.wide = true; - json.results.forEach(function (card) { - card.promo = card.overview; - card.promo_title = card.title || card.name; - }); - call(json); - }, call); - } - }]; - var start_shuffle = parts_data.length + 1; - if (fullcat) Arrays.insert(parts_data, 0, Api.partPersons(parts_data, parts_limit, params.url, start_shuffle)); - genres$1[params.url].forEach(function (genre) { - var gen = params.genres ? [].concat(params.genres, genre.id) : [genre.id]; - if (params.genres && params.genres == genre.id) return; - - var event = function event(call) { - get$a('discover/' + params.url + '?with_genres=' + gen.join(','), params, function (json) { - json.title = Lang.translate(genre.title.replace(/[^a-z_]/g, '')); - call(json); - }, call); - }; - - parts_data.push(event); - Arrays.shuffleArrayFromIndex(parts_data, start_shuffle); - }); - - function loadPart(partLoaded, partEmpty) { - Api.partNext(parts_data, parts_limit, partLoaded, partEmpty); - } - - loadPart(oncomplite, onerror); - return loadPart; - } - - function full$2() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var onerror = arguments.length > 2 ? arguments[2] : undefined; - var status = new status$2(8); - status.onComplite = oncomplite; - if (Utils$2.dcma(params.method, params.id)) return onerror(); - get$a(params.method + '/' + params.id + '?append_to_response=content_ratings,release_dates,external_ids,keywords,alternative_titles', params, function (json) { - json.source = 'tmdb'; - - if (json.external_ids) { - json.imdb_id = json.external_ids.imdb_id; - } - - if (params.method == 'tv') { - var season = Utils$2.countSeasons(json); - get$a('tv/' + json.id + '/season/' + season, {}, function (ep) { - status.append('episodes', ep); - }, status.error.bind(status)); - } else status.need--; - - if (json.belongs_to_collection) { - get$a('collection/' + json.belongs_to_collection.id, {}, function (collection) { - collection.results = collection.parts.slice(0, 19); - status.append('collection', collection); - }, status.error.bind(status)); - } else status.need--; - - status.append('movie', json); - }, function () { - status.need -= 2; - status.error(); - }); - get$a(params.method + '/' + params.id + '/credits', params, function (json) { - status.append('persons', json); - }, status.error.bind(status)); - get$a(params.method + '/' + params.id + '/recommendations', params, function (json) { - status.append('recomend', json); - }, status.error.bind(status)); - get$a(params.method + '/' + params.id + '/similar', params, function (json) { - status.append('simular', json); - }, status.error.bind(status)); - videos(params, function (json) { - status.append('videos', json); - }, status.error.bind(status)); - Api.sources.cub.reactionsGet(params, function (json) { - status.append('reactions', json); - }); - - if (Lang.selected(['ru', 'uk', 'be']) && window.lampa_settings.account_use) { - status.need++; - Api.sources.cub.discussGet(params, function (json) { - status.append('discuss', json); - }, status.error.bind(status)); - } - } - - function videos() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var lg = Storage.field('tmdb_lang'); - var status = new status$2(lg == 'en' ? 1 : 2); - - status.onComplite = function (res) { - var data = []; - if (res.one && res.one.results && res.one.results.length) data = data.concat(res.one.results); - if (res.two && res.two.results && res.two.results.length) data = data.concat(res.two.results); - oncomplite({ - results: data - }); - }; - - get$a(params.method + '/' + params.id + '/videos', { - langs: Storage.field('tmdb_lang') - }, function (json) { - status.append('one', json); - }, status.error.bind(status)); - - if (lg !== 'en') { - get$a(params.method + '/' + params.id + '/videos', { - langs: 'en' - }, function (json) { - status.append('two', json); - }, status.error.bind(status)); - } - } - - function list$4() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var onerror = arguments.length > 2 ? arguments[2] : undefined; - var u = url$5(params.url, params); - network$a.silent(u, oncomplite, onerror); - } - - function get$a(method) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var oncomplite = arguments.length > 2 ? arguments[2] : undefined; - var onerror = arguments.length > 3 ? arguments[3] : undefined; - var u = url$5(method, params); - network$a.timeout(1000 * 10); - network$a.silent(u, function (json) { - json.url = method; - oncomplite(json); - }, onerror); - } - - function search$3() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var status = new status$2(3); - - status.onComplite = function (data) { - var items = []; - if (data.movie && data.movie.results.length) items.push(data.movie); - if (data.tv && data.tv.results.length) items.push(data.tv); - if (data.person && data.person.results.length) items.push(data.person); - oncomplite(items); - }; - - get$a('search/movie', params, function (json) { - json.title = Lang.translate('menu_movies'); - json.type = 'movie'; - status.append('movie', json); - }, status.error.bind(status)); - get$a('search/tv', params, function (json) { - json.title = Lang.translate('menu_tv'); - json.type = 'tv'; - status.append('tv', json); - }, status.error.bind(status)); - get$a('search/person', params, function (json) { - json.title = Lang.translate('title_actors'); - json.type = 'person'; - status.append('person', json); - }, status.error.bind(status)); - } - - function discovery$2() { - return { - title: 'TMDB', - search: search$3, - params: { - align_left: true, - object: { - source: 'tmdb' - } - }, - onMore: function onMore(params) { - Activity$1.push({ - url: 'search/' + params.data.type, - title: Lang.translate('search') + ' - ' + params.query, - component: 'category_full', - page: 2, - query: encodeURIComponent(params.query), - source: 'tmdb' - }); - }, - onCancel: network$a.clear.bind(network$a) - }; - } - - function person$2() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - - var sortCredits = function sortCredits(credits) { - return credits.map(function (a) { - a.year = parseInt(((a.release_date || a.first_air_date || '0000') + '').slice(0, 4)); - return a; - }).sort(function (a, b) { - return b.vote_average - a.vote_average && b.vote_count - a.vote_count; - }); //сортируем по оценке и кол-ву голосов (чтобы отсечь мусор с 1-2 оценками) - }; - - var convert = function convert(credits, person_data) { - if (params.only_credits) { - var cast = sortCredits(credits.cast); - var result = {}; - result[params.only_credits] = sortCredits(cast.filter(function (media) { - return media.media_type === params.only_credits; - })); - return result; - } else { - var department = ['directing', 'writing', 'editing', 'creator']; - credits.crew.forEach(function (a) { - a.department = Lang.translate(department.indexOf(a.department.toLowerCase()) == -1 ? 'settings_main_rest' : 'full_' + a.department.toLowerCase()); - }); - - var _cast = sortCredits(credits.cast), - crew = sortCredits(credits.crew), - tv = sortCredits(_cast.filter(function (media) { - return media.media_type === 'tv'; - })), - movie = sortCredits(_cast.filter(function (media) { - return media.media_type === 'movie'; - })), - knownFor; //Наиболее известные работы человека - //1. Группируем все работы по департаментам (Актер, Режиссер, Сценарист и т.д.) - - - knownFor = Arrays.groupBy(crew, 'department'); - if (movie.length > 0) knownFor[Lang.translate('menu_movies')] = movie; - if (tv.length > 0) knownFor[Lang.translate('menu_tv')] = tv; //2. Для каждого департамента суммируем кол-ва голосов (вроде бы сам TMDB таким образом определяет knownFor для людей) - - knownFor = Object.entries(knownFor).map(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - depIdx = _ref2[0], - dep = _ref2[1]; - - //убираем дубликаты (человек может быть указан в одном департаменте несколько раз на разных должностях (job)) - var set = {}, - credits = dep.filter(function (credit) { - return set.hasOwnProperty(credit.original_title || credit.original_name) ? false : credit.original_title ? set[credit.original_title] = true : set[credit.original_name] = true; - }); - return { - name: depIdx, - credits: credits, - vote_count: dep.reduce(function (a, b) { - return a + b.vote_count; - }, 0) - }; //3. Сортируем департаменты по кол-ву голосов - }).sort(function (a, b) { - return b.credits.length - a.credits.length; - }); - return { - raw: credits, - cast: _cast, - crew: crew, - tv: tv, - movie: movie, - knownFor: knownFor - }; - } - }; - - var status = new status$2(params.only_credits ? 1 : 2); - - status.onComplite = function () { - var fulldata = {}; - if (status.data.person) fulldata.person = status.data.person; - if (status.data.credits) fulldata.credits = convert(status.data.credits, status.data.person || {}); - oncomplite(fulldata); - }; - - if (!params.only_credits) { - get$a('person/' + params.id, params, function (json) { - status.append('person', json); - }, status.error.bind(status)); - } - - get$a('person/' + params.id + '/combined_credits', params, function (json) { - status.append('credits', json); - }, status.error.bind(status)); - } - - function menu$2() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - if (menu_list.length) oncomplite(menu_list);else { - var u = url$5('genre/movie/list', params); - network$a.silent(u, function (j) { - j.genres.forEach(function (g) { - menu_list.push({ - title: g.name, - id: g.id - }); - }); - oncomplite(menu_list); - }); - } - } - - function menuCategory$2(params, oncomplite) { - var menu = []; - - if (params.action !== 'tv') { - menu.push({ - title: Lang.translate('title_now_watch'), - url: params.action + '/now_playing' - }); - } - - menu.push({ - title: Lang.translate('title_popular'), - url: params.action + '/popular' - }); - var date = new Date(); - var query = []; - query.push('sort_by=release_date.desc'); - query.push('year=' + date.getFullYear()); - query.push('first_air_date_year=' + date.getFullYear()); - query.push('vote_average.gte=7'); - menu.push({ - title: Lang.translate('title_new'), - url: 'discover/' + params.action + '?' + query.join('&') - }); - - if (params.action == 'tv') { - menu.push({ - title: Lang.translate('title_tv_today'), - url: params.action + '/airing_today' - }); - menu.push({ - title: Lang.translate('title_this_week'), - url: params.action + '/on_the_air' - }); - } - - menu.push({ - title: Lang.translate('title_in_top'), - url: params.action + '/top_rated' - }); - oncomplite(menu); - } - - function external_ids() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var onerror = arguments.length > 2 ? arguments[2] : undefined; - get$a((params.type || 'tv') + '/' + params.id + '/external_ids', params, oncomplite, onerror); - } - - function external_imdb_id() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - get$a(params.type + '/' + params.id + '/external_ids', params, function (ids) { - oncomplite(ids.imdb_id || ''); - }, function () { - oncomplite(''); - }); - } - - function company$1() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var onerror = arguments.length > 2 ? arguments[2] : undefined; - var status = new status$2(3); - - status.onComplite = function () { - function sortResultsByVoteAverage(results) { - return results.sort(function (a, b) { - return b.vote_average - a.vote_average; - }); - } - - if (status.data.company) { - var fulldata = { - company: status.data.company, - lines: [] - }; - if (status.data.movie && status.data.movie.results.length) fulldata.lines.push({ - nomore: true, - title: Lang.translate('menu_movies'), - results: sortResultsByVoteAverage(status.data.movie.results) - }); - if (status.data.tv && status.data.tv.results.length) fulldata.lines.push({ - nomore: true, - title: Lang.translate('menu_tv'), - results: sortResultsByVoteAverage(status.data.tv.results) - }); - oncomplite(fulldata); - } else onerror(); - }; - - get$a('company/' + params.id, params, function (json) { - status.append('company', json); - }, status.error.bind(status)); - get$a('discover/movie?sort_by=vote_count.desc&with_companies=' + params.id, params, function (json) { - status.append('movie', json); - }, status.error.bind(status)); - get$a('discover/tv?sort_by=vote_count.desc&with_companies=' + params.id, params, function (json) { - status.append('tv', json); - }, status.error.bind(status)); - } - - function seasons$2(tv, from, oncomplite) { - var status = new status$2(from.length); - status.onComplite = oncomplite; - from.forEach(function (season) { - get$a('tv/' + tv.id + '/season/' + season, {}, function (json) { - status.append('' + season, json); - }, status.error.bind(status)); - }); - } - - function parsePG(movie) { - var pg; - var cd = Storage.field('language'); - - if (movie.content_ratings) { - try { - var _find = movie.content_ratings.results.find(function (a) { - return a.iso_3166_1 == cd.toUpperCase(); - }); - - if (!_find) _find = movie.content_ratings.results.find(function (a) { - return a.iso_3166_1 == 'US'; - }); - if (_find) pg = Utils$2.decodePG(_find.rating); - } catch (e) {} - } - - if (movie.release_dates && !pg) { - var _find2 = movie.release_dates.results.find(function (a) { - return a.iso_3166_1 == cd.toUpperCase(); - }); - - if (!_find2) _find2 = movie.release_dates.results.find(function (a) { - return a.iso_3166_1 == 'US'; - }); - - if (_find2 && _find2.release_dates.length) { - pg = Utils$2.decodePG(_find2.release_dates[0].certification); - } - } - - if (movie.restrict) pg = movie.restrict + '+'; - return pg; - } - - function parseCountries(movie) { - var iso_countries = { - 'AD': Lang.translate('country_ad'), - 'AE': Lang.translate('country_ae'), - 'AF': Lang.translate('country_af'), - //'AG' : 'Antigua And Barbuda', - //'AI' : 'Anguilla', - 'AL': Lang.translate('country_al'), - 'AM': Lang.translate('country_am'), - //'AN' : 'Netherlands Antilles', - 'AO': Lang.translate('country_ao'), - //'AQ' : 'Antarctica', - 'AR': Lang.translate('country_ar'), - //'AS' : 'American Samoa', - 'AT': Lang.translate('country_at'), - 'AU': Lang.translate('country_au'), - 'AW': Lang.translate('country_aw'), - 'AZ': Lang.translate('country_az'), - 'BA': Lang.translate('country_ba'), - //'BB' : 'Barbados', - 'BD': Lang.translate('country_bd'), - 'BE': Lang.translate('country_be'), - //'BF' : 'Burkina Faso', - 'BG': Lang.translate('country_bg'), - 'BH': Lang.translate('country_bh'), - 'BI': Lang.translate('country_bi'), - 'BJ': Lang.translate('country_bj'), - //'BL' : 'Saint Barthelemy', - //'BM' : 'Bermuda', - //'BN' : 'Brunei Darussalam', - 'BO': Lang.translate('country_bo'), - 'BR': Lang.translate('country_br'), - 'BS': Lang.translate('country_bs'), - 'BT': Lang.translate('country_bt'), - //'BV' : 'Bouvet Island', - 'BW': Lang.translate('country_bw'), - 'BY': Lang.translate('country_by'), - //'BZ' : 'Belize', - 'CA': Lang.translate('country_ca'), - //'CC' : 'Cocos (Keeling) Islands', - //'CD' : 'Congo, Democratic Republic', - //'CF' : 'Central African Republic', - //'CG' : 'Congo', - 'CH': Lang.translate('country_ch'), - //'CI' : 'Cote D\'Ivoire', - //'CK' : 'Cook Islands', - 'CL': Lang.translate('country_cl'), - 'CM': Lang.translate('country_cm'), - 'CN': Lang.translate('country_cn'), - 'CO': Lang.translate('country_co'), - 'CR': Lang.translate('country_cr'), - 'CU': Lang.translate('country_cu'), - 'CV': Lang.translate('country_cv'), - //'CX' : 'Christmas Island', - 'CY': Lang.translate('country_cy'), - 'CZ': Lang.translate('country_cz'), - 'DE': Lang.translate('country_de'), - 'DJ': Lang.translate('country_dj'), - 'DK': Lang.translate('country_dk'), - //'DM' : 'Dominica', - 'DO': Lang.translate('country_do'), - 'DZ': Lang.translate('country_dz'), - 'EC': Lang.translate('country_ec'), - 'EE': Lang.translate('country_ee'), - 'EG': Lang.translate('country_eg'), - //'EH' : 'Western Sahara', - //'ER' : 'Eritrea', - 'ES': Lang.translate('country_es'), - 'ET': Lang.translate('country_et'), - 'FI': Lang.translate('country_fi'), - //'FJ' : 'Fiji', - //'FK' : 'Falkland Islands (Malvinas)', - //'FM' : 'Micronesia, Federated States Of', - 'FO': Lang.translate('country_fo'), - 'FR': Lang.translate('country_fr'), - 'GA': Lang.translate('country_ga'), - 'GB': Lang.translate('country_gb'), - //'GD' : 'Grenada', - 'GE': Lang.translate('country_ge'), - //'GF' : 'French Guiana', - //'GG' : 'Guernsey', - 'GH': Lang.translate('country_gh'), - //'GI' : 'Gibraltar', - 'GL': Lang.translate('country_gl'), - //'GM' : 'Gambia', - //'GN' : 'Guinea', - 'GP': Lang.translate('country_gp'), - //'GQ' : 'Equatorial Guinea', - 'GR': Lang.translate('country_gr'), - //'GS' : 'South Georgia And Sandwich Isl.', - 'GT': Lang.translate('country_gt'), - //'GU' : 'Guam', - //'GW' : 'Guinea-Bissau', - //'GY' : 'Guyana', - 'HK': Lang.translate('country_hk'), - //'HM' : 'Heard Island & Mcdonald Islands', - //'HN' : 'Honduras', - 'HR': Lang.translate('country_hr'), - 'HT': Lang.translate('country_ht'), - 'HU': Lang.translate('country_hu'), - 'ID': Lang.translate('country_id'), - 'IE': Lang.translate('country_ie'), - 'IL': Lang.translate('country_il'), - //'IM' : 'Isle Of Man', - 'IN': Lang.translate('country_in'), - //'IO' : 'British Indian Ocean Territory', - 'IQ': Lang.translate('country_iq'), - 'IR': Lang.translate('country_ir'), - 'IS': Lang.translate('country_is'), - 'IT': Lang.translate('country_it'), - //'JE' : 'Jersey', - 'JM': Lang.translate('country_jm'), - 'JO': Lang.translate('country_jo'), - 'JP': Lang.translate('country_jp'), - 'KE': Lang.translate('country_ke'), - 'KG': Lang.translate('country_kg'), - 'KH': Lang.translate('country_kh'), - //'KI' : 'Kiribati', - //'KM' : 'Comoros', - //'KN' : 'Saint Kitts And Nevis', - 'KP': Lang.translate('country_kp'), - 'KR': Lang.translate('country_kr'), - 'KW': Lang.translate('country_kw'), - //'KY' : 'Cayman Islands', - 'KZ': Lang.translate('country_kz'), - 'LA': Lang.translate('country_la'), - 'LB': Lang.translate('country_lb'), - //'LC' : 'Saint Lucia', - 'LI': Lang.translate('country_li'), - 'LK': Lang.translate('country_lk'), - 'LR': Lang.translate('country_lr'), - //'LS' : 'Lesotho', - 'LT': Lang.translate('country_lt'), - 'LU': Lang.translate('country_lu'), - 'LV': Lang.translate('country_lv'), - 'LY': Lang.translate('country_ly'), - 'MA': Lang.translate('country_ma'), - 'MC': Lang.translate('country_mc'), - 'MD': Lang.translate('country_md'), - 'ME': Lang.translate('country_me'), - //'MF' : 'Saint Martin', - //'MG' : 'Madagascar', - //'MH' : 'Marshall Islands', - 'MK': Lang.translate('country_mk'), - //'ML' : 'Mali', - 'MM': Lang.translate('country_mm'), - 'MN': Lang.translate('country_mn'), - 'MO': Lang.translate('country_mo'), - //'MP' : 'Northern Mariana Islands', - //'MQ' : 'Martinique', - //'MR' : 'Mauritania', - //'MS' : 'Montserrat', - 'MT': Lang.translate('country_mt'), - 'MU': Lang.translate('country_mu'), - 'MV': Lang.translate('country_mv'), - 'MW': Lang.translate('country_mw'), - 'MX': Lang.translate('country_mx'), - 'MY': Lang.translate('country_my'), - 'MZ': Lang.translate('country_mz'), - 'NA': Lang.translate('country_na'), - //'NC' : 'New Caledonia', - 'NE': Lang.translate('country_ne'), - //'NF' : 'Norfolk Island', - 'NG': Lang.translate('country_ng'), - 'NI': Lang.translate('country_ni'), - 'NL': Lang.translate('country_nl'), - 'NO': Lang.translate('country_no'), - 'NP': Lang.translate('country_np'), - //'NR' : 'Nauru', - //'NU' : 'Niue', - 'NZ': Lang.translate('country_nz'), - 'OM': Lang.translate('country_om'), - 'PA': Lang.translate('country_pa'), - 'PE': Lang.translate('country_pe'), - //'PF' : 'French Polynesia', - 'PG': Lang.translate('country_pg'), - 'PH': Lang.translate('country_ph'), - 'PK': Lang.translate('country_pk'), - 'PL': Lang.translate('country_pl'), - //'PM' : 'Saint Pierre And Miquelon', - //'PN' : 'Pitcairn', - 'PR': Lang.translate('country_pr'), - 'PS': Lang.translate('country_ps'), - 'PT': Lang.translate('country_pt'), - //'PW' : 'Palau', - 'PY': Lang.translate('country_py'), - 'QA': Lang.translate('country_qa'), - //'RE' : 'Reunion', - 'RO': Lang.translate('country_ro'), - 'RS': Lang.translate('country_rs'), - 'RU': Lang.translate('country_ru'), - 'RW': Lang.translate('country_rw'), - 'SA': Lang.translate('country_sa'), - //'SB' : 'Solomon Islands', - //'SC' : 'Seychelles', - 'SD': Lang.translate('country_sd'), - 'SE': Lang.translate('country_se'), - 'SG': Lang.translate('country_sg'), - //'SH' : 'Saint Helena', - 'SI': Lang.translate('country_si'), - //'SJ' : 'Svalbard And Jan Mayen', - 'SK': Lang.translate('country_sk'), - //'SL' : 'Sierra Leone', - //'SM' : 'San Marino', - 'SN': Lang.translate('country_sn'), - //'SO' : 'Somalia', - //'SR' : 'Suriname', - //'ST' : 'Sao Tome And Principe', - 'SU': Lang.translate('country_su'), - 'SV': Lang.translate('country_sv'), - 'SY': Lang.translate('country_sy'), - //'SZ' : 'Swaziland', - //'TC' : 'Turks And Caicos Islands', - //'TD' : 'Chad', - //'TF' : 'French Southern Territories', - //'TG' : 'Togo', - 'TH': Lang.translate('country_th'), - 'TJ': Lang.translate('country_tj'), - //'TK' : 'Tokelau', - //'TL' : 'Timor-Leste', - 'TM': Lang.translate('country_tm'), - 'TN': Lang.translate('country_tn'), - //'TO' : 'Tonga', - 'TR': Lang.translate('country_tr'), - //'TT' : 'Trinidad And Tobago', - //'TV' : 'Tuvalu', - 'TW': Lang.translate('country_tw'), - 'TZ': Lang.translate('country_tz'), - 'UA': Lang.translate('country_ua'), - 'UG': Lang.translate('country_ug'), - //'UM' : 'United States Outlying Islands', - 'US': Lang.translate('country_us'), - 'UY': Lang.translate('country_uy'), - 'UZ': Lang.translate('country_uz'), - //'VA' : 'Holy See (Vatican City State)', - //'VC' : 'Saint Vincent And Grenadines', - 'VE': Lang.translate('country_ve'), - //'VG' : 'Virgin Islands, British', - //'VI' : 'Virgin Islands, U.S.', - 'VN': Lang.translate('country_vn'), - //'VU' : 'Vanuatu', - //'WF' : 'Wallis And Futuna', - 'WS': Lang.translate('country_ws'), - 'YE': Lang.translate('country_ye'), - //'YT' : 'Mayotte', - 'YU': Lang.translate('country_yu'), - 'ZA': Lang.translate('country_za'), - 'ZM': Lang.translate('country_zm'), - 'ZW': Lang.translate('country_zw') - }; - return movie.production_countries ? movie.production_countries.map(function (a) { - //let cc = 'country_' + a.iso_3166_1.toLowerCase() - //return Lang.translate(cc) // FIXME! return a.name as fallback - if (iso_countries.hasOwnProperty(a.iso_3166_1)) { - return iso_countries[a.iso_3166_1]; - } else { - return a.name; - } - }) : ''; - } - - function getGenresNameFromIds(card_type, ids) { - var finded = []; - var where = genres$1[card_type]; - ids.forEach(function (a) { - var find = where.find(function (i) { - return i.id == a; - }); - if (find) finded.push(Utils$2.capitalizeFirstLetter(Lang.translate(find.title))); - }); - return finded; - } - - function clear$7() { - network$a.clear(); - } - - var TMDB = { - main: main$3, - menu: menu$2, - img: img, - full: full$2, - list: list$4, - category: category$2, - search: search$3, - clear: clear$7, - company: company$1, - person: person$2, - seasons: seasons$2, - find: find$1, - external_ids: external_ids, - get: get$a, - menuCategory: menuCategory$2, - discovery: discovery$2, - parsePG: parsePG, - parseCountries: parseCountries, - genres: genres$1, - external_imdb_id: external_imdb_id, - getGenresNameFromIds: getGenresNameFromIds, - videos: videos - }; - - var data$1 = []; - var object$1 = false; - var limit$2 = 300; - var started = Date.now(); - /** - * Запуск - */ - - function init$K() { - data$1 = Storage.cache('timetable', limit$2, []); - setInterval(extract$1, 1000 * 60 * (2)); - setInterval(favorites, 1000 * 60 * 10); - Favorite.listener.follow('add,added', function (e) { - if (e.card.number_of_seasons && e.where !== 'history') update$6(e.card); - }); - Favorite.listener.follow('remove', function (e) { - if (e.card.number_of_seasons && e.method == 'id') { - var find = data$1.find(function (a) { - return a.id == e.card.id; - }); - - if (find) { - Arrays.remove(data$1, find); - Storage.set('timetable', data$1); - Storage.remove('timetable', find.id); - } - } - }); - Lampa.Listener.follow('worker_storage', function (e) { - if (e.type == 'insert' && e.name == 'timetable') { - data$1 = Storage.get('timetable', '[]'); - } - }); - } - /** - * Добавить карточки к парсингу - * @param {[{id:integer,number_of_seasons:integer}]} elems - карточки - */ - - - function add$9(elems) { - if (started + 1000 * 60 * 2 > Date.now()) return; - var filtred = elems.filter(function (elem) { - return elem.number_of_seasons && typeof elem.id == 'number' && (elem.source == 'tmdb' || elem.source == 'cub'); - }); - console.log('Timetable', 'add:', elems.length, 'filtred:', filtred.length); - filtred.forEach(function (elem) { - var find = data$1.find(function (a) { - return a.id == elem.id; - }); - - if (!find) { - data$1.push({ - id: elem.id, - season: elem.number_of_seasons, - episodes: [] - }); - } - }); - Storage.set('timetable', data$1); - } - /** - * Добавить из закладок - */ - - - function favorites() { - var category = ['like', 'wath', 'book', 'look', 'viewed', 'scheduled', 'continued', 'thrown']; - category.forEach(function (a) { - add$9(Favorite.get({ - type: a - })); - }); - } - - function filter$1(episodes) { - var filtred = []; - var fileds = ['air_date', 'season_number', 'episode_number', 'name', 'still_path']; - episodes.forEach(function (episode) { - var item = {}; - fileds.forEach(function (field) { - if (typeof episode[field] !== 'undefined') item[field] = episode[field]; - }); - filtred.push(item); - }); - return filtred; - } - /** - * Парсим карточку - */ - - - function parse$c(to_database) { - var check = Favorite.check(object$1); - var any = Favorite.checkAnyNotHistory(check); - console.log('Timetable', 'parse:', object$1.id, 'any:', any, 'season:', object$1.season); - - if (any || to_database) { - TMDB.get('tv/' + object$1.id + '/season/' + object$1.season, {}, function (ep) { - if (!ep.episodes) return save$2(); - object$1.episodes = filter$1(ep.episodes); - Cache.getData('timetable', object$1.id).then(function (obj) { - if (obj) obj.episodes = object$1.episodes;else obj = Arrays.clone(object$1); - Cache.rewriteData('timetable', object$1.id, obj).then(function () {})["catch"](function () {}); - })["catch"](function (e) {}); - save$2(); - }, save$2); - } else { - Arrays.remove(data$1, object$1); - Storage.remove('timetable', object$1.id); - save$2(); - } - } - /** - * Получить карточку для парсинга - */ - - - function extract$1() { - var ids = data$1.filter(function (e) { - return !e.scaned && (e.scaned_time || 0) + 60 * 60 * 12 * 1000 < Date.now(); - }); - console.log('Timetable', 'extract:', ids.length, 'total:', data$1.length); - - if (ids.length) { - object$1 = ids[0]; - parse$c(); - } else { - data$1.forEach(function (a) { - return a.scaned = 0; - }); - } - - Storage.set('timetable', data$1); - } - /** - * Сохранить состояние - */ - - - function save$2() { - if (object$1) { - object$1.scaned = 1; - object$1.scaned_time = Date.now(); - Storage.set('timetable', data$1); - } - } - /** - * Получить эпизоды для карточки если есть - * @param {{id:integer}} elem - карточка - * @returns {array} - */ - - - function get$9(elem, callback) { - var fid = data$1.filter(function (e) { - return e.id == elem.id; - }); - var res = (fid.length ? fid[0] : {}).episodes || []; - - if (typeof callback == 'function') { - if (res.length) return callback(res); - Cache.getData('timetable', elem.id).then(function (obj) { - callback(obj ? obj.episodes || [] : []); - })["catch"](function (e) { - callback(res); - }); - } else { - return res; - } - } - /** - * Добавить карточку в парсинг самостоятельно - * @param {{id:integer,number_of_seasons:integer}} elem - карточка - */ - - - function update$6(elem) { - if (elem.number_of_seasons && typeof elem.id == 'number' && (elem.source == 'tmdb' || elem.source == 'cub')) { - var check = Favorite.check(elem); - var any = Favorite.checkAnyNotHistory(check); - var id = data$1.filter(function (a) { - return a.id == elem.id; - }); - var item = { - id: elem.id, - season: Utils$2.countSeasons(elem), - episodes: [] - }; - TMDB.clear(); - - if (any) { - if (!id.length) { - console.log('Timetable', 'push:', elem.id); - data$1.push(item); - Storage.set('timetable', data$1); - object$1 = item; - } else { - object$1 = id[0]; - object$1.season = Utils$2.countSeasons(elem); - } - - parse$c(); - } else { - object$1 = item; - parse$c(true); - } - } - } - /** - * Получить все данные - * @returns {[{id:integer,season:integer,episodes:[]}]} - */ - - - function all$1() { - return data$1; - } - - function lately() { - var fav = Favorite.full().card; - if (Account.working()) fav = Account.all(); - fav = fav.filter(function (f) { - return f.number_of_seasons; - }); - var now_date = new Date(); - now_date.setHours(0, 0, 0); - var now_time = now_date.getTime(); - var cards = []; - data$1.filter(function (d) { - return fav.find(function (c) { - return c.id == d.id; - }); - }).forEach(function (season) { - var episodes = season.episodes.filter(function (ep) { - return Lampa.Utils.parseToDate(ep.air_date).getTime() >= now_time; - }); - - if (episodes.length) { - cards.push({ - card: Arrays.clone(fav.find(function (c) { - return c.id == season.id; - })), - episode: episodes[0], - time: Lampa.Utils.parseToDate(episodes[0].air_date).getTime(), - season: season - }); - } - }); - cards = cards.sort(function (a, b) { - if (a.time > b.time) return 1;else if (a.time < b.time) return -1;else return 0; - }); - return cards; - } - - var TimeTable = { - init: init$K, - get: get$9, - add: add$9, - all: all$1, - update: update$6, - lately: lately - }; - - /** - * Карточка - * @param {object} data - * @param {{isparser:boolean, card_small:boolean, card_category:boolean, card_collection:boolean, card_wide:true}} params - */ - - function Card(data) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - this.data = data; - this.params = params; - Arrays.extend(data, { - title: data.name, - original_title: data.original_name, - release_date: data.first_air_date - }); - data.release_year = ((data.release_date || data.birthday || '0000') + '').slice(0, 4); - - function remove(elem) { - if (elem) elem.remove(); - } - /** - * Загрузить шаблон - */ - - - this.build = function () { - this.card = Template.js(params.isparser ? 'card_parser' : 'card', data); - this.img = this.card.querySelector('.card__img') || {}; - this.card.card_data = data; - - if (params.isparser) { - var elem_title = this.card.querySelector('.card-parser__title'); - var elem_size = this.card.querySelector('.card-parser__size'); - var elem_details = this.card.querySelector('.card-parser__details'); - if (elem_title) elem_title.innerText = data.Title; - if (elem_size) elem_size.innerText = data.size; - var seeds = document.createElement('div'); - var grabs = document.createElement('div'); - elem_details.innerHTML = ''; - seeds.innerHTML = Lang.translate('torrent_item_seeds') + ': ' + data.Seeders + ''; - grabs.innerHTML = Lang.translate('torrent_item_grabs') + ': ' + data.Peers + ''; - elem_details.appendChild(seeds); - elem_details.appendChild(grabs); - } else { - var _elem_title = this.card.querySelector('.card__title'); - - if (_elem_title) _elem_title.innerText = data.title; - - if (data.original_name) { - var type_elem = document.createElement('div'); - type_elem.classList.add('card__type'); - type_elem.innerText = data.original_name ? 'TV' : 'MOV'; - this.card.querySelector('.card__view').appendChild(type_elem); - this.card.classList.add(data.original_name ? 'card--tv' : 'card--movie'); - } - - if (params.card_small) { - this.card.classList.add('card--small'); - remove(this.card.querySelector('.card__title')); - remove(this.card.querySelector('.card__age')); - } - - if (params.card_category) { - this.card.classList.add('card--category'); - } - - if (params.card_explorer) { - this.card.classList.add('card--explorer'); - } - - if (params.card_collection) { - this.card.classList.add('card--collection'); - remove(this.card.querySelector('.card__age')); - } - - if (params.card_wide) { - this.card.classList.add('card--wide'); - data.poster = data.cover; - - if (data.promo || data.promo_title) { - var promo_wrap = document.createElement('div'); - promo_wrap.classList.add('card__promo'); - - if (data.promo_title) { - var promo_title = document.createElement('div'); - promo_title.classList.add('card__promo-title'); - promo_title.innerText = data.promo_title; - promo_wrap.appendChild(promo_title); - } - - if (data.promo) { - var promo_text = document.createElement('div'); - promo_text.classList.add('card__promo-text'); - promo_text.innerText = data.promo.slice(0, 110) + (data.promo.length > 110 ? '...' : ''); - promo_wrap.appendChild(promo_text); - } - - this.card.querySelector('.card__view').appendChild(promo_wrap); - } - - if (Storage.field('light_version')) remove(this.card.querySelector('.card__title')); - remove(this.card.querySelector('.card__age')); - } - - if (data.release_year == '0000') { - remove(this.card.querySelector('.card__age')); - } else { - var year = this.card.querySelector('.card__age'); - if (year) year.innerText = data.release_year; - } - - var vote = parseFloat((data.cub_hundred_rating || data.vote_average || 0) + '').toFixed(1); - - if (vote > 0) { - var vote_elem = document.createElement('div'); - vote_elem.classList.add('card__vote'); - vote_elem.innerText = data.cub_hundred_fire ? Utils$2.bigNumberToShort(data.cub_hundred_fire) : vote >= 10 ? 10 : vote; - this.card.querySelector('.card__view').appendChild(vote_elem); - } - - var qu = data.quality || data.release_quality; - - if (qu && Storage.field('card_quality') && !data.original_name) { - var quality = document.createElement('div'); - quality.classList.add('card__quality'); - var quality_inner = document.createElement('div'); - quality_inner.innerText = qu; - quality.appendChild(quality_inner); - this.card.querySelector('.card__view').appendChild(quality); - } - } - - this.card.addEventListener('visible', this.visible.bind(this)); - this.card.addEventListener('update', this.update.bind(this)); - }; - /** - * Загрузить картинку - */ - - - this.image = function () { - var _this = this; - - if (params.isparser) return; - - this.img.onload = function () { - _this.card.classList.add('card--loaded'); - - ImageCache.write(_this.img, _this.img.src); - }; - - this.img.onerror = function () { - TMDB$1.broken(); - console.log('Img', 'noload', _this.img.src); - _this.img.src = './img/img_broken.svg'; - }; - }; - /** - * Добавить иконку - * @param {string} name - */ - - - this.addicon = function (name) { - var icon = document.createElement('div'); - icon.classList.add('card__icon'); - icon.classList.add('icon--' + name); - this.card.querySelector('.card__icons-inner').appendChild(icon); - }; - /** - * Обносить состояние карточки - */ - - - this.update = function () { - if (params.isparser) return; - this.watched_checked = false; - if (this.watched_wrap) remove(this.watched_wrap); - this.favorite(); - if (this.card.classList.contains('focus')) this.watched(); - }; - /** - * Какие серии просмотрено - */ - - - this.watched = function () { - var _this2 = this; - - if (!Storage.field('card_episodes')) return; - - if (!this.watched_checked) { - var get = function get(callback) { - if (data.original_name) TimeTable.get(data, callback);else callback([]); - }; - - get(function (episodes) { - var viewed; - episodes.forEach(function (ep) { - var hash = Utils$2.hash([ep.season_number, ep.season_number > 10 ? ':' : '', ep.episode_number, data.original_title].join('')); - var view = Timeline$1.view(hash); - if (view.percent) viewed = { - ep: ep, - view: view - }; - }); - - if (!viewed && data.original_name) { - var last = Storage.get('online_watched_last', '{}'); - var filed = last[Utils$2.hash(data.original_title)]; - - if (filed && filed.episode) { - viewed = { - ep: { - episode_number: filed.episode, - name: Lang.translate('full_episode') + ' ' + filed.episode - }, - view: Timeline$1.view(Utils$2.hash([filed.season, filed.season > 10 ? ':' : '', filed.episode, data.original_title].join(''))) - }; - } - } - - if (!viewed && !data.original_name) { - var time = Timeline$1.view(Utils$2.hash([data.original_title].join(''))); - - if (time.percent) { - viewed = { - ep: { - name: Lang.translate('title_viewed') + ' ' + (time.time ? Utils$2.secondsToTimeHuman(time.time) : time.percent + '%') - }, - view: time - }; - } - } - - if (viewed) { - var soon = []; - var next = episodes.slice(episodes.indexOf(viewed.ep)).filter(function (ep) { - return ep.air_date; - }).filter(function (ep) { - var date = Utils$2.parseToDate(ep.air_date).getTime(); - if (date > Date.now()) soon.push(ep); - return date < Date.now(); - }).slice(0, 5); - if (next.length == 0) next = [viewed.ep]; - if (soon.length && next.length < 5 && !next.find(function (n) { - return n.episode_number == soon[0].episode_number; - })) next.push(soon[0]); - var wrap = Template.js('card_watched', {}); - next.forEach(function (ep) { - var div = document.createElement('div'); - var span = document.createElement('span'); - var date = Utils$2.parseToDate(ep.air_date); - var now = Date.now(); - var days = Math.ceil((date.getTime() - now) / (24 * 60 * 60 * 1000)); - div.classList.add('card-watched__item'); - div.appendChild(span); - span.innerText = (ep.episode_number ? ep.episode_number + ' - ' : '') + (days > 0 ? Lang.translate('full_episode_days_left') + ': ' + days : ep.name || Lang.translate('noname')); - if (ep == viewed.ep) div.appendChild(Timeline$1.render(viewed.view)[0]); - wrap.querySelector('.card-watched__body').appendChild(div); - }); - _this2.watched_wrap = wrap; - - var view = _this2.card.querySelector('.card__view'); - - view.insertBefore(wrap, view.firstChild); - } - }); - this.watched_checked = true; - } - }; - /** - * Обновить иконки на закладки - */ - - - this.favorite = function () { - var status = Favorite.check(data); - var marker = this.card.querySelector('.card__marker'); - var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; - this.card.querySelector('.card__icons-inner').innerHTML = ''; - if (status.book) this.addicon('book'); - if (status.like) this.addicon('like'); - if (status.wath) this.addicon('wath'); - if (status.history || Timeline$1.watched(data)) this.addicon('history'); - var any_marker = marks.find(function (m) { - return status[m]; - }); - - if (any_marker) { - if (!marker) { - marker = document.createElement('div'); - marker.addClass('card__marker'); - marker.append(document.createElement('span')); - this.card.querySelector('.card__view').append(marker); - } - - marker.find('span').text(Lang.translate('title_' + any_marker)); - marker.removeClass(marks.map(function (m) { - return 'card__marker--' + m; - }).join(' ')).addClass('card__marker--' + any_marker); - } else if (marker) marker.remove(); - }; - /** - * Вызвали меню - * @param {object} target - * @param {object} data - */ - - - this.onMenu = function (target, data) { - var _this3 = this; - - var enabled = Controller.enabled().name; - var status = Favorite.check(data); - var menu_plugins = []; - var menu_favorite = [{ - title: Lang.translate('title_book'), - where: 'book', - checkbox: true, - checked: status.book - }, { - title: Lang.translate('title_like'), - where: 'like', - checkbox: true, - checked: status.like - }, { - title: Lang.translate('title_wath'), - where: 'wath', - checkbox: true, - checked: status.wath - }, { - title: Lang.translate('menu_history'), - where: 'history', - checkbox: true, - checked: status.history - }, { - title: Lang.translate('settings_cub_status'), - separator: true - }]; - var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; - marks.forEach(function (m) { - menu_favorite.push({ - title: Lang.translate('title_' + m), - where: m, - picked: status[m], - collect: true, - noenter: !Account.hasPremium() - }); - }); - object$2.plugins.forEach(function (plugin) { - if (plugin.type == 'video' && plugin.onContextMenu && plugin.onContextLauch) { - menu_plugins.push({ - title: plugin.name, - subtitle: plugin.subtitle || plugin.description, - onSelect: function onSelect() { - if (document.body.classList.contains('search--open')) Search.close(); - - if (!data.imdb_id && data.source == 'tmdb') { - Loading.start(function () { - Loading.stop(); - Controller.toggle(enabled); - }); - TMDB.external_imdb_id({ - type: data.name ? 'tv' : 'movie', - id: data.id - }, function (imdb_id) { - Loading.stop(); - data.imdb_id = imdb_id; - plugin.onContextLauch(data); - }); - } else plugin.onContextLauch(data); - } - }); - } - }); - if (menu_plugins.length) menu_plugins.push({ - title: Lang.translate('more'), - separator: true - }); - var menu_main = menu_plugins.length ? menu_plugins.concat(menu_favorite) : menu_favorite; - if (this.onMenuShow) this.onMenuShow(menu_main, this.card, data); - Select.show({ - title: Lang.translate('title_action'), - items: menu_main, - onBack: function onBack() { - Controller.toggle(enabled); - }, - onCheck: function onCheck(a) { - if (params.object) data.source = params.object.source; - - if (a.where) { - Favorite.toggle(a.where, data); - - _this3.favorite(); - } - }, - onSelect: function onSelect(a) { - if (params.object) data.source = params.object.source; - - if (a.collect) { - Favorite.toggle(a.where, data); - - _this3.favorite(); - } - - if (_this3.onMenuSelect) _this3.onMenuSelect(a, _this3.card, data); - Controller.toggle(enabled); - }, - onDraw: function onDraw(item, elem) { - if (elem.collect) { - if (!Account.hasPremium()) { - var wrap = $('
'); - wrap.append(Template.js('icon_lock')); - item.find('.selectbox-item__checkbox').remove(); - item.append(wrap); - item.on('hover:enter', function () { - Select.close(); - Account.showCubPremium(); - }); - } - } - } - }); - }; - /** - * Создать - */ - - - this.create = function () { - var _this4 = this; - - this.build(); - this.card.addEventListener('hover:focus', function () { - _this4.watched(); - - if (_this4.onFocus) _this4.onFocus(_this4.card, data); - }); - this.card.addEventListener('hover:touch', function () { - _this4.watched(); - - if (_this4.onTouch) _this4.onTouch(_this4.card, data); - }); - this.card.addEventListener('hover:hover', function () { - _this4.watched(); - - if (_this4.onHover) _this4.onHover(_this4.card, data); - }); - this.card.addEventListener('hover:enter', function () { - if (_this4.onEnter) _this4.onEnter(_this4.card, data); - }); - this.card.addEventListener('hover:long', function () { - if (_this4.onMenu) _this4.onMenu(_this4.card, data); - }); - this.image(); - }; - /** - * Загружать картинку если видна карточка - */ - - - this.visible = function () { - var src = ''; - if (params.card_wide && data.backdrop_path) src = Api.img(data.backdrop_path, 'w780');else if (params.card_collection && data.backdrop_path) src = Api.img(data.backdrop_path, 'w500');else if (data.poster_path) src = Api.img(data.poster_path);else if (data.profile_path) src = Api.img(data.profile_path);else if (data.poster) src = data.poster;else if (data.img) src = data.img;else src = './img/img_broken.svg'; - ImageCache.read(this.img, src); - this.update(); - if (this.onVisible) this.onVisible(this.card, data); - }; - /** - * Уничтожить - */ - - - this.destroy = function () { - this.img.onerror = function () {}; - - this.img.onload = function () {}; - - this.img.src = ''; - remove(this.card); - this.card = null; - this.img = null; - }; - /** - * Рендер - * @returns {object} - */ - - - this.render = function (js) { - return js ? this.card : $(this.card); - }; - } - - function create$j() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var card = Template.js('more'); - card.querySelector('.card-more__title').innerText = Lang.translate('more'); - - if (params.card_small) { - card.classList.add('card-more--small'); - } - - this.create = function () { - var _this = this; - - card.addEventListener('hover:focus', function (e) { - _this.onFocus(e.target); - }); - card.addEventListener('hover:enter', function (e) { - _this.onEnter(e.target); - }); - }; - - this.render = function (js) { - return js ? card : $(card); - }; - - this.destroy = function () { - card.remove(); - card = null; - }; - } - - function create$i(data) { - var _this = this; - - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var content = Template.js('items_line', { - title: data.title - }); - var body = content.querySelector('.items-line__body'); - var scroll = new create$f({ - horizontal: true, - step: params.card_wide ? 600 : 300 - }); - var items = []; - var active = 0; - var tv = Platform.screen('tv'); - var view = (tv ? Lampa.Storage.field('interface_size') == 'small' ? 7 : 6 : 12) + (params.align_left ? 4 : 0); - var more; - var last; - - var onmore = function onmore() { - if (_this.onEnter) _this.onEnter(); - if (data.onMore) data.onMore(data);else if (_this.onMore) { - _this.onMore(data); - } else { - Activity$1.push({ - url: data.url, - title: data.title || Lang.translate('title_category'), - component: 'category_full', - page: 1, - genres: params.genres, - filter: data.filter, - source: data.source || params.object.source - }); - } - }; - - this.event = function (type) { - Lampa.Listener.send('line', { - line: this, - type: type, - params: params, - data: data, - scroll: scroll, - body: body, - items: items, - active: active - }); - }; - - this.create = function () { - var _this2 = this; - - this.event('create'); - scroll.body(true).classList.add('items-cards'); - content.querySelector('.items-line__title').innerHTML = data.title; - content.classList.add('items-line--type-' + (params.type || 'none')); - content.addEventListener('visible', this.visible.bind(this)); - data.results.slice(0, view).forEach(this.append.bind(this)); - body.appendChild(scroll.render(true)); - - scroll.onWheel = function (step) { - if (!Controller.own(_this2)) _this2.toggle(); - Controller.enabled().controller[step > 0 ? 'right' : 'left'](); - }; - - scroll.onScroll = this.attach.bind(this); - }; - /* - События - - this.onAppend = function(){} - this.onFocus = function(){} - this.onEnter = function(){} - this.onSelect = function(){} - this.onMore = function(){} - this.onFocusMore = function(){} - this.onLeft = function(){} - this.onBack = function(){} - this.onDown = function(){} - this.onUp = function(){} - */ - - - this.visible = function () { - data.results.slice(0, view).forEach(this.append.bind(this)); - - if ((data.results.length >= 20 || data.more) && !params.nomore) { - var button = document.createElement('div'); - button.classList.add('items-line__more'); - button.classList.add('selector'); - button.innerText = Lang.translate('more'); - button.addEventListener('hover:enter', onmore); - content.querySelector('.items-line__head').appendChild(button); - } - - this.event('visible'); - Layer.visible(scroll.render(true)); - }; - - this.append = function (element) { - var _this3 = this; - - if (element.ready) return; - element.ready = true; - var card = params.cardClass ? params.cardClass(element, params) : element.cardClass ? element.cardClass(element, params) : new Card(element, params); - card.create(); - - card.onFocus = function (target, card_data) { - last = target; - var prev_active = active; - active = items.indexOf(card); - if (active > 0 || prev_active > active) scroll.update(items[active].render(true), params.align_left ? false : true); - if (!data.noimage) Background.change(Utils$2.cardImgBackground(card_data)); - if (_this3.onFocus) _this3.onFocus(card_data); - }; - - card.onEnter = function (target, card_data) { - last = target; - if (_this3.onEnter) _this3.onEnter(target, card_data); - if (_this3.onSelect) return _this3.onSelect(target, card_data); - if (!card_data.source) card_data.source = params.object.source; - - if (typeof card_data.gender !== 'undefined') { - Activity$1.push({ - url: card_data.url, - title: Lang.translate('title_person'), - component: 'actor', - id: card_data.id, - source: card_data.source || params.object.source - }); - } else { - Activity$1.push({ - url: card_data.url, - component: 'full', - id: card_data.id, - method: card_data.name ? 'tv' : 'movie', - card: card_data, - source: card_data.source || params.object.source - }); - } - }; - - card.onHover = function (target, card_data) { - if (_this3.onHover) _this3.onHover(card_data); - }; - - card.onVisible = function () { - if (Controller.own(_this3)) Controller.collectionAppend(card.render(true)); - }; - - if (this.onMenu) card.onMenu = this.onMenu; - - if (params.card_events) { - for (var i in params.card_events) { - card[i] = params.card_events[i]; - } - } - - scroll.append(card.render(true)); - items.push(card); - if (this.onAppend) this.onAppend(card); - this.event('append'); - return card.render(true); - }; - - this.more = function () { - var _this4 = this; - - more = new create$j(params); - more.create(); - - more.onFocus = function (target) { - last = target; - active = items.indexOf(more); - scroll.update(more.render(true), params.align_left ? false : true); - if (_this4.onFocusMore) _this4.onFocusMore(); - }; - - more.onEnter = onmore.bind(this); - scroll.append(more.render(true)); - items.push(more); - return more.render(true); - }; - - this.attach = function () { - var size = tv ? (Math.round(active / view) + 1) * view + 1 : data.results.length; - data.results.slice(0, size).filter(function (e) { - return !e.ready; - }).forEach(this.append.bind(this)); - - if (!more && !params.nomore && data.results.length == data.results.filter(function (e) { - return e.ready; - }).length && data.results.length >= 20) { - var more_item = this.more(); - if (Controller.own(this)) Controller.collectionAppend(more_item); - } - - Layer.visible(scroll.render(true)); - }; - - this.toggle = function () { - var _this5 = this; - - Controller.add('items_line', { - link: this, - toggle: function toggle() { - Controller.collectionSet(scroll.render(true)); - Controller.collectionFocus(items.length ? last : false, scroll.render(true)); - if (_this5.onToggle) _this5.onToggle(_this5); - - _this5.event('toggle'); - }, - update: function update() {}, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else if (_this5.onLeft) _this5.onLeft();else Controller.toggle('menu'); - }, - down: this.onDown, - up: this.onUp, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('items_line'); - }; - - this.render = function (js) { - return js ? content : $(content); - }; - - this.destroy = function () { - Arrays.destroy(items); - scroll.destroy(); - content.remove(); - items = null; - this.event('destroy'); - }; - } - - var html$f; - var scroll$1; - var active$5 = 0; + var html$l; + var scroll$2; + var active$6 = 0; var items$2 = []; - var listener$c = start$8(); + var listener$j = Subscribe$2(); - function init$J() { - html$f = Template.js('player_footer'); - scroll$1 = new create$f({ + function init$12() { + html$l = Template.js('player_footer'); + scroll$2 = new Scroll({ nopadding: true, over: true }); - scroll$1.onWheel = function (step) { - if (step > 0) down();else if (active$5 > 0) up(); + scroll$2.onWheel = function (step) { + if (step > 0) down();else if (active$6 > 0) up(); }; - html$f.find('.player-footer__body').append(scroll$1.render(true)); + html$l.find('.player-footer__body').append(scroll$2.render(true)); Controller.add('player_footer', { toggle: function toggle() { - items$2[active$5].toggle(); - open$4(); + items$2[active$6].toggle(); + open$8(); }, - up: close$5, + up: close$9, right: function right() { Navigator.move('right'); }, left: function left() { Navigator.move('left'); }, - back: close$5 + back: close$9 }); } - function open$4() { - html$f.addClass('open'); - listener$c.send('open'); + function open$8() { + html$l.addClass('open'); + listener$j.send('open'); } - function close$5() { - html$f.removeClass('open'); - listener$c.send('close'); + function close$9() { + html$l.removeClass('open'); + listener$j.send('close'); } - function appendElement(element) { - var classElement = new function () { - var div = document.createElement('div'); - div.append(element); - - this.toggle = function () { + function appendRow(element) { + var row = new Row({}); + row.use({ + onCreate: function onCreate() { + this.html.append(element); + }, + onToggle: function onToggle() { var _this = this; Controller.add('player_footer_element', { toggle: function toggle() { - Controller.collectionSet(div); - Controller.collectionFocus(false, div); - - _this.onToggle(); + Controller.collectionSet(_this.html); + Controller.collectionFocus(false, _this.html); }, - up: this.onUp, - down: this.onDown, + up: this.emit.bind(this, 'up'), + down: this.emit.bind(this, 'down'), right: function right() { Navigator.move('right'); }, left: function left() { Navigator.move('left'); }, - back: this.onBack + back: this.emit.bind(this, 'back') }); Controller.toggle('player_footer_element'); - }; - - this.render = function () { - return div; - }; - - this.destroy = function () { - div.remove(); - }; - }(); - appendClass(classElement); + } + }); + appendClass(row); } function up() { - active$5--; + active$6--; - if (active$5 < 0) { - active$5 = 0; - close$5(); + if (active$6 < 0) { + active$6 = 0; + close$9(); } else { - items$2[active$5].toggle(); - scroll$1.update(items$2[active$5].render(true)); + items$2[active$6].toggle(); + scroll$2.update(items$2[active$6].render(true)); } } function down() { - active$5++; - active$5 = Math.min(active$5, items$2.length - 1); - scroll$1.update(items$2[active$5].render(true)); - items$2[active$5].toggle(); + active$6++; + active$6 = Math.min(active$6, items$2.length - 1); + scroll$2.update(items$2[active$6].render(true)); + items$2[active$6].toggle(); } function appendClass(classElement) { - classElement.onUp = up; - classElement.onDown = down; - - classElement.onToggle = function () { - scroll$1.render(true).style.height = items$2[active$5].render(true).offsetHeight; - }; - - classElement.onEnter = function () { - close$5(); - if ($('.modal').length) Modal.close(); - Lampa.Player.close(); - }; - - classElement.onBack = close$5; - - classElement.onLeft = function () {}; - - classElement.onMenu = function () {}; - - scroll$1.append(classElement.render(true)); + classElement.use({ + onUp: up, + onDown: down, + onToggle: function onToggle() { + scroll$2.render(true).style.height = this.render(true).offsetHeight; + }, + onEnter: function onEnter() { + close$9(); + if ($('.modal').length) Modal.close(); + Lampa.Player.close(); + }, + onBack: close$9 + }); + classElement.create(); + scroll$2.append(classElement.render(true)); items$2.push(classElement); } - function appendCard(card) { + function appendAbout(card) { var card_html = Template.js('player_footer_card'); card_html.find('.player-footer-card__title').text(card.name || card.title); card_html.find('.player-footer-card__tags').text(card.genres && Arrays.isArray(card.genres) ? card.genres.map(function (a) { - return Utils$2.capitalizeFirstLetter(a.name); + return Utils$1.capitalizeFirstLetter(a.name); }).join(', ') : '---'); var text = card_html.find('.player-footer-card__text'); if (card.overview) text.text(card.overview);else { @@ -13300,57 +7093,36 @@ text.append(document.createElement('div')); } } - Utils$2.imgLoad(card_html.find('img'), card.poster_path ? Api.img(card.poster_path, 'w200') : './img/img_broken.svg'); - appendElement(card_html); - } - - function appendContinue(element) { - element.results.forEach(function (e) { - e.ready = false; - }); - var item = new create$i(element, { - url: element.url, - object: {}, - card_wide: element.wide, - card_small: element.small, - card_broad: element.broad, - card_collection: element.collection, - card_category: element.category, - card_events: element.card_events, - cardClass: element.cardClass, - nomore: element.nomore, - type: element.line_type || 'cards' - }); - appendClass(item); - item.create(); + Utils$1.imgLoad(card_html.find('img'), card.poster_path ? Api.img(card.poster_path, 'w200') : './img/img_broken.svg'); + appendRow(card_html); } function available() { return items$2.length; } - function destroy$8() { + function destroy$9() { Arrays.destroy(items$2); - active$5 = 0; - scroll$1.reset(); + active$6 = 0; + scroll$2.reset(); items$2 = []; } - function render$b() { - return html$f; + function render$g() { + return html$l; } var Footer = { - init: init$J, - listener: listener$c, - appendCard: appendCard, - appendContinue: appendContinue, - render: render$b, - destroy: destroy$8, + init: init$12, + listener: listener$j, + appendAbout: appendAbout, + appendRow: appendRow, + render: render$g, + destroy: destroy$9, available: available }; - var listener$b = start$8(); + var listener$i = Subscribe$2(); var current = ''; var playlist$1 = []; var _position = 0; @@ -13358,15 +7130,16 @@ * Показать плейлист */ - function show$8() { - active$4(); + function show$a() { + if (!playlist$1.length) return; + active$5(); var enabled = Controller.enabled(); Select.show({ - title: Lang.translate('player_playlist'), + title: Lang$1.translate('player_playlist'), items: playlist$1, onSelect: function onSelect(a) { Controller.toggle(enabled.name); - listener$b.send('select', { + listener$i.send('select', { playlist: playlist$1, item: a, position: _position @@ -13382,7 +7155,7 @@ */ - function active$4() { + function active$5() { playlist$1.forEach(function (element) { element.selected = element.url == current; if (element.selected) _position = playlist$1.indexOf(element); @@ -13394,10 +7167,10 @@ function prev() { - active$4(); + active$5(); if (_position > 0) { - listener$b.send('select', { + listener$i.send('select', { playlist: playlist$1, position: _position - 1, item: playlist$1[_position - 1] @@ -13410,10 +7183,10 @@ function next() { - active$4(); + active$5(); if (_position < playlist$1.length - 1) { - listener$b.send('select', { + listener$i.send('select', { playlist: playlist$1, position: _position + 1, item: playlist$1[_position + 1] @@ -13427,7 +7200,7 @@ function canNext() { - active$4(); + active$5(); return _position < playlist$1.length - 1; } /** @@ -13436,12 +7209,12 @@ */ - function set$2(p) { + function set$4(p) { playlist$1 = p; playlist$1.forEach(function (l, i) { if (l.url == current) _position = i; }); - listener$b.send('set', { + listener$i.send('set', { playlist: playlist$1, position: _position }); @@ -13452,7 +7225,7 @@ */ - function get$8() { + function get$f() { return playlist$1; } /** @@ -13461,17 +7234,17 @@ */ - function url$4(u) { + function url$6(u) { current = u; } var PlayerPlaylist = { - listener: listener$b, - active: active$4, - show: show$8, - url: url$4, - get: get$8, - set: set$2, + listener: listener$i, + active: active$5, + show: show$a, + url: url$6, + get: get$f, + set: set$4, prev: prev, next: next, canNext: canNext, @@ -13480,8 +7253,66 @@ } }; - var html$e; - var listener$a = start$8(); + var listener$h = Subscribe$2(); + var segments = { + ad: [], + skip: [] + }; + + function update$f(time) { + var skip = get$e(time); + + if (skip && !skip.segment.viewed) { + skip.segment.viewed = true; + listener$h.send('skip', skip); + } + } + + function set$3(new_segments) { + if (Arrays.isObject(new_segments)) { + for (var i in new_segments) { + segments[i] = Arrays.isArray(new_segments[i]) ? Arrays.clone(new_segments[i]) : []; + } + } else { + segments.ad = []; + segments.skip = []; + } + + listener$h.send('set', segments); + } + + function get$e(time) { + var skip = false; + + for (var i in segments) { + if (segments[i]) { + for (var j = 0; j < segments[i].length; j++) { + var seg = segments[i][j]; + if (time >= seg.start && time <= seg.end) skip = { + type: i, + segment: seg + }; + } + } + } + + return skip; + } + + function all$4() { + return segments; + } + + var Segments = { + listener: listener$h, + update: update$f, + set: set$3, + get: get$e, + all: all$4 + }; + + var html$k; + var listener$g = Subscribe$2(); var state; var elems$1; var panel_visible = false; @@ -13490,7 +7321,7 @@ peding: 0 }; var condition = {}; - var timer$4 = {}; + var timer$7 = {}; var tracks = []; var subs = []; var flows = false; @@ -13499,39 +7330,40 @@ var last_settings_action; var last_panel_focus; - function init$I() { - html$e = Template.get('player_panel'); + function init$11() { + html$k = Template.get('player_panel'); elems$1 = { - peding: $('.player-panel__peding', html$e), - position: $('.player-panel__position', html$e), - time: $('.player-panel__time', html$e), - timenow: $('.player-panel__timenow', html$e), - timeend: $('.player-panel__timeend', html$e), - title: $('.player-panel__filename', html$e), - tracks: $('.player-panel__tracks', html$e), - subs: $('.player-panel__subs', html$e), - timeline: $('.player-panel__timeline', html$e), - quality: $('.player-panel__quality', html$e), - flow: $('.player-panel__flow', html$e), - episode: $('.player-panel__next-episode-name', html$e), - rewind_touch: $('.player-panel__time-touch-zone', html$e), - playlist: html$e.find('.player-panel__playlist'), - iptv_channel: $('.player-panel-iptv__channel', html$e), - iptv_arrow_up: $('.player-panel-iptv__arrow-up', html$e), - iptv_arrow_down: $('.player-panel-iptv__arrow-down', html$e), - iptv_position: $('.player-panel-iptv__position', html$e) + peding: $('.player-panel__peding', html$k), + position: $('.player-panel__position', html$k), + time: $('.player-panel__time', html$k), + timenow: $('.player-panel__timenow', html$k), + timeend: $('.player-panel__timeend', html$k), + title: $('.player-panel__filename', html$k), + tracks: $('.player-panel__tracks', html$k), + subs: $('.player-panel__subs', html$k), + timeline: $('.player-panel__timeline', html$k), + quality: $('.player-panel__quality', html$k), + flow: $('.player-panel__flow', html$k), + episode: $('.player-panel__next-episode-name', html$k), + rewind_touch: $('.player-panel__time-touch-zone', html$k), + playlist: html$k.find('.player-panel__playlist'), + iptv_channel: $('.player-panel-iptv__channel', html$k), + iptv_arrow_up: $('.player-panel-iptv__arrow-up', html$k), + iptv_arrow_down: $('.player-panel-iptv__arrow-down', html$k), + iptv_position: $('.player-panel-iptv__position', html$k), + segments: $('.player-panel__timeline-segments', html$k) }; /** * Отсеживаем состояние, * когда надо показать панель, а когда нет */ - state = new create$p({ + state = new StateMachine({ state: 'start', transitions: { start: function start() { - clearTimeout(timer$4.hide); - clearTimeout(timer$4.rewind); + clearTimeout(timer$7.hide); + clearTimeout(timer$7.rewind); this.dispath('canplay'); }, canplay: function canplay() { @@ -13543,12 +7375,12 @@ rewind: function rewind() { var _this = this; - clearTimeout(timer$4.rewind); + clearTimeout(timer$7.rewind); if (condition.rewind) { _visible(true); - timer$4.rewind = setTimeout(function () { + timer$7.rewind = setTimeout(function () { condition.rewind = false; _this.dispath('mousemove'); @@ -13565,8 +7397,8 @@ this.dispath('hide'); }, hide: function hide() { - clearTimeout(timer$4.hide); - timer$4.hide = setTimeout(function () { + clearTimeout(timer$7.hide); + timer$7.hide = setTimeout(function () { if (PlayerIPTV.playning()) { PlayerIPTV.reset(); Controller.toggle('player'); @@ -13578,44 +7410,44 @@ PlayerPlaylist.listener.follow('set', function (e) { elems$1.playlist.toggleClass('hide', Boolean(e.playlist.length == 0)); }); - html$e.find('.selector').on('hover:focus', function (e) { + html$k.find('.selector').on('hover:focus', function (e) { }); - html$e.find('.player-panel__playpause').on('hover:enter', function (e) { - listener$a.send('playpause', {}); + html$k.find('.player-panel__playpause').on('hover:enter', function (e) { + listener$g.send('playpause', {}); }); - html$e.find('.player-panel__next').on('hover:enter', function (e) { - listener$a.send('next', {}); + html$k.find('.player-panel__next').on('hover:enter', function (e) { + listener$g.send('next', {}); }); - html$e.find('.player-panel__prev').on('hover:enter', function (e) { - listener$a.send('prev', {}); + html$k.find('.player-panel__prev').on('hover:enter', function (e) { + listener$g.send('prev', {}); }); - html$e.find('.player-panel__rprev').on('hover:enter', function (e) { - listener$a.send('rprev', {}); + html$k.find('.player-panel__rprev').on('hover:enter', function (e) { + listener$g.send('rprev', {}); }); - html$e.find('.player-panel__rnext').on('hover:enter', function (e) { - listener$a.send('rnext', {}); + html$k.find('.player-panel__rnext').on('hover:enter', function (e) { + listener$g.send('rnext', {}); }); elems$1.playlist.on('hover:enter', function (e) { - listener$a.send('playlist', {}); + listener$g.send('playlist', {}); }); - html$e.find('.player-panel__tstart').on('hover:enter', function (e) { - listener$a.send('to_start', {}); + html$k.find('.player-panel__tstart').on('hover:enter', function (e) { + listener$g.send('to_start', {}); }); - html$e.find('.player-panel__tend').on('hover:enter', function (e) { - listener$a.send('to_end', {}); + html$k.find('.player-panel__tend').on('hover:enter', function (e) { + listener$g.send('to_end', {}); }); - html$e.find('.player-panel__fullscreen').on('hover:enter', function (e) { - listener$a.send('fullscreen', {}); + html$k.find('.player-panel__fullscreen').on('hover:enter', function (e) { + listener$g.send('fullscreen', {}); }); - html$e.find('.player-panel__settings').on('hover:enter', settings); - html$e.find('.player-panel__pip,.player-panel__volume').toggleClass('hide', !Boolean(Platform.is('nw') || Platform.is('browser') || Platform.is('apple') && !Utils$2.isPWA())); - html$e.find('.player-panel__pip').on('hover:enter', function () { - listener$a.send('pip', {}); + html$k.find('.player-panel__settings').on('hover:enter', settings); + html$k.find('.player-panel__pip,.player-panel__volume').toggleClass('hide', !Boolean(Platform.is('nw') || Platform.is('browser') || Platform.is('apple') && !Utils$1.isPWA())); + html$k.find('.player-panel__pip').on('hover:enter', function () { + listener$g.send('pip', {}); }); elems$1.timeline.attr('data-controller', 'player_rewind'); elems$1.rewind_touch.toggleClass('hide', !Platform.screen('mobile')); elems$1.timeline.on('mousemove', function (e) { - if (!Platform.screen('mobile')) listener$a.send('mouse_rewind', { + if (!Platform.screen('mobile')) listener$g.send('mouse_rewind', { method: 'move', time: elems$1.time, percent: percent(e) @@ -13623,16 +7455,16 @@ }).on('mouseout', function () { if (!Platform.screen('mobile')) elems$1.time.addClass('hide'); }).on('click', function (e) { - if (DeviceInput.canClick(e.originalEvent) && !Platform.screen('mobile')) listener$a.send('mouse_rewind', { + if (DeviceInput.canClick(e.originalEvent) && !Platform.screen('mobile')) listener$g.send('mouse_rewind', { method: 'click', time: elems$1.time, percent: percent(e) }); }); - if (!html$e.find('.player-panel__volume').hasClass('hide')) { - html$e.find('.player-panel__volume-range').val(Storage.get('player_volume', '1')).on('input', function () { - listener$a.send('change_volume', { + if (!html$k.find('.player-panel__volume').hasClass('hide')) { + html$k.find('.player-panel__volume-range').val(Storage.get('player_volume', '1')).on('input', function () { + listener$g.send('change_volume', { volume: $(this).val() }); PlayerVideo.changeVolume($(this).val()); @@ -13644,7 +7476,7 @@ var touchEnd = function touchEnd(e) { window.removeEventListener('touchend', touchEnd); PlayerVideo.video().rewind = false; - listener$a.send('mouse_rewind', { + listener$g.send('mouse_rewind', { method: 'click', time: elems$1.time, percent: touch.to / 100 @@ -13674,8 +7506,8 @@ rewind$1(); } }); - html$e.find('.player-panel__line:eq(1) .selector').attr('data-controller', 'player_panel'); - html$e.find('.player-panel__left .selector,.player-panel__center .selector,.player-panel__right .selector').on('hover:focus', function () { + html$k.find('.player-panel__line:eq(1) .selector').attr('data-controller', 'player_panel'); + html$k.find('.player-panel__left .selector,.player-panel__center .selector,.player-panel__right .selector').on('hover:focus', function () { last_panel_focus = $(this)[0]; }); /** @@ -13686,7 +7518,7 @@ if (flows) { var enabled = Controller.enabled().name; Select.show({ - title: Lang.translate('player_flow'), + title: Lang$1.translate('player_flow'), items: flows, onSelect: function onSelect(a) { flows.forEach(function (element) { @@ -13696,7 +7528,7 @@ a.enabled = true; a.selected = true; Controller.toggle(enabled); - listener$a.send('flow', { + listener$g.send('flow', { url: a.url }); }, @@ -13726,7 +7558,7 @@ quality: i, title: i + (lb ? '' + lb + '' : ''), url: qu, - selected: nw == Utils$2.qualityToText(i), + selected: nw == Utils$1.qualityToText(i), call: _typeof(qa) == 'object' ? qa.call : false, instance: qa }); @@ -13736,31 +7568,31 @@ if (!qs.length) return; var enabled = Controller.enabled().name; Select.show({ - title: Lang.translate('player_quality'), + title: Lang$1.translate('player_quality'), items: qs, onSelect: function onSelect(a) { if (a.call) { Controller.toggle(enabled); a.call(a.instance, function (url) { - elems$1.quality.text(Utils$2.qualityToText(a.quality)); + elems$1.quality.text(Utils$1.qualityToText(a.quality)); qs.forEach(function (q) { return q.selected = false; }); a.selected = true; - listener$a.send('quality', { + listener$g.send('quality', { name: a.quality, url: url }); if (a.instance && a.instance.trigger) a.instance.trigger(); }); } else { - elems$1.quality.text(Utils$2.qualityToText(a.quality)); + elems$1.quality.text(Utils$1.qualityToText(a.quality)); qs.forEach(function (q) { return q.selected = false; }); a.enabled = true; a.selected = true; - if (!Arrays.isArray(qualitys) || a.change_quality) listener$a.send('quality', { + if (!Arrays.isArray(qualitys) || a.change_quality) listener$g.send('quality', { name: a.quality, url: a.url }); @@ -13784,7 +7616,7 @@ var name = []; var from = translates.tracks && Arrays.isArray(translates.tracks) && translates.tracks[p] ? translates.tracks[p] : element; name.push(p + 1); - name.push(normalName(from.language || from.name || Lang.translate('player_unknown'))); + name.push(normalName(from.language || from.name || Lang$1.translate('player_unknown'))); if (from.label) name.push(normalName(from.label)); if (from.extra) { @@ -13796,7 +7628,7 @@ }); var enabled = Controller.enabled().name; Select.show({ - title: Lang.translate('player_tracks'), + title: Lang$1.translate('player_tracks'), items: tracks, onSelect: function onSelect(a) { tracks.forEach(function (element) { @@ -13825,7 +7657,7 @@ return s.selected; }); Arrays.insert(subs, 0, { - title: Lang.translate('player_disabled'), + title: Lang$1.translate('player_disabled'), selected: any_select ? false : true, index: -1 }); @@ -13835,12 +7667,12 @@ if (element.index !== -1) { var track_num = element.extra && element.extra.track_num ? parseInt(element.extra.track_num) : element.index; var from = translates.subs && Arrays.isArray(translates.subs) && translates.subs[track_num] ? translates.subs[track_num] : element; - element.title = p + ' / ' + normalName(from.language && from.label ? from.language + ' / ' + from.label : from.language || from.label || Lang.translate('player_unknown')); + element.title = p + ' / ' + normalName(from.language && from.label ? from.language + ' / ' + from.label : from.language || from.label || Lang$1.translate('player_unknown')); } }); var enabled = Controller.enabled().name; Select.show({ - title: Lang.translate('player_subs'), + title: Lang$1.translate('player_subs'), items: subs, onSelect: function onSelect(a) { subs.forEach(function (element) { @@ -13849,7 +7681,7 @@ }); a.mode = 'showing'; a.selected = true; - listener$a.send('subsview', { + listener$g.send('subsview', { status: a.index > -1 }); Controller.toggle(enabled); @@ -13864,45 +7696,66 @@ PlayerIPTV.listener.follow('channel', channel); PlayerIPTV.listener.follow('draw-program', program); Footer.listener.follow('open', function () { - html$e.addClass('panel--footer-open'); + html$k.addClass('panel--footer-open'); }); Footer.listener.follow('close', function () { - html$e.removeClass('panel--footer-open'); + html$k.removeClass('panel--footer-open'); Controller.toggle('player_panel'); }); + PlayerVideo.listener.follow('loadeddata', drawSegments); + } + + function drawSegments() { + var segments = Segments.all(); + var timeline = elems$1.segments.empty(); + + for (var name in segments) { + for (var a = 0; a < segments[name].length; a++) { + var seg = segments[name][a]; + var seg_elem = $("
")); + var duration = PlayerVideo.video().duration || 0; + var start = seg.start / duration * 100; + var length = (seg.end - seg.start) / duration * 100; + seg_elem.css({ + left: duration ? start + '%' : 0, + width: duration ? length + '%' : 0 + }); + timeline.append(seg_elem); + } + } } function hideRewind() { - html$e.addClass('panel--norewind'); + html$k.addClass('panel--norewind'); } function showParams() { var enabled = Controller.enabled().name; var items = []; items.push({ - title: Lang.translate('player_tracks'), + title: Lang$1.translate('player_tracks'), trigger: elems$1.tracks, ghost: elems$1.tracks.hasClass('hide'), noenter: elems$1.tracks.hasClass('hide') }); items.push({ - title: Lang.translate('player_subs'), + title: Lang$1.translate('player_subs'), trigger: elems$1.subs, ghost: elems$1.subs.hasClass('hide'), noenter: elems$1.subs.hasClass('hide') }); items.push({ - title: Lang.translate('player_quality'), + title: Lang$1.translate('player_quality'), trigger: elems$1.quality, ghost: !qualitys, noenter: !qualitys }); items.push({ - title: Lang.translate('settings_main_rest'), - trigger: html$e.find('.player-panel__settings') + title: Lang$1.translate('settings_main_rest'), + trigger: html$k.find('.player-panel__settings') }); Select.show({ - title: Lang.translate('title_settings'), + title: Lang$1.translate('title_settings'), items: items, onSelect: function onSelect(a) { Controller.toggle(enabled); @@ -13933,7 +7786,7 @@ elems$1.iptv_channel.removeClass('up down'); var active = elems$1.iptv_channel.find('.active'); elems$1.iptv_channel.find('> div:not(.active)').remove(); - var new_item = $("\n
\n
\n \n
\n
\n
".concat(select.group, "
\n
").concat(select.name, "
\n
\n
").concat(Lang.translate('loading'), "...
\n
\n
\n
\n ")); + var new_item = $("\n
\n
\n \n
\n
\n
".concat(select.group, "
\n
").concat(select.name, "
\n
\n
").concat(Lang$1.translate('loading'), "...
\n
\n
\n
\n ")); if (select.icons) { select.icons.forEach(function (ic) { @@ -13977,37 +7830,44 @@ function settings() { var speed = Storage.get('player_speed', 'default'); var items = [{ - title: Lang.translate('player_video_size'), - subtitle: Lang.translate('player_size_' + Storage.get('player_size', 'default') + '_title'), + title: Lang$1.translate('player_video_size'), + subtitle: Lang$1.translate('player_size_' + Storage.get('player_size', 'default') + '_title'), method: 'size' }, { - title: Lang.translate('player_video_speed'), - subtitle: speed == 'default' ? Lang.translate('player_speed_default_title') : speed, + title: Lang$1.translate('player_video_speed'), + subtitle: speed == 'default' ? Lang$1.translate('player_speed_default_title') : speed, method: 'speed' }, { - title: Lang.translate('player_share_title'), - subtitle: Lang.translate('player_share_descr'), + title: Lang$1.translate('player_share_title'), + subtitle: Lang$1.translate('player_share_descr'), method: 'share' + }, { + title: Lang$1.translate('player_segments_title'), + subtitle: Lang$1.translate('player_segments_descr'), + method: 'segments' + }, { + title: Lang$1.translate('settings_player_subs'), + method: 'subs' }]; if (Storage.field('player_normalization')) { items.push({ - title: Lang.translate('player_normalization'), + title: Lang$1.translate('player_normalization'), separator: true }); items.push({ - title: Lang.translate('player_normalization_power_title'), - subtitle: Lang.translate('player_normalization_step_' + Storage.get('player_normalization_power', 'hight')), + title: Lang$1.translate('player_normalization_power_title'), + subtitle: Lang$1.translate('player_normalization_step_' + Storage.get('player_normalization_power', 'hight')), method: 'normalization_power' }); items.push({ - title: Lang.translate('player_normalization_smooth_title'), - subtitle: Lang.translate('player_normalization_step_' + Storage.get('player_normalization_smooth', 'medium')), + title: Lang$1.translate('player_normalization_smooth_title'), + subtitle: Lang$1.translate('player_normalization_step_' + Storage.get('player_normalization_smooth', 'medium')), method: 'normalization_smooth' }); items.push({ - title: Lang.translate('player_normalization_type_title'), - subtitle: Lang.translate('player_normalization_type_' + Storage.get('player_normalization_type', 'all')), + title: Lang$1.translate('player_normalization_type_title'), + subtitle: Lang$1.translate('player_normalization_type_' + Storage.get('player_normalization_type', 'all')), method: 'normalization_type' }); } @@ -14019,7 +7879,7 @@ } Select.show({ - title: Lang.translate('title_settings'), + title: Lang$1.translate('title_settings'), items: items, nomark: true, onSelect: function onSelect(a) { @@ -14029,10 +7889,12 @@ if (a.method == 'normalization_power') selectNormalizationStep('power', 'hight'); if (a.method == 'normalization_smooth') selectNormalizationStep('smooth', 'medium'); if (a.method == 'normalization_type') selectNormalizationType(); + if (a.method == 'segments') selectSegments(); + if (a.method == 'subs') selectSubs(); if (a.method == 'share') { Controller.toggle(Platform.screen('mobile') ? 'player' : 'player_panel'); - listener$a.send('share', {}); + listener$g.send('share', {}); } }, onBack: function onBack() { @@ -14041,23 +7903,143 @@ }); } + function selectSubs() { + var items = [{ + title: Lang$1.translate('settings_player_subs_size'), + subtitle: Lang$1.translate('settings_player_subs_size_descr'), + name: 'subtitles_size' + }, { + title: Lang$1.translate('settings_player_subs_stroke_use'), + subtitle: Lang$1.translate('settings_player_subs_stroke_use_descr'), + name: 'subtitles_stroke' + }, { + title: Lang$1.translate('settings_player_subs_backdrop_use'), + subtitle: Lang$1.translate('settings_player_subs_backdrop_use_descr'), + name: 'subtitles_backdrop' + }, { + title: Lang$1.translate('settings_rest_time'), + name: 'player_subs_shift_time' + }]; + Select.show({ + title: Lang$1.translate('settings_player_subs'), + items: items, + nohide: true, + onBack: settings, + onSelect: function onSelect(a) { + var subitems = []; + + if (a.name == 'subtitles_size') { + subitems = [{ + title: Lang$1.translate('settings_param_subtitles_size_small'), + value: 'small' + }, { + title: Lang$1.translate('settings_param_subtitles_size_normal'), + value: 'normal' + }, { + title: Lang$1.translate('settings_param_subtitles_size_bigger'), + value: 'large' + }]; + } + + if (a.name == 'subtitles_stroke' || a.name == 'subtitles_backdrop') { + subitems = [{ + title: Lang$1.translate('settings_param_yes'), + value: 'true' + }, { + title: Lang$1.translate('settings_param_no'), + value: 'false' + }]; + } + + if (a.name == 'player_subs_shift_time') { + subitems = [-120, -90, -60, -30, -10, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 10, 30, 60, 90, 120]; + subitems = subitems.map(function (i) { + return { + title: (i > 0 ? '+' : '') + i + ' sec.', + value: i, + selected: Storage.get('player_subs_shift_time', '0') == i + }; + }); + } else { + subitems.forEach(function (i) { + i.selected = Storage.field(a.name) + '' == i.value; + }); + } + + Select.show({ + title: a.title, + items: subitems, + nohide: true, + onBack: selectSubs, + onSelect: function onSelect(b) { + Storage.set(a.name, b.value); + PlayerVideo.applySubsSettings(); + selectSubs(); + } + }); + } + }); + } + + function selectSegments() { + var items = [{ + title: Lang$1.translate('player_segments_ad_title'), + name: 'ad', + subtitle: Lang$1.translate('player_segments_value_' + Storage.get('player_segments_ad', 'auto')) + }, { + title: Lang$1.translate('player_segments_skip_title'), + name: 'skip', + subtitle: Lang$1.translate('player_segments_value_' + Storage.get('player_segments_skip', 'auto')) + }]; + Select.show({ + title: Lang$1.translate('player_segments_title'), + items: items, + nohide: true, + onBack: settings, + onSelect: function onSelect(a) { + Select.show({ + title: a.title, + items: [{ + title: Lang$1.translate('player_segments_value_auto'), + value: 'auto', + selected: Storage.get('player_segments_' + a.name, 'auto') == 'auto' + }, { + title: Lang$1.translate('player_segments_value_user'), + value: 'user', + selected: Storage.get('player_segments_' + a.name, 'auto') == 'user' + }, { + title: Lang$1.translate('player_segments_value_none'), + value: 'none', + selected: Storage.get('player_segments_' + a.name, 'auto') == 'none' + }], + nohide: true, + onBack: selectSegments, + onSelect: function onSelect(b) { + Storage.set('player_segments_' + a.name, b.value); + selectSegments(); + } + }); + } + }); + } + function selectNormalizationType() { var select = Storage.get('player_normalization_type', 'all'); var items = [{ - title: Lang.translate('player_normalization_type_all'), + title: Lang$1.translate('player_normalization_type_all'), value: 'all', selected: select == 'all' }, { - title: Lang.translate('player_normalization_type_up'), + title: Lang$1.translate('player_normalization_type_up'), value: 'up', selected: select == 'up' }, { - title: Lang.translate('player_normalization_type_down'), + title: Lang$1.translate('player_normalization_type_down'), value: 'down', selected: select == 'down' }]; Select.show({ - title: Lang.translate('player_normalization_type_title'), + title: Lang$1.translate('player_normalization_type_title'), items: items, nohide: true, onBack: settings, @@ -14071,24 +8053,24 @@ function selectNormalizationStep(type, def) { var select = Storage.get('player_normalization_' + type, def); var items = [{ - title: Lang.translate('player_normalization_step_none'), + title: Lang$1.translate('player_normalization_step_none'), value: 'none', selected: select == 'none' }, { - title: Lang.translate('player_normalization_step_low'), + title: Lang$1.translate('player_normalization_step_low'), value: 'low', selected: select == 'low' }, { - title: Lang.translate('player_normalization_step_medium'), + title: Lang$1.translate('player_normalization_step_medium'), value: 'medium', selected: select == 'medium' }, { - title: Lang.translate('player_normalization_step_hight'), + title: Lang$1.translate('player_normalization_step_hight'), value: 'hight', selected: select == 'hight' }]; Select.show({ - title: Lang.translate('player_normalization_' + type + '_title'), + title: Lang$1.translate('player_normalization_' + type + '_title'), items: items, nohide: true, onBack: settings, @@ -14106,13 +8088,13 @@ function selectSize() { var select = Storage.get('player_size', 'default'); var items = [{ - title: Lang.translate('player_size_default_title'), - subtitle: Lang.translate('player_size_default_descr'), + title: Lang$1.translate('player_size_default_title'), + subtitle: Lang$1.translate('player_size_default_descr'), value: 'default', selected: select == 'default' }, { - title: Lang.translate('player_size_cover_title'), - subtitle: Lang.translate('player_size_cover_descr'), + title: Lang$1.translate('player_size_cover_title'), + subtitle: Lang$1.translate('player_size_cover_descr'), value: 'cover', selected: select == 'cover' }]; @@ -14123,28 +8105,28 @@ if (!(Platform.is('tizen') && Storage.field('player') == 'tizen')) { items = items.concat([{ - title: Lang.translate('player_size_fill_title'), - subtitle: Lang.translate('player_size_fill_descr'), + title: Lang$1.translate('player_size_fill_title'), + subtitle: Lang$1.translate('player_size_fill_descr'), value: 'fill', selected: select == 'fill' }, { - title: Lang.translate('player_size_s115_title'), - subtitle: Lang.translate('player_size_s115_descr'), + title: Lang$1.translate('player_size_s115_title'), + subtitle: Lang$1.translate('player_size_s115_descr'), value: 's115', selected: select == 's115' }, { - title: Lang.translate('player_size_s130_title'), - subtitle: Lang.translate('player_size_s130_descr'), + title: Lang$1.translate('player_size_s130_title'), + subtitle: Lang$1.translate('player_size_s130_descr'), value: 's130', selected: select == 's130' }, { - title: Lang.translate('player_size_v115_title'), - subtitle: Lang.translate('player_size_v115_descr'), + title: Lang$1.translate('player_size_v115_title'), + subtitle: Lang$1.translate('player_size_v115_descr'), value: 'v115', selected: select == 'v115' }, { - title: Lang.translate('player_size_v130_title'), - subtitle: Lang.translate('player_size_v130_descr'), + title: Lang$1.translate('player_size_v130_title'), + subtitle: Lang$1.translate('player_size_v130_descr'), value: 'v130', selected: select == 'v130' }]); @@ -14155,11 +8137,11 @@ } Select.show({ - title: Lang.translate('player_video_size'), + title: Lang$1.translate('player_video_size'), items: items, nohide: true, onSelect: function onSelect(a) { - listener$a.send('size', { + listener$g.send('size', { size: a.value }); }, @@ -14179,7 +8161,7 @@ title: '0.75', value: '0.75' }, { - title: Lang.translate('player_speed_default_title'), + title: Lang$1.translate('player_speed_default_title'), value: 'default' }, { title: '1.25', @@ -14197,12 +8179,12 @@ if (Platform.is('tizen') && Storage.field('player') == 'tizen' || Platform.is('orsay') && Storage.field('player') == 'orsay') { items = [{ - title: Lang.translate('player_speed_default_title'), + title: Lang$1.translate('player_speed_default_title'), value: 'default', selected: select == 'default' }, { title: '2', - subtitle: Platform.is('orsay') && Storage.field('player') == 'orsay' ? Lang.translate('player_speed_two_descr') : '', + subtitle: Platform.is('orsay') && Storage.field('player') == 'orsay' ? Lang$1.translate('player_speed_two_descr') : '', value: '2' }]; } @@ -14221,12 +8203,12 @@ } Select.show({ - title: Lang.translate('player_video_speed'), + title: Lang$1.translate('player_video_speed'), items: items, nohide: true, onSelect: function onSelect(a) { Storage.set('player_speed', a.value); - listener$a.send('speed', { + listener$g.send('speed', { speed: a.value }); settings(); @@ -14280,13 +8262,13 @@ back: function back() { PlayerIPTV.reset(); Controller.toggle('player'); - hide$1(); + hide$2(); } }); Controller.add('player_rewind', { toggle: function toggle() { - Controller.collectionSet(render$a()); - Controller.collectionFocus(false, render$a()); + Controller.collectionSet(render$f()); + Controller.collectionFocus(false, render$f()); }, up: function up() { Controller.toggle('player'); @@ -14295,28 +8277,28 @@ toggleButtons(); }, right: function right() { - listener$a.send('rnext', {}); + listener$g.send('rnext', {}); }, left: function left() { - listener$a.send('rprev', {}); + listener$g.send('rprev', {}); }, gone: function gone() { - html$e.find('.selector').removeClass('focus'); + html$k.find('.selector').removeClass('focus'); }, back: function back() { Controller.toggle('player'); - hide$1(); + hide$2(); } }); Controller.add('player_panel', { toggle: function toggle() { if (PlayerIPTV.playning()) Controller.toggle('player_tv');else { - Controller.collectionSet(render$a()); - Controller.collectionFocus(last_panel_focus ? last_panel_focus : $(isTV() ? '.player-panel__next' : '.player-panel__playpause', html$e)[0], render$a()); + Controller.collectionSet(render$f()); + Controller.collectionFocus(last_panel_focus ? last_panel_focus : $(isTV() ? '.player-panel__next' : '.player-panel__playpause', html$k)[0], render$f()); } }, up: function up() { - isTV() || html$e.hasClass('panel--norewind') ? Controller.toggle('player') : toggleRewind(); + isTV() || html$k.hasClass('panel--norewind') ? Controller.toggle('player') : toggleRewind(); }, right: function right() { Navigator.move('right'); @@ -14325,14 +8307,14 @@ Navigator.move('left'); }, down: function down() { - Footer.available() ? Controller.toggle('player_footer') : listener$a.send('playlist', {}); + Footer.available() ? Controller.toggle('player_footer') : listener$g.send('playlist', {}); }, gone: function gone() { - html$e.find('.selector').removeClass('focus'); + html$k.find('.selector').removeClass('focus'); }, back: function back() { Controller.toggle('player'); - hide$1(); + hide$2(); } }); } @@ -14355,7 +8337,7 @@ */ - function update$5(need, value) { + function update$e(need, value) { if (need == 'position') { timeline_last.position = value; if (panel_visible) elems$1.position.css({ @@ -14379,11 +8361,11 @@ } if (need == 'play') { - html$e.toggleClass('panel--paused', false); + html$k.toggleClass('panel--paused', false); } if (need == 'pause') { - html$e.toggleClass('panel--paused', true); + html$k.toggleClass('panel--paused', true); } } /** @@ -14393,10 +8375,10 @@ function _visible(status) { - listener$a.send('visible', { + listener$g.send('visible', { status: status }); - html$e.toggleClass('panel--visible', status); + html$k.toggleClass('panel--visible', status); panel_visible = status; elems$1.position.css({ width: timeline_last.position @@ -14429,7 +8411,7 @@ function toggleRewind() { - Controller.toggle(isTV() || html$e.hasClass('panel--norewind') ? 'player_panel' : 'player_rewind'); + Controller.toggle(isTV() || html$k.hasClass('panel--norewind') ? 'player_panel' : 'player_rewind'); } /** * Переключить на контроллер кнопки @@ -14444,7 +8426,7 @@ */ - function toggle$6() { + function toggle$a() { condition.visible = true; state.start(); if (PlayerIPTV.playning()) Controller.toggle('player_tv');else if (!Platform.screen('mobile')) toggleRewind(); @@ -14454,9 +8436,9 @@ */ - function show$7() { + function show$9() { state.start(); - html$e.find('.player-panel__fullscreen').toggleClass('hide', Platform.tv() || Platform.is('android') || !Utils$2.canFullScreen()); + html$k.find('.player-panel__fullscreen').toggleClass('hide', Platform.tv() || Platform.is('android') || !Utils$1.canFullScreen()); addController(); } /** @@ -14473,14 +8455,14 @@ */ - function hide$1() { + function hide$2() { condition.visible = false; _visible(false); } function visibleStatus() { - return html$e.hasClass('panel--visible'); + return html$k.hasClass('panel--visible'); } /** * Установить субтитры @@ -14512,7 +8494,7 @@ function setLevels(levels, current) { if (qualitys && Object.keys(qualitys).length) return; qualitys = levels; - elems$1.quality.text(Utils$2.qualityToText(current)); + elems$1.quality.text(Utils$1.qualityToText(current)); } /** * Показать текущие качество и записать в переменную для показа в панели @@ -14531,7 +8513,7 @@ var qu = _typeof(qa) == 'object' ? qa.url : typeof qa == 'string' ? qa : ''; if (qu == url) { - elems$1.quality.text(Utils$2.qualityToText(i)); + elems$1.quality.text(Utils$1.qualityToText(i)); break; } } @@ -14571,7 +8553,7 @@ */ - function destroy$7() { + function destroy$8() { condition = {}; tracks = []; subs = []; @@ -14597,8 +8579,9 @@ elems$1.episode.toggleClass('hide', true); elems$1.playlist.toggleClass('hide', true); elems$1.flow.toggleClass('hide', true); - html$e.toggleClass('panel--paused', false); - html$e.toggleClass('panel--norewind', false); + html$k.toggleClass('panel--paused', false); + html$k.toggleClass('panel--norewind', false); + elems$1.segments.empty(); } /** * Получить html @@ -14606,20 +8589,20 @@ */ - function render$a() { - return html$e; + function render$f() { + return html$k; } var PlayerPanel = { - init: init$I, - listener: listener$a, - render: render$a, - toggle: toggle$6, - show: show$7, - destroy: destroy$7, - hide: hide$1, + init: init$11, + listener: listener$g, + render: render$f, + toggle: toggle$a, + show: show$9, + destroy: destroy$8, + hide: hide$2, canplay: canplay, - update: update$5, + update: update$e, rewind: rewind$1, setTracks: setTracks, setSubs: setSubs, @@ -14638,7 +8621,7 @@ var subparams; - var listener$9 = function listener(e) { + var listener$f = function listener(e) { if (e.code == 405) getWebosmediaId(setSubtitleColor); if (e.code == 406) getWebosmediaId(setSubtitleBackgroundColor); if (e.code == 403) getWebosmediaId(setSubtitleFontSize); @@ -14647,7 +8630,7 @@ if (e.code == 57) getWebosmediaId(setSubtitleCharacterOpacity); }; - Keypad.listener.follow('keydown', listener$9); + Keypad.listener.follow('keydown', listener$f); function luna$1(params, call, fail) { if (call) params.onSuccess = call; @@ -14795,7 +8778,7 @@ webOS.service.request("luna://com.webos.media", params); } - function create$h(_video) { + function create$9(_video) { var video = _video; var media_id; var subtitle_visible = false; @@ -14875,7 +8858,7 @@ }; add({ - title: Lang.translate('player_disabled'), + title: Lang$1.translate('player_disabled'), selected: true }, -1); @@ -15132,7 +9115,7 @@ * Parses captions in WebVTT format (Web Video Text Tracks Format) ******************************************************************************************/ - function parse$b(content, options) { + function parse$c(content, options) { var index = 1; var captions = []; var eol = options.eol || "\r\n"; @@ -15251,7 +9234,7 @@ name: FORMAT_NAME$7, helper: helper$5, detect: detect$8, - parse: parse$b, + parse: parse$c, build: build$9 }; @@ -15277,7 +9260,7 @@ * Parses captions in LRC format: https://en.wikipedia.org/wiki/LRC_%28file_format%29 ******************************************************************************************/ - function parse$a(content, options) { + function parse$b(content, options) { var prev = null; var captions = []; options.eol || "\r\n"; @@ -15395,7 +9378,7 @@ name: FORMAT_NAME$6, helper: helper$4, detect: detect$7, - parse: parse$a, + parse: parse$b, build: build$8 }; @@ -15413,7 +9396,7 @@ * Parses captions in SAMI format (.smi) ******************************************************************************************/ - function parse$9(content, options) { + function parse$a(content, options) { var captions = []; var eol = options.eol || "\r\n"; var title = /\]*\>([\s\S]*)\<\/TITLE\>/gi.exec(content); @@ -15583,7 +9566,7 @@ name: FORMAT_NAME$5, helper: helper$3, detect: detect$6, - parse: parse$9, + parse: parse$a, build: build$7 }; @@ -15612,7 +9595,7 @@ * Parses captions in SubStation Alpha format (.ssa) ******************************************************************************************/ - function parse$8(content, options) { + function parse$9(content, options) { var meta; var columns = null; var captions = []; @@ -15798,7 +9781,7 @@ name: FORMAT_NAME$4, helper: helper$2, detect: detect$5, - parse: parse$8, + parse: parse$9, build: build$6 }; @@ -15816,7 +9799,7 @@ * Parses captions in MicroDVD format: https://en.wikipedia.org/wiki/MicroDVD ******************************************************************************************/ - function parse$7(content, options) { + function parse$8(content, options) { var fps = options.fps > 0 ? options.fps : DEFAULT_FPS; var captions = []; var eol = options.eol || "\r\n"; @@ -15901,7 +9884,7 @@ var subFormatter = { name: FORMAT_NAME$3, detect: detect$4, - parse: parse$7, + parse: parse$8, build: build$5 }; @@ -15929,7 +9912,7 @@ * Parses captions in SubRip format (.srt) ******************************************************************************************/ - function parse$6(content, options) { + function parse$7(content, options) { var captions = []; var eol = options.eol || "\r\n"; var parts = content.split(/\r?\n\s+\r?\n/g); @@ -16012,7 +9995,7 @@ name: FORMAT_NAME$2, helper: helper$1, detect: detect$3, - parse: parse$6, + parse: parse$7, build: build$4 }; @@ -16040,7 +10023,7 @@ * Parses captions in SubViewer format (.sbv) ******************************************************************************************/ - function parse$5(content, options) { + function parse$6(content, options) { var captions = []; var eol = options.eol || "\r\n"; var parts = content.split(/\r?\n\s+\r?\n/); @@ -16120,7 +10103,7 @@ name: FORMAT_NAME$1, helper: helper, detect: detect$2, - parse: parse$5, + parse: parse$6, build: build$3 }; @@ -16129,7 +10112,7 @@ * Parses captions in JSON format ******************************************************************************************/ - function parse$4(content, options) { + function parse$5(content, options) { return JSON.parse(content); } /****************************************************************************************** @@ -16163,7 +10146,7 @@ var jsonFormatter = { name: FORMAT_NAME, detect: detect$1, - parse: parse$4, + parse: parse$5, build: build$2 }; @@ -16187,7 +10170,7 @@ ******************************************************************************************/ - function list$3() { + function list$5() { return Object.keys(supportedFormats); } /****************************************************************************************** @@ -16229,7 +10212,7 @@ ******************************************************************************************/ - function parse$3(content, options) { + function parse$4(content, options) { options = options || {}; var format = options.format || detect(content); @@ -16298,7 +10281,7 @@ opt.format = opt.from; } - var captions = parse$3(content, opt); + var captions = parse$4(content, opt); if (opt.resync) { captions = resync(captions, opt.resync); @@ -16368,9 +10351,9 @@ } var subsrt = { - list: list$3, + list: list$5, detect: detect, - parse: parse$3, + parse: parse$4, build: build$1, convert: convert, resync: resync @@ -16403,7 +10386,7 @@ */ - function parse$2(data, ms) { + function parse$3(data, ms) { var type = subsrt.detect(data); if (type === 'vtt') return parseVTT(data, ms); if (type !== undefined && type !== 'srt') return parseVTT(convertToVTT(data), ms);else return parseSRT(data, ms); @@ -16479,8 +10462,8 @@ function CustomSubs() { var parsed; - var network = new create$e(); - this.listener = start$8(); + var network = new Request(); + this.listener = Subscribe$2(); /** * Загрузить * @param {string} url @@ -16489,7 +10472,7 @@ this.load = function (url) { network.silent(url, function (data) { if (data) { - parsed = parse$2(data, true); + parsed = parse$3(data, true); } }, false, false, { dataType: 'text' @@ -16503,6 +10486,7 @@ this.update = function (time_sec) { var time_ms = time_sec * 1000; + time_ms -= parseInt(Storage.get('player_subs_shift_time', '0')) * 1000; if (parsed) { var text = ''; @@ -16678,7 +10662,7 @@ var avplay, plugin, stream_url, loaded, current_time; var object = $(''); var video = object[0]; - var listener = start$8(); + var listener = Subscribe$2(); var change_scale_later; var change_speed_later; var canGetVideoResolution = false; @@ -17347,9 +11331,9 @@ var stream_url, loaded; var needclick = true; //Platform.screen('mobile') || navigator.userAgent.toLowerCase().indexOf("android") >= 0 - var object = $('
' + Lang.translate('player_youtube_no_played') + '
'); + var object = $('
' + Lang$1.translate('player_youtube_no_played') + '
'); var video = object[0]; - var listener = start$8(); + var listener = Subscribe$2(); var volume = 100; var youtube; var timeupdate; @@ -17526,16 +11510,16 @@ video.resize(); var nosuport = function nosuport() { - object.append('
' + Lang.translate('torrent_error_connect') + '
'); + object.append('
' + Lang$1.translate('torrent_error_connect') + '
'); }; if (typeof YT == 'undefined') return nosuport(); if (typeof YT.Player == 'undefined') return nosuport(); if (needclick) { - object.append('
' + Lang.translate('loading') + '...' + '
'); + object.append('
' + Lang$1.translate('loading') + '...' + '
'); timetapplay = setTimeout(function () { - object.find('.player-video__youtube-needclick div').text(Lang.translate('player_youtube_start_play')); + object.find('.player-video__youtube-needclick div').text(Lang$1.translate('player_youtube_start_play')); PlayerPanel.update('pause'); }, 10000); } @@ -17572,7 +11556,7 @@ }, onStateChange: function onStateChange(state) { object.removeClass('ended'); - if (needclick) object.find('.player-video__youtube-needclick div').text(Lang.translate('loading') + '...'); + if (needclick) object.find('.player-video__youtube-needclick div').text(Lang$1.translate('loading') + '...'); if (state.data == YT.PlayerState.PLAYING) { listener.send('playing'); @@ -17664,173 +11648,72 @@ return object; } - function init$H() { - var tmdb_proxy = { - name: 'TMDB Proxy', - version: '1.0.3', - description: 'Проксирование постеров и API сайта TMDB', - path_image: Account.hasPremium() ? 'imagetmdb.' + object$2.cub_domain + '/' : 'imagetmdb.com/', - path_api: 'apitmdb.' + object$2.cub_domain + '/3/' - }; + var bell; + var items$1 = []; - function filter(u) { - var s = u.slice(0, 8); - var e = u.slice(8).replace(/\/+/g, '/'); - return s + e; - } + function Item$1(params) { + var _this = this; - function email() { - return Storage.get('account', '{}').email || ''; - } - - function check() { - console.log('TMDB-Proxy', 'start check'); - $.ajax({ - url: TMDB$1.api('discover/movie?with_genres=14&api_key=' + TMDB$1.key() + '&language=ru-RU'), - dataType: 'json', - timeout: 6000, - error: function error() { - console.log('TMDB-Proxy', 'api error', tmdb_proxy.path_api + ' not responding, using backup proxy'); - - if (Utils$2.protocol() == 'https://' || Storage.field('protocol') == 'https') { - console.log('TMDB-Proxy', 'api cannot use https, use http only'); - } else { - tmdb_proxy.path_api = 'lampa.byskaz.ru/tmdb/api/3/'; - } - } - }); - var test_image = new Image(); - - test_image.onload = function () { - console.log('TMDB-Proxy', 'image proxy is working'); - }; - - test_image.onerror = function () { - console.log('TMDB-Proxy', 'image error', tmdb_proxy.path_image + ' not responding, using backup proxy'); - - if (Utils$2.protocol() == 'https://' || Storage.field('protocol') == 'https') { - console.log('TMDB-Proxy', 'image cannot use https, use http only'); - } else { - tmdb_proxy.path_image = 'lampa.byskaz.ru/tmdb/img/'; - } - }; - - test_image.src = TMDB$1.image('t/p/w200/3txl2FUNZCQUnHQPzkuNc17yLIs.jpg'); - } - - TMDB$1.image = function (url) { - var base = Utils$2.protocol() + 'image.tmdb.org/' + url; - return Utils$2.addUrlComponent(filter(Storage.field('proxy_tmdb') ? Utils$2.protocol() + tmdb_proxy.path_image + url : base), 'email=' + encodeURIComponent(email())); - }; - - TMDB$1.api = function (url) { - var base = Utils$2.protocol() + 'api.themoviedb.org/3/' + url; - return Utils$2.addUrlComponent(filter(Storage.field('proxy_tmdb') ? Utils$2.protocol() + tmdb_proxy.path_api + url : base), 'email=' + encodeURIComponent(email())); - }; - - Settings.listener.follow('open', function (e) { - if (e.name == 'tmdb') { - e.body.find('[data-parent="proxy"]').remove(); - } + Arrays.extend(params, { + icon: "\n \n \n ", + type: 'info', + text: '', + from: '', + time: 5000 }); - console.log('TMDB-Proxy', 'init'); - console.log('TMDB-Proxy', 'enabled', Storage.field('proxy_tmdb')); - check(); - } - - var TMDBProxy = { - init: init$H - }; - - /** - * Короче, постоянно пишут (почему нет картинок?) - * Решил сделать автоматическую установку TMDB Proxy если регион RU - */ - - var network$9 = new create$e(); - var responce_code = 'ru'; - - function region(call) { - var reg = Storage.get('region', '{}'); - Arrays.extend({ - time: 0 - }); - - if (!reg.code || reg.time + 1000 * 60 * 60 * 24 < Date.now()) { - var extracted = function extracted(code) { - code = code.trim().toLowerCase(); - code = code || 'ru'; - Storage.set('region', { - code: code, - time: Date.now() + var element = $("
\n
").concat(params.icon, "
\n
").concat(params.text, "
\n
")); + if (params.from) element.find('.bell__item-text').prepend("".concat(params.from, "
")); + setTimeout(function () { + element.removeClass('show'); + setTimeout(function () { + var slide = $("
"); + slide.css('height', element.outerHeight() + 'px'); + element.after(slide); + element.remove(); + Arrays.remove(items$1, _this); + slide.animate({ + height: 0 + }, 300, function () { + slide.remove(); }); - call(code); - }; - extract(extracted, function () { - console.log('VPN', 'domain not responding'); - Storage.set('region', { - code: Storage.field('language'), - time: Date.now() - }); - call(Storage.field('language')); - }); - } else call(reg.code); + if (items$1.length == 0) { + bell.removeClass('show'); + } + }, 300); + }, params.time); + bell.find('.bell__wrap').append(element); + setTimeout(function () { + element.addClass('show'); + }, 100); + items$1.push(this); + Sound$1.play('bell'); } - var extract = function extract(call, error) { - $.ajax({ - url: Utils$2.protocol() + 'geo.' + object$2.cub_domain, - type: 'GET', - dataType: 'text', - timeout: 8000, - success: call, - error: error - }); - }; - - function task$2(call) { - extract(function (country) { - console.log('VPN', 'geo.' + object$2.cub_domain + ' domain responding ', country); - var code = country.trim().toLowerCase(); - if (code.length > 2) code = 'ru'; //какой-то документ возвращается - - if ((code == 'ru' || code == 'be' || country == '') && !window.lampa_settings.disable_features.install_proxy) { - console.log('VPN', 'launch TMDB Proxy'); - TMDBProxy.init(); - } - - responce_code = code || 'ru'; - call(); - }, function (e, x) { - console.log('VPN', 'geo.' + object$2.cub_domain + ' domain not responding:', network$9.errorDecode(e, x)); - - if (!window.lampa_settings.disable_features.install_proxy) { - console.log('VPN', 'launch TMDB Proxy'); - TMDBProxy.init(); //будем считать что если не ответил, то все равно запускаем - } - - call(); - }); + function init$10() { + bell = $("
\n
\n
"); + $('body').append(bell); } - var VPN = { - region: region, - task: task$2, - code: function code() { - return responce_code; - } + function push$6(params) { + new Item$1(params); + bell.addClass('show'); + } + + var Bell = { + init: init$10, + push: push$6 }; - var listener$8 = start$8(); - var html$d; + var listener$e = Subscribe$2(); + var html$j; var display; var paused; var subtitles$1; var backworkIcon; var forwardIcon; - var timer$3 = {}; - var params = {}; + var timer$6 = {}; + var params$3 = {}; var rewind_position = 0; var rewind_force = 0; var last_mutation = 0; @@ -17853,18 +11736,18 @@ var pause_timer; var video_tube = []; - function init$G() { - html$d = Template.get('player_video'); - display = html$d.find('.player-video__display'); - paused = html$d.find('.player-video__paused'); - subtitles$1 = html$d.find('.player-video__subtitles'); - backworkIcon = html$d.find('.player-video__backwork-icon'); - forwardIcon = html$d.find('.player-video__forward-icon'); - html$d.find('.player-video__backwork-icon,.player-video__forward-icon').on('animationend', function () { + function init$$() { + html$j = Template.get('player_video'); + display = html$j.find('.player-video__display'); + paused = html$j.find('.player-video__paused'); + subtitles$1 = html$j.find('.player-video__subtitles'); + backworkIcon = html$j.find('.player-video__backwork-icon'); + forwardIcon = html$j.find('.player-video__forward-icon'); + html$j.find('.player-video__backwork-icon,.player-video__forward-icon').on('animationend', function () { $(this).removeClass('rewind'); }); - html$d.on('click', function (e) { - if ((Storage.field('navigation_type') == 'mouse' || Utils$2.isTouchDevice()) && DeviceInput.canClick(e.originalEvent)) { + html$j.on('click', function (e) { + if ((Storage.field('navigation_type') == 'mouse' || Utils$1.isTouchDevice()) && DeviceInput.canClick(e.originalEvent)) { clearTimeout(click_timer); click_nums++; if (PlayerIPTV.playning()) click_nums = 1; @@ -17891,25 +11774,21 @@ } } }); - var time_resize; - $(window).on('resize', function () { - clearTimeout(time_resize); - time_resize = setTimeout(function () { - if (_video) { - neeed_sacle = neeed_sacle_last; - scale(); - if (_video.resize) _video.resize(); - } - }, 200); + Lampa.Listener.follow('resize_end', function () { + if (_video) { + neeed_sacle = neeed_sacle_last; + scale(); + if (_video.resize) _video.resize(); + } }); /** * Специально для вебось */ - listener$8.follow('webos_subs', function (data) { + listener$e.follow('webos_subs', function (data) { webos_wait.subs = convertToArray(data.subs); }); - listener$8.follow('webos_tracks', function (data) { + listener$e.follow('webos_tracks', function (data) { webos_wait.tracks = convertToArray(data.tracks); }); registerTube({ @@ -17919,6 +11798,15 @@ }, create: YouTube$1 }); + Segments.listener.follow('skip', function (e) { + if (Storage.get('player_segments_' + e.type, 'auto') == 'auto') { + _video.currentTime = e.segment.end; + Bell.push({ + text: Lang$1.translate('player_segments_skiped'), + icon: Template.string('icon_viewed') + }); + } + }); } /** * Переключаем субтитры с предыдущей серии @@ -17928,9 +11816,9 @@ function webosLoadSubs() { var subs = webos_wait.subs; _video.webos_subs = subs; - var inx = params.sub + 1; + var inx = params$3.sub + 1; - if (typeof params.sub !== 'undefined' && subs[inx]) { + if (typeof params$3.sub !== 'undefined' && subs[inx]) { subs.forEach(function (e) { e.mode = 'disabled'; e.selected = false; @@ -17965,13 +11853,13 @@ var tracks = webos_wait.tracks; _video.webos_tracks = tracks; - if (typeof params.track !== 'undefined' && tracks[params.track]) { + if (typeof params$3.track !== 'undefined' && tracks[params$3.track]) { tracks.forEach(function (e) { return e.selected = false; }); - console.log('WebOS', 'enable tracks', params.track); - tracks[params.track].enabled = true; - tracks[params.track].selected = true; + console.log('WebOS', 'enable tracks', params$3.track); + tracks[params$3.track].enabled = true; + tracks[params$3.track].selected = true; } } /** @@ -17982,17 +11870,17 @@ function bind$2() { // ждем загрузки _video.addEventListener("waiting", function () { - loader(true); + loader$1(true); }); // начали играть _video.addEventListener("playing", function () { - loader(false); + loader$1(false); }); // видео закончилось _video.addEventListener('ended', function () { - listener$8.send('ended', {}); + listener$e.send('ended', {}); }); if (Platform.is('apple') && Storage.field('player') == 'ios') { @@ -18008,17 +11896,17 @@ if (msg.indexOf('EMPTY SRC') == -1) { if (error.code == 3) { - listener$8.send('error', { - error: Lang.translate('player_error_one'), + listener$e.send('error', { + error: Lang$1.translate('player_error_one'), fatal: true }); } else if (error.code == 4) { - listener$8.send('error', { - error: Lang.translate('player_error_two'), + listener$e.send('error', { + error: Lang$1.translate('player_error_two'), fatal: true }); } else if (typeof error.code !== 'undefined') { - listener$8.send('error', { + listener$e.send('error', { error: 'code [' + error.code + '] details [' + msg + ']', fatal: true }); @@ -18029,7 +11917,7 @@ _video.addEventListener('progress', function (e) { if (typeof e.percent !== 'undefined') { - listener$8.send('progress', { + listener$e.send('progress', { down: e.percent + '%' }); } else { @@ -18042,7 +11930,7 @@ if (_video.buffered.start && _video.buffered.start(_video.buffered.length - 1 - i) < _video.currentTime) { var down = Math.max(0, Math.min(100, _video.buffered.end(_video.buffered.length - 1 - i) / duration * 100)) + "%"; seconds = Math.max(0, _video.buffered.end(_video.buffered.length - 1 - i) - _video.currentTime); - listener$8.send('progress', { + listener$e.send('progress', { down: down }); break; @@ -18057,22 +11945,23 @@ _video.addEventListener('canplay', function () { - listener$8.send('canplay', {}); + listener$e.send('canplay', {}); }); // сколько прошло _video.addEventListener('timeupdate', function () { - if (rewind_position == 0 && !_video.rewind) listener$8.send('timeupdate', { + if (rewind_position == 0 && !_video.rewind) listener$e.send('timeupdate', { duration: _video.duration, current: _video.currentTime }); - listener$8.send('videosize', { + listener$e.send('videosize', { width: _video.videoWidth, height: _video.videoHeight }); scale(); mutation(); if (customsubs) customsubs.update(_video.currentTime); + Segments.update(_video.currentTime); }); // обновляем субтитры @@ -18095,8 +11984,8 @@ $('> div', subtitles$1).html(e.text ? e.text : ' ').css({ display: e.text ? 'inline-block' : 'none' }); - clearTimeout(timer$3.subtitle); - timer$3.subtitle = setTimeout(function () { + clearTimeout(timer$6.subtitle); + timer$6.subtitle = setTimeout(function () { $('> div', subtitles$1).html(' ').css({ display: 'none' }); @@ -18105,17 +11994,17 @@ _video.addEventListener('loadeddata', function (e) { - listener$8.send('videosize', { + listener$e.send('videosize', { width: _video.videoWidth, height: _video.videoHeight }); - listener$8.send('loadeddata', {}); + listener$e.send('loadeddata', {}); scale(); if (neeed_speed) speed(neeed_speed); loaded$1(); }); - var pc = Boolean(Platform.is('nw') || Platform.is('browser') || Platform.is('apple') && !Utils$2.isPWA()); // для страховки + var pc = Boolean(Platform.is('nw') || Platform.is('browser') || Platform.is('apple') && !Utils$1.isPWA()); // для страховки _video.volume = pc ? parseFloat(Storage.get('player_volume', '1')) : 1; _video.muted = false; @@ -18123,9 +12012,9 @@ function hlsBitrate(seconds) { if (hls && hls.streamController && hls.streamController.fragPlaying && hls.streamController.fragPlaying.baseurl && hls.streamController.fragPlaying.stats) { - var ch = Lang.translate('title_channel') + ' ' + parseFloat(hls.streamController.fragLastKbps / 1000).toFixed(2) + ' ' + Lang.translate('speed_mb'); - var bt = '  •  ' + Lang.translate('torrent_item_bitrate') + ' ~' + parseFloat(hls.streamController.fragPlaying.stats.total / 1000000 / 10 * 8).toFixed(2) + ' ' + Lang.translate('speed_mb'); - var bf = '  •  ' + Lang.translate('title_buffer') + ' ' + Utils$2.secondsToTimeHuman(seconds); + var ch = Lang$1.translate('title_channel') + ' ' + parseFloat(hls.streamController.fragLastKbps / 1000).toFixed(2) + ' ' + Lang$1.translate('speed_mb'); + var bt = '  •  ' + Lang$1.translate('torrent_item_bitrate') + ' ~' + parseFloat(hls.streamController.fragPlaying.stats.total / 1000000 / 10 * 8).toFixed(2) + ' ' + Lang$1.translate('speed_mb'); + var bf = '  •  ' + Lang$1.translate('title_buffer') + ' ' + Utils$1.secondsToTimeHuman(seconds); Lampa.PlayerInfo.set('bitrate', ch + bt + bf); } } @@ -18271,22 +12160,22 @@ if (tracks.length) { for (var i = 0; i < tracks.length; i++) { - if (tracks[i].enabled == true || tracks[i].selected == true) params.track = i; + if (tracks[i].enabled == true || tracks[i].selected == true) params$3.track = i; } } if (subs.length) { for (var _i = 0; _i < subs.length; _i++) { if (subs[_i].enabled == true || subs[_i].selected == true) { - params.sub = subs[_i].index; + params$3.sub = subs[_i].index; } } } - if (hls && hls.levels) params.level = hls.currentLevel; - if (dash) params.level = dash.getQualityFor('video'); - console.log('WebOS', 'saved params', params); - return params; + if (hls && hls.levels) params$3.level = hls.currentLevel; + if (dash) params$3.level = dash.getQualityFor('video'); + console.log('WebOS', 'saved params', params$3); + return params$3; } /** * Очисить состояние @@ -18294,7 +12183,7 @@ function clearParamas() { - params = {}; + params$3 = {}; } /** * Загрузитьновое состояние из прошлого @@ -18303,7 +12192,7 @@ function setParams(saved_params) { - params = saved_params; + params$3 = saved_params; } /** * Смотрим есть ли дорожки и сабы @@ -18352,16 +12241,16 @@ if (tracks.length) { tracks = convertToArray(tracks); - if (typeof params.track !== 'undefined' && tracks[params.track]) { + if (typeof params$3.track !== 'undefined' && tracks[params$3.track]) { tracks.forEach(function (e) { e.selected = false; }); - tracks[params.track].enabled = true; - tracks[params.track].selected = true; + tracks[params$3.track].enabled = true; + tracks[params$3.track].selected = true; console.log('Player', 'enable track by default'); } - listener$8.send('tracks', { + listener$e.send('tracks', { tracks: tracks }); } @@ -18369,13 +12258,13 @@ if (subs.length) { subs = convertToArray(subs); - if (typeof params.sub !== 'undefined' && subs[params.sub]) { + if (typeof params$3.sub !== 'undefined' && subs[params$3.sub]) { subs.forEach(function (e) { e.mode = 'disabled'; e.selected = false; }); - subs[params.sub].mode = 'showing'; - subs[params.sub].selected = true; + subs[params$3.sub].mode = 'showing'; + subs[params$3.sub].selected = true; subsview(true); } else if (Storage.field('subtitles_start')) { var full = subs.find(function (s) { @@ -18393,7 +12282,7 @@ subsview(true); } - listener$8.send('subs', { + listener$e.send('subs', { subs: subs }); } @@ -18422,18 +12311,18 @@ }); }); - if (typeof params.level !== 'undefined' && hls.levels[params.level]) { + if (typeof params$3.level !== 'undefined' && hls.levels[params$3.level]) { hls.levels.map(function (e) { return e.selected = false; }); - hls.levels[params.level].enabled = true; - hls.levels[params.level].selected = true; - current_level = hls.levels[params.level].title; + hls.levels[params$3.level].enabled = true; + hls.levels[params$3.level].selected = true; + current_level = hls.levels[params$3.level].title; } else { if (hls.currentLevel >= 0) current_level = hls.levels[hls.currentLevel].title; } - listener$8.send('levels', { + listener$e.send('levels', { levels: hls.levels, current: current_level }); @@ -18456,17 +12345,17 @@ }); }); - if (typeof params.level !== 'undefined' && bitrates[params.level]) { + if (typeof params$3.level !== 'undefined' && bitrates[params$3.level]) { bitrates.map(function (e) { return e.selected = false; }); dash.getSettings().streaming.abr.autoSwitchBitrate = false; - bitrates[params.level].enabled = true; - bitrates[params.level].selected = true; - _current_level = bitrates[params.level].title; + bitrates[params$3.level].enabled = true; + bitrates[params$3.level].selected = true; + _current_level = bitrates[params$3.level].title; } - listener$8.send('levels', { + listener$e.send('levels', { levels: bitrates, current: _current_level }); @@ -18507,6 +12396,10 @@ }); } }); + + _video.customSubs.length > 0 && listener$e.send('subs', { + subs: _video.customSubs + }); } /** * Включить или выключить субтитры @@ -18542,7 +12435,7 @@ */ - function create$g() { + function create$8() { var videobox; if (Platform.is('tizen') && Storage.field('player') == 'tizen') { @@ -18574,7 +12467,7 @@ display.append(videobox); if (Platform.is('webos') && !webos && !Player.playdata().voiceovers) { - webos = new create$h(_video); + webos = new create$9(_video); webos.callback = function () { var src = _video.src; @@ -18582,10 +12475,10 @@ console.log('WebOS', 'video loaded'); $(_video).remove(); if (normalization) normalization.destroy(); - url$3(src, true); + url$5(src, true); _video.customSubs = sub; webos.repet(_video); - listener$8.send('reset_continue', {}); + listener$e.send('reset_continue', {}); }; webos.start(); @@ -18604,7 +12497,7 @@ !!videobox && display.append(videobox); bind$2(); setTimeout(function () { - load$3(src); + load$4(src); }, 100); return true; } @@ -18621,9 +12514,9 @@ */ - function loader(status) { + function loader$1(status) { wait = status; - html$d.toggleClass('video--load', status); + html$j.toggleClass('video--load', status); } /** * Устанавливаем ссылку на видео @@ -18631,8 +12524,8 @@ */ - function url$3(src, change_quality) { - loader(true); + function url$5(src, change_quality) { + loader$1(true); if (hls) { hls.destroy(); @@ -18645,12 +12538,12 @@ } if (createTube(src)) return; - create$g(); + create$8(); if (/\.mpd/.test(src) && typeof dashjs !== 'undefined') { try { if (Platform.is('orsay') && Storage.field('player') == 'orsay') { - load$3(src); + load$4(src); } else { dash = dashjs.MediaPlayer().create(); dash.getSettings().streaming.abr.autoSwitchBitrate = false; @@ -18658,7 +12551,7 @@ } } catch (e) { console.log('Player', 'Dash error:', e.stack); - load$3(src); + load$4(src); } } else if (/\.m3u8/.test(src)) { if (navigator.userAgent.toLowerCase().indexOf('maple') > -1) src += '|COMPONENT=HLS'; @@ -18700,15 +12593,15 @@ if (data.details === Hls.ErrorDetails.MANIFEST_PARSING_ERROR) { if (data.reason === "no EXTM3U delimiter") { - load$3(src); + load$4(src); } else { - listener$8.send('error', { + listener$e.send('error', { error: 'details [' + data.details + '] fatal [' + data.fatal + ']', fatal: data.fatal }); } } else { - listener$8.send('error', { + listener$e.send('error', { error: 'details [' + data.details + '] fatal [' + data.fatal + ']', fatal: data.fatal }); @@ -18737,10 +12630,10 @@ hls_parser.loadSource(src); hls_parser.on(Hls.Events.ERROR, function (event, data) { console.log('Player', 'hls parse error', data.reason, data.details, data.fatal); - if (!send_load_ready) load$3(src); + if (!send_load_ready) load$4(src); }); hls_parser.on(Hls.Events.MANIFEST_LOADED, function () { - if (hls_parser.audioTracks.length) listener$8.send('translate', { + if (hls_parser.audioTracks.length) listener$e.send('translate', { where: 'tracks', translate: hls_parser.audioTracks.map(function (a) { return { @@ -18748,7 +12641,7 @@ }; }) }); - if (hls_parser.subtitleTracks.length) listener$8.send('translate', { + if (hls_parser.subtitleTracks.length) listener$e.send('translate', { where: 'subs', translate: hls_parser.subtitleTracks.map(function (a) { return { @@ -18775,19 +12668,19 @@ }; }); console.log('Player', 'set hls levels', parsed_levels); - listener$8.send('levels', { + listener$e.send('levels', { levels: parsed_levels, current: hlsLevelName(select_level) }); console.log('Player', 'hls select level url:', select_level.url[0]); - load$3(select_level.url[0]); - } else load$3(src); + load$4(select_level.url[0]); + } else load$4(src); send_load_ready = true; }); - } else load$3(src); - } else load$3(src); - } else load$3(src); + } else load$4(src); + } else load$4(src); + } else load$4(src); } /** * Начать загрузку @@ -18795,7 +12688,7 @@ */ - function load$3(src) { + function load$4(src) { if (hls_parser) { hls_parser.destroy(); hls_parser = false; @@ -18829,7 +12722,7 @@ } paused.addClass('hide'); - listener$8.send('play', {}); + listener$e.send('play', {}); } /** * Пауза @@ -18856,7 +12749,7 @@ pause_timer = setTimeout(function () { paused.addClass('hide'); }, 4000); - listener$8.send('pause', {}); + listener$e.send('pause', {}); } /** * Играем или пауза @@ -18868,10 +12761,10 @@ if (_video.paused) { play$2(); - listener$8.send('play', {}); + listener$e.send('play', {}); } else { pause(); - listener$8.send('pause', {}); + listener$e.send('pause', {}); } } /** @@ -18881,8 +12774,8 @@ function rewindEnd(immediately) { - clearTimeout(timer$3.rewind_call); - timer$3.rewind_call = setTimeout(function () { + clearTimeout(timer$6.rewind_call); + timer$6.rewind_call = setTimeout(function () { _video.currentTime = rewind_position; rewind_position = 0; rewind_force = 0; @@ -18902,12 +12795,12 @@ rewind_position = Math.max(0, Math.min(position_time, _video.duration)); pause(); if (rewind_position == 0) _video.currentTime = 0;else if (rewind_position == _video.duration) _video.currentTime = _video.duration; - timer$3.rewind = Date.now(); - listener$8.send('timeupdate', { + timer$6.rewind = Date.now(); + listener$e.send('timeupdate', { duration: _video.duration, current: rewind_position }); - listener$8.send('rewind', {}); + listener$e.send('rewind', {}); rewindEnd(immediately); } /** @@ -18934,6 +12827,13 @@ rewind_position -= rewind_force; } + var skip = Segments.get(_video.currentTime); + + if (forward && skip && !skip.segment.skiped && Storage.get('player_segments_' + skip.type) == 'user') { + rewind_position = skip.segment.end; + skip.segment.skiped = true; + } + rewindStart(rewind_position); } } @@ -19017,7 +12917,7 @@ */ - function destroy$6(savemeta) { + function destroy$7(savemeta) { subsview(false); neeed_sacle = false; @@ -19081,19 +12981,19 @@ } display.empty(); - loader(false); + loader$1(false); } - function render$9() { - return html$d; + function render$e() { + return html$j; } var PlayerVideo = { - init: init$G, - listener: listener$8, - url: url$3, - render: render$9, - destroy: destroy$6, + init: init$$, + listener: listener$e, + url: url$5, + render: render$e, + destroy: destroy$7, playpause: playpause, rewind: rewind, play: play$2, @@ -19111,13 +13011,14 @@ setParams: setParams, normalizationVisible: normalizationVisible, togglePictureInPicture: togglePictureInPicture, + applySubsSettings: applySubsSettings, changeVolume: changeVolume, registerTube: registerTube, removeTube: removeTube, verifyTube: verifyTube }; - function parse$1(data) { + function parse$2(data) { var result = { hash_string: '', season: null, @@ -19178,14 +13079,14 @@ } var EpisodeParser = { - parse: parse$1 + parse: parse$2 }; - var network$8 = new create$e(); + var network$b = new Request(); - function url$2() { + function url$4() { var u = ip(); - return u ? Utils$2.checkEmptyUrl(u) : u; + return u ? Utils$1.checkEmptyUrl(u) : u; } function ip() { @@ -19198,8 +13099,8 @@ var data = JSON.stringify({ action: 'list' }); - clear$6(); - network$8.silent(url$2() + '/torrents', function (result) { + clear$9(); + network$b.silent(url$4() + '/torrents', function (result) { if (result.length) success(result);else fail(); }, fail, data); } @@ -19209,12 +13110,12 @@ action: 'get', hash: hash }); - network$8.silent(url$2() + '/cache', success, fail, data); + network$b.silent(url$4() + '/cache', success, fail, data); } - function add$8(object, success, fail) { + function add$e(object, success, fail) { var send_data = object.data ? Arrays.clone(object.data) : false; - if (send_data && send_data.movie) send_data.movie = Utils$2.clearCard(send_data.movie); + if (send_data && send_data.movie) send_data.movie = Utils$1.clearCard(send_data.movie); var data = JSON.stringify({ action: 'add', link: object.link, @@ -19223,13 +13124,13 @@ data: send_data ? JSON.stringify(send_data) : '', save_to_db: true }); - clear$6(); - network$8.silent(url$2() + '/torrents', success, fail, data); + clear$9(); + network$b.silent(url$4() + '/torrents', success, fail, data); } function hash$1(object, success, fail) { var send_data = object.data ? Arrays.clone(object.data) : false; - if (send_data && send_data.movie) send_data.movie = Utils$2.clearCard(send_data.movie); + if (send_data && send_data.movie) send_data.movie = Utils$1.clearCard(send_data.movie); var data = JSON.stringify({ action: 'add', link: object.link, @@ -19238,9 +13139,9 @@ data: send_data ? JSON.stringify(send_data) : '', save_to_db: Storage.get('torrserver_savedb', 'false') }); - clear$6(); - network$8.silent(url$2() + '/torrents', success, function (a, c) { - fail(network$8.errorDecode(a, c)); + clear$9(); + network$b.silent(url$4() + '/torrents', success, function (a, c) { + fail(network$b.errorDecode(a, c)); }, data); } @@ -19249,9 +13150,9 @@ action: 'get', hash: hash }); - clear$6(); - network$8.timeout(2000); - network$8.silent(url$2() + '/torrents', function (json) { + clear$9(); + network$b.timeout(2000); + network$b.silent(url$4() + '/torrents', function (json) { if (json.file_stats) { success(json); } @@ -19259,23 +13160,23 @@ } function connected(success, fail) { - clear$6(); - network$8.timeout(5000); - network$8.silent(url$2() + '/settings', function (json) { + clear$9(); + network$b.timeout(5000); + network$b.silent(url$4() + '/settings', function (json) { if (typeof json.CacheSize == 'undefined') { - fail(Lang.translate('torrent_error_nomatrix')); + fail(Lang$1.translate('torrent_error_nomatrix')); } else { success(json); } }, function (a, c) { - fail(network$8.errorDecode(a, c)); + fail(network$b.errorDecode(a, c)); }, JSON.stringify({ action: 'get' })); } function stream(path, hash, id) { - return url$2() + '/stream/' + encodeURIComponent(path.split('\\').pop().split('/').pop()) + '?link=' + hash + '&index=' + id + '&' + (Storage.field('torrserver_preload') ? 'preload' : 'play'); + return url$4() + '/stream/' + encodeURIComponent(path.split('\\').pop().split('/').pop()) + '?link=' + hash + '&index=' + id + '&' + (Storage.field('torrserver_preload') ? 'preload' : 'play'); } function drop(hash, success, fail) { @@ -19283,26 +13184,26 @@ action: 'drop', hash: hash }); - clear$6(); - network$8.silent(url$2() + '/torrents', success, fail, data, { + clear$9(); + network$b.silent(url$4() + '/torrents', success, fail, data, { dataType: 'text' }); } - function remove$2(hash, success, fail) { + function remove$4(hash, success, fail) { var data = JSON.stringify({ action: 'rem', hash: hash }); - clear$6(); - network$8.silent(url$2() + '/torrents', success, fail, data, { + clear$9(); + network$b.silent(url$4() + '/torrents', success, fail, data, { dataType: 'text' }); } - function parse(data) { + function parse$1(data) { var result = EpisodeParser.parse(data); - result.hash = Utils$2.hash(result.hash_string); + result.hash = Utils$1.hash(result.hash_string); return result; } @@ -19313,11 +13214,11 @@ var nam = spl[spl.length - 1].split('.'); if (nam.length > 1) nam.pop(); nam = nam.join('.'); - element.path_human = Utils$2.pathToNormalTitle(nam, false).trim(); + element.path_human = Utils$1.pathToNormalTitle(nam, false).trim(); if (spl.length > 1) { spl.pop(); - element.folder_name = Utils$2.pathToNormalTitle(spl.pop(), false).trim(); + element.folder_name = Utils$1.pathToNormalTitle(spl.pop(), false).trim(); } }); @@ -19363,11 +13264,11 @@ return files; } - function clear$6() { - network$8.clear(); + function clear$9() { + network$b.clear(); } - function error$1() { + function error$2() { var temp = Template.get('torrent_error', { ip: ip() }); @@ -19383,7 +13284,7 @@ position++; list.slice(0, position + 1).addClass('wait'); var total = list.length; - comp.text(Lang.translate('torrent_error_made') + ' ' + Math.max(0, position) + ' ' + Lang.translate('torrent_error_from') + ' ' + total); + comp.text(Lang$1.translate('torrent_error_made') + ' ' + Math.max(0, position) + ' ' + Lang$1.translate('torrent_error_from') + ' ' + total); if (position > list.length) { Modal.close(); @@ -19394,7 +13295,7 @@ var next_step = list.eq(position + 1); prog.css('width', Math.round(position / total * 100) + '%'); list.slice(0, position).addClass('check'); - btn.text(position < total ? Lang.translate('torrent_error_next') : Lang.translate('torrent_error_complite')); + btn.text(position < total ? Lang$1.translate('torrent_error_next') : Lang$1.translate('torrent_error_complite')); next.text(next_step.length ? '- ' + next_step.text() : ''); } } @@ -19403,7 +13304,7 @@ btn.on('hover:enter', function () { makeStep(); }); - Modal.title(Lang.translate('torrent_error_connect')); + Modal.title(Lang$1.translate('torrent_error_connect')); Modal.update(temp); Controller.add('modal', { invisible: true, @@ -19422,39 +13323,54 @@ var Torserver = { ip: ip, my: my, - add: add$8, - url: url$2, + add: add$e, + url: url$4, hash: hash$1, files: files$1, - clear: clear$6, + clear: clear$9, drop: drop, stream: stream, - remove: remove$2, + remove: remove$4, connected: connected, - parse: parse, - error: error$1, + parse: parse$1, + error: error$2, cache: cache$1, clearFileName: clearFileName }; - var html$c; - var listener$7 = start$8(); - var network$7 = new create$e(); - var elems; - var error, stat_timer; + /** + * Добавляет шапку с кнопкой назад + * @param {string} title - заголовок шапки + * @param {boolean} js - возвращать HTMLElement объект + * @returns {HTMLElement|jQuery} - элемент шапки + */ - function init$F() { - html$c = Template.get('player_info'); - html$c.find('.player-info__body').prepend(HeadBackward('Плеер')); + function HeadBackward (title, js) { + var head = Template[js ? 'js' : 'get']('head_backward', { + title: title + }); + head.find('.head-backward__button').on('click', Controller.back.bind(Controller)); + return head; + } + + var html$i; + var listener$d = Subscribe$2(); + var network$a = new Request(); + var elems; + var error$1, stat_timer; + + function init$_() { + html$i = Template.get('player_info'); + html$i.find('.player-info__body').prepend(HeadBackward('Плеер')); elems = { - name: $('.player-info__name,.head-backward__title', html$c), - size: $('.value--size span', html$c), - stat: $('.value--stat span', html$c), - speed: $('.value--speed span', html$c), - error: $('.player-info__error', html$c), - pieces: $('.value--pieces', html$c) + name: $('.player-info__name,.head-backward__title', html$i), + size: $('.value--size span', html$i), + stat: $('.value--stat span', html$i), + speed: $('.value--speed span', html$i), + error: $('.player-info__error', html$i), + pieces: $('.value--pieces', html$i) }; - Utils$2.time(html$c); + Utils$1.time(html$i); } /** * Установить значение @@ -19463,11 +13379,11 @@ */ - function set$1(need, value) { + function set$2(need, value) { if (need == 'name') elems.name.html(value);else if (need == 'size' && value.width && value.height) elems.size.text(value.width + 'x' + value.height);else if (need == 'error') { - clearTimeout(error); + clearTimeout(error$1); elems.error.removeClass('hide').text(value); - error = setTimeout(function () { + error$1 = setTimeout(function () { elems.error.addClass('hide'); }, 10000); } else if (need == 'stat') stat$2(value);else if (need == 'bitrate') elems.stat.html(value); @@ -19511,37 +13427,37 @@ function stat$2(url) { var wait = 0; - elems.stat.text('- / - • - ' + Lang.translate('connected_seeds')); + elems.stat.text('- / - • - ' + Lang$1.translate('connected_seeds')); elems.speed.text('--'); var update = function update() { // если панель скрыта, то зачем каждую секунду чекать? хватит и 5 сек // проверено, если ставить на паузу, разадача удаляется, но если чекать постоянно, то все норм - if (!html$c.hasClass('info--visible')) { + if (!html$i.hasClass('info--visible')) { wait++; if (wait <= 5) return;else wait = 0; } - network$7.timeout(2000); - network$7.silent(url.replace('preload', 'stat').replace('play', 'stat'), function (data) { - elems.stat.text((data.active_peers || 0) + ' / ' + (data.total_peers || 0) + ' • ' + (data.connected_seeders || 0) + ' ' + Lang.translate('connected_seeds')); - elems.speed.text(Utils$2.bytesToSize(data.download_speed ? data.download_speed * 8 : 0, true)); + network$a.timeout(2000); + network$a.silent(url.replace('preload', 'stat').replace('play', 'stat'), function (data) { + elems.stat.text((data.active_peers || 0) + ' / ' + (data.total_peers || 0) + ' • ' + (data.connected_seeders || 0) + ' ' + Lang$1.translate('connected_seeds')); + elems.speed.text(Utils$1.bytesToSize(data.download_speed ? data.download_speed * 8 : 0, true)); var hash = url.match(/link=(.*?)\&/); if (hash) { Torserver.cache(hash[1], function (cache) { pieces(cache); - listener$7.send('stat', { + listener$d.send('stat', { data: data, cache: cache }); }, function () { - listener$7.send('stat', { + listener$d.send('stat', { data: data }); }); } else { - listener$7.send('stat', { + listener$d.send('stat', { data: data }); } @@ -19557,41 +13473,41 @@ */ - function toggle$5(status) { - html$c.toggleClass('info--visible', status); + function toggle$9(status) { + html$i.toggleClass('info--visible', status); } function loading$2() { - elems.size.text(Lang.translate('loading') + '...'); + elems.size.text(Lang$1.translate('loading') + '...'); } /** * Уничтожить */ - function destroy$5() { - elems.size.text(Lang.translate('loading') + '...'); + function destroy$6() { + elems.size.text(Lang$1.translate('loading') + '...'); elems.stat.text(''); elems.speed.text(''); elems.error.addClass('hide'); elems.pieces.empty(); - clearTimeout(error); + clearTimeout(error$1); clearInterval(stat_timer); - network$7.clear(); + network$a.clear(); } - function render$8() { - return html$c; + function render$d() { + return html$i; } var PlayerInfo = { - init: init$F, - listener: listener$7, - render: render$8, - set: set$1, - toggle: toggle$5, + init: init$_, + listener: listener$d, + render: render$d, + set: set$2, + toggle: toggle$9, loading: loading$2, - destroy: destroy$5 + destroy: destroy$6 }; var Nature = /*#__PURE__*/function () { @@ -19606,9 +13522,8 @@ key: "create", value: function create() { this.html = Template.get('screensaver'); - this.timer = setInterval(this.next.bind(this), 30000); - this.time = Utils$2.time(this.html); - this.time.tik(); + Timer.add(30000, this.next); + this.time = Utils$1.time(this.html); this.next(); } }, { @@ -19639,8 +13554,8 @@ }, { key: "destroy", value: function destroy() { - clearInterval(this.timer); - clearInterval(this.time.timer); + Timer.remove(this.next); + this.time.destroy(); this.html.remove(); } }]); @@ -19673,12 +13588,368 @@ return Chrome; }(); + var IndexedDB = /*#__PURE__*/function () { + function IndexedDB(database_name) { + var tables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var version = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3; + + _classCallCheck(this, IndexedDB); + + this.listener = Subscribe$2(); + this.database_name = 'lampa_' + database_name; + this.tables = tables; + this.version = version; + this.db = null; + this.logs = true; + } + + _createClass(IndexedDB, [{ + key: "log", + value: function log(err, store_name, key) { + if (this.logs) console.log('DB', this.database_name + (store_name ? '_' + store_name : '') + (key ? ' -> [' + key + ']' : ''), err); + } + /** + * Открытие базы данных + * @returns {Promise} + */ + + }, { + key: "openDatabase", + value: function openDatabase() { + var _this = this; + + return new Promise(function (resolve, reject) { + var Base = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB; + if (!Base) return _this.log('Not supported'), reject('Not supported'); + if (!_this.tables.length) return _this.log('No tables'), reject('No tables'); + var request = Base.open(_this.database_name, _this.version); + + request.onerror = function (event) { + _this.log(request.error || 'An error occurred while opening the database'); + + reject(request.error || 'An error occurred while opening the database'); + }; + + request.onsuccess = function (event) { + _this.db = event.target.result; + resolve(); + }; + + request.onupgradeneeded = function (event) { + var db = event.target.result; + + _this.log('OnUpgradeNeeded'); + + _this.tables.forEach(function (name) { + if (!db.objectStoreNames.contains(name)) { + _this.log('Create table - ' + name); + + db.createObjectStore(name, { + keyPath: 'key' + }); + } + }); + }; + }); + } + /** + * Добавление данных в таблицу + * @param {string} store_name - Название таблицы + * @param {string} key - Ключ записи + * @param {any} value - Значение записи + * @returns {Promise} + */ + + }, { + key: "addData", + value: function addData(store_name, key, value) { + var _this2 = this; + + return new Promise(function (resolve, reject) { + if (!_this2.db) { + return _this2.log('Database not open', store_name, key), reject('Database not open'); + } + + var transaction = _this2.db.transaction([store_name], 'readwrite'); + + var objectStore = transaction.objectStore(store_name); + var addRequest = objectStore.add({ + key: key, + value: value, + time: Date.now() + }); + + addRequest.onerror = function (event) { + _this2.log(addRequest.error || 'An error occurred while adding data', store_name, key); + + reject(addRequest.error || 'An error occurred while adding data'); + }; + + addRequest.onsuccess = resolve; + }); + } + /** + * Получение данных из таблицы + * @param {string} store_name - Название таблицы + * @param {string} key - Ключ записи, если не указан, вернет все записи + * @param {number} life_time - Время жизни записи в минутах. -1 - без ограничений + * @param {boolean} return_meta - Возвращать мета данные (ключ, время) вместе со значением + * @returns {Promise} + */ + + }, { + key: "getData", + value: function getData(store_name, key) { + var _this3 = this; + + var life_time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1; + var return_meta = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + return new Promise(function (resolve, reject) { + if (!_this3.db) { + return _this3.log('Database not open', store_name, key), reject('Database not open'); + } + + var transaction = _this3.db.transaction([store_name], 'readonly'); + + var objectStore = transaction.objectStore(store_name); + var getRequest = key ? objectStore.get(key) : objectStore.getAll(); + + getRequest.onerror = function (event) { + _this3.log(getRequest.error || 'An error occurred while retrieving data', store_name, key); + + reject(getRequest.error || 'An error occurred while retrieving data'); + }; + + getRequest.onsuccess = function (event) { + var result = event.target.result; + + if (result) { + if (key) { + if (life_time == -1) resolve(return_meta ? result : result.value);else { + if (Date.now() < result.time + life_time * 1000 * 60) resolve(return_meta ? result : result.value);else resolve(null); + } + } else resolve(return_meta ? result : result.map(function (r) { + return r.value; + })); + } else { + resolve(null); + } + }; + }); + } + /** + * Получение данных из таблицы без ошибки + * @param {string} store_name - Название таблицы + * @param {string} key - Ключ записи + * @param {number} life_time - Время жизни записи в минутах. -1 - без ограничений + * @param {boolean} return_meta - Возвращать мета данные (ключ, время) вместе со значением + * @returns {Promise} + */ + + }, { + key: "getDataAnyCase", + value: function getDataAnyCase(store_name, key, life_time) { + var _this4 = this; + + var return_meta = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + return new Promise(function (resolve, reject) { + _this4.getData(store_name, key, life_time, return_meta).then(resolve)["catch"](function () { + resolve(null); + }); + }); + } + /** + * Обновление данных в таблице + * @param {string} store_name - Название таблицы + * @param {string} key - Ключ записи + * @param {any} value - Новое значение записи + * @returns {Promise} + */ + + }, { + key: "updateData", + value: function updateData(store_name, key, value) { + var _this5 = this; + + return new Promise(function (resolve, reject) { + if (!_this5.db) { + return _this5.log('Database not open', store_name, key), reject('Database not open'); + } + + var transaction = _this5.db.transaction([store_name], 'readwrite'); + + var objectStore = transaction.objectStore(store_name); + var getRequest = objectStore.get(key); + + getRequest.onerror = function (event) { + _this5.log(getRequest.error || 'An error occurred while updating data', store_name, key); + + reject(getRequest.error || 'An error occurred while updating data'); + }; + + getRequest.onsuccess = function (event) { + var result = event.target.result; + + if (result) { + result.value = value; + result.time = Date.now(); + var updateRequest = objectStore.put(result); + + updateRequest.onerror = function (event) { + _this5.log(updateRequest.error || 'An error occurred while updating data', store_name, key); + + reject(updateRequest.error || 'An error occurred while updating data'); + }; + + updateRequest.onsuccess = resolve; + } else { + _this5.log('No data found with the given key', store_name, key); + + reject('No data found with the given key'); + } + }; + }); + } + /** + * Перезапись данных в таблице (если нет, то создаст новую запись) + * @param {string} store_name - Название таблицы + * @param {string} key - Ключ записи + * @param {any} value - Новое значение записи + * @returns {Promise} + */ + + }, { + key: "rewriteData", + value: function rewriteData(store_name, key, value) { + var _this6 = this; + + return new Promise(function (resolve, reject) { + if (!_this6.db) { + return _this6.log('Database not open', store_name, key), reject('Database not open'); + } + + var transaction = _this6.db.transaction([store_name], 'readwrite'); + + var objectStore = transaction.objectStore(store_name); + var addRequest = objectStore.put({ + key: key, + value: value, + time: Date.now() + }); + + addRequest.onerror = function (event) { + _this6.log(addRequest.error || 'An error occurred while rewrite data', store_name, key); + + reject(addRequest.error || 'An error occurred while rewrite data'); + }; + + addRequest.onsuccess = resolve; + }); + } + /** + * Удаление данных из таблицы + * @param {string} store_name - Название таблицы + * @param {string} key - Ключ записи + * @returns {Promise} + */ + + }, { + key: "deleteData", + value: function deleteData(store_name, key) { + var _this7 = this; + + return new Promise(function (resolve, reject) { + if (!_this7.db) { + return _this7.log('Database not open', store_name, key), reject('Database not open'); + } + + var transaction = _this7.db.transaction([store_name], 'readwrite'); + + var objectStore = transaction.objectStore(store_name); + var deleteRequest = objectStore["delete"](key); + + deleteRequest.onerror = function (event) { + _this7.log(deleteRequest.error || 'An error occurred while deleting data', store_name, key); + + reject(deleteRequest.error || 'An error occurred while deleting data'); + }; + + deleteRequest.onsuccess = resolve; + }); + } + /** + * Очистка таблицы + * @param {string} store_name - Название таблицы + * @returns {Promise} + */ + + }, { + key: "clearTable", + value: function clearTable(store_name) { + var _this8 = this; + + return new Promise(function (resolve, reject) { + if (!_this8.db) { + return _this8.log('Database not open', store_name), reject('Database not open'); + } + + var transaction = _this8.db.transaction([store_name], 'readwrite'); + + var objectStore = transaction.objectStore(store_name); + var clearRequest = objectStore.clear(); + + clearRequest.onerror = function (event) { + _this8.log(clearRequest.error || 'An error occurred while clearing the table', store_name); + + reject(clearRequest.error || 'An error occurred while clearing the table'); + }; + + clearRequest.onsuccess = function () { + resolve(); + }; + }); + } + /** + * Очистка всех таблиц + * @returns {Promise} + */ + + }, { + key: "clearAll", + value: function clearAll() { + var _this9 = this; + + return new Promise(function (resolve, reject) { + if (!_this9.db) { + return _this9.log('Database not open'), reject('Database not open'); + } + + var objectStoreNames = _this9.db.objectStoreNames; + var tableNames = Array.from(objectStoreNames); + tableNames.forEach(function (n) { + _this9.clearTable(n); + }); + resolve(); + }); + } + }]); + + return IndexedDB; + }(); + + var Cache = new IndexedDB('cache', ['screensavers', 'plugins', 'backgrounds', 'images', 'themes', 'other', 'timetable', 'cards', 'storage'], 7); + Cache.openDatabase().then(function () { + console.log('Cache', 'worked'); + })["catch"](function () { + console.log('Cache', 'error', 'no open database'); + }); + var Cub = /*#__PURE__*/function () { function Cub(params) { _classCallCheck(this, Cub); this.params = params; - this["default"] = Utils$2.protocol() + object$2.cub_domain + '/img/background/default.mp4'; + this["default"] = Utils$1.protocol() + object$2.cub_domain + '/img/background/default.mp4'; } _createClass(Cub, [{ @@ -19687,11 +13958,11 @@ this.html = Template.get('screensaver'); var source = this.params && this.params.url ? this.params.url : Storage.get('cub_screensaver', ''); if (!source) source = this["default"]; - this.url = Utils$2.fixMirrorLink(Utils$2.addUrlComponent(source, 'token=' + encodeURIComponent(Storage.get('account', '{}').token))); + this.url = Utils$1.fixMirrorLink(Utils$1.addUrlComponent(source, 'token=' + encodeURIComponent(Storage.get('account', '{}').token))); this.preload = $('
'); this.html.prepend(this.preload); this.html.find('.screensaver__slides').remove(); - this.time = Utils$2.time(this.html); + this.time = Utils$1.time(this.html); this.time.tik(); if (Platform.is('webos')) this.video(this.url);else this.cache(this.url); } @@ -19805,7 +14076,7 @@ _classCallCheck(this, Aerial); this.params = params; - this.net = new create$e(); + this.net = new Request(); this.visible = false; this.items = []; this.opacity = 0; @@ -19864,7 +14135,7 @@ this.html.prepend(this.video); this.html.find('.screensaver__slides').remove(); this.html.find('.screensaver__gradient').after(this.info); - this.time = Utils$2.time(this.html); + this.time = Utils$1.time(this.html); this.time.tik(); this.cache(function () { _this.select(); @@ -19877,7 +14148,7 @@ value: function select() { this.object = this.items[Math.floor(Math.random() * this.items.length)]; this.title.text(this.object.name.replace(/\s\d$/, '')); - this.tagline.text(Utils$2.capitalizeFirstLetter(this.object.type)); + this.tagline.text(Utils$1.capitalizeFirstLetter(this.object.type)); } }, { key: "fadeVideoIn", @@ -19961,11 +14232,17 @@ return Aerial; }(); + /** + * Скринсейвер + * @class + * @returns {Screensaver} + */ + var Screensaver$1 = /*#__PURE__*/function () { function Screensaver() { _classCallCheck(this, Screensaver); - this.listener = start$8(); + this.listener = Subscribe$2(); this.enabled = false; this.worked = false; this.screensaver; @@ -20089,9 +14366,8709 @@ var Screensaver$2 = new Screensaver$1(); + var permit = {}; // Получить аккаунт + + Object.defineProperty(permit, 'account', { + get: function get() { + return Storage.get('account', '{}'); + } + }); // Получить данные пользователя + + Object.defineProperty(permit, 'user', { + get: function get() { + return Storage.get('account_user', '{}'); + } + }); // Получить токен аккаунта + + Object.defineProperty(permit, 'token', { + get: function get() { + return permit.account.token; + } + }); // Пользователь залогинен и разрешено использование аккаунта + + Object.defineProperty(permit, 'access', { + get: function get() { + return permit.token && window.lampa_settings.account_use; + } + }); // Пользователь включил синхронизацию + + Object.defineProperty(permit, 'use', { + get: function get() { + return permit.access && Storage.field('account_use'); + } + }); // Синхронизация включена и разрешено использование синхронизации + + Object.defineProperty(permit, 'sync', { + get: function get() { + return permit.use && window.lampa_settings.account_sync; + } + }); + + var network$9 = new Request(); + + function url$3() { + return Utils$1.protocol() + object$2.cub_domain + '/api/'; + } + + function load$3(path) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var post = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + return new Promise(function (resolve, reject) { + if (permit.token) { + var account = permit.account; + Arrays.extend(params, { + headers: { + token: account.token, + profile: account.profile.id + }, + timeout: 8000 + }); + var u = params.url ? params.url : url$3() + path; + network$9.silent(u, resolve, reject, post, params); + } else { + reject({ + decode_code: 403 + }); + } + }); + } + + function persons(secuses, error) { + if (permit.access && !window.lampa_settings.disable_features.persons) { + load$3('person/list').then(function (data) { + Storage.set('person_subscribes_id', data.results.map(function (a) { + return a.person_id; + })); + if (secuses) secuses(data.results); + })["catch"](error ? error : function () {}); + } else if (error) error({ + decode_code: 403 + }); + } + + function user(secuses, error) { + if (permit.access) { + load$3('users/get').then(function (data) { + Storage.set('account_user', JSON.stringify(data.user)); + if (secuses) secuses(data.user); + })["catch"](error ? error : function () {}); + } else if (error) error({ + decode_code: 403 + }); + } + + function plugins(call) { + if (permit.access) { + load$3('plugins/all', { + timeout: 3000 + }).then(function (result) { + if (result.secuses) { + Storage.set('account_plugins', result.plugins); + call(result.plugins); + } else { + call(Storage.get('account_plugins', '[]')); + } + })["catch"](function () { + call(Storage.get('account_plugins', '[]')); + }); + } else call([]); + } + + function pluginToggle(plugin, status) { + if (permit.access) { + load$3((plugin.author ? 'extensions' : 'plugins') + '/status', {}, { + id: plugin.id, + status: status + })["catch"](function () {}); + } + } + + function notices(call) { + if (permit.sync) { + load$3('notice/all', { + cache: 1000 * 60 * 10 + }).then(function (result) { + if (result.secuses) { + Storage.set('account_notice', result.notice.map(function (n) { + return n; + })); + call(result.notice); + } else call([]); + })["catch"](function () { + call([]); + }); + } else call([]); + } + + function subscribes() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var secuses = arguments.length > 1 ? arguments[1] : undefined; + var error = arguments.length > 2 ? arguments[2] : undefined; + + if (permit.sync) { + load$3('notifications/all').then(function (result) { + if (params.to_card_subscribe) { + var cards = []; + result.notifications.forEach(function (n) { + var card = Arrays.decodeJson(n.card, {}); + card.subscribe = n; + delete card.subscribe.card; + cards.push(card); + }); + secuses({ + results: cards + }); + } else { + secuses({ + results: result.notifications.map(function (r) { + return Arrays.decodeJson(r.card, {}); + }) + }); + } + })["catch"](error ? error : function () {}); + } else if (error) error({ + decode_code: 403 + }); + } + + function subscribeToTranslation() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var call = arguments.length > 1 ? arguments[1] : undefined; + var error = arguments.length > 2 ? arguments[2] : undefined; + + if (permit.sync && params.voice) { + load$3('notifications/add', {}, { + voice: params.voice, + data: JSON.stringify(Utils$1.clearCard(params.card)), + episode: params.episode, + season: params.season + }).then(function (result) { + if (result.limited) showLimitedAccount();else if (call) call(); + })["catch"](error ? error : function () {}); + } else if (error) error({ + decode_code: 403 + }); + } + + var Api$1 = { + url: url$3, + load: load$3, + user: user, + persons: persons, + plugins: plugins, + pluginToggle: pluginToggle, + subscribes: subscribes, + notices: notices, + subscribeToTranslation: subscribeToTranslation, + clear: network$9.clear + }; + + /** + * Трекер синхронизации + * @class + * @param {string} name - имя трекера + * @returns {Tracker} + */ + + var Tracker = /*#__PURE__*/function () { + function Tracker(name) { + _classCallCheck(this, Tracker); + + this.name = name; + } + /** + * Получить трекеры синхронизации + * @return {object} - {time, version} + */ + + + _createClass(Tracker, [{ + key: "get", + value: function get() { + return Storage.get(this.name + '_' + this.profile(), JSON.stringify({ + time: 0, + version: 0 + })); + } + /** + * Сохранить трекеры синхронизации + * @param {object} data - {time, version} + * @return {void} + */ + + }, { + key: "set", + value: function set(data) { + Storage.set(this.name + '_' + this.profile(), data); + } + /** + * Обновить трекеры синхронизации + * @param {object} data - {time, version} + * @return {void} + */ + + }, { + key: "update", + value: function update(data) { + var traker = this.get(); + traker.time = data.time; + traker.version = data.version; + this.set(traker); + } + /** + * Получить ID профиля + * @returns {number} + */ + + }, { + key: "profile", + value: function profile() { + return permit.token ? permit.account.profile.id : 0; + } + /** + * Получить версию последней синхронизации + * @returns {number} + */ + + }, { + key: "version", + value: function version() { + return this.get().version || 0; + } + /** + * Получить время последней синхронизации + * @returns {number} + */ + + }, { + key: "time", + value: function time() { + return this.get().time || 0; + } + }]); + + return Tracker; + }(); + + var tracker$1 = new Tracker('account_timeline_sync'); + + function init$Z() { + Storage.listener.follow('change', function (e) { + if (e.name == 'account_use' || e.name == 'account') refrash(); + }); + Socket.listener.follow('open', function () { + if (Date.now() - window.app_time_end > 1000 * 60 * 5) update$d(); + }); + } + /** + * Обновить трекер и таймлайн, если сменился профиль или вошли в аккаунт + * @returns {void} + */ + + + function refrash() { + tracker$1.update({ + version: 0, + time: 0 + }); + update$d(); + } + /** + * Обновить таймлайн + * @returns {void} + */ + + + function update$d() { + if (permit.sync) { + // Если с момента последнего обновления прошло больше 10 дней, то загружаем дамп + if (tracker$1.time() < Date.now() - 1000 * 60 * 60 * 24 * 10) { + console.log('Account', 'timeline start full update', tracker$1.version()); + Api$1.load('timeline/dump', { + dataType: 'text' + }).then(function (result) { + // Парсим текст в массив + AppWorker.json({ + type: 'parse', + data: result + }, function (e) { + if (!data.timelines) { + return console.error('Account', 'timeline wrong dump format, no timelines'); + } + + var data = e.data; + var name = 'file_view_' + permit.account.profile.id; // Если нет файла в localStorage, то создаем его из кеша + + if (window.localStorage.getItem(name) === null) { + Storage.set(name, JSON.stringify(Storage.cache('file_view', 10000, {}))); + } + + var viewed = Storage.cache(name, 10000, {}); + + for (var i in data.timelines) { + var time = data.timelines[i]; + viewed[i] = time; + Arrays.extend(viewed[i], { + duration: 0, + time: 0, + percent: 0 + }); + delete viewed[i].hash; + } + + Storage.set(name, viewed, false, function () { + // Наверно закончилось место в localStorage, тогда сбрасываем версию на следующее обновление + tracker$1.update({ + version: 0, + time: 0 + }); + console.log('Account', 'timeline dump error, not saved to storage, try again next update'); + }); + tracker$1.update({ + version: data.version, + time: Date.now() + }); + Timeline.read(); // Нужно прочитать прогресс просмотра из localStorage + + console.log('Account', 'timeline dump update complete to version', data.version); + }); + })["catch"](function () { + console.error('Account', 'timeline dump error, not loaded'); + }); + } // Иначе получаем только изменения с последней версии + else { + console.log('Account', 'timeline start update since', tracker$1.version()); + Api$1.load('timeline/changelog?since=' + tracker$1.version()).then(function (result) { + for (var i in result.timelines) { + var time = result.timelines[i]; + time.received = true; // Чтоб снова не отправлять и не зациклить + + Timeline.update(time); + } + + tracker$1.update({ + version: result.version || tracker$1.version(), + time: Date.now() + }); + console.log('Account', 'timeline update since complete to version', tracker$1.version()); + })["catch"](function (e) { + console.warn('Account', 'timeline update changelog error, no response', e); + }); + } + } // Если вышли из аккаунта, то повторно прочитываем прогресс просмотра из localStorage + else Timeline.read(); + } + + var Timeline$1 = { + init: Utils$1.onceInit(init$Z), + update: update$d + }; + + var rows = []; + + function add$d(row) { + if (_typeof(row) == 'object' && typeof row.call == 'function') { + if (rows.indexOf(row) == -1) { + rows.push(row); + } + } else { + console.warn('Content row must be an object with a call function', row); + } + } + + function remove$3(row) { + var index = rows.indexOf(row); + + if (index > -1) { + rows.splice(index, 1); + } + } + + function call$1(screen, params, calls) { + var stop = ['genres', 'keywords']; + if (stop.find(function (a) { + return params[a]; + })) return; + rows.filter(function (row) { + return row.screen ? Arrays.isArray(row.screen) ? row.screen.indexOf(screen) >= 0 : row.screen == screen : false; + }).forEach(function (row) { + var result = row.call(params, screen); + + if (Arrays.isArray(result)) { + result.forEach(function (callback, i) { + if (typeof callback == 'function') { + Arrays.insert(calls, (row.index || 0) + i, callback); + } + }); + } else if (typeof result == 'function') { + Arrays.insert(calls, row.index || 0, result); + } + }); + } + + var ContentRows = { + add: add$d, + remove: remove$3, + call: call$1 + }; + + var broken_images = 0; + + function proxy(name) { + var proxy = Storage.field(name); + + if (proxy.length > 0 && proxy.charAt(proxy.length - 1) == '/') { + proxy = proxy.substring(0, proxy.length - 1); + } + + return Utils$1.checkHttp(proxy); + } + + function api$1(url) { + var base = Utils$1.protocol() + 'api.themoviedb.org/3/' + url; + return Storage.field('proxy_tmdb') && Storage.field('tmdb_proxy_api') ? proxy('tmdb_proxy_api') + '/' + base : base; + } + + function image(url) { + var base = Utils$1.protocol() + 'image.tmdb.org/' + url; + return Storage.field('proxy_tmdb') && Storage.field('tmdb_proxy_image') ? proxy('tmdb_proxy_image') + '/' + base : base; + } + + function broken() { + broken_images++; + + if (broken_images > 50) { + broken_images = 0; + if (Storage.field('tmdb_proxy_image') && Storage.field('proxy_tmdb_auto')) Storage.set('proxy_tmdb', true); + } + } + + function key() { + return '4ef0d7355d9ffb5151e987764708ce96'; + } + + var TMDB$1 = { + api: api$1, + key: key, + image: image, + broken: broken + }; + + var data$3 = {}; + data$3.type = { + title: '#{title_type}', + items: [{ + title: '#{menu_movies}', + selected: true, + cat: 'movie' + }, { + title: '#{menu_multmovie}', + cat: 'multmovie' + }, { + title: '#{menu_tv}', + cat: 'tv' + }, { + title: '#{menu_multtv}', + cat: 'multtv' + }, { + title: '#{menu_anime}', + cat: 'anime' + }] + }; + data$3.rating = { + title: '#{title_rating}', + items: [{ + title: '#{filter_any}' + }, { + title: '#{filter_rating_from} 8', + start: 8 + }, { + title: '#{filter_rating_from} 6', + start: 6 + }, { + title: '#{filter_rating_from} 4', + start: 4 + }, { + title: '#{filter_rating_from} 2', + start: 2 + }, { + title: '#{filter_rating_from} 1 #{filter_rating_to} 3', + voite: '1-3' + }, { + title: '#{filter_rating_from} 3 #{filter_rating_to} 6', + voite: '3-6' + }, { + title: '#{filter_rating_from} 6 #{filter_rating_to} 8', + voite: '6-8' + }, { + title: '#{filter_rating_from} 8 #{filter_rating_to} 9', + voite: '8-9' + }] + }; + data$3.pgrating = { + title: '#{title_pgrating}', + items: [{ + title: '#{filter_any}' + }] + }; + data$3.language = { + title: '#{title_language}', + items: [{ + title: '#{filter_lang_ru}', + code: 'ru' + }, { + title: '#{filter_lang_uk}', + code: 'uk' + }, { + title: '#{filter_lang_en}', + code: 'en' + }, { + title: '#{filter_lang_be}', + code: 'be' + }, { + title: '#{filter_lang_zh}', + code: 'zh|cn' + }, { + title: '#{filter_lang_ja}', + code: 'ja' + }, { + title: '#{filter_lang_ko}', + code: 'ko' + }, { + title: '#{filter_lang_af}', + code: 'af' + }, { + title: '#{filter_lang_sq}', + code: 'sq' + }, { + title: '#{filter_lang_ar}', + code: 'ar' + }, { + title: '#{filter_lang_az}', + code: 'az' + }, { + title: '#{filter_lang_hy}', + code: 'hy' + }, { + title: '#{filter_lang_ba}', + code: 'ba' + }, { + title: '#{filter_lang_bg}', + code: 'bg' + }, { + title: '#{filter_lang_bn}', + code: 'bn' + }, { + title: '#{filter_lang_bs}', + code: 'bs' + }, { + title: '#{filter_lang_ca}', + code: 'ca' + }, { + title: '#{filter_lang_ce}', + code: 'ce' + }, { + title: '#{filter_lang_cs}', + code: 'cs' + }, { + title: '#{filter_lang_da}', + code: 'da' + }, { + title: '#{filter_lang_ka}', + code: 'ka' + }, { + title: '#{filter_lang_de}', + code: 'de' + }, { + title: '#{filter_lang_el}', + code: 'el' + }, { + title: '#{filter_lang_es}', + code: 'es' + }, { + title: '#{filter_lang_et}', + code: 'et' + }, { + title: '#{filter_lang_fa}', + code: 'fa' + }, { + title: '#{filter_lang_fi}', + code: 'fi' + }, { + title: '#{filter_lang_fr}', + code: 'fr' + }, { + title: '#{filter_lang_ga}', + code: 'ga' + }, { + title: '#{filter_lang_gl}', + code: 'gl' + }, { + title: '#{filter_lang_gn}', + code: 'gn' + }, { + title: '#{filter_lang_he}', + code: 'he' + }, { + title: '#{filter_lang_hi}', + code: 'hi' + }, { + title: '#{filter_lang_hr}', + code: 'hr' + }, { + title: '#{filter_lang_hu}', + code: 'hu' + }, { + title: '#{filter_lang_id}', + code: 'id' + }, { + title: '#{filter_lang_is}', + code: 'is' + }, { + title: '#{filter_lang_it}', + code: 'it' + }, { + title: '#{filter_lang_kk}', + code: 'kk' + }, { + title: '#{filter_lang_ks}', + code: 'ks' + }, { + title: '#{filter_lang_ku}', + code: 'ku' + }, { + title: '#{filter_lang_ky}', + code: 'ky' + }, { + title: '#{filter_lang_lt}', + code: 'lt' + }, { + title: '#{filter_lang_lv}', + code: 'lv' + }, { + title: '#{filter_lang_mi}', + code: 'mi' + }, { + title: '#{filter_lang_mk}', + code: 'mk' + }, { + title: '#{filter_lang_mn}', + code: 'mn' + }, { + title: '#{filter_lang_mo}', + code: 'mo' + }, { + title: '#{filter_lang_mt}', + code: 'mt' + }, { + title: '#{filter_lang_no}', + code: 'no|nb|nn' + }, { + title: '#{filter_lang_ne}', + code: 'ne' + }, { + title: '#{filter_lang_nl}', + code: 'nl' + }, { + title: '#{filter_lang_pa}', + code: 'pa' + }, { + title: '#{filter_lang_pl}', + code: 'pl' + }, { + title: '#{filter_lang_ps}', + code: 'ps' + }, { + title: '#{filter_lang_pt}', + code: 'pt' + }, { + title: '#{filter_lang_ro}', + code: 'ro' + }, { + title: '#{filter_lang_si}', + code: 'si' + }, { + title: '#{filter_lang_sk}', + code: 'sk' + }, { + title: '#{filter_lang_sl}', + code: 'sl' + }, { + title: '#{filter_lang_sm}', + code: 'sm' + }, { + title: '#{filter_lang_so}', + code: 'so' + }, { + title: '#{filter_lang_sr}', + code: 'sr' + }, { + title: '#{filter_lang_sv}', + code: 'sv' + }, { + title: '#{filter_lang_sw}', + code: 'sw' + }, { + title: '#{filter_lang_ta}', + code: 'ta' + }, { + title: '#{filter_lang_tg}', + code: 'tg' + }, { + title: '#{filter_lang_th}', + code: 'th' + }, { + title: '#{filter_lang_tk}', + code: 'tk' + }, { + title: '#{filter_lang_tr}', + code: 'tr' + }, { + title: '#{filter_lang_tt}', + code: 'tt' + }, { + title: '#{filter_lang_ur}', + code: 'ur' + }, { + title: '#{filter_lang_uz}', + code: 'uz' + }, { + title: '#{filter_lang_vi}', + code: 'vi' + }, { + title: '#{filter_lang_yi}', + code: 'yi' + }] + }; + data$3.genres_movie = { + title: '#{title_genre}', + items: [{ + "id": 28, + "title": "#{filter_genre_ac}", + checkbox: true + }, { + "id": 12, + "title": "#{filter_genre_ad}", + checkbox: true + }, { + "id": 16, + "title": "#{filter_genre_mv}", + checkbox: true + }, { + "id": 35, + "title": "#{filter_genre_cm}", + checkbox: true + }, { + "id": 80, + "title": "#{filter_genre_cr}", + checkbox: true + }, { + "id": 99, + "title": "#{filter_genre_dc}", + checkbox: true + }, { + "id": 18, + "title": "#{filter_genre_dr}", + checkbox: true + }, { + "id": 10751, + "title": "#{filter_genre_fm}", + checkbox: true + }, { + "id": 14, + "title": "#{filter_genre_fe}", + checkbox: true + }, { + "id": 36, + "title": "#{filter_genre_hi}", + checkbox: true + }, { + "id": 27, + "title": "#{filter_genre_ho}", + checkbox: true + }, { + "id": 10402, + "title": "#{filter_genre_mu}", + checkbox: true + }, { + "id": 9648, + "title": "#{filter_genre_de}", + checkbox: true + }, { + "id": 10749, + "title": "#{filter_genre_md}", + checkbox: true + }, { + "id": 878, + "title": "#{filter_genre_fa}", + checkbox: true + }, { + "id": 10770, + "title": "#{filter_genre_tv}", + checkbox: true + }, { + "id": 53, + "title": "#{filter_genre_tr}", + checkbox: true + }, { + "id": 10752, + "title": "#{filter_genre_mi}", + checkbox: true + }, { + "id": 37, + "title": "#{filter_genre_ve}", + checkbox: true + }] + }; + data$3.genres_tv = { + title: '#{title_genre}', + items: [{ + "id": 10759, + "title": "#{filter_genre_aa}", + checkbox: true + }, { + "id": 16, + "title": "#{filter_genre_mv}", + checkbox: true + }, { + "id": 35, + "title": "#{filter_genre_cm}", + checkbox: true + }, { + "id": 80, + "title": "#{filter_genre_cr}", + checkbox: true + }, { + "id": 99, + "title": "#{filter_genre_dc}", + checkbox: true + }, { + "id": 18, + "title": "#{filter_genre_dr}", + checkbox: true + }, { + "id": 10751, + "title": "#{filter_genre_fm}", + checkbox: true + }, { + "id": 10762, + "title": "#{filter_genre_ch}", + checkbox: true + }, { + "id": 9648, + "title": "#{filter_genre_de}", + checkbox: true + }, { + "id": 10763, + "title": "#{filter_genre_nw}", + checkbox: true + }, { + "id": 10764, + "title": "#{filter_genre_rs}", + checkbox: true + }, { + "id": 10765, + "title": "#{filter_genre_hf}", + checkbox: true + }, { + "id": 10766, + "title": "#{filter_genre_op}", + checkbox: true + }, { + "id": 10767, + "title": "#{filter_genre_tc}", + checkbox: true + }, { + "id": 10768, + "title": "#{filter_genre_mp}", + checkbox: true + }, { + "id": 37, + "title": "#{filter_genre_ve}", + checkbox: true + }] + }; + data$3.sort = { + title: '#{filter_sorted}', + items: [{ + title: '#{filter_any}' + }, { + title: '#{title_new}', + sort: 'now' + }, { + title: '#{title_now_watch}', + sort: 'now_playing' + }, { + title: '#{title_in_top}', + sort: 'top' + }, { + title: '#{title_ongoing}', + sort: 'airing' + }] + }; + data$3.quality = { + title: '#{player_quality}', + items: [{ + title: '#{filter_any}' + }, { + title: '#{title_in_high_quality}', + uhd: true + }] + }; + data$3.year = { + title: '#{title_year}', + items: [{ + title: '#{filter_any}', + any: true + }] + }; + var i = 100, + y = new Date().getFullYear(); + + for (var a = 0; a < 5; a++) { + data$3.year.items.push({ + title: y - a + }); + } + + while (i -= 5) { + var end = y - (99 - i); + data$3.year.items.push({ + title: end + 5 + '-' + end + }); + } + + for (var _a = 18; _a >= 0; _a -= 3) { + data$3.pgrating.items.push({ + title: _a + '+', + pg: _a + }); + } + + for (var _a2 = 15; _a2 >= 0; _a2 -= 3) { + data$3.pgrating.items.push({ + title: '#{filter_rating_from} ' + _a2 + ' #{filter_rating_to} ' + (_a2 + 3), + pg: _a2 + '-' + (_a2 + 3) + }); + } + + data$3.language.items.forEach(function (i) { + return i.checkbox = true; + }); + + /** + * Главное меню фильтрации + */ + + function main$3() { + for (var i in data$3) { + selected$1(data$3[i]); + } + + var cat = data$3.type.items.find(function (s) { + return s.selected; + }).cat; + var type = cat.indexOf('movie') >= 0 ? 'movie' : 'tv'; + var items = [{ + title: Lang$1.translate('search_start'), + search: true + }, data$3.type, data$3.rating, data$3['genres_' + type], data$3.language, data$3.year]; + if (Storage.field('source') == 'cub') items.push(data$3.pgrating, data$3.sort, data$3.quality); + items.forEach(function (itm) { + itm.title = Lang$1.translate(itm.title); + if (itm.subtitle) itm.subtitle = Lang$1.translate(itm.subtitle); + + if (itm.items) { + itm.items.forEach(function (inr) { + inr.title = Lang$1.translate(inr.title); + }); + } + }); + Select.show({ + title: Lang$1.translate('title_filter'), + items: items, + onBack: function onBack() { + Controller.toggle('content'); + }, + onSelect: function onSelect(a) { + if (a.search) search$6();else submenu(a); + } + }); + } + /** + * Запрос для TMDB + * @returns {string} - строка запроса + */ + + + function queryForTMDB() { + var query = []; + var cat = data$3.type.items.find(function (s) { + return s.selected; + }).cat; + var type = cat.indexOf('movie') >= 0 ? 'movie' : 'tv'; + var genres = []; + var languages = []; + data$3.rating.items.forEach(function (a) { + if (a.selected && (a.voite || a.start)) { + if (a.start) { + query.push('vote_average.gte=' + a.start); + } else { + query.push('vote_average.gte=' + a.voite.split('-')[0]); + query.push('vote_average.lte=' + a.voite.split('-')[1]); + } + } + }); + data$3.language.items.forEach(function (a) { + if (a.checked) languages.push(a.code); + }); + data$3.year.items.forEach(function (a) { + if (a.selected && !a.any) { + var need = type == 'movie' ? 'primary_release_date' : 'first_air_date'; + + if (a.title.indexOf('-') >= 0) { + query.push(need + '.lte=' + a.title.split('-')[0] + '-12-31'); + query.push(need + '.gte=' + a.title.split('-')[1] + '-01-01'); + } else { + query.push((type == 'movie' ? 'primary_release_year' : 'first_air_date_year') + '=' + a.title); + } + } + }); + data$3['genres_' + type].items.forEach(function (a) { + if (a.checked) genres.push(a.id); + }); + if (cat == 'multmovie' || cat == 'multtv' && genres.indexOf(16) == -1) genres.push(16); + if (cat == 'movie' || cat == 'tv') query.push('without_genres=16'); + + if (genres.length) { + query.push('with_genres=' + genres.join(',')); + } + + if (cat == 'anime' && languages.indexOf('ja') == -1) languages.push('ja'); + + if (languages.length) { + query.push('with_original_language=' + languages.join('|')); + } + + return 'discover/' + type + '?' + query.join('&'); + } + /** + * Запрос для CUB + * @returns {string} - строка запроса + */ + + + function queryForCUB() { + var query = []; + var cat = data$3.type.items.find(function (s) { + return s.selected; + }).cat; + var type = cat.indexOf('movie') >= 0 ? 'movie' : 'tv'; + var genres = []; + var sort = data$3.sort.items.find(function (s) { + return s.selected && s.sort; + }); + var quality = data$3.quality.items.find(function (s) { + return s.selected && s.uhd; + }); + var languages = []; + data$3.rating.items.forEach(function (a) { + if (a.selected && (a.voite || a.start)) { + if (a.start) { + query.push('vote=' + a.start); + } else { + query.push('vote=' + a.voite.split('-')[0] + '-' + a.voite.split('-')[1]); + } + } + }); + data$3.language.items.forEach(function (a) { + if (a.checked) languages.push(a.code.split('|')[0]); + }); + data$3.year.items.forEach(function (a) { + if (a.selected && !a.any) { + if (a.title.indexOf('-') >= 0) { + query.push('airdate=' + a.title.split('-')[1] + '-' + a.title.split('-')[0]); + } else { + query.push('airdate=' + a.title); + } + } + }); + data$3.pgrating.items.forEach(function (a) { + if (a.selected) { + if (a.title.indexOf('-') >= 0) { + query.push('pgrating=' + a.pg.split('-')[0] + '-' + a.pg.split('-')[1]); + } else { + query.push('pgrating=' + a.pg); + } + } + }); + data$3['genres_' + type].items.forEach(function (a) { + if (a.checked) genres.push(a.id); + }); + if (cat == 'multmovie' || cat == 'multtv' && genres.indexOf(16) == -1) genres.push(16); + if (cat == 'movie' || cat == 'tv') query.push('without_genres=16'); + + if (genres.length) { + query.push('genre=' + genres.join(',')); + } + + if (cat == 'anime') type = 'anime'; + + if (languages.length) { + query.push('language=' + languages.join(',')); + } + + if (sort) query.push('sort=' + sort.sort); + if (quality) query.push('uhd=true'); + return '?cat=' + type + '&' + query.join('&'); + } + /** + * Запуск поиска + */ + + + function search$6() { + Controller.toggle('content'); + var source = Storage.field('source'); + var query = source == 'cub' ? queryForCUB() : queryForTMDB(); + var activity = { + url: query, + title: Lang$1.translate('title_filter'), + component: 'category_full', + source: source == 'cub' ? 'cub' : 'tmdb', + card_type: true, + page: 1 + }; + var object = Activity.active(); + if (object.component == 'category_full' && (object.url.indexOf('discover') == 0 || object.url.indexOf('?cat=') == 0)) Activity.replace(activity, true);else Activity.push(activity); + } + /** + * Выбор элемента + * @param {Array} where - массив элементов + * @param {Object} a - выбранный элемент + */ + + + function select$3(where, a) { + where.forEach(function (element) { + element.selected = false; + }); + a.selected = true; + } + /** + * Обновление подзаголовка + * @param {Object} where - объект с массивом items + */ + + + function selected$1(where) { + var title = []; + where.items.forEach(function (a) { + if (a.selected || a.checked) title.push(a.title); + }); + where.subtitle = title.length ? title.join(', ') : Lang$1.translate('nochoice'); + } + /** + * Подменю + * @param {Object} item - объект элемента + */ + + + function submenu(item) { + Select.show({ + title: item.title, + items: item.items, + onBack: main$3, + onSelect: function onSelect(a) { + select$3(item.items, a); + main$3(); + } + }); + } + /** + * Запуск фильтра + */ + + + function show$8() { + main$3(); + } + + var Filter$1 = { + show: show$8 + }; + + var components$1 = {}; + var params$2 = {}; + /** + * Добавить компонент + * @param {{component:string, icon:string, name:string}} data + */ + + function addComponent(data) { + components$1[data.component] = data; + Template.add('settings_' + data.component, '
'); + } + /** + * Получить компонент + * @param {string} component + * @returns {{component:string, icon:string, name:string}} + */ + + + function getComponent(component) { + return components$1[component]; + } + /** + * Удалить компонент + * @param {string} component + */ + + + function removeComponent(component) { + delete components$1[component]; + delete params$2[component]; + } + /** + * Добавить параметр + * @param {{component:string, param:{name:string, type:string, values:string|object, default:string|boolean}, field:{name:string, description:string|undefined}, onRender:((item)=>void)|undefined, onChange?:((e)=>void)|undefined}} data + */ + + + function addParam(data) { + if (!params$2[data.component]) params$2[data.component] = []; + params$2[data.component].push(data); + if (data.param.type == 'select' || data.param.type == 'input') Params.select(data.param.name, data.param.values, data.param["default"]); + if (data.param.type == 'trigger') Params.trigger(data.param.name, data.param["default"]); + } + /** + * Получить параметры + * @param {string} component + * @returns {[{component:string, param:{name:string, type:string, values:string|object, default:string|boolean}, field:{name:string, description:string|undefined}, onRender:((item)=>void)|undefined, onChange?:((e)=>void)|undefined}]} + */ + + + function getParam(component) { + return params$2[component]; + } + /** + * Получить все компоненты + * @returns {{name:{component:string, icon:string, name:string}}} + */ + + + function allComponents() { + return components$1; + } + /** + * Получить все параметры + * @returns {{component:[{component:string, param:{name:string, type:string, values:string|object, default:string|boolean}, field:{name:string, description:string|undefined}, onRender:((item)=>void)|undefined, onChange?:((e)=>void)|undefined}]}} + */ + + + function allParams() { + return params$2; + } + + var SettingsApi = { + allComponents: allComponents, + allParams: allParams, + addComponent: addComponent, + addParam: addParam, + getComponent: getComponent, + removeComponent: removeComponent, + getParam: getParam + }; + + function Component$2(name) { + var component_params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var scrl = new Scroll({ + mask: true, + over: true, + step: 200 + }); + var comp = Template.get('settings_' + name); + var last; + scrl.addSwipeDown(function () { + Controller.back(); + }); + /** + * Обновить скролл + */ + + function updateScroll() { + comp.find('.selector').unbind('hover:focus').on('hover:focus', function (e) { + last = e.target; + scrl.update($(e.target), true); + }).unbind('hover:hover hover:touch').on('hover:hover hover:touch', function (e) { + last = e.target; + }); + } + /** + * Билдим все события + */ + + + function buildEvents() { + if (!Platform.is('android')) { + comp.find('.is--android').remove(); + } + + if (!Platform.any()) { + comp.find('.is--player').remove(); + } + + if (!Platform.desktop() || Platform.macOS()) { + comp.find('.is--nw').remove(); + } + + if (!(Platform.is('android') || Platform.is('browser') || Platform.is('apple_tv') || Platform.desktop())) { + comp.find('.is--sound').remove(); + } + + if (!window.lampa_settings.lang_use) comp.find('[data-name="light_version"]').prev().remove(); + scrl.render().find('.scroll__content').addClass('layer--wheight').data('mheight', $('.settings__head')); + scrl.render().css('max-height', window.innerWidth <= 480 ? window.innerHeight * 0.6 : 'unset'); + Params.bind(comp.find('.selector'), comp); + Params.listener.follow('update_scroll', updateScroll); + Params.listener.follow('update_scroll_position', function () { + if (last) scrl.update(last, true); + }); + updateScroll(); + } + /** + * Добавляем пользовательские параметры + */ + + + function addParams() { + var params = SettingsApi.getParam(name); + + if (params) { + params.forEach(function (data) { + var item; + + if (data.param.type == 'select') { + item = $("
\n
").concat(data.field.name, "
\n
\n
")); + } + + if (data.param.type == 'trigger') { + item = $("
\n
").concat(data.field.name, "
\n
\n
")); + } + + if (data.param.type == 'input') { + item = $("
\n
").concat(data.field.name, "
\n
\n
")); + } + + if (data.param.type == 'title') { + item = $("
".concat(data.field.name, "
")); + } + + if (data.param.type == 'static') { + item = $("
\n
".concat(data.field.name, "
\n
")); + } + + if (data.param.type == 'button') { + item = $("
\n
").concat(data.field.name, "
\n
")); + } + + if (item) { + if (data.field.description) item.append("
".concat(data.field.description, "
")); + if (typeof data.onRender == 'function') data.onRender(item); + if (typeof data.onChange == 'function') item.data('onChange', data.onChange); + comp.append(item); + } + }); + } + } + /** + * Стартуем + */ + + + function start() { + addParams(); + buildEvents(); + if (typeof component_params.last_index !== 'undefined' && component_params.last_index > 0) last = comp.find('.selector').eq(component_params.last_index)[0]; + Controller.add('settings_component', { + toggle: function toggle() { + Controller.collectionSet(comp); + Controller.collectionFocus(last, comp); + }, + up: function up() { + Navigator.move('up'); + }, + down: function down() { + Navigator.move('down'); + }, + back: function back() { + scrl.destroy(); + comp.remove(); + Params.listener.remove('update_scroll', updateScroll); + if (component_params.onBack) component_params.onBack();else Controller.toggle('settings'); + } + }); + } + + start(); + /** + * Уничтожить + */ + + this.destroy = function () { + scrl.destroy(); + comp.remove(); + comp = null; + Params.listener.remove('update_scroll', updateScroll); + }; + /** + * Рендер + * @returns {object} + */ + + + this.render = function () { + scrl.append(comp); + return scrl.render(); + }; + } + + function Main$2() { + var _this = this; + + var comp; + var scrl = new Scroll({ + mask: true, + over: true, + step: 200 + }); + var last; + /** + * Создать + */ + + this.create = function () { + comp = Template.get('settings_main'); + if (!window.lampa_settings.account_use) comp.find('[data-component="account"]').remove(); + if (!window.lampa_settings.plugins_use) comp.find('[data-component="plugins"]').remove(); + + if (!window.lampa_settings.torrents_use) { + comp.find('[data-component="parser"]').remove(); + comp.find('[data-component="server"]').remove(); + } + + scrl.render().css('max-height', window.innerWidth <= 480 ? window.innerHeight * 0.6 : 'unset'); + scrl.append(comp); + scrl.addSwipeDown(_this.swipeAction); + + _this.update(); + }; + /** + * Обновить события + */ + + + this.update = function () { + var components = SettingsApi.allComponents(); + + for (var name in components) { + var aded = components[name]; + + if (!comp.find('[data-component="' + name + '"]').length) { + var item = $("
\n
\n ").concat(aded.icon, "\n
\n
").concat(aded.name, "
\n
")); + if (aded.before) comp.find('[data-component="' + aded.before + '"]').before(item);else if (aded.after) comp.find('[data-component="' + aded.after + '"]').after(item);else comp.append(item); + } + } + + comp.find('.selector').unbind('hover:focus').on('hover:focus', function (event) { + last = event.target; + scrl.update($(event.target), true); + }).unbind('hover:hover hover:touch').on('hover:hover hover:touch', function (event) { + last = event.target; + Navigator.focused(event.target); + }).not('[data-static]').unbind('hover:enter').on('hover:enter', function (event) { + _this.render().detach(); + + _this.onCreate($(event.target).data('component')); + }); + }; + /** + * Сделать активным + */ + + + this.active = function () { + Controller.collectionSet(comp); + Controller.collectionFocus(last, comp); + scrl.height($('.settings__head')); + }; + /** + * Рендер + * @returns {object} + */ + + + this.render = function () { + return scrl.render(); + }; + } + + var html$h; + var body$1; + var listener$c = Subscribe$2(); + var last$4 = ''; + + var _main; + /** + * Инициализация настроек + * @returns {void} + */ + + + function init$Y() { + html$h = Template.get('settings'); + body$1 = html$h.find('.settings__body'); + html$h.find('.settings__layer').on('click', function (e) { + if (DeviceInput.canClick(e.originalEvent)) Controller.back(); + }); + _main = new Main$2(); + _main.onCreate = create$7; + _main.swipeAction = swipeAction; + + _main.create(); + + Controller.add('settings', { + toggle: function toggle() { + _main.render().detach(); + + _main.update(); + + listener$c.send('open', { + name: 'main', + body: _main.render() + }); + body$1.empty().append(_main.render()); + + _main.active(); + + $('body').toggleClass('settings--open', true); + html$h.addClass('animate'); + Activity.mixState('settings=main'); + }, + up: function up() { + Navigator.move('up'); + }, + down: function down() { + Navigator.move('down'); + }, + left: function left() { + _main.render().detach(); + + Controller.toggle('content'); + }, + gone: function gone(to) { + if (to !== 'settings_component') { + $('body').toggleClass('settings--open', false); + html$h.removeClass('animate').removeClass('animate-down'); + } + }, + back: function back() { + _main.render().detach(); + + Controller.toggle('head'); + Activity.mixState(); + } + }); + ParentalControl.add('settings', { + title: 'title_settings' + }); + Head.addIcon(Template.string('icon_settings'), function () { + ParentalControl.personal('settings', function () { + Controller.toggle('settings'); + }, false, true); + }).addClass('open--settings'); + } + + function swipeAction() { + html$h.addClass('animate-down'); + setTimeout(function () { + Controller.back(); + }, 200); + } + /** + * Создать компонент + * @param {string} name - имя компонента + * @returns {void} + */ + + + function create$7(name) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var comp = new Component$2(name, params); + body$1.empty().append(comp.render()); + listener$c.send('open', { + name: name, + body: comp.render(), + params: params + }); + last$4 = name; + Controller.toggle('settings_component'); + Activity.mixState('settings=' + name); + } + /** + * Обновить открытый компонент + * @returns {void} + */ + + + function update$c() { + var selects = body$1.find('.selector'); + var lastinx = selects.index(body$1.find('.selector.focus')); + create$7(last$4, { + last_index: lastinx + }); + } + /** + * Рендер + * @param {boolean} js - вернуть DOM-элемент или jQuery объект + * @returns {HTMLElement|jQuery} - DOM-элемент или jQuery объект + */ + + + function render$c(js) { + return js ? html$h[0] : html$h; + } + + var Settings = { + listener: listener$c, + init: init$Y, + render: render$c, + update: update$c, + create: create$7, + main: function main() { + return _main; + } + }; + + var already_requested = false; + var last_time_requested = 0; + var personal_codes = {}; + + function init$X() { + Params.trigger('parental_control', false); + Params.select('parental_control_time', { + 'always': '#{settings_parental_control_param_time_always}', + 'once': '#{settings_parental_control_param_time_once}', + '10': '#{settings_parental_control_param_time_10}', + '20': '#{settings_parental_control_param_time_20}', + '30': '#{settings_parental_control_param_time_30}', + '60': '#{settings_parental_control_param_time_60}', + '120': '#{settings_parental_control_param_time_120}' + }, 'once'); + Template.add('settings_parental_control', "
\n
\n
#{title_parental_control}
\n
\n
\n
\n
\n
#{settings_parental_control_change_pin}
\n
\n
\n
#{settings_parental_control_demand_title}
\n
\n
#{settings_parental_control_demand_descr}
\n
\n
\n
#{settings_parental_control_where}
\n
\n
\n
\n
"); + Settings.listener.follow('open', function (e) { + if (e.name == 'parental_control') { + var toggle = e.body.find('.parental-control-toggle'); + var change = e.body.find('.parental-control-change'); + var other = e.body.find('.parental-control-other'); + var active; + + var updateStatus = function updateStatus() { + toggle.find('.settings-param__value').text(Lang$1.translate(Storage.field('parental_control') ? 'settings_parental_control_enabled' : 'settings_parental_control_disabled')); + other.toggleClass('hide', !Boolean(Storage.field('parental_control'))); + }; + + var drawPersonalList = function drawPersonalList() { + var enabled = Storage.get('parental_control_personal', '[]'); + var list = e.body.find('.parental-control-personal-list'); + + var item = function item(name, data) { + var line = $("
\n
".concat(Lang$1.translate(data.title), "
\n
\n
")); + if (enabled.indexOf(name) >= 0) line.addClass('selectbox-item--checked'); + line.on('hover:enter', function () { + active = Controller.enabled().name; + query(function () { + enabled = Storage.get('parental_control_personal', '[]'); + + if (enabled.indexOf(name) >= 0) { + Arrays.remove(enabled, name); + Storage.set('parental_control_personal', enabled); + line.removeClass('selectbox-item--checked'); + } else { + Storage.add('parental_control_personal', name); + line.addClass('selectbox-item--checked'); + } + + Controller.toggle(active); + }, function () { + Controller.toggle(active); + }); + }); + list.append(line); + }; + + for (var name in personal_codes) { + item(name, personal_codes[name]); + } + + Params.listener.send('update_scroll'); + }; + + toggle.on('hover:enter', function () { + active = Controller.enabled().name; + + if (Storage.field('parental_control')) { + request(function () { + Storage.set('parental_control', false); + updateStatus(); + Controller.toggle(active); + }, function () { + Controller.toggle(active); + }); + } else if (!Storage.value('parental_control_pin')) { + set$1(function (code) { + if (code) { + Storage.set('parental_control_pin', code); + Storage.set('parental_control', true); + updateStatus(); + } + }); + } else { + Storage.set('parental_control', true); + updateStatus(); + } + }); + change.on('hover:enter', function () { + active = Controller.enabled().name; + + if (Storage.value('parental_control_pin')) { + request(function () { + set$1(function (code) { + if (code) { + Storage.set('parental_control_pin', code); + } + + Controller.toggle(active); + }); + }, function () { + Controller.toggle(active); + }); + } + }); + updateStatus(); + drawPersonalList(); + } + }); + add$c('bookmarks', { + title: 'settings_input_links' + }); + } + /** + * Запрос на установку PIN-кода + * @param {function} call - вызов + */ + + + function set$1(call) { + var active = Controller.enabled().name; + pin(Lang$1.translate('parental_control_input_new_code'), function (code_one) { + if (code_one) { + pin(Lang$1.translate('parental_control_confirm_new_code'), function (code_two) { + if (code_one == code_two) { + Controller.toggle(active); + call(code_two); + } else { + Controller.toggle(active); + Noty.show(Lang$1.translate('parental_control_no_match_code')); + call(); + } + }); + } else { + Controller.toggle(active); + call(); + } + }); + } + /** + * Показать экран ввода пина + * @param {string} title - заголовок + * @param {function} call - вызов + */ + + + function pin(title, call) { + var input = ''; + var html_layer = $("
\n
\n
".concat(title, "
\n
\n
")); + var html_code = $("
\n
\n
\n
\n
\n
"); + + var drawPin = function drawPin() { + var div = html_code.find('div').removeClass('fill'); + + for (var i = 0; i < 4; i++) { + if (input[i]) div.eq(i).addClass('fill'); + } + }; + + var removeNum = function removeNum() { + input = input.slice(0, Math.max(0, input.length - 1)); + drawPin(); + if (!input) callClose(); + }; + + var callClose = function callClose() { + html_layer.remove(); + call(input); + }; + + if (Platform.tv()) { + var html_body = $("
\n
\n
\n ".concat(Lang$1.translate('pincode_use_remote'), "\n
\n
\n ").concat(Lang$1.translate('pincode_use_toggle'), "\n
\n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n
\n
\n
1
\n
\n
4
\n
0
\n
2
\n
\n
3
\n
\n
\n\n
\n
\n \n \n \n \n \n
\n
").concat(Lang$1.translate('settings_remove'), "
\n
\n
\n
\n
")); + html_body.find('.pincode__left').prepend(html_code); + html_layer.find('.pincode__container').append(html_body); + var layout_active = 0; + var layout_keys = [[1, 2, 3, 4, '0'], [5, 6, 7, 8, 9]]; + + var drawLayout = function drawLayout() { + var keys = layout_keys[layout_active]; + html_body.find('.pincode-remote__num-top span').text(keys[0]); + html_body.find('.pincode-remote__num-right span').text(keys[1]); + html_body.find('.pincode-remote__num-bottom span').text(keys[2]); + html_body.find('.pincode-remote__num-left span').text(keys[3]); + html_body.find('.pincode-remote__num-center span').text(keys[4]); + }; + + var animate = function animate() { + var elem = html_body.find('.pincode-remote').removeClass('push'); + setTimeout(function () { + elem.addClass('push'); + }, 60); + }; + + var writeNum = function writeNum(key) { + input = input + layout_keys[layout_active][key]; + drawPin(); + if (input.length == 4) callClose();else animate(); + }; + + drawLayout(); + Controller.add('parental_controll', { + toggle: function toggle() { + Controller.clear(); + }, + "long": function long() { + layout_active++; + if (layout_active >= layout_keys.length) layout_active = 0; + drawLayout(); + }, + enter: function enter() { + writeNum(4); + }, + left: function left() { + writeNum(3); + }, + up: function up() { + writeNum(0); + }, + down: function down() { + writeNum(2); + }, + right: function right() { + writeNum(1); + }, + back: function back() { + removeNum(); + } + }); + Lampa.Controller.toggle('parental_controll'); + } else { + html_layer.addClass('mobile'); + var html_keyboard = $("
\n
1
\n
2
\n
3
\n
4
\n
5
\n
6
\n
7
\n
8
\n
9
\n
0
\n
\n
\n \n \n \n \n
\n
"); + html_keyboard.find('[data-key]').on('hover:enter', function () { + input = input + $(this).data('key'); + drawPin(); + if (input.length == 4) callClose(); + }); + html_keyboard.find('.remove').on('hover:enter', removeNum); + html_layer.find('.pincode__container').append(html_code).append(html_keyboard); + Controller.add('parental_controll', { + toggle: function toggle() { + Controller.collectionSet(html_keyboard); + Controller.collectionFocus(false, html_keyboard); + }, + back: function back() { + input = ''; + call(''); + callClose(); + }, + up: function up() { + Navigator.move('up'); + }, + down: function down() { + Navigator.move('down'); + }, + left: function left() { + Navigator.move('left'); + }, + right: function right() { + Navigator.move('right'); + } + }); + Lampa.Controller.toggle('parental_controll'); + } + + if (Platform.mouse()) { + html_layer.prepend(HeadBackward('')); + } + + $('body').append(html_layer); + setTimeout(function () { + html_layer.addClass('animate'); + }, 100); + } + /** + * Устаревший метод, но все еще используется, + * если пароль состоит не из 4 цифр + * @param {string} title + * @param {function} call + */ + + + function pinFree(title, call) { + Input.edit({ + free: true, + title: title, + nosave: true, + value: '', + layout: 'nums', + keyboard: 'lampa', + password: true + }, call); + } + /** + * Запросить PIN-код для настроек + * @param {string} title - заголовок + * @param {function} call - вызов + */ + + + function request(call, error) { + if (Storage.field('parental_control')) { + var called = Storage.value('parental_control_pin').length == 4 ? pin : pinFree; + called(Lang$1.translate('parental_control_input_code'), function (code) { + if (code == Storage.value('parental_control_pin')) { + call(); + } else if (code) { + Noty.show(Lang$1.translate('parental_control_input_error')); + if (error) error(); + } else if (error) error(); + }); + } else { + call(); + } + } + /** + * Запросить PIN-код (Обший) + * @param {function} call - если pin верный + * @param {function} error - если нет + * @param {boolean} save_controller - переключить на прошлый контроллер + */ + + + function query(call, error, save_controller) { + if (Storage.field('parental_control')) { + var type = Storage.field('parental_control_time'); + var active = Controller.enabled().name; + + if (type !== 'always') { + if (type == 'once') { + if (already_requested) return call(); + } else { + if (last_time_requested + 1000 * 60 * parseInt(type) > Date.now()) return call(); + } + } + + request(function () { + already_requested = true; + last_time_requested = Date.now(); + if (save_controller) Controller.toggle(active); + call(); + }, function () { + if (save_controller) Controller.toggle(active); + if (error) error(); + }); + } else { + call(); + } + } + /** + * Запросить PIN-код (Персональный) + * @param {string} name - название модуля + * @param {function} call - если pin верный + * @param {function} error - если нет + * @param {boolean} save_controller - переключить на прошлый контроллер + */ + + + function personal(name, call, error, save_controller) { + var enabled = Storage.get('parental_control_personal', '[]'); + if (enabled.indexOf(name) !== -1) query(call, error, save_controller);else call(); + } + /** + * Запрос на установку PIN-кода, перед этим нужно проверить через enabled() + * @param {function} call - callback + */ + + + function install$2(call) { + set$1(function (code) { + if (code) { + Storage.set('parental_control_pin', code); + Storage.set('parental_control', true); + } + + call(Boolean(code)); + }); + } + /** + * Добавить персональный PIN-код для запроса + * @param {string} name - название модуля + * @param {object} data - данные + */ + + + function add$c(name, data) { + Arrays.extend(data, { + title: Lang$1.translate('player_unknown'), + "default": false + }); + if (data["default"]) Storage.add('parental_control_personal', name); + personal_codes[name] = data; + } + /** + * Проверить, установлен ли контроль + * @returns bollean + */ + + + function enabled$1() { + return Storage.field('parental_control'); + } + + var ParentalControl = { + init: init$X, + query: query, + personal: personal, + enabled: enabled$1, + install: install$2, + add: add$c + }; + + var menu$3; + var timer$5; + + function init$W(list) { + menu$3 = list; + observe$3(); + } + + function start$6() { + var list = $(''); + menu$3.find('.menu__item').each(function () { + var item_orig = $(this); + var item_clone = $(this).clone(); + var item_sort = $("
\n
\n
".concat(item_clone.find('.menu__text').text(), "
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n \n
\n
")); + item_sort.find('.menu-edit-list__icon').append(item_clone.find('.menu__ico').html()); + item_sort.find('.move-up').on('hover:enter', function () { + var prev = item_sort.prev(); + + if (prev.length) { + item_sort.insertBefore(prev); + item_orig.insertBefore(item_orig.prev()); + } + }); + item_sort.find('.move-down').on('hover:enter', function () { + var next = item_sort.next(); + + if (next.length) { + item_sort.insertAfter(next); + item_orig.insertAfter(item_orig.next()); + } + }); + item_sort.find('.toggle').on('hover:enter', function () { + item_orig.toggleClass('hidden'); + item_sort.find('.dot').attr('opacity', item_orig.hasClass('hidden') ? 0 : 1); + }).find('.dot').attr('opacity', item_orig.hasClass('hidden') ? 0 : 1); + list.append(item_sort); + }); + Modal.open({ + title: Lang$1.translate('extensions_edit'), + html: list, + size: 'small', + scroll_to_center: true, + onBack: function onBack() { + Modal.close(); + save$4(); + Controller.toggle('menu'); + } + }); + } + + function order() { + var items = Storage.get('menu_sort', '[]'); + + if (items.length) { + items.forEach(function (item) { + var el = $('.menu__item:contains("' + item + '")', menu$3); + if (el.length) el.appendTo(menu$3); + }); + } + } + + function hide$1() { + var items = Storage.get('menu_hide', '[]'); + $('.menu__item', menu$3).removeClass('hidden'); + + if (items.length) { + items.forEach(function (item) { + var el = $('.menu__item:contains("' + item + '")', menu$3); + if (el.length) el.addClass('hidden'); + }); + } + } + + function save$4() { + var sort = []; + var hide = []; + $('.menu__item', menu$3).each(function () { + var name = $(this).find('.menu__text').text().trim(); + sort.push(name); + + if ($(this).hasClass('hidden')) { + hide.push(name); + } + }); + Storage.set('menu_sort', sort); + Storage.set('menu_hide', hide); + } + + function update$b() { + order(); + hide$1(); + } + + function observe$3() { + clearTimeout(timer$5); + timer$5 = setTimeout(function () { + var memory = Storage.get('menu_sort', '[]'); + var anon = []; + $('.menu__item', menu$3).each(function () { + anon.push($(this).find('.menu__text').text().trim()); + }); + anon.forEach(function (item) { + if (memory.indexOf(item) == -1) memory.push(item); + }); + Storage.set('menu_sort', memory); + update$b(); + }, 500); + } + + var Editor = { + init: init$W, + start: start$6, + update: update$b, + observe: observe$3 + }; + + var Router$1 = /*#__PURE__*/function () { + function Router() { + _classCallCheck(this, Router); + + this.routes = []; + } + + _createClass(Router, [{ + key: "add", + value: function add(name, callback) { + if (typeof name === 'string' && typeof callback === 'function') { + this.routes.push({ + name: name, + callback: callback + }); + } else { + console.error('Invalid route definition. Expected a string and a function.'); + } + } + }, { + key: "get", + value: function get(name) { + return this.routes.find(function (route) { + return route.name === name; + }); + } + }, { + key: "call", + value: function call(name, data) { + var route = this.get(name); + + if (route) { + var push = route.callback(data); + Arrays.extend(push, { + url: data.url || '', + component: route.name, + source: data.source || Storage.field('source'), + page: data.page || 1 + }); + Activity.push(push); + } else { + Arrays.extend(data, { + url: data.url || '', + component: name, + source: data.source || Storage.field('source'), + page: data.page || 1 + }); + Activity.push(data); + } + } + }]); + + return Router; + }(); + + var router = new Router$1(); + router.add('full', function (data) { + return { + id: data.id, + method: data.name ? 'tv' : 'movie', + card: data + }; + }); + router.add('category_full', function (data) { + return { + genres: data.genres || '', + keywords: data.keywords || '', + query: data.query || '', + filter: data.filter || '', + title: data.title || Lang$1.translate('title_category') + }; + }); + router.add('category', function (data) { + return _objectSpread2(_objectSpread2({}, data), {}, { + title: data.title || Lang$1.translate('title_category') + }); + }); + router.add('favorite', function (data) { + return { + title: data.title || Lang$1.translate('title_' + data.type), + type: data.type, + filter: data.filter || '' + }; + }); + router.add('episodes', function (data) { + return { + title: Lang$1.translate('title_episodes'), + card: data + }; + }); + router.add('discuss', function (data) { + return { + card: data, + id: data.id, + method: data.name ? 'tv' : 'movie', + page: data.page || 2 + }; + }); + router.add('company', function (data) { + return { + url: data.url || (data.card.name ? 'tv' : 'movie'), + id: data.id, + source: data.card.source, + title: Lang$1.translate('title_company') + }; + }); + router.add('recomend', function (data) { + return { + title: Lang$1.translate('title_recomend_watch'), + page: data.page || 1, + media: data.media || 'movie' + }; + }); + router.add('actor', function (data) { + return { + id: data.id + }; + }); + + var html$g; + var last$3; + var scroll$1; + var visible_timer; + var menu_items = [{ + action: 'main', + title: 'menu_main', + sprite: 'home' + }, { + action: 'feed', + title: 'menu_feed', + sprite: 'feed' + }, { + action: 'movie', + title: 'menu_movies', + sprite: 'movie' + }, { + action: 'cartoon', + title: 'menu_multmovie', + sprite: 'cartoon' + }, { + action: 'tv', + title: 'menu_tv', + sprite: 'tv' + }, { + action: 'myperson', + title: 'title_persons', + sprite: 'person' + }, { + action: 'catalog', + title: 'menu_catalog', + sprite: 'catalog' + }, { + action: 'filter', + title: 'menu_filter', + sprite: 'filter' + }, { + action: 'relise', + title: 'menu_relises', + sprite: 'hd' + }, { + action: 'anime', + title: 'menu_anime', + sprite: 'anime' + }, { + action: 'favorite', + title: 'settings_input_links', + sprite: 'favorite' + }, { + action: 'history', + title: 'menu_history', + sprite: 'history' + }, { + action: 'subscribes', + title: 'title_subscribes', + sprite: 'subscribes' + }, { + action: 'timetable', + title: 'menu_timeline', + sprite: 'calendar' + }, { + action: 'mytorrents', + title: 'menu_torrents', + sprite: 'torrent' + }]; + /** + * Инициализация меню + * @returns {void} + */ + + function init$V() { + html$g = Template.get('menu'); + scroll$1 = new Scroll({ + mask: true, + over: true + }); // Фильтрация пунктов меню в зависимости от настроек + + menu_items = menu_items.filter(function (item) { + if (!window.lampa_settings.torrents_use && item.action == 'mytorrents') return false; + if (window.lampa_settings.disable_features.persons && item.action == 'myperson') return false; + if (window.lampa_settings.disable_features.subscribe && item.action == 'subscribes') return false; + if (!window.lampa_settings.feed && item.action == 'feed') return false; + if (!Lang$1.selected(['ru', 'uk', 'be']) && (item.action == 'relise' || item.action == 'anime' || item.action == 'feed')) return false; + return true; + }); // Добавление кнопок меню + + menu_items.forEach(function (item) { + addButton(""), Lang$1.translate(item.title)).data('action', item.action); + }); // Отправка события для плагинов + + Lampa.Listener.send('menu', { + type: 'start', + body: html$g + }); // Инициализация редактора меню + + Editor.init($('.menu__list:eq(0)', html$g)); // Наблюдатель за добавлением новых селекторов в меню + + observe$2(); // Инициализация контроллера меню + + Controller.add('menu', { + toggle: function toggle() { + Controller.collectionSet(html$g); + Controller.collectionFocus(last$3, html$g, true); + clearTimeout(visible_timer); + $('.wrap__left').removeClass('wrap__left--hidden'); + $('body').toggleClass('menu--open', true); + }, + right: function right() { + Controller.toggle('content'); + }, + up: function up() { + if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); + }, + down: function down() { + if (Navigator.canmove('down')) Navigator.move('down'); + }, + gone: function gone() { + $('body').toggleClass('menu--open', false); + visible_timer = setTimeout(function () { + $('.wrap__left').addClass('wrap__left--hidden'); + }, 300); + }, + back: function back() { + Activity.backward(); + } + }); // Закрытие меню по клику вне его области + + $('body').on('mousedown', function (e) { + if (DeviceInput.canClick(e.originalEvent) && opened$2()) { + if (e.originalEvent.clientX > html$g.outerWidth()) close$8(); + } + }); + scroll$1.minus(); + scroll$1.append(html$g); // Отправка события для плагинов + + Lampa.Listener.send('menu', { + type: 'end' + }); + Lampa.Listener.follow('app', function (e) { + if (e.type == 'ready') ready(); + }); + } + /** + * Следит за добавлением новых селекторов в меню + * @returns {void} + */ + + + function observe$2() { + if (typeof MutationObserver == 'undefined') return; + var observer = new MutationObserver(function (mutations) { + for (var i = 0; i < mutations.length; i++) { + var mutation = mutations[i]; + + if (mutation.type == 'childList' && !mutation.removedNodes.length) { + var selectors = Array.from(mutation.target.querySelectorAll('.selector')).filter(function (s) { + return !s.checked; + }); + if (selectors.length) Editor.observe(); + selectors.forEach(function (s) { + s.checked = true; + + if (!$(s).data('binded_events')) { + $(s).on('hover:focus', function (e) { + last$3 = e.target; + scroll$1.update($(e.target), true); + }).on('hover:hover hover:touch hover:enter', function (e) { + last$3 = e.target; + }); + } + }); + } + } + }); + observer.observe(html$g[0], { + childList: true, + subtree: true + }); + } + /** + * Проверяет, нужно ли открывать новый компонент или обновлять текущий + * @param {string} action Действие, которое нужно выполнить + * @param {Array} name Название компонента(ов), которые нужно проверить + * @returns {boolean|void} Нужно ли открывать новый компонент или обновлять текущий + */ + + + function prepared(action, name) { + if (name.indexOf(action) >= 0) { + var comp = Lampa.Activity.active().component; + if (name.indexOf(comp) >= 0) Activity.replace();else return true; + } + } + /** + * Готово к работе + * @returns {void} + */ + + + function ready() { + html$g.find('.selector').data('binded_events', true).on('hover:enter', function (e) { + var action = $(e.target).data('action'); + Lampa.Listener.send('menu', { + type: 'action', + action: action, + target: e.target, + abort: function abort() { + action = null; + } + }); + if (action == 'catalog') catalog(); + + if (action == 'movie' || action == 'tv' || action == 'anime') { + router.call('category', { + url: action, + title: (action == 'movie' ? Lang$1.translate('menu_movies') : action == 'anime' ? Lang$1.translate('menu_anime') : Lang$1.translate('menu_tv')) + ' - ' + Storage.field('source').toUpperCase(), + source: action == 'anime' ? 'cub' : Storage.field('source') + }); + } + + if (action == 'cartoon') { + router.call('category', { + url: 'movie', + title: Lang$1.translate('menu_multmovie') + ' - ' + Storage.field('source').toUpperCase(), + genres: 16 + }); + } + + if (prepared(action, ['main'])) { + router.call('main', { + title: Lang$1.translate('title_main') + ' - ' + Storage.field('source').toUpperCase() + }); + } + + if (prepared(action, ['myperson'])) { + router.call('myperson', { + title: Lang$1.translate('title_persons') + }); + } + + if (action == 'search') Controller.toggle('search'); + + if (action == 'settings') { + ParentalControl.personal('settings', function () { + Controller.toggle('settings'); + }, false, true); + } + + if (action == 'about') { + var about = Template.get('about'); + + if (window.lampa_settings.white_use) { + about.find('.about__contacts > div:eq(1)').remove(); + } + + if (Platform.is('android')) { + about.find('.platform_android').removeClass('hide'); + about.find('.version_android').text(Platform.version('android')); + } + + about.find('.version_app').text(Platform.version('app')); + Modal.open({ + about: true, + title: Lang$1.translate('title_about'), + html: about, + size: 'medium', + onBack: function onBack() { + Modal.close(); + Controller.toggle('content'); + } + }); + } + + if (action == 'favorite') { + ParentalControl.personal('bookmarks', function () { + if (prepared('bookmarks', ['bookmarks'])) { + router.call('bookmarks', { + title: Lang$1.translate('settings_input_links') + }); + } + }, false, true); + } + + if (action == 'history') { + ParentalControl.personal('bookmarks', function () { + if (prepared('favorite', ['favorite'])) { + router.call('favorite', { + title: Lang$1.translate('title_history'), + type: 'history' + }); + } + }, false, true); + } + + if (action == 'subscribes') { + router.call('subscribes', { + title: Lang$1.translate('title_subscribes') + }); + } + + if (prepared(action, ['timetable'])) { + router.call('timetable', { + title: Lang$1.translate('title_timetable') + }); + } + + if (prepared(action, ['feed'])) { + router.call('feed', { + title: Lang$1.translate('menu_feed') + }); + } + + if (prepared(action, ['mytorrents'])) { + router.call('mytorrents', { + title: Lang$1.translate('title_mytorrents') + }); + } + + if (prepared(action, ['relise'])) { + router.call('relise', { + title: Lang$1.translate('title_relises') + }); + } + + if (action == 'console') { + Controller.toggle('console'); + } + + if (action == 'filter') Filter$1.show(); + if (action == 'edit') Editor.start(); + }).on('hover:focus', function (e) { + last$3 = e.target; + scroll$1.update($(e.target), true); + }).on('hover:hover hover:touch hover:enter', function (e) { + last$3 = e.target; + }); + } + /** + * Открывает каталог + * @returns {void} + */ + + + function catalog() { + Api.menu({ + source: Storage.field('source') + }, function (menu) { + Select.show({ + title: Lang$1.translate('title_catalog'), + items: menu, + onSelect: function onSelect(a) { + var tmdb = Storage.field('source') == 'tmdb' || Storage.field('source') == 'cub'; + router.call(tmdb ? 'category' : 'category_full', { + url: 'movie', + title: (a.title || Lang$1.translate('title_catalog')) + ' - ' + Storage.field('source').toUpperCase(), + genres: a.id, + id: a.id + }); // Activity.push({ + // url: Storage.field('source') == 'tmdb' ? 'movie' : 'movie', + // title: (a.title || Lang.translate('title_catalog')) + ' - ' + Storage.field('source').toUpperCase(), + // component: tmdb ? 'category' : 'category_full', + // genres: a.id, + // id: a.id, + // source: Storage.field('source'), + // card_type: true, + // page: 1 + // }) + }, + onBack: open$7 + }); + }); + } + /** + * Добавляет элемент в меню + * @param {JQuery} element Элемент меню + * @param {Function} action Действие при нажатии на элемент + * @returns {JQuery} Добавленный элемент меню + */ + + + function addElement$1(element, action) { + html$g.find('.menu__list:eq(0)').append(element); + if (action && typeof action == 'function') element.on('hover:enter', action); + return element; + } + /** + * Добавляет кнопку в меню + * @param {string} svg_icon SVG иконка кнопки + * @param {string} title Название кнопки + * @param {Function} action Действие при нажатии на кнопку + * @returns {JQuery} Добавленная кнопка меню + */ + + + function addButton(svg_icon, title, action) { + return addElement$1($("
".concat(svg_icon, "
").concat(title, "
")), action); + } + /** + * Переключает меню + * @returns {void} + */ + + + function toggle$8() { + if ($('body').hasClass('menu--open')) Controller.toggle('content');else Controller.toggle('menu'); + Lampa.Listener.send('menu', { + type: 'toggle' + }); + } + /** + * Проверяет, открыто ли меню + * @returns {boolean} Открыто ли меню + */ + + + function opened$2() { + return $('body').hasClass('menu--open'); + } + /** + * Открывает меню + * @returns {void} + */ + + + function open$7() { + if (!opened$2()) toggle$8(); + } + /** + * Закрывает меню + * @returns {void} + */ + + + function close$8() { + if (opened$2()) toggle$8(); + } + /** + * Рендерит меню + * @returns {JQuery} Меню + */ + + + function render$b() { + return scroll$1.render(); + } + + var Menu$1 = { + init: Utils$1.onceInit(init$V), + render: render$b, + ready: ready, + toggle: toggle$8, + opened: opened$2, + addElement: addElement$1, + addButton: addButton, + open: open$7, + close: close$8 + }; + + var html$f; + var last$2; + /** + * Наблюдение за изменениями в DOM + * @returns {void} + */ + + function observe$1() { + if (typeof MutationObserver == 'undefined') return; + var observer = new MutationObserver(function (mutations) { + for (var i = 0; i < mutations.length; i++) { + var mutation = mutations[i]; + + if (mutation.type == 'childList' && !mutation.removedNodes.length) { + var selectors = Array.from(mutation.target.querySelectorAll('.selector')); + selectors.forEach(function (s) { + $(s).unbind('hover:focus hover:hover hover:touch').on('hover:focus hover:hover hover:touch', function (e) { + last$2 = e.target; + }); + }); + } + } + }); + observer.observe(html$f[0], { + childList: true, + subtree: true + }); + } + /** + * Инициализация шапки + * @returns {void} + */ + + + function init$U() { + html$f = Template.get('head'); + if (window.local_lampa) html$f.find('.head__logo-icon').append('local'); + + if (Platform.mouse()) { + var back = Template.elem('div', { + "class": 'head__backward', + children: [Template.js('icon_back')] + }); + back.on('click', Controller.back.bind(Controller)); + html$f.find('.head__body').prepend(back); + } + + Utils$1.time(html$f); + html$f.find('.head__logo-icon, .head__menu-icon').on('mousedown', function (e) { + if (DeviceInput.canClick(e.originalEvent)) Menu$1.toggle(); + }); + html$f.find('.full--screen').on('hover:enter', function () { + Utils$1.toggleFullscreen(); + }).toggleClass('hide', Platform.tv() || Platform.is('android') || !Utils$1.canFullScreen()); + observe$1(); + Controller.add('head', { + toggle: function toggle() { + Controller.collectionSet(html$f, false, true); + Controller.collectionFocus(last$2, html$f, true); + }, + right: function right() { + Navigator.move('right'); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); + }, + down: function down() { + Controller.toggle('content'); + }, + back: function back() { + Activity.backward(); + } + }); + } + /** + * Установка заголовка + * @param {string} title Заголовок + * @returns {void} + */ + + + function title$1(title) { + html$f.find('.head__title').text(title || ''); + } + /** + * Добавление элемента в шапку + * @param {JQuery|HTMLElement|string} element - Элемент + * @param {function} action - Действие при нажатии + * @returns {JQuery|HTMLElement} - Добавленный элемент + */ + + + function addElement(element, action) { + html$f.find('.head__actions').prepend(element); + if (action && typeof action == 'function') element.on('hover:enter', action); + return element; + } + /** + * Добавление иконки в шапку + * @param {string} svg_icon - SVG иконка + * @param {function} action - Действие при нажатии + * @returns {JQuery|HTMLElement} - Добавленная иконка + */ + + + function addIcon(svg_icon, action) { + return addElement($("
".concat(svg_icon, "
")), action); + } + /** + * Получение HTML шапки + * @param {boolean} js - Вернуть DOM элемент вместо JQuery + * @returns {JQuery|HTMLElement} + */ + + + function render$a(js) { + return js ? html$f[0] : html$f; + } + + var Head = { + init: init$U, + render: render$a, + title: title$1, + addElement: addElement, + addIcon: addIcon + }; + + var NoticeClass = /*#__PURE__*/function () { + function NoticeClass() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, NoticeClass); + + this.params = params; + this.name = 'Noname'; + } + + _createClass(NoticeClass, [{ + key: "active", + value: function active() { + return true; + } + }, { + key: "push", + value: function push(element, resolve, reject) { + resolve(); + } + }, { + key: "empty", + value: function empty(title, descr) { + var item = Template.get('notice_card', { + title: title || '', + descr: descr || Lang$1.translate('notice_none_system'), + time: '' + }); + item.addClass('image--icon image--loaded'); + item.find('.notice__img').html(Template.string('icon_bell_plus')); + return item; + } + }, { + key: "viewed", + value: function viewed() {} + }, { + key: "items", + value: function items() { + return []; + } + }, { + key: "count", + value: function count() { + return 0; + } + }]); + + return NoticeClass; + }(); + + var NoticeAll = /*#__PURE__*/function (_NoticeClass) { + _inherits(NoticeAll, _NoticeClass); + + var _super = _createSuper(NoticeAll); + + function NoticeAll() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, NoticeAll); + + _this = _super.call(this, params); + _this.name = Lang$1.translate('settings_param_jackett_interview_all'); + return _this; + } + + _createClass(NoticeAll, [{ + key: "active", + value: function active() { + return false; + } + }, { + key: "count", + value: function count() { + return Notice$1.count(); + } + }, { + key: "viewed", + value: function viewed() { + for (var name in Notice$1.classes) { + if (Notice$1.classes[name] !== this) { + Notice$1.classes[name].viewed(); + } + } + } + }, { + key: "items", + value: function items() { + var _this2 = this; + + var items = []; + + var _loop = function _loop(name) { + if (Notice$1.classes[name] !== _this2) { + items = items.concat(Notice$1.classes[name].items().map(function (item) { + var new_item = Arrays.clone(item); + new_item.display = name; + return new_item; + })); + } + }; + + for (var name in Notice$1.classes) { + _loop(name); + } + + items.sort(function (a, b) { + return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; + }); + return items; + } + }]); + + return NoticeAll; + }(NoticeClass); + + var NoticeLampa = /*#__PURE__*/function (_NoticeClass) { + _inherits(NoticeLampa, _NoticeClass); + + var _super = _createSuper(NoticeLampa); + + function NoticeLampa() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, NoticeLampa); + + _this = _super.call(this, params); + _this.name = params.name || 'Lampa'; + _this.time = 0; + _this.view = 0; + _this.db_name = params.db_name || 'notice'; + _this.notices = []; + + _this.connect(); + + return _this; + } + + _createClass(NoticeLampa, [{ + key: "connect", + value: function connect() { + this.db = new IndexedDB(this.db_name, ['all', 'readed'], 2); + this.db.openDatabase().then(this.update.bind(this))["catch"](function () { + return console.log('Notice', 'error', 'no open database'); + }); + } + }, { + key: "update", + value: function update() { + var _this2 = this; + + this.db.getData('readed', 'time').then(function (time) { + _this2.time = time || 0; + return _this2.db.getData('all'); + }).then(function (result) { + result.sort(function (a, b) { + return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; + }); + _this2.notices = result; + _this2.view = result.filter(function (n) { + return n.time > _this2.time; + }).length; + Notice$1.drawCount(); + })["catch"](function (e) {}); + } + }, { + key: "count", + value: function count() { + return this.view; + } + }, { + key: "push", + value: function push(element, resolve, reject) { + if (!(element.id && element.from)) { + if (reject) reject('No (id) or (from)'); + return; + } + + if (!this.notices.find(function (n) { + return n.id == element.id; + })) { + this.db.addData('all', element.id, element).then(this.update.bind(this)).then(function (e) { + if (resolve) resolve(e); + })["catch"](function (e) { + if (reject) reject(e); + }); + } else if (reject) reject('Already added'); + } + }, { + key: "viewed", + value: function viewed() { + this.db.rewriteData('readed', 'time', Date.now()); + this.view = 0; + this.time = Date.now(); + Notice$1.drawCount(); + } + }, { + key: "items", + value: function items() { + return this.notices; + } + }]); + + return NoticeLampa; + }(NoticeClass); + + var NoticeCub = /*#__PURE__*/function (_NoticeClass) { + _inherits(NoticeCub, _NoticeClass); + + var _super = _createSuper(NoticeCub); + + function NoticeCub() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, NoticeCub); + + _this = _super.call(this, params); + _this.name = 'CUB'; + _this.time = Storage.get('cub_notice_time', '0'); + _this.notices = []; + Cache.getData('other', 'cub_notice').then(function (data) { + if (data && permit.sync) _this.notices = data; + })["catch"](function (e) {}); + Storage.listener.follow('change', function (e) { + if (e.name == 'account' || e.name == 'account_use') { + if (!permit.sync) _this.notices = [];else _this.update(); + } + }); + Timer.add(1000 * 60 * 5, _this.update.bind(_assertThisInitialized(_this))); + + _this.update(); + + return _this; + } + + _createClass(NoticeCub, [{ + key: "update", + value: function update() { + var _this2 = this; + + Account$1.Api.notices(function (result) { + _this2.notices = result.map(function (item) { + var data = JSON.parse(item.data); + var text = Lang$1.translate('notice_new_quality'); + var labels = []; + + if (data.card.seasons) { + var k = []; + + for (var i in data.card.seasons) { + k.push(i); + } + + var s = k.pop(); + labels.push('S - ' + s + ''); + labels.push('E - ' + data.card.seasons[s] + ''); + if (data.voice) labels.push(data.voice); + text = Lang$1.translate('notice_new_episode'); + } else { + labels.push(Lang$1.translate('notice_quality') + ' - ' + data.card.quality + ''); + } + + return { + time: item.time || Utils$1.parseToDate(item.date).getTime(), + title: !Lang$1.selected(['ru', 'uk', 'be']) ? data.card.original_title || data.card.original_name : data.card.title || data.card.name, + text: text, + poster: data.card.poster ? data.card.poster : data.card.img ? data.card.img : data.card.poster_path, + card: data.card, + labels: labels, + data: data, + item: item + }; + }); + + _this2.notices.sort(function (a, b) { + return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; + }); + + Cache.rewriteData('other', 'cub_notice', _this2.notices); + Notice$1.drawCount(); + }); + } + }, { + key: "viewed", + value: function viewed() { + Storage.set('cub_notice_time', Date.now()); + this.time = Date.now(); + Notice$1.drawCount(); + } + }, { + key: "empty", + value: function empty() { + var item = _get(_getPrototypeOf(NoticeCub.prototype), "empty", this).call(this, Lang$1.translate('empty_title_two'), Lang$1.translate('notice_none_account')); + + if (!Account$1.Permit.access) { + item = _get(_getPrototypeOf(NoticeCub.prototype), "empty", this).call(this, Lang$1.translate('account_none_title'), Lang$1.translate('notice_none')); + if (Platform.screen('tv')) Utils$1.qrcode('https://' + object$2.cub_site, item.find('.notice__img')); + return item; + } + + return item; + } + }, { + key: "count", + value: function count() { + var _this3 = this; + + return this.notices.filter(function (n) { + return n.time > _this3.time; + }).length; + } + }, { + key: "items", + value: function items() { + return this.notices; + } + }]); + + return NoticeCub; + }(NoticeClass); + + function translate$1(str) { + if (Arrays.isObject(str)) { + var code = Lampa.Storage.get('language', 'ru'); + if (str[code]) return str[code];else if (str.ru) return str.ru;else return str[Arrays.getKeys(str)[0]]; + } + + return str; + } + + var Notice = /*#__PURE__*/function () { + function Notice() { + _classCallCheck(this, Notice); + + this.listener = Subscribe$2(); + this.display = 'all'; + this.classes = {}; + } + + _createClass(Notice, [{ + key: "init", + value: function init() { + var _this = this; + + this.icon = Head.addIcon(Template.string('icon_bell'), this.open.bind(this)); + this.icon.addClass('notice--icon'); + this.classes.all = new NoticeAll(); + this.classes.lampa = new NoticeLampa(); + this.classes.cub = new NoticeCub(); + Lampa.Listener.follow('app', function (e) { + if (e.type == 'ready') _this.drawCount(); + }); + } + }, { + key: "get", + value: function get(name) { + if (!this.classes[name]) throw new Error('No find class: ' + name); + return this.classes[name]; + } + }, { + key: "open", + value: function open() { + var _this2 = this; + + if (Lampa.Controller.enabled().name == 'modal') Modal.close(); + var html = $('
'); + var tabs = []; + var viever = this.classes[this.display]; + var items = viever.items(); + var navigation = $(''); + + for (var name in this.classes) { + var count = this.classes[name].count(); + var tab = { + name: name, + count: count + }; + tabs.push(tab); + } + + tabs.forEach(function (tab, i) { + var button = $(''); + if (tab.count) button.append('' + tab.count + ''); + button.on('hover:enter', function () { + _this2.display = tab.name; + + _this2.open(); + }); + if (tab.name == _this2.display) button.addClass('active'); + if (i > 0) navigation.append(''); + navigation.append(button); + }); + html.append(navigation); + items.forEach(function (element) { + var item = Template.get('notice_card', {}); + var icon = element.poster || element.icon || element.img; + var author_data = {}; + var author_html; + item.addClass('image--' + (element.poster ? 'poster' : element.icon ? 'icon' : element.img ? 'img' : 'none')); + item.find('.notice__title').html(translate$1(element.title)); + item.find('.notice__descr').html(translate$1(element.text)); + item.find('.notice__time').html(Utils$1.parseTime(element.time)["short"]); + if (element.labels) item.find('.notice__descr').append($('')); + + if (element.author) { + author_data = translate$1(element.author); + author_html = $("
\n
\n \n
\n
\n
\n
\n
\n
"); + author_html.find('.notice__author-name').html(author_data.name); + author_html.find('.notice__author-text').html(author_data.text); + item.find('.notice__body').append(author_html); + } + + item.on('hover:enter', function () { + if (element.card) { + _this2.close(); + + Activity.push({ + url: '', + component: 'full', + id: element.card.id, + method: element.card.number_of_seasons || element.card.seasons ? 'tv' : 'movie', + card: element.card, + source: Lang$1.selected(['ru', 'uk', 'be']) ? 'cub' : '' + }); + } else _this2.listener.send('select', { + display: element.display || _this2.display, + element: element + }); + }).on('visible', function () { + if (icon) { + icon = translate$1(icon); + if (icon.indexOf('http') == -1) icon = TMDB$1.image('t/p/w300/' + icon); + var img_icon = item.find('.notice__left img')[0] || {}; + var img_author = item.find('.notice__author img')[0] || {}; + + img_icon.onload = function () { + item.addClass('image--loaded'); + }; + + img_icon.onerror = function () { + img_icon.src = './img/img_broken.svg'; + }; + + img_author.onload = function () { + item.addClass('image-author--loaded'); + }; + + img_author.onerror = function () { + img_author.src = './img/img_broken.svg'; + }; + + img_icon.src = Utils$1.fixProtocolLink(icon); + if (element.author) img_author.src = Utils$1.fixProtocolLink(author_data.img.indexOf('http') >= 0 ? author_data.img : TMDB$1.image('t/p/w200/' + author_data.img)); + } + }); + html.append(item); + }); + + if (!items.length) { + var empty = viever.empty(); + + if (typeof empty == 'string') { + var wrap = $('
'); + wrap.append(empty); + html.append(wrap); + } else html.append(empty); + } + + viever.viewed(); + this.listener.send('viewed', { + display: this.display + }); + Modal.open({ + title: Lang$1.translate('title_notice'), + select: html.find('.navigation-tabs .active')[0], + size: 'medium', + html: html, + onBack: this.close.bind(this) + }); + } + }, { + key: "count", + value: function count() { + var all = 0; + + for (var name in this.classes) { + if (this.classes[name].active()) all += this.classes[name].count(); + } + + return all; + } + }, { + key: "close", + value: function close() { + Modal.close(); + Controller.toggle('head'); + } + }, { + key: "drawCount", + value: function drawCount() { + var _this3 = this; + + var status = Boolean(this.count()); + this.icon.toggleClass('active', status); + clearInterval(this.blick_timer); + + if (status) { + this.blick_timer = setInterval(function () { + _this3.icon.addClass('animate'); + + setTimeout(function () { + _this3.icon.removeClass('animate'); + }, 1000); + }, 1000 * 15); + } + } + }, { + key: "addClass", + value: function addClass(class_name, noticeClass) { + this.classes[class_name] = noticeClass; + } + }, { + key: "pushNotice", + value: function pushNotice(class_name, data, resolve, reject) { + if (this.classes[class_name] && this.classes[class_name].push) { + this.classes[class_name].push(data, resolve, reject); + } else if (reject) reject('No find class'); + } + }]); + + return Notice; + }(); + + var Notice$1 = new Notice(); + + /** + * Утилита для отслеживания статуса + * Нужно для того, чтобы дождаться завершения нескольких асинхронных процессов + * @constructor + * @param {number} need - количество процессов, которые нужно дождаться + * @property {function} onComplite - функция, которая будет вызвана по завершении всех процессов + * @property {function} stop - остановить проверку (например, если пользователь ушёл со страницы) + * @property {function(string, object)} append - добавить успешный процесс + * @property {function()} error - отметить ошибку в процессе + * @example + let status = new Status(3) + status.onComplite = (result)=>{ + //все процессы завершены + } + + asyncProcess1((data)=>{ + status.append('process1', data) + }, ()=>{ + status.error() + }) + + asyncProcess2((data)=>{ + status.append('process2', data) + }, ()=>{ + status.error() + }) + + asyncProcess3((data)=>{ + status.append('process3', data) + }, ()=>{ + status.error() + }) + */ + function Status(need) { + this.data = {}; + this.work = 0; + this.need = need; + this.complited = false; + + this.check = function () { + if (this.stopped) return; + + if (this.work >= this.need && !this.complited) { + this.complited = true; + this.onComplite(this.data); + } + }; + + this.append = function (name, json) { + this.work++; + this.data[name] = json; + this.check(); + }; + + this.error = function () { + this.work++; + this.check(); + }; + + this.stop = function () { + this.stopped = true; + }; + } + + function hasOpaqueBackground(el) { + var bg = getComputedStyle(el).backgroundColor; // Если background-color: transparent + + if (bg === 'transparent') return false; // Если rgba(0, 0, 0, 0) или любая с alpha = 0 + + var match = bg.match(/rgba?\(([^)]+)\)/); + + if (match) { + var parts = match[1].split(',').map(function (p) { + return p.trim(); + }); + var alpha = parts[3] !== undefined ? parseFloat(parts[3]) : 1; + return alpha > 0; + } // Если это rgb(...) или hex — значит непрозрачный + + + return true; + } + /** + * Плашка для отображения дополнительной информации или действий. + * @extends Emit + * @param {object} params - параметры плашки + * @param {string} [params.text] - текст плашки + * @param {string} [params.style=default] - стиль плашки (default, accent, warning, danger) + * @returns {More} - экземпляр класса More + */ + + + var More$1 = /*#__PURE__*/function (_Emit) { + _inherits(More, _Emit); + + var _super = _createSuper(More); + + function More() { + var _this; + + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, More); + + _this = _super.call(this); + _this.params = params; + return _this; + } + + _createClass(More, [{ + key: "create", + value: function create() { + this.html = Template.js('more'); + this.html.find('.card-more__title').html(this.params.text || Lang$1.translate('more')); + this.params.style && this.html.addClass('card-more--' + (this.params.style || 'default')); + this.emit('create'); + } + }, { + key: "size", + value: function size(target) { + if (!target) return this.html.find('.card-more__box').style.height = '10em'; + var elements = [target].concat(Array.from(target.querySelectorAll('*'))); + var max_area = 0; + var biggest_element = null; + elements.forEach(function (el) { + var rect = el.getBoundingClientRect(); + var area = rect.width * rect.height; + + if (area > max_area && hasOpaqueBackground(el)) { + max_area = area; + biggest_element = el; + } + }); + + if (biggest_element) { + var rect = biggest_element.getBoundingClientRect(); + this.html.style.width = (rect.width > rect.height ? rect.height : rect.width) + 'px'; + this.html.find('.card-more__box').style.height = rect.height + 'px'; + this.html.addClass('card-more--fixed-size'); + } + } + }, { + key: "render", + value: function render(js) { + return js ? this.html : $(this.html); + } + }, { + key: "destroy", + value: function destroy() { + this.html.remove(); + this.emit('destroy'); + } + }]); + + return More; + }(Emit); + + var MoreFirst = { + onCreate: function onCreate() { + var _this = this; + + this.more = new More$1(this.params.more); + this.more.create(); + this.more.html.addClass('card-more--first'); + this.more.html.on('hover:focus hover:touch', function () { + _this.last = _this.more.render(true); + _this.active = _this.items.indexOf(_this.more); + + _this.scroll.update(_this.more.render(true), _this.params.items.align_left ? false : true); + }); + this.more.html.on('hover:enter', this.emit.bind(this, 'more', this.data)); + this.scroll.append(this.more.render(true)); + this.items.push(this.more); + }, + onAppend: function onAppend(item, elem) { + if (this.data.results.indexOf(elem) == 0) this.more_set_size = item; + }, + onVisible: function onVisible() { + var _this$more_set_size; + + this.more.size((_this$more_set_size = this.more_set_size) === null || _this$more_set_size === void 0 ? void 0 : _this$more_set_size.render(true)); + this.more_set_size = null; + } + }; + + var Items$2 = { + onInit: function onInit() { + this.tv = Platform.screen('tv'); + this.items = []; + this.active = 0; + this.view = this.params.items.view; + }, + onAppend: function onAppend(item, element) { + var _this = this; + + var render = item.render(true); + render.on('hover:focus', function () { + _this.last = render; + var prev_active = _this.active; + _this.active = _this.items.indexOf(item); + if (_this.active > 0 || prev_active > _this.active) _this.scroll.update(_this.items[_this.active].render(true), _this.params.items.align_left ? false : true); + + _this.emit('active', item, element); + }); + render.on('hover:touch', function () { + _this.last = render; + _this.active = _this.items.indexOf(item); + + _this.emit('active', item, element); + }); + render.on('hover:enter', function () { + _this.last = render; + }); + render.on('visible', function () { + if (Controller.own(_this)) Controller.collectionAppend(render); + }); + + if (element.params.on && _typeof(element.params.on) == 'object') { + var _loop = function _loop(e) { + render.on(e, function () { + element.params.on[e].call(_this, item, element); + }); + }; + + for (var e in element.params.on) { + _loop(e); + } + } + + this.scroll.append(render); + this.items.push(item); + this.emit('push', item, element); + }, + onCreate: function onCreate() { + this.scroll.body(true).addClass('mapping--' + this.params.items.mapping); + this.scroll.onScroll = this.emit.bind(this, 'scroll'); + this.data.results.slice(0, this.view).forEach(this.emit.bind(this, 'createAndAppend')); + }, + onScroll: function onScroll() { + var size = this.tv ? (Math.round(this.active / this.view) + 1) * this.view + 1 : this.data.results.length; + var start = this.items.length; + if (this.has(MoreFirst)) start -= 1; + this.data.results.slice(start, size).forEach(this.emit.bind(this, 'createAndAppend')); + Layer.visible(this.scroll.render(true)); + }, + onDestroy: function onDestroy() { + Arrays.destroy(this.items); + } + }; + + var Base$2 = /*#__PURE__*/function (_Emit) { + _inherits(Base, _Emit); + + var _super = _createSuper(Base); + + function Base(data) { + var _this; + + _classCallCheck(this, Base); + + _this = _super.call(this); + Arrays.extend(data, { + title: data.name, + original_title: data.original_name, + release_date: data.first_air_date, + params: {} + }); + Arrays.extend(data.params, { + style: { + name: 'default' + } + }); + _this.data = data; + _this.params = data.params; + return _this; + } + + _createClass(Base, [{ + key: "create", + value: function create() { + this.html = document.createElement('div'); + this.emit('create'); + } + }, { + key: "visible", + value: function visible() { + this.emit('visible'); + } + }, { + key: "update", + value: function update() { + this.emit('update'); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html : $(this.html); + } + }, { + key: "disable", + value: function disable() { + var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + this.disabled = status; + this.html.toggleClass('card--disabled', status); + this.emit('disable', status); + } + }, { + key: "destroy", + value: function destroy() { + this.html.remove(); + this.emit('destroy'); + } + }]); + + return Base; + }(Emit); + + var Card$3 = /*#__PURE__*/function (_Base) { + _inherits(Card, _Base); + + var _super = _createSuper(Card); + + function Card(data) { + var _this; + + _classCallCheck(this, Card); + + _this = _super.call(this, data); + var module = _this.params.module || Helper$9.MASK.base; + Helper$9.getNames(module).map(function (name) { + return CardMap[name]; + }).forEach(function (mod) { + return _this.use(mod); + }); + + _this.emit('init'); + + return _this; + } + + return Card; + }(Base$2); + + var Create$2 = { + onCreateAndAppend: function onCreateAndAppend(element) { + var item = Utils$1.createInstance(Card$3, element); + this.emit('instance', item, element); + item.create(); + this.emit('append', item, element); + } + }; + + var More = { + onVisible: function onVisible() { + var pages = this.data.total_pages || 1; + if (pages <= 1) return; + var button = document.createElement('div'); + button.classList.add('items-line__more'); + button.classList.add('selector'); + button.text(Lang$1.translate('more')); + button.on('hover:enter', this.emit.bind(this, 'more', this.data)); + this.html.find('.items-line__head').append(button); + }, + onScroll: function onScroll() { + var _this = this; + + if (!this.more && this.data.results.length == this.items.length && this.data.total_pages > 1) { + this.more = new More$1(this.params.more); + this.more.create(); + this.more.size(this.items[this.items.length - 1].render(true)); + this.more.html.on('hover:focus hover:touch', function () { + _this.last = _this.more.render(true); + _this.active = _this.items.indexOf(_this.more); + + _this.scroll.update(_this.more.render(true), _this.params.items.align_left ? false : true); + }); + this.more.html.on('hover:enter', this.emit.bind(this, 'more', this.data)); + this.scroll.append(this.more.render(true)); + this.items.push(this.more); + if (Controller.own(this)) Controller.collectionAppend(this.more.render(true)); + } + } + }; + + var Event$1 = { + onEvent: function onEvent(type) { + Lampa.Listener.send('line', { + line: this, + type: type, + params: this.params, + data: this.data, + scroll: this.scroll, + body: this.body, + items: this.items, + active: this.active + }); + }, + onCreate: function onCreate() { + this.emit('event', 'create'); + }, + onCreateAndAppend: function onCreateAndAppend() { + this.emit('event', 'append'); + }, + onVisible: function onVisible() { + this.emit('event', 'visible'); + }, + onToggle: function onToggle() { + this.emit('event', 'toggle'); + }, + onDestroy: function onDestroy() { + this.emit('event', 'destroy'); + } + }; + + var Icon = { + onCreate: function onCreate() { + var _this = this; + + var icon = $("
\n
\n \n
\n \n
\n
".concat(this.data.title, "
\n
\n
"))[0]; + icon.on('visible', function () { + if (_this.data.icon_svg) { + icon.find('.full-person__photo').html(_this.data.icon_svg); + if (_this.data.icon_bgcolor) icon.find('.full-person__photo').style.backgroundColor = _this.data.icon_bgcolor; + if (_this.data.icon_color) icon.find('.full-person__photo').style.color = _this.data.icon_color; + icon.addClass('full-person--loaded'); + icon.addClass('full-person--svg'); + } else { + Utils$1.imgLoad(icon.find('img'), _this.data.icon_img || './img/actor.svg', function (img) { + icon.addClass('full-person--loaded'); + }, function (img) { + img.src = './img/actor.svg'; + }); + } + }); + this.html.find('.items-line__title').html(icon); + } + }; + + var LineMap = { + MoreFirst: MoreFirst, + Items: Items$2, + Create: Create$2, + More: More, + Icon: Icon, + Event: Event$1 + }; + + var Helper$b = new Mask(Arrays.getKeys(LineMap)); + Helper$b.MASK.base = Helper$b.except('Icon', 'MoreFirst'); + + var network$8 = new Request(); + var menu_list = []; + var day$1 = 60 * 24; + var genres$1 = { + movie: [{ + "id": 28, + "title": "#{filter_genre_ac}" + }, { + "id": 12, + "title": "#{filter_genre_ad}" + }, { + "id": 16, + "title": "#{filter_genre_mv}" + }, { + "id": 35, + "title": "#{filter_genre_cm}" + }, { + "id": 80, + "title": "#{filter_genre_cr}" + }, { + "id": 99, + "title": "#{filter_genre_dc}" + }, { + "id": 18, + "title": "#{filter_genre_dr}" + }, { + "id": 10751, + "title": "#{filter_genre_fm}" + }, { + "id": 14, + "title": "#{filter_genre_fe}" + }, { + "id": 36, + "title": "#{filter_genre_hi}" + }, { + "id": 27, + "title": "#{filter_genre_ho}" + }, { + "id": 10402, + "title": "#{filter_genre_mu}" + }, { + "id": 9648, + "title": "#{filter_genre_de}" + }, { + "id": 10749, + "title": "#{filter_genre_md}" + }, { + "id": 878, + "title": "#{filter_genre_fa}" + }, { + "id": 10770, + "title": "#{filter_genre_tv}" + }, { + "id": 53, + "title": "#{filter_genre_tr}" + }, { + "id": 10752, + "title": "#{filter_genre_mi}" + }, { + "id": 37, + "title": "#{filter_genre_ve}" + }], + tv: [{ + "id": 10759, + "title": "#{filter_genre_aa}" + }, { + "id": 16, + "title": "#{filter_genre_mv}" + }, { + "id": 35, + "title": "#{filter_genre_cm}" + }, { + "id": 80, + "title": "#{filter_genre_cr}" + }, { + "id": 99, + "title": "#{filter_genre_dc}" + }, { + "id": 18, + "title": "#{filter_genre_dr}" + }, { + "id": 10751, + "title": "#{filter_genre_fm}" + }, { + "id": 10762, + "title": "#{filter_genre_ch}" + }, { + "id": 9648, + "title": "#{filter_genre_de}" + }, { + "id": 10763, + "title": "#{filter_genre_nw}" + }, { + "id": 10764, + "title": "#{filter_genre_rs}" + }, { + "id": 10765, + "title": "#{filter_genre_hf}" + }, { + "id": 10766, + "title": "#{filter_genre_op}" + }, { + "id": 10767, + "title": "#{filter_genre_tc}" + }, { + "id": 10768, + "title": "#{filter_genre_mp}" + }, { + "id": 37, + "title": "#{filter_genre_ve}" + }] + }; + + function url$2(u) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var ln = [Storage.field('tmdb_lang')]; + if (params.langs) ln = typeof params.langs == 'string' ? [params.langs] : ln.concat(params.langs.filter(function (n) { + return n !== ln[0]; + })); + u = add$b(u, 'api_key=' + TMDB$1.key()); + u = add$b(u, 'language=' + ln.join(',')); // Оставлю на потом для детского профиля + //if(!params.networks) u = add(u, 'certification_country=RU&certification.lte=18') + + if (params.genres && u.indexOf('with_genres') == -1) u = add$b(u, 'with_genres=' + params.genres); + if (params.page) u = add$b(u, 'page=' + params.page); + if (params.query) u = add$b(u, 'query=' + params.query); + if (params.keywords) u = add$b(u, 'with_keywords=' + params.keywords); + if (params.watch_region) u = add$b(u, 'watch_region=' + params.watch_region); + if (params.watch_providers) u = add$b(u, 'with_watch_providers=' + params.watch_providers); + if (params.companies) u = add$b(u, 'with_companies=' + params.companies); + if (params.networks) u = add$b(u, 'with_networks=' + params.networks); + if (params.sort_by) u = add$b(u, 'sort_by=' + params.sort_by); + + if (params.filter) { + for (var i in params.filter) { + u = add$b(u, i + '=' + params.filter[i]); + } + } // Добавляем проверку для запросов по жанрам + + + if (params.genres && u.indexOf('discover/') !== 0) { + u = 'discover/' + u; + } + + return TMDB$1.api(u); + } + + function add$b(u, params) { + return u + (/\?/.test(u) ? '&' : '?') + params; + } + + function img$1(src, size) { + var poster_size = Storage.field('poster_size'); + var baseimg = 't/p/' + poster_size + '/'; + var path = baseimg; + if (size) path = path.replace(new RegExp(poster_size, 'g'), size); + return src ? TMDB$1.image(path + src) : ''; + } + + function find$2(find) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var finded; + + var filtred = function filtred(items) { + for (var i = 0; i < items.length; i++) { + var item = items[i]; + + if (params.original_title == item.original_title || params.title == item.title) { + finded = item; + break; + } + } + }; + + if (find.movie && find.movie.results.length) filtred(find.movie.results); + if (find.tv && find.tv.results.length && !finded) filtred(find.tv.results); + return finded; + } + + function main$2() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var onerror = arguments.length > 2 ? arguments[2] : undefined; + var parts_limit = 6; + var parts_data = [function (call) { + get$d('movie/now_playing', params, function (json) { + json.title = Lang$1.translate('title_now_watch'); + call(json); + }, call, { + life: day$1 * 2 + }); + }, function (call) { + get$d('trending/movie/day', params, function (json) { + json.title = Lang$1.translate('title_trend_day'); + call(json); + }, call, { + life: day$1 * 2 + }); + }, function (call) { + get$d('trending/movie/week', params, function (json) { + json.title = Lang$1.translate('title_trend_week'); + call(json); + }, call, { + life: day$1 * 3 + }); + }, function (call) { + get$d('movie/upcoming', params, function (json) { + json.title = Lang$1.translate('title_upcoming'); + call(json); + }, call, { + life: day$1 * 7 + }); + }, function (call) { + get$d('movie/popular', params, function (json) { + json.title = Lang$1.translate('title_popular_movie'); + json.icon_svg = Template.string('icon_fire'); + json.icon_bgcolor = '#fff'; + json.icon_color = '#fd4518'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; + call(json); + }, call, { + life: day$1 * 3 + }); + }, function (call) { + get$d('trending/tv/week', params, function (json) { + json.title = Lang$1.translate('title_popular_tv'); + json.icon_svg = Template.string('icon_fire'); + json.icon_bgcolor = '#fff'; + json.icon_color = '#fd4518'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; + call(json); + }, call, { + life: day$1 * 3 + }); + }, function (call) { + get$d('movie/top_rated', params, function (json) { + json.title = Lang$1.translate('title_top_movie'); + json.icon_svg = Template.string('icon_top'); + json.icon_bgcolor = '#e02129'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; + call(json); + }, call, { + life: day$1 * 7 + }); + }, function (call) { + get$d('tv/top_rated', params, function (json) { + json.title = Lang$1.translate('title_top_tv'); + json.icon_svg = Template.string('icon_top'); + json.icon_bgcolor = '#e02129'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; + call(json); + }, call, { + life: day$1 * 7 + }); + }]; + ContentRows.call('main', params, parts_data); + var start_shuffle = parts_data.length + 1; + Arrays.insert(parts_data, 0, Api.partPersons(parts_data, parts_limit, 'movie', start_shuffle)); + genres$1.movie.forEach(function (genre) { + var event = function event(call) { + get$d('discover/movie?with_genres=' + genre.id, params, function (json) { + json.title = Lang$1.translate(genre.title.replace(/[^a-z_]/g, '')); + call(json); + }, call, { + life: day$1 * 7 + }); + }; + + parts_data.push(event); + }); + + function loadPart(partLoaded, partEmpty) { + Api.partNext(parts_data, parts_limit, partLoaded, partEmpty); + } + + loadPart(oncomplite, onerror); + return loadPart; + } + + function category$3() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var onerror = arguments.length > 2 ? arguments[2] : undefined; + var fullcat = !(params.genres || params.keywords); + var parts_limit = 6; + var parts_data = [function (call) { + if (params.url == 'movie') { + get$d('discover/' + params.url + '?with_release_type=1', params, function (json) { + json.title = Lang$1.translate('title_now_watch'); + call(json); + }, call, { + life: day$1 * 2 + }); + } else call(); + }, function (call) { + get$d(params.url == 'movie' ? 'trending/movie/week' : 'trending/tv/week', params, function (json) { + json.title = Lang$1.translate('title_popular'); + json.icon_svg = Template.string('icon_fire'); + json.icon_bgcolor = '#fff'; + json.icon_color = '#fd4518'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; + call(json); + }, call, { + life: day$1 * 3 + }); + }, function (call) { + get$d('discover/' + params.url + '?' + (params.url == 'movie' ? 'primary_release_year' : 'first_air_date_year') + '=' + (new Date().getFullYear() - 1), params, function (json) { + json.title = Lang$1.translate('title_last_year'); + call(json); + }, call, { + life: day$1 * 7 + }); + }, function (call) { + var lte = new Date().getFullYear() - 2 + '-12-31'; + var gte = new Date().getFullYear() - 7 + '-01-01'; + var reg = params.url == 'movie' ? 'primary_release_date' : 'first_air_date'; + lte = reg + '.lte=' + lte; + gte = reg + '.gte=' + gte; + get$d('discover/' + params.url + '?' + lte + '&' + gte, params, function (json) { + json.title = Lang$1.translate('title_worth_rewatch'); + call(json); + }, call, { + life: day$1 * 7 + }); + }, function (call) { + var lte = new Date().getFullYear() - 2 + '-12-31'; + var gte = new Date().getFullYear() - 7 + '-01-01'; + var reg = params.url == 'movie' ? 'primary_release_date' : 'first_air_date'; + lte = reg + '.lte=' + lte; + gte = reg + '.gte=' + gte; + get$d('discover/' + params.url + '?' + lte + '&' + gte + '&vote_average.gte=8&vote_average.lte=9', params, function (json) { + json.title = Lang$1.translate('title_hight_voite'); + json.icon_svg = Template.string('icon_star'); + json.icon_bgcolor = '#fff'; + json.icon_color = '#212121'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; + call(json); + }, call, { + life: day$1 * 7 + }); + }, function (call) { + if (params.genres) return call(); + + if (params.url == 'tv') { + get$d('trending/tv/week', params, function (json) { + json.title = Lang$1.translate('title_this_week'); + call(json); + }, call, { + life: day$1 * 3 + }); + } else { + get$d('movie/upcoming', params, function (json) { + json.title = Lang$1.translate('title_upcoming'); + json.results.forEach(function (card) { + card.params = { + style: { + name: 'wide' + } + }; + }); + json.params = { + items: { + view: 3 + } + }; + call(json); + }, call, { + life: day$1 * 7 + }); + } + }]; + ContentRows.call('category', params, parts_data); + var start_shuffle = parts_data.length + 1; + if (fullcat) Arrays.insert(parts_data, 0, Api.partPersons(parts_data, parts_limit, params.url, start_shuffle)); + genres$1[params.url].forEach(function (genre) { + var gen = params.genres ? [].concat(params.genres, genre.id) : [genre.id]; + if (params.genres && params.genres == genre.id) return; + + var event = function event(call) { + get$d('discover/' + params.url + '?with_genres=' + gen.join(','), params, function (json) { + json.title = Lang$1.translate(genre.title.replace(/[^a-z_]/g, '')); + call(json); + }, call, { + life: day$1 * 7 + }); + }; + + parts_data.push(event); + Arrays.shuffleArrayFromIndex(parts_data, start_shuffle); + }); + + function loadPart(partLoaded, partEmpty) { + Api.partNext(parts_data, parts_limit, partLoaded, partEmpty); + } + + loadPart(oncomplite, onerror); + return loadPart; + } + + function full$3() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var onerror = arguments.length > 2 ? arguments[2] : undefined; + var status = new Status(8); + status.onComplite = oncomplite; + if (Utils$1.dcma(params.method, params.id)) return onerror(); + get$d(params.method + '/' + params.id + '?append_to_response=content_ratings,release_dates,external_ids,keywords,alternative_titles', params, function (json) { + json.source = 'tmdb'; + + if (json.external_ids) { + json.imdb_id = json.external_ids.imdb_id; + } + + if (params.method == 'tv') { + var season = Utils$1.countSeasons(json); + get$d('tv/' + json.id + '/season/' + season, {}, function (ep) { + status.append('episodes', ep); + }, status.error.bind(status), { + life: day$1 * 3 + }); + } else status.need--; + + if (json.belongs_to_collection) { + get$d('collection/' + json.belongs_to_collection.id, {}, function (collection) { + collection.results = collection.parts.slice(0, 19); + status.append('collection', collection); + }, status.error.bind(status), { + life: day$1 * 7 + }); + } else status.need--; + + status.append('movie', json); + }, function () { + status.need -= 2; + status.error(); + }, { + life: day$1 * 7 + }); + get$d(params.method + '/' + params.id + '/credits', params, function (json) { + status.append('persons', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + get$d(params.method + '/' + params.id + '/recommendations', params, function (json) { + status.append('recomend', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + get$d(params.method + '/' + params.id + '/similar', params, function (json) { + status.append('simular', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + videos(params, function (json) { + status.append('videos', json); + }, status.error.bind(status)); + Api.sources.cub.reactionsGet(params, function (json) { + status.append('reactions', json); + }); + + if (Lang$1.selected(['ru', 'uk', 'be']) && window.lampa_settings.account_use) { + status.need++; + Api.sources.cub.discussGet(params, function (json) { + status.append('discuss', json); + }, status.error.bind(status)); + } + } + + function videos() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var lg = Storage.field('tmdb_lang'); + var status = new Status(lg == 'en' ? 1 : 2); + + status.onComplite = function (res) { + var data = []; + if (res.one && res.one.results && res.one.results.length) data = data.concat(res.one.results); + if (res.two && res.two.results && res.two.results.length) data = data.concat(res.two.results); + oncomplite({ + results: data + }); + }; + + get$d(params.method + '/' + params.id + '/videos', { + langs: Storage.field('tmdb_lang') + }, function (json) { + status.append('one', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + + if (lg !== 'en') { + get$d(params.method + '/' + params.id + '/videos', { + langs: 'en' + }, function (json) { + status.append('two', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + } + } + + function list$4() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var onerror = arguments.length > 2 ? arguments[2] : undefined; + var u = url$2(params.url, params); + network$8.silent(u, oncomplite, onerror, false, { + cache: { + life: day$1 * 2 + } + }); + } + + function get$d(method) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var oncomplite = arguments.length > 2 ? arguments[2] : undefined; + var onerror = arguments.length > 3 ? arguments[3] : undefined; + var cache = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + var u = url$2(method, params); + network$8.timeout(1000 * 10); + network$8.silent(u, function (json) { + json.url = method; + oncomplite(json); + }, onerror, false, { + cache: cache + }); + } + + function search$5() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var status = new Status(3); + + status.onComplite = function (data) { + var items = []; + if (data.movie && data.movie.results.length) items.push(data.movie); + if (data.tv && data.tv.results.length) items.push(data.tv); + if (data.person && data.person.results.length) items.push(data.person); + oncomplite(items); + }; + + get$d('search/movie', params, function (json) { + json.title = Lang$1.translate('menu_movies'); + json.type = 'movie'; + status.append('movie', json); + }, status.error.bind(status)); + get$d('search/tv', params, function (json) { + json.title = Lang$1.translate('menu_tv'); + json.type = 'tv'; + status.append('tv', json); + }, status.error.bind(status)); + get$d('search/person', params, function (json) { + json.title = Lang$1.translate('title_actors'); + json.type = 'person'; + json.results.forEach(function (person) { + person.params = { + module: Helper$9.only('Card', 'Release', 'Callback'), + emit: { + onlyEnter: function onlyEnter() { + console.log('Person card focused:', person); + } + } + }; + }); + status.append('person', json); + }, status.error.bind(status)); + } + + function discovery$2() { + return { + title: 'TMDB', + search: search$5, + params: { + save: true + }, + onMore: function onMore(params, close) { + close(); + Activity.push({ + url: 'search/' + params.data.type, + title: Lang$1.translate('search') + ' - ' + params.query, + component: 'category_full', + page: 2, + query: encodeURIComponent(params.query), + source: 'tmdb' + }); + }, + onCancel: network$8.clear.bind(network$8) + }; + } + + function person$2() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + + var sortCredits = function sortCredits(credits) { + return credits.map(function (a) { + a.year = parseInt(((a.release_date || a.first_air_date || '0000') + '').slice(0, 4)); + return a; + }).sort(function (a, b) { + return b.vote_average - a.vote_average && b.vote_count - a.vote_count; + }); //сортируем по оценке и кол-ву голосов (чтобы отсечь мусор с 1-2 оценками) + }; + + var convert = function convert(credits, person_data) { + if (params.only_credits) { + var cast = sortCredits(credits.cast); + var result = {}; + result[params.only_credits] = sortCredits(cast.filter(function (media) { + return media.media_type === params.only_credits; + })); + return result; + } else { + var department = ['directing', 'writing', 'editing', 'creator']; + credits.crew.forEach(function (a) { + a.department = Lang$1.translate(department.indexOf(a.department.toLowerCase()) == -1 ? 'settings_main_rest' : 'full_' + a.department.toLowerCase()); + }); + + var _cast = sortCredits(credits.cast), + crew = sortCredits(credits.crew), + tv = sortCredits(_cast.filter(function (media) { + return media.media_type === 'tv'; + })), + movie = sortCredits(_cast.filter(function (media) { + return media.media_type === 'movie'; + })), + knownFor; //Наиболее известные работы человека + //1. Группируем все работы по департаментам (Актер, Режиссер, Сценарист и т.д.) + + + knownFor = Arrays.groupBy(crew, 'department'); + if (movie.length > 0) knownFor[Lang$1.translate('menu_movies')] = movie; + if (tv.length > 0) knownFor[Lang$1.translate('menu_tv')] = tv; //2. Для каждого департамента суммируем кол-ва голосов (вроде бы сам TMDB таким образом определяет knownFor для людей) + + knownFor = Object.entries(knownFor).map(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + depIdx = _ref2[0], + dep = _ref2[1]; + + //убираем дубликаты (человек может быть указан в одном департаменте несколько раз на разных должностях (job)) + var set = {}, + credits = dep.filter(function (credit) { + return set.hasOwnProperty(credit.original_title || credit.original_name) ? false : credit.original_title ? set[credit.original_title] = true : set[credit.original_name] = true; + }); + return { + name: depIdx, + credits: credits, + vote_count: dep.reduce(function (a, b) { + return a + b.vote_count; + }, 0) + }; //3. Сортируем департаменты по кол-ву голосов + }).sort(function (a, b) { + return b.credits.length - a.credits.length; + }); + return { + raw: credits, + cast: _cast, + crew: crew, + tv: tv, + movie: movie, + knownFor: knownFor + }; + } + }; + + var status = new Status(params.only_credits ? 1 : 2); + + status.onComplite = function () { + var fulldata = {}; + if (status.data.person) fulldata.person = status.data.person; + if (status.data.credits) fulldata.credits = convert(status.data.credits, status.data.person || {}); + oncomplite(fulldata); + }; + + if (!params.only_credits) { + get$d('person/' + params.id, params, function (json) { + status.append('person', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + } + + get$d('person/' + params.id + '/combined_credits', params, function (json) { + status.append('credits', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + } + + function menu$2() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + if (menu_list.length) oncomplite(menu_list);else { + var u = url$2('genre/movie/list', params); + network$8.silent(u, function (j) { + j.genres.forEach(function (g) { + menu_list.push({ + title: g.name, + id: g.id + }); + }); + oncomplite(menu_list); + }); + } + } + + function menuCategory$2(params, oncomplite) { + var menu = []; + + if (params.action !== 'tv') { + menu.push({ + title: Lang$1.translate('title_now_watch'), + url: params.action + '/now_playing' + }); + } + + menu.push({ + title: Lang$1.translate('title_popular'), + url: params.action + '/popular' + }); + var date = new Date(); + var query = []; + query.push('sort_by=release_date.desc'); + query.push('year=' + date.getFullYear()); + query.push('first_air_date_year=' + date.getFullYear()); + query.push('vote_average.gte=7'); + menu.push({ + title: Lang$1.translate('title_new'), + url: 'discover/' + params.action + '?' + query.join('&') + }); + + if (params.action == 'tv') { + menu.push({ + title: Lang$1.translate('title_tv_today'), + url: params.action + '/airing_today' + }); + menu.push({ + title: Lang$1.translate('title_this_week'), + url: params.action + '/on_the_air' + }); + } + + menu.push({ + title: Lang$1.translate('title_in_top'), + url: params.action + '/top_rated' + }); + oncomplite(menu); + } + + function external_ids() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var onerror = arguments.length > 2 ? arguments[2] : undefined; + get$d((params.type || 'tv') + '/' + params.id + '/external_ids', params, oncomplite, onerror, { + life: day$1 * 7 + }); + } + + function external_imdb_id() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + get$d(params.type + '/' + params.id + '/external_ids', params, function (ids) { + oncomplite(ids.imdb_id || ''); + }, function () { + oncomplite(''); + }, { + life: day$1 * 7 + }); + } + + function company$1() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var oncomplite = arguments.length > 1 ? arguments[1] : undefined; + var onerror = arguments.length > 2 ? arguments[2] : undefined; + var status = new Status(3); + + status.onComplite = function () { + function sortResultsByVoteAverage(results) { + return results.sort(function (a, b) { + return b.vote_average - a.vote_average; + }); + } + + if (status.data.company) { + var fulldata = { + company: status.data.company, + lines: [] + }; + if (status.data.movie && status.data.movie.results.length) fulldata.lines.push({ + total_pages: status.data.movie.total_pages, + url: 'discover/movie', + title: Lang$1.translate('menu_movies') + ' (' + status.data.movie.total_results + ')', + results: sortResultsByVoteAverage(status.data.movie.results), + total_results: status.data.movie.total_results + }); + if (status.data.tv && status.data.tv.results.length) fulldata.lines.push({ + total_pages: status.data.tv.total_pages, + url: 'discover/tv', + title: Lang$1.translate('menu_tv') + ' (' + status.data.tv.total_results + ')', + results: sortResultsByVoteAverage(status.data.tv.results), + total_results: status.data.tv.total_results + }); + oncomplite(fulldata); + } else onerror(); + }; + + get$d('company/' + params.id, params, function (json) { + status.append('company', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + get$d('discover/movie?sort_by=vote_count.desc&with_companies=' + params.id, params, function (json) { + status.append('movie', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + get$d('discover/tv?sort_by=vote_count.desc&with_companies=' + params.id, params, function (json) { + status.append('tv', json); + }, status.error.bind(status), { + life: day$1 * 7 + }); + } + + function seasons$2(tv, from, oncomplite) { + var status = new Status(from.length); + status.onComplite = oncomplite; + from.forEach(function (season) { + get$d('tv/' + tv.id + '/season/' + season, {}, function (json) { + status.append('' + season, json); + }, status.error.bind(status), { + life: day$1 * 3 + }); + }); + } + + function parsePG(movie) { + var pg; + var cd = Storage.field('language'); + + if (movie.content_ratings) { + try { + var _find = movie.content_ratings.results.find(function (a) { + return a.iso_3166_1 == cd.toUpperCase(); + }); + + if (!_find) _find = movie.content_ratings.results.find(function (a) { + return a.iso_3166_1 == 'US'; + }); + if (_find) pg = Utils$1.decodePG(_find.rating); + } catch (e) {} + } + + if (movie.release_dates && !pg) { + var _find2 = movie.release_dates.results.find(function (a) { + return a.iso_3166_1 == cd.toUpperCase(); + }); + + if (!_find2) _find2 = movie.release_dates.results.find(function (a) { + return a.iso_3166_1 == 'US'; + }); + + if (_find2 && _find2.release_dates.length) { + pg = Utils$1.decodePG(_find2.release_dates[0].certification); + } + } + + if (movie.restrict) pg = movie.restrict + '+'; + return pg; + } + + function parseCountries(movie) { + var iso_countries = { + 'AD': Lang$1.translate('country_ad'), + 'AE': Lang$1.translate('country_ae'), + 'AF': Lang$1.translate('country_af'), + //'AG' : 'Antigua And Barbuda', + //'AI' : 'Anguilla', + 'AL': Lang$1.translate('country_al'), + 'AM': Lang$1.translate('country_am'), + //'AN' : 'Netherlands Antilles', + 'AO': Lang$1.translate('country_ao'), + //'AQ' : 'Antarctica', + 'AR': Lang$1.translate('country_ar'), + //'AS' : 'American Samoa', + 'AT': Lang$1.translate('country_at'), + 'AU': Lang$1.translate('country_au'), + 'AW': Lang$1.translate('country_aw'), + 'AZ': Lang$1.translate('country_az'), + 'BA': Lang$1.translate('country_ba'), + //'BB' : 'Barbados', + 'BD': Lang$1.translate('country_bd'), + 'BE': Lang$1.translate('country_be'), + //'BF' : 'Burkina Faso', + 'BG': Lang$1.translate('country_bg'), + 'BH': Lang$1.translate('country_bh'), + 'BI': Lang$1.translate('country_bi'), + 'BJ': Lang$1.translate('country_bj'), + //'BL' : 'Saint Barthelemy', + //'BM' : 'Bermuda', + //'BN' : 'Brunei Darussalam', + 'BO': Lang$1.translate('country_bo'), + 'BR': Lang$1.translate('country_br'), + 'BS': Lang$1.translate('country_bs'), + 'BT': Lang$1.translate('country_bt'), + //'BV' : 'Bouvet Island', + 'BW': Lang$1.translate('country_bw'), + 'BY': Lang$1.translate('country_by'), + //'BZ' : 'Belize', + 'CA': Lang$1.translate('country_ca'), + //'CC' : 'Cocos (Keeling) Islands', + //'CD' : 'Congo, Democratic Republic', + //'CF' : 'Central African Republic', + //'CG' : 'Congo', + 'CH': Lang$1.translate('country_ch'), + //'CI' : 'Cote D\'Ivoire', + //'CK' : 'Cook Islands', + 'CL': Lang$1.translate('country_cl'), + 'CM': Lang$1.translate('country_cm'), + 'CN': Lang$1.translate('country_cn'), + 'CO': Lang$1.translate('country_co'), + 'CR': Lang$1.translate('country_cr'), + 'CU': Lang$1.translate('country_cu'), + 'CV': Lang$1.translate('country_cv'), + //'CX' : 'Christmas Island', + 'CY': Lang$1.translate('country_cy'), + 'CZ': Lang$1.translate('country_cz'), + 'DE': Lang$1.translate('country_de'), + 'DJ': Lang$1.translate('country_dj'), + 'DK': Lang$1.translate('country_dk'), + //'DM' : 'Dominica', + 'DO': Lang$1.translate('country_do'), + 'DZ': Lang$1.translate('country_dz'), + 'EC': Lang$1.translate('country_ec'), + 'EE': Lang$1.translate('country_ee'), + 'EG': Lang$1.translate('country_eg'), + //'EH' : 'Western Sahara', + //'ER' : 'Eritrea', + 'ES': Lang$1.translate('country_es'), + 'ET': Lang$1.translate('country_et'), + 'FI': Lang$1.translate('country_fi'), + //'FJ' : 'Fiji', + //'FK' : 'Falkland Islands (Malvinas)', + //'FM' : 'Micronesia, Federated States Of', + 'FO': Lang$1.translate('country_fo'), + 'FR': Lang$1.translate('country_fr'), + 'GA': Lang$1.translate('country_ga'), + 'GB': Lang$1.translate('country_gb'), + //'GD' : 'Grenada', + 'GE': Lang$1.translate('country_ge'), + //'GF' : 'French Guiana', + //'GG' : 'Guernsey', + 'GH': Lang$1.translate('country_gh'), + //'GI' : 'Gibraltar', + 'GL': Lang$1.translate('country_gl'), + //'GM' : 'Gambia', + //'GN' : 'Guinea', + 'GP': Lang$1.translate('country_gp'), + //'GQ' : 'Equatorial Guinea', + 'GR': Lang$1.translate('country_gr'), + //'GS' : 'South Georgia And Sandwich Isl.', + 'GT': Lang$1.translate('country_gt'), + //'GU' : 'Guam', + //'GW' : 'Guinea-Bissau', + //'GY' : 'Guyana', + 'HK': Lang$1.translate('country_hk'), + //'HM' : 'Heard Island & Mcdonald Islands', + //'HN' : 'Honduras', + 'HR': Lang$1.translate('country_hr'), + 'HT': Lang$1.translate('country_ht'), + 'HU': Lang$1.translate('country_hu'), + 'ID': Lang$1.translate('country_id'), + 'IE': Lang$1.translate('country_ie'), + 'IL': Lang$1.translate('country_il'), + //'IM' : 'Isle Of Man', + 'IN': Lang$1.translate('country_in'), + //'IO' : 'British Indian Ocean Territory', + 'IQ': Lang$1.translate('country_iq'), + 'IR': Lang$1.translate('country_ir'), + 'IS': Lang$1.translate('country_is'), + 'IT': Lang$1.translate('country_it'), + //'JE' : 'Jersey', + 'JM': Lang$1.translate('country_jm'), + 'JO': Lang$1.translate('country_jo'), + 'JP': Lang$1.translate('country_jp'), + 'KE': Lang$1.translate('country_ke'), + 'KG': Lang$1.translate('country_kg'), + 'KH': Lang$1.translate('country_kh'), + //'KI' : 'Kiribati', + //'KM' : 'Comoros', + //'KN' : 'Saint Kitts And Nevis', + 'KP': Lang$1.translate('country_kp'), + 'KR': Lang$1.translate('country_kr'), + 'KW': Lang$1.translate('country_kw'), + //'KY' : 'Cayman Islands', + 'KZ': Lang$1.translate('country_kz'), + 'LA': Lang$1.translate('country_la'), + 'LB': Lang$1.translate('country_lb'), + //'LC' : 'Saint Lucia', + 'LI': Lang$1.translate('country_li'), + 'LK': Lang$1.translate('country_lk'), + 'LR': Lang$1.translate('country_lr'), + //'LS' : 'Lesotho', + 'LT': Lang$1.translate('country_lt'), + 'LU': Lang$1.translate('country_lu'), + 'LV': Lang$1.translate('country_lv'), + 'LY': Lang$1.translate('country_ly'), + 'MA': Lang$1.translate('country_ma'), + 'MC': Lang$1.translate('country_mc'), + 'MD': Lang$1.translate('country_md'), + 'ME': Lang$1.translate('country_me'), + //'MF' : 'Saint Martin', + //'MG' : 'Madagascar', + //'MH' : 'Marshall Islands', + 'MK': Lang$1.translate('country_mk'), + //'ML' : 'Mali', + 'MM': Lang$1.translate('country_mm'), + 'MN': Lang$1.translate('country_mn'), + 'MO': Lang$1.translate('country_mo'), + //'MP' : 'Northern Mariana Islands', + //'MQ' : 'Martinique', + //'MR' : 'Mauritania', + //'MS' : 'Montserrat', + 'MT': Lang$1.translate('country_mt'), + 'MU': Lang$1.translate('country_mu'), + 'MV': Lang$1.translate('country_mv'), + 'MW': Lang$1.translate('country_mw'), + 'MX': Lang$1.translate('country_mx'), + 'MY': Lang$1.translate('country_my'), + 'MZ': Lang$1.translate('country_mz'), + 'NA': Lang$1.translate('country_na'), + //'NC' : 'New Caledonia', + 'NE': Lang$1.translate('country_ne'), + //'NF' : 'Norfolk Island', + 'NG': Lang$1.translate('country_ng'), + 'NI': Lang$1.translate('country_ni'), + 'NL': Lang$1.translate('country_nl'), + 'NO': Lang$1.translate('country_no'), + 'NP': Lang$1.translate('country_np'), + //'NR' : 'Nauru', + //'NU' : 'Niue', + 'NZ': Lang$1.translate('country_nz'), + 'OM': Lang$1.translate('country_om'), + 'PA': Lang$1.translate('country_pa'), + 'PE': Lang$1.translate('country_pe'), + //'PF' : 'French Polynesia', + 'PG': Lang$1.translate('country_pg'), + 'PH': Lang$1.translate('country_ph'), + 'PK': Lang$1.translate('country_pk'), + 'PL': Lang$1.translate('country_pl'), + //'PM' : 'Saint Pierre And Miquelon', + //'PN' : 'Pitcairn', + 'PR': Lang$1.translate('country_pr'), + 'PS': Lang$1.translate('country_ps'), + 'PT': Lang$1.translate('country_pt'), + //'PW' : 'Palau', + 'PY': Lang$1.translate('country_py'), + 'QA': Lang$1.translate('country_qa'), + //'RE' : 'Reunion', + 'RO': Lang$1.translate('country_ro'), + 'RS': Lang$1.translate('country_rs'), + 'RU': Lang$1.translate('country_ru'), + 'RW': Lang$1.translate('country_rw'), + 'SA': Lang$1.translate('country_sa'), + //'SB' : 'Solomon Islands', + //'SC' : 'Seychelles', + 'SD': Lang$1.translate('country_sd'), + 'SE': Lang$1.translate('country_se'), + 'SG': Lang$1.translate('country_sg'), + //'SH' : 'Saint Helena', + 'SI': Lang$1.translate('country_si'), + //'SJ' : 'Svalbard And Jan Mayen', + 'SK': Lang$1.translate('country_sk'), + //'SL' : 'Sierra Leone', + //'SM' : 'San Marino', + 'SN': Lang$1.translate('country_sn'), + //'SO' : 'Somalia', + //'SR' : 'Suriname', + //'ST' : 'Sao Tome And Principe', + 'SU': Lang$1.translate('country_su'), + 'SV': Lang$1.translate('country_sv'), + 'SY': Lang$1.translate('country_sy'), + //'SZ' : 'Swaziland', + //'TC' : 'Turks And Caicos Islands', + //'TD' : 'Chad', + //'TF' : 'French Southern Territories', + //'TG' : 'Togo', + 'TH': Lang$1.translate('country_th'), + 'TJ': Lang$1.translate('country_tj'), + //'TK' : 'Tokelau', + //'TL' : 'Timor-Leste', + 'TM': Lang$1.translate('country_tm'), + 'TN': Lang$1.translate('country_tn'), + //'TO' : 'Tonga', + 'TR': Lang$1.translate('country_tr'), + //'TT' : 'Trinidad And Tobago', + //'TV' : 'Tuvalu', + 'TW': Lang$1.translate('country_tw'), + 'TZ': Lang$1.translate('country_tz'), + 'UA': Lang$1.translate('country_ua'), + 'UG': Lang$1.translate('country_ug'), + //'UM' : 'United States Outlying Islands', + 'US': Lang$1.translate('country_us'), + 'UY': Lang$1.translate('country_uy'), + 'UZ': Lang$1.translate('country_uz'), + //'VA' : 'Holy See (Vatican City State)', + //'VC' : 'Saint Vincent And Grenadines', + 'VE': Lang$1.translate('country_ve'), + //'VG' : 'Virgin Islands, British', + //'VI' : 'Virgin Islands, U.S.', + 'VN': Lang$1.translate('country_vn'), + //'VU' : 'Vanuatu', + //'WF' : 'Wallis And Futuna', + 'WS': Lang$1.translate('country_ws'), + 'YE': Lang$1.translate('country_ye'), + //'YT' : 'Mayotte', + 'YU': Lang$1.translate('country_yu'), + 'ZA': Lang$1.translate('country_za'), + 'ZM': Lang$1.translate('country_zm'), + 'ZW': Lang$1.translate('country_zw') + }; + return movie.production_countries ? movie.production_countries.map(function (a) { + //let cc = 'country_' + a.iso_3166_1.toLowerCase() + //return Lang.translate(cc) // FIXME! return a.name as fallback + if (iso_countries.hasOwnProperty(a.iso_3166_1)) { + return iso_countries[a.iso_3166_1]; + } else { + return a.name; + } + }) : ''; + } + + function getGenresNameFromIds(card_type, ids) { + var finded = []; + var where = genres$1[card_type]; + ids.forEach(function (a) { + var find = where.find(function (i) { + return i.id == a; + }); + if (find) finded.push(Utils$1.capitalizeFirstLetter(Lang$1.translate(find.title))); + }); + return finded; + } + + function clear$8() { + network$8.clear(); + } + + var TMDB = { + main: main$2, + menu: menu$2, + img: img$1, + full: full$3, + list: list$4, + category: category$3, + search: search$5, + clear: clear$8, + company: company$1, + person: person$2, + seasons: seasons$2, + find: find$2, + external_ids: external_ids, + get: get$d, + menuCategory: menuCategory$2, + discovery: discovery$2, + parsePG: parsePG, + parseCountries: parseCountries, + genres: genres$1, + external_imdb_id: external_imdb_id, + getGenresNameFromIds: getGenresNameFromIds, + videos: videos + }; + + var Card$2 = { + onCreate: function onCreate() { + var _this = this, + _this$html$find; + + this.html = Template.js('card'); + this.img = this.html.find('.card__img') || {}; + + this.img.onload = function () { + _this.html.addClass('card--loaded'); + }; + + this.img.onerror = function () { + console.log('Img', 'noload', _this.img.src); + _this.img.src = './img/img_broken.svg'; + }; + + this.html.card_data = this.data; + (_this$html$find = this.html.find('.card__title')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.text(this.data.title || ''); + this.html.on('visible', this.emit.bind(this, 'visible')); + }, + onVisible: function onVisible() { + var src = ''; + if (this.params.style.name == 'wide' && this.data.backdrop_path) src = TMDB.img(this.data.backdrop_path, 'w780');else if (this.params.style.name == 'collection' && this.data.backdrop_path) src = TMDB.img(this.data.backdrop_path, 'w500');else if (this.data.poster_path) src = TMDB.img(this.data.poster_path);else if (this.data.profile_path) src = TMDB.img(this.data.profile_path);else if (this.data.poster) src = this.data.poster;else if (this.data.img) src = this.data.img;else src = './img/img_broken.svg'; + this.img.src = src; + this.emit('update'); + }, + onDestroy: function onDestroy() { + this.img.onerror = function () {}; + + this.img.onload = function () {}; + + this.img.src = ''; + } + }; + + var Folder = { + onCreate: function onCreate() { + this.html = Template.js('bookmarks_folder'); + this.html.find('.bookmarks-folder__title').text(Lang$1.translate('menu_' + this.data.media)); + this.html.find('.bookmarks-folder__num').text(this.data.results.length); + this.html.on('visible', this.emit.bind(this, 'visible')); + }, + onImage: function onImage(src, i) { + var _this = this; + + var img = Template.elem('img', { + "class": 'card__img i-' + i + }); + this.html.find('.bookmarks-folder__body').append(img); + Utils$1.imgLoad(img, src, function () { + _this.html.addClass('card--loaded'); + }, function () { + img.src = './img/img_broken.svg'; + }); + }, + onVisible: function onVisible() { + var _this2 = this; + + var filtred = this.data.results.filter(function (a) { + return a.poster_path; + }).slice(0, 3); + filtred.forEach(function (a, i) { + _this2.emit('image', TMDB.img(a.poster_path), i); + }); + if (filtred.length == 0) this.emit('image', './img/img_load.svg'); + } + }; + + var Icons = { + onCreate: function onCreate() { + var data = this.data; + + if (data.original_name) { + var _this$html$find; + + (_this$html$find = this.html.find('.card__view')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.append(Template.elem('div', { + "class": 'card__type', + text: data.original_name ? 'TV' : 'MOV' + })); + this.html.addClass(data.original_name ? 'card--tv' : 'card--movie'); + } + + var qu = data.quality || data.release_quality; + + if (qu && Storage.field('card_quality') && !data.original_name) { + var _this$html$find2; + + (_this$html$find2 = this.html.find('.card__view')) === null || _this$html$find2 === void 0 ? void 0 : _this$html$find2.append(Template.elem('div', { + "class": 'card__quality', + children: [Template.elem('div', { + text: qu + })] + })); + } + } + }; + + var Ratting = { + onCreate: function onCreate() { + var vote = parseFloat((this.data.cub_hundred_rating || this.data.vote_average || 0) + '').toFixed(1); + + if (vote > 0) { + this.html.find('.card__view').append(Template.elem('div', { + "class": 'card__vote', + text: this.data.cub_hundred_fire ? Utils$1.bigNumberToShort(this.data.cub_hundred_fire) : vote >= 10 ? 10 : vote + })); + } + } + }; + + var Release = { + onCreate: function onCreate() { + var release_year = ((this.data.release_date || this.data.birthday || '0000') + '').slice(0, 4); + + if (release_year == '0000') { + var _this$html$find; + + (_this$html$find = this.html.find('.card__age')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.remove(); + } else { + var _this$html$find2; + + (_this$html$find2 = this.html.find('.card__age')) === null || _this$html$find2 === void 0 ? void 0 : _this$html$find2.text(release_year); + } + } + }; + + var Favorite$1 = { + onCreate: function onCreate() { + var _this = this; + + var onCheck = function onCheck(a) { + Favorite.toggle(a.where, _this.data); + }; + + var onSelect = function onSelect(a) { + onCheck(a); + + _this.emit('menuSelect', a, _this.html, _this.data); + }; + + var onDraw = function onDraw(item) { + if (!Account$1.hasPremium()) { + var wrap = $('
'); + wrap.append(Template.js('icon_lock')); + item.find('.selectbox-item__checkbox').remove(); + item.append(wrap); + item.on('hover:enter', function () { + Select.close(); + Account$1.showCubPremium(); + }); + } + }; + + function drawMenu() { + var status = Favorite.check(this.data); + var menu = []; + var items_check = ['book', 'like', 'wath', 'history']; + var items_mark = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; + items_check.forEach(function (c) { + menu.push({ + title: Lang$1.translate('title_' + c), + where: c, + checkbox: true, + checked: status[c], + onCheck: onCheck + }); + }); + menu.push({ + title: Lang$1.translate('settings_cub_status'), + separator: true + }); + items_mark.forEach(function (m) { + menu.push({ + title: Lang$1.translate('title_' + m), + where: m, + picked: Account$1.hasPremium() ? status[m] : false, + collect: true, + noenter: !Account$1.hasPremium(), + onSelect: onSelect, + onDraw: onDraw + }); + }); + return menu; + } + + this.menu_list.push({ + title: Lang$1.translate('settings_input_links'), + menu: drawMenu.bind(this) + }); + + this.listenerFavorite = function (e) { + if (e.target == 'favorite') { + if (e.card) { + if (e.card.id == _this.data.id) _this.emit('favorite'); + } else _this.emit('favorite'); + } + }; + + Lampa.Listener.follow('state:changed', this.listenerFavorite); + }, + onUpdate: function onUpdate() { + this.emit('favorite'); + }, + onAddicon: function onAddicon(name) { + this.html.find('.card__icons-inner').append(Template.elem('div', { + "class": 'card__icon icon--' + name + })); + }, + onFavorite: function onFavorite() { + var status = Favorite.check(this.data); + var marker = this.html.find('.card__marker'); + var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; + this.html.find('.card__icons-inner').innerHTML = ''; + if (status.book) this.emit('addicon', 'book'); + if (status.like) this.emit('addicon', 'like'); + if (status.wath) this.emit('addicon', 'wath'); + if (status.history || Timeline.watched(this.data)) this.emit('addicon', 'history'); + var any_marker = marks.find(function (m) { + return status[m]; + }); + + if (any_marker) { + if (!marker) { + marker = Template.elem('div', { + "class": 'card__marker', + children: [Template.elem('span')] + }); + this.html.find('.card__view').append(marker); + } + + marker.find('span').text(Lang$1.translate('title_' + any_marker)); + marker.removeClass(marks.map(function (m) { + return 'card__marker--' + m; + }).join(' ')).addClass('card__marker--' + any_marker); + } else if (marker) marker.remove(); + }, + onDestroy: function onDestroy() { + Lampa.Listener.remove('state:changed', this.listenerFavorite); + } + }; + + var Callback$1 = { + onCreate: function onCreate() { + this.html.on('hover:focus', this.emit.bind(this, 'focus', this.html, this.data)); + this.html.on('hover:touch', this.emit.bind(this, 'touch', this.html, this.data)); + this.html.on('hover:hover', this.emit.bind(this, 'hover', this.html, this.data)); + this.html.on('hover:enter', this.emit.bind(this, 'enter', this.html, this.data)); + this.html.on('hover:long', this.emit.bind(this, 'long', this.html, this.data)); + } + }; + + var Line$6 = { + onCreate: function onCreate() { + var _this = this; + + this.html = Template.js('season_episode', this.data); + this.prefix = Template.prefix(this.html, 'season-episode'); + + if (this.data.vote_average) { + this.prefix.info.append(Template.js('season_episode_rate', { + rate: parseFloat(this.data.vote_average + '').toFixed(1) + })); + } + + if (this.data.air_date) { + this.data.vote_average && this.prefix.info.append(Template.elem('span', { + "class": 'season-episode-split', + text: '●' + })); + this.prefix.info.append(Template.elem('span', { + text: Utils$1.parseTime(this.data.air_date).full + })); + } + + if (this.data.left_days) { + this.prefix.quality.text(this.data.left_text); + this.html.style.opacity = 0.5; + } + + var visible = function visible() { + _this.prefix.loader.remove(); + + _this.prefix.img.append(Template.elem('div', { + "class": 'season-episode__episode-number', + text: ('0' + _this.data.episode_number).slice(-2) + })); + }; + + this.prefix.timeline.append(Timeline.render(this.data.timeline)); + this.html.on('visible', function () { + var img = _this.html.find('img'); + + img.onerror = function () { + img.src = './img/img_broken.svg'; + }; + + img.onload = function () { + _this.prefix.img.addClass('season-episode__img--loaded'); + + visible(); + }; + + if (_this.data.still_path) img.src = TMDB.img('t/p/w300' + _this.data.still_path);else if (_this.data.img) img.src = _this.data.img;else visible(); + }); + }, + onViewed: function onViewed() { + var _this$html$find; + + (_this$html$find = this.html.find('.season-episode__viewed')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.remove(); + var mark = Template.elem('div', { + "class": 'season-episode__viewed', + children: [Template.js('icon_viewed')] + }); + if (Boolean(this.data.timeline.percent)) this.html.find('.season-episode__img').append(mark); + } + }; + + var Small = { + onCreate: function onCreate() { + var _this = this; + + this.html = Template.js('full_episode', this.data); + this.prefix = Template.prefix(this.html, 'full-episode'); + this.html.addClass('full-episode--small'); + this.html.append(Template.elem('div', { + "class": 'full-episode__viewed', + children: [Template.js('icon_viewed')] + })); + this.html.on('visible', function () { + var src = './img/img_broken.svg'; + if (_this.data.still_path) src = TMDB.img(_this.data.still_path, 'w300');else if (_this.data.img) src = _this.data.img; + Utils$1.imgLoad(_this.html.find('img'), src, function () { + _this.html.addClass('full-episode--loaded'); + }); + }); + }, + onViewed: function onViewed() { + this.html.toggleClass('full-episode--viewed', Boolean(this.data.timeline.percent)); + } + }; + + var SmallNext = { + onCreate: function onCreate() { + this.html = Template.js('full_episode', this.data); + this.html.addClass('full-episode--small full-episode--next'); + } + }; + + var Mark = { + onCreate: function onCreate() { + var _this = this; + + this.html.on('hover:enter', function () { + if (Boolean(_this.data.timeline.percent)) { + _this.data.timeline.time = 0; + _this.data.timeline.percent = 0; + } else { + _this.data.timeline.time = typeof _this.data.timeline.duration == 'number' ? _this.data.timeline.duration * 0.95 : 0; + _this.data.timeline.percent = 95; + } + + Timeline.update(_this.data.timeline); + + _this.emit('viewed'); + }); + this.emit('viewed'); + + this.listenerTimeline = function (e) { + if (e.target == 'timeline' && e.reason == 'update' && e.data.hash == _this.data.timeline.hash) { + for (var i in e.data.road) { + _this.data.timeline[i] = e.data.road[i]; + } + + _this.emit('viewed'); + } + }; + + Lampa.Listener.follow('state:changed', this.listenerTimeline); + }, + onDestroy: function onDestroy() { + Lampa.Listener.remove('state:changed', this.listenerTimeline); + } + }; + + var Card$1 = { + onInit: function onInit() { + this.card = this.data.card || {}; + }, + onCreate: function onCreate() { + var _this = this; + + this.html = Template.js('card_episode'); + this.img_poster = this.html.find('.card__img') || {}; + this.img_episode = this.html.find('.full-episode__img img') || {}; + + this.img_poster.onerror = function () { + _this.img_poster.src = './img/img_broken.svg'; + }; + + this.img_episode.onload = function () { + _this.html.find('.full-episode__img').addClass('full-episode__img--loaded'); + }; + + this.img_episode.onerror = function () { + _this.img_episode.src = './img/img_broken.svg'; + }; + + this.html.find('.card__title').text(this.card.title || this.card.name); + this.html.find('.full-episode__name').text(this.data.name || Lang$1.translate('noname')); + this.html.find('.full-episode__num').text(this.data.episode_number || ''); + this.html.find('.full-episode__date').text(this.data.air_date ? Utils$1.parseTime(this.data.air_date).full : '----'); + var release_year = ((this.card.release_date || this.card.first_air_date || '0000') + '').slice(0, 4); + + if (release_year == '0000') { + var _this$html$find; + + (_this$html$find = this.html.find('.card__age')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.remove(); + } else { + this.html.find('.card__age').text(release_year); + } + + this.html.on('visible', this.emit.bind(this, 'visible')); + }, + onVisible: function onVisible() { + if (this.card.poster_path) this.img_poster.src = TMDB.img(this.card.poster_path);else if (this.card.profile_path) this.img_poster.src = TMDB.img(this.card.profile_path);else if (this.card.poster) this.img_poster.src = this.card.poster;else if (this.card.img) this.img_poster.src = this.card.img;else this.img_poster.src = './img/img_broken.svg'; + if (this.data.still_path) this.img_episode.src = TMDB.img(this.data.still_path, 'w300');else if (this.card.backdrop_path) this.img_episode.src = TMDB.img(this.card.backdrop_path, 'w300');else this.img_episode.src = './img/img_broken.svg'; + }, + onDestroy: function onDestroy() { + this.img_poster.onerror = function () {}; + + this.img_poster.onload = function () {}; + + this.img_episode.onerror = function () {}; + + this.img_episode.onload = function () {}; + + this.img_poster.src = ''; + this.img_episode.src = ''; + } + }; + + var EpisodeMap = { + Line: Line$6, + Card: Card$1, + Small: Small, + SmallNext: SmallNext, + Mark: Mark, + Callback: Callback$1 + }; + + var Episode = /*#__PURE__*/function (_Constructor) { + _inherits(Episode, _Constructor); + + var _super = _createSuper(Episode); + + function Episode(data) { + var _this; + + _classCallCheck(this, Episode); + + _this = _super.call(this, data); + data.hash = Utils$1.hash([data.season_number, data.season_number > 10 ? ':' : '', data.episode_number, data.card ? data.card.original_name : data.original_name].join('')); + var out_air = new Date((data.air_date + '').replace(/-/g, '/')); + var out_now = Date.now(); + var out_day = data.air_date ? Math.round((out_air.getTime() - out_now) / (24 * 60 * 60 * 1000)) : 1; + data.left_days = out_day > 0 ? out_day : 0; + data.left_text = Lang$1.translate('full_episode_days_left') + ': ' + (data.air_date ? out_day : '- -'); + data.timeline = Timeline.view(data.hash); + data.time = Utils$1.secondsToTime(data.runtime * 60, true); + data.title = data.name || Lang$1.translate('torrent_serial_episode') + ' ' + data.episode_number; + data.date = data.air_date ? Utils$1.parseTime(data.air_date).full : '----'; + data.num = data.episode_number; + return _this; + } + + return Episode; + }(Constructor(EpisodeMap)); + + var Helper$a = new Mask(Arrays.getKeys(EpisodeMap)); + Helper$a.MASK.base = Helper$a.only('Mark'); + + var data$2 = []; + var object$1 = false; + var limit$2 = 300; + var started = Date.now(); + /** + * Запуск + */ + + function init$T() { + data$2 = Storage.cache('timetable', limit$2, []); + Timer.add(1000 * 60 * 10, favorites); + Timer.add(1000 * 60 * (2), extract$1); + Favorite.listener.follow('add,added', function (e) { + if (e.card.number_of_seasons && e.where !== 'history') update$a(e.card); + }); + Favorite.listener.follow('remove', function (e) { + if (e.card.number_of_seasons && e.method == 'id') { + var find = data$2.find(function (a) { + return a.id == e.card.id; + }); + + if (find) { + Arrays.remove(data$2, find); + Storage.set('timetable', data$2); + Storage.remove('timetable', find.id); + } + } + }); + Lampa.Listener.follow('worker_storage', function (e) { + if (e.type == 'insert' && e.name == 'timetable') { + data$2 = Storage.get('timetable', '[]'); + } + }); + ContentRows.add({ + index: 0, + screen: ['main', 'category'], + call: function call(params, screen) { + if (screen == 'category' && params.url == 'movie') return; + var results = lately().slice(0, 20); + if (!results.length) return; + return function (call) { + results.forEach(function (item) { + item.params = { + createInstance: function createInstance(item) { + return new Episode(item); + }, + module: Helper$a.only('Card', 'Callback'), + emit: { + onlyEnter: router.call.bind(router, 'full', item.card), + onlyFocus: function onlyFocus() { + Background.change(Utils$1.cardImgBackgroundBlur(item.card)); + } + } + }; + Arrays.extend(item, item.episode); + }); + call({ + results: results, + title: Lang$1.translate('title_upcoming_episodes') + }); + }; + } + }); + } + /** + * Добавить карточки к парсингу + * @param {[{id:integer,number_of_seasons:integer}]} elems - карточки + */ + + + function add$a(elems) { + if (started + 1000 * 60 * 2 > Date.now()) return; + var filtred = elems.filter(function (elem) { + return elem.number_of_seasons && typeof elem.id == 'number' && (elem.source == 'tmdb' || elem.source == 'cub'); + }); + console.log('Timetable', 'add:', elems.length, 'filtred:', filtred.length); + filtred.forEach(function (elem) { + var find = data$2.find(function (a) { + return a.id == elem.id; + }); + + if (!find) { + data$2.push({ + id: elem.id, + season: elem.number_of_seasons, + episodes: [] + }); + } + }); + Storage.set('timetable', data$2); + } + /** + * Добавить из закладок + */ + + + function favorites() { + var category = ['like', 'wath', 'book', 'look', 'viewed', 'scheduled', 'continued', 'thrown']; + category.forEach(function (a) { + add$a(Favorite.get({ + type: a + })); + }); + } + + function filter$2(episodes) { + var filtred = []; + var fileds = ['air_date', 'season_number', 'episode_number', 'name', 'still_path']; + episodes.forEach(function (episode) { + var item = {}; + fileds.forEach(function (field) { + if (typeof episode[field] !== 'undefined') item[field] = episode[field]; + }); + filtred.push(item); + }); + return filtred; + } + /** + * Парсим карточку + */ + + + function parse(to_database) { + var check = Favorite.check(object$1); + var any = Favorite.checkAnyNotHistory(check); + console.log('Timetable', 'parse:', object$1.id, 'any:', any, 'season:', object$1.season); + + if (any || to_database) { + TMDB.get('tv/' + object$1.id + '/season/' + object$1.season, {}, function (ep) { + if (!ep.episodes) return save$3(); + object$1.episodes = filter$2(ep.episodes); + Cache.getData('timetable', object$1.id).then(function (obj) { + if (obj) obj.episodes = object$1.episodes;else obj = Arrays.clone(object$1); + Cache.rewriteData('timetable', object$1.id, obj).then(function () {})["catch"](function () {}); + Lampa.Listener.send('state:changed', { + target: 'timetable', + reason: 'parse', + id: object$1.id + }); + })["catch"](function (e) {}); + save$3(); + }, save$3, { + life: 60 * 24 * 3 + }); + } else { + Arrays.remove(data$2, object$1); + Storage.remove('timetable', object$1.id); + save$3(); + } + } + /** + * Получить карточку для парсинга + */ + + + function extract$1() { + var ids = data$2.filter(function (e) { + return !e.scaned && (e.scaned_time || 0) + 60 * 60 * 12 * 1000 < Date.now(); + }); + console.log('Timetable', 'extract:', ids.length, 'total:', data$2.length); + + if (ids.length) { + object$1 = ids[0]; + parse(); + } else { + data$2.forEach(function (a) { + return a.scaned = 0; + }); + } + + Storage.set('timetable', data$2); + } + /** + * Сохранить состояние + */ + + + function save$3() { + if (object$1) { + object$1.scaned = 1; + object$1.scaned_time = Date.now(); + Storage.set('timetable', data$2); + } + } + /** + * Получить эпизоды для карточки если есть + * @param {{id:integer}} elem - карточка + * @returns {array} + */ + + + function get$c(elem, callback) { + var fid = data$2.filter(function (e) { + return e.id == elem.id; + }); + var res = (fid.length ? fid[0] : {}).episodes || []; + + if (typeof callback == 'function') { + if (res.length) return callback(res); + Cache.getData('timetable', elem.id).then(function (obj) { + callback(obj ? obj.episodes || [] : [], true); + })["catch"](function (e) { + callback(res, true); + }); + } else { + return res; + } + } + /** + * Добавить карточку в парсинг самостоятельно + * @param {{id:integer,number_of_seasons:integer}} elem - карточка + */ + + + function update$a(elem) { + if (elem.number_of_seasons && typeof elem.id == 'number' && (elem.source == 'tmdb' || elem.source == 'cub')) { + var check = Favorite.check(elem); + var any = Favorite.checkAnyNotHistory(check); + var id = data$2.filter(function (a) { + return a.id == elem.id; + }); + var item = { + id: elem.id, + season: Utils$1.countSeasons(elem), + episodes: [] + }; + TMDB.clear(); + + if (any) { + if (!id.length) { + console.log('Timetable', 'push:', elem.id); + data$2.push(item); + Storage.set('timetable', data$2); + object$1 = item; + } else { + object$1 = id[0]; + object$1.season = Utils$1.countSeasons(elem); + } + + parse(); + } else { + object$1 = item; + parse(true); + } + } + } + /** + * Получить все данные + * @returns {[{id:integer,season:integer,episodes:[]}]} + */ + + + function all$3() { + return data$2; + } + + function lately() { + var fav = Favorite.full().card; + if (Account$1.Permit.sync) fav = Account$1.Bookmarks.all(); + fav = fav.filter(function (f) { + return f.number_of_seasons; + }); + var now_date = new Date(); + now_date.setHours(0, 0, 0); + var now_time = now_date.getTime(); + var cards = []; + data$2.filter(function (d) { + return fav.find(function (c) { + return c.id == d.id; + }); + }).forEach(function (season) { + var episodes = season.episodes.filter(function (ep) { + return Lampa.Utils.parseToDate(ep.air_date).getTime() >= now_time; + }); + + if (episodes.length) { + cards.push({ + card: Arrays.clone(fav.find(function (c) { + return c.id == season.id; + })), + episode: episodes[0], + time: Lampa.Utils.parseToDate(episodes[0].air_date).getTime(), + season: season + }); + } + }); + cards = cards.sort(function (a, b) { + if (a.time > b.time) return 1;else if (a.time < b.time) return -1;else return 0; + }); + return cards; + } + + var TimeTable = { + init: init$T, + get: get$c, + add: add$a, + all: all$3, + update: update$a, + lately: lately + }; + + var Watched$1 = { + onCreate: function onCreate() { + var _this = this; + + var timer; + this.html.on('hover:focus hover:touch hover:hover', function () { + clearTimeout(timer); + timer = setTimeout(function () { + _this.html.classList.contains('focus') && _this.emit('watched'); + }, 500); + }); + + this.listenerWatched = function (e) { + if (e.target == 'timeline' && e.reason == 'read' || e.target == 'timetable' && e.id == _this.data.id) _this.emit('update'); + }; + + Lampa.Listener.follow('state:changed', this.listenerWatched); + }, + onUpdate: function onUpdate() { + var _this$watched_wrap; + + this.watched_checked = false; + (_this$watched_wrap = this.watched_wrap) === null || _this$watched_wrap === void 0 ? void 0 : _this$watched_wrap.remove(); + this.html.classList.contains('focus') && this.emit('watched'); + }, + onWatched: function onWatched() { + var _this2 = this; + + if (!Storage.field('card_episodes')) return; + + if (!this.watched_checked) { + var get = function get(callback) { + if (data.original_name) TimeTable.get(data, callback);else callback([]); + }; + + var data = this.data; + get(function (episodes, from_db) { + var viewed; + + var Draw = function Draw() { + episodes.forEach(function (ep) { + var hash = Utils$1.hash([ep.season_number, ep.season_number > 10 ? ':' : '', ep.episode_number, data.original_title].join('')); + var view = Timeline.view(hash); + if (view.percent) viewed = { + ep: ep, + view: view + }; + }); // Пытаемся найти последний просмотренный из истории последнего просмотра + + if (!viewed && data.original_name) { + var last = Storage.get('online_watched_last', '{}'); + var filed = last[Utils$1.hash(data.original_title)]; + + if (filed && filed.episode) { + viewed = { + ep: { + episode_number: filed.episode, + name: Lang$1.translate('full_episode') + ' ' + filed.episode + }, + view: Timeline.view(Utils$1.hash([filed.season, filed.season > 10 ? ':' : '', filed.episode, data.original_title].join(''))) + }; + } + } // Если это фильм и не нашли просмотренное, то проверим по прогрессу просмотра из таймлайна + + + if (!viewed && !data.original_name) { + var time = Timeline.watched(data, true); + + if (time.percent) { + viewed = { + ep: { + name: Lang$1.translate('title_viewed') + ' ' + (time.time ? Utils$1.secondsToTimeHuman(time.time) : time.percent + '%') + }, + view: time + }; + } + } // Если это сериал и не нашли просмотренное, то проверим по прогрессу просмотра из таймлайна + + + if (!viewed && data.original_name) { + var any = Timeline.watched(data, true).pop(); + if (any) viewed = { + ep: { + name: Lang$1.translate('full_episode') + ' ' + any.ep + }, + view: any.view + }; + } + + if (viewed) { + var soon = []; + var next = episodes.slice(episodes.indexOf(viewed.ep)).filter(function (ep) { + return ep.air_date; + }).filter(function (ep) { + var date = Utils$1.parseToDate(ep.air_date).getTime(); + if (date > Date.now()) soon.push(ep); + return date < Date.now(); + }).slice(0, 5); + if (next.length == 0) next = [viewed.ep]; + if (soon.length && next.length < 5 && !next.find(function (n) { + return n.episode_number == soon[0].episode_number; + })) next.push(soon[0]); + var wrap = Template.js('card_watched', {}); + next.forEach(function (ep) { + var div = document.createElement('div'); + var span = document.createElement('span'); + var date = Utils$1.parseToDate(ep.air_date); + var now = Date.now(); + var days = Math.ceil((date.getTime() - now) / (24 * 60 * 60 * 1000)); + div.addClass('card-watched__item'); + div.append(span); + span.innerText = (ep.episode_number ? ep.episode_number + ' - ' : '') + (days > 0 ? Lang$1.translate('full_episode_days_left') + ': ' + days : ep.name || Lang$1.translate('noname')); + if (ep == viewed.ep) div.append(Timeline.render(viewed.view)[0]); + wrap.find('.card-watched__body').append(div); + }); + _this2.watched_wrap = wrap; + + var view = _this2.html.find('.card__view'); + + view.insertBefore(wrap, view.firstChild); + } + }; + + Draw(); + }); + this.watched_checked = true; + } + }, + onDestroy: function onDestroy() { + Lampa.Listener.remove('state:changed', this.listenerWatched); + } + }; + + var Style = { + onCreate: function onCreate() { + if (this.params.style.name == 'collection') { + var _this$html$find; + + this.html.addClass('card--collection'); + (_this$html$find = this.html.find('.card__age')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.remove(); + } + + if (this.params.style.name == 'wide') { + var _this$html$find2, _this$html$find3; + + (_this$html$find2 = this.html.find('.card__title')) === null || _this$html$find2 === void 0 ? void 0 : _this$html$find2.remove(); + (_this$html$find3 = this.html.find('.card__age')) === null || _this$html$find3 === void 0 ? void 0 : _this$html$find3.remove(); + this.html.addClass('card--wide'); + this.data.poster = this.data.cover; + var promo_wrap = Template.elem('div', { + "class": 'card__promo' + }); + + if (this.data.title || this.data.name) { + promo_wrap.append(Template.elem('div', { + "class": 'card__promo-title', + text: this.data.title || this.data.name + })); + } + + if (this.data.overview) { + promo_wrap.append(Template.elem('div', { + "class": 'card__promo-text', + text: this.data.overview.slice(0, 110) + (this.data.overview.length > 110 ? '...' : '') + })); + } + + this.html.find('.card__view').append(promo_wrap); + } + } + }; + + var html$e = null; + /** + * Показать подсказку по управлению + * @param {Object} params - Параметры + * @param {string} params.name - Имя для кеша + * @param {string} params.text - Текст подсказки + * @param {string} params.button - Кнопка для подсветки (ok, up, down, left, right) + * @param {number} params.interval - Интервал показа в минутах (по умолчанию 7 дней) + * @return {void} + */ + + function show$7() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (html$e || !Platform.tv() || !Cache.db) return; + Arrays.extend(params, { + name: 'none', + text: Lang$1.translate('remote_helper_long'), + button: 'ok', + interval: 60 * 24 * 7 // week + + }); + var cache_name = 'remote_helper_' + params.name; + Cache.getDataAnyCase('other', cache_name, params.interval).then(function (cached_time) { + if (cached_time) return; + html$e = Template.js('remote_helper', params); + html$e.addClass('highlight--' + params.button); + document.body.appendChild(html$e); + setTimeout(function () { + html$e.addClass('active'); + setTimeout(function () { + html$e.removeClass('active'); + setTimeout(function () { + html$e.remove(); + html$e = null; + }, 500); + }, 10000); + }, 10); + Cache.rewriteData('other', cache_name, Date.now()); + }); + } + + var RemoteHelper = { + show: show$7 + }; + + var Menu = { + onInit: function onInit() { + this.menu_list = []; + }, + onCreate: function onCreate() { + var _this = this; + + this.html.on('hover:long', function () { + var enabled = Controller.enabled().name; + var menu = []; + + _this.menu_list.forEach(function (item, i) { + i !== 0 && menu.push({ + title: item.title, + separator: true + }); + menu = menu.concat(item.menu()); + }); + + if (!menu.length) return; + + _this.emit('menu', menu, _this.html, _this.data); + + Select.show({ + title: Lang$1.translate('title_action'), + items: menu, + onBack: function onBack() { + Controller.toggle(enabled); + }, + onBeforeClose: function onBeforeClose() { + Controller.toggle(enabled); + return true; + } + }); + }); + this.html.on('hover:focus', function () { + if (window.app_time_end < Date.now() - 20000) RemoteHelper.show({ + name: 'card_menu' + }); + }); + } + }; + + var callback_cancel, controller_enabled, loader, timer$4; + /** + * Отображает слой загрузки с возможностью отмены + * @param {function} on_cancel - вызывается при отмене загрузки + * @param {string} text - текст загрузки + * @returns {void} + */ + + function start$5(on_cancel, text) { + callback_cancel = on_cancel; + controller_enabled = Controller.enabled().name; + loader = $("
\n
\n
".concat(Lang$1.translate('loading'), "
\n
\n
\n
")); + if (text) loader.find('.loading-layer__text').text(text); + loader.on('click', function (e) { + if (DeviceInput.canClick(e.originalEvent)) cancel(); + }); + clearTimeout(timer$4); + timer$4 = setTimeout(function () { + $('body').append(loader); + }, 500); + toggle$7(); + } + /** + * Переключает контроллер на слой загрузки + * @returns {void} + */ + + + function toggle$7() { + Controller.add('loading', { + invisible: true, + toggle: function toggle() { + Controller.clear(); + }, + back: cancel, + up: cancel, + down: cancel, + left: cancel, + right: cancel + }); + Controller.toggle('loading'); + } + /** + * Вызывает колбэк отмены загрузки + * @returns {void} + */ + + + function cancel() { + if (callback_cancel) callback_cancel(); + } + /** + * Удаляет слой загрузки и восстанавливает контроллер + * @returns {void} + */ + + + function stop() { + if (loader) loader.remove(); + clearTimeout(timer$4); + if (controller_enabled) Controller.toggle(controller_enabled); + } + /** + * Обновляет текст загрузки + * @param {string} text - текст загрузки + * @returns {void} + */ + + + function setText(text) { + if (loader) loader.find('.loading-layer__text').text(text); + } + + var Loading$1 = { + start: start$5, + stop: stop, + setText: setText + }; + + var Plugins$1 = { + onCreate: function onCreate() { + function drawMenu() { + var _this = this; + + var menu = []; + object$2.plugins.forEach(function (plugin) { + if (plugin.type == 'video' && plugin.onContextMenu && plugin.onContextLauch) { + menu.push({ + title: plugin.name, + subtitle: plugin.subtitle || plugin.description, + onSelect: function onSelect() { + if (!_this.data.imdb_id && _this.data.source == 'tmdb') { + Loading$1.start(function () { + Loading$1.stop(); + Controller.toContent(); + }); + TMDB.external_imdb_id({ + type: _this.data.name ? 'tv' : 'movie', + id: _this.data.id + }, function (imdb_id) { + Loading$1.stop(); + _this.data.imdb_id = imdb_id; + plugin.onContextLauch(_this.data); + }); + } else plugin.onContextLauch(_this.data); + } + }); + } + }); + return menu; + } + + this.menu_list.push({ + title: Lang$1.translate('settings_main_plugins'), + menu: drawMenu.bind(this) + }); + } + }; + + var Subscribe = { + onCreate: function onCreate() { + if (this.data.subscribe) { + var data = this.data.subscribe; + var sube = Template.elem('div', { + "class": 'card__subscribe', + children: [Template.elem('div', { + "class": 'card__subscribe-status ' + (data.status ? 'on' : 'off') + }), Template.elem('div', { + "class": 'card__subscribe-position', + text: 'S' + data.season + ' E' + data.episode + }), Template.elem('div', { + "class": 'card__subscribe-voice', + text: data.voice + })] + }); + this.html.find('.card__view').after(sube); + } + } + }; + + var CardMap = { + Card: Card$2, + Folder: Folder, + Icons: Icons, + Ratting: Ratting, + Release: Release, + Plugins: Plugins$1, + Favorite: Favorite$1, + Watched: Watched$1, + Subscribe: Subscribe, + Style: Style, + Menu: Menu, + Callback: Callback$1 + }; + + var Helper$9 = new Mask(Arrays.getKeys(CardMap)); + Helper$9.MASK.base = Helper$9.toggle(Helper$9.MASK.all, 'Folder', 'Subscribe'); + + var data$1 = {}; + var listener$b = Subscribe$2(); + var category$2 = ['like', 'wath', 'book', 'history', 'look', 'viewed', 'scheduled', 'continued', 'thrown']; + var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; + /** + * Запуск + */ + + function init$S() { + read$1(); + ContentRows.add({ + index: 1, + screen: ['main', 'category'], + call: function call(params, screen) { + var media = screen == 'main' ? 'tv' : params.url; + var results = continues(media); + if (!results.length) return; + return function (call) { + // Смотрим есть ли новые серии с переводом + if (media == 'tv' || media == 'anime') { + var cub_notices = Notice$1.get('cub').items(); + cub_notices = cub_notices.filter(function (n) { + return n.item.method == 'tv-voice'; + }); // Получаем из истории только те карточки которые есть в уведомлениях + + var history = get$b({ + type: 'history' + }).filter(function (h) { + return cub_notices.find(function (n) { + return n.item.card_id == h.id; + }); + }); // Фильтруем только те карточки у которых есть новые серии + + var new_episode = history.map(function (h) { + var noty = cub_notices.find(function (n) { + return n.item.card_id == h.id; + }); + var card = Arrays.clone(h); + card.params = { + module: Helper$9.toggle(Helper$9.MASK.base, 'Subscribe') + }; + card.subscribe = { + status: 1, + season: noty.item.season, + episode: noty.item.episode, + voice: noty.data.voice + }; + card.viewed = Timeline.watchedEpisode(h, noty.item.season, noty.item.episode); + return card; + }); // Оставляем только те у которых просмотр меньше 10% + + new_episode = new_episode.filter(function (n) { + return n.viewed < 10; + }); + + if (new_episode.length) { + // Убираем из основного списка карточки у которых есть новые серии + results = results.filter(function (r) { + return !new_episode.find(function (h) { + return h.id == r.id; + }); + }); + results = [].concat(new_episode, results); // Оставляем не более 20 карточек + + results = results.slice(0, 19); + } + } + + call({ + results: results, + title: media == 'tv' || media == 'anime' ? Lang$1.translate('title_continue') : Lang$1.translate('title_watched') + }); + }; + } + }); + } + /** + * Сохранить + */ + + + function save$2() { + Storage.set('favorite', data$1); + } + /** + * Добавить + * @param {String} where + * @param {Object} card + */ + + + function add$9(where, card, limit) { + if (Account$1.Permit.sync) { + listener$b.send('add', { + where: where, + card: card + }); + } else { + var find = data$1[where].find(function (id) { + return id == card.id; + }); + + if (!find) { + Arrays.insert(data$1[where], 0, card.id); + listener$b.send('add', { + where: where, + card: card + }); + if (!search$4(card.id)) data$1.card.push(card); + + if (limit) { + var excess = data$1[where].slice(limit); + + for (var i = excess.length - 1; i >= 0; i--) { + remove$2(where, { + id: excess[i] + }); + } + } + + save$2(); + } else { + Arrays.remove(data$1[where], card.id); + Arrays.insert(data$1[where], 0, card.id); + save$2(); + listener$b.send('added', { + where: where, + card: card + }); + } + + Lampa.Listener.send('state:changed', { + target: 'favorite', + reason: 'update', + method: !find ? 'add' : 'added', + type: where, + card: card + }); + } + } + /** + * Удалить + * @param {String} where + * @param {Object} card + */ + + + function remove$2(where, card) { + if (Account$1.Permit.sync) { + listener$b.send('remove', { + where: where, + card: card, + method: 'id' + }); + } else { + Arrays.remove(data$1[where], card.id); + listener$b.send('remove', { + where: where, + card: card, + method: 'id' + }); + + for (var i = data$1.card.length - 1; i >= 0; i--) { + var element = data$1.card[i]; + + if (!check$3(element).any) { + Arrays.remove(data$1.card, element); + listener$b.send('remove', { + where: where, + card: element, + method: 'card' + }); + } + } + + save$2(); + Lampa.Listener.send('state:changed', { + target: 'favorite', + reason: 'update', + method: 'remove', + type: where, + card: card + }); + } + } + /** + * Найти + * @param {integer} id + * @returns Object + */ + + + function search$4(id) { + var found; + + for (var index = 0; index < data$1.card.length; index++) { + var element = data$1.card[index]; + + if (element.id == id) { + found = element; + break; + } + } + + return found; + } + /** + * Переключить + * @param {String} where + * @param {Object} card + */ + + + function toggle$6(where, card) { + var find = cloud(card); + + if (marks.find(function (a) { + return a == where; + })) { + var added = marks.find(function (a) { + return find[a]; + }); + if (added && added !== where) remove$2(added, card); + } + + if (find[where]) remove$2(where, card);else add$9(where, card); + return find[where] ? false : true; + } + /** + * Проверить + * @param {Object} card + * @returns Object + */ + + + function check$3(card) { + var result = { + any: false + }; + category$2.forEach(function (a) { + result[a] = data$1[a].find(function (id) { + return id == card.id; + }); + if (result[a]) result.any = true; + }); + return result; + } + /** + * Проверить есть ли карточка где либо кроме истории + * @param {Object} status + * @returns {Boolean} + */ + + + function checkAnyNotHistory(status) { + var any = false; + category$2.filter(function (a) { + return a !== 'history'; + }).forEach(function (a) { + if (status[a]) any = true; + }); + return any; + } + /** + * Облако, закладки из cub + * @param {Object} card + * @returns {Object} + */ + + + function cloud(card) { + if (Account$1.Permit.sync) { + var result = { + any: false + }; + category$2.forEach(function (a) { + result[a] = Boolean(Account$1.Bookmarks.find({ + type: a, + id: card.id + })); + if (result[a]) result.any = true; + }); + return result; + } else return check$3(card); + } + /** + * Получить списаок по типу + * @param {String} params.type - тип + * @returns Object + */ + + + function get$b(params) { + if (Account$1.Permit.sync) { + return Account$1.Bookmarks.get(params); + } else { + var result = []; + var ids = data$1[params.type]; + ids.forEach(function (id) { + for (var i = 0; i < data$1.card.length; i++) { + var card = data$1.card[i]; + if (card.id == id) result.push(card); + } + }); + return result; + } + } + /** + * Очистить + * @param {String} where + * @param {Object} card + */ + + + function clear$7(where, card) { + if (Account$1.Permit.sync) { + Account$1.Bookmarks.clear(where); + } else { + if (card) remove$2(where, card);else { + for (var i = data$1[where].length - 1; i >= 0; i--) { + var _card = search$4(data$1[where][i]); + + if (_card) remove$2(where, _card); + } + } + } + } + /** + * Считать последние данные + */ + + + function read$1() { + data$1 = Storage.get('favorite', '{}'); + var empty = { + card: [] + }; + category$2.forEach(function (a) { + empty[a] = []; + }); + Arrays.extend(data$1, empty); + Lampa.Listener.send('state:changed', { + target: 'favorite', + reason: 'read' + }); + } + /** + * Получить весь список что есть + */ + + + function full$2() { + var empty = { + card: [] + }; + category$2.forEach(function (a) { + empty[a] = []; + }); + Arrays.extend(data$1, empty); + return data$1; + } + + function all$2() { + var result = {}; + category$2.forEach(function (a) { + result[a] = get$b({ + type: a + }); + }); + return result; + } + + function continues(type) { + var result = get$b({ + type: 'history' + }); + var viewed = get$b({ + type: 'viewed' + }); + var thrown = get$b({ + type: 'thrown' + }); // Убираем из продолжить то что уже полностью просмотрено + + result = result.filter(function (e) { + return !viewed.find(function (v) { + return v.id == e.id; + }) && !thrown.find(function (t) { + return t.id == e.id; + }); + }); + result = result.filter(function (e) { + var is_tv = e.number_of_seasons || e.first_air_date; + var jpan = e.original_language == 'ja'; + if (type == 'anime') return is_tv && (Utils$1.containsJapanese(e.original_name || e.name || '') || jpan);else if (type == 'tv') return is_tv && !(Utils$1.containsJapanese(e.original_name || e.name || '') || jpan);else return !is_tv; + }); + return Arrays.clone(result.slice(0, 19)); + } + + var Favorite = { + listener: listener$b, + init: Utils$1.onceInit(init$S), + check: cloud, + add: add$9, + remove: remove$2, + toggle: toggle$6, + get: get$b, + clear: clear$7, + continues: continues, + full: full$2, + checkAnyNotHistory: checkAnyNotHistory, + all: all$2, + read: read$1 + }; + + var Listener$1 = Subscribe$2(); + + var bookmarks = []; // имеет вид [{id, cid, card_id, type, data, profile, time},...] + + var bookmarks_map = {}; // имеет вид {type: {card_id: bookmark, ...}, ...} + + var tracker = new Tracker('account_bookmarks_sync'); + /** + * Запуск + * @return {void} + */ + + function init$R() { + Favorite.listener.follow('add,added', function (e) { + push$5('add', e.where, e.card); + }); + Favorite.listener.follow('remove', function (e) { + if (e.method == 'id') push$5('remove', e.where, e.card); + }); + Storage.listener.follow('change', function (e) { + if (e.name == 'protocol' || e.name == 'account_use' && e.value == 'true') update$9(function () { + Lampa.Listener.send('state:changed', { + target: 'favorite', + reason: 'read' + }); + }); + }); + Listener$1.follow('profile_select', function () { + bookmarks = []; + bookmarks_map = {}; // Сбрасываем трекер чтобы при смене профиля сразу получить дамп закладок + + tracker.update({ + version: 0, + time: 0 + }); + update$9(function () { + Lampa.Listener.send('state:changed', { + target: 'favorite', + reason: 'profile' + }); + }); + }); + Timer.add(1000 * 60 * 5, function () { + update$9(); + }); + } + /** + * Добавить/Удалить закладку + * @param {String} method - add/remove + * @param {String} type - тип закладки + * @param {Object} card - карточка + * @return {void} + */ + + + function push$5(method, type, card) { + if (permit.sync) { + var _find = bookmarks.find(function (elem) { + return elem.card_id == card.id && elem.type == type; + }); + + Api$1.load('bookmarks/' + method, {}, { + type: type, + data: JSON.stringify(Utils$1.clearCard(Arrays.clone(card))), + card_id: card.id, + id: _find ? _find.id : 0 + }).then(function () { + update$9(function () { + // Оповещаем другие устройства о изменении закладок + Socket.send('bookmarks', {}); // Глобальное оповещение об изменении закладок для обновления карточек + + Lampa.Listener.send('state:changed', { + target: 'favorite', + reason: 'update', + method: method, + card: card, + type: type + }); + }); + })["catch"](function () { + console.warn('Account', 'bookmarks ' + method + ' fail'); + }); + } + } + /** + * Сохранение закладок в кэш + * @param {number} version - версия закладок на сервере + * @return {void} + */ + + + function saveToCache(version) { + Cache.rewriteData('other', 'account_bookmarks_' + permit.account.profile.id, bookmarks).then(function () { + tracker.update({ + version: version, + time: Date.now() + }); + })["catch"](function (e) { + console.log('Account', 'bookmarks cache not saved', e.message); + }); + } + /** + * Загрузка закладок из кэша + * @param {function} call - вызов по окончании + * @return {void} + */ + + + function loadFromCache(call) { + if (bookmarks.length) return call && call(); + Cache.getData('other', 'account_bookmarks_' + permit.account.profile.id).then(function (data) { + bookmarks = data && data.length ? data : []; + createMap(); + })["catch"](function () { + console.log('Account', 'bookmarks cache not load'); + })["finally"](function () { + if (call) call(); + }); + } + /** + * Загрузка и обновление закладок + * @param {function} call - вызов по окончании + * @return {void} + */ + + + function update$9(call) { + if (permit.sync) { + // Если с момента последнего обновления прошло больше 15 дней, то загружаем дамп + if (tracker.time() < Date.now() - 1000 * 60 * 60 * 24 * 15) { + console.log('Account', 'bookmarks start full update', tracker.version()); + Api$1.load('bookmarks/dump', { + dataType: 'text' + }).then(function (result) { + // Парсим текст в массив закладок + AppWorker.json({ + type: 'parse', + data: result + }, function (e) { + if (!e.data.bookmarks) { + console.error('Account', 'bookmarks wrong dump format'); + if (call && typeof call == 'function') call(); + return; + } // Переводим строки с .data в объект, обновляем локальный кэш и карту + + + rawToCard(e.data.bookmarks, function () { + saveToCache(e.data.version); + if (call && typeof call == 'function') call(); + }); + }); + })["catch"](function () { + console.error('Account', 'bookmarks full update fail, trying load from cache'); + loadFromCache(function () { + if (call && typeof call == 'function') call(); + }); + }); + } // Иначе получаем только изменения с последней версии + else { + console.log('Account', 'bookmarks start update since', tracker.version()); + loadFromCache(function () { + Api$1.load('bookmarks/changelog?since=' + tracker.version()).then(function (result) { + result.changelog.forEach(function (change) { + if (change.action == 'remove') { + var _find2 = bookmarks.find(function (book) { + return book.id == change.entity_id; + }); + + if (_find2) Arrays.remove(bookmarks, _find2); + } else if (change.action == 'update') { + var _find3 = bookmarks.find(function (book) { + return book.id == change.entity_id; + }); + + if (_find3) { + _find3.time = change.updated_at; + Arrays.remove(bookmarks, _find3); + Arrays.insert(bookmarks, 0, _find3); + } + } else if (change.action == 'add') { + if (change.data) { + change.data = Utils$1.clearCard(Arrays.decodeJson(change.data, {})); + Arrays.insert(bookmarks, 0, change); + } + } else if (change.action == 'clear') { + var filter = bookmarks.filter(function (book) { + return book.type == change.entity_id; + }); + filter.forEach(function (book) { + return Arrays.remove(bookmarks, book); + }); + } + }); // Сохраняем обновленные закладки в кэш + + saveToCache(result.version); // Обновляем карту + + createMap(); // Обновляем каналы на андроид тв + + updateChannels(); + console.log('Account', 'bookmarks update complete to version', result.version); + })["catch"](function () { + console.warn('Account', 'bookmarks update since fail'); + })["finally"](function () { + if (call && typeof call == 'function') call(); + }); + }); + } + } else { + rawToCard([], function () { + if (call && typeof call == 'function') call(); + }); + } + } + /** + * Очистка закладок + * @param {string} where - группа закладок для очистки + * @return {void} + */ + + + function clear$6(where) { + if (permit.sync) { + Api$1.load('bookmarks/clear', {}, { + type: 'group', + group: where + }).then(function () { + update$9(function () { + // Оповещаем другие устройства о изменении закладок + Socket.send('bookmarks', {}); // Глобальное оповещение об изменении закладок для обновления карточек + + Lampa.Listener.send('state:changed', { + target: 'favorite', + reason: 'clear', + type: where + }); + }); + })["catch"](function () { + console.warn('Account', 'bookmarks clear fail'); + }); + } + } + /** + * Получить закладки по типу + * @param {object} params - {type} + * @return {array} - [card, ...] + */ + + + function get$a(params) { + return bookmarks.filter(function (elem) { + return elem.type == params.type; + }).map(function (elem) { + return elem.data; + }); + } + /** + * Найти закладку по типу и id + * @param {object} params - {type, id} + * @return {object|null} - card или null + */ + + + function find$1(params) { + var _bookmarks_map$params; + + return bookmarks_map[params.type] ? (_bookmarks_map$params = bookmarks_map[params.type][params.id]) === null || _bookmarks_map$params === void 0 ? void 0 : _bookmarks_map$params.data : null; + } + /** + * Получить все закладки + * @return {array} - [card, ...] + */ + + + function all$1() { + return bookmarks.map(function (elem) { + return elem.data; + }); + } + /** + * Обновление каналов на андроид тв + * @return {void} + */ + + + function updateChannels() { + if (Platform.is('android') && typeof AndroidJS.saveBookmarks !== 'undefined' && bookmarks.length) { + AppWorker.json({ + type: 'stringify', + data: bookmarks + }, function (j) { + AndroidJS.saveBookmarks(j.data); + }); + } + } + /** + * Преобразует row.data из строки в объект + * @param {array} rows - массив закладок из БД + * @param {function} call - вызов по окончании + * @return {void} + */ + + + function rawToCard(rows, call) { + AppWorker.utils({ + type: 'account_bookmarks_parse', + data: rows + }, function (e) { + bookmarks = e.data; + createMap(); + updateChannels(); + if (call) call(); + }); + } + /** + * Создаем карту закладок для быстрого поиска + * @return {void} + */ + + + function createMap() { + bookmarks_map = {}; + bookmarks.forEach(function (elem) { + elem.data = Utils$1.clearCard(elem.data); + if (!bookmarks_map[elem.type]) bookmarks_map[elem.type] = {}; + bookmarks_map[elem.type][elem.card_id] = elem; + }); + } + /** + * Синхронизация закладок из локальных на сервер + * @param {function} callback - вызов по окончании + * @return {void} + */ + + + function sync$1(callback) { + var file; + + try { + file = new File([localStorage.getItem('favorite') || '{}'], "bookmarks.json", { + type: "text/plain" + }); + } catch (e) { + console.warn('Account', 'bookmarks file create error', e.message); + } + + if (!file) { + try { + file = new Blob([localStorage.getItem('favorite') || '{}'], { + type: 'text/plain' + }); + file.lastModifiedDate = new Date(); + } catch (e) { + Noty.show(Lang.translate('account_export_fail')); + console.warn('Account', 'bookmarks blob create error', e.message); + } + } + + if (file) { + var formData = new FormData($('
')[0]); + formData.append("file", file, "bookmarks.json"); + $.ajax({ + url: Api$1.url() + 'bookmarks/sync', + type: 'POST', + data: formData, + async: true, + cache: false, + contentType: false, + enctype: 'multipart/form-data', + processData: false, + headers: { + token: permit.token, + profile: permit.account.profile.id + }, + success: function success(j) { + if (j.secuses) { + Noty.show(Lang.translate('account_sync_secuses')); + update$9(); + } else { + console.error('Account', 'bookmarks sync fail response'); + } + + callback && callback(); + }, + error: function error() { + console.error('Account', 'bookmarks sync fail'); + Noty.show(Lang.translate('account_export_fail')); + callback && callback(); + } + }); + } else { + callback && callback(); + console.error('Account', 'bookmarks no create file for sync'); + } + } + + var Bookmarks$1 = { + init: Utils$1.onceInit(init$R), + push: push$5, + update: update$9, + clear: clear$6, + get: get$a, + all: all$1, + sync: sync$1, + find: find$1 + }; + + function init$Q() { + Settings.listener.follow('open', function (e) { + if (e.name == 'account') e.body.find('.settings--account-device-add').on('hover:enter', function () { + login(function () { + Controller.toggle('settings_component'); + }); + }); + }); + } + + function add$8(value) { + var code = parseInt(value); + + if (!isNaN(code)) { + var _login = function _login(error) { + network.silent(Api$1.url() + 'device/add', function (result) { + Loading$1.stop(); + Storage.set('account', result, true); + Storage.set('account_email', result.email, true); + window.location.reload(); + }, error, { + code: code + }); + }; + + var network = new Request(); + Loading$1.start(function () { + network.clear(); + Loading$1.stop(); + }); + + _login(function (e) { + if (network.errorCode(e) == 200) { + Loading$1.stop(); + Noty.show(Lang$1.translate('account_code_error')); + } else { + localStorage.setItem('protocol', window.location.protocol == 'https:' ? 'https' : 'http'); + + _login(function (e) { + Loading$1.stop(); + Noty.show(Lang$1.translate(network.errorCode(e) == 200 ? 'account_code_error' : 'network_noconnect')); + }); + } + }); + } else { + Noty.show(Lang$1.translate('account_code_wrong')); + } + } + + function login(callback) { + var html = Template.get('account_add_device_new'); + var nums = html.find('.account-modal-split__code-num'); + var keyboard; + + if (Platform.tv()) { + var code = html.find('.account-modal-split__qr-code'); + var img = html.find('.account-modal-split__qr-img'); + html.addClass('layer--' + (Platform.mouse() ? 'wheight' : 'height')); + Utils$1.qrcode('https://' + object$2.cub_site + '/add', code, function () { + code.remove(); + img.removeClass('hide'); + Utils$1.imgLoad(img, Utils$1.protocol() + object$2.qr_device_add, function () { + img.addClass('loaded'); + }); + }); + } else html.addClass('account-modal-split--mobile'); + + function drawCode(value) { + nums.find('span').text('-'); + value.split('').forEach(function (v, i) { + if (nums[i]) nums[i].find('span').text(v); + }); + } + + drawCode(''); + Modal.open({ + title: '', + html: html, + size: Platform.tv() ? 'full' : 'medium', + scroll: { + nopadding: true + }, + onBack: function onBack() { + keyboard.destroy(); + Modal.close(); + callback && callback(); + } + }); + keyboard = new window.SimpleKeyboard["default"]({ + display: { + '{BKSP}': ' ', + '{ENTER}': ' ' + }, + layout: { + 'default': ['0 1 2 3 4 {BKSP}', '5 6 7 8 9 {ENTER}'] + }, + onChange: function onChange(value) { + drawCode(value); + if (value.length == 6) add$8(value); + }, + onKeyPress: function onKeyPress(button) { + if (button === '{BKSP}') { + keyboard.setInput(keyboard.getInput().slice(0, -1)); + drawCode(keyboard.getInput()); + } else if (button === '{ENTER}') { + if (keyboard.getInput().length == 6) add$8(keyboard.getInput()); + } + } + }); + var keys = $('.simple-keyboard .hg-button').addClass('selector'); + Controller.collectionSet($('.simple-keyboard')); + Controller.collectionFocus(keys[0], $('.simple-keyboard')); + $('.simple-keyboard .hg-button').on('hover:enter', function (e) { + Controller.collectionFocus($(this)[0]); + keyboard.handleButtonClicked($(this).attr('data-skbtn'), e); + }); + } + + var Device = { + init: Utils$1.onceInit(init$Q), + login: login + }; + + function show$6(template_name) { + var enabled = Controller.enabled().name; + Modal.open({ + title: '', + html: Template.get(template_name), + onBack: function onBack() { + Modal.close(); + Controller.toggle(enabled); + } + }); + } + + function account() { + var enabled = Controller.enabled().name; + var html = Template.js('account_none'); + + if (Platform.tv()) { + var code = html.find('.account-modal-split__qr-code'); + var img = html.find('.account-modal-split__qr-img'); + html.addClass('layer--' + (Platform.mouse() ? 'wheight' : 'height')); + Utils$1.qrcode('https://' + object$2.cub_site + '/#signup', code, function () { + code.remove(); + img.removeClass('hide'); + Utils$1.imgLoad(img, Utils$1.protocol() + object$2.qr_site, function () { + img.addClass('loaded'); + }); + }); + } else html.addClass('account-modal-split--mobile'); + + Modal.open({ + title: '', + html: $(html), + size: Platform.tv() ? 'full' : 'medium', + scroll: { + nopadding: true + }, + onSelect: function onSelect() { + Modal.close(); + Device.login(function () { + Controller.toggle(enabled); + }); + }, + onBack: function onBack() { + Modal.close(); + Controller.toggle(enabled); + } + }); + } + + function limited() { + show$6('account_limited'); + } + + function premium() { + var enabled = Controller.enabled().name; + var html = Template.js('account_premium'); + + if (Platform.tv()) { + html.addClass('layer--' + (Platform.mouse() ? 'wheight' : 'height')); + Utils$1.qrcode('https://' + object$2.cub_site + '/premium', html.find('.account-modal-split__qr-code'), function () { + html.find('.account-modal-split__qr').remove(); + }); + } else html.addClass('account-modal-split--mobile'); + + if (!permit.token) { + var button = Template.elem('div', { + "class": 'simple-button simple-button--inline selector', + text: Lang$1.translate('settings_cub_signin_button') + }); + button.on('hover:enter', function () { + Modal.close(); + Controller.toggle(enabled); + account(); + }); + html.find('.account-modal-split__info').append(button); + } + + Modal.open({ + title: '', + html: $(html), + size: Platform.tv() ? 'full' : 'medium', + scroll: { + nopadding: true + }, + onBack: function onBack() { + Modal.close(); + Controller.toggle(enabled); + } + }); + } + + var Modal$1 = { + account: account, + limited: limited, + premium: premium + }; + + var profile_icon; + + function init$P() { + profile_icon = Template.elem('div', { + "class": 'head__action selector open--profile' + }); + profile_icon.on('hover:enter', select$2.bind(null, Controller.toggle.bind(Controller, 'head'))); + Head.render().find('.full--screen').before(profile_icon); + Storage.listener.follow('change', function (e) { + if (e.name == 'account' || e.name == 'protocol') update$8(); + }); + ParentalControl.add('account_profiles', { + title: 'account_profiles' + }); + if (!permit.token) update$8(); + } + /** + * Обновляет иконку профиля + * @returns {void} + */ + + + function update$8() { + profile_icon.empty(); + + if (permit.token) { + profile_icon.append(Template.elem('img')); + Utils$1.imgLoad(profile_icon.find('img'), Utils$1.protocol() + object$2.cub_domain + '/img/profiles/' + (permit.account.profile.icon || 'l_1') + '.png', function () {}, function (img) { + img.src = './img/img_load.svg'; + }); + } else { + profile_icon.append(Template.js('icon_profile')); + } + } + /** + * Проверяет наличие профиля, если его нет - загружает + * @param {function} call - вызывается если профиль есть + * @returns {void} + */ + + + function check$2(call) { + if (permit.access) { + var account = permit.account; + if (account.profile.id) call();else { + Api$1.load('profiles/all', { + attempts: 3 + }).then(function (result) { + var main = result.profiles.find(function (p) { + return p.main; + }); + + if (main) { + account.profile = main; + Storage.set('account', account, true); + } + + call(); + })["catch"](call); + } + } else { + Storage.set('account_user', '', true); + } + } + /** + * Выбор профиля + * @param {string} controller - контроллер, который был активен до открытия выбора профиля + * @returns {void} + */ + + + function select$2(callback) { + ParentalControl.personal('account_profiles', function () { + if (!permit.token) return Modal$1.account(); + var account = permit.account; + Loading$1.start(function () { + Api$1.clear(); + Loading$1.stop(); + }); + Api$1.load('profiles/all').then(function (result) { + Loading$1.stop(); + + if (result.secuses) { + var items = Arrays.clone(result.profiles); + var clone = Arrays.clone(result.profiles); + items.reverse(); + clone.reverse(); + Select.show({ + title: Lang$1.translate('account_profiles'), + items: items.map(function (elem, index) { + elem.title = elem.name; + elem.template = 'selectbox_icon'; + elem.icon = ''; + elem.index = index; + elem.selected = account.profile.id == elem.id; + return elem; + }), + onSelect: function onSelect(a) { + account.profile = clone[a.index]; + Storage.set('account', account); + callback && callback(); + Listener$1.send('profile_select', { + profile: account.profile + }); + }, + onBack: callback + }); + } else { + Noty.show(result.text); + callback && callback(); + } + })["catch"](function () { + Loading$1.stop(); + Noty.show(Lang$1.translate('account_profiles_empty')); + }); + }, false, true); + } + + var Profile = { + init: Utils$1.onceInit(init$P), + update: update$8, + check: check$2, + select: select$2 + }; + + function inject(callback) { + if (!permit.access) return console.warn('Backup', 'no access'), callback && callback(); + confirm$1('', function () { + Api$1.load('users/backup/import').then(function (data) { + callback && callback(data); + + if (data.data) { + var imp = 0; + var ers = 0; + + for (var i in data.data) { + try { + localStorage.setItem(i, data.data[i]); + imp++; + } catch (e) { + ers++; + } + } + + Noty.show(Lang$1.translate('account_import_secuses') + ' - ' + Lang$1.translate('account_imported') + ' (' + imp + '/' + ers + ') - ' + Lang$1.translate('account_reload_after')); + setTimeout(function () { + window.location.reload(); + }, 5000); + } else Noty.show(Lang$1.translate('nodata')); + })["catch"](function () { + Noty.show(Lang$1.translate('account_import_fail')); + }); + }, callback); + } + + function publish(callback) { + if (!permit.access) return console.warn('Backup', 'no access'), callback && callback(); + confirm$1('', function () { + var file; + + try { + file = new File([JSON.stringify(localStorage)], "backup.json", { + type: "text/plain" + }); + } catch (e) { + console.log('Backup', 'file create error', e.message); + } + + if (!file) { + try { + file = new Blob([JSON.stringify(localStorage)], { + type: 'text/plain' + }); + file.lastModifiedDate = new Date(); + } catch (e) { + console.log('Backup', 'file create error', e.message); + Noty.show(Lang$1.translate('account_export_fail')); + } + } + + if (file) { + var formData = new FormData($('
')[0]); + formData.append("file", file, "backup.json"); + $.ajax({ + url: Api$1.url() + 'users/backup/export', + type: 'POST', + data: formData, + async: true, + cache: false, + contentType: false, + enctype: 'multipart/form-data', + processData: false, + headers: { + token: permit.token + }, + success: function success(j) { + callback && callback(); + + if (j.secuses) { + if (j.limited) showLimitedAccount();else Noty.show(Lang$1.translate('account_export_secuses')); + } else Noty.show(Lang$1.translate('account_export_fail')); + }, + error: function error(e, x) { + callback && callback(); + console.log('Backup', 'network error', Lampa.Network.errorDecode(e, x)); + Noty.show(Lang$1.translate('account_export_fail_' + (Lampa.Network.errorJSON(e).code || 500))); + } + }); + } else { + console.log('Backup', 'file not created'); + callback && callback(); + } + }, callback); + } + + function confirm$1(title, onconfirm, oncancel) { + Select.show({ + title: Lang$1.translate(title || 'sure'), + nomark: true, + items: [{ + title: Lang$1.translate('confirm'), + confirm: true, + selected: true + }, { + title: Lang$1.translate('cancel') + }], + onSelect: function onSelect(a) { + if (a.confirm) { + onconfirm && onconfirm(); + } else { + oncancel && oncancel(); + } + }, + onBack: function onBack() { + oncancel && oncancel(); + } + }); + } + + function select$1(callback) { + if (permit.access) { + Select.show({ + title: Lang$1.translate('settings_cub_backup'), + nomark: true, + items: [{ + title: Lang$1.translate('settings_cub_backup_export'), + subtitle: Lang$1.translate('settings_cub_backup_export_descr'), + "export": true, + selected: true + }, { + title: Lang$1.translate('settings_cub_backup_import'), + subtitle: Lang$1.translate('settings_cub_backup_import_descr'), + "import": true + }, { + title: Lang$1.translate('cancel') + }], + onSelect: function onSelect(a) { + if (a["export"]) { + publish(callback); + } else if (a["import"]) { + inject(callback); + } else { + callback && callback(); + } + }, + onBack: function onBack() { + callback && callback(); + } + }); + } else console.warn('Backup', 'no access'); + } + + var Backup = { + select: select$1, + publish: publish, + inject: inject + }; + + function init$O() { + Settings.listener.follow('open', function (e) { + if (e.name == 'account') render$9(e.body); + }); + } + + function render$9(body) { + var account = permit.account; + var signed = Boolean(permit.token); + var premium = Utils$1.countDays(Date.now(), permit.user.premium); + + if (!window.lampa_settings.account_sync) { + body.find('[data-name="account_use"]').remove(); + } + + Utils$1.qrcode('https://' + object$2.cub_site, body.find('.ad-server__qr')); + body.find('.settings--account-signin').toggleClass('hide', signed); + body.find('.settings--account-user').toggleClass('hide', !signed); + body.find('.settings-param__label').toggleClass('hide', !Boolean(premium)); + + if (signed) { + body.find('.settings--account-user-info .settings-param__value').text(account.email); + body.find('.settings--account-user-profile .settings-param__value').text(account.profile.name); + body.find('.settings--account-user-out').on('hover:enter', function () { + Storage.set('account', ''); + Storage.set('account_user', ''); + Storage.set('account_email', ''); + Settings.update(); + Bookmarks$1.update(); + }); + body.find('.settings--account-user-sync').on('hover:enter', function (e) { + account = permit.account; + Select.show({ + title: Lang$1.translate('settings_cub_sync'), + items: [{ + title: Lang$1.translate('confirm'), + subtitle: Lang$1.translate('account_sync_to_profile') + ' (' + account.profile.name + ')', + confirm: true + }, { + title: Lang$1.translate('cancel') + }], + onSelect: function onSelect(a) { + if (a.confirm) { + var loader = $('
'); + $(e.target).append(loader); + Bookmarks$1.sync(function () { + loader.remove(); + }); + } + + Controller.toggle('settings_component'); + }, + onBack: function onBack() { + Controller.toggle('settings_component'); + } + }); + }); + body.find('.settings--account-user-backup').on('hover:enter', function (e) { + var loader = $('
'); + $(e.target).append(loader); + Backup.select(function () { + loader.remove(); + Controller.toggle('settings_component'); + }); + }); + body.find('.settings--account-user-profile .settings-param__value').text(account.profile.name); + body.find('.settings--account-user-profile').on('hover:enter', function () { + Profile.select(function () { + Controller.toggle('settings_component'); + }); + }); + } + } + + var Panel = { + init: Utils$1.onceInit(init$O), + render: render$9 + }; + + var network$7 = new Request(); + var user_data; + /** + * Запуск + */ + + function init$N() { + if (!window.lampa_settings.account_use) return; + Timeline$1.init(); + Bookmarks$1.init(); + Profile.init(); + Panel.init(); + Device.init(); + Socket.listener.follow('open', checkAccountValidity); + Timer.add(1000 * 60 * 10, checkAccountValidity); + Profile.check(function () { + Api$1.user(function (user) { + return user_data = user; + }); + Timeline$1.update(); + Profile.update(); + Api$1.persons(); + }); + delete Account.init; + } + /** + * Задача загрузки приложения + * @param {Function} call - функция обратного вызова + * @return {void} + */ + + + function task$3(call) { + if (!window.lampa_settings.account_use) return call(); + Bookmarks$1.update(call); + } + /** + * Проверить валидность аккаунта + * @return {void} + */ + + + function checkAccountValidity() { + permit.token && Socket.send('check_token', {}); + } + /** + * Выход из аккаунта + * @param {Object} data - данные аккаунта + * @return {void} + */ + + + function logoff(data) { + var account = permit.account; + + if (account.token && account.email == data.email) { + Storage.set('account', '', true); + Storage.set('account_use', false, true); + Storage.set('account_user', '', true); + Storage.set('account_email', '', true); + Storage.set('account_notice', '', true); + Storage.set('account_bookmarks', '', true); + $('.head .open--profile').addClass('hide'); + window.location.reload(); + } + } + + var Account = { + Api: Api$1, + Bookmarks: Bookmarks$1, + Profile: Profile, + Timeline: Timeline$1, + Permit: permit, + Modal: Modal$1, + listener: Listener$1, + network: network$7, + init: init$N, + task: task$3, + working: function working() { + console.warn('Account.working() is deprecated, use Account.Permit.sync'); + return permit.sync; + }, + canSync: function canSync() { + console.warn('Account.canSync() is deprecated, use Account.Permit.sync ? Account.Permit.account : false'); + return permit.sync ? permit.account : false; + }, + workingAccount: function workingAccount() { + console.warn('Account.workingAccount() is deprecated, use Account.Permit.sync ? Account.Permit.account : false'); + return permit.sync ? permit.account : false; + }, + logged: function logged() { + console.warn('Account.logged() is deprecated, use Permit.access'); + return permit.access; + }, + get: function get(params) { + console.warn('Account.get() is deprecated, use Account.Bookmarks.get()'); + return Bookmarks$1.get(params); + }, + all: function all() { + console.warn('Account.all() is deprecated, use Account.Bookmarks.all()'); + return Bookmarks$1.all(); + }, + plugins: function plugins(call) { + console.warn('Account.plugins() is deprecated, use Account.Api.plugins()'); + Api$1.plugins(call); + }, + notice: function notice(call) { + console.warn('Account.notice() is deprecated, use Account.Api.notices()'); + Api$1.notices(call); + }, + pluginsStatus: function pluginsStatus(plugin, status) { + console.warn('Account.pluginsStatus() is deprecated, use Account.Api.pluginToggle()'); + Api$1.pluginToggle(plugin, status); + }, + showProfiles: function showProfiles(callback) { + console.warn('Account.showProfiles() is deprecated, use Account.Profile.select()'); + Profile.select(callback); + }, + clear: function clear(where) { + console.warn('Account.clear() is deprecated, use Account.Bookmarks.clear()'); + Bookmarks$1.clear(where); + }, + update: function update(call) { + console.warn('Account.update() is deprecated, use Account.Bookmarks.update()'); + Bookmarks$1.update(call); + }, + backup: function backup() { + console.warn('Account.backup() is deprecated'); + }, + subscribeToTranslation: function subscribeToTranslation(params, call, error) { + console.warn('Account.subscribeToTranslation() is deprecated, use Account.Api.subscribeToTranslation()'); + Api$1.subscribeToTranslation(params, call, error); + }, + subscribes: function subscribes(params, secuses, error) { + console.warn('Account.subscribes() is deprecated, use Account.Api.subscribes()'); + Api$1.subscribes(params, secuses, error); + }, + showNoAccount: function showNoAccount() { + console.warn('Account.showNoAccount() is deprecated, use Account.Modal.account()'); + Modal$1.account(); + }, + showCubPremium: function showCubPremium() { + console.warn('Account.showCubPremium() is deprecated, use Account.Modal.premium()'); + Modal$1.premium(); + }, + showLimitedAccount: function showLimitedAccount() { + console.warn('Account.showLimitedAccount() is deprecated, use Account.Modal.limited()'); + Modal$1.limited(); + }, + logoff: logoff, + persons: function persons() { + console.warn('Account.persons() is deprecated, use Account.Api.persons()'); + Api$1.persons(); + }, + updateUser: function updateUser() { + Api$1.user(function (user) { + return user_data = user; + }); + } + }; + Object.defineProperty(Account, 'hasPremium', { + value: function value() { + var user = user_data || Storage.get('account_user', '{}'); + if (Storage.get('developer_nopremium', 'false')) return 0; + return user.id ? Utils$1.countDays(Date.now(), user.premium) : 0; + }, + writable: false + }); + var Account$1 = Account; + + var listener$a = Subscribe$2(), + viewed$1; + /** + * Инициализация + * @returns {void} + */ + + function init$M() { + read(); + } + /** + * Прочитать прогресс просмотра из localStorage + * @returns {void} + */ + + + function read() { + viewed$1 = Storage.get(filename(), {}); + listener$a.send('read', { + data: viewed$1 + }); + Lampa.Listener.send('state:changed', { + target: 'timeline', + reason: 'read', + viewed: viewed$1 + }); + } + /** + * Имя файла для хранения прогресса просмотра в localStorage + * @returns {string} - имя файла + */ + + + function filename() { + return 'file_view' + (Account$1.Permit.sync ? '_' + Account$1.Permit.account.profile.id : ''); + } + /** + * Обновить прогресс просмотра + * @param {object} params - параметры прогресса + * @param {number} params.hash - хеш файла + * @param {number} params.percent - процент просмотра (0-100) + * @param {number} [params.time] - текущее время просмотра в секундах + * @param {number} [params.duration] - общая длительность файла в секундах + * @param {number} [params.profile] - ID профиля + * @param {boolean} [params.received] - флаг, что данные получены с сервера + * @returns {void} + */ + + + function update$7(params) { + if (params.hash == 0) return; + var road = viewed$1[params.hash]; + + if (typeof road == 'undefined' || typeof road == 'number') { + road = { + duration: 0, + time: 0, + percent: 0, + profile: 0 + }; + viewed$1[params.hash] = road; + } + + road.percent = params.percent; + if (typeof params.time !== 'undefined') road.time = params.time; + if (typeof params.duration !== 'undefined') road.duration = params.duration; + if (typeof params.profile !== 'undefined') road.profile = params.profile; + Storage.set(filename(), viewed$1); + Activity.renderLayers().forEach(function (layer) { + var line = $('.time-line[data-hash="' + params.hash + '"]', layer).toggleClass('hide', params.percent ? false : true); + $('> div', line).css({ + width: params.percent + '%' + }); + $('.time-line-details[data-hash="' + params.hash + '"]', layer).each(function () { + var f = format(road); + $(this).find('[a="t"]').text(f.time); + $(this).find('[a="p"]').text(f.percent); + $(this).find('[a="d"]').text(f.duration); + $(this).toggleClass('hide', road.duration ? false : true); + }); + }); + listener$a.send('update', { + data: { + hash: params.hash, + road: road + } + }); + Lampa.Listener.send('state:changed', { + target: 'timeline', + reason: 'update', + data: { + hash: params.hash, + road: road + } + }); + if (!params.received && Account$1.hasPremium()) Socket.send('timeline', { + params: params + }); + } + /** + * Получить прогресс просмотра + * @param {string} hash - хеш файла + * @return {object} - объект с прогрессом просмотра {hash, percent, time, duration, profile, handler} + */ + + + function view$1(hash) { + var curent = typeof viewed$1[hash] !== 'undefined' ? viewed$1[hash] : 0, + profile = Account$1.Permit.sync ? Account$1.Permit.account.profile.id : 0; + var road = { + percent: 0, + time: 0, + duration: 0, + profile: 0 + }; + + if (_typeof(curent) == 'object') { + road.percent = curent.percent; + road.time = curent.time; + road.duration = curent.duration; + road.profile = curent.profile || profile; + } else { + road.percent = curent || 0; + road.profile = profile; + } + + listener$a.send('view', { + data: { + hash: hash, + road: road + } + }); + return { + hash: hash, + percent: road.percent, + time: road.time, + duration: road.duration, + profile: road.profile, + handler: function handler(percent, time, duration) { + return update$7({ + hash: hash, + percent: percent, + time: time, + duration: duration, + profile: road.profile + }); + } + }; + } + /** + * Создать прогресс просмотра + * @param {object} params - параметры прогресса от функции view + * @return {jQuery} - jQuery объект с прогрессом просмотра + */ + + + function render$8(params) { + var line = Template.get('timeline', params); + line.toggleClass('hide', params.percent ? false : true); + return line; + } + /** + * Создать детальную информацию о прогрессе просмотра + * @param {object} params - параметры прогресса от функции view + * @param {string} [str] - строка для добавления перед прогрессом + * @return {jQuery} - jQuery объект с детальной информацией о прогрессе просмотра + */ + + + function details(params) { + var str = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var line = Template.get('timeline_details', format(params)); + if (str) line.prepend(str); + line.attr('data-hash', params.hash); + line.toggleClass('hide', params.duration ? false : true); + return line; + } + /** + * Проверить, смотрел ли файл + * @param {object} card - карточка файла + * @return {number} - процент просмотра (0-100) + */ + + + function watched(card) { + var return_time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (card.original_name) { + var max = 24; + var list = []; + + for (var i = 1; i <= max; i++) { + var time = view$1(Utils$1.hash([1, i, card.original_name].join(''))); + + if (time.percent) { + list.push({ + ep: i, + view: time + }); + } + } + + return return_time ? list : list.length; + } else { + var _time = view$1(Utils$1.hash(card.original_title)); + + return return_time ? _time : _time.percent; + } + } + + function watchedEpisode(card, season, episode) { + var return_time = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + var time = view$1(Utils$1.hash([season, season > 10 ? ':' : '', episode, card.original_title].join(''))); + return return_time ? time : time.percent; + } + /** + * Форматировать прогресс в понятный человекy вид + * @param {object} params - параметры прогресса от функции view + * @return {object} - объект с отформатированными параметрами {percent, time, duration} + */ + + + function format(params) { + var road = { + percent: params.percent + '%', + time: Utils$1.secondsToTimeHuman(params.time), + duration: Utils$1.secondsToTimeHuman(params.duration) + }; + return road; + } + + var Timeline = { + init: Utils$1.onceInit(init$M), + read: read, + listener: listener$a, + render: render$8, + update: update$7, + view: view$1, + details: details, + format: format, + watched: watched, + watchedEpisode: watchedEpisode, + filename: filename + }; + + var markers = ['socket', 'mirrors', 'request']; + var markers_object = {}; + var update_started = false; + markers.forEach(function (marker) { + markers_object[marker] = { + error: false, + live: false, + pass_count: 0, + pass_time: 0, + status_now: '', + status_prev: '' + }; + }); + + function init$L() { + markers.forEach(function (marker) { + markers_object[marker].element = Head.render()[0].querySelector('.head__markers .item--' + marker); + }); + + if (typeof requestAnimationFrame !== 'undefined') { + Lampa.Listener.follow('request_error', function (e) { + if (e.params.url.indexOf(object$2.cub_domain) > -1 && e.error.status == 0 && e.exception !== 'timeout') { + error('request'); + } + }); + Lampa.Listener.follow('request_secuses', function (e) { + if (e.params.url.indexOf(object$2.cub_domain) > -1) { + pass('request'); + normal('request'); + } + }); + } + } + + function update$6() { + if (update_started) return; + + if (typeof requestAnimationFrame !== 'undefined') { + update_started = true; + requestAnimationFrame(function updateMarkers() { + var any = false; + markers.forEach(function (marker) { + var marker_data = markers_object[marker]; + var status = marker_data.pass_count > 0 ? 'status--pass' : marker_data.live ? 'status--live' : marker_data.error ? 'status--error' : ''; + + if (status !== marker_data.status_now) { + marker_data.status_prev = marker_data.status_now; + marker_data.status_now = status; + updateStatus(marker); + } + + if (status == 'status--pass' && marker_data.pass_time < Date.now() - 100) { + marker_data.pass_count--; + marker_data.pass_time = Date.now(); + } + + if (marker_data.pass_count >= 0) any = true; + if (marker_data.pass_count == 0) marker_data.pass_count = -1; + }); + if (any) requestAnimationFrame(updateMarkers);else update_started = false; + }); + } + } + + function updateStatus(marker) { + var marker_data = markers_object[marker]; + if (!marker_data.element) return; + var status = marker_data.pass_count > 0 ? 'status--pass' : marker_data.live ? 'status--live' : marker_data.error ? 'status--error' : ''; + marker_data.element.classList.remove('status--error', 'status--live', 'status--pass'); + if (status) marker_data.element.classList.add(status); + } + + function error(who) { + markers_object[who].error = true; + markers_object[who].live = false; + update$6(); + } + + function pass(who) { + markers_object[who].pass_count = Math.min(markers_object[who].pass_count + 1, 20); + update$6(); + } + + function live(who) { + markers_object[who].error = false; + markers_object[who].live = true; + update$6(); + } + + function normal(who) { + markers_object[who].error = false; + markers_object[who].live = false; + update$6(); + } + + var Markers = { + init: init$L, + error: error, + pass: pass, + live: live, + normal: normal + }; + + var socket; + var ping; + + var _uid = Utils$1.uid(); + + var _devices = []; + var listener$9 = Subscribe$2(); + var expects = []; + var timeping = 5000; + var timeout; + var used_mirrors = -1; + var terminal_access = false; + + function connect$1() { + if (!window.lampa_settings.socket_use) return; + var ws = Platform.is('orsay') || Platform.is('netcast') ? 'ws://' : 'wss://'; + var pt = Platform.is('orsay') || Platform.is('netcast') ? ':8080' : ':8443'; + var mirrors = object$2.soc_mirrors; + var mirror = mirrors[used_mirrors + 1] || mirrors[0]; + used_mirrors = (used_mirrors + 1) % mirrors.length; + var socket_url = ws + mirror + pt; + if (window.lampa_settings.socket_url) socket_url = window.lampa_settings.socket_url; + clearInterval(ping); + clearTimeout(timeout); + timeout = setTimeout(function () { + console.log('Socket', 'timeout close'); + if (socket) socket.close(); + }, 10000); + + try { + socket = new WebSocket(socket_url); + } catch (e) { + console.log('Socket', 'not work'); + } + + if (!socket) return; + socket.addEventListener('open', function (event) { + console.log('Socket', 'open on ' + socket_url); + timeping = 5000; + clearTimeout(timeout); + send('start', {}); + listener$9.send('open', {}); + Markers.live('socket'); + }); + socket.addEventListener('close', function (event) { + console.log('Socket', 'close', event.code); + clearTimeout(timeout); + listener$9.send('close', {}); + timeping = Math.min(1000 * 60 * 5, timeping); + console.log('Socket', 'try connect to ' + socket_url + ' after', Math.round(timeping) / 1000, 'sec.'); + setTimeout(connect$1, Math.round(timeping)); + timeping *= 2; + Markers.error('socket'); + }); + socket.addEventListener('error', function (event) { + console.log('Socket', 'error:', 'maybe there is no connection to the server'); + socket.close(); + }, false); + socket.addEventListener('message', function (event) { + var result = JSON.parse(event.data); + + if (window.lampa_settings.socket_methods) { + if (result.method == 'devices') { + _devices = result.data; + } else if (result.method == 'open') { + Controller.toContent(); + Activity.push(result.data); + } else if (result.method == 'timeline') { + result.data.received = true; //чтоб снова не остправлять и не зациклить + + var account = Account$1.Permit.account; + + if (Account$1.Permit.sync && account.profile && account.profile.id == result.data.profile) { + Timeline.update(result.data); + } + } else if (result.method == 'bookmarks') { + Account$1.Bookmarks.update(); + } else if (result.method == 'terminal_activate') { + if (Storage.get('terminal_access', '') == result.data.code) { + terminal_access = true; + send('terminal_result', { + result: 'Terminal access activated' + }); + } + } else if (result.method == 'terminal_eval') { + if (Storage.get('terminal_access', '') == result.data.code) { + var stroke = ''; + var tojson = {}; + console.log('Socket', 'terminal eval', result.data.eval); + + try { + stroke = eval(result.data.eval); + } catch (e) { + stroke = e.message + ' ' + e.stack; + } + + try { + if (Arrays.isObject(stroke) || Arrays.isArray(stroke)) tojson = JSON.stringify(stroke); + } catch (e) { + tojson = stroke; + } + + if (typeof stroke == 'function') { + tojson = 'Function cannot be converted to JSON'; + } + + if (typeof stroke == 'string' || typeof stroke == 'number' || typeof stroke == 'boolean') { + tojson = stroke; + } else if (stroke === undefined) { + tojson = 'undefined'; + } else if (stroke === null) { + tojson = 'null'; + } else tojson = 'unknown type'; + + console.log('Socket', 'terminal eval result', tojson); + send('terminal_result', { + result: tojson + }); + } + } else if (result.method == 'logoff') { + Account$1.logoff(result.data); + } else if (result.method == 'info') { + console.log('Socket', 'info', result.data); + } else if (result.method == 'other' && result.data.submethod == 'play') { + Controller.toContent(); + Modal.open({ + title: '', + align: 'center', + html: $('
' + Lang$1.translate('confirm_open_player') + '
'), + buttons: [{ + name: Lampa.Lang.translate('settings_param_no'), + onSelect: function onSelect() { + Modal.close(); + Controller.toggle('content'); + } + }, { + name: Lampa.Lang.translate('settings_param_yes'), + onSelect: function onSelect() { + Modal.close(); + Controller.toggle('content'); + Player.play(result.data.object.player); + Player.playlist(result.data.object.playlist); + } + }], + onBack: function onBack() { + Modal.close(); + Controller.toggle('content'); + } + }); + } + } + + Markers.pass('socket'); + listener$9.send('message', result); + }); + Timer.add(1000, function () { + if (expects.length > 50) expects = expects.slice(-50); + + if (socket && socket.readyState == 1 && expects.length) { + var msg = expects.shift(); + console.log('Socket', 'sent with a delay:', msg.method); + send(msg.method, msg); + } + }); + } + + function send(method, data) { + var name_devise = Platform.get() ? Platform.get() : navigator.userAgent.toLowerCase().indexOf('mobile') > -1 ? 'mobile' : navigator.userAgent.toLowerCase().indexOf('x11') > -1 ? 'chrome' : 'other'; + data.device_id = _uid; + data.name = Utils$1.capitalizeFirstLetter(name_devise) + ' - ' + Storage.field('device_name'); + data.method = method; + data.version = 1; + data.account = Storage.get('account', '{}'); + data.premium = Account$1.hasPremium(); + data.terminal = Storage.get('terminal_access', ''); + if (socket && socket.readyState == 1) socket.send(JSON.stringify(data));else expects.push(data); + Markers.pass('socket'); + } + + function restart() { + if (socket) socket.close(); + connect$1(); + } + + var Socket = { + listener: listener$9, + init: connect$1, + send: send, + uid: function uid() { + return _uid; + }, + devices: function devices() { + return _devices; + }, + restart: restart, + terminalAccess: function terminalAccess() { + return terminal_access; + } + }; + + var timer$3; + var listener$8; + + function init$K() { + var timer, activity; + var broadcast = Head.addIcon(Template.string('icon_broadcast'), function () { + open$6({ + type: 'card', + object: Activity.extractObject(activity) + }); + }); + broadcast.addClass('open--broadcast'); + broadcast.hide(); + Lampa.Listener.follow('activity', function (e) { + if (e.type == 'start') activity = e.object; + clearTimeout(timer); + timer = setTimeout(function () { + if (activity) { + if (activity.component !== 'full') { + broadcast.hide(); + activity = false; + } + } + }, 1000); + + if (e.type == 'start' && e.component == 'full') { + broadcast.show(); + activity = e.object; + } + }); + } + /** + * Открыть окно + * @params {Object} params - параметры + * @params {String} params.type - тип (card, play) + * @params {Object} params.object - объект + * @returns {void} + */ + + + function open$6(params) { + var enabled = Controller.enabled().name; + var text = params.type == 'card' ? Lang$1.translate('broadcast_open') : params.type == 'play' ? Lang$1.translate('broadcast_play') : ''; + var temp = Template.get('broadcast', { + text: text + }); + var list = temp.find('.broadcast__devices'); + var last = ''; + if (!text) temp.find('.about').remove(); + Socket.send('devices', {}); + timer$3 = setInterval(function () { + Socket.send('devices', {}); + }, 3000); + + listener$8 = function listener(e) { + if (e.method == 'devices') { + var devices = e.data.filter(function (d) { + return !(d.name == 'CUB' || d.device_id == Socket.uid()); + }); + var select; + list.empty(); + devices.forEach(function (device) { + var item = $('
' + device.name + '
'); + item.on('hover:enter', function () { + close$7(); + Controller.toggle(enabled); + + if (params.type == 'card') { + var object = Arrays.clone(params.object); + var card = { + id: object.card.id, + source: object.card.source || 'tmdb' + }; + object.card = card; + Socket.send('open', { + params: object, + uid: device.uid + }); + } + + if (params.type == 'play') { + Socket.send('other', { + params: { + submethod: 'play', + object: params.object + }, + uid: device.uid + }); + } + }).on('hover:focus', function () { + last = device.uid; + }); + list.append(item); + if (last == device.uid) select = item[0]; + }); + Modal.toggle(select); + } + }; + + Modal.open({ + title: '', + html: temp, + size: 'small', + mask: true, + onBack: function onBack() { + close$7(); + Controller.toggle(enabled); + } + }); + listener$8({ + method: 'devices', + data: Socket.devices() + }); + Socket.listener.follow('message', listener$8); + } + /** + * Закрыть окно + */ + + + function close$7() { + Socket.listener.remove('message', listener$8); + clearInterval(timer$3); + Modal.close(); + listener$8 = null; + } + + var Broadcast = { + init: init$K, + open: open$6 + }; + + function init$J() { + var tmdb_proxy = { + name: 'TMDB Proxy', + version: '1.0.3', + description: 'Проксирование постеров и API сайта TMDB', + path_image: Account$1.hasPremium() ? 'imagetmdb.' + object$2.cub_domain + '/' : 'imagetmdb.com/', + path_api: 'apitmdb.' + object$2.cub_domain + '/3/', + path_image_backup: 'lampa.byskaz.ru/tmdb/img/', + path_api_backup: 'lampa.byskaz.ru/tmdb/api/3/' + }; + + function filter(u) { + var s = u.slice(0, 8); + var e = u.slice(8).replace(/\/+/g, '/'); + return s + e; + } + + function email() { + return Storage.get('account', '{}').email || ''; + } + + function check() { + console.log('TMDB-Proxy', 'start check', object$2.cub_domain); + $.ajax({ + url: TMDB$1.api('discover/movie?with_genres=14&api_key=' + TMDB$1.key() + '&language=ru-RU'), + dataType: 'json', + timeout: 6000, + error: function error() { + console.warn('TMDB-Proxy', 'api error', tmdb_proxy.path_api + ' not responding, using backup proxy', tmdb_proxy.path_api_backup); + + if (Utils$1.protocol() == 'https://' || Storage.field('protocol') == 'https') { + console.error('TMDB-Proxy', 'api cannot use https, use http only'); + } else { + tmdb_proxy.path_api = tmdb_proxy.path_api_backup; + } + } + }); + var test_image = new Image(); + + test_image.onload = function () { + console.log('TMDB-Proxy', 'image proxy is working', tmdb_proxy.path_image); + }; + + test_image.onerror = function () { + console.warn('TMDB-Proxy', 'image error', tmdb_proxy.path_image + ' not responding, using backup proxy', tmdb_proxy.path_image_backup); + + if (Utils$1.protocol() == 'https://' || Storage.field('protocol') == 'https') { + console.error('TMDB-Proxy', 'image cannot use https, use http only'); + } else { + tmdb_proxy.path_image = tmdb_proxy.path_image_backup; + } + }; + + test_image.src = TMDB$1.image('t/p/w200/3txl2FUNZCQUnHQPzkuNc17yLIs.jpg'); + } + + TMDB$1.image = function (url) { + var base = Utils$1.protocol() + 'image.tmdb.org/' + url; + return Utils$1.addUrlComponent(filter(Storage.field('proxy_tmdb') ? Utils$1.protocol() + tmdb_proxy.path_image + url : base), 'email=' + encodeURIComponent(email())); + }; + + TMDB$1.api = function (url) { + var base = Utils$1.protocol() + 'api.themoviedb.org/3/' + url; + return Utils$1.addUrlComponent(filter(Storage.field('proxy_tmdb') ? Utils$1.protocol() + tmdb_proxy.path_api + url : base), 'email=' + encodeURIComponent(email())); + }; + + Settings.listener.follow('open', function (e) { + if (e.name == 'tmdb') { + e.body.find('[data-parent="proxy"]').remove(); + } + }); + console.log('TMDB-Proxy', 'init'); + console.log('TMDB-Proxy', Storage.field('proxy_tmdb') ? 'enabled' : 'disabled'); + check(); + } + + var TMDBProxy = { + init: init$J + }; + + /** + * Короче, постоянно пишут (почему нет картинок?) + * Решил сделать автоматическую установку TMDB Proxy если регион RU + */ + + var network$6 = new Request(); + var responce_code = 'ru'; + + function region(call) { + var reg = Storage.get('region', '{}'); + Arrays.extend({ + time: 0 + }); + + if (!reg.code || reg.time + 1000 * 60 * 60 * 24 < Date.now()) { + var extracted = function extracted(code) { + code = code.trim().toLowerCase(); + code = code.length <= 2 ? code || 'ru' : 'ru'; + Storage.set('region', { + code: code, + time: Date.now() + }); + call(code); + }; + + extract(extracted, function (e, x) { + console.warn('VPN', 'geo.' + object$2.cub_domain + ' domain not responding', network$6.errorDecode(e, x)); + Storage.set('region', { + code: Storage.field('language'), + time: Date.now() + }); + call(Storage.field('language')); + }); + } else call(reg.code); + } + + var extract = function extract(call, error) { + $.ajax({ + url: Utils$1.protocol() + 'geo.' + object$2.cub_domain, + type: 'GET', + dataType: 'text', + timeout: 8000, + success: call, + error: error + }); + }; + + function task$2(call) { + extract(function (country) { + console.log('VPN', 'geo.' + object$2.cub_domain + ' domain responding ', country); + country = country.trim().toLowerCase(); + if (country.length > 10) console.warn('VPN', 'wrong responce, use default ru'); + + if ((country == 'ru' || country == 'be' || country == '' || country.length > 10) && !window.lampa_settings.disable_features.install_proxy) { + console.log('VPN', 'launch TMDB Proxy'); + TMDBProxy.init(); + } + + responce_code = country || 'ru'; + call(); + }, function (e, x) { + console.warn('VPN', 'geo.' + object$2.cub_domain + ' domain not responding:', network$6.errorDecode(e, x)); + + if (!window.lampa_settings.disable_features.install_proxy) { + console.log('VPN', 'launch TMDB Proxy'); + TMDBProxy.init(); //будем считать что если не ответил, то все равно запускаем + } + + call(); + }); + } + + var VPN = { + region: region, + task: task$2, + code: function code() { + return responce_code; + } + }; + var status$1 = false; - function init$E() { + function init$I() { $.ajax({ url: "./personal.lampa", dataType: 'text', @@ -20106,7 +23083,7 @@ } var Personal = { - init: init$E, + init: init$I, confirm: confirm }; @@ -20126,7 +23103,7 @@ $.ajax({ dataType: 'text', - url: Utils$2.protocol() + object$2.cub_domain + '/api/ad/stat?platform=' + Platform.get() + '&type=' + type + '&method=' + method + '&name=' + name + '&screen=' + (Platform.screen('tv') ? 'tv' : 'mobile') + url: Utils$1.protocol() + object$2.cub_domain + '/api/ad/stat?platform=' + Platform.get() + '&type=' + type + '&method=' + method + '&name=' + name + '&screen=' + (Platform.screen('tv') ? 'tv' : 'mobile') }); } @@ -20135,7 +23112,7 @@ type: 'POST', // изменено на POST dataType: 'text', - url: Utils$2.protocol() + object$2.cub_domain + '/api/adv/log', + url: Utils$1.protocol() + object$2.cub_domain + '/api/adv/log', data: _objectSpread2(_objectSpread2({ platform: Platform.get() }, data), last_responce) @@ -20147,7 +23124,7 @@ var guid = Storage.get('vast_device_guid', ''); if (!guid || guid.indexOf('00000000') === 0) { - guid = Utils$2.guid(); + guid = Utils$1.guid(); Storage.set('vast_device_guid', guid); } @@ -20158,7 +23135,7 @@ var uid = Storage.get('vast_device_uid', ''); if (!uid) { - uid = Utils$2.uid(15); + uid = Utils$1.uid(15); Storage.set('vast_device_uid', uid); } @@ -20177,7 +23154,7 @@ function Vast(preroll) { _classCallCheck(this, Vast); - this.listener = start$8(); + this.listener = Subscribe$2(); this.paused = false; this.preroll = preroll; this.elems = {}; @@ -20204,9 +23181,9 @@ this.elems.container = this.elems.block.find('.ad-video-block__vast'); this.elems.block.find('video').remove(); this.elems.container.style.opacity = 0; - this.elems.block.find('.ad-video-block__text').text(Lang.translate('ad') + ' - ' + Lang.translate('ad_disable')).toggleClass('hide', Boolean(this.preroll.msg)); + this.elems.block.find('.ad-video-block__text').text(Lang$1.translate('ad') + ' - ' + Lang$1.translate('ad_disable')).toggleClass('hide', Boolean(this.preroll.msg)); this.elems.block.find('.ad-video-block__info').text(''); - if (this.preroll.msg) this.elems.block.find('.ad-video-block__text').text(this.preroll.msg + ' - ' + Lang.translate('ad_disable')).toggleClass('hide', false); + if (this.preroll.msg) this.elems.block.find('.ad-video-block__text').text(this.preroll.msg + ' - ' + Lang$1.translate('ad_disable')).toggleClass('hide', false); this.elems.block.on('click', this.skip.bind(this)); document.body.append(this.elems.block); this.listener.send('launch'); @@ -20367,7 +23344,7 @@ this.elems.progressbar.style.width = progress + '%'; this.skip_ready = elapsed > this.skip_time; var user_view = Math.max(0, duration > this.skip_time ? this.skip_time - elapsed : remaining); - this.elems.skip.find('span').text(Lang.translate(this.skip_ready ? 'ad_skip' : Math.ceil(user_view))); + this.elems.skip.find('span').text(Lang$1.translate(this.skip_ready ? 'ad_skip' : Math.ceil(user_view))); if (remaining <= 0) clearInterval(this.tiks.progress); } /** @@ -20469,7 +23446,7 @@ return Vast; }(); - function init$D() { + function init$H() { var today = new Date(); var date = today.toISOString().split('T')[0]; @@ -20479,10 +23456,10 @@ Storage.set('metric_adview', 0); } - if (!Storage.get('metric_uid', '')) Storage.set('metric_uid', Utils$2.uid()); + if (!Storage.get('metric_uid', '')) Storage.set('metric_uid', Utils$1.uid()); $.ajax({ dataType: 'json', - url: Utils$2.protocol() + object$2.cub_domain + '/api/metric/unic?platform=' + Platform.get() + '&uid=' + Storage.get('metric_uid', '') + '&premium=' + (Account.hasPremium() ? 1 : 0) + url: Utils$1.protocol() + object$2.cub_domain + '/api/metric/unic?platform=' + Platform.get() + '&uid=' + Storage.get('metric_uid', '') + '&premium=' + (Account$1.hasPremium() ? 1 : 0) }); counter('screen', Platform.get(), Platform.screen('tv') ? 'tv' : 'mobile'); counter('client_region', VPN.code()); @@ -20512,19 +23489,19 @@ function counter(method, v1, v2, v3) { $.ajax({ dataType: 'json', - url: Utils$2.protocol() + object$2.cub_domain + '/api/metric/stat?method=' + method + '&value_one=' + (v1 || '') + '&value_two=' + (v2 || '') + '&value_three=' + (v3 || '') + url: Utils$1.protocol() + object$2.cub_domain + '/api/metric/stat?method=' + method + '&value_one=' + (v1 || '') + '&value_two=' + (v2 || '') + '&value_three=' + (v3 || '') }); } function histogram(method, value) { $.ajax({ dataType: 'json', - url: Utils$2.protocol() + object$2.cub_domain + '/api/metric/histogram?method=' + method + '&value=' + (value || 0) + url: Utils$1.protocol() + object$2.cub_domain + '/api/metric/histogram?method=' + method + '&value=' + (value || 0) }); } - var OtherMetric = { - init: init$D, + var ServiceMetric = { + init: init$H, counter: counter, histogram: histogram }; @@ -20542,45 +23519,50 @@ month: 0 }; - function init$C() { + function init$G() { db = new IndexedDB('advast', ['data'], 1); db.openDatabase()["catch"](function () { return console.log('Ad', 'error', 'no open database'); })["finally"](load$2); - setInterval(load$2, 1000 * 60 * 10); + Timer.add(1000 * 60 * 10, load$2); } function load$2() { - var any = false; + var pos = 0; - for (var i = 0; i < object$2.soc_mirrors.length; i++) { - var domain = object$2.soc_mirrors[i]; - $.ajax({ - url: Utils$2.protocol() + domain + '/api/ad/vast', - type: 'GET', - dataType: 'json', - timeout: 10000, - success: function success(data) { - if (any) return; - any = true; - data_loaded = data; + var request = function request() { + var domain = object$2.soc_mirrors[pos]; - if (db.db) { - db.getDataAnyCase('data', 'month').then(function (month) { - if (month !== data_loaded.month) { - db.rewriteData('data', 'user', {})["catch"](function () {})["finally"](prepareUser); - db.rewriteData('data', 'month', data_loaded.month)["catch"](function () {}); - } else prepareUser(); - }); - } else { - prepareUser(); + if (domain) { + $.ajax({ + url: Utils$1.protocol() + domain + '/api/ad/vast', + type: 'GET', + dataType: 'json', + timeout: 10000, + success: function success(data) { + data_loaded = data; + + if (db.db) { + db.getDataAnyCase('data', 'month').then(function (month) { + if (month !== data_loaded.month) { + db.rewriteData('data', 'user', {})["catch"](function () {})["finally"](prepareUser); + db.rewriteData('data', 'month', data_loaded.month)["catch"](function () {}); + } else prepareUser(); + }); + } else { + prepareUser(); + } + }, + error: function error() { + console.log('Ad', 'error', 'no load vast prerolls from', domain); + pos++; + request(); } - }, - error: function error() { - console.log('Ad', 'error', 'no load vast prerolls'); - } - }); - } + }); + } + }; + + request(); } function random(min, max) { @@ -20624,42 +23606,41 @@ }); } - function filter(view, player_data) { - if (played.prerolls.length >= view.length) played.prerolls = []; // if(played.time < Date.now() - waited){ - // played.prerolls = [] - // played.time = Date.now() - // } - - view = view.filter(function (v) { - return whitoutGenres(v.whitout_genre) !== true; - }); - view = view.filter(function (v) { - return v.screen == (Platform.screen('tv') ? 'tv' : 'mobile') || v.screen == 'all'; - }); + function filter$1(view, player_data) { + if (played.prerolls.length >= view.length) played.prerolls = []; view = view.filter(function (v) { return !played.prerolls.find(function (pr) { return pr == v.name; }); }); - view = view.filter(function (v) { - return v.platforms.indexOf(Platform.get()) !== -1 || v.platforms.indexOf('all') !== -1 || !v.platforms.length; - }); - view = view.filter(function (v) { - return v.region.split(',').indexOf(player_data.ad_region) !== -1 || v.region.indexOf('all') !== -1 || !v.region.length; - }); + + if (!window.lampa_settings.developer.ads) { + view = view.filter(function (v) { + return whitoutGenres(v.whitout_genre) !== true; + }); + view = view.filter(function (v) { + return v.screen == (Platform.screen('tv') ? 'tv' : 'mobile') || v.screen == 'all'; + }); + view = view.filter(function (v) { + return v.platforms.indexOf(Platform.get()) !== -1 || v.platforms.indexOf('all') !== -1 || !v.platforms.length; + }); + view = view.filter(function (v) { + return v.region.split(',').indexOf(player_data.ad_region) !== -1 || v.region.indexOf('all') !== -1 || !v.region.length; + }); + } + console.log('Ad', 'filter view ', view); if (view.length) { var preroll = view.length == 1 ? view[0] : view[random(0, view.length - 1)]; - played.prerolls.push(preroll.name); //waited = 1000 * 60 * random(1, 5) - + played.prerolls.push(preroll.name); return preroll; } return null; } - function get$7(player_data) { + function get$9(player_data) { var preroll; if (data_loaded.ad.length) { @@ -20668,10 +23649,10 @@ return need - played.user[p.name] > 0; }); console.log('Ad', 'can view ', view); - preroll = filter(view, player_data); + preroll = filter$1(view, player_data); } - OtherMetric.counter('ad_manager_get', data_loaded.ad.length ? 1 : 0, preroll ? 'show' : 'none', player_data.ad_region); + ServiceMetric.counter('ad_manager_get', data_loaded.ad.length ? 1 : 0, preroll ? 'show' : 'none', player_data.ad_region); if (preroll) { played.user[preroll.name]++; @@ -20683,17 +23664,18 @@ } var Manager = { - init: init$C, - get: get$7 + init: init$G, + get: get$9 }; - var running = false; + var running = 0; var player_data = {}; var vast_api = false; + var waite_time = 0; - function init$B() { + function init$F() { if (!(Platform.is('orsay') || Platform.is('netcast'))) { - Utils$2.putScriptAsync([object$2.github_lampa + '/vender/vast/vast.js'], false, false, function () { + Utils$1.putScriptAsync([object$2.github_lampa + '/vender/vast/vast.js'], false, false, function () { vast_api = true; }); Manager.init(); @@ -20701,27 +23683,26 @@ } function video(preroll, num, started, ended) { - console.log('Ad', 'launch', num); + console.log('Ad', 'launch'); var item = new Vast(preroll); item.listener.follow('launch', started); item.listener.follow('ended', ended); - var time = Date.now(); item.listener.follow('error', function () { - if (Date.now() - time < 11000 && num < 4) { - var next_preroll = Manager.get(player_data); + if (Date.now() - running < 15000 && num < 4) { + var next_preroll = getAnyPreroll(); if (next_preroll) video(next_preroll, num + 1, started, ended);else ended(); } else ended(); }); $.ajax({ dataType: 'text', - url: Utils$2.protocol() + object$2.cub_domain + '/api/ad/stat?platform=' + Platform.get() + '&type=launch&method=vast' + url: Utils$1.protocol() + object$2.cub_domain + '/api/ad/stat?platform=' + Platform.get() + '&type=launch&method=vast' }); } function launch(preroll, call) { var enabled = Controller.enabled().name; Background.theme('#454545'); - var html = $("\n
\n
\n
".concat(Lang.translate('ad'), "
\n
\n
\n ")); + var html = $("\n
\n
\n
".concat(Lang$1.translate('ad'), "
\n
\n
\n ")); $('body').append(html); setTimeout(function () { html.find('.ad-preroll__bg').addClass('animate'); @@ -20735,6 +23716,7 @@ Controller.toggle(enabled); Background.theme('black'); video(preroll, 1, function () {}, function () { + waite_time = Date.now(); html.remove(); Controller.toggle(enabled); call(); @@ -20759,36 +23741,47 @@ if (data.vast_url && typeof data.vast_url == 'string' && show) return { url: data.vast_url, name: 'plugin', - msg: data.vast_msg || Lang.translate('ad_plugin') + msg: data.vast_msg || Lang$1.translate('ad_plugin') }; return false; } - function show$6(data, call) { + function getAnyPreroll() { + var manager = false; + var plugin = getVastPlugin(player_data); + + if (waite_time < Date.now() - 1000 * 60 * 5) { + manager = Manager.get(player_data); + } + + return manager || plugin; + } + + function show$5(data, call) { if (!vast_api) { if (!(Platform.is('orsay') || Platform.is('netcast'))) { - OtherMetric.counter('no_vast_api', 1); + ServiceMetric.counter('no_vast_api', 1); console.log('Ad', 'error', 'no vast api'); } } if (!vast_api || data.torrent_hash || data.youtube || data.iptv || data.continue_play) return call(); if (running) return console.log('Ad', 'skipped, already running'); - running = true; + running = Date.now(); var ended = function ended() { - running = false; + running = 0; console.log('Ad', 'call ended'); call(); }; player_data = data; player_data.ad_region = VPN.code(); - var preroll = Manager.get(player_data) || getVastPlugin(player_data); + var preroll = getAnyPreroll(); console.log('Ad', 'any preroll', preroll); - var ignore = window.god_enabled ? false : Account.hasPremium() || Personal.confirm(); + var ignore = window.lampa_settings.developer.ads ? false : Account$1.hasPremium() || Personal.confirm(); if (ignore) console.log('Ad', 'skipped, premium or torrent/youtube/iptv/continue'); - OtherMetric.counter('ad_preroll', preroll ? 1 : 0, Account.hasPremium() ? 'premium' : Personal.confirm() ? 'personal' : 'none', VPN.code()); + ServiceMetric.counter('ad_preroll', preroll ? 1 : 0, Account$1.hasPremium() ? 'premium' : Personal.confirm() ? 'personal' : 'none', VPN.code()); if (preroll && !ignore) { launch(preroll, ended); @@ -20796,13 +23789,12 @@ } var Preroll = { - init: init$B, - show: show$6 + init: init$F, + show: show$5 }; - var html$b; - var listener$6 = start$8(); - new create$e(); + var html$d; + var listener$7 = Subscribe$2(); var callback$2; var work = false; var launch_player; @@ -20810,6 +23802,7 @@ var timer_save; var wait_for_loading_url = false; var wait_loading = false; + var is_opened = false; var preloader = { wait: false }; @@ -20822,27 +23815,27 @@ * Подписываемся на события */ - function init$A() { + function init$E() { PlayerPanel.init(); PlayerVideo.init(); PlayerInfo.init(); Footer.init(); PlayerIPTV.init(); - html$b = Template.get('player'); - html$b.append(PlayerVideo.render()); - html$b.append(PlayerPanel.render()); - html$b.append(PlayerInfo.render()); - html$b.append(Footer.render()); - html$b.on('mousemove', function () { - if (Storage.field('navigation_type') == 'mouse' && !Utils$2.isTouchDevice()) PlayerPanel.mousemove(); + html$d = Template.get('player'); + html$d.append(PlayerVideo.render()); + html$d.append(PlayerPanel.render()); + html$d.append(PlayerInfo.render()); + html$d.append(Footer.render()); + html$d.on('mousemove', function () { + if (Storage.field('navigation_type') == 'mouse' && !Utils$1.isTouchDevice()) PlayerPanel.mousemove(); }); if (!window.localStorage.getItem('player_torrent')) Storage.set('player_torrent', Storage.field('player')); /** Следим за обновлением времени */ PlayerVideo.listener.follow('timeupdate', function (e) { - PlayerPanel.update('time', Utils$2.secondsToTime(e.current | 0, true)); - PlayerPanel.update('timenow', Utils$2.secondsToTime(e.current || 0)); - PlayerPanel.update('timeend', Utils$2.secondsToTime(e.duration || 0)); + PlayerPanel.update('time', Utils$1.secondsToTime(e.current | 0, true)); + PlayerPanel.update('timenow', Utils$1.secondsToTime(e.current || 0)); + PlayerPanel.update('timeend', Utils$1.secondsToTime(e.duration || 0)); PlayerPanel.update('position', e.current / e.duration * 100 + '%'); Screensaver$2.resetTimer(); @@ -20953,7 +23946,7 @@ var vid = PlayerVideo.video(); if (vid && vid.duration) { - if (!Platform.screen('mobile')) e.time.removeClass('hide').text(Utils$2.secondsToTime(vid.duration * e.percent)).css('left', e.percent * 100 + '%'); + if (!Platform.screen('mobile')) e.time.removeClass('hide').text(Utils$1.secondsToTime(vid.duration * e.percent)).css('left', e.percent * 100 + '%'); if (e.method == 'click') { PlayerVideo.to(vid.duration * e.percent); @@ -21013,7 +24006,7 @@ PlayerPanel.listener.follow('visible', function (e) { PlayerInfo.toggle(e.status); PlayerVideo.normalizationVisible(e.status); - html$b.toggleClass('player--panel-visible', e.status); + html$d.toggleClass('player--panel-visible', e.status); }); /** К началу видео */ @@ -21040,7 +24033,7 @@ /** На весь экран */ PlayerPanel.listener.follow('fullscreen', function () { - Utils$2.toggleFullscreen(); + Utils$1.toggleFullscreen(); }); /** Картинка в картинке */ @@ -21097,7 +24090,7 @@ var call = function call() { var params = PlayerVideo.saveParams(); - destroy$4(); + destroy$5(); e.item.continue_play = true; PlayerPlaylist.set(PlayerPlaylist.get()); //надо повторно отправить, чтобы появилась кнопка плейлиста @@ -21154,7 +24147,7 @@ */ - function toggle$4() { + function toggle$5() { Controller.add('player', { invisible: true, toggle: function toggle() { @@ -21216,7 +24209,7 @@ function backward$1() { - destroy$4(); + destroy$5(); if (callback$2) callback$2();else Controller.toggle('content'); callback$2 = false; } @@ -21225,7 +24218,7 @@ */ - function destroy$4() { + function destroy$5() { saveTimeView(); if (work.viewed) work.viewed(viewing.time); clearTimeout(timer_ask); @@ -21239,21 +24232,22 @@ viewing.time = 0; viewing.difference = 0; viewing.current = 0; - html$b.removeClass('player--ios'); - html$b.removeClass('iptv'); - html$b.removeClass('player--panel-visible'); - html$b.removeClass('player--loading'); + html$d.removeClass('player--ios'); + html$d.removeClass('iptv'); + html$d.removeClass('player--panel-visible'); + html$d.removeClass('player--loading'); PlayerIPTV.destroy(); PlayerVideo.destroy(); PlayerVideo.clearParamas(); PlayerPanel.destroy(); PlayerInfo.destroy(); Footer.destroy(); - html$b.detach(); + html$d.detach(); + is_opened = false; Background.theme('reset'); $('body').removeClass('player--viewing'); if ($('body').hasClass('selectbox--open')) Select.hide(); - listener$6.send('destroy', {}); + listener$7.send('destroy', {}); } /** * Запустить webos плеер @@ -21327,17 +24321,17 @@ if (Storage.field('player_timecode') == 'ask') { work.timeline.waiting_for_user = true; Select.show({ - title: Lang.translate('title_action'), + title: Lang$1.translate('title_action'), items: [{ - title: Lang.translate('player_start_from') + ' ' + Utils$2.secondsToTime(work.timeline.time) + '?', + title: Lang$1.translate('player_start_from') + ' ' + Utils$1.secondsToTime(work.timeline.time) + '?', yes: true }, { - title: Lang.translate('settings_param_no') + title: Lang$1.translate('settings_param_no') }], onBack: function onBack() { work.timeline.continued = true; work.timeline.continued_bloc = true; - toggle$4(); + toggle$5(); clearTimeout(timer_ask); }, onSelect: function onSelect(a) { @@ -21348,7 +24342,7 @@ work.timeline.continued_bloc = true; } - toggle$4(); + toggle$5(); clearTimeout(timer_ask); } }); @@ -21357,7 +24351,7 @@ work.timeline.continued = true; work.timeline.continued_bloc = true; Select.hide(); - toggle$4(); + toggle$5(); }, 8000); } } @@ -21407,7 +24401,7 @@ return players[player]; } - function start$5(data, need, inner) { + function start$4(data, need, inner) { var player_need = 'player' + (need ? '_' + need : ''); if (data.launch_player) launch_player = data.launch_player; if (launch_player == 'lampa' || launch_player == 'inner' || PlayerVideo.verifyTube(data.url)) inner();else if (Platform.is('apple')) { @@ -21423,11 +24417,11 @@ if (external_url) { Preroll.show(data, function () { - listener$6.send('external', data); + listener$7.send('external', data); window.location.assign(external_url); }); } else if (Storage.field(player_need) == 'ios') { - html$b.addClass('player--ios'); + html$d.addClass('player--ios'); inner(); } else inner(); } else if (Platform.macOS()) { @@ -21440,7 +24434,7 @@ if (_external_url) { Preroll.show(data, function () { - listener$6.send('external', data); + listener$7.send('external', data); window.location.assign(_external_url); }); } else inner(); @@ -21459,7 +24453,7 @@ if (_external_url2) { Preroll.show(data, function () { - listener$6.send('external', data); + listener$7.send('external', data); window.location.assign(_external_url2); }); } else inner(); @@ -21471,7 +24465,7 @@ name: data.path || data.title, position: data.timeline ? data.timeline.time || -1 : -1 }); - listener$6.send('external', data); + listener$7.send('external', data); }); } else if (Platform.is('android') && (Storage.field(player_need) == 'android' || launch_player == 'android' || data.torrent_hash)) { data.url = data.url.replace('&preload', '&play'); @@ -21488,7 +24482,7 @@ Preroll.show(data, function () { data.position = data.timeline ? data.timeline.time || -1 : -1; Android.openPlayer(data.url, data); - listener$6.send('external', data); + listener$7.send('external', data); }); } else if (Platform.desktop() && Storage.field(player_need) == 'other') { var path = Storage.field('player_nw_path'); @@ -21500,31 +24494,13 @@ var spawn = require('child_process').spawn; spawn(path, [encodeURI(data.url.replace('&preload', '&play'))]); - listener$6.send('external', data); + listener$7.send('external', data); }); } else { - Noty.show(Lang.translate('player_not_found') + ': ' + path); + Noty.show(Lang$1.translate('player_not_found') + ': ' + path); } } else inner(); } - - function addContinueWatch() { - var continues_next = Storage.get('player_continue_watch', '[]'); - var continues_watch = Favorite.continues('tv'); - continues_watch = continues_watch.filter(function (a) { - var status = Favorite.check(a); - return !(status.thrown || status.viewed); - }); - var continues_all = Arrays.removeDuplicates([].concat(continues_next, continues_watch), 'id'); - if (continues_all.length) Footer.appendContinue({ - results: continues_all, - title: Lang.translate('title_continue'), - small: true, - collection: true, - nomore: true, - line_type: 'player-cards' - }); - } /** * Получить URL по качеству видео * @doc @@ -21572,7 +24548,7 @@ function play$1(data) { var run = true; - listener$6.send('create', { + listener$7.send('create', { data: data, abort: function abort() { return run = false; @@ -21593,10 +24569,12 @@ Background.theme('black'); $('body').addClass('player--viewing'); preload$1(data, function () { - html$b.toggleClass('tv', data.tv ? true : false); - html$b.toggleClass('youtube', Boolean(data.url.indexOf('youtube.com') >= 0)); - listener$6.send('start', data); + html$d.toggleClass('tv', data.tv ? true : false); + html$d.toggleClass('youtube', Boolean(data.url.indexOf('youtube.com') >= 0)); + listener$7.send('start', data); + Storage.set('player_subs_shift_time', '0'); if (work.timeline) work.timeline.continued = false; + Segments.set(data.segments); PlayerPlaylist.url(data.url); PlayerPlaylist.set(PlayerPlaylist.get()); //надо повторно отправить, а то после рекламы неправильно показывает @@ -21610,23 +24588,26 @@ PlayerInfo.set('name', data.title); if (!data.iptv) { - if (data.card) Footer.appendCard(data.card);else { - Lampa.Activity.active().movie && Footer.appendCard(Lampa.Activity.active().movie); + if (data.card) Footer.appendAbout(data.card);else { + Lampa.Activity.active().movie && Footer.appendAbout(Lampa.Activity.active().movie); } } - addContinueWatch(); - if (!preloader.call) $('body').append(html$b); - toggle$4(); + if (!preloader.call) { + is_opened = true; + $('body').append(html$d); + } + + toggle$5(); PlayerPanel.show(true); ask(); saveTimeLoop(); - listener$6.send('ready', data); + listener$7.send('ready', data); }); }); }; - start$5(data, data.torrent_hash ? 'torrent' : '', lauch); + start$4(data, data.torrent_hash ? 'torrent' : '', lauch); launch_player = ''; } @@ -21637,22 +24618,23 @@ var lauch = function lauch() { Background.theme('black'); - listener$6.send('start', data); - html$b.toggleClass('iptv', true); + listener$7.send('start', data); + html$d.toggleClass('iptv', true); PlayerIPTV.start(data); PlayerVideo.size(Storage.get('player_size', 'default')); PlayerVideo.speed(Storage.get('player_speed', 'default')); - $('body').append(html$b); - toggle$4(); + $('body').append(html$d); + is_opened = true; + toggle$5(); PlayerPanel.show(true); - listener$6.send('ready', data); + listener$7.send('ready', data); }; var ads = function ads() { if (data.vast_url) Preroll.show(data, lauch);else lauch(); }; - start$5(data, 'iptv', ads); + start$4(data, 'iptv', ads); }); } /** @@ -21721,7 +24703,7 @@ function render$7() { - return html$b; + return html$d; } /** * Возвращает статус, открыт ли плеер @@ -21733,7 +24715,7 @@ function opened$1() { - return $('body').find('.player').length ? true : false; + return is_opened; } /** * Показать процесс загрузки @@ -21747,14 +24729,14 @@ function loading$1(status) { if (!work) return; wait_loading = status; - html$b.toggleClass('player--loading', Boolean(status)); + html$d.toggleClass('player--loading', Boolean(status)); if (wait_loading) { Controller.toggle('player-loading'); PlayerVideo.pause(); } else { PlayerVideo.play(); - toggle$4(); + toggle$5(); } } @@ -21765,8 +24747,8 @@ } var Player = { - init: init$A, - listener: listener$6, + init: init$E, + listener: listener$7, play: play$1, playlist: playlist, render: render$7, @@ -21786,15 +24768,19 @@ } }; - var html$a = $("\n
\n \n \n
"); + var html$c = $("\n
\n \n \n \n
"); var background = { one: { - canvas: $('.background__one', html$a), - ctx: $('.background__one', html$a)[0].getContext('2d') + canvas: $('.background__one', html$c), + ctx: $('.background__one', html$c)[0].getContext('2d') }, two: { - canvas: $('.background__two', html$a), - ctx: $('.background__two', html$a)[0].getContext('2d') + canvas: $('.background__two', html$c), + ctx: $('.background__two', html$c)[0].getContext('2d') + }, + fade: { + canvas: $('.background__fade', html$c), + ctx: $('.background__fade', html$c)[0].getContext('2d') } }; var theme_elem = $('head meta[name="theme-color"]'); @@ -21807,14 +24793,14 @@ d: true }; var timer$2; - var timer_resize; - var timer_change; var immed_time = Date.now(); + var theme_color = '#1d1f20'; + var timer_change; /** * Запуск */ - function init$z() { + function init$D() { Storage.listener.follow('change', function (event) { if (event.name == 'background' || event.name == 'background_type') resize(); }); @@ -21837,7 +24823,20 @@ bokeh.c.push(_im); } - $(window).on('resize', resize); + background.one.canvas[0].width = window.screen_width; + background.one.canvas[0].height = window.screen_height; + background.two.canvas[0].width = window.screen_width; + background.two.canvas[0].height = window.screen_height; + background.fade.canvas[0].width = window.screen_width; + background.fade.canvas[0].height = window.screen_height; + Lampa.Listener.follow('resize_start', function () { + html$c[0].style.opacity = 0; + }); + Lampa.Listener.follow('resize_end', function () { + html$c[0].style.opacity = 1; + resize(); + }); + html$c[0].toggleClass('hide', !Storage.field('background')); } /** * Получить активный фон @@ -21846,10 +24845,6 @@ function bg() { - clearTimeout(timer_change); - timer_change = setTimeout(function () { - html$a.find('canvas').eq(view == 'one' ? 1 : 0).removeClass('visible'); - }, 400); view = view == 'one' ? 'two' : 'one'; return background[view]; } @@ -21862,14 +24857,15 @@ function draw(data, item, noimage) { - if (!Storage.get('background', 'true') || noimage) { - background.one.canvas.removeClass('visible'); - background.two.canvas.removeClass('visible'); - return; + if (noimage) return; // Для мобильных устройств делаем полный сброс canvas + + if (Platform.screen('mobile')) { + item.canvas[0].width = window.screen_width; + item.canvas[0].height = window.screen_height; + } else { + item.ctx.clearRect(0, 0, window.screen_width, window.screen_height); } - item.canvas[0].width = window.innerWidth; - item.canvas[0].height = window.innerHeight; var palette = data.palette; var type = Storage.field('background_type'); blur(data, item, function () { @@ -21881,9 +24877,9 @@ for (var i = 0; i < 10; i++) { var bp = Math.round(Math.random() * (bokeh.c.length - 1)); var im = bright[2] > 30 ? bokeh.h[bp] : bokeh.c[bp]; - var xp = window.innerWidth * Math.random(), - yp = window.innerHeight / 2 * Math.random() + window.innerHeight / 2, - sz = Math.max(window.innerHeight / 8, window.innerHeight / 5 * Math.random()) * 0.01, + var xp = window.screen_width * Math.random(), + yp = window.screen_height / 2 * Math.random() + window.screen_height / 2, + sz = Math.max(window.screen_height / 8, window.screen_height / 5 * Math.random()) * 0.01, nw = im.width * sz, nh = im.height * sz; @@ -21896,13 +24892,13 @@ item.ctx.globalAlpha = type == 'poster' ? 0.7 : 0.6; item.ctx.globalCompositeOperation = 'multiply'; var angle = 90 * Math.PI / 180, - x2 = item.canvas[0].width * Math.cos(angle), - y2 = item.canvas[0].height * Math.sin(angle); + x2 = window.screen_width * Math.cos(angle), + y2 = window.screen_height * Math.sin(angle); var gradient = item.ctx.createLinearGradient(0, 0, x2, y2); gradient.addColorStop(0, 'rgba(0,0,0,1)'); gradient.addColorStop(1, 'rgba(0,0,0,0)'); item.ctx.fillStyle = gradient; - item.ctx.fillRect(0, 0, item.canvas[0].width, item.canvas[0].height); + item.ctx.fillRect(0, 0, window.screen_width, window.screen_height); if (Platform.screen('mobile')) { item.ctx.globalAlpha = 1; @@ -21911,13 +24907,67 @@ gradient.addColorStop(0.05, 'rgba(29,31,32,1)'); gradient.addColorStop(0.18, 'rgba(' + palette.bright.join(',') + ',0)'); item.ctx.fillStyle = gradient; - item.ctx.fillRect(0, 0, item.canvas[0].width, item.canvas[0].height); + item.ctx.fillRect(0, 0, window.screen_width, window.screen_height); + clearTimeout(timer_change); + timer_change = setTimeout(function () { + html$c.find('canvas').eq(view == 'one' ? 1 : 0).removeClass('visible'); + }, 400); + item.canvas.addClass('visible'); + } else { + fadeTo(item); } - item.canvas.addClass('visible'); if (!Player.opened()) theme(Storage.field('black_style') ? 'black' : 'reset'); }); } + /** + * Плавный переход с двойным прогревом обоих canvas + */ + + + function fadeTo(new_bg) { + var fade = background.fade.ctx; + var old_image = background[view === 'one' ? 'two' : 'one'].canvas[0]; + var new_image = new_bg.canvas[0]; + var duration = 700; // длительность fade + + var warmup = 80; // прогрев GPU + + var start = Date.now(); + + function step() { + var elapsed = Date.now() - start; + + if (elapsed < warmup) { + // прогрев: оба слоя с альфой 0 + fade.globalAlpha = 0; + fade.drawImage(old_image, 0, 0); + fade.drawImage(new_image, 0, 0); + requestAnimationFrame(step); + return; + } // плавный переход + + + var progress = Math.min((elapsed - warmup) / duration, 1); + var eased = progress * progress * (3 - 2 * progress); // easeInOutCubic + // сначала рисуем старый фон + + fade.globalAlpha = 1; + fade.drawImage(old_image, 0, 0); // поверх рисуем новый с альфой + + fade.globalAlpha = eased; + fade.drawImage(new_image, 0, 0); + + if (progress < 1) { + requestAnimationFrame(step); + } + } // небольшой defer для синхронизации с рендером браузера + + + requestAnimationFrame(function () { + return requestAnimationFrame(step); + }); + } /** * Размыть картинку * @param {object} data @@ -21928,11 +24978,11 @@ function blur(data, item, complite) { function blured(img) { - var ratio = Math.max(item.canvas[0].width / img.width, item.canvas[0].height / img.height); + var ratio = Math.max(window.screen_width / img.width, window.screen_height / img.height); var nw = img.width * ratio, nh = img.height * ratio; item.ctx.globalAlpha = data.img.width > 1000 ? bokeh.d ? 0.7 : 0.2 : 1; - item.ctx.drawImage(img, -(nw - item.canvas[0].width) / 2, -(nh - item.canvas[0].height) / 2, nw, nh); + item.ctx.drawImage(img, -(nw - window.screen_width) / 2, -(nh - window.screen_height) / 2, nw, nh); complite(); } @@ -21944,15 +24994,20 @@ function resize() { - clearTimeout(timer_resize); - html$a.find('canvas').removeClass('visible'); - timer_resize = setTimeout(function () { - background.one.canvas.width(window.innerWidth); - background.one.canvas.height(window.innerHeight); - background.two.canvas.width(window.innerWidth); - background.two.canvas.height(window.innerHeight); - if (loaded[src]) draw(loaded[src], background[view]); - }, 200); + background.one.canvas[0].width = window.screen_width; + background.one.canvas[0].height = window.screen_height; + background.two.canvas[0].width = window.screen_width; + background.two.canvas[0].height = window.screen_height; + background.fade.canvas[0].width = window.screen_width; + background.fade.canvas[0].height = window.screen_height; + background.one.canvas.width(window.screen_width); + background.one.canvas.height(window.screen_height); + background.two.canvas.width(window.screen_width); + background.two.canvas.height(window.screen_height); + background.fade.canvas.width(window.screen_width); + background.fade.canvas.height(window.screen_height); + html$c[0].toggleClass('hide', !Storage.field('background')); + if (loaded[src]) draw(loaded[src], background[view]); } /** * Максимум картинок в памяти @@ -21994,14 +25049,13 @@ palette: Color.palette(colors) }; draw(loaded[cache_src], bg()); - ImageCache.write(img, img.src); }; img.onerror = function () { draw(false, false, true); }; - ImageCache.read(img, src); + img.src = src; } } /** @@ -22012,7 +25066,7 @@ function change() { var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - if (url == src || Storage.field('light_version')) return; + if (url == src || Storage.field('light_version') || !Storage.field('background')) return; bokeh.d = true; if (url) src = url; clearTimeout(timer$2); @@ -22028,7 +25082,7 @@ function immediately() { var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - if (Storage.field('light_version') || immed_time + 1000 > Date.now()) return; + if (Storage.field('light_version') || immed_time + 1000 > Date.now() || !Storage.field('background')) return; if (url) src = url; clearTimeout(timer$2); bokeh.d = false; @@ -22038,6 +25092,7 @@ function theme(color) { if (color == 'black') color = '#000000';else if (color == 'reset') color = '#1d1f20'; + if (color == theme_color) return; theme_elem.attr('content', color); } /** @@ -22047,14 +25102,14 @@ function render$6() { - return html$a; + return html$c; } var Background = { render: render$6, change: change, update: resize, - init: init$z, + init: init$D, immediately: immediately, theme: theme }; @@ -22062,26 +25117,31 @@ var timer$1; var need_update = false; var need_visible = false; - var canianimate = typeof requestAnimationFrame !== 'undefined'; - function init$y() { + function init$C() { + window.screen_width = window.innerWidth; + window.screen_height = window.innerHeight; $(window).on('resize', function () { + Lampa.Listener.send('resize_start'); + window.screen_width = window.innerWidth; + window.screen_height = window.innerHeight; clearTimeout(timer$1); timer$1 = setTimeout(function () { toggleMobile(); toggleOrientation(); size(); - update$4(); + update$5(); + Lampa.Listener.send('resize_end'); }, 100); }); var follow = ['animation', 'mask', 'card_interfice_poster', 'glass_style', 'black_style', 'glass_opacity', 'card_interfice_cover', 'advanced_animation', 'light_version', 'keyboard_type']; Storage.listener.follow('change', function (event) { if (event.name == 'interface_size') { size(); - update$4(); + update$5(); } - if (follow.indexOf(event.name) >= 0) toggleClasses(), update$4(); + if (follow.indexOf(event.name) >= 0) toggleClasses(), update$5(); }); toggleClasses(); toggleMobile(); @@ -22191,89 +25251,59 @@ } } - function intersected(a, b) { - return a[0] <= b[2] && b[0] <= a[2] && a[1] <= b[3] && b[1] <= a[3]; + function intersectedGrid(viewCell, elemCell) { + var maxDistance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2; + // разница между экранной ячейкой и ячейкой элемента + var dx = Math.abs(viewCell.x - elemCell.x); + var dy = Math.abs(viewCell.y - elemCell.y); // если элемент в пределах maxDistance ячеек — показываем + + return dx <= maxDistance && dy <= maxDistance; } - function frameVisible(render) { - var active = Lampa.Activity.active(); - var where = render ? render : active && active.activity ? active.activity.render() : false; - var area = 1.5; - var hide = Storage.field('hide_outside_the_screen'); - var v_w = window.innerWidth * area; - var v_h = window.innerHeight * area; - var m_w = window.innerWidth - v_w; - var m_h = window.innerHeight - v_h; + function frameVisible() { + var cellW = window.innerWidth; + var cellH = window.innerHeight; // экран всегда "в нулевой ячейке" - if (where) { - var target = where instanceof jQuery ? where[0] : where; - var elems = []; + var viewCell = { + x: 0, + y: 0 + }; - if (target.classList.contains('layer--visible')) { - elems.push({ - type: 'visible', - elem: target - }); - } - - if (target.classList.contains('layer--render')) { - elems.push({ - type: 'render', - elem: target - }); - } - - elems = elems.concat(Array.from(target.querySelectorAll('.layer--visible')).map(function (elem) { - return { - type: 'visible', - elem: elem - }; - }), Array.from(target.querySelectorAll('.layer--render')).map(function (elem) { - return { - type: 'render', - elem: elem - }; - })); + if (need_visible) { + var elems = need_visible; for (var i = 0; i < elems.length; i++) { - var item = elems[i]; - var elem = item.elem; + var elem = elems[i]; - if (item.type == 'visible') { - if (!elem.call_visible) { - var bond = elem.getBoundingClientRect(); + if (!elem.call_visible) { + elem.bond = elem.getBoundingClientRect(); // определяем в какую ячейку попадает элемент - if (intersected([m_w, m_h, v_w, v_h], [bond.left, bond.top, bond.left + bond.width, bond.top + bond.height])) { - elem.call_visible = true; - item.visible = true; - } - } - } - - if (elem.call_visible) { - var _bond = elem.getBoundingClientRect(); - - var view = hide ? intersected([m_w, m_h, v_w, v_h], [_bond.left, _bond.top, _bond.left + _bond.width, _bond.top + _bond.height]) : true; - var visibility = view ? 'visible' : 'hidden'; + var elemCell = { + x: Math.floor(elem.bond.left / cellW), + y: Math.floor(elem.bond.top / cellH) + }; + var inter = intersectedGrid(viewCell, elemCell, 2); + elem.visible = inter; + var visibility = inter ? 'visible' : 'hidden'; if (elem.visibility !== visibility) { if (!elem.visibility && visibility == 'visible') continue; elem.visibility = visibility; - item.visibility = visibility; } } } for (var _i3 = 0; _i3 < elems.length; _i3++) { - var _item = elems[_i3]; - var _elem3 = _item.elem; + var _elem3 = elems[_i3]; - if (_item.type == 'visible') { - if (_item.visible) Utils$2.trigger(_elem3, 'visible'); + if (_elem3.visible && !_elem3.called_visible) { + _elem3.called_visible = true; + Utils$1.trigger(_elem3, 'visible'); } - if (_item.visibility) { + if (_elem3.visibility && _elem3.style.visibility !== _elem3.visibility) { _elem3.style.visibility = _elem3.visibility; + Utils$1.trigger(_elem3, 'visible:change'); } } } @@ -22294,36 +25324,69 @@ Background.theme(Storage.field('black_style') ? 'black' : 'reset'); } - function visible(where) { - requestFrame(); - need_visible = where; - if (!canianimate) frameVisible(where); + function combineElements(find_class, elements, combine) { + var target = combine instanceof jQuery ? combine[0] : combine; + var elems = []; + + if (target.classList.contains(find_class)) { + elems.push(target); + } + + elems = elems.concat(Array.from(target.querySelectorAll('.' + find_class))); + elems.filter(function (elem) { + return elements.indexOf(elem) < 0; + }); + return [].concat(elements, elems); } - function update$4(where) { + function visible(where) { + var active = Lampa.Activity.active(); + var combine = where ? where : active && active.activity ? active.activity.render(true) : false; + if (!combine) return; + requestFrame(); + need_visible = combineElements('layer--visible', need_visible || [], combine); + } + + function update$5(where) { requestFrame(); need_update = where; - if (!canianimate) frameUpdate(where); } function requestFrame() { - if (canianimate && need_update === false && need_visible === false) requestAnimationFrame(updateFrame); + if (need_update === false && need_visible === false) requestAnimationFrame(updateFrame); } function updateFrame() { if (need_update !== false) frameUpdate(need_update); - if (need_visible !== false) frameVisible(need_visible); + if (need_visible !== false) frameVisible(); need_update = false; need_visible = false; } var Layer = { - update: update$4, + update: update$5, visible: visible, - init: init$y + init: init$C }; - function create$f() { + /** + * Создает кастомный скролл + * @param {object} [params] - параметры скрола + * @param {boolean} [params.horizontal=false] - горизонтальный скролл + * @param {boolean} [params.mask=false] - отображать маску прокрутки + * @param {boolean} [params.over=false] - разрешить скролл поверх других элементов + * @param {boolean} [params.nopadding=false] - отключить паддинги + * @param {boolean} [params.notransition=false] - отключить анимацию прокрутки + * @param {number} [params.step=150] - шаг прокрутки колесом мыши + * @param {boolean} [params.scroll_by_item=false] - прокручивать по элементам + * @param {number} [params.end_ratio=1] - соотношение для определения конца скрола (1 - конец, 2 - середина и т.д.) + * @param {function} [this.onWheel] - вызывается при прокрутке колесом мыши, вместо стандартной функции + * @param {function} [this.onScroll] - вызывается при прокрутке скрола + * @param {function} [this.onEnd] - вызывается при достижении конца скрола + * @returns {Scroll} + */ + + function Scroll() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _self = this; @@ -22331,14 +25394,13 @@ var html = Template.js('scroll'); var body = html.querySelector('.scroll__body'); var content = html.querySelector('.scroll__content'); - var caianimate = typeof requestAnimationFrame !== 'undefined'; - var frame_time = 0; + var screen = Platform.screen('tv'); var scroll_position = 0; - var scroll_transition = 0; + var scroll_animating = false; + var scroll_animate_timer = null; + var time_call_end = Date.now(); var scroll_time = 0, scroll_step = params.step || 150; - var call_update_time = Date.now(); - var call_transition_time = Date.now(); if (params.horizontal) html.classList.toggle('scroll--horizontal', true); if (params.mask) html.classList.toggle('scroll--mask', true); if (params.over) html.classList.toggle('scroll--over', true); @@ -22350,7 +25412,7 @@ var inner = onTheRightSide(e, true); if (!params.horizontal && $(html).is(parent[0])) inner = true; - if (Storage.field('navigation_type') == 'mouse' && Date.now() - scroll_time > 200 && inner) { + if (Date.now() - scroll_time > 200 && inner) { scroll_time = Date.now(); if (e.wheelDelta / 120 > 0) { @@ -22359,25 +25421,91 @@ if (_self.onWheel) _self.onWheel(scroll_step);else _self.wheel(scroll_step); } } - } + } // Обрабатываем скролл колесом мыши + html.addEventListener('mousewheel', wheel); - html.addEventListener('wheel', wheel); - html.Scroll = _self; - body.addEventListener('webkitTransitionEnd', function () { - if (Date.now() - call_transition_time > 400) return; //чет на моей карте выходит 180-190, странно, ну да ладно, поставил 150 + html.addEventListener('wheel', wheel); // Экспортируемые методы и свойства - if (Date.now() - call_update_time > 150) scrollEnded(); - }); + html.Scroll = _self; // Если это телевизор и есть сенсорный экран, то делаем скролл тачем + + if (screen) { + var movestart = function movestart(e) { + start_position = params.horizontal ? e.clientX : e.clientY; + end_position = start_position; + move_position = start_position; + body.toggleClass('notransition', true); + }; + + var move = function move(e) { + end_position = params.horizontal ? e.clientX : e.clientY; + + if (move_position && end_position) { + var delta = move_position - end_position; + var direct = params.horizontal ? 'left' : 'top'; + var scrl = scroll_position, + scrl_padding = parseInt(window.getComputedStyle(content, null).getPropertyValue('padding-' + direct)); + var max = params.horizontal ? 30000 : body.offsetHeight; + max -= params.horizontal ? html.offsetWidth : html.offsetHeight; + max += scrl_padding * 2; + scrl -= delta; + scrl = Math.min(0, Math.max(-max, scrl)); + scrl = maxOffset(scrl); + scroll_position = scrl; + translateScroll(); + move_position = end_position; + } + }; + + var moveend = function moveend(e) { + end_position = 0; + start_position = 0; + move_position = 0; + body.toggleClass('notransition', false); + scrollEnded(); + if (_self.onAnimateEnd) _self.onAnimateEnd(); + }; - if (Platform.screen('tv')) { html.addEventListener('scroll', function (e) { html.scrollTop = 0; html.scrollLeft = 0; }); + var start_position = 0; + var move_position = 0; + var end_position = 0; + html.addEventListener('touchstart', function (e) { + movestart(e.touches[0] || e.changedTouches[0]); + }); + html.addEventListener('touchmove', function (e) { + move(e.touches[0] || e.changedTouches[0]); + }); + html.addEventListener('touchend', moveend); } else { - html.addEventListener('scroll', scrollEnded); + var native_scroll_animate = false; + var native_scroll_timer = null; + html.addEventListener('scroll', function () { + clearTimeout(native_scroll_timer); + native_scroll_timer = setTimeout(function () { + if (_self.onAnimateEnd) _self.onAnimateEnd(); + }, 300); + + if (!native_scroll_animate) { + native_scroll_animate = true; + requestAnimationFrame(function () { + native_scroll_animate = false; + scroll_position = -(params.horizontal ? html.scrollLeft : html.scrollTop); + scrollEnded(); + }); + } + }); } + /** + * Определяет, находится ли курсор на правой стороне скрола + * @param {Event} e - событие мыши + * @param {boolean} inleft - если true, то проверяет левую сторону + * @returns {boolean} + */ + function onTheRightSide(e) { var inleft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; @@ -22386,6 +25514,12 @@ var position = e.clientX - offset; return params.horizontal ? position > width / 2 : inleft ? position < width / 2 : false; } + /** + * Максимально возможный отступ + * @param {number} offset - желаемый отступ + * @returns {number} + */ + function maxOffset(offset) { var w = params.horizontal ? html.offsetWidth : html.offsetHeight; @@ -22395,44 +25529,84 @@ offset = Math.max(-(Math.max(s + p * 2, w) - w), offset); return offset; } + /** + * Вызов обновления скрола и вызов события конеца скрола + */ + function scrollEnded() { - call_update_time = Date.now(); - if (_self.onScroll) _self.onScroll(!Platform.screen('tv') ? html[params.horizontal ? 'scrollLeft' : 'scrollTop'] : -scroll_position);else Layer.visible(html); + if (_self.onScroll) _self.onScroll(!screen ? html[params.horizontal ? 'scrollLeft' : 'scrollTop'] : -scroll_position);else Layer.visible(html); if (_self.onEnd && _self.isEnd()) _self.onEnd(); } + /** + * Перемещает скролл в указанную позицию без анимации + */ - function scrollTo(scrl) { - scroll_position = scrl; - if (!Platform.screen('tv')) { - var object = {}; - object[params.horizontal ? 'scrollLeft' : 'scrollTop'] = -scrl; - $(html).animate(object, 200); + function translateScroll() { + if (!screen) { + html[params.horizontal ? 'scrollLeft' : 'scrollTop'] = -scroll_position; } else { - if (scroll_transition == false) { - scroll_transition = scrl; - - if (caianimate && Storage.field('animation')) { - var cannow = Date.now() - frame_time > 500; - if (cannow) animate();else requestAnimationFrame(animate); - } else animate(); - } + body.style['-webkit-transform'] = 'translate3d(' + Math.round(params.horizontal ? scroll_position : 0) + 'px, ' + Math.round(params.horizontal ? 0 : scroll_position) + 'px, 0px)'; } } + /** + * Начинает анимацию прокрутки к указанной позиции + * @param {number} to_position - куда нужно прокрутить + */ - function animate() { - body.style['-webkit-transform'] = 'translate3d(' + Math.round(params.horizontal ? scroll_transition : 0) + 'px, ' + Math.round(params.horizontal ? 0 : scroll_transition) + 'px, 0px)'; - scroll_transition = false; - if (!Storage.field('animation') || Date.now() - call_update_time < 300) scrollEnded(); - frame_time = Date.now(); - } - function startScroll(scrl) { - scrollTo(scrl); - call_update_time = Date.now(); - call_transition_time = Date.now(); + function startScroll(to_position) { + // Зачем начинать анимацию, если мы уже там? + if (scroll_position == to_position) return; + scroll_position = to_position; + translateScroll(); + + if (Storage.field('animation')) { + clearTimeout(scroll_animate_timer); + scroll_animating = true; + body.addEventListener('webkitTransitionEnd', function () { + requestAnimationFrame(function () { + scroll_animating = false; // Сразу несколько раз вызывается событие если быстро кликать, поэтому блокируем вызов + + if (Date.now() - time_call_end < 300) return; + time_call_end = Date.now(); + scrollEnded(); + if (_self.onAnimateEnd) _self.onAnimateEnd(); + }); + }, { + once: true + }); + } else { + scrollEnded(); + if (_self.onAnimateEnd) _self.onAnimateEnd(); + } } + /** + * Получить позицию элемента относительно скрола + * @param {HTMLElement|jQuery} elem - элемент, который должен быть виден + * @param {boolean} tocenter - выровнять элемент по центру скрола + * @returns {number} + */ + + + function getElementPosition(elem, tocenter) { + var dir = params.horizontal ? 'left' : 'top', + siz = params.horizontal ? 'offsetWidth' : 'offsetHeight'; + var target = elem instanceof jQuery ? elem[0] : elem; + var p = tocenter ? parseInt(window.getComputedStyle(content, null).getPropertyValue('padding-' + (params.horizontal ? 'left' : 'top'))) : 0; + var ofs_elm = target.getBoundingClientRect()[dir], + ofs_box = body.getBoundingClientRect()[dir], + center = ofs_box + (tocenter ? content[siz] / 2 - target[siz] / 2 - p : 0), + scrl = Math.min(0, center - ofs_elm); + scrl = maxOffset(scrl); + return scrl; + } + /** + * Добавить обработку свайпа вниз имитации скрытия шторки + * @param {function} call - функция, которая будет вызвана при свайпе вниз + */ + this.addSwipeDown = function (call) { if (window.innerWidth > 480) return; @@ -22460,6 +25634,11 @@ s = 0; }); }; + /** + * Вызвать прокрутку + * @param {number} size - на сколько пикселей прокрутить + */ + this.wheel = function (size) { var direct = params.horizontal ? 'left' : 'top'; @@ -22487,23 +25666,58 @@ scrl = maxOffset(scrl); startScroll(scrl); }; + /** + * Обновить позицию скрола, чтобы элемент был виден + * @param {HTMLElement|jQuery} elem - элемент, который должен быть виден + * @param {boolean} tocenter - выровнять элемент по центру скрола + * @returns {void} + */ + this.update = function (elem, tocenter) { - var dir = params.horizontal ? 'left' : 'top', - siz = params.horizontal ? 'offsetWidth' : 'offsetHeight'; - var target = elem instanceof jQuery ? elem[0] : elem; - var ofs_elm = target.getBoundingClientRect()[dir], - ofs_box = body.getBoundingClientRect()[dir], - center = ofs_box + (tocenter ? content[siz] / 2 - target[siz] / 2 : 0), - scrl = Math.min(0, center - ofs_elm); - scrl = maxOffset(scrl); - startScroll(scrl); + startScroll(getElementPosition(elem, tocenter)); }; + /** + * Обновить позицию скрола, чтобы элемент был виден без анимации + * @param {HTMLElement|jQuery} elem - элемент, который должен быть виден + * @param {boolean} tocenter - выровнять элемент по центру скрола + * @returns {void} + */ + + + this.immediate = function (elem, tocenter) { + body.toggleClass('notransition', true); + scroll_position = getElementPosition(elem, tocenter); + translateScroll(); + setTimeout(function () { + body.toggleClass('notransition', false); + }, 5); + }; + /** + * Сдвинуть скролл на указанное количество пикселей без анимации + * @param {number} shift - на сколько пикселей сдвинуть скролл + * @returns {void} + */ + + + this.shift = function (shift) { + body.toggleClass('notransition', true); + scroll_position = maxOffset(scroll_position - shift); + translateScroll(); + setTimeout(function () { + body.toggleClass('notransition', false); + }, 5); + }; + /** + * Получить параметры скрола + * @returns {Object} + */ + this.vieport = function () { var vieport = {}; - if (!Platform.screen('tv')) { + if (!screen) { vieport.position = html[params.horizontal ? 'scrollLeft' : 'scrollTop'], vieport.body = body[params.horizontal ? 'scrollWidth' : 'scrollHeight'], vieport.content = html[params.horizontal ? 'offsetWidth' : 'offsetHeight']; } else { vieport.position = scroll_position; @@ -22513,144 +25727,261 @@ return vieport; }; + /** + * Проверить, достигнут ли конец скрола + * @param {number} [end_ratio] - соотношение для определения конца скрола (1 - конец, 2 - середина и т.д.) + * @returns {boolean} + */ + this.isEnd = function (end_ratio) { var vieport = this.vieport(); if (vieport.body < vieport.content) return vieport.position <= 0; return vieport.body - vieport.content * Math.max(1, end_ratio || params.end_ratio || 1) < Math.abs(vieport.position); }; + /** + * Проверить, заполнен ли скролл контентом + * @returns {boolean} + */ + this.isFilled = function () { var vieport = this.vieport(); return vieport.body > vieport.content; }; + /** + * Добавить элемент в скролл + * @param {HTMLElement|jQuery} object - элемент для добавления + * @returns {void} + */ + this.append = function (object) { body.appendChild(object instanceof jQuery ? object[0] : object); }; + /** + * Установить высоту скрола с учетом вычитаемого элемента и вычитом шапки + * @param {HTMLElement|jQuery} minus - элемент, высота которого будет вычтена из высоты скрола + * @returns {void} + */ + this.minus = function (minus) { html.classList.add('layer--wheight'); html.mheight = minus instanceof jQuery ? minus[0] : minus; }; + /** + * Установить высоту скрола с учетом вычитаемого элемента + * @param {HTMLElement|jQuery} minus - элемент, высота которого будет вычтена из высоты скрола + * @returns {void} + */ + this.height = function (minus) { html.classList.add('layer--height'); html.mheight = minus instanceof jQuery ? minus[0] : minus; }; + /** + * Получить тело скрола + * @param {boolean} js - вернуть в виде DOM-элемента, а не jQuery + * @returns {HTMLElement|jQuery} + */ + this.body = function (js) { return js ? body : $(body); }; + /** + * Получить HTML скрола + * @param {boolean} js - вернуть в виде DOM-элемента, а не jQuery + * @returns {HTMLElement|jQuery} + */ + this.render = function (js) { return js ? html : $(html); }; + /** + * Очистить скролл от элементов + * @returns {void} + */ + this.clear = function () { body.innerHTML = ''; }; + /** + * Получить параметры скрола + * @returns {Object} + */ + this.params = function () { return params; }; + /** + * Получить текущую позицию скрола + * @returns {number} + */ + this.position = function () { return scroll_position; }; + /** + * Восстановить позицию скрола + * Используется после detach активности, скролл сбивается и после start активности его нужно восстановить + * @returns {void} + */ + + + this.restorePosition = function () { + if (Platform.screen('mobile')) translateScroll(); + }; + /** + * Отключить паддинги у скрола + * @returns {void} + */ + + + this.nopadding = function () { + html.classList.toggle('scroll--nopadding', true); + }; + /** + * Cбросить позицию скрола в 0 + * @returns {void} + */ + this.reset = function () { - body.classList.add('transition-reset'); - body.style['-webkit-transform'] = 'translate3d(0px, 0px, 0px)'; - setTimeout(function () { - body.classList.remove('transition-reset'); - }, 0); scroll_position = 0; + translateScroll(); }; + /** + * Проверить, анимируется ли скролл в данный момент + * @returns {boolean} + */ + + + this.animated = function () { + return scroll_animating ? true : false; + }; + /** + * Удалить скролл + * @returns {void} + */ + this.destroy = function () { + scroll_animating = false; html.remove(); }; } - var html$9, active$3, _scroll, last$2; + var html$b, + active$4, + _scroll, + last$1, + _opened = false; - var listener$5 = start$8(); + var listener$6 = Subscribe$2(); + /** + * Открывает модальное окно + * @param {object} params - параметры окна + * @param {string} params.title - заголовок окна + * @param {jQuery|HTMLElement} params.html - содержимое окна + * @param {string} [params.size=small] - размер окна (small, medium, large, full) + * @param {boolean} [params.overlay=false] - отображать окно как оверлей + * @param {string} [params.align=top] - выравнивание окна (top, center) + * @param {boolean} [params.mask=false] - отображать маску прокрутки + * @param {Array} [params.buttons] - массив кнопок внизу окна {name: 'Имя', onSelect: function(){}} + * @param {string} [params.buttons_position=inside] - положение кнопок (inside, outside) + * @param {HTMLElement|jQuery} [params.select] - элемент для фокуса после открытия + * @param {function} [params.onBack] - вызывается при закрытии окна + * @param {function} [params.onSelect] - вызывается при выборе элемента внутри окна + * @param {number} [params.zIndex] - z-index окна + * @returns {void} + */ - function open$3(params) { - active$3 = params; - listener$5.send('preshow', { - active: active$3 + function open$5(params) { + active$4 = params; + active$4.open_time = Date.now(); + listener$6.send('preshow', { + active: active$4 }); - html$9 = Template.get('modal', { + html$b = Template.get('modal', { title: params.title }); - html$9.on('mousedown', function (e) { - if (!$(e.target).closest($('.modal__content', html$9)).length && DeviceInput.canClick(e.originalEvent)) Controller.back(); + html$b.on('mousedown', function (e) { + if (!$(e.target).closest($('.modal__content', html$b)).length && DeviceInput.canClick(e.originalEvent) && active$4.open_time + 1000 < Date.now()) Controller.back(); }); title(params.title); - html$9.toggleClass('modal--medium', params.size == 'medium' ? true : false); - html$9.toggleClass('modal--large', params.size == 'large' ? true : false); - html$9.toggleClass('modal--full', params.size == 'full' ? true : false); - html$9.toggleClass('modal--overlay', params.overlay ? true : false); - html$9.toggleClass('modal--align-center', params.align == 'center' ? true : false); - if (params.zIndex) html$9.css('z-index', params.zIndex); - _scroll = new create$f({ + html$b.toggleClass('modal--medium', params.size == 'medium' ? true : false); + html$b.toggleClass('modal--large', params.size == 'large' ? true : false); + html$b.toggleClass('modal--full', params.size == 'full' ? true : false); + html$b.toggleClass('modal--overlay', params.overlay ? true : false); + html$b.toggleClass('modal--align-center', params.align == 'center' ? true : false); + if (params.zIndex) html$b.css('z-index', params.zIndex); + _scroll = new Scroll(_objectSpread2({ over: true, mask: params.mask - }); - - _scroll.render().toggleClass('layer--height', params.size == 'full' ? true : false); - - html$9.find('.modal__body').append(_scroll.render()); - - if (Platform.screen('mobile') && params.size !== 'full') { - var close_button = $("
\n \n \n \n
"); - close_button.on('click', function () { - Controller.back(); - }); - html$9.find('.modal__content').prepend(close_button); - } - + }, params.scroll)); + html$b.find('.modal__content').toggleClass('layer--height', params.size == 'full' ? true : false); + html$b.find('.modal__body').append(_scroll.render()); bind$1(params.html); _scroll.onWheel = function (step) { roll(step > 0 ? 'down' : 'up'); }; - if (params.size == 'full' && Platform.screen('mobile')) { - _scroll.append(HeadBackward(params.title || '')); + if (params.size == 'full' && Platform.mouse()) { + html$b.find('.modal__content').prepend(HeadBackward(params.title || '')); } _scroll.append(params.html); _scroll.addSwipeDown(function () { - html$9.addClass('animate-down'); + html$b.addClass('animate-down'); setTimeout(function () { Controller.back(); }, 200); }); - if (params.buttons) buttons(); - $('body').append(html$9); + if (params.buttons) buttons$1(); + $('body').append(html$b); max(); - listener$5.send('fullshow', { - active: active$3, - html: html$9 + listener$6.send('fullshow', { + active: active$4, + html: html$b }); - toggle$3(params.select); - html$9.addClass('animate'); + toggle$4(params.select); + html$b.addClass('animate'); + _opened = true; } function max() { - var height = window.innerWidth <= 480 ? window.innerHeight * 0.6 : window.innerHeight - _scroll.render().offset().top - window.innerHeight * 0.1 - (active$3.buttons && active$3.buttons_position == 'outside' ? window.innerHeight * 0.1 : 0); + var height = window.innerHeight; + + if (window.innerWidth <= 480) { + if (active$4.size == 'full') { + height = window.innerHeight - html$b.find('.head-backward').outerHeight(); + + _scroll.render().css('height', height + 'px'); + } else { + height = window.innerHeight * 0.6; + } + } else { + height -= _scroll.render().offset().top; + if (active$4.size !== 'full') height -= window.innerHeight * 0.1; + if (active$4.buttons && active$4.buttons_position == 'outside') height -= html$b.find('.modal__footer').outerHeight() || 0; + } _scroll.render().find('.scroll__content').css('max-height', Math.round(height) + 'px'); } - function buttons() { + function buttons$1() { var footer = $(''); - active$3.buttons.forEach(function (button) { + active$4.buttons.forEach(function (button) { var btn = $(''); btn.text(button.name); btn.on('click hover:enter', function (e) { @@ -22658,17 +25989,20 @@ }); footer.append(btn); }); - if (active$3.buttons_position == 'outside') html$9.find('.modal__content').append(footer);else _scroll.append(footer); + + if (active$4.buttons_position == 'outside') { + html$b.find('.modal__content').append(footer); + } else _scroll.append(footer); } function bind$1(where) { where.find('.selector').on('hover:focus', function (e) { - last$2 = e.target; + last$1 = e.target; - _scroll.update($(e.target)); + _scroll.update($(e.target), active$4.scroll_to_center); }).on('hover:enter', function (e) { - last$2 = e.target; - if (active$3.onSelect) active$3.onSelect($(e.target)); + last$1 = e.target; + if (active$4.onSelect) active$4.onSelect($(e.target)); }); } @@ -22696,28 +26030,28 @@ } } - function toggle$3(need_select) { + function toggle$4(need_select) { Controller.add('modal', { invisible: true, toggle: function toggle() { Controller.collectionSet(_scroll.render()); - Controller.collectionFocus(need_select || last$2, _scroll.render()); + Controller.collectionFocus(need_select || last$1, _scroll.render()); Layer.visible(_scroll.render(true)); - listener$5.send('toggle', { - active: active$3, - html: html$9 + listener$6.send('toggle', { + active: active$4, + html: html$b }); }, up: function up() { - if (active$3.buttons && active$3.buttons_position == 'outside' && (_scroll.isEnd() || !_scroll.isFilled())) { + if (active$4.buttons && active$4.buttons_position == 'outside' && (_scroll.isEnd() || !_scroll.isFilled())) { Controller.toggle('modal'); roll('up'); } else roll('up'); }, down: function down() { - if (active$3.buttons && active$3.buttons_position == 'outside' && (_scroll.isEnd() || !_scroll.isFilled())) { - Controller.collectionSet(html$9.find('.modal__footer')); - Controller.collectionFocus(false, html$9.find('.modal__footer')); + if (active$4.buttons && active$4.buttons_position == 'outside' && (_scroll.isEnd() || !_scroll.isFilled())) { + Controller.collectionSet(html$b.find('.modal__footer')); + Controller.collectionFocus(false, html$b.find('.modal__footer')); } else roll('down'); }, right: function right() { @@ -22727,14 +26061,14 @@ if (Navigator.canmove('left')) Navigator.move('left');else jump(false); }, back: function back() { - if (active$3.onBack) active$3.onBack(); + if (active$4.onBack) active$4.onBack(); } }); Controller.toggle('modal'); } - function update$3(new_html) { - last$2 = false; + function update$4(new_html) { + last$1 = false; _scroll.clear(); @@ -22742,52 +26076,56 @@ bind$1(new_html); max(); - listener$5.send('update', { - active: active$3, - html: html$9, + listener$6.send('update', { + active: active$4, + html: html$b, new_html: new_html }); - toggle$3(active$3.select); + toggle$4(active$4.select); } function title(tit) { - html$9.find('.modal__title').text(tit); - html$9.toggleClass('modal--empty-title', tit ? false : true); + html$b.find('.modal__title').text(tit); + html$b.toggleClass('modal--empty-title', !tit ? true : false); } - function destroy$3() { - last$2 = false; + function destroy$4() { + last$1 = false; _scroll.destroy(); - html$9.remove(); - listener$5.send('close', { - active: active$3 + html$b.remove(); + listener$6.send('close', { + active: active$4 }); + _opened = false; } - function close$4() { - destroy$3(); + function close$6() { + destroy$4(); } function render$5() { - return html$9; + return html$b; } var Modal = { - listener: listener$5, - open: open$3, - close: close$4, - update: update$3, + listener: listener$6, + open: open$5, + close: close$6, + update: update$4, title: title, - toggle: toggle$3, + toggle: toggle$4, render: render$5, scroll: function scroll() { return _scroll; + }, + opened: function opened() { + return _opened; } }; - function init$x() { + function init$B() { var agent = navigator.userAgent.toLowerCase(); if (typeof webOS !== 'undefined' && webOS.platform.tv === true) { @@ -22811,7 +26149,7 @@ Storage.set('platform', 'philips'); } else if (agent.indexOf("ipad") > -1 && window.innerWidth == 1920 && window.innerHeight == 1080) { Storage.set('platform', 'apple_tv'); - } else if (agent.indexOf("iphone") > -1 || agent.indexOf("mac os") > -1 && Utils$2.isTouchDevice() || agent.indexOf("macintosh") > -1 && Utils$2.isTouchDevice()) { + } else if (agent.indexOf("iphone") > -1 || agent.indexOf("mac os") > -1 && Utils$1.isTouchDevice() || agent.indexOf("macintosh") > -1 && Utils$1.isTouchDevice()) { Storage.set('platform', 'apple'); } else if (typeof nw !== 'undefined') { Storage.set('platform', 'nw'); @@ -22820,8 +26158,8 @@ } else if (agent.indexOf("netcast") > -1) { Storage.set('platform', 'netcast'); } else if (agent.indexOf("version/5.1.7 safari/534.57.2") > -1) { - Storage.set('platform', 'orsay'); - } else if (agent.indexOf("windows nt") > -1 || agent.indexOf("macintosh") > -1 && !Utils$2.isTouchDevice()) { + Storage.set('platform', 'orsay'); // Версия для тестов на Safari + } else if ((agent.indexOf("windows nt") > -1 || agent.indexOf("macintosh") > -1) && !Utils$1.isTouchDevice()) { Storage.set('platform', 'browser'); } else if (agent.indexOf("maple") > -1) { Storage.set('platform', 'orsay'); @@ -22831,8 +26169,9 @@ } Storage.set('native', Storage.get('platform') ? true : false); - $('body').addClass('platform--' + (get$6() || 'noname')); - if (!screen('tv')) $('body').addClass('touch-device'); + $('body').addClass('platform--' + (get$8() || 'noname')); + $('body').toggleClass('touch-device', screen('mobile')); + $('body').toggleClass('mouse--controll', mouse()); } /** * Какая платформа @@ -22840,7 +26179,7 @@ */ - function get$6() { + function get$8() { return Storage.get('platform', ''); } /** @@ -22851,25 +26190,34 @@ function is(need) { - return get$6() == need ? true : false; + return get$8() == need; } /** - * Если хоть одна из платформ tizen, webos, android + * Платформы у которых есть возможность изменить плеер * @returns Boolean */ function any() { - return is('tizen') || is('webos') || is('android') || is('netcast') || is('orsay') || is('apple') || is('apple_tv') || macOS() || desktop() ? true : false; + return is('tizen') || is('webos') || is('android') || is('netcast') || is('orsay') || is('apple') || is('apple_tv') || macOS() || desktop(); } /** - * Если это именно телек + * Если это телевизор * @returns Boolean */ function tv() { - return is('tizen') || is('webos') || is('orsay') || is('netcast') || is('apple_tv') ? true : false; + return is('tizen') || is('webos') || is('orsay') || is('netcast') || is('apple_tv') || tvbox() || Boolean(navigator.userAgent.toLowerCase().match(/tizen|webos/i)); + } + /** + * Если это телевизор на базе приставки (Android TV, Mi Box, Nvidia Shield и т.п.) + * @returns Boolean + */ + + + function tvbox() { + return Boolean(navigator.userAgent.toLowerCase().match(/googletv|mibox|mitv|smarttv|google tv|android tv/i)); } /** * Если это NW.js или Electron @@ -22878,13 +26226,33 @@ function desktop() { - return is('nw') || is('electron') ? true : false; + return is('nw') || is('electron'); } + /** + * Если навигация мышь или тачпад + * @returns Boolean + */ + + + function mouse() { + return screen('tv') && !tv() || Storage.field('navigation_type') !== 'controll'; + } + /** + * Если это macOS без тача + * @returns Boolean + */ + function macOS() { var agent = navigator.userAgent.toLowerCase(); - return agent.indexOf("mac os x") > -1 && !Utils$2.isTouchDevice(); + return agent.indexOf("mac os x") > -1 && !Utils$1.isTouchDevice(); } + /** + * Версия приложения + * @param {String} name - какая нужна? app, android, orsay + * @returns String + */ + function version(name) { if (name == 'app') { @@ -22897,6 +26265,12 @@ return ''; } } + /** + * Экран телевизор или мобильный + * @param {String} need - какой нужен? tv, mobile, light + * @returns Boolean + */ + function screen(need) { if (need == 'light') { @@ -22905,12 +26279,12 @@ var is_tv = true; - if (!tv()) { - if (Storage.get('is_true_mobile', 'false')) is_tv = false;else if (Boolean(Storage.get('platform', '') == 'apple')) is_tv = false;else if (Boolean(navigator.userAgent.toLowerCase().match(/iphone|ipad/i))) is_tv = false;else if (Utils$2.isTouchDevice()) { + if (!(tv() || desktop())) { + if (Storage.get('is_true_mobile', 'false')) is_tv = false;else if (Boolean(Storage.get('platform', '') == 'apple')) is_tv = false;else if (Boolean(navigator.userAgent.toLowerCase().match(/iphone|ipad/i))) is_tv = false;else if (Utils$1.isTouchDevice()) { if (!Boolean(navigator.userAgent.toLowerCase().match(/(large screen)|googletv|mibox|mitv|smarttv|google tv|android tv/i))) { var ratio = window.devicePixelRatio || 1; - var width = Math.ceil(window.innerWidth * ratio); - var height = Math.ceil(window.innerHeight * ratio); + var width = Math.ceil(window.screen_width * ratio); + var height = Math.ceil(window.screen_height * ratio); is_tv = width > height && width >= 1280; } } @@ -22926,7 +26300,7 @@ if ($('.modal').length) Modal.close(); if (what == 'apk') { - $('> div:eq(0)', about).html(Lang.translate('install_app_apk_text')); + $('> div:eq(0)', about).html(Lang$1.translate('install_app_apk_text')); $('.about__contacts', about).empty(); $('.about__rules', about).remove(); $('.about__contacts', about).append("\n
\n Telegram
\n @lampa_group\n
\n "); @@ -22943,11 +26317,12 @@ } var Platform = { - init: init$x, - get: get$6, + init: init$B, + get: get$8, any: any, is: is, tv: tv, + mouse: mouse, desktop: desktop, version: version, screen: screen, @@ -22955,65 +26330,10 @@ macOS: macOS }; - var bell; - var items$1 = []; - - function Item$1(params) { - var _this = this; - - Arrays.extend(params, { - icon: "\n \n \n ", - type: 'info', - text: '', - time: 5000 - }); - var element = $("
\n
").concat(params.icon, "
\n
").concat(params.text, "
\n
")); - setTimeout(function () { - element.removeClass('show'); - setTimeout(function () { - var slide = $("
"); - slide.css('height', element.outerHeight() + 'px'); - element.after(slide); - element.remove(); - Arrays.remove(items$1, _this); - slide.animate({ - height: 0 - }, 300, function () { - slide.remove(); - }); - - if (items$1.length == 0) { - bell.removeClass('show'); - } - }, 300); - }, params.time); - bell.find('.bell__wrap').append(element); - setTimeout(function () { - element.addClass('show'); - }, 100); - items$1.push(this); - Sound$1.play('bell'); - } - - function init$w() { - bell = $("
\n
\n
"); - $('body').append(bell); - } - - function push$4(params) { - new Item$1(params); - bell.addClass('show'); - } - - var Bell = { - init: init$w, - push: push$4 - }; - var reqCallback = {}; var timeCallback = {}; - function init$v() { + function init$A() { if (Platform.is('android')) { Params.listener.follow('button', function (e) { if (e.name === 'reset_player') { @@ -23183,7 +26503,7 @@ } var Android = { - init: init$v, + init: init$A, exit: exit, openTorrent: openTorrent, openPlayer: openPlayer, @@ -23198,13 +26518,13 @@ openBrowser: openBrowser }; - var network$6 = new create$e(); + var network$5 = new Request(); var _connected = true; - function init$u() { - setInterval(function () { + function init$z() { + Timer.add(1000 * 60 * 15, function () { task$1(); - }, 1000 * 60 * 15); + }); } function redirect(to) { @@ -23214,7 +26534,7 @@ } function find(protocol, callback) { - var status = new status$2(object$2.cub_mirrors.length); + var status = new Status(object$2.cub_mirrors.length); status.onComplite = function (data) { var keys = Object.keys(data); @@ -23224,7 +26544,7 @@ }); if (keys_true.length == 0) { - console.log('Mirrors', protocol + ' all offline'); + console.error('Mirrors', protocol + ' all offline'); return callback([]); } @@ -23238,7 +26558,7 @@ console.log('Mirrors', protocol + mirror, 'is online'); status.append(mirror, result); } else { - console.log('Mirrors', protocol + mirror, 'is offline'); + console.warn('Mirrors', protocol + mirror, 'is offline'); status.error(); } }); @@ -23247,7 +26567,7 @@ function check$1(protocol, mirror, call) { var random = Math.random() + ''; - network$6.silent(protocol + mirror + '/api/checker', function (str) { + network$5.silent(protocol + mirror + '/api/checker', function (str) { if (str == random) call(true);else call(false); }, function (e) { call(false); @@ -23261,7 +26581,7 @@ function task$1(call) { var protocols = ['https://', 'http://']; - var status = new status$2(protocols.length); + var status = new Status(protocols.length); _connected = true; status.onComplite = function (data) { @@ -23279,7 +26599,7 @@ if (call) call(); }; - check$1(Utils$2.protocol(), object$2.cub_domain, function (result) { + check$1(Utils$1.protocol(), object$2.cub_domain, function (result) { console.log('Mirrors', 'first check:', object$2.cub_domain, 'status:', result); if (result) { @@ -23296,7 +26616,7 @@ function test(call) { var protocols = ['https://', 'http://']; - var status = new status$2(protocols.length); + var status = new Status(protocols.length); status.onComplite = function (data) { var https = data['https://']; @@ -23314,7 +26634,7 @@ } var Mirrors = { - init: init$u, + init: init$z, task: task$1, connected: function connected() { return _connected; @@ -23323,9 +26643,27 @@ }; var bad_mirrors = {}; + /** + * Универсальный запрос + * @example + * let network = new Request() + * network.get('https://site.com/api/method',function(data){console.log(data)},function(error){console.log(error)}) + * network.silent('https://site.com/api/method',function(data){console.log(data)},function(error){console.log(error)}) + * network.quiet('https://site.com/api/method',function(data){console.log(data)},function(error){console.log(error)}) + * network.last('https://site.com/api/method',function(data){console.log(data)},function(error){console.log(error)}) + * network.native('https://site.com/api/method',function(data){console.log(data)},function(error){console.log(error)}) + * network.timeout(10000) // установить таймаут для всех запросов + * network.clear() // очистить все запросы + * network.again() // повторить последний запрос + * let last = network.latest() // вернуть обьект последненго запроса + * let error_text = network.errorDecode(jqXHR, exception) // декодировать ошибку в запросе + * let error_code = network.errorCode(jqXHR) // вернуть код ошибки + * let error_json = network.errorJSON(jqXHR) // вернуть json ошибки + * @returns {Request} + */ - function create$e() { - var listener = start$8(); + function Request() { + var listener = Subscribe$2(); var _calls = []; var _last; @@ -23563,30 +26901,30 @@ }; function errorDecode(jqXHR, exception) { - if (!Arrays.isObject(jqXHR)) return Lang.translate('network_error'); + if (!Arrays.isObject(jqXHR)) return Lang$1.translate('network_error'); var msg = ''; var txt = jqXHR.responseText || jqXHR.message || jqXHR.status || ''; if (jqXHR.status === 0 && exception !== 'timeout') { - msg = Lang.translate('network_noconnect'); + msg = Lang$1.translate('network_noconnect'); } else if (jqXHR.responseJSON && jqXHR.responseJSON.code) { - msg = Lang.translate('network_500').replace('500', jqXHR.responseJSON.code) + (jqXHR.responseJSON.text ? ' [' + jqXHR.responseJSON.text + ']' : ''); + msg = Lang$1.translate('network_500').replace('500', jqXHR.responseJSON.code) + (jqXHR.responseJSON.text ? ' [' + jqXHR.responseJSON.text + ']' : ''); } else if (jqXHR.status == 404) { - msg = Lang.translate('network_404'); + msg = Lang$1.translate('network_404'); } else if (jqXHR.status == 401) { - msg = Lang.translate('network_401'); + msg = Lang$1.translate('network_401'); } else if (jqXHR.status == 500) { - msg = Lang.translate('network_500'); + msg = Lang$1.translate('network_500'); } else if (exception === 'parsererror') { - msg = Lang.translate('network_parsererror'); + msg = Lang$1.translate('network_parsererror'); } else if (exception === 'timeout') { - msg = Lang.translate('network_timeout'); + msg = Lang$1.translate('network_timeout'); } else if (exception === 'abort') { - msg = Lang.translate('network_abort'); + msg = Lang$1.translate('network_abort'); } else if (exception === 'custom') { msg = jqXHR.responseText; } else { - msg = Lang.translate('network_error') + (txt ? ': ' + txt : ''); + msg = Lang$1.translate('network_error') + (txt ? ': ' + txt : ''); } return msg; @@ -23599,7 +26937,7 @@ function errorJSON(jqXHR) { return jqXHR && jqXHR.responseJSON ? jqXHR.responseJSON : { code: jqXHR ? jqXHR.status : 404, - text: jqXHR ? jqXHR.responseText || jqXHR.message || Lang.translate('network_404') : Lang.translate('network_404') + text: jqXHR ? jqXHR.responseText || jqXHR.message || Lang$1.translate('network_404') : Lang$1.translate('network_404') }; } @@ -23658,6 +26996,32 @@ request(params, _error3); } + + function cacheGet(params, callback) { + if (params.cache && params.cache.life > 0) { + Cache.getData('other', cacheName(params), -1, true).then(function (result) { + if (result) { + if (Date.now() < result.time + params.cache.life * 1000 * 60) callback(result.value, result.value);else callback(null, result.value); + } else callback(null, null); + })["catch"](function (e) { + callback(null, null); + }); + } else callback(null, null); + } + + function cacheSet(params, data) { + Cache.rewriteData('other', cacheName(params), data)["catch"](function (e) {}); + } + + function cacheName(params) { + var url = params.url || ''; // убираем зеркало из урла, что бы не было дублей в кеше + + object$2.cub_mirrors.forEach(function (mirror) { + url = url.replace(mirror, ''); + }); + url = url.replace(/https?:\/\//i, ''); + return 'request_[' + url + '][' + JSON.stringify(params.post_data || {}) + (params.dataType || 'json') + Storage.field('tmdb_lang') + ']'; + } /** * Сделать запрос * @param {Object} params @@ -23670,8 +27034,17 @@ params: params }); var start_time = Date.now(); + var cache_old = false; var error = function error(jqXHR, exception) { + if (params.attempts && params.attempts > 0) { + params.attempts--; + console.log('Request', 'attempt left:', params.attempts, 'for', params.url); + return go(params); + } // Если есть старый кеш отдаем его + + + if (cache_old) return secuses(cache_old, true); jqXHR.decode_error = errorDecode(jqXHR, exception); jqXHR.decode_code = errorCode(jqXHR); params.url = params.url || 'no url'; @@ -23699,6 +27072,12 @@ if (params.start) params.start(); var secuses = function secuses(data) { + var fromcache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (params.cache && params.cache.life > 0 && !fromcache) { + cacheSet(params, data); + } + Lampa.Listener.send('request_secuses', { params: params, data: data @@ -23763,7 +27142,16 @@ data.headers = params.headers; } - $.ajax(data); + cacheGet(params, function (cached, old) { + // Запомнить что есть старый кеш на случай ошибки что бы отдать его + cache_old = old; + + if (cached) { + secuses(cached, true); + } else { + $.ajax(data); + } + }); need.timeout = 1000 * 30; } /** @@ -23832,6 +27220,26 @@ } } + /** + * Прогресс выполнения нескольких асинхронных задач + * @example + * let progress = new Progress() + * progress.append((done)=>{ // какая-то асинхронная задача + * done(data) // по завершении вызываем done с результатом + * }) + * progress.append([ // можно добавить массив задач одним вызовом + * (done)=>{ // какая-то асинхронная задача + * done(data) // по завершении вызываем done с результатом + * }, + * (done)=>{ // какая-то асинхронная задача + * done(data) // по завершении вызываем done с результатом + * } + * ]) + * progress.start((result)=>{ // запуск всех задач + * console.log(result) // массив результатов всех задач + * }) + */ + function Progress() { var works = []; var result = []; @@ -23852,7 +27260,8 @@ }; } - var network$5 = new create$e(); + var network$4 = new Request(); + var day = 60 * 24; function url$1(u) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; @@ -23867,112 +27276,156 @@ } var email = Storage.get('account', '{}').email || ''; - return Utils$2.addUrlComponent(Utils$2.protocol() + 'tmdb.' + object$2.cub_domain + '/' + u, 'email=' + encodeURIComponent(email)); + return Utils$1.addUrlComponent(Utils$1.protocol() + 'tmdb.' + object$2.cub_domain + '/' + u, 'email=' + encodeURIComponent(email)); } function add$7(u, params) { return u + (/\?/.test(u) ? '&' : '?') + params; } - function get$5(method) { + function get$7(method) { var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var oncomplite = arguments.length > 2 ? arguments[2] : undefined; var onerror = arguments.length > 3 ? arguments[3] : undefined; + var cache = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; var u = url$1(method, params); - network$5.silent(u, function (json) { + network$4.silent(u, function (json) { json.url = method; oncomplite(json); - }, onerror); + }, onerror, false, { + cache: cache + }); } - function list$2() { + function list$3() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; var u = url$1(params.url, params); - network$5.silent(u, oncomplite, onerror); + network$4.silent(u, oncomplite, onerror, false, { + cache: { + life: day * 2 + } + }); } - function main$2() { + function main$1() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; var parts_limit = 6; var parts_data = [function (call) { - get$5('?sort=now_playing', params, function (json) { - json.title = Lang.translate('title_now_watch'); + get$7('?sort=now_playing', params, function (json) { + json.title = Lang$1.translate('title_now_watch'); call(json); - }, call); - }, function (call) { - call({ - results: TimeTable.lately().slice(0, 20), - title: Lang.translate('title_upcoming_episodes'), - nomore: true, - cardClass: function cardClass(_elem, _params) { - return new Episode(_elem, _params); - } + }, call, { + life: day * 2 }); }, function (call) { - get$5('?sort=latest', params, function (json) { - json.title = Lang.translate('title_latest'); + get$7('?sort=latest', params, function (json) { + json.title = Lang$1.translate('title_latest'); call(json); - }, call); + }, call, { + life: day * 2 + }); }, function (call) { - get$5('top/fire/movie', params, function (json) { - json.title = Lang.translate('title_fire'); - json.line_type = 'top'; + get$7('top/fire/movie', params, function (json) { + json.title = Lang$1.translate('title_fire'); + json.icon_svg = Template.string('icon_fire'); + json.icon_bgcolor = '#fff'; + json.icon_color = '#fd4518'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; call(json); - }, call); + }, call, { + life: day * 7 + }); }, function (call) { - get$5('?cat=' + params.url + '&sort=latest&uhd=true', params, function (json) { - json.title = Lang.translate('title_in_high_quality'); - json.small = true; - json.wide = true; + get$7('?cat=' + params.url + '&sort=latest&uhd=true', params, function (json) { + json.title = Lang$1.translate('title_in_high_quality'); json.results.forEach(function (card) { - card.promo = card.overview; - card.promo_title = card.title || card.name; + card.params = { + style: { + name: 'wide' + } + }; }); + json.params = { + items: { + view: 3 + } + }; call(json); - }, call); + }, call, { + life: day * 3 + }); }, function (call) { - get$5('top/hundred/movie', params, function (json) { - json.title = Lang.translate('title_top_100') + ' - ' + Lang.translate('menu_movies'); - json.line_type = 'top'; + get$7('top/hundred/movie', params, function (json) { + json.title = Lang$1.translate('title_top_100') + ' - ' + Lang$1.translate('menu_movies'); + json.icon_svg = Template.string('icon_top'); + json.icon_bgcolor = '#e02129'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; call(json); - }, call); + }, call, { + life: day * 7 + }); }, function (call) { - get$5('top/hundred/tv', params, function (json) { - json.title = Lang.translate('title_top_100') + ' - ' + Lang.translate('menu_tv'); - json.line_type = 'top'; + get$7('top/hundred/tv', params, function (json) { + json.title = Lang$1.translate('title_top_100') + ' - ' + Lang$1.translate('menu_tv'); + json.icon_svg = Template.string('icon_top'); + json.icon_bgcolor = '#e02129'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; call(json); - }, call); + }, call, { + life: day * 7 + }); }, function (call) { trailers('added', call); }]; + ContentRows.call('main', params, parts_data); var start_shuffle = parts_data.length + 1; Arrays.insert(parts_data, 0, Api.partPersons(parts_data, parts_limit, 'movie', start_shuffle)); TMDB.genres.movie.forEach(function (genre) { var event = function event(call) { - get$5('?sort=now&genre=' + genre.id, params, function (json) { - json.title = Lang.translate(genre.title.replace(/[^a-z_]/g, '')); + get$7('?sort=now&genre=' + genre.id, params, function (json) { + json.title = Lang$1.translate(genre.title.replace(/[^a-z_]/g, '')); call(json); - }, call); + }, call, { + life: day * 7 + }); }; parts_data.push(event); }); - network$5.silent(Utils$2.protocol() + object$2.cub_domain + '/api/collections/list?category=new', function (data) { + network$4.silent(Utils$1.protocol() + object$2.cub_domain + '/api/collections/list?category=new', function (data) { data.results.forEach(function (collection, index) { var event = function event(call_inner) { - get$5('collections/' + collection.id, {}, function (json) { - json.title = Utils$2.capitalizeFirstLetter(collection.title); + get$7('collections/' + collection.id, {}, function (json) { + json.title = Utils$1.capitalizeFirstLetter(collection.title); + json.icon_svg = Template.string('icon_collection'); + json.icon_color = '#fff'; + json.icon_bgcolor = 'rgba(255,255,255,0.15)'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; call_inner(json); - }, call_inner); + }, call_inner, { + life: day * 3 + }); }; parts_data.push(event); }); Arrays.shuffleArrayFromIndex(parts_data, start_shuffle); + }, false, false, { + cache: { + life: day * 3 + } }); function loadPart(partLoaded, partEmpty) { @@ -23988,127 +27441,138 @@ var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; var fullcat = !(params.genres || params.keywords); - var show = ['movie', 'tv'].indexOf(params.url) > -1 && !params.genres; - var books = show ? Favorite.continues(params.url) : []; - var recomend = show ? Arrays.shuffle(Recomends.get(params.url)).slice(0, 19) : []; var airdate = params.url == 'anime' ? '&airdate=' + new Date().getFullYear() : ''; var parts_limit = 6; var parts_data = [function (call) { - var json = { - results: books, - title: params.url == 'tv' ? Lang.translate('title_continue') : Lang.translate('title_watched') - }; - - if (params.url == 'tv') { - json.ad = 'notice', json.type = params.url; - } - - call(json); - }, function (call) { - if (params.url == 'tv' || params.url == 'anime') { - call({ - results: TimeTable.lately().slice(0, 20), - title: Lang.translate('title_upcoming_episodes'), - nomore: true, - cardClass: function cardClass(_elem, _params) { - return new Episode(_elem, _params); - } - }); - } else { - call(); - } - }, function (call) { - call({ - results: recomend, - title: Lang.translate('title_recomend_watch') + get$7('?cat=' + params.url + '&sort=now_playing' + airdate, params, function (json) { + json.title = Lang$1.translate('title_now_watch'); + call(json); + }, call, { + life: day * 2 }); - }, function (call) { - get$5('?cat=' + params.url + '&sort=now_playing' + airdate, params, function (json) { - json.title = Lang.translate('title_now_watch'); - - if (params.url == 'tv') { - json.ad = 'bot'; - json.type = params.url; - } - - call(json); - }, call); }, function (call) { if (params.url == 'anime') { - get$5('?cat=' + params.url + '&sort=top', params, function (json) { - json.title = Lang.translate('title_in_top'); - json.small = true; - json.wide = true; + get$7('?cat=' + params.url + '&sort=top', params, function (json) { + json.title = Lang$1.translate('title_in_top'); json.results.forEach(function (card) { - card.promo = card.overview; - card.promo_title = card.title || card.name; + card.params = { + style: { + name: 'wide' + } + }; }); + json.params = { + items: { + view: 3 + } + }; call(json); - }, call); + }, call, { + life: day * 7 + }); } else { - get$5('?cat=' + params.url + '&sort=latest&uhd=true' + airdate, params, function (json) { - json.title = Lang.translate('title_in_high_quality'); - json.small = true; - json.wide = true; + get$7('?cat=' + params.url + '&sort=latest&uhd=true' + airdate, params, function (json) { + json.title = Lang$1.translate('title_in_high_quality'); json.results.forEach(function (card) { - card.promo = card.overview; - card.promo_title = card.title || card.name; + card.params = { + style: { + name: 'wide' + } + }; }); + json.params = { + items: { + view: 3 + } + }; call(json); - }, call); + }, call, { + life: day * 3 + }); } }, function (call) { if (params.url == 'tv' || params.url == 'anime') { - get$5('?cat=' + params.url + '&sort=airing' + airdate, params, function (json) { - json.title = Lang.translate('title_ongoing'); + get$7('?cat=' + params.url + '&sort=airing' + airdate, params, function (json) { + json.title = Lang$1.translate('title_ongoing'); call(json); - }, call); + }, call, { + life: day * 2 + }); } else call(); }, function (call) { - get$5('?cat=' + params.url + '&sort=top' + airdate, params, function (json) { - json.title = Lang.translate('title_popular'); + get$7('?cat=' + params.url + '&sort=top' + airdate, params, function (json) { + json.title = Lang$1.translate('title_popular'); call(json); - }, call); + }, call, { + life: day * 3 + }); }, function (call) { - get$5('?cat=' + params.url + '&sort=now&airdate=' + new Date().getFullYear(), params, function (json) { - json.title = Lang.translate('title_new_this_year'); + get$7('?cat=' + params.url + '&sort=now&airdate=' + new Date().getFullYear(), params, function (json) { + json.title = Lang$1.translate('title_new_this_year'); call(json); - }, call); + }, call, { + life: day * 2 + }); }, function (call) { - if (params.url == 'anime') call();else { - get$5('top/fire/' + params.url, params, function (json) { - json.title = Lang.translate('title_fire'); - json.line_type = 'top'; + if (params.url == 'anime' || !fullcat) call();else { + get$7('top/fire/' + params.url, params, function (json) { + json.title = Lang$1.translate('title_fire'); + json.icon_svg = Template.string('icon_fire'); + json.icon_bgcolor = '#fff'; + json.icon_color = '#fd4518'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; call(json); - }, call); + }, call, { + life: day * 7 + }); } }, function (call) { - if (params.url == 'anime') call();else { - get$5('top/hundred/' + params.url, params, function (json) { - json.title = Lang.translate('title_top_100'); - json.line_type = 'top'; + if (params.url == 'anime' || !fullcat) call();else { + get$7('top/hundred/' + params.url, params, function (json) { + json.title = Lang$1.translate('title_top_100'); + json.icon_svg = Template.string('icon_top'); + json.icon_bgcolor = '#e02129'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; call(json); - }, call); + }, call, { + life: day * 7 + }); } }, function (call) { if (params.url == 'movie' && fullcat) trailers('added', call);else call(); }, function (call) { - get$5('?cat=' + params.url + '&sort=top&airdate=' + (new Date().getFullYear() - 1), params, function (json) { - json.title = Lang.translate('title_last_year'); + get$7('?cat=' + params.url + '&sort=top&airdate=' + (new Date().getFullYear() - 1), params, function (json) { + json.title = Lang$1.translate('title_last_year'); call(json); - }, call); + }, call, { + life: day * 7 + }); }, function (call) { - get$5('?cat=' + params.url + '&sort=top&airdate=' + (new Date().getFullYear() - 7) + '-' + (new Date().getFullYear() - 2) + '&vote=6-8', params, function (json) { - json.title = Lang.translate('title_worth_rewatch'); + get$7('?cat=' + params.url + '&sort=top&airdate=' + (new Date().getFullYear() - 7) + '-' + (new Date().getFullYear() - 2) + '&vote=6-8', params, function (json) { + json.title = Lang$1.translate('title_worth_rewatch'); call(json); - }, call); + }, call, { + life: day * 7 + }); }, function (call) { - get$5('?cat=' + params.url + '&sort=top&airdate=' + (new Date().getFullYear() - 7) + '-' + (new Date().getFullYear() - 2) + '&vote=8-10', params, function (json) { - json.title = Lang.translate('title_hight_voite'); - json.line_type = 'top'; + get$7('?cat=' + params.url + '&sort=top&airdate=' + (new Date().getFullYear() - 7) + '-' + (new Date().getFullYear() - 2) + '&vote=8-10', params, function (json) { + json.title = Lang$1.translate('title_hight_voite'); + json.icon_svg = Template.string('icon_star'); + json.icon_bgcolor = '#fff'; + json.icon_color = '#212121'; + json.params = { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon') + }; call(json); - }, call); + }, call, { + life: day * 7 + }); }]; + ContentRows.call('category', params, parts_data); var start_shuffle = parts_data.length + 1; if (fullcat) Arrays.insert(parts_data, 0, Api.partPersons(parts_data, parts_limit + 3, params.url, start_shuffle)); @@ -24118,10 +27582,12 @@ if (params.genres && params.genres == genre.id) return; var event = function event(call) { - get$5('?cat=' + params.url + '&sort=top&genre=' + gen.join(','), params, function (json) { - json.title = Lang.translate(genre.title.replace(/[^a-z_]/g, '')); + get$7('?cat=' + params.url + '&sort=top&genre=' + gen.join(','), params, function (json) { + json.title = Lang$1.translate(genre.title.replace(/[^a-z_]/g, '')); call(json); - }, call); + }, call, { + life: day * 7 + }); }; parts_data.push(event); @@ -24131,10 +27597,12 @@ return !(a.id == 99 || a.id == 10766); }).forEach(function (genre) { var event = function event(call) { - get$5('?cat=' + params.url + '&sort=top&genre=' + genre.id, params, function (json) { - json.title = Lang.translate(genre.title.replace(/[^a-z_]/g, '')); + get$7('?cat=' + params.url + '&sort=top&genre=' + genre.id, params, function (json) { + json.title = Lang$1.translate(genre.title.replace(/[^a-z_]/g, '')); call(json); - }, call); + }, call, { + life: day * 7 + }); }; parts_data.push(event); @@ -24151,41 +27619,53 @@ } function full$1(params, oncomplite, onerror) { - var status = new status$2(8); + var status = new Status(8); status.onComplite = oncomplite; - if (Utils$2.dcma(params.method, params.id)) return onerror(); - get$5('3/' + params.method + '/' + params.id + '?api_key=' + TMDB$1.key() + '&append_to_response=content_ratings,release_dates,keywords,alternative_titles&language=' + Storage.field('tmdb_lang'), params, function (json) { + if (Utils$1.dcma(params.method, params.id)) return onerror(); + get$7('3/' + params.method + '/' + params.id + '?api_key=' + TMDB$1.key() + '&append_to_response=content_ratings,release_dates,keywords,alternative_titles&language=' + Storage.field('tmdb_lang'), params, function (json) { if (json.status_code) return status.stop(), onerror(); json.source = 'tmdb'; if (params.method == 'tv') { - var season = Utils$2.countSeasons(json); + var season = Utils$1.countSeasons(json); TMDB.get('tv/' + json.id + '/season/' + season, {}, function (ep) { status.append('episodes', ep); - }, status.error.bind(status)); + }, status.error.bind(status), { + life: day * 3 + }); } else status.need--; if (json.belongs_to_collection) { TMDB.get('collection/' + json.belongs_to_collection.id, {}, function (collection) { collection.results = collection.parts.slice(0, 19); status.append('collection', collection); - }, status.error.bind(status)); + }, status.error.bind(status), { + life: day * 7 + }); } else status.need--; status.append('movie', json); }, function () { status.need -= 2; status.error(); + }, { + life: day * 7 }); TMDB.get(params.method + '/' + params.id + '/credits', params, function (json) { status.append('persons', json); - }, status.error.bind(status)); + }, status.error.bind(status), { + life: day * 7 + }); TMDB.get(params.method + '/' + params.id + '/recommendations', params, function (json) { status.append('recomend', json); - }, status.error.bind(status)); + }, status.error.bind(status), { + life: day * 7 + }); TMDB.get(params.method + '/' + params.id + '/similar', params, function (json) { status.append('simular', json); - }, status.error.bind(status)); + }, status.error.bind(status), { + life: day * 7 + }); TMDB.videos(params, function (json) { status.append('videos', json); }, status.error.bind(status)); @@ -24193,7 +27673,7 @@ status.append('reactions', json); }); - if (Lang.selected(['ru', 'uk', 'be']) && window.lampa_settings.account_use) { + if (Lang$1.selected(['ru', 'uk', 'be']) && window.lampa_settings.account_use) { status.need++; discussGet(params, function (json) { status.append('discuss', json); @@ -24202,19 +27682,24 @@ } function trailers(type, oncomplite) { - network$5.silent(Utils$2.protocol() + object$2.cub_domain + '/api/trailers/short/trailers/' + type, function (result) { - result.wide = true; - result.small = true; + network$4.silent(Utils$1.protocol() + object$2.cub_domain + '/api/trailers/short/trailers/' + type, function (result) { + result.title = Lang$1.translate('title_trailers') + ' - ' + Lang$1.translate('title_new'); result.results.forEach(function (card) { - card.promo = card.overview; - card.promo_title = card.title || card.name; + card.params = { + style: { + name: 'wide' + } + }; }); - result.title = Lang.translate('title_trailers') + ' - ' + Lang.translate('title_new'); oncomplite(result); }, function () { oncomplite({ results: [] }); + }, false, { + cache: { + life: day * 2 + } }); } @@ -24222,7 +27707,7 @@ if (window.lampa_settings.disable_features.reactions) return oncomplite({ result: [] }); - network$5.silent(Utils$2.protocol() + object$2.cub_domain + '/api/reactions/get/' + params.method + '_' + params.id, oncomplite, function () { + network$4.silent(Utils$1.protocol() + object$2.cub_domain + '/api/reactions/get/' + params.method + '_' + params.id, oncomplite, function () { oncomplite({ result: [] }); @@ -24233,52 +27718,52 @@ function discussGet(params, oncomplite, onerror) { if (window.lampa_settings.disable_features.discuss) return onerror(); - network$5.silent(Utils$2.protocol() + object$2.cub_domain + '/api/discuss/get/' + params.method + '_' + params.id + '/' + (params.page || 1) + '/' + Storage.field('language'), oncomplite, onerror, false, { + network$4.silent(Utils$1.protocol() + object$2.cub_domain + '/api/discuss/get/' + params.method + '_' + params.id + '/' + (params.page || 1) + '/' + Storage.field('language'), oncomplite, onerror, false, { timeout: 1000 * 5 }); } function reactionsAdd(params, oncomplite, onerror) { - network$5.silent(Utils$2.protocol() + object$2.cub_domain + '/api/reactions/add/' + params.method + '_' + params.id + '/' + params.type + '?uid=' + Storage.get('lampa_uid', 'none'), oncomplite, onerror); + network$4.silent(Utils$1.protocol() + object$2.cub_domain + '/api/reactions/add/' + params.method + '_' + params.id + '/' + params.type + '?uid=' + Storage.get('lampa_uid', 'none'), oncomplite, onerror); } function menuCategory$1(params, oncomplite) { var menu = []; menu.push({ - title: Lang.translate('title_now_watch'), + title: Lang$1.translate('title_now_watch'), url: '?cat=' + params.action + '&sort=now_playing' }); if (params.action == 'tv') { menu.push({ - title: Lang.translate('title_new_episodes'), + title: Lang$1.translate('title_new_episodes'), url: '?cat=' + params.action + '&sort=update' }); } menu.push({ - title: Lang.translate('title_popular'), + title: Lang$1.translate('title_popular'), url: '?cat=' + params.action + '&sort=top' }); menu.push({ - title: Lang.translate('title_latest'), + title: Lang$1.translate('title_latest'), url: '?cat=' + params.action + '&sort=latest' }); menu.push({ - title: Lang.translate('title_new_this_year'), + title: Lang$1.translate('title_new_this_year'), url: '?cat=' + params.action + '&sort=now' }); menu.push({ - title: Lang.translate('title_hight_voite'), + title: Lang$1.translate('title_hight_voite'), url: '?cat=' + params.action + '&sort=latest&vote=7' }); oncomplite(menu); } - function search$2() { + function search$3() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; - var status = new status$2(3); + var status = new Status(3); status.onComplite = function (data) { var items = []; @@ -24288,18 +27773,18 @@ oncomplite(items); }; - get$5('search/movie', params, function (json) { - json.title = Lang.translate('menu_movies'); + get$7('search/movie', params, function (json) { + json.title = Lang$1.translate('menu_movies'); json.type = 'movie'; status.append('movie', json); }, status.error.bind(status)); - get$5('search/tv', params, function (json) { - json.title = Lang.translate('menu_tv'); + get$7('search/tv', params, function (json) { + json.title = Lang$1.translate('menu_tv'); json.type = 'tv'; status.append('tv', json); }, status.error.bind(status)); - get$5('search/anime', params, function (json) { - json.title = Lang.translate('menu_anime'); + get$7('search/anime', params, function (json) { + json.title = Lang$1.translate('menu_anime'); json.type = 'anime'; status.append('anime', json); }, status.error.bind(status)); @@ -24308,27 +27793,50 @@ function discovery$1() { return { title: 'CUB', - search: search$2, + search: search$3, params: { - align_left: true, - object: { - source: 'cub' - } + save: true }, - onMore: function onMore(params) { - Activity$1.push({ + onMore: function onMore(params, close) { + close(); + Activity.push({ url: 'search/' + params.data.type, - title: Lang.translate('search') + ' - ' + params.query, + title: Lang$1.translate('search') + ' - ' + params.query, component: 'category_full', page: 2, query: encodeURIComponent(params.query), source: 'cub' }); }, - onCancel: network$5.clear.bind(network$5) + onCancel: network$4.clear.bind(network$4) }; } + function extensions$1(call) { + var headers = {}; + + if (permit.token && window.lampa_settings.account_use) { + headers = { + headers: { + token: permit.token, + profile: permit.account.profile.id + } + }; + } + + network$4.timeout(5000); + network$4.silent(Utils$1.protocol() + object$2.cub_domain + '/api/extensions/list', function (result) { + if (result.secuses) { + Storage.set('account_extensions', result); + call(result); + } else { + call(Storage.get('account_extensions', '{}')); + } + }, function () { + call(Storage.get('account_extensions', '{}')); + }, false, headers); + } + function person$1(params, oncomplite, onerror) { TMDB.person(params, oncomplite, onerror); } @@ -24342,14 +27850,14 @@ } function clear$5() { - network$5.clear(); + network$4.clear(); } var CUB = { - main: main$2, + main: main$1, menu: menu$1, full: full$1, - list: list$2, + list: list$3, category: category$1, clear: clear$5, person: person$1, @@ -24358,14 +27866,15 @@ discovery: discovery$1, reactionsGet: reactionsGet, reactionsAdd: reactionsAdd, - discussGet: discussGet + discussGet: discussGet, + extensions: extensions$1 }; /** * Источники */ - var sources = { + var sources$1 = { tmdb: TMDB, cub: CUB }; @@ -24373,17 +27882,17 @@ * Чтоб не переписали их */ - Object.defineProperty(sources, 'tmdb', { + Object.defineProperty(sources$1, 'tmdb', { get: function get() { return TMDB; } }); - Object.defineProperty(sources, 'cub', { + Object.defineProperty(sources$1, 'cub', { get: function get() { return CUB; } }); - var network$4 = new create$e(); + var network$3 = new Request(); /** * Получить источник * @param {{source:string}} params @@ -24391,18 +27900,18 @@ */ function source(params) { - return params.source && sources[params.source] ? sources[params.source] : sources.tmdb; + return params.source && sources$1[params.source] ? sources$1[params.source] : sources$1.tmdb; } function availableDiscovery() { var list = []; var active = Storage.get('source', 'tmdb'); - for (var key in sources) { - console.log('Api', 'discovery check:', key, sources[key].discovery ? true : false, _typeof(sources[key].discovery)); + for (var key in sources$1) { + console.log('Api', 'discovery check:', key, sources$1[key].discovery ? true : false, _typeof(sources$1[key].discovery)); - if (sources[key].discovery) { - if (key === active) list.splice(0, 0, sources[key].discovery());else list.push(sources[key].discovery()); + if (sources$1[key].discovery) { + if (key === active) list.splice(0, 0, sources$1[key].discovery());else list.push(sources$1[key].discovery()); } } @@ -24416,7 +27925,7 @@ */ - function main$1() { + function main() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; @@ -24457,7 +27966,7 @@ */ - function search$1() { + function search$2() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; TMDB.search(params, function (json) { @@ -24487,7 +27996,7 @@ source(params).menuCategory(params, oncomplite); } /** - * Информация об актёре + * Информация об персоне * @param {{id:integer, source:string}} params * @param {function} oncomplite * @param {function} onerror @@ -24536,7 +28045,7 @@ */ - function list$1() { + function list$2() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; @@ -24588,40 +28097,20 @@ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; + var data = {}; + data.results = Favorite.get(params); - var extract = function extract() { - var data = {}; - data.results = Favorite.get(params); + if (params.filter) { + data.results = data.results.filter(function (a) { + return params.filter == 'tv' ? a.name : !a.name; + }); + } - if (params.filter) { - data.results = data.results.filter(function (a) { - return params.filter == 'tv' ? a.name : !a.name; - }); - } - - data.total_pages = Math.ceil(data.results.length / 20); - data.page = Math.min(params.page, data.total_pages); - var offset = data.page - 1; - data.results = data.results.slice(20 * offset, 20 * offset + 20); - if (data.results.length) oncomplite(data);else onerror(); - }; - - if (Account.working()) { - var tic = 0; - var timer = setInterval(function () { - var any = Lampa.Account.all(); - - if (any.length) { - clearInterval(timer); - extract(); - } else if (tic > 10) { - clearInterval(timer); - onerror(); - } - - tic++; - }, 1000); - } else extract(); + data.total_pages = Math.ceil(data.results.length / 20); + data.page = Math.min(params.page, data.total_pages); + var offset = data.page - 1; + data.results = data.results.slice(20 * offset, 20 * offset + 20); + if (data.results.length) oncomplite(data);else onerror(); } /** * Релизы @@ -24631,7 +28120,7 @@ function relise(params, oncomplite, onerror) { - network$4.silent(Utils$2.protocol() + 'tmdb.' + object$2.cub_domain + '?sort=releases&results=20&page=' + params.page, oncomplite, onerror); + network$3.silent(Utils$1.protocol() + 'tmdb.' + object$2.cub_domain + '?sort=releases&results=20&page=' + params.page, oncomplite, onerror); } function partPersons(parts, parts_limit, type) { @@ -24669,11 +28158,13 @@ if (db > da) return 1;else if (db < da) return -1;else return 0; }); var src = person_data.profile_path ? TMDB.img(person_data.profile_path, 'w90_and_h90_face') : person_data.img || './img/actor.svg'; - var icon = "
\n
\n \n
\n \n
\n
").concat(person_data.name, "
\n
\n
"); call_inner({ + title: person_data.name, + icon_img: src, results: items.length > 5 ? items.slice(0, 20) : [], - nomore: true, - title: icon + params: { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon', 'More') + } }); }); }; @@ -24681,7 +28172,9 @@ parts.push(event); Arrays.shuffleArrayFromIndex(parts, shift); }); - }, call); + }, call, { + life: 60 * 24 * 3 + }); }; } @@ -24721,21 +28214,25 @@ function clear$4() { - for (var i in sources) { - sources[i].clear(); + for (var i in sources$1) { + sources$1[i].clear(); } - network$4.clear(); + network$3.clear(); + } + + function img() { + return TMDB.img.apply(TMDB, arguments); } var Api = { - main: main$1, - img: TMDB.img, + main: main, + img: img, full: full, - list: list$1, + list: list$2, genres: genres, category: category, - search: search$1, + search: search$2, clear: clear$4, company: company, person: person, @@ -24746,1198 +28243,376 @@ menu: menu, collections: collections, menuCategory: menuCategory, - sources: sources, + sources: sources$1, availableDiscovery: availableDiscovery, partPersons: partPersons, partNext: partNext }; - function component$k(object) { - var comp = new Lampa.InteractionMain(object); + var Main$1 = /*#__PURE__*/function (_Emit) { + _inherits(Main, _Emit); - comp.onLinesBuild = function (data) { - object$2.plugins.forEach(function (plugin) { - if (plugin.onMain) { - var result = plugin.onMain(data, comp); - if (result.results.length) comp.append(result); - } + var _super = _createSuper(Main); + + function Main(object) { + var _this; + + _classCallCheck(this, Main); + + _this = _super.call(this); + Arrays.extend(object, { + params: {} }); - }; + _this.object = object; + _this.params = object.params; + _this.scroll = new Scroll({ + mask: true, + over: true, + scroll_by_item: true, + end_ratio: 2 + }); + _this.html = document.createElement('div'); - comp.create = function () { - this.activity.loader(true); - var next = Api.main(object, this.build.bind(this), this.empty.bind(this)); - if (typeof next == 'function') this.next = next; - return this.render(); - }; + _this.emit('init'); - return comp; - } - - var player; - var html$8; - var timer; - - function create$d(id) { - html$8 = $('
'); - $('body').append(html$8); - player = new YT.Player('youtube-player', { - height: window.innerHeight, - width: window.innerWidth, - playerVars: { - 'controls': 0, - 'showinfo': 0, - 'autohide': 1, - 'modestbranding': 1, - 'autoplay': 1, - 'suggestedQuality': 'hd1080', - 'setPlaybackQuality': 'hd1080' - }, - videoId: id, - events: { - onReady: function onReady(event) { - event.target.setPlaybackQuality('hd1080'); - event.target.playVideo(); - update$2(); - }, - onStateChange: function onStateChange(state) { - if (state.data == 0) { - Controller.toggle('content'); - } - - if (state.data == YT.PlayerState.BUFFERING) { - state.target.setPlaybackQuality('hd1080'); - } - }, - onPlaybackQualityChange: function onPlaybackQualityChange(state) { - console.log('YouTube', 'quality', state.target.getPlaybackQuality()); - } - } - }); - } - - function update$2() { - timer = setTimeout(function () { - var progress = player.getCurrentTime() / player.getDuration() * 100; - $('#youtube-player__progress').css('width', progress + '%'); - Screensaver$2.resetTimer(); - update$2(); - }, 400); - } - - function play(id) { - if (typeof YT == 'undefined') return; - create$d(id); - Controller.add('youtube', { - invisible: true, - toggle: function toggle() {}, - right: function right() { - player.seekTo(player.getCurrentTime() + 10, true); - }, - left: function left() { - player.seekTo(player.getCurrentTime() - 10, true); - }, - enter: function enter() {}, - gone: function gone() { - destroy$2(); - }, - back: function back() { - Controller.toggle('content'); - } - }); - Controller.toggle('youtube'); - } - - function destroy$2() { - clearTimeout(timer); - player.destroy(); - html$8.remove(); - html$8 = null; - } - - var YouTube = { - play: play - }; - - function Event() { - var ids = {}; - var evokes = {}; - - function callback(data) { - if (data.method == 'callback' && ids[data.callback_name] == data.callback_id) { - evokes[data.callback_id](data); - - evokes[data.callback_id] = function () {}; - } + return _this; } - this.call = function (method, params, call) { - if (!ids[method]) ids[method] = Utils$2.uid(10); - params.callback_id = ids[method]; - params.callback_name = method; - evokes[params.callback_id] = call; - Socket.send('callback', params); - }; - - this.cancel = function (method) { - if (ids[method]) { - evokes[ids[method]] = function () {}; + _createClass(Main, [{ + key: "create", + value: function create() { + this.activity.loader(true); + this.scroll.minus(); + this.html.append(this.scroll.render(true)); + this.emit('create'); } - }; - - this.destroy = function () { - Socket.listener.remove('message', callback); - - for (var i in evokes) { - evokes[i] = function () {}; + }, { + key: "empty", + value: function empty(status) { + this.scroll.nopadding(); + this.emit('empty', status); + this.activity.loader(false); + this.activity.toggle(); } - }; - - Socket.listener.follow('message', callback); - } - - function create$c(data) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var html; - var last; - var tbtn; - var self = this; - - var follow = function follow(e) { - if (e.name == 'parser_use') { - var status = Storage.field('parser_use'); - if (window.lampa_settings.torrents_use) tbtn.toggleClass('selector', status).toggleClass('hide', !status); - self.groupButtons(); + }, { + key: "build", + value: function build(data) { + this.emit('build', data); + this.activity.loader(false); + this.activity.toggle(); } - }; + }, { + key: "start", + value: function start() { + var _this2 = this; - var buttons_scroll = new create$f({ - horizontal: true, - nopadding: false - }); - var load_images = { - poster: {} - }; - var event = new Event(); - var new_html = Storage.field('card_interfice_type') == 'new'; - Arrays.extend(data.movie, { - title: data.movie.name, - original_title: data.movie.original_name, - runtime: 0, - img: data.movie.poster_path ? Api.img(data.movie.poster_path, Storage.field('poster_size')).replace(/\/w200/, '/w500') : './img/img_broken.svg' - }); + this.emit('start'); + var controller = { + link: this, + toggle: function toggle() { + _this2.scroll.restorePosition(); - this.create = function () { + if (_this2.items.length && Platform.screen('tv')) _this2.items[_this2.active].toggle(); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); + }, + right: function right() { + Navigator.move('right'); + }, + up: function up() { + if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); + }, + down: function down() { + if (Navigator.canmove('down')) Navigator.move('down'); + }, + back: this.emit.bind(this, 'back') + }; + this.emit('controller', controller); + Controller.add('content', controller); + Controller.toggle('content'); + } + }, { + key: "pause", + value: function pause() { + this.emit('pause'); + } + }, { + key: "resize", + value: function resize() { + this.emit('resize'); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html : $(this.html); + } + }, { + key: "destroy", + value: function destroy() { + this.scroll.destroy(); + this.html.remove(); + this.emit('destroy'); + } + }]); + + return Main; + }(Emit); + + var Items$1 = { + onInit: function onInit() { + this.items = []; + this.loaded = []; + this.active = 0; + this.limit_view = Platform.screen('tv') ? 1 : 6; + }, + onDown: function onDown() { + this.active++; + this.active = Math.min(this.active, this.items.length - 1); + this.items[this.active].toggle(); + }, + onUp: function onUp() { + this.active--; + + if (this.active < 0) { + this.active = 0; + Controller.toggle('head'); + } else { + this.items[this.active].toggle(); + } + }, + onAppend: function onAppend(item) { var _this = this; - var genres = (data.movie.genres || ['---']).slice(0, 3).map(function (a) { - return Utils$2.capitalizeFirstLetter(a.name); - }).join(', '); - var countries = Api.sources.tmdb.parseCountries(data.movie); - var seasons = Utils$2.countSeasons(data.movie); - var tmdb_rating = parseFloat((data.movie.vote_average || 0) + '').toFixed(1); - if (tmdb_rating >= 10) tmdb_rating = 10; - html = Template.get('full_start' + (new_html ? '_new' : ''), { - title: data.movie.title, - original_title: data.movie.original_title, - descr: Utils$2.substr(data.movie.overview || Lang.translate('full_notext'), 420), - time: Utils$2.secondsToTime(data.movie.runtime * 60, true), - genres: Utils$2.substr(genres, 30), - rating: tmdb_rating, - seasons: seasons, - countries: countries.join(', '), - episodes: data.movie.number_of_episodes, - tagline: data.movie.tagline - }); - if (!window.lampa_settings.torrents_use) html.find('.view--torrent').addClass('hide'); - if (new_html && data.movie.name) html.find('.full-start-new__poster').addClass('card--tv').append('
TV
'); - var relise = (data.movie.release_date || data.movie.first_air_date || '') + ''; - var year = relise ? relise.slice(0, 4) : ''; - var quality = !data.movie.first_air_date ? data.movie.release_quality || data.movie.quality : false; - var head = []; - var info = []; - - if (year) { - html.find('.tag--year').removeClass('hide').find('> div').text(year); - head.push('' + year + ''); - } - - if (countries.length) { - head.push(countries.slice(0, 5).join(' | ')); - } - - if (!data.movie.tagline) { - html.find('.full--tagline').remove(); - } - - if (!data.movie.tagline && data.movie.title.length > 25) { - html.find('.full-start-new__title').addClass('twolines'); - } - - if (data.movie.runtime > 0) { - info.push('' + Utils$2.secondsToTime(data.movie.runtime * 60, true) + ''); - } - - if (quality) { - html.find('.tag--quality').removeClass('hide').find('> div').text(quality); - info.push('' + Lang.translate('player_quality') + ': ' + quality.toUpperCase() + ''); - } - - if (seasons) { - info.push('' + Lang.translate('title_seasons') + ': ' + seasons + ''); - } - - if (data.movie.number_of_episodes) { - info.push('' + Lang.translate('title_episodes') + ': ' + data.movie.number_of_episodes + ''); - } - - if (data.movie.genres) { - genres = data.movie.genres.slice(0, 5).map(function (a) { - return Utils$2.capitalizeFirstLetter(a.name); - }).join(' | '); - info.push('' + genres + ''); - } - - if (data.movie.number_of_seasons) { - html.find('.is--serial').removeClass('hide'); - } - - if (data.movie.vote_average == 0) { - html.find('.rate--tmdb').addClass('hide'); - } - - if (data.movie.imdb_rating && parseFloat(data.movie.imdb_rating) > 0) { - html.find('.rate--imdb').removeClass('hide').find('> div').eq(0).text(parseFloat(data.movie.imdb_rating) >= 10 ? 10 : data.movie.imdb_rating); - } - - if (data.movie.kp_rating && parseFloat(data.movie.kp_rating) > 0) { - html.find('.rate--kp').removeClass('hide').find('> div').eq(0).text(parseFloat(data.movie.kp_rating) >= 10 ? 10 : data.movie.kp_rating); - } - - if (!(data.movie.source == 'tmdb' || data.movie.source == 'cub')) html.find('.source--name').text(data.movie.source.toUpperCase());else if (data.movie.number_of_seasons && window.lampa_settings.account_use && !window.lampa_settings.disable_features.subscribe) { - html.find('.button--subscribe').removeClass('hide'); - this.subscribed(); - } - - if (!new_html) { - $('.full-start__buttons-scroll', html).append(buttons_scroll.render()); - buttons_scroll.append($('.full-start__buttons', html)); - } - - if (!data.movie.runtime) $('.tag--time', html).remove(); - - if (data.movie.next_episode_to_air) { - var air = Utils$2.parseToDate(data.movie.next_episode_to_air.air_date); - var now = Date.now(); - var day = Math.ceil((air.getTime() - now) / (24 * 60 * 60 * 1000)); - var txt = Lang.translate('full_next_episode') + ': ' + Utils$2.parseTime(data.movie.next_episode_to_air.air_date)["short"] + ' / ' + Lang.translate('full_episode_days_left') + ': ' + day; - - if (day > 0) { - $('.tag--episode', html).removeClass('hide').find('div').text(txt); - info.push('' + txt + ''); + item.use({ + onDown: this.emit.bind(this, 'down'), + onUp: this.emit.bind(this, 'up'), + onBack: this.emit.bind(this, 'back'), + onLeft: this.emit.bind(this, 'left'), + onActive: function onActive() { + _this.active = _this.items.indexOf(item); + }, + onToggle: function onToggle() { + _this.scroll.update(item.render(true)); } - } - - if (data.movie.status) { - html.find('.full-start__status').removeClass('hide').text(Lang.translate('tv_status_' + data.movie.status.toLowerCase().replace(/ /g, '_'))); - } - - tbtn = html.find('.view--torrent'); - tbtn.on('hover:enter', function () { - var year = ((data.movie.first_air_date || data.movie.release_date || '0000') + '').slice(0, 4); - var combinations = { - 'df': data.movie.original_title, - 'df_year': data.movie.original_title + ' ' + year, - 'df_lg': data.movie.original_title + ' ' + data.movie.title, - 'df_lg_year': data.movie.original_title + ' ' + data.movie.title + ' ' + year, - 'lg': data.movie.title, - 'lg_year': data.movie.title + ' ' + year, - 'lg_df': data.movie.title + ' ' + data.movie.original_title, - 'lg_df_year': data.movie.title + ' ' + data.movie.original_title + ' ' + year - }; - Activity$1.push({ - url: '', - title: Lang.translate('title_torrents'), - component: 'torrents', - search: combinations[Storage.field('parse_lang')], - search_one: data.movie.title, - search_two: data.movie.original_title, - movie: data.movie, - page: 1 - }); }); - html.find('.info__icon').not('[data-type="subscribe"]').on('hover:enter', function (e) { - var type = $(e.target).data('type'); - params.object.card = data.movie; - params.object.card.source = params.object.source; - Favorite.toggle(type, params.object.card); + this.fragment.appendChild(item.render(true)); + this.items.push(item); + }, + onPushLoaded: function onPushLoaded() { + var add = this.loaded.shift(); - _this.favorite(); - }); - - if (!new_html) { - buttons_scroll.render().find('.selector').on('hover:focus', function () { - last = $(this)[0]; - buttons_scroll.update($(this), false); - }); - } else { - $('.full-start-new__buttons', html).find('.selector').on('hover:focus', function () { - last = $(this)[0]; - }); + if (add && add.length) { + this.frament = document.createDocumentFragment(); + add.forEach(this.emit.bind(this, 'createAndAppend')); + this.scroll.append(this.fragment); + Layer.visible(this.scroll.render(true)); } - - html.find('.full-start-new__head').toggleClass('hide', !head.length).html(head.join(', ')); - html.find('.full-start-new__details').html(info.join('')); - Storage.listener.follow('change', follow); - follow({ - name: 'parser_use' - }); - this.trailers(); - this.favorite(); - this.loadPoster(); - this.translations(); - this.bookmarks(); - this.reactions(); - - if (Account.logged() && !window.lampa_settings.disable_features.ai) { - this.options(); - } else { - html.find('.button--options').remove(); - } - - var pg = Api.sources.tmdb.parsePG(data.movie); - if (pg) html.find('.full-start__pg').removeClass('hide').text(pg); - if (window.lampa_settings.read_only) html.find('.button--play').remove(); - }; - - this.options = function () { - html.find('.button--options').on('hover:enter', function () { - var items = []; - items.push({ - title: Lang.translate('title_ai_assistant'), - separator: true - }); - items.push({ - title: Lang.translate('title_recomendations'), - component: 'ai_recommendations' - }); - items.push({ - title: Lang.translate('title_facts'), - component: 'ai_facts' - }); - Select.show({ - title: Lang.translate('more'), - items: items, - onSelect: function onSelect(a) { - Activity$1.push({ - url: '', - title: a.title, - component: a.component, - movie: data.movie - }); - }, - onBack: function onBack() { - Controller.toggle('full_start'); - } - }); - }); - }; - - this.setBtnInPriority = function (btn) { - var cont = html.find('.full-start-new__buttons'); - var clon = btn.clone(); - cont.find('.button--priority').remove(); - clon.addClass('button--priority').removeClass('view--torrent').on('hover:enter', function () { - btn.trigger('hover:enter'); - }).on('hover:long', function () { - clon.remove(); - Storage.set('full_btn_priority', ''); - last = html.find('.button--play')[0]; - Controller.toggle('full_start'); - }); - cont.prepend(clon); - }; - - this.vote = function (type, add) { - var mine = Storage.get('mine_reactions', {}); - var id = (data.movie.name ? 'tv' : 'movie') + '_' + data.movie.id; - if (!mine[id]) mine[id] = []; - var ready = mine[id].indexOf(type) >= 0; - - if (add) { - if (!ready) mine[id].push(type); - Storage.set('mine_reactions', mine); - } - - return ready; - }; - - this.reactions = function () { + }, + onResize: function onResize() { + if (this.items[this.active]) this.scroll.update(this.items[this.active].render(true)); + }, + onCreate: function onCreate() { var _this2 = this; - if (!Storage.field('card_interfice_reactions') || window.lampa_settings.disable_features.discuss) return html.find('.full-start-new__reactions, .button--reaction').remove(); - - var drawReactions = function drawReactions() { - if (data.reactions && data.reactions.result && data.reactions.result.length) { - var reactions = data.reactions.result; - var reactions_body = html.find('.full-start-new__reactions')[0]; - reactions.sort(function (a, b) { - return a.counter > b.counter ? -1 : a.counter < b.counter ? 1 : 0; - }); - reactions_body.empty(); - reactions.forEach(function (r) { - var reaction = document.createElement('div'), - icon = document.createElement('img'), - count = document.createElement('div'), - wrap = document.createElement('div'); - reaction.addClass('reaction'); - icon.addClass('reaction__icon'); - count.addClass('reaction__count'); - reaction.addClass('reaction--' + r.type); - count.text(Utils$2.bigNumberToShort(r.counter)); - icon.src = Utils$2.protocol() + object$2.cub_domain + '/img/reactions/' + r.type + '.svg'; - reaction.append(icon); - reaction.append(count); - wrap.append(reaction); - if (_this2.vote(r.type)) reaction.addClass('reaction--voted'); - reactions_body.append(wrap); - }); - } + this.scroll.onWheel = function (step) { + _this2.emit(step > 0 ? 'down' : 'up'); }; - var items = [{ - type: 'fire' - }, { - type: 'nice' - }, { - type: 'think' - }, { - type: 'bore' - }, { - type: 'shit' - }]; - items.forEach(function (a) { - a.template = 'selectbox_icon', a.icon = ''; - a.ghost = _this2.vote(a.type); - a.noenter = a.ghost; - a.title = Lang.translate('reactions_' + a.type); - }); - html.find('.button--reaction').on('hover:enter', function () { - Select.show({ - title: Lang.translate('title_reactions'), - items: items, - onSelect: function onSelect(a) { - Controller.toggle('full_start'); - Api.sources.cub.reactionsAdd({ - method: data.movie.name ? 'tv' : 'movie', - id: data.movie.id, - type: a.type - }, function () { - _this2.vote(a.type, true); - - var find = data.reactions.result.find(function (r) { - return r.type == a.type; - }); - if (find) find.counter++;else { - data.reactions.result.push({ - type: a.type, - counter: 1 - }); - } - a.ghost = true; - a.noenter = true; - drawReactions(); - }, function (e) { - Lampa.Noty.show(Lang.translate('reactions_ready')); - }); - }, - onBack: function onBack() { - Controller.toggle('full_start'); - } - }); - }); - drawReactions(); - }; - - this.bookmarks = function () { - var _this3 = this; - - html.find('.button--book').on('hover:enter', function () { - var status = Favorite.check(params.object.card); - var items = [{ - title: Lang.translate('title_book'), - type: 'book', - checkbox: true, - checked: status.book - }, { - title: Lang.translate('title_like'), - type: 'like', - checkbox: true, - checked: status.like - }, { - title: Lang.translate('title_wath'), - type: 'wath', - checkbox: true, - checked: status.wath - }, { - title: Lang.translate('menu_history'), - type: 'history', - checkbox: true, - checked: status.history - }]; - var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; - - var label = function label(a) { - params.object.card = data.movie; - params.object.card.source = params.object.source; - Favorite.toggle(a.type, params.object.card); - if (a.collect) Controller.toggle('full_start'); - - _this3.favorite(); - }; - - if (window.lampa_settings.account_use) { - items.push({ - title: Lang.translate('settings_cub_status'), - separator: true - }); - marks.forEach(function (m) { - items.push({ - title: Lang.translate('title_' + m), - type: m, - picked: status[m], - collect: true, - noenter: !Account.hasPremium() - }); - }); - } - - Select.show({ - title: Lang.translate('settings_input_links'), - items: items, - onCheck: label, - onSelect: label, - onBack: function onBack() { - Controller.toggle('full_start'); - }, - onDraw: function onDraw(item, elem) { - if (elem.collect) { - if (!Account.hasPremium()) { - var wrap = $('
'); - wrap.append(Template.js('icon_lock')); - item.append(wrap); - item.on('hover:enter', function () { - Select.close(); - Account.showCubPremium(); - }); - } - } - } - }); - }); - }; - - this.groupButtons = function () { - var _this4 = this; - - var play = html.find('.button--play'); - var btns = html.find('.buttons--container > .full-start__button').not('.hide'); - var priority = Storage.get('full_btn_priority', '') + ''; - - if (priority) { - var priority_button; - btns.each(function () { - var hash = Utils$2.hash($(this).clone().removeClass('focus').prop('outerHTML')); - if (hash == priority) priority_button = $(this); - }); - if (priority_button) this.setBtnInPriority(priority_button); - } - - play.unbind().on('hover:enter', function (e) { - priority = Storage.get('full_btn_priority', '') + ''; - btns = html.find('.buttons--container > .full-start__button').not('.hide').filter(function () { - return priority !== Utils$2.hash($(this).clone().removeClass('focus').prop('outerHTML')); - }); - - if (btns.length == 1) { - btns.trigger('hover:enter'); - } else { - var items = []; - btns.each(function () { - var icon = $(this).find('svg').prop('outerHTML'); - items.push({ - title: $(this).text(), - subtitle: $(this).data('subtitle'), - template: typeof icon == 'undefined' || icon == 'undefined' ? 'selectbox_item' : 'selectbox_icon', - icon: icon, - btn: $(this) - }); - }); - Select.show({ - title: Lang.translate('settings_rest_source'), - items: items, - onSelect: function onSelect(a) { - a.btn.trigger('hover:enter'); - }, - onLong: function onLong(a) { - Storage.set('full_btn_priority', Utils$2.hash(a.btn.clone().removeClass('focus').prop('outerHTML'))); - - _this4.setBtnInPriority(a.btn); - }, - onBack: function onBack() { - Controller.toggle('full_start'); - } - }); - } - }).on('hover:focus', function () { - last = $(this)[0]; - }); - play.toggleClass('hide', !Boolean(btns.length)); - }; - - this.trailers = function () { - var _this5 = this; - - if (data.videos && data.videos.results.length && !window.lampa_settings.disable_features.trailers) { - html.find('.view--trailer').on('hover:enter', function () { - var items = []; - data.videos.results.forEach(function (element) { - var date = Utils$2.parseTime(element.published_at).full; - items.push({ - title: Utils$2.shortText(element.name, 50), - subtitle: (element.official ? Lang.translate('full_trailer_official') : Lang.translate('full_trailer_no_official')) + ' - ' + date, - id: element.key, - player: element.player, - code: element.iso_639_1, - time: new Date(element.published_at).getTime(), - url: element.url || 'https://www.youtube.com/watch?v=' + element.key, - youtube: typeof element.youtube !== 'undefined' ? element.youtube : true, - icon: '', - template: 'selectbox_icon' - }); - }); - items.sort(function (a, b) { - return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; - }); - var my_lang = items.filter(function (n) { - return n.code == Storage.field('tmdb_lang'); - }); - var en_lang = items.filter(function (n) { - return n.code == 'en' && my_lang.indexOf(n) == -1; - }); - var al_lang = []; - - if (my_lang.length) { - al_lang = al_lang.concat(my_lang); - } - - if (al_lang.length && en_lang.length) { - al_lang.push({ - title: Lang.translate('more'), - separator: true - }); - } - - al_lang = al_lang.concat(en_lang); - Select.show({ - title: Lang.translate('title_trailers'), - items: al_lang, - onSelect: function onSelect(a) { - _this5.toggle(); - - if (Platform.is('android') && Storage.field('player_launch_trailers') == 'youtube' && a.youtube) { - Android.openYoutube(a.id); - } else { - var playlist = al_lang.filter(function (v) { - return !v.separator; - }); - Player.play(a); - Player.playlist(playlist); - } - }, - onBack: function onBack() { - Controller.toggle('full_start'); - } - }); - }); - } else { - html.find('.view--trailer').remove(); - } - }; - - this.subscribed = function () { - event.call('subscribed', { - card_id: data.movie.id - }, function (result) { - if (result.result) { - html.find('.button--subscribe').data('voice', result.result).addClass('active').find('path').attr('fill', 'currentColor'); - } - }); - }; - - this.translations = function () { - var _this6 = this; - - if (window.lampa_settings.disable_features.subscribe) return; - var button = html.find('.button--subscribe'); - button.on('hover:enter', function () { - Loading.start(function () { - event.cancel('translations'); - Loading.stop(); - }); - event.call('translations', { - card_id: data.movie.id, - imdb_id: data.movie.imdb_id, - season: Utils$2.countSeasons(data.movie) - }, function (result) { - Loading.stop(); - - if (!result.result) { - result.result = { - voice: {}, - subscribe: '' - }; - } - - var items = []; - var subscribed = result.result.subscribe || button.data('voice'); - - if (subscribed) { - items.push({ - title: Lang.translate('title_unsubscribe'), - subtitle: subscribed, - unsubscribe: true - }); - } - - for (var voice in result.result.voice) { - items.push({ - title: voice, - voice: voice, - ghost: voice !== result.result.subscribe, - episode: result.result.voice[voice] - }); - } - - if (items.length) { - Select.show({ - title: Lang.translate('title_subscribe'), - items: items, - onSelect: function onSelect(a) { - _this6.toggle(); - - if (a.unsubscribe) { - event.call('unsubscribe', { - card_id: data.movie.id - }, function (result) { - if (result.result) { - button.removeClass('active').data('voice', '').find('path').attr('fill', 'transparent'); - } - }); - } else if (Account.logged()) { - Account.subscribeToTranslation({ - card: data.movie, - season: Utils$2.countSeasons(data.movie), - episode: a.episode, - voice: a.voice - }, function () { - Noty.show(Lang.translate('subscribe_success')); - button.addClass('active').data('voice', a.voice).find('path').attr('fill', 'currentColor'); - }, function () { - Noty.show(Lang.translate('subscribe_error')); - }); - } else { - Account.showNoAccount(); - } - }, - onBack: function onBack() { - Controller.toggle('full_start'); - } - }); - } else Noty.show(Lang.translate('subscribe_noinfo')); - }); - }); - }; - - this.loadPoster = function () { - var _this7 = this; - - var im = html.find('.full--poster'); - - if (window.innerWidth <= 480) { - load_images.poster = new Image(); - load_images.poster.crossOrigin = "Anonymous"; - } else load_images.poster = im[0] || {}; - - load_images.poster.onerror = function (e) { - load_images.poster.src = './img/img_broken.svg'; + this.scroll.onAnimateEnd = function () { + _this2.emit('pushLoaded'); }; + }, + onBuild: function onBuild(data) { + this.fragment = document.createDocumentFragment(); + data.forEach(this.emit.bind(this, 'createAndAppend')); + this.scroll.append(this.fragment); + Layer.visible(this.scroll.render(true)); + }, + onDestroy: function onDestroy() { + Arrays.destroy(this.items); + } + }; - load_images.poster.onload = function (e) { - im.parent().addClass('loaded'); - }; + var Base$1 = /*#__PURE__*/function (_Emit) { + _inherits(Base, _Emit); - var poster; + var _super = _createSuper(Base); - if (window.innerWidth <= 480) { - if (data.movie.backdrop_path) poster = Api.img(data.movie.backdrop_path, 'w780');else if (data.movie.background_image) poster = data.movie.background_image; + function Base(data) { + var _this; - load_images.poster.onerror = function (e) { - load_images.poster = im[0]; + _classCallCheck(this, Base); - load_images.poster.onerror = function (e) { - load_images.poster.src = './img/img_broken.svg'; - }; + _this = _super.call(this); + Arrays.extend(data, { + params: {} + }); + Arrays.extend(data.params, { + type: 'default', + items: { + mapping: 'line', + align_left: false, + view: 7 + }, + scroll: { + horizontal: true, + step: 300 + } + }); + _this.data = data; + _this.params = data.params; + _this.html = Template.js('items_line', data); + _this.body = _this.html.find('.items-line__body'); + _this.scroll = new Scroll(data.params.scroll); + return _this; + } - load_images.poster.onload = function (e) { - im.parent().addClass('loaded').addClass('with-out'); - }; + _createClass(Base, [{ + key: "create", + value: function create() { + var _this$html$find; - im[0].src = poster || data.movie.img; - }; - - load_images.poster.onload = function (e) { - Color.blurPoster(load_images.poster, im.width(), im.height(), function (nim) { - im[0].src = nim.src; - im.parent().addClass('loaded'); - setTimeout(function () { - im[0].style.transition = 'none'; - }, 500); - - var sc = _this7.mscroll.render(true); - - var an = 0; - var ts = 0; - var dl = window.innerHeight * 0.1; - - var smoothParallax = function smoothParallax() { - im[0].style.transform = 'translate3d(0, ' + ts * 0.35 + 'px, 0)'; - im[0].style.opacity = ts >= dl ? Math.max(0, 1 - (ts - dl) / (window.innerHeight * 0.2)) : 1; - an--; - if (an > 0) smoothParallax(); - }; - - sc.addEventListener('scroll', function (e) { - ts = sc.scrollTop; - - if (an == 0) { - an = 100; - requestAnimationFrame(smoothParallax); - } - }); - }); - }; + this.scroll.onWheel = this.wheel.bind(this); + this.html.addClass('items-line--type-' + this.params.type); + if (!this.data.title && !this.has(Icon)) (_this$html$find = this.html.find('.items-line__head')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.remove(); + this.html.on('visible', this.visible.bind(this)); + this.body.append(this.scroll.render(true)); + this.emit('create'); } - - if (poster) html.find('.full-start__poster').addClass('background--poster'); - load_images.poster.src = poster || data.movie.img; - }; - - this.favorite = function () { - var status = Favorite.check(params.object.card); - var any = Favorite.checkAnyNotHistory(status); - $('.button--book path', html).attr('fill', any ? 'currentColor' : 'transparent'); - }; - - this.toggleBackground = function () { - Background.immediately(Utils$2.cardImgBackgroundBlur(data.movie)); - }; - - this.toggle = function () { - var _this8 = this; - - Controller.add('full_start', { - update: function update() {}, - toggle: function toggle() { - _this8.groupButtons(); - - var btns = html.find('.full-start__buttons > *').filter(function () { - return $(this).is(':visible'); - }); - Controller.collectionSet(_this8.render()); - Controller.collectionFocus(last || (btns.length ? btns.eq(0)[0] : false), _this8.render()); - if (window.innerWidth <= 480) _this8.mscroll.render(true).scrollTop = 1; - if (_this8.onToggle) _this8.onToggle(_this8); - }, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down');else _this8.onDown(); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up'); - - _this8.onUp(); - }, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('full_start'); - }; - - this.render = function () { - return html; - }; - - this.destroy = function () { - last = null; - buttons_scroll.destroy(); - event.destroy(); - - load_images.poster.onerror = function () {}; - - html.remove(); - Storage.listener.remove('change', follow); - }; - } - - function create$b(data) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var html, body, last; - - this.create = function () { - html = Template.get('items_line', { - title: Lang.translate('full_detail') - }); - var media = data.movie.number_of_seasons ? 'tv' : 'movie'; - var countries = Api.sources.tmdb.parseCountries(data.movie); - var date = (data.movie.release_date || data.movie.first_air_date || '') + ''; - body = Template.get('full_descr', { - text: (data.movie.overview || Lang.translate('full_notext')) + '

', - relise: date.length > 3 ? Utils$2.parseTime(date).full : date.length > 0 ? date : Lang.translate('player_unknown'), - budget: '$ ' + Utils$2.numberWithSpaces(data.movie.budget || 0), - countries: countries.join(', ') - }); - var tags = body.find('.full-descr__tags'); - - if (data.movie.genres.length) { - tags.append(this.tag(Lang.translate('full_genre'), data.movie.genres, function (genre) { - Activity$1.push({ - url: genre.url || media, - title: Utils$2.capitalizeFirstLetter(genre.name), - component: params.object.source == 'cub' ? 'category' : 'category_full', - genres: genre.id, - source: params.object.source, - page: 1 - }); - })); - } - - if (data.movie.production_companies.length) { - tags.append(this.tag(Lang.translate('full_production'), data.movie.production_companies, function (company) { - Activity$1.push({ - url: company.url || media, - component: 'company', - title: Lang.translate('title_company'), - id: company.id, - source: params.object.source, - page: 1 - }); - })); - } - - var key_tags = data.movie.keywords ? data.movie.keywords.results || data.movie.keywords.keywords : []; - - if (key_tags.length) { - tags.append(this.tag(Lang.translate('full_keywords'), key_tags, function (key) { - Activity$1.push({ - url: 'discover/' + media, - title: Utils$2.capitalizeFirstLetter(key.name), - keywords: key.id, - component: 'category_full', - source: 'tmdb', - page: 1 - }); - })); - } - - if (!data.movie.budget) $('.full--budget', body).remove(); - if (!countries.length) $('.full--countries', body).remove(); - body.find('.selector').on('hover:focus', function (e) { - last = e.target; //this.onScroll(e.target) - }); - html.find('.items-line__body').append(body); - }; - - this.tag = function (name, items, call) { - var _this = this; - - var elem = $("
\n
".concat(name, "
\n
").concat(items.length, "
\n
")); - elem.on('hover:enter', function () { - var select = items.map(function (a) { - return { - title: Utils$2.capitalizeFirstLetter(a.name), - elem: a - }; - }); - Select.show({ - title: name, - items: select, - onSelect: function onSelect(a) { - _this.toggle(); - - call(a.elem); - }, - onBack: function onBack() { - _this.toggle(); - } - }); - }); - return elem; - }; - - this.toggle = function () { - var _this2 = this; - - Controller.add('full_descr', { - toggle: function toggle() { - Controller.collectionSet(_this2.render()); - Controller.collectionFocus(last, _this2.render()); - if (_this2.onToggle) _this2.onToggle(_this2); //if(last && !$(last).hasClass('full-descr__text')) this.onScroll(last) - }, - update: function update() {}, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down');else _this2.onDown(); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else _this2.onUp(); - }, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('full_descr'); - }; - - this.render = function () { - return html; - }; - - this.destroy = function () { - body.remove(); - html.remove(); - html = null; - body = null; - }; - } - - function create$a(persons, params) { - var html, scroll, last; - var active = 0; - var view = 6; - var tv = Platform.screen('tv'); - - this.create = function () { - var _this = this; - - if (persons.length > 50) persons = persons.slice(0, 50); - html = Template.get('items_line', { - title: params.title || Lang.translate('title_actors') - }); - scroll = new create$f({ - horizontal: true, - scroll_by_item: true - }); - scroll.body().addClass('full-persons'); - persons.slice(0, view).forEach(this.append.bind(this)); - html.find('.items-line__body').append(scroll.render()); - - scroll.onWheel = function (step) { - _this.toggle(); - + }, { + key: "wheel", + value: function wheel(step) { + if (!Controller.own(this)) this.toggle(); Controller.enabled().controller[step > 0 ? 'right' : 'left'](); - }; + this.emit('wheel'); + } + }, { + key: "visible", + value: function visible() { + this.emit('visible'); + Layer.visible(this.scroll.render(true)); + } + }, { + key: "toggle", + value: function toggle() { + var _this2 = this; - scroll.onScroll = function (step) { - persons.slice(active, tv ? active + view : persons.length).filter(function (e) { - return !e.ready; - }).forEach(function (line_data) { - Controller.collectionAppend(_this.append(line_data)); - }); - Layer.visible(scroll.render(true)); - }; - }; + var controller = { + link: this, + toggle: function toggle() { + Controller.collectionSet(_this2.scroll.render(true)); + Controller.collectionFocus(_this2.last || false, _this2.scroll.render(true)); - this.append = function (element) { - element.ready = true; - var person = Template.get('full_person', { - name: element.name, - role: element.character || element.job || Lang.translate('title_actor') - }); - person.on('visible', function () { - var img = person.find('img')[0]; - - img.onerror = function (e) { - img.src = './img/actor.svg'; + _this2.emit('toggle'); + }, + right: function right() { + if (Navigator.canmove('right')) Navigator.move('right'); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else _this2.emit('left'); + }, + down: this.emit.bind(this, 'down'), + up: this.emit.bind(this, 'up'), + back: this.emit.bind(this, 'back') }; + this.emit('controller', controller); + Controller.add('items_line', controller); + Controller.toggle('items_line'); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html : $(this.html); + } + }, { + key: "destroy", + value: function destroy() { + this.scroll.destroy(); + this.html.remove(); + this.emit('destroy'); + } + }]); - img.onload = function () { - person.addClass('full-person--loaded'); - }; + return Base; + }(Emit); - img.src = element.profile_path ? Api.img(element.profile_path, 'w276_and_h350_face') : element.img || './img/actor.svg'; + var Line$5 = /*#__PURE__*/function (_Base) { + _inherits(Line, _Base); + + var _super = _createSuper(Line); + + function Line(data) { + var _this; + + _classCallCheck(this, Line); + + _this = _super.call(this, data); + var module = typeof _this.params.module !== 'undefined' ? _this.params.module : Helper$b.MASK.base; + Helper$b.getNames(module).map(function (name) { + return LineMap[name]; + }).forEach(function (mod) { + return _this.use(mod); }); - person.on('hover:focus', function (e) { - last = e.target; - active = persons.indexOf(element); - scroll.update($(e.target), true); - }).on('hover:enter', function () { - Activity$1.push({ - url: element.url, - title: Lang.translate('title_persons'), - component: 'actor', - id: element.id, - source: params.object.source + + _this.emit('init'); + + return _this; + } + + return Line; + }(Base$1); + + var Create$1 = { + onCreateAndAppend: function onCreateAndAppend(element) { + var item = Utils$1.createInstance(Line$5, element); + this.emit('instance', item, element); + item.create(); + this.emit('append', item, element); + } + }; + + var Callback = { + onLeft: function onLeft() { + Controller.toggle('menu'); + }, + onBack: function onBack() { + Activity.backward(); + } + }; + + var Next$1 = { + onInit: function onInit() { + this.next_wait; + this.builded_time = Date.now(); + }, + onBuild: function onBuild() { + this.scroll.onEnd = this.emit.bind(this, 'loadNext'); + this.builded_time = Date.now(); + }, + onLoadNext: function onLoadNext() { + var _this = this; + + if (!this.next_wait && this.items.length && this.builded_time < Date.now() - 1000) { + this.next_wait = true; + this.object.page++; + this.emit('next', function (new_data) { + _this.next_wait = false; + if (!_this.items.length || _this.destroyed) return; + var split_total = Math.ceil(new_data.length / _this.limit_view); // Разбиваем на части, чтобы не лагал браузер + + for (var i = 0; i < split_total; i++) { + _this.loaded.push(new_data.slice(i * _this.limit_view, (i + 1) * _this.limit_view)); + } // Если нет анимации у скрола, то можно грузить сразу + + + if (!_this.scroll.animated()) _this.scroll.onAnimateEnd(); + }, function () { + _this.next_wait = false; }); - }); - scroll.append(person); - return person; - }; - - this.toggle = function () { - var _this2 = this; - - Controller.add('full_descr', { - link: this, - toggle: function toggle() { - Controller.collectionSet(_this2.render()); - Controller.collectionFocus(last, _this2.render()); - if (_this2.onToggle) _this2.onToggle(_this2); - }, - update: function update() {}, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: this.onDown, - up: this.onUp, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('full_descr'); - }; - - this.render = function () { - return html; - }; - - this.destroy = function () { - scroll.destroy(); - html.remove(); - html = null; - }; - } + } + } + }; var Item = /*#__PURE__*/function () { function Item(data, params) { @@ -25970,7 +28645,7 @@ } if (window.location.protocol == 'https:' && hts) url = url.replace(/^(http:\/\/|https:\/\/)/, 'https://'); - this.html.querySelector('.extensions__item-name').innerText = this.data.name || Lang.translate('extensions_no_name'); + this.html.querySelector('.extensions__item-name').innerText = this.data.name || Lang$1.translate('extensions_no_name'); this.html.querySelector('.extensions__item-author').innerText = this.data.author || (this.params.type == 'plugins' ? '@cub' : '@lampa'); this.html.querySelector('.extensions__item-descr').innerText = (this.data.descr || url).replace(/\n|\t|\r/g, ' '); var proto = this.html.querySelector('.extensions__item-proto'); @@ -25981,7 +28656,7 @@ } var status = this.html.querySelector('.extensions__item-disabled'); - status.innerText = Lang.translate('player_disabled'); + status.innerText = Lang$1.translate('player_disabled'); if (this.data.status || !this.params.autocheck) status.classList.add('hide');else status.classList.remove('hide'); } }, { @@ -26027,15 +28702,15 @@ title: '', align: 'center', zIndex: 300, - html: $('
' + Lang.translate('plugins_need_reload') + '
'), + html: $('
' + Lang$1.translate('plugins_need_reload') + '
'), buttons: [{ - name: Lang.translate('settings_param_no'), + name: Lang$1.translate('settings_param_no'), onSelect: function onSelect() { Modal.close(); cancel(); } }, { - name: Lang.translate('settings_param_yes'), + name: Lang$1.translate('settings_param_yes'), onSelect: function onSelect() { window.location.reload(); } @@ -26048,18 +28723,18 @@ var footer = $('.extensions-info__footer', modal); if (plug.image) modal.prepend($('')); $('.extensions-info__descr', modal).text(plug.descr); - $('.extensions-info__instruction', modal).html((plug.instruction || Lang.translate('extensions_no_info')).replace(/\n/g, '
').replace(/\s\s/g, '  ')); + $('.extensions-info__instruction', modal).html((plug.instruction || Lang$1.translate('extensions_no_info')).replace(/\n/g, '
').replace(/\s\s/g, '  ')); function addLabel(name, value) { var label = $("
\n
".concat(name, "
\n
").concat(value, "
\n
")); footer.append(label); } - if (plug.link) addLabel(Lang.translate('settings_parser_jackett_link'), plug.link); - if (plug.author) addLabel(Lang.translate('title_author'), plug.author); - if (plug.time) addLabel(Lang.translate('settings_added'), Utils$2.parseTime(plug.time).full); + if (plug.link) addLabel(Lang$1.translate('settings_parser_jackett_link'), plug.link); + if (plug.author) addLabel(Lang$1.translate('title_author'), plug.author); + if (plug.time) addLabel(Lang$1.translate('settings_added'), Utils$1.parseTime(plug.time).full); Modal.open({ - title: plug.name || Lang.translate('extensions_info'), + title: plug.name || Lang$1.translate('extensions_info'), html: modal, size: 'large', onBack: function onBack() { @@ -26069,7 +28744,7 @@ }); } - var Utils$1 = { + var Utils = { showReload: showReload, showInfo: showInfo }; @@ -26085,7 +28760,7 @@ _classCallCheck(this, Extension); _this = _super.call(this, data, params); - _this.network = new create$e(); + _this.network = new Request(); _this.template = 'extensions_item'; return _this; } @@ -26116,55 +28791,55 @@ if (this.params.type == 'plugins' || this.params.type == 'installs') { menu.push({ - title: Lang.translate('extensions_' + (this.data.status ? 'disable' : 'enable')), + title: Lang$1.translate('extensions_' + (this.data.status ? 'disable' : 'enable')), toggle: true }); } menu.push({ - title: Lang.translate('extensions_check'), + title: Lang$1.translate('extensions_check'), status: true }); if (this.params.cub || this.params.noedit) { if (this.params.type == 'extensions') { menu.push({ - title: Lang.translate('extensions_install'), + title: Lang$1.translate('extensions_install'), install: true }); } menu.push({ - title: Lang.translate('extensions_info'), + title: Lang$1.translate('extensions_info'), instruction: true }); } else { menu.push({ - title: Lang.translate('extensions_edit'), + title: Lang$1.translate('extensions_edit'), separator: true }); menu.push({ - title: Lang.translate('extensions_change_name'), + title: Lang$1.translate('extensions_change_name'), change: 'name' }); menu.push({ - title: Lang.translate('extensions_change_link'), + title: Lang$1.translate('extensions_change_link'), change: 'url' }); menu.push({ - title: Lang.translate('extensions_remove'), + title: Lang$1.translate('extensions_remove'), remove: true }); } Select.show({ - title: Lang.translate('title_action'), + title: Lang$1.translate('title_action'), items: menu, onBack: back, onSelect: function onSelect(a) { if (a.toggle) { _this2.data.status = _this2.data.status == 1 ? 0 : 1; - if (_this2.params.cub) Account.pluginsStatus(_this2.data, _this2.data.status);else Plugins.save(_this2.data); + if (_this2.params.cub) Account$1.Api.pluginToggle(_this2.data, _this2.data.status);else Plugins.save(_this2.data); _this2.update(); @@ -26172,11 +28847,11 @@ back(); Plugins.push(_this2.data); } else { - Utils$1.showReload(back); + Utils.showReload(back); } } else if (a.change) { Input.edit({ - title: a.change == 'name' ? Lang.translate('extensions_set_name') : Lang.translate('extensions_set_url'), + title: a.change == 'name' ? Lang$1.translate('extensions_set_name') : Lang$1.translate('extensions_set_url'), value: _this2.data[a.change] || '', free: true, nosave: true @@ -26206,7 +28881,7 @@ }); if (ready) { - Noty.show(Lang.translate('extensions_ready')); + Noty.show(Lang$1.translate('extensions_ready')); back(); } else { back(); @@ -26220,12 +28895,12 @@ _this2.html.querySelector('.extensions__item-included').classList.remove('hide'); } } else if (a.instruction) { - Utils$1.showInfo(_this2.data, back); + Utils.showInfo(_this2.data, back); } else if (a.remove) { Plugins.remove(_this2.data); _this2.html.style.opacity = 0.5; _this2.removed = true; - Utils$1.showReload(back); + Utils.showReload(back); } } }); @@ -26251,16 +28926,16 @@ check.classList.add('hide'); }; - var url = Utils$2.fixMirrorLink(Utils$2.rewriteIfHTTPS(this.data.url || this.data.link)); + var url = Utils$1.fixMirrorLink(Utils$1.rewriteIfHTTPS(this.data.url || this.data.link)); this.network.timeout(5000); this.network["native"](url, function (str) { if (/Lampa\./.test(str)) { - display('success', 200, Lang.translate('extensions_worked')); + display('success', 200, Lang$1.translate('extensions_worked')); } else { - display('error', 500, Lang.translate('extensions_no_plugin')); + display('error', 500, Lang$1.translate('extensions_no_plugin')); } }, function (a, e) { - display('error', 404, Lang.translate('title_error')); + display('error', 404, Lang$1.translate('title_error')); }, false, { dataType: 'text' }); @@ -26298,7 +28973,7 @@ _this2.img.classList.add('loaded'); }; - this.img.src = Utils$2.fixMirrorLink(Utils$2.rewriteIfHTTPS(this.data.image)); + this.img.src = Utils$1.fixMirrorLink(Utils$1.rewriteIfHTTPS(this.data.image)); } }, { key: "destroy", @@ -26345,7 +29020,7 @@ key: "set", value: function set(url) { $('#cub-theme').remove(); - var href = Utils$2.rewriteIfHTTPS(Utils$2.addUrlComponent(url, 'token=' + encodeURIComponent(Storage.get('account', '{}').token))); + var href = Utils$1.rewriteIfHTTPS(Utils$1.addUrlComponent(url, 'token=' + encodeURIComponent(Storage.get('account', '{}').token))); var css = $(''); $('body').append(css); } @@ -26368,14 +29043,14 @@ _this = _super.call(this, data, params); _this.template = 'extensions_theme'; - _this.link = Utils$2.rewriteIfHTTPS(Utils$2.protocol() + object$2.cub_domain + '/extensions/' + _this.data.id); + _this.link = Utils$1.rewriteIfHTTPS(Utils$1.protocol() + object$2.cub_domain + '/extensions/' + _this.data.id); return _this; } _createClass(Theme, [{ key: "update", value: function update() { - this.html.querySelector('.extensions__item-name').innerText = this.data.name || Lang.translate('extensions_no_name'); + this.html.querySelector('.extensions__item-name').innerText = this.data.name || Lang$1.translate('extensions_no_name'); if (this.active()) this.html.classList.add('active');else this.html.classList.remove('active'); } }, { @@ -26397,7 +29072,7 @@ _this2.img.classList.add('loaded'); }; - this.img.src = Utils$2.fixMirrorLink(Utils$2.rewriteIfHTTPS(this.data.image)); + this.img.src = Utils$1.fixMirrorLink(Utils$1.rewriteIfHTTPS(this.data.image)); this.html.addEventListener('hover:enter', this.menu.bind(this)); } }, { @@ -26408,11 +29083,11 @@ var menu = []; var controller = Controller.enabled().name; menu.push({ - title: Lang.translate('extensions_' + (this.active() ? 'disable' : 'enable')), + title: Lang$1.translate('extensions_' + (this.active() ? 'disable' : 'enable')), toggle: true }); Select.show({ - title: Lang.translate('title_action'), + title: Lang$1.translate('title_action'), items: menu, onBack: function onBack() { Controller.toggle(controller); @@ -26421,7 +29096,7 @@ Controller.toggle(controller); if (a.toggle) { - if (!_this3.active() && _this3.data.premium && !Account.hasPremium()) return Lampa.Account.showCubPremium(); + if (!_this3.active() && _this3.data.premium && !Account$1.hasPremium()) return Lampa.Account.showCubPremium(); Theme$2.toggle(_this3.active() ? '' : _this3.link); _this3.update(); @@ -26456,15 +29131,15 @@ _this = _super.call(this, data, params); _this.template = 'extensions_screensaver'; - _this.link = Utils$2.rewriteIfHTTPS(Utils$2.protocol() + object$2.cub_domain + '/extensions/' + _this.data.id); + _this.link = Utils$1.rewriteIfHTTPS(Utils$1.protocol() + object$2.cub_domain + '/extensions/' + _this.data.id); return _this; } _createClass(Screensaver, [{ key: "update", value: function update() { - this.html.querySelector('.extensions__item-name').innerText = this.data.name || Lang.translate('extensions_no_name'); - this.html.querySelector('.extensions__item-time').innerText = Utils$2.parseTime(Date.now()).time; + this.html.querySelector('.extensions__item-name').innerText = this.data.name || Lang$1.translate('extensions_no_name'); + this.html.querySelector('.extensions__item-time').innerText = Utils$1.parseTime(Date.now()).time; if (this.active()) this.html.classList.add('active');else this.html.classList.remove('active'); } }, { @@ -26486,7 +29161,7 @@ _this2.img.classList.add('loaded'); }; - this.img.src = Utils$2.fixMirrorLink(Utils$2.rewriteIfHTTPS(this.data.image)); + this.img.src = Utils$1.fixMirrorLink(Utils$1.rewriteIfHTTPS(this.data.image)); this.html.addEventListener('hover:enter', this.menu.bind(this)); } }, { @@ -26497,15 +29172,15 @@ var menu = []; var controller = Controller.enabled().name; menu.push({ - title: Lang.translate('extensions_' + (this.active() ? 'disable' : 'enable')), + title: Lang$1.translate('extensions_' + (this.active() ? 'disable' : 'enable')), toggle: true }); menu.push({ - title: Lang.translate('title_watch'), + title: Lang$1.translate('title_watch'), watch: true }); Select.show({ - title: Lang.translate('title_action'), + title: Lang$1.translate('title_action'), items: menu, onBack: function onBack(a) { Controller.toggle(controller); @@ -26515,7 +29190,7 @@ if (a.toggle) { if (_this3.active()) Storage.set('cub_screensaver', '');else { - if (_this3.data.premium && !Account.hasPremium()) return Lampa.Account.showCubPremium(); + if (_this3.data.premium && !Account$1.hasPremium()) return Lampa.Account.showCubPremium(); Storage.set('cub_screensaver', _this3.link); Storage.set('screensaver_type', 'cub'); } @@ -26544,7 +29219,7 @@ return Screensaver; }(Item); - var Line = /*#__PURE__*/function () { + var Line$4 = /*#__PURE__*/function () { function Line(data, params) { _classCallCheck(this, Line); @@ -26561,7 +29236,7 @@ value: function create() { var _this = this; - this.scroll = new create$f({ + this.scroll = new Scroll({ horizontal: true, step: window.innerWidth / 4 }); @@ -26674,7 +29349,7 @@ return Line; }(); - var Add = /*#__PURE__*/function () { + var Add$1 = /*#__PURE__*/function () { function Add() { var _this = this; @@ -26683,17 +29358,17 @@ this.html = document.createElement('div'); this.html.classList.add('extensions__block-add'); this.html.classList.add('selector'); - this.html.innerText = Lang.translate('extensions_add'); + this.html.innerText = Lang$1.translate('extensions_add'); this.html.addEventListener('hover:enter', function () { if (!Storage.get('agree_installation')) { var controller = Controller.enabled().name; Modal.open({ - title: Lang.translate('install_extension_rule_1'), + title: Lang$1.translate('install_extension_rule_1'), html: Template.get('plugins_rules'), size: 'medium', buttons_position: 'outside', buttons: [{ - name: Lang.translate('settings_plugins_install'), + name: Lang$1.translate('settings_plugins_install'), onSelect: function onSelect() { Storage.set('agree_installation', true); Modal.close(); @@ -26702,7 +29377,7 @@ _this.input(); } }, { - name: Lang.translate('cancel'), + name: Lang$1.translate('cancel'), onSelect: function onSelect() { Modal.close(); Controller.toggle(controller); @@ -26725,7 +29400,7 @@ var _this2 = this; Input.edit({ - title: Lang.translate('extensions_set_url'), + title: Lang$1.translate('extensions_set_url'), value: '', free: true, nosave: true, @@ -26759,7 +29434,7 @@ var _this = this; this.html = Template.js('extensions'); - this.scroll = new create$f({ + this.scroll = new Scroll({ mask: true }); @@ -26767,7 +29442,7 @@ if (step > 0) _this.down();else _this.up(); }; - this.scroll.append(HeadBackward(Lang.translate('settings_main_plugins'), true)); + this.scroll.append(HeadBackward(Lang$1.translate('settings_main_plugins'), true)); this.scroll.height(); this.html.querySelector('.extensions__body').appendChild(this.scroll.render(true)); if (this.params.store) this.loadCustomStore();else this.load(); @@ -26775,14 +29450,14 @@ }, { key: "add", value: function add() { - var add = new Add(); + var add = new Add$1(); var line = this.items[0]; add.onAdd = function (url) { if (url) { if (url.length > 300) { line.toggle(); - Noty.show(Lang.translate('account_export_fail_600')); + Noty.show(Lang$1.translate('account_export_fail_600')); return; } @@ -26813,7 +29488,7 @@ var _this2 = this; this.appendLoader(); - var net = new create$e(); + var net = new Request(); net.silent(this.params.store, function (data) { _this2.loader.remove(); @@ -26822,7 +29497,7 @@ if (data.results && data.results.length) { if (_this2.params.with_installed) { _this2.appendLine(Plugins.get().reverse(), { - title: Lang.translate('extensions_from_memory'), + title: Lang$1.translate('extensions_from_memory'), type: 'installs', autocheck: true }); @@ -26830,7 +29505,7 @@ data.results.forEach(function (a) { _this2.appendLine(a.results, { - title: a.title || Lang.translate('player_unknown'), + title: a.title || Lang$1.translate('player_unknown'), type: 'extensions', hpu: a.hpu, noedit: true @@ -26864,30 +29539,30 @@ this.appendLoader(); var need = 2; if (window.lampa_settings.plugins_store) need += 2; - var status = new status$2(need); + var status = new Status(need); status.onComplite = function () { _this3.loader.remove(); _this3.appendLine(status.data.installs, { - title: Lang.translate('extensions_from_memory'), + title: Lang$1.translate('extensions_from_memory'), type: 'installs', autocheck: true }); if (status.data.plugins.length) _this3.appendLine(status.data.plugins, { - title: Lang.translate('extensions_from_cub'), + title: Lang$1.translate('extensions_from_cub'), cub: true, type: 'plugins', autocheck: true }); if (status.data.best && status.data.best.length) _this3.appendLine(status.data.best, { - title: Lang.translate('extensions_from_popular'), + title: Lang$1.translate('extensions_from_popular'), cub: true, type: 'extensions' }); if (status.data.all && status.data.all.length) _this3.appendLine(status.data.all.reverse(), { - title: Lang.translate('extensions_from_lib'), + title: Lang$1.translate('extensions_from_lib'), cub: true, type: 'extensions' }); @@ -26896,7 +29571,7 @@ status.data.list.forEach(function (data) { if (data.results.length) { _this3.appendLine(data.results, { - title: Lang.translate('extensions_hpu_' + data.hpu), + title: Lang$1.translate('extensions_hpu_' + data.hpu), cub: true, type: 'extensions', hpu: data.hpu @@ -26917,12 +29592,12 @@ }; status.append('installs', Plugins.get().reverse()); - Account.plugins(function (plugins) { + Account$1.Api.plugins(function (plugins) { status.append('plugins', plugins); }); if (window.lampa_settings.plugins_store) { - Account.extensions(function (extensions) { + CUB.extensions(function (extensions) { if (extensions.results) { status.need--; status.append('list', extensions.results); @@ -26952,7 +29627,7 @@ value: function appendLine(data, params) { var _this4 = this; - var line = new Line(data, params); + var line = new Line$4(data, params); line.onBack = this.onBack.bind(this); line.onUp = this.up.bind(this); line.onDown = this.down.bind(this); @@ -27016,15 +29691,15 @@ }(); var extensions; - var listener$4 = start$8(); + var listener$5 = Subscribe$2(); - function init$t() { + function init$y() { ParentalControl.add('extensions', { title: 'settings_main_plugins' }); } - function show$5() { + function show$4() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (extensions) return; var controller = Controller.enabled().name; @@ -27036,14 +29711,14 @@ document.body.toggleClass('ambience--enable', false); Controller.toggle(controller); if (params.onClose) params.onClose(); - if (!params.store) listener$4.send('close', {}); + if (!params.store) listener$5.send('close', {}); }; extensions.create(); document.body.toggleClass('ambience--enable', true); document.body.appendChild(extensions.render(true)); extensions.toggle(); - if (!params.store) listener$4.send('open', { + if (!params.store) listener$5.send('open', { extensions: extensions }); } @@ -27054,16 +29729,16 @@ } var Extensions = { - init: init$t, - listener: listener$4, - show: show$5, + init: init$y, + listener: listener$5, + show: show$4, render: render$4 }; var _created = []; var _loaded = []; - var _network = new create$e(); + var _network = new Request(); var _blacklist = []; var _awaits = []; @@ -27072,7 +29747,7 @@ * Запуск */ - function init$s() { + function init$x() { _loaded = Storage.get('plugins', '[]'); Settings.main().render().find('[data-component="plugins"]').unbind('hover:enter').on('hover:enter', function () { ParentalControl.personal('extensions', function () { @@ -27081,7 +29756,7 @@ }); } - function get$4() { + function get$6() { return _loaded.map(function (a) { return a; }); @@ -27113,10 +29788,10 @@ console.log('Plugins', 'add:', plug); Storage.set('plugins', _loaded); - push$3(plug); + push$4(plug); } - function push$3(plug) { + function push$4(plug) { var find = _created.find(function (a) { return a == plug.url; }); @@ -27124,20 +29799,20 @@ if (!find && plug.status == 1) { if (_blacklist.find(function (a) { return plug.url.indexOf(a) >= 0; - })) return Noty.show(Lang.translate('torrent_error_connect'), { + })) return Noty.show(Lang$1.translate('torrent_error_connect'), { time: 8000 }); _created.push(plug.url); console.log('Plugins', 'push:', plug); - Utils$2.putScriptAsync([addPluginParams(plug.url)], false, function () { - Noty.show(Lang.translate('plugins_check_fail'), { + Utils$1.putScriptAsync([addPluginParams(plug.url)], false, function () { + Noty.show(Lang$1.translate('plugins_check_fail'), { time: 8000 }); }, function () { updatePluginDB(plug.url, addPluginParams(plug.url)); - Noty.show(Lang.translate('plugins_add_success')); + Noty.show(Lang$1.translate('plugins_add_success')); }, false); } } @@ -27149,13 +29824,13 @@ function updatePluginDB(name, url) { //if(Account.hasPremium()){ - var cu = Utils$2.addUrlComponent(url, 'cache=true'); + var cu = Utils$1.addUrlComponent(url, 'cache=true'); _network["native"](cu, function (str) { Cache.rewriteData('plugins', name, str).then(function () { console.log('Plugins', 'update plugin cache:', name); })["catch"](function (e) { - console.log('Plugins', 'add to cache fail:', name, typeof e == 'string' ? e : e ? e.message : 'no details'); + console.warn('Plugins', 'add to cache fail:', name, typeof e == 'string' ? e : e ? e.message : 'no details'); }); }, false, false, { dataType: 'text' @@ -27179,27 +29854,26 @@ } console.log('Plugins', 'add plugin from cache:', name); - } else console.log('Plugins', 'no find in cache:', name); + } else console.warn('Plugins', 'no find in cache:', name); })["catch"](function (e) { - console.log('Plugins', 'include from cache fail:', name, typeof e == 'string' ? e : e.message); + console.warn('Plugins', 'include from cache fail:', name, typeof e == 'string' ? e : e.message); }); //} } function addPluginParams(url) { var encode = url; encode = encode.replace('cub.watch', object$2.cub_domain); - encode = Utils$2.fixMirrorLink(encode); + encode = Utils$1.fixMirrorLink(encode); if (!/[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}/.test(encode)) { encode = encode.replace(/\{storage_(\w+|\d+|_|-)\}/g, function (match, key) { return encodeURIComponent(Base64.encode(localStorage.getItem(key) || '')); }); - var email = (localStorage.getItem('account_email') || '').trim(); - if (Account.logged() && email) encode = Utils$2.addUrlComponent(encode, 'email=' + encodeURIComponent(Base64.encode(email))); - encode = Utils$2.addUrlComponent(encode, 'logged=' + encodeURIComponent(Account.logged() ? 'true' : 'false')); - encode = Utils$2.addUrlComponent(encode, 'reset=' + Math.random()); - encode = Utils$2.addUrlComponent(encode, 'origin=' + encodeURIComponent(Base64.encode(window.location.host))); - encode = Utils$2.rewriteIfHTTPS(encode); + if (Account$1.Permit.access) encode = Utils$1.addUrlComponent(encode, 'email=' + encodeURIComponent(Base64.encode(Account$1.Permit.account.email))); + encode = Utils$1.addUrlComponent(encode, 'logged=' + encodeURIComponent(Account$1.Permit.access ? 'true' : 'false')); + encode = Utils$1.addUrlComponent(encode, 'reset=' + Math.random()); + encode = Utils$1.addUrlComponent(encode, 'origin=' + encodeURIComponent(Base64.encode(window.location.host))); + encode = Utils$1.rewriteIfHTTPS(encode); } return encode; @@ -27207,13 +29881,13 @@ function loadBlackList(call) { if (window.lampa_settings.disable_features.blacklist) return call([]); - var status = new status$2(2); + var status = new Status(2); status.onComplite = function (res) { call([].concat(res.cub, res.custom)); }; - _network.silent(Utils$2.protocol() + object$2.cub_domain + '/api/plugins/blacklist', function (result) { + _network.silent(Utils$1.protocol() + object$2.cub_domain + '/api/plugins/blacklist', function (result) { var list = result.map(function (a) { return a.url; }); @@ -27249,19 +29923,19 @@ original[encode] = url; }); - Utils$2.putScriptAsync(include, function () { + Utils$1.putScriptAsync(include, function () { call(); if (errors.length) { setTimeout(function () { - Noty.show(Lang.translate('plugins_no_loaded') + ' (' + errors.join(', ') + ')', { + Noty.show(Lang$1.translate('plugins_no_loaded') + ' (' + errors.join(', ') + ')', { time: 6000 }); }, 2000); } }, function (u) { if (u.indexOf('modification.js') == -1) { - console.log('Plugins', 'error:', original[u]); + console.warn('Extensions', 'error:', original[u]); errors.push(original[u]); _noload.push(original[u]); @@ -27269,7 +29943,6 @@ createPluginDB(original[u]); } }, function (u) { - console.log('Plugins', 'include:', original[u]); console.log('Extensions', 'include:', original[u]); _created.push(original[u]); @@ -27282,7 +29955,7 @@ modify(); _loaded = Storage.get('plugins', '[]'); loadBlackList(function (black_list) { - Account.plugins(function (plugins) { + Account$1.Api.plugins(function (plugins) { var puts = window.lampa_settings.plugins_use ? plugins.filter(function (plugin) { return plugin.status; }).map(function (plugin) { @@ -27326,7 +29999,7 @@ } var Plugins = { - init: init$s, + init: init$x, load: load, remove: remove$1, loaded: function loaded() { @@ -27336,9 +30009,9 @@ return _noload; }, add: add$6, - get: get$4, + get: get$6, save: save$1, - push: push$3, + push: push$4, task: task, awaits: awaits }; @@ -27352,1567 +30025,2904 @@ * @returns {Object} объект класса */ - function Empty() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - Arrays.extend(params, { - title: Lang.translate('empty_title_two'), - descr: Lang.translate('empty_text_two'), - noicon: false, - width: 'large' - }); - var html = Template.get('empty', params); - html.addClass('empty--width-' + params.width); - if (params.noicon) html.addClass('empty--noicon'); + var Empty = /*#__PURE__*/function (_Emit) { + _inherits(Empty, _Emit); - this.start = function () { - var _this = this; + var _super = _createSuper(Empty); - Controller.add('content', { - toggle: function toggle() { - var selects = html.find('.selector').filter(function () { - return !$(this).hasClass('empty__img'); - }); - html.find('.empty__img').toggleClass('selector', selects.length > 0 ? false : true); - Controller.collectionSet(html); - Controller.collectionFocus(selects.length > 0 ? selects.eq(0)[0] : false, html); - }, - left: function left() { - if (_this.onLeft) _this.onLeft();else if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - down: function down() { - Navigator.move('down'); - }, - right: function right() { - Navigator.move('right'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; + function Empty() { + var _this; - this.addInfoButton = function (add_information) { - var footer = html.find('.empty__footer'); + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - if (!footer.length) { - footer = $(''); - html.append(footer); - } - - var button = $('
' + Lang.translate('extensions_info') + '
'); - button.on('hover:enter', function () { - var controller = Controller.enabled().name; - var html = $('
'); - - var line = function line(name, value) { - html.append($("
".concat(name, " - ").concat(value, "
"))); - }; - - line('Protocol', window.location.protocol); - line('Host', window.location.host); - line('Platform', Platform.get()); - line('Safe connection', Storage.field('protocol') == 'https' ? 'Yes' : 'No'); - line('Connection', Utils$2.protocol()); - line('TMDB Proxy', Storage.field('tmdb_proxy') ? 'Yes' : 'No'); - line('TMDB Proxy plugin', Plugins.loaded().find(function (u) { - return /\/plugin\/tmdb-proxy/.test(u); - }) ? 'Yes' : 'No'); - line('Premium', Account.hasPremium() ? 'Yes' : 'No'); - line('Mirror', object$2.cub_domain); - - if (add_information) { - add_information.forEach(function (info) { - line(info[0], info[1]); - }); - } - - Modal.open({ - title: Lang.translate('extensions_info'), - html: html, - size: 'medium', - onBack: function onBack() { - Modal.close(); - Controller.toggle(controller); - } - }); - }); - footer.append(button); - }; - - this.append = function (add) { - html.append(add); - }; - - this.render = function (add) { - if (typeof add == 'boolean') return html[0]; - if (add) html.append(add); - return html; - }; - } - - var Review = /*#__PURE__*/function () { - function Review(element) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - _classCallCheck(this, Review); + _classCallCheck(this, Empty); + _this = _super.call(this); Arrays.extend(params, { - type: 'line' + title: Lang$1.translate('empty_title_two'), + descr: Lang$1.translate('empty_text_two'), + text: Lang$1.translate('empty_text_two'), + noicon: false, + width: 'large', + template: 'empty', + icon: '', + buttons: [] }); - this.element = element; - this.params = params; + _this.params = params; + _this.html = Template.get(params.template, params); + + _this.html.addClass('layer--wheight'); + + if (params.noicon) _this.noicon();else if (params.icon) _this.html.addClass('empty--custom-icon').find('.empty__icon').append(params.icon); + params.buttons.push({ + title: Lang$1.translate('terminal_update'), + onEnter: function onEnter() { + delete params.buttons; + Activity.replace(); + } + }); + if (params.buttons.length) _this.addButtons(params.buttons); + + _this.width(params.width); + + _this.emit('init'); + + return _this; } - _createClass(Review, [{ - key: "create", - value: function create() { - var _this = this; - - var text = (this.element.text || this.element.comment) + ''; - text = Utils$2.capitalizeFirstLetter(this.params.type == 'line' && text.length > 120 ? text.slice(0, 120) + '...' : text); - this.html = Template.get('full_review', _objectSpread2(_objectSpread2({}, this.element), {}, { - text: text - })); - this.html.addClass('type--' + this.params.type); - if (this.element.liked < 0) this.html.addClass('bad--comment'); - - if (this.element.email) { - var who = $("
\n
\n \n
\n
".concat(Utils$2.capitalizeFirstLetter(this.element.email), "
\n
")); - var like = $("
\n \n \n
")); - this.html.find('.full-review__footer').html(who).append(like); - this.html.on('visible', function () { - var img = who.find('img')[0]; - Utils$2.imgLoad(img, Utils$2.protocol() + object$2.cub_domain + '/img/profiles/' + _this.element.icon + '.png', function () { - who.addClass('loaded'); - }, function () { - img.src = './img/actor.svg'; - }); - }); - } + _createClass(Empty, [{ + key: "noicon", + value: function noicon() { + this.html.addClass('empty--noicon'); } }, { - key: "updateLike", - value: function updateLike(add) { - this.element.liked = (this.element.liked || 0) + add; - this.html.find('.full-review__like-counter').text(this.element.liked); + key: "width", + value: function width(_width) { + this.html.removeClass('empty--width-large empty--width-medium empty--width-small'); + this.html.addClass('empty--width-' + _width); + } + }, { + key: "start", + value: function start() { + var _this2 = this; + + this.emit('start'); + var controller = { + link: this, + toggle: function toggle() { + var selects = _this2.html.find('.selector').filter(function () { + return !$(this).hasClass('empty__img'); + }); + + _this2.html.find('.empty__img').toggleClass('selector', selects.length > 0 ? false : true); + + Controller.collectionSet(_this2.html); + Controller.collectionFocus(selects.length > 0 ? selects.eq(0)[0] : false, _this2.html); + Background.change(TMDB.img('/oXPYD4c3bLtfAS2FzwjZh7NWqo4.jpg', 'w200')); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); + }, + up: function up() { + if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); + }, + down: function down() { + Navigator.move('down'); + }, + right: function right() { + Navigator.move('right'); + }, + back: function back() { + Activity.backward(); + } + }; + this.emit('controller', controller); + Controller.add('content', controller); + Controller.toggle('content'); + } + }, { + key: "addButtons", + value: function addButtons(buttons) { + var footer = this.html.find('.empty__footer'); + + if (!footer.length) { + footer = $(''); + this.html.append(footer); + } + + buttons.forEach(function (button_data) { + var button = $("
".concat(button_data.title, "
")); + button.on('hover:enter', function () { + if (button_data.onEnter) button_data.onEnter(); + }); + footer.append(button); + }); + } + }, { + key: "addInfoButton", + value: function addInfoButton(add_information) { + var footer = this.html.find('.empty__footer'); + + if (!footer.length) { + footer = $(''); + this.html.append(footer); + } + + var button = $('
' + Lang$1.translate('extensions_info') + '
'); + button.on('hover:enter', function () { + var controller = Controller.enabled().name; + var html = $('
'); + + var line = function line(name, value) { + html.append($("
".concat(name, " - ").concat(value, "
"))); + }; + + line('Protocol', window.location.protocol); + line('Host', window.location.host); + line('Platform', Platform.get()); + line('Safe connection', Storage.field('protocol') == 'https' ? 'Yes' : 'No'); + line('Connection', Utils$1.protocol()); + line('TMDB Proxy', Storage.field('tmdb_proxy') ? 'Yes' : 'No'); + line('TMDB Proxy plugin', Plugins.loaded().find(function (u) { + return /\/plugin\/tmdb-proxy/.test(u); + }) ? 'Yes' : 'No'); + line('Premium', Account$1.hasPremium() ? 'Yes' : 'No'); + line('Mirror', object$2.cub_domain); + + if (add_information) { + add_information.forEach(function (info) { + line(info[0], info[1]); + }); + } + + Modal.open({ + title: Lang$1.translate('extensions_info'), + html: html, + size: 'medium', + onBack: function onBack() { + Modal.close(); + Controller.toggle(controller); + } + }); + }); + footer.append(button); + } + }, { + key: "append", + value: function append(add) { + this.html.append(add); } }, { key: "render", - value: function render() { - return this.html; + value: function render(js) { + return js ? this.html[0] : this.html; } }, { key: "destroy", value: function destroy() { this.html.remove(); + this.emit('destroy'); } }]); - return Review; - }(); + return Empty; + }(Emit); - function create$9(data) { - var html, scroll, last; - var active = 0; - var view = 6; - var tv = Platform.screen('tv'); + var Simple = { + onEmpty: function onEmpty() { + var params = this.params.empty || {}; + params.buttons = params.buttons || []; - this.create = function () { - var _this = this; - - html = Template.get('items_line', { - title: Lang.translate('title_comments') - }); - scroll = new create$f({ - horizontal: true - }); - scroll.render().find('.scroll__body').addClass('full-reviews'); - html.find('.items-line__body').append(scroll.render()); - data.comments.slice(0, view).forEach(this.append.bind(this)); - - scroll.onWheel = function (step) { - _this.toggle(); - - Controller.enabled().controller[step > 0 ? 'right' : 'left'](); - }; - - scroll.onScroll = function (step) { - data.comments.slice(active, tv ? active + view : data.comments.length).filter(function (e) { - return !e.ready; - }).forEach(function (line_data) { - Controller.collectionAppend(_this.append(line_data)); + if (this.object.source == 'tmdb' && params.cub_button) { + params.buttons.push({ + title: Lang$1.translate('change_source_on_cub'), + onEnter: function onEnter() { + Storage.set('source', 'cub'); + Activity.replace({ + source: 'cub' + }); + } }); - Layer.visible(scroll.render(true)); - }; - }; + } - this.append = function (element) { - element.ready = true; - var review = new Review(element); - review.create(); - review.render().on('hover:focus', function (e) { - last = e.target; - active = data.comments.indexOf(element); - scroll.update($(e.target), true); + this.empty_class = new Empty(params); + if (params.info_button) this.empty_class.addInfoButton(params.info_button); + this.scroll.append(this.empty_class.render(true)); + this.start = this.empty_class.start.bind(this.empty_class); + } + }; + + var MainMap = { + Items: Items$1, + Create: Create$1, + Next: Next$1, + Empty: Simple, + Callback: Callback + }; + + var Helper$8 = new Mask(Arrays.getKeys(MainMap)); + Helper$8.MASK.base = Helper$8.MASK.all; + + var Full$1 = /*#__PURE__*/function (_Base) { + _inherits(Full, _Base); + + var _super = _createSuper(Full); + + function Full(object) { + var _this; + + _classCallCheck(this, Full); + + _this = _super.call(this, object); + var module = typeof _this.params.module !== 'undefined' ? _this.params.module : Helper$8.MASK.base; + Helper$8.getNames(module).map(function (name) { + return MainMap[name]; + }).forEach(function (mod) { + return _this.use(mod); }); - scroll.append(review.render()); - return review.render(); - }; - this.toggle = function () { - var _this2 = this; + _this.emit('init'); - Controller.add('full_reviews', { - link: this, - toggle: function toggle() { - Controller.collectionSet(_this2.render()); - Controller.collectionFocus(last, _this2.render()); - if (_this2.onToggle) _this2.onToggle(_this2); - }, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: this.onDown, - up: this.onUp, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('full_reviews'); - }; + return _this; + } - this.render = function () { - return html; - }; + return Full; + }(Main$1); + + /** + * Компонент главной страницы + * @param {object} object - Параметры компонента + * @return {object} - Экземпляр компонента + */ + + function component$m(object) { + var comp = Utils$1.createInstance(Full$1, object); + var next = null; + comp.use({ + onCreate: function onCreate() { + var nextCall = Api.main(object, this.build.bind(this), this.empty.bind(this)); + if (typeof nextCall == 'function') next = nextCall; + }, + onNext: function onNext(resolve, reject) { + if (next) { + next(resolve.bind(this), reject.bind(this)); + } else reject.call(this); + }, + onInstance: function onInstance(item, data) { + item.use({ + onMore: router.call.bind(router, 'category_full', data), + onInstance: function onInstance(card, data) { + card.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } + }); + } + }); + } + }); + return comp; } - function Discuss(data) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var html, scroll, last, all_ready, rules_html; - var active = 0; - var view = 6; - var tv = Platform.screen('tv'); + /** + * События через сокет + * @returns {void} + */ - this.create = function () { + function Event() { + var ids = {}; + var evokes = {}; + + function callback(data) { + if (data.method == 'callback' && ids[data.callback_name] == data.callback_id) { + evokes[data.callback_id](data); + + evokes[data.callback_id] = function () {}; + } + } + + this.call = function (method, params, call) { + if (!ids[method]) ids[method] = Utils$1.uid(10); + params.callback_id = ids[method]; + params.callback_name = method; + evokes[params.callback_id] = call; + Socket.send('callback', params); + }; + + this.cancel = function (method) { + if (ids[method]) { + evokes[ids[method]] = function () {}; + } + }; + + this.destroy = function () { + Socket.listener.remove('message', callback); + + for (var i in evokes) { + evokes[i] = function () {}; + } + }; + + Socket.listener.follow('message', callback); + } + + var Options = { + onCreate: function onCreate() { var _this = this; - html = Template.get('items_line', { - title: Lang.translate('title_comments') - }); - scroll = new create$f({ - horizontal: true - }); - scroll.render().find('.scroll__body').addClass('full-reviews'); - html.find('.items-line__body').append(scroll.render()); - this.add(); - data.discuss.result.slice(0, view).forEach(this.append.bind(this)); - - scroll.onWheel = function (step) { - _this.toggle(); - - Controller.enabled().controller[step > 0 ? 'right' : 'left'](); - }; - - scroll.onScroll = function (step) { - data.discuss.result.slice(active, tv ? active + view : data.discuss.result.length).filter(function (e) { - return !e.ready; - }).forEach(function (line_data) { - Controller.collectionAppend(_this.append(line_data)); + this.html.find('.button--options').on('hover:enter', function () { + var options = []; + Lampa.Listener.send('full', { + link: _this, + type: 'options', + props: _this.props, + options: options }); - if ((!tv || active + view >= data.discuss.result.length) && !all_ready && data.discuss.total_pages > 1) { - all_ready = true; + if (!window.lampa_settings.disable_features.ai) { + if (options.length) { + options.push({ + title: Lang$1.translate('title_ai_assistant'), + separator: true + }); + } - _this.all(); - } - - Layer.visible(scroll.render(true)); - }; - }; - - this.rules = function () { - rules_html = Template.get('discuss_rules'); - $('body').append(rules_html); - }; - - this.filter = function (text) { - var err = 0; - - function containsLongWords(str) { - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 15; - var any = false; - str.split(/\s/).map(function (a) { - if (a.length >= length) any = true; - }); - return any; - } - - function containsFiveWords(str) { - var words = str.split(/\s/); - var count = 0; - words.map(function (a) { - if (a.length >= 5) count++; - }); - return count; - } - - if (/\d{4,}/g.test(text)) err = 1;else if (!/[а-яА-ЯёЁ]{5,}/.test(text)) err = 2;else if (!/[.,:;!?]/.test(text)) err = 3;else if (/[*%$#_+=|^&]/.test(text)) err = 4;else if (containsFiveWords(text) < 5) err = 5;else if (containsLongWords(text)) err = 6;else if (text.length > 300) err = 7; - return err; - }; - - this.add = function () { - var _this2 = this; - - var add_button = $('
'); - var add_value = ''; - add_button.on('hover:enter', function () { - if (Account.logged()) { - _this2.rules(); - - var keyboard = Input.edit({ - title: '', - value: add_value, - nosave: true, - textarea: true - }, function (new_value) { - rules_html.remove(); - add_value = new_value; - - if (new_value) { - Account.addDiscuss(_objectSpread2(_objectSpread2({}, params.object), {}, { - comment: new_value - }), function (comment) { - add_button.after(_this2.append(comment)); - Layer.visible(scroll.render(true)); + options.push({ + title: Lang$1.translate('title_recomendations'), + onSelect: function onSelect() { + Controller.toggle('full_start'); + Activity.push({ + url: '', + title: Lang$1.translate('title_recomendations'), + component: 'ai_recommendations', + card: _this.card + }); + } + }); + options.push({ + title: Lang$1.translate('title_facts'), + onSelect: function onSelect() { + Controller.toggle('full_start'); + Activity.push({ + url: '', + title: Lang$1.translate('title_facts'), + component: 'ai_facts', + card: _this.card }); } - - _this2.toggle(); }); - var keypad = $('.simple-keyboard'); - var helper = $('
'); - - if (keypad.hasClass('simple-keyboard--with-textarea')) { - keypad.append(helper); - keyboard.listener.follow('change', function (event) { - var code = _this2.filter(event.value.trim()); - - helper.toggleClass('hide', !Boolean(code)).text(Lang.translate('discuss_rules_rule_' + code)); - }); - } - } else { - Lampa.Account.showNoAccount(); } - }).on('hover:focus hover:touch', function (e) { - last = e.target; - scroll.update($(e.target), true); - }); - scroll.append(add_button); - }; - this.all = function () { - var _this3 = this; - - var all_button = $('
' + Lang.translate('more') + '
' + (data.discuss.total - data.discuss.result.length) + '
'); - all_button.on('hover:enter', function () { - var page = 2; - var discuss = []; - var wait = false; - var position = 0; - var container = $('
'); - - var draw = function draw() { - Modal.scroll().reset(); - container.empty(); - discuss.forEach(function (element) { - var review = new Review(element, { - type: 'vertical' - }); - review.create(); - review.render().on('hover:focus hover:touch', function (e) { - position = discuss.indexOf(element); - }).on('hover:enter', function () { - _this3.see(review, Modal.toggle); - }); - container.append(review.render()); - }); - if (data.discuss.total_pages !== page) container.append($('
')); - Modal.update(container); - Modal.toggle(); - }; - - var load = function load() { - CUB.discussGet(_objectSpread2(_objectSpread2({}, params.object), {}, { - page: page - }), function (anser) { - wait = false; - discuss = discuss.slice(position, discuss.length).concat(anser.result); - position = 0; - draw(); - }, function () { - page--; - wait = false; - }); - }; - - Modal.open({ - title: Lang.translate('title_comments'), - html: container, - size: 'medium', + Select.show({ + title: Lang$1.translate('more'), + items: options, + onSelect: function onSelect() { + Controller.toggle('full_start'); + }, onBack: function onBack() { - Modal.close(); - - draw = function draw() {}; - - load = function load() {}; - - _this3.toggle(); + Controller.toggle('full_start'); } }); - - Modal.scroll().onEnd = function () { - if (!wait && page < data.discuss.total_pages) { - wait = true; - page++; - load(); - } - }; - - Modal.scroll().params().end_ratio = 1.5; - setTimeout(load, 200); //задержка для анимации окна }); - scroll.append(all_button); - }; + } + }; - this.see = function (review, onBack) { - var items = []; - var voited = Storage.cache('discuss_voited', 100, []); - - if (voited.indexOf(review.element.id) == -1 && Account.logged()) { - items = [{ - separator: true, - title: Lang.translate('title_action') - }, { - title: '+1 ' + Lang.translate('title_like'), - like: 1 - }, { - title: Lang.translate('reactions_shit'), - like: -1 - }]; - } - - Select.show({ - title: Utils$2.capitalizeFirstLetter(review.element.email), - items: items, - onFullDraw: function onFullDraw(select_scroll) { - select_scroll.body().prepend($('
' + Utils$2.capitalizeFirstLetter(review.element.comment) + '
')); - }, - onSelect: function onSelect(item) { - onBack(); - Account.voiteDiscuss({ - id: review.element.id, - like: item.like - }, function () { - voited.push(review.element.id); - Storage.set('discuss_voited', voited); - review.updateLike(item.like); - Noty.show(Lang.translate('discuss_voited')); - }); - }, - onBack: onBack - }); - }; - - this.append = function (element) { - var _this4 = this; - - element.ready = true; - var review = new Review(element); - review.create(); - review.render().on('hover:focus', function (e) { - last = e.target; - active = data.discuss.result.indexOf(element); - scroll.update($(e.target), true); - }).on('hover:touch', function (e) { - active = data.discuss.result.indexOf(element); - last = e.target; - }).on('hover:enter', function () { - _this4.see(review, _this4.toggle.bind(_this4)); - }); - scroll.append(review.render()); - return review.render(); - }; - - this.toggle = function () { - var _this5 = this; - - Controller.add('full_reviews', { - link: this, - toggle: function toggle() { - Controller.collectionSet(_this5.render()); - Controller.collectionFocus(last, _this5.render()); - if (_this5.onToggle) _this5.onToggle(_this5); - }, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: this.onDown, - up: this.onUp, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('full_reviews'); - }; - - this.render = function () { - return html; - }; - } - - function create$8(data) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var html, scroll, last; - var view = 6; - var tv = Platform.screen('tv'); - var active = 0; - - this.create = function () { + var Torrents = { + onCreate: function onCreate() { var _this = this; - html = Template.get('items_line', { - title: params.season.name || Lang.translate('full_series_release') - }); - scroll = new create$f({ - horizontal: true - }); - scroll.render().find('.scroll__body').addClass('full-episodes'); - - scroll.onWheel = function (step) { - if (!Controller.own(_this)) _this.toggle(); - Controller.enabled().controller[step > 0 ? 'right' : 'left'](); - }; - - scroll.onScroll = function (step) { - data.slice(active, tv ? active + view : data.length).filter(function (e) { - return !e.ready; - }).forEach(function (elem) { - Controller.collectionAppend(_this.append(elem)); - }); - Layer.visible(scroll.render(true)); - }; - - html.find('.items-line__body').append(scroll.render()); - data.reverse(); - data.forEach(function (episode, num) { - return episode.episode_number = episode.episode_number || num + 1; - }); - var wath_all = Template.get('full_episode', { - name: Lang.translate('more') - }); - wath_all.addClass('full-episode--wath-all'); - wath_all.on('hover:enter', function () { - Activity$1.push({ + var status = Storage.field('parser_use'); + var button = this.html.find('.view--torrent'); + if (window.lampa_settings.torrents_use) button.toggleClass('selector', status).toggleClass('hide', !status); + button.on('hover:enter', function () { + var year = ((_this.card.first_air_date || _this.card.release_date || '0000') + '').slice(0, 4); + var combinations = { + 'df': _this.card.original_title, + 'df_year': _this.card.original_title + ' ' + year, + 'df_lg': _this.card.original_title + ' ' + _this.card.title, + 'df_lg_year': _this.card.original_title + ' ' + _this.card.title + ' ' + year, + 'lg': _this.card.title, + 'lg_year': _this.card.title + ' ' + year, + 'lg_df': _this.card.title + ' ' + _this.card.original_title, + 'lg_df_year': _this.card.title + ' ' + _this.card.original_title + ' ' + year + }; + Activity.push({ url: '', - title: Lang.translate('title_episodes'), - component: 'episodes', - movie: params.movie, + title: Lang$1.translate('title_torrents'), + component: 'torrents', + search: combinations[Storage.field('parse_lang')], + search_one: _this.card.title, + search_two: _this.card.original_title, + movie: _this.card, page: 1 }); }); - scroll.append(wath_all); - data.slice(0, view).forEach(this.append.bind(this)); - }; + } + }; - this.append = function (element) { - element.ready = true; - element.date = element.air_date ? Utils$2.parseTime(element.air_date).full : '----'; - element.num = element.episode_number; - var episode = Template.get('full_episode', element); - var hash = Utils$2.hash([element.season_number, element.season_number > 10 ? ':' : '', element.episode_number, params.title].join('')); - var view = Timeline$1.view(hash); - episode.append('
' + Template.get('icon_viewed', {}, true) + '
'); - episode.toggleClass('full-episode--viewed', Boolean(view.percent)); + var Subscribed = { + onCreate: function onCreate() { + if (!(this.card.source == 'tmdb' || this.card.source == 'cub')) this.html.find('.source--name').text(this.card.source.toUpperCase());else if (this.card.number_of_seasons && window.lampa_settings.account_use && !window.lampa_settings.disable_features.subscribe) { + this.html.find('.button--subscribe').removeClass('hide'); + this.emit('subscribed'); + } + }, + onSubscribed: function onSubscribed() { + var _this = this; - if (element.plus) { - episode.addClass('full-episode--next'); + this.event.call('subscribed', { + card_id: this.card.id + }, function (result) { + if (result.result) { + _this.html.find('.button--subscribe').data('voice', result.result).addClass('active').find('path').attr('fill', 'currentColor'); + } + }); + } + }; + + var Trailers = { + onCreate: function onCreate() { + var _this = this; + + var videos = this.data.videos; + + if (videos && videos.results.length && !window.lampa_settings.disable_features.trailers) { + this.html.find('.view--trailer').on('hover:enter', function () { + var items = []; + videos.results.forEach(function (element) { + var date = Utils$1.parseTime(element.published_at).full; + items.push({ + title: Utils$1.shortText(element.name, 50), + subtitle: (element.official ? Lang$1.translate('full_trailer_official') : Lang$1.translate('full_trailer_no_official')) + ' - ' + date, + id: element.key, + player: element.player, + code: element.iso_639_1, + time: new Date(element.published_at).getTime(), + url: element.url || 'https://www.youtube.com/watch?v=' + element.key, + youtube: typeof element.youtube !== 'undefined' ? element.youtube : true, + icon: '', + template: 'selectbox_icon' + }); + }); + items.sort(function (a, b) { + return a.time > b.time ? -1 : a.time < b.time ? 1 : 0; + }); + var my_lang = items.filter(function (n) { + return n.code == Storage.field('tmdb_lang'); + }); + var en_lang = items.filter(function (n) { + return n.code == 'en' && my_lang.indexOf(n) == -1; + }); + var al_lang = []; + + if (my_lang.length) { + al_lang = al_lang.concat(my_lang); + } + + if (al_lang.length && en_lang.length) { + al_lang.push({ + title: Lang$1.translate('more'), + separator: true + }); + } + + al_lang = al_lang.concat(en_lang); + Select.show({ + title: Lang$1.translate('title_trailers'), + items: al_lang, + onSelect: function onSelect(a) { + _this.toggle(); + + if (Platform.is('android') && Storage.field('player_launch_trailers') == 'youtube' && a.youtube) { + Android.openYoutube(a.id); + } else { + var playlist = al_lang.filter(function (v) { + return !v.separator; + }); + Player.play(a); + Player.playlist(playlist); + } + }, + onBack: function onBack() { + Controller.toggle('full_start'); + } + }); + }); + } else { + this.html.find('.view--trailer').remove(); + } + } + }; + + var Poster = { + onCreate: function onCreate() { + var _this = this; + + var im = this.html.find('.full--poster'); + var poster; + this.img_poster = im[0] || {}; + + if (window.innerWidth <= 480) { + this.img_poster = new Image(); + this.img_poster.crossOrigin = "Anonymous"; } - episode.on('visible', function () { - var img = episode.find('img')[0]; + this.img_poster.onerror = function (e) { + _this.img_poster.src = './img/img_broken.svg'; + }; - img.onerror = function (e) { - img.src = './img/img_broken.svg'; + this.img_poster.onload = function (e) { + im.parent().addClass('loaded'); + }; + + if (window.innerWidth <= 480) { + if (this.card.backdrop_path) poster = Api.img(this.card.backdrop_path, 'w780');else if (this.card.background_image) poster = this.card.background_image; + + this.img_poster.onerror = function (e) { + _this.img_poster = im[0]; + + _this.img_poster.onerror = function (e) { + _this.img_poster.src = './img/img_broken.svg'; + }; + + _this.img_poster.onload = function (e) { + im.parent().addClass('loaded').addClass('with-out'); + }; + + im[0].src = poster || _this.card.img; }; - img.onload = function () { - episode.addClass('full-episode--loaded'); - }; + this.img_poster.onload = function (e) { + var draw = function draw() { + im.parent().addClass('loaded'); + setTimeout(function () { + im[0].style.transition = 'none'; + }, 500); - if (element.still_path) img.src = Api.img(element.still_path, 'w300');else if (element.img) img.src = element.img;else img.src = './img/img_broken.svg'; + var sc = _this.html.parents('.scroll')[0]; + + var an = 0; + var ts = 0; + var dl = window.innerHeight * 0.1; + + var smoothParallax = function smoothParallax() { + im[0].style.transform = 'translate3d(0, ' + ts * 0.35 + 'px, 0)'; + im[0].style.opacity = ts >= dl ? Math.max(0, 1 - (ts - dl) / (window.innerHeight * 0.2)) : 1; + an--; + if (an > 0) smoothParallax(); + }; + + if (sc) sc.on('scroll', function (e) { + ts = sc.scrollTop; + + if (an == 0) { + an = 100; + requestAnimationFrame(smoothParallax); + } + }); + }; + + if (window.lampa_settings.blur_poster) { + Color.blurPoster(_this.img_poster, im.width(), im.height(), function (nim) { + im[0].src = nim.src; + draw(); + }); + } else { + im[0].src = _this.img_poster.src; + draw(); + } + }; + } + + if (poster) this.html.find('.full-start__poster').addClass('background--poster'); + this.img_poster.src = poster || this.card.img; + } + }; + + var Reactions = { + onCreate: function onCreate() { + var _this = this; + + if (!Storage.field('card_interfice_reactions') || window.lampa_settings.disable_features.reactions) return this.html.find('.full-start-new__reactions, .button--reaction').remove(); + var reactions_data = this.data.reactions; + + var vote = function vote(type) { + var add = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var mine = Storage.get('mine_reactions', {}); + var id = (_this.card.name ? 'tv' : 'movie') + '_' + _this.card.id; + if (!mine[id]) mine[id] = []; + var ready = mine[id].indexOf(type) >= 0; + + if (add) { + if (!ready) mine[id].push(type); + Storage.set('mine_reactions', mine); + } + + return ready; + }; + + var draw = function draw() { + if (reactions_data && reactions_data.result && reactions_data.result.length) { + var reactions = reactions_data.result; + + var reactions_body = _this.html.find('.full-start-new__reactions')[0]; + + reactions.sort(function (a, b) { + return a.counter > b.counter ? -1 : a.counter < b.counter ? 1 : 0; + }); + reactions_body.empty(); + reactions.forEach(function (r) { + var reaction = document.createElement('div'), + icon = document.createElement('img'), + count = document.createElement('div'), + wrap = document.createElement('div'); + reaction.addClass('reaction'); + icon.addClass('reaction__icon'); + count.addClass('reaction__count'); + reaction.addClass('reaction--' + r.type); + count.text(Utils$1.bigNumberToShort(r.counter)); + icon.src = Utils$1.protocol() + object$2.cub_domain + '/img/reactions/' + r.type + '.svg'; + reaction.append(icon); + reaction.append(count); + wrap.append(reaction); + if (vote(r.type)) reaction.addClass('reaction--voted'); + reactions_body.append(wrap); + }); + } + }; + + var items = [{ + type: 'fire' + }, { + type: 'nice' + }, { + type: 'think' + }, { + type: 'bore' + }, { + type: 'shit' + }]; + items.forEach(function (a) { + a.template = 'selectbox_icon', a.icon = ''; + a.ghost = vote(a.type); + a.noenter = a.ghost; + a.title = Lang$1.translate('reactions_' + a.type); }); - episode.on('hover:focus', function (e) { - last = e.target; - active = data.indexOf(element); - scroll.update($(e.target), true); - }).on('hover:enter', function () { - if (element.overview) { - Modal.open({ - title: element.name, - html: $('
' + element.overview + '
'), - onBack: function onBack() { - Modal.close(); - Controller.toggle('content'); + this.html.find('.button--reaction').on('hover:enter', function () { + Select.show({ + title: Lang$1.translate('title_reactions'), + items: items, + onSelect: function onSelect(a) { + Controller.toggle('full_start'); + Api.sources.cub.reactionsAdd({ + method: _this.card.name ? 'tv' : 'movie', + id: _this.card.id, + type: a.type + }, function () { + vote(a.type, true); + var find = reactions_data.result.find(function (r) { + return r.type == a.type; + }); + if (find) find.counter++;else { + reactions_data.result.push({ + type: a.type, + counter: 1 + }); + } + a.ghost = true; + a.noenter = true; + draw(); + }, function (e) { + Lampa.Noty.show(Lang$1.translate('reactions_ready')); + }); + }, + onBack: function onBack() { + Controller.toggle('full_start'); + } + }); + }); + draw(); + } + }; + + var Translations = { + onCreate: function onCreate() { + var _this = this; + + if (window.lampa_settings.disable_features.subscribe) return; + var button = this.html.find('.button--subscribe'); + button.on('hover:enter', function () { + Loading$1.start(function () { + _this.event.cancel('translations'); + + Loading$1.stop(); + }); + + _this.event.call('translations', { + card_id: _this.card.id, + imdb_id: _this.card.imdb_id, + season: Utils$1.countSeasons(_this.card) + }, function (result) { + Loading$1.stop(); + + if (!result.result) { + result.result = { + voice: {}, + subscribe: '' + }; + } + + var items = []; + var subscribed = result.result.subscribe || button.data('voice'); + + if (subscribed) { + items.push({ + title: Lang$1.translate('title_unsubscribe'), + subtitle: subscribed, + unsubscribe: true + }); + } + + for (var voice in result.result.voice) { + items.push({ + title: voice, + voice: voice, + ghost: voice !== result.result.subscribe, + episode: result.result.voice[voice] + }); + } + + if (items.length) { + Select.show({ + title: Lang$1.translate('title_subscribe'), + items: items, + onSelect: function onSelect(a) { + _this.toggle(); + + if (a.unsubscribe) { + _this.event.call('unsubscribe', { + card_id: _this.card.id + }, function (result) { + if (result.result) { + button.removeClass('active').data('voice', '').find('path').attr('fill', 'transparent'); + } + }); + } else if (Account$1.Permit.access) { + Account$1.Api.subscribeToTranslation({ + card: _this.card, + season: Utils$1.countSeasons(_this.card), + episode: a.episode, + voice: a.voice + }, function () { + Noty.show(Lang$1.translate('subscribe_success')); + button.addClass('active').data('voice', a.voice).find('path').attr('fill', 'currentColor'); + }, function () { + Noty.show(Lang$1.translate('subscribe_error')); + }); + } else { + Account$1.Modal.account(); + } + }, + onFullDraw: function onFullDraw(scroll) { + scroll.body(true).prepend(Template.elem('div', { + "class": 'selectbox-item', + children: [Template.elem('div', { + "class": 'selectbox-item__title', + text: Lang$1.translate('subscribe_info') + })] + })); + }, + onBack: function onBack() { + Controller.toggle('full_start'); + } + }); + } else Noty.show(Lang$1.translate('subscribe_noinfo')); + }); + }); + } + }; + + var Bookmarks = { + onCreate: function onCreate() { + var _this = this; + + this.html.find('.button--book').on('hover:enter', function () { + var status = Favorite.check(_this.card); + var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; + + var label = function label(a) { + Favorite.toggle(a.type, _this.card); + if (a.collect) Controller.toggle('full_start'); + }; + + var items = ['book', 'like', 'wath', 'history'].map(function (type) { + return { + title: Lang$1.translate('title_' + type), + type: type, + checkbox: true, + checked: status[type] + }; + }); + + if (window.lampa_settings.account_use) { + items.push({ + title: Lang$1.translate('settings_cub_status'), + separator: true + }); + marks.forEach(function (m) { + items.push({ + title: Lang$1.translate('title_' + m), + type: m, + picked: status[m], + collect: true, + noenter: !Account$1.hasPremium(), + ghost: !Account$1.hasPremium() + }); + }); + } + + Select.show({ + title: Lang$1.translate('settings_input_links'), + items: items, + onCheck: label, + onSelect: label, + onBack: function onBack() { + Controller.toggle('full_start'); + }, + onDraw: function onDraw(item, elem) { + if (elem.collect) { + if (!Account$1.hasPremium()) { + item.on('hover:enter', function () { + Select.close(); + Account$1.Modal[Account$1.Permit.token ? 'premium' : 'account'](); + }); + } + } + } + }); + }); + this.emit('updateFavorite'); + + this.listenerFavorite = function (e) { + if (e.target == 'favorite') { + if (e.card) { + if (e.card.id == _this.card.id) _this.emit('updateFavorite'); + } else _this.emit('updateFavorite'); + } + }; + + Lampa.Listener.follow('state:changed', this.listenerFavorite); + }, + onUpdateFavorite: function onUpdateFavorite() { + var status = Favorite.check(this.card); + var any = Favorite.checkAnyNotHistory(status); + $('.button--book path', this.html).attr('fill', any ? 'currentColor' : 'transparent'); + }, + onDestroy: function onDestroy() { + Lampa.Listener.remove('state:changed', this.listenerFavorite); + } + }; + + var Buttons = { + onCreate: function onCreate() { + this.emit('groupButtons'); + }, + onPriorityButton: function onPriorityButton(btn) { + var _this = this; + + var cont = this.html.find('.full-start-new__buttons'); + var clon = btn.clone(); + cont.find('.button--priority').remove(); + clon.addClass('button--priority').removeClass('view--torrent').on('hover:enter', function () { + btn.trigger('hover:enter'); + }).on('hover:long', function () { + clon.remove(); + Storage.set('full_btn_priority', ''); + _this.last = _this.html.find('.button--play')[0]; + Controller.toggle('full_start'); + }); + cont.prepend(clon); + }, + onGroupButtons: function onGroupButtons() { + var _this2 = this; + + var play = this.html.find('.button--play'); + var btns = this.html.find('.buttons--container > .full-start__button').not('.hide'); + var priority = Storage.get('full_btn_priority', '') + ''; + + if (priority) { + var priority_button; + btns.each(function () { + var hash = Utils$1.hash($(this).clone().removeClass('focus').prop('outerHTML')); + if (hash == priority) priority_button = $(this); + }); + if (priority_button) this.emit('priorityButton', priority_button); + } + + play.unbind().on('hover:enter', function (e) { + priority = Storage.get('full_btn_priority', '') + ''; + btns = _this2.html.find('.buttons--container > .full-start__button').not('.hide').filter(function () { + return priority !== Utils$1.hash($(this).clone().removeClass('focus').prop('outerHTML')); + }); + + if (btns.length == 1) { + btns.trigger('hover:enter'); + } else { + var items = []; + btns.each(function () { + var icon = $(this).find('svg').prop('outerHTML'); + items.push({ + title: $(this).text(), + subtitle: $(this).data('subtitle'), + template: typeof icon == 'undefined' || icon == 'undefined' ? 'selectbox_item' : 'selectbox_icon', + icon: icon, + btn: $(this) + }); + }); + Select.show({ + title: Lang$1.translate('settings_rest_source'), + items: items, + onSelect: function onSelect(a) { + a.btn.trigger('hover:enter'); }, - onSelect: function onSelect() { + onLong: function onLong(a) { + Storage.set('full_btn_priority', Utils$1.hash(a.btn.clone().removeClass('focus').prop('outerHTML'))); + + _this2.emit('priorityButton', a.btn); + }, + onBack: function onBack() { + Controller.toggle('full_start'); + } + }); + } + }).on('hover:focus', function () { + _this2.last = play[0]; + }); + play.toggleClass('hide', !Boolean(btns.length)); + } + }; + + var Start = /*#__PURE__*/function (_Emit) { + _inherits(Start, _Emit); + + var _super = _createSuper(Start); + + function Start(data) { + var _this; + + _classCallCheck(this, Start); + + _this = _super.call(this); + _this.data = data; + _this.card = data.movie; + _this.event = new Event(); + Arrays.extend(_this.card, { + title: _this.card.name, + original_title: _this.card.original_name, + runtime: 0, + img: _this.card.poster_path ? Api.img(_this.card.poster_path, Storage.field('poster_size')).replace(/\/w\d{1,4}/, '/w500') : './img/img_broken.svg' + }); + + _this.use(Torrents); + + _this.use(Options); + + _this.use(Subscribed); + + _this.use(Trailers); + + _this.use(Poster); + + _this.use(Translations); + + _this.use(Bookmarks); + + _this.use(Reactions); + + _this.use(Buttons); + + _this.emit('init'); + + return _this; + } + + _createClass(Start, [{ + key: "create", + value: function create() { + var _this2 = this; + + var genres = (this.card.genres || ['---']).slice(0, 3).map(function (a) { + return Utils$1.capitalizeFirstLetter(a.name); + }).join(', '); + var countries = TMDB.parseCountries(this.card); + var seasons = Utils$1.countSeasons(this.card); + var tmdb_rating = parseFloat((this.card.vote_average || 0) + '').toFixed(1); + var relise = (this.card.release_date || this.card.first_air_date || '') + ''; + var year = relise ? relise.slice(0, 4) : ''; + var quality = !this.card.first_air_date ? this.card.release_quality || this.card.quality : false; + var pg = TMDB.parsePG(this.card); + var head = []; + var info = []; + if (tmdb_rating >= 10) tmdb_rating = 10; + this.html = Template.get('full_start_new', { + title: this.card.title, + original_title: this.card.original_title, + descr: Utils$1.substr(this.card.overview || Lang$1.translate('full_notext'), 420), + time: Utils$1.secondsToTime(this.card.runtime * 60, true), + genres: Utils$1.substr(genres, 30), + rating: tmdb_rating, + seasons: seasons, + countries: countries.join(', '), + episodes: this.card.number_of_episodes, + tagline: this.card.tagline + }); + !window.lampa_settings.torrents_use && this.html.find('.view--torrent').addClass('hide'); + this.card.name && this.html.find('.full-start-new__poster').addClass('card--tv').append('
TV
'); + + if (year) { + this.html.find('.tag--year').removeClass('hide').find('> div').text(year); + head.push('' + year + ''); + } + + countries.length && head.push(countries.slice(0, 5).join(' | ')); + !this.card.tagline && this.html.find('.full--tagline').remove(); + if (!this.card.tagline && this.card.title.length > 25) this.html.find('.full-start-new__title').addClass('twolines'); + this.card.runtime > 0 && info.push('' + Utils$1.secondsToTime(this.card.runtime * 60, true) + ''); + seasons && info.push('' + Lang$1.translate('title_seasons') + ': ' + seasons + ''); + pg && this.html.find('.full-start__pg').removeClass('hide').text(pg); + this.card.number_of_episodes && info.push('' + Lang$1.translate('title_episodes') + ': ' + this.card.number_of_episodes + ''); + !this.card.runtime && $('.tag--time', this.html).remove(); + this.card.number_of_seasons && this.html.find('.is--serial').removeClass('hide'); + this.card.vote_average == 0 && this.html.find('.rate--tmdb').addClass('hide'); + this.card.status && this.html.find('.full-start__status').removeClass('hide').text(Lang$1.translate('tv_status_' + this.card.status.toLowerCase().replace(/ /g, '_'))); + + if (this.card.imdb_rating && parseFloat(this.card.imdb_rating) > 0) { + this.html.find('.rate--imdb').removeClass('hide').find('> div').eq(0).text(parseFloat(this.card.imdb_rating) >= 10 ? 10 : this.card.imdb_rating); + } + + if (this.card.kp_rating && parseFloat(this.card.kp_rating) > 0) { + this.html.find('.rate--kp').removeClass('hide').find('> div').eq(0).text(parseFloat(this.card.kp_rating) >= 10 ? 10 : this.card.kp_rating); + } + + if (this.card.genres) { + genres = this.card.genres.slice(0, 5).map(function (a) { + return Utils$1.capitalizeFirstLetter(a.name); + }).join(' | '); + info.push('' + genres + ''); + } + + if (quality) { + this.html.find('.tag--quality').removeClass('hide').find('> div').text(quality); + info.push('' + Lang$1.translate('player_quality') + ': ' + quality.toUpperCase() + ''); + } + + if (this.card.next_episode_to_air) { + var air = Utils$1.parseToDate(this.card.next_episode_to_air.air_date); + var now = Date.now(); + var day = Math.ceil((air.getTime() - now) / (24 * 60 * 60 * 1000)); + var txt = Lang$1.translate('full_next_episode') + ': ' + Utils$1.parseTime(this.card.next_episode_to_air.air_date)["short"] + ' / ' + Lang$1.translate('full_episode_days_left') + ': ' + day; + + if (day > 0) { + $('.tag--episode', this.html).removeClass('hide').find('div').text(txt); + info.push('' + txt + ''); + } + } + + $('.full-start-new__buttons', this.html).find('.selector').on('hover:focus hover:enter hover:hover hover:touch', function (e) { + _this2.last = e.target; + }); + this.html.find('.full-start-new__head').toggleClass('hide', !head.length).html(head.join(', ')); + this.html.find('.full-start-new__details').html(info.join('')); + if (window.lampa_settings.read_only) this.html.find('.button--play').remove(); + this.emit('create'); + } + }, { + key: "toggle", + value: function toggle() { + var _this3 = this; + + var controller = { + link: this, + toggle: function toggle() { + _this3.emit('groupButtons'); + + Controller.collectionSet(_this3.html); + Controller.collectionFocus(_this3.last || false, _this3.html); + + _this3.emit('toggle'); + }, + right: function right() { + Navigator.move('right'); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else _this3.emit('left'); + }, + down: function down() { + if (Navigator.canmove('down')) Navigator.move('down');else _this3.emit('down'); + }, + up: function up() { + if (Navigator.canmove('up')) Navigator.move('up');else _this3.emit('up'); + }, + back: this.emit.bind(this, 'back') + }; + this.emit('controller', controller); + Controller.add('full_start', controller); + Controller.toggle('full_start'); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html[0] : this.html; + } + }, { + key: "destroy", + value: function destroy() { + this.event.destroy(); + this.html.remove(); + this.emit('destroy'); + } + }]); + + return Start; + }(Emit); + + var Descriptiopn = /*#__PURE__*/function (_Emit) { + _inherits(Descriptiopn, _Emit); + + var _super = _createSuper(Descriptiopn); + + function Descriptiopn(data) { + var _this; + + _classCallCheck(this, Descriptiopn); + + _this = _super.call(this); + _this.data = data; + _this.card = data.movie; + + _this.emit('init'); + + return _this; + } + + _createClass(Descriptiopn, [{ + key: "create", + value: function create() { + var _this2 = this; + + this.html = Template.get('items_line', { + title: Lang$1.translate('full_detail') + }); + var media = this.card.name ? 'tv' : 'movie'; + var countries = TMDB.parseCountries(this.card); + var date = (this.card.release_date || this.card.first_air_date || '') + ''; + this.body = Template.get('full_descr', { + text: (this.card.overview || Lang$1.translate('full_notext')) + '

', + relise: date.length > 3 ? Utils$1.parseTime(date).full : date.length > 0 ? date : Lang$1.translate('player_unknown'), + budget: '$ ' + Utils$1.numberWithSpaces(this.card.budget || 0), + countries: countries.join(', ') + }); + var tags = this.body.find('.full-descr__tags'); + + if (this.card.genres.length) { + tags.append(this.tag(Lang$1.translate('full_genre'), this.card.genres, function (genre) { + Activity.push({ + url: genre.url || media, + title: Utils$1.capitalizeFirstLetter(genre.name), + component: _this2.card.source == 'cub' ? 'category' : 'category_full', + genres: genre.id, + source: _this2.card.source, + page: 1 + }); + })); + } + + if (this.card.production_companies.length) { + tags.append(this.tag(Lang$1.translate('full_production'), this.card.production_companies, function (company) { + router.call('company', _objectSpread2(_objectSpread2({}, company), {}, { + card: _this2.card + })); + })); + } + + var key_tags = this.card.keywords ? this.card.keywords.results || this.card.keywords.keywords : []; + + if (key_tags.length) { + tags.append(this.tag(Lang$1.translate('full_keywords'), key_tags, function (key) { + Activity.push({ + url: 'discover/' + media, + title: Utils$1.capitalizeFirstLetter(key.name), + keywords: key.id, + component: 'category_full', + source: 'tmdb', + page: 1 + }); + })); + } + + if (!this.card.budget) $('.full--budget', this.body).remove(); + if (!countries.length) $('.full--countries', this.body).remove(); + this.body.find('.selector').on('hover:focus hover:enter hover:hover hover:touch', function (e) { + _this2.last = e.target; + }); + this.html.find('.items-line__body').append(this.body); + this.emit('create'); + } + }, { + key: "tag", + value: function tag(name, items, call) { + var _this3 = this; + + var elem = $("
\n
".concat(name, "
\n
").concat(items.length, "
\n
")); + elem.on('hover:enter', function () { + var select = items.map(function (a) { + return { + title: Utils$1.capitalizeFirstLetter(a.name), + elem: a + }; + }); + Select.show({ + title: name, + items: select, + onSelect: function onSelect(a) { + _this3.toggle(); + + call(a.elem); + }, + onBack: function onBack() { + _this3.toggle(); + } + }); + }); + return elem; + } + }, { + key: "toggle", + value: function toggle() { + var _this4 = this; + + var controller = { + link: this, + toggle: function toggle() { + Controller.collectionSet(_this4.render()); + Controller.collectionFocus(_this4.last, _this4.render()); + + _this4.emit('toggle'); + }, + update: function update() {}, + right: function right() { + Navigator.move('right'); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else _this4.emit('left'); + }, + down: function down() { + if (Navigator.canmove('down')) Navigator.move('down');else _this4.emit('down'); + }, + up: function up() { + if (Navigator.canmove('up')) Navigator.move('up');else _this4.emit('up'); + }, + back: this.emit.bind(this, 'back') + }; + this.emit('controller', controller); + Controller.add('full_descr', controller); + Controller.toggle('full_descr'); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html[0] : this.html; + } + }, { + key: "destroy", + value: function destroy() { + this.body.remove(); + this.html.remove(); + this.emit('destroy'); + } + }]); + + return Descriptiopn; + }(Emit); + + var Line$3 = { + onCreate: function onCreate() { + var _this = this; + + this.data.role = this.data.character || this.data.job || Lang$1.translate('title_actor'); + this.html = Template.js('full_person', this.data); + this.html.on('visible', function () { + Utils$1.imgLoad(_this.html.find('img'), _this.data.profile_path ? TMDB.img(_this.data.profile_path, 'w276_and_h350_face') : _this.data.img || './img/actor.svg', function () { + _this.html.addClass('full-person--loaded'); + }); + }); + } + }; + + var About$1 = { + onCreate: function onCreate() { + var _this = this; + + this.html = Template.js('person_start', { + name: this.data.name, + birthday: this.data.birthday ? Utils$1.parseTime(this.data.birthday).full : Lang$1.translate('player_unknown'), + place: this.data.place_of_birth || Lang$1.translate('player_unknown') + }); + this.prefix = Template.prefix(this.html, 'person-start'); + this.subscribed = Storage.get('person_subscribes_id', '[]').find(function (a) { + return a == _this.data.id; + }); + Utils$1.imgLoad(this.prefix.img, this.data.profile_path ? TMDB.img(this.data.profile_path, 'w500') : this.data.img || 'img/img_broken.svg', function (img) { + img.addClass('loaded'); + }); + if (window.lampa_settings.account_use) this.emit('subscribe', this.subscribed); + this.html.find('.button--info').on('hover:enter', function () { + if (_this.data.biography) { + Modal.open({ + title: _this.data.name, + size: 'large', + html: $('
' + _this.data.biography.replace(/\n/g, '
') + '
'), + onBack: function onBack() { Modal.close(); Controller.toggle('content'); } }); - } - }).on('hover:long', function () { - if (Boolean(view.percent)) { - view.time = 0; - view.percent = 0; } else { - view.time = view.duration * 0.95; - view.percent = 95; + Noty.show(Lang$1.translate('empty_title_two')); } - - Timeline$1.update(view); - episode.toggleClass('full-episode--viewed', Boolean(view.percent)); + }).on('hover:focus hover:enter hover:hover', function (e) { + _this.last = e.target; }); - scroll.append(episode); - return episode; - }; - this.toggle = function () { - var _this2 = this; + if (window.lampa_settings.account_use) { + this.html.find('.button--subscribe').on('hover:enter', function () { + if (!Account$1.Permit.access) return Account$1.Modal.account(); + var subscribes = Storage.get('person_subscribes_id', '[]'); + _this.subscribed = subscribes.find(function (a) { + return a == _this.data.id; + }); + if (!_this.subscribed && !Account$1.hasPremium()) return Account$1.Modal.premium(); + var person = Arrays.clone(_this.data); // Пихают там всякие иконки и прочее, удаляем лишнее - Controller.add('full_episodes', { - link: this, - toggle: function toggle() { - Controller.collectionSet(_this2.render()); - Controller.collectionFocus(last, _this2.render()); - if (_this2.onToggle) _this2.onToggle(_this2); - }, - update: function update() {}, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: this.onDown, - up: this.onUp, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('full_episodes'); - }; + delete person.biography; + Lampa.Network.silent(Utils$1.protocol() + object$2.cub_domain + '/api/person/' + (_this.subscribed ? 'unsubscribe' : 'subscribe'), function () { + if (_this.subscribed) Arrays.remove(subscribes, _this.data.id);else if (subscribes.indexOf(_this.data.id) == -1) subscribes.push(_this.data.id); + Storage.set('person_subscribes_id', subscribes); + _this.subscribed = subscribes.find(function (a) { + return a == _this.data.id; + }); - this.render = function () { - return html; - }; - } - - var components$1 = { - start: create$c, - descr: create$b, - persons: create$a, - recomend: create$i, - simular: create$i, - discuss: Discuss, - comments: create$9, - episodes: create$8 + _this.emit('subscribe', _this.subscribed); + }, function (err) { + if (err.responseJSON && err.responseJSON.code == 555) Account$1.Modal.premium();else Noty.show(Lang$1.translate('subscribe_error')); + }, { + person: JSON.stringify(person) + }, { + headers: { + token: Account$1.Permit.token + } + }); + }).on('hover:focus hover:enter hover:hover', function (e) { + _this.last = e.target; + }); + } else this.html.find('.button--subscribe').remove(); + }, + onSubscribe: function onSubscribe(subscribed) { + this.html.find('.button--subscribe svg path:nth-of-type(2)').setAttribute('fill', subscribed ? 'currentColor' : 'transparent'); + this.html.find('.button--subscribe span').text(Lang$1.translate(subscribed ? 'title_unsubscribe' : 'title_subscribe')); + } }; - function component$j(object) { - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - step: 400, - scroll_by_item: false - }); - var items = []; - var create = []; - var active = 0; - var tv = Platform.screen('tv'); - var html = $('
'); - var background_image; - var loaded_data; + var PersonMap = { + Line: Line$3, + About: About$1, + Callback: Callback$1 + }; - this.create = function () { + var Person = /*#__PURE__*/function (_Constructor) { + _inherits(Person, _Constructor); + + var _super = _createSuper(Person); + + function Person() { + _classCallCheck(this, Person); + + return _super.apply(this, arguments); + } + + return Person; + }(Constructor(PersonMap)); + + var Helper$7 = new Mask(Arrays.getKeys(PersonMap)); + Helper$7.MASK.base = Helper$7.MASK.none; + + function Persons(data) { + Utils$1.extendItemsParams(data.results, { + module: Helper$7.toggle(Helper$7.MASK.base, 'Line', 'Callback'), + createInstance: function createInstance(item) { + return new Person(item); + }, + emit: { + onEnter: function onEnter(html, item) { + router.call('actor', item); + } + } + }); + var comp = Utils$1.createInstance(Line$5, data, { + module: Helper$b.only('Items', 'Create') + }); + return comp; + } + + var Line$2 = { + onCreate: function onCreate() { var _this = this; - this.activity.loader(true); + var text = (this.data.text || this.data.comment) + ''; + text = Utils$1.capitalizeFirstLetter(!this.params.line.full_text && text.length > 120 ? text.slice(0, 120) + '...' : text); + this.html = Template.js('full_review', _objectSpread2(_objectSpread2({}, this.data), {}, { + text: text + })); + if (this.data.liked < 0) this.html.addClass('bad--comment'); + if (this.params.line.full_text) this.html.addClass('full-review--full-text'); - if (object.source == 'tmdb' && Storage.field('source') == 'cub') { - object.source = 'cub'; - } - - scroll.minus(); - - scroll.onWheel = function (step) { - if (step > 0) _this.down();else if (active > 0) _this.up(); - }; - - scroll.onScroll = this.visible.bind(this); - html.append(scroll.render()); - Api.full(object, function (data) { - if (data.movie && data.movie.blocked) { - _this.empty({ - blocked: true + if (this.data.email) { + var who = Template.elem('div', { + "class": 'full-review__user', + children: [Template.elem('div', { + "class": 'full-review__user-icon', + children: [Template.elem('img', { + "class": 'full-review__user-img' + })] + }), Template.elem('div', { + "class": 'full-review__user-email', + text: Utils$1.capitalizeFirstLetter(this.data.email) + })] + }); + var like = Template.elem('div', { + "class": 'full-review__like', + children: [Template.elem('div', { + "class": 'full-review__like-icon', + children: [Template.js('icon_like')] + }), Template.elem('div', { + "class": 'full-review__like-counter', + text: this.data.liked || '0' + })] + }); + this.html.find('.full-review__footer').html(who).append(like); + this.html.on('visible', function () { + var img = who.find('img'); + Utils$1.imgLoad(img, Utils$1.protocol() + object$2.cub_domain + '/img/profiles/' + _this.data.icon + '.png', function () { + who.addClass('loaded'); + }, function () { + img.src = './img/actor.svg'; }); - } else if (data.movie) { - loaded_data = data; - if (Activity$1.active().activity == _this.activity) Activity$1.active().card = data.movie; //для плагинов которые используют Activity.active().card + }); + } + }, + onUpdateLiked: function onUpdateLiked(add) { + this.data.liked = (this.data.liked || 0) + add; + this.html.find('.full-review__like-counter').text(this.data.liked); + } + }; + + function containsLongWords(str) { + var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 15; + var any = false; + str.split(/\s/).map(function (a) { + if (a.length >= length) any = true; + }); + return any; + } + + function containsFiveWords(str) { + var words = str.split(/\s/); + var count = 0; + words.map(function (a) { + if (a.length >= 5) count++; + }); + return count; + } + + function filter(text) { + var err = 0; + if (/\d{4,}/g.test(text)) err = 1;else if (!/[а-яА-ЯёЁ]{5,}/.test(text)) err = 2;else if (!/[.,:;!?]/.test(text)) err = 3;else if (/[*%$#_+=|^&]/.test(text)) err = 4;else if (containsFiveWords(text) < 5) err = 5;else if (containsLongWords(text)) err = 6;else if (text.length > 300) err = 7; + return err; + } + + var Add = { + onCreate: function onCreate() { + var _this = this; + + this.html = Template.elem('div', { + "class": 'full-review-add selector' + }); + this.html.on('hover:enter', function () { + if (_this.added) return Noty.show(Lang$1.translate('account_discuss_added_ready')); + + if (Account$1.Permit.access) { + var add_value = ''; + var controller = Controller.enabled().name; + + if (Platform.tv()) { + var html = Template.js('modal_qr', { + qr_text: Lang$1.translate('account_discuss_add_qr'), + title: Lang$1.translate('account_discuss_add_title') + }); + html.addClass('layer--' + (Platform.mouse() ? 'wheight' : 'height')); + html.find('.account-modal-split__text').html(Lang$1.translate('account_discuss_add_text')); + var code = html.find('.account-modal-split__qr-code'); + var url = [Activity.active().source, Activity.active().method, Activity.active().id].join('/'); + Utils$1.qrcode('https://' + object$2.cub_site + '/addcomment/' + url, code, function () { + code.remove(); + }); + Modal.open({ + title: '', + html: $(html), + size: 'full', + scroll: { + nopadding: true + }, + onBack: function onBack() { + Modal.close(); + Controller.toggle(controller); + } + }); + } else { + var rules_html = Template.js('discuss_rules'); + document.body.append(rules_html); + var keyboard = Input.edit({ + title: '', + value: add_value, + nosave: true, + textarea: true, + align: Platform.screen('mobile') ? 'top' : 'center', + keyboard: 'integrate' + }, function (new_value) { + rules_html.remove(); + add_value = new_value; + + if (new_value) { + Account$1.Api.load('discuss/add', {}, { + id: [Activity.active().method, Activity.active().id].join('_'), + comment: new_value, + lang: Storage.field('language') + }).then(function (data) { + _this.added = true; + Bell.push({ + text: Lang$1.translate('account_discuss_added') + }); + })["catch"](function (e) { + Noty.show(Lampa.Network.errorJSON(e).text || Lang$1.translate('network_500'), { + time: 5000 + }); + }); + } + + Controller.toggle(controller); + }); + var keypad = $('.simple-keyboard'); + var helper = $('
'); + + if (keypad.find('.simple-keyboard-input').length) { + keypad.after(helper); + keyboard.listener.follow('change', function (event) { + var code = filter(event.value.trim()); + helper.toggleClass('hide', !Boolean(code)).text(Lang$1.translate('discuss_rules_rule_' + code)); + }); + } + } + } else { + Account$1.Modal.account(); + } + }); + } + }; + + var Read = { + onCreate: function onCreate() { + var _this = this; + + this.html.on('hover:enter', function () { + var items = []; + var voited = Storage.cache('discuss_voited', 100, []); + var contoller = Controller.enabled().name; + + if (voited.indexOf(_this.data.id) == -1 && Account$1.Permit.access) { + items = [{ + separator: true, + title: Lang$1.translate('title_action') + }, { + title: '+1 ' + Lang$1.translate('title_like'), + like: 1 + }, { + title: Lang$1.translate('reactions_shit'), + like: -1 + }]; + } + + Select.show({ + title: Utils$1.capitalizeFirstLetter(_this.data.email), + items: items, + onFullDraw: function onFullDraw(select_scroll) { + if (_this.params.line.full_text) return; + select_scroll.body(true).prepend(Template.elem('div', { + "class": 'selectbox__text selector', + children: [Template.elem('div', { + text: Utils$1.capitalizeFirstLetter(_this.data.comment) + })] + })); + }, + onSelect: function onSelect(item) { + Controller.toggle(contoller); + Account$1.Api.load('discuss/voite', {}, { + id: _this.data.id, + like: item.like + }).then(function () { + Storage.add('discuss_voited', _this.data.id); + + _this.emit('updateLiked', item.like); + + Bell.push({ + text: Lang$1.translate('discuss_voited') + }); + })["catch"](function () {}); + }, + onBack: function onBack() { + Controller.toggle(contoller); + } + }); + }); + } + }; + + var DiscussMap = { + Line: Line$2, + Add: Add, + Read: Read, + Callback: Callback$1 + }; + + var Discuss = /*#__PURE__*/function (_Constructor) { + _inherits(Discuss, _Constructor); + + var _super = _createSuper(Discuss); + + function Discuss(data) { + var _this; + + _classCallCheck(this, Discuss); + + _this = _super.call(this, data); + Arrays.extend(data.params, { + line: { + full_text: false + } + }); + return _this; + } + + return Discuss; + }(Constructor(DiscussMap)); + + var Helper$6 = new Mask(Arrays.getKeys(DiscussMap)); + Helper$6.MASK.base = Helper$6.only('Callback'); + + function Discussions(data) { + Utils$1.extendItemsParams(data.results, { + module: Helper$6.only('Line', 'Read'), + createInstance: function createInstance(item) { + return new Discuss(item); + } + }); + Arrays.insert(data.results, 0, { + params: { + module: Helper$6.only('Add'), + createInstance: function createInstance(item) { + return new Discuss(item); + } + } + }); + var comp = Utils$1.createInstance(Line$5, data, { + module: Helper$b.only('Items', 'Create', 'More') + }); + comp.use({ + onMore: router.call.bind(router, 'discuss', data.movie) + }); + return comp; + } + + function Episodes(data) { + Utils$1.extendItemsParams(data.results, { + module: Helper$a.only('Small', 'Mark', 'Callback'), + createInstance: function createInstance(item) { + return new Episode(item); + } + }); + data.results.reverse(); + data.results.filter(function (e) { + return e.comeing; + }).forEach(function (e) { + e.params.module = Helper$a.only('SmallNext'); + }); + + if (!data.results.length) { + data.results.push({ + episode_number: 1, + season_number: data.movie.number_of_seasons || 1, + air_date: '', + name: Lang$1.translate('title_anons'), + comeing: true, + params: { + module: Helper$a.only('SmallNext'), + createInstance: function createInstance(item) { + return new Episode(item); + } + } + }); + } + + var comp = Utils$1.createInstance(Line$5, data, { + module: Helper$b.only('Items', 'Create', 'MoreFirst') + }); + comp.use({ + onMore: router.call.bind(router, 'episodes', data.movie) + }); + return comp; + } + + function Cards(data) { + var comp = Utils$1.createInstance(Line$5, data, { + module: Helper$b.toggle(Helper$b.MASK.base, 'More') + }); + comp.use({ + onInstance: function onInstance(item, data) { + item.use({ + onEnter: router.call.bind(router, 'full', data) + }); + } + }); + return comp; + } + + var components = { + start: Start, + description: Descriptiopn, + persons: Persons, + cards: Cards, + discuss: Discussions, + episodes: Episodes + }; + /** + * Компонент "Карточка фильма/сериала" + * @param {*} object + */ + + function component$l(object) { + var comp = Utils$1.createInstance(Full$1, object, { + module: Helper$8.only('Items', 'Empty', 'Callback'), + empty: { + cub_button: true + } + }); + comp.use({ + onCreate: function onCreate() { + var _this = this; + + this.tv = Platform.screen('tv'); + this.view = 3; + this.rows = ['start', 'description']; + this.html.addClass('layer--wheight'); + Api.full(object, function (data) { + if (!data.movie) return _this.emit('error', { + empty: true + }); + if (data.movie.blocked) return _this.emit('error', { + blocked: true + }); // Для плагинов которые используют Activity.active().card + + object.card = data.movie; // Добавляем в пропсы данные + + _this.props.set(data); // Отправляем событие, что началась загрузка полной карточки + Lampa.Listener.send('full', { + link: _this, type: 'start', + props: _this.props, object: object, data: data - }); - - _this.build('start', data); - - _this.build('descr', data); + }); // Создаем эпизоды if (data.episodes && data.episodes.episodes) { var today = new Date(); - var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); - var time = Utils$2.parseToDate(date).getTime(); - var plus = false; + var date = [today.getFullYear(), today.getMonth() + 1, today.getDate()].join('-'); + var time = Utils$1.parseToDate(date).getTime(); var cameout = data.episodes.episodes.filter(function (a) { return a.air_date; }).filter(function (e) { - var air = Utils$2.parseToDate(e.air_date).getTime(); - if (air <= time) return true;else if (!plus) { - plus = true; - e.plus = true; - return true; - } - return false; + return Utils$1.parseToDate(e.air_date).getTime() <= time; + }); + var comeing = data.episodes.episodes.filter(function (a) { + return a.air_date; + }).filter(function (e) { + return Utils$1.parseToDate(e.air_date).getTime() > time; + }); + comeing.forEach(function (e) { + return e.comeing = true; + }); + if (comeing.length) cameout = cameout.concat(comeing.slice(0, 1)); + cameout.forEach(function (episode) { + return episode.original_name = data.movie.original_name || data.movie.name; }); - _this.build('episodes', cameout, { - title: data.movie.original_title || data.movie.original_name, - season: data.episodes, - movie: data.movie - }); - } + _this.rows.push(['episodes', { + movie: data.movie, + title: data.episodes.name || Lang$1.translate('full_series_release'), + results: cameout + }]); + } // Создаем режиссеров + if (data.persons && data.persons.crew && data.persons.crew.length) { var directors = data.persons.crew.filter(function (member) { return member.job === 'Director'; }); + directors.length && _this.rows.push(['persons', { + results: directors, + title: Lang$1.translate('title_producer') + }]); + } // Создаем актеров - if (directors.length) { - _this.build('persons', directors, { - title: Lang.translate('title_producer') - }); - } - } - if (data.persons && data.persons.cast && data.persons.cast.length) _this.build('persons', data.persons.cast); - if (data.discuss) _this.build('discuss', data);else if (data.comments && data.comments.length) _this.build('comments', data); + if (data.persons && data.persons.cast && data.persons.cast.length) _this.rows.push(['persons', { + results: data.persons.cast, + title: Lang$1.translate('title_actors') + }]); // Создаем отзывы - if (data.collection && data.collection.results && data.collection.results.length) { - data.collection.title = Lang.translate('title_collection'); - data.collection.noimage = true; - data.collection.results.sort(function (a, b) { - return new Date(a.release_date) - new Date(b.release_date); - }); - - _this.build('recomend', data.collection); - } + if (data.discuss) _this.rows.push(['discuss', _objectSpread2(_objectSpread2({}, data.discuss), {}, { + movie: data.movie, + title: Lang$1.translate('title_comments'), + results: data.discuss.result || [] + })]); // Создаем рекомендации if (data.recomend && data.recomend.results && data.recomend.results.length) { - data.recomend.title = Lang.translate('title_recomendations'); - data.recomend.noimage = true; + data.recomend.title = Lang$1.translate('title_recomendations'); + + _this.rows.push(['cards', data.recomend]); + } // Создаем похожие - _this.build('recomend', data.recomend); - } if (data.simular && data.simular.results && data.simular.results.length) { - data.simular.title = Lang.translate('title_similar'); - data.simular.noimage = true; + data.simular.title = Lang$1.translate('title_similar'); - _this.build('simular', data.simular); - } + _this.rows.push(['cards', data.simular]); + } // Добавляем картинку для фона - TimeTable.update(data.movie); - _this.visible(0); + _this.html.prepend(Template.elem('img', { + "class": 'full-start__background' + })); // Добавляем фоновую картинку + + + var background = data.movie.backdrop_path ? Api.img(data.movie.backdrop_path, 'w1280') : data.movie.background_image ? data.movie.background_image : ''; + + if (window.innerWidth > 790 && background && !Storage.field('light_version')) { + Utils$1.imgLoad(_this.html.find('.full-start__background'), background, function (img) { + return img.addClass('loaded'); + }); + } else _this.html.find('.full-start__background').remove(); // Создаем все компоненты + + + _this.build(_this.rows.slice(0, _this.view)); // Обновляем расписание + + + TimeTable.update(data.movie); // Отправляем событие, что полная карточка загружена Lampa.Listener.send('full', { + link: _this, type: 'complite', + props: _this.props, object: object, data: data }); + }, this.emit.bind(this, 'error')); + }, + onBuild: function onBuild() { + this.scroll.onScroll = this.emit.bind(this, 'scroll'); + }, + onStart: function onStart() { + this.props.get('movie') && Background.immediately(Utils$1.cardImgBackgroundBlur(this.props.get('movie'))); + }, + onScroll: function onScroll(position) { + var _this$html$find; - _this.loadBackground(data); + var size = this.tv ? (Math.round(this.active / this.view) + 1) * this.view + 1 : this.rows.length; + var add = this.rows.slice(this.items.length, size); - _this.activity.toggle(); - - _this.activity.loader(false); - - Layer.update(html); - } else { - _this.empty(); + if (add.length) { + this.fragment = document.createDocumentFragment(); + add.forEach(this.emit.bind(this, 'createAndAppend')); + this.scroll.append(this.fragment); } - }, this.empty.bind(this)); - return this.render(); - }; - this.empty = function () { - var er = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var button; + (_this$html$find = this.html.find('.full-start__background')) === null || _this$html$find === void 0 ? void 0 : _this$html$find.toggleClass('dim', position > 0); + Layer.visible(this.scroll.render()); + }, + onCreateAndAppend: function onCreateAndAppend(component) { + var name = Arrays.isArray(component) ? component[0] : component; + var data = Arrays.isArray(component) ? component[1] : this.props.all(); + var item = new components[name](data); + this.emit('instance', item); + item.create(); + this.emit('append', item); // Отправляем событие, что компонент создан - if (object.source == 'tmdb') { - button = $(''); - button.find('.selector').on('hover:enter', function () { - Storage.set('source', 'cub'); - Activity$1.replace({ - source: 'cub' - }); + Lampa.Listener.send('full', { + link: this, + type: 'build', + props: this.props, + name: name, + item: item, + data: data }); - } + }, + onError: function onError(status) { + var params = this.params.empty; + var dmca = Utils$1.dcma(this.object.method, this.object.id); - var text = {}; - - if (Utils$2.dcma(object.method, object.id) || er.blocked) { - text.title = Lang.translate('dmca_title'); - text.descr = Lang.translate('dmca_descr'); - text.noicon = true; - } - - var empty = new Empty(text); - if (button) empty.append(button); - empty.addInfoButton([['Movie id', object.id], ['DMCA', Utils$2.dcma(object.method, object.id) ? 'Yes' : 'No']]); - scroll.append(empty.render(true)); - this.start = empty.start; - this.activity.loader(false); - this.activity.toggle(); - }; - - this.build = function (name, data, params) { - var _this2 = this; - - create.push({ - created: false, - create: function create() { - var item = new components$1[name](data, _objectSpread2({ - object: object, - nomore: true - }, params)); - item.mscroll = scroll; - item.onDown = _this2.down.bind(_this2); - item.onUp = _this2.up.bind(_this2); - item.onBack = _this2.back.bind(_this2); - - item.onToggle = function () { - active = items.indexOf(item); - }; - - item.onScroll = function (e, center) { - scroll.update(e, center); - }; - - item.create(); - items.push(item); - Lampa.Listener.send('full', { - type: 'build', - name: name, - body: item.render() - }); - scroll.append(item.render()); - return item.render(); + if (dmca || status.blocked) { + params.title = Lang$1.translate('dmca_title'); + params.descr = Lang$1.translate('dmca_descr'); + params.noicon = true; } + + params.info_button = [['Movie id', this.object.id], ['DMCA', dmca ? 'Yes' : 'No']]; // Вызываем пустой экран + + this.empty(status); + } + }); + return comp; + } + + var Base = /*#__PURE__*/function (_Emit) { + _inherits(Base, _Emit); + + var _super = _createSuper(Base); + + function Base(object) { + var _this; + + _classCallCheck(this, Base); + + _this = _super.call(this); + Arrays.extend(object, { + params: {} }); - }; + _this.object = object; + _this.params = object.params; + _this.scroll = new Scroll({ + mask: true, + over: true, + step: 250, + end_ratio: 2 + }); + _this.html = document.createElement('div'); + _this.body = document.createElement('div'); + return _this; + } - this.visible = function (position) { - create.slice(0, tv ? active + 3 : create.length).filter(function (e) { - return !e.created; - }).forEach(function (e) { - e.created = true; - e.create(); - }); //фиг знает, с задержкой все четко заработало + _createClass(Base, [{ + key: "create", + value: function create() { + var _this2 = this; - setTimeout(function () { - Layer.visible(scroll.render(true)); - }, 100); - this.toggleBackgroundOpacity(position); - }; + this.activity.loader(true); + this.scroll.minus(); - this.down = function () { - active++; - active = Math.min(active, items.length - 1); - - if (items[active]) { - items[active].toggle(); - scroll.update(items[active].render()); - } - }; - - this.up = function () { - active--; - - if (active < 0) { - active = 0; - Controller.toggle('head'); - } else { - items[active].toggle(); - scroll.update(items[active].render()); - } - }; - - this.toggleBackgroundOpacity = function (position) { - if (background_image) { - html.find('.full-start__background').toggleClass('dim', position > 0); - } - }; - - this.back = function () { - Activity$1.backward(); - }; - - this.loadBackground = function (data) { - var background = data.movie.backdrop_path ? Api.img(data.movie.backdrop_path, 'w1280') : data.movie.background_image ? data.movie.background_image : ''; - - if (window.innerWidth > 790 && background && !Storage.field('light_version')) { - background_image = html.find('.full-start__background')[0] || {}; - - background_image.onload = function (e) { - html.find('.full-start__background').addClass('loaded'); + this.scroll.onWheel = function (step) { + if (!Controller.own(_this2)) _this2.start(); + Navigator.move(step > 0 ? 'down' : 'up'); }; - background_image.src = background; - } else html.find('.full-start__background').remove(); - }; - - this.start = function () { - if (items.length && Activity$1.active().activity == this.activity) { - if (loaded_data) Activity$1.active().card = loaded_data.movie; //на всякий пожарный :D - - items[0].toggleBackground(); + this.scroll.append(this.body); + this.html.append(this.scroll.render(true)); + this.emit('create'); } + }, { + key: "build", + value: function build(data) { + this.emit('build', data); + this.activity.loader(false); + this.activity.toggle(); + } + }, { + key: "empty", + value: function empty(status) { + this.scroll.nopadding(); + this.emit('empty', status); + this.activity.loader(false); + this.activity.toggle(); + } + }, { + key: "start", + value: function start() { + var _this3 = this; - Controller.add('content', { - update: function update() {}, - toggle: function toggle() { - if (items.length) { - items[active].toggle(); - } else { - Controller.collectionSet(scroll.render()); - Controller.collectionFocus(false, scroll.render()); + this.emit('start'); + var controller = { + link: this, + invisible: true, + toggle: function toggle() { + _this3.scroll.restorePosition(); + + Controller.collectionSet(_this3.scroll.render(true)); + if (Platform.screen('tv')) Controller.collectionFocus(_this3.last || false, _this3.scroll.render(true)); + + _this3.emit('toggle'); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); + }, + right: function right() { + if (Navigator.canmove('right')) Navigator.move('right');else _this3.emit('right'); + }, + up: function up() { + if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); + }, + down: function down() { + if (Navigator.canmove('down')) Navigator.move('down'); + }, + back: function back() { + Activity.backward(); } - }, - left: function left() { - Controller.toggle('menu'); - }, - up: function up() { - Controller.toggle('head'); - }, - back: function back() { - Activity$1.backward(); + }; + this.emit('controller', controller); + Controller.add('content', controller); + Controller.toggle('content'); + } + }, { + key: "pause", + value: function pause() { + this.emit('pause'); + } + }, { + key: "resize", + value: function resize() { + this.emit('resize'); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html : $(this.html); + } + }, { + key: "destroy", + value: function destroy() { + this.scroll.destroy(); + this.html.remove(); + this.body.remove(); + this.emit('destroy'); + } + }]); + + return Base; + }(Emit); + + var Items = { + onInit: function onInit() { + this.items = []; + this.pages = {}; + this.active = 0; + this.added = 0; + this.screen = Platform.screen('tv'); + this.loaded = []; + Arrays.extend(this.params, { + items: { + mapping: 'grid', + cols: 6, + limit_view: 6, + limit_collection: 36 } }); - Controller.toggle('content'); - }; + this.total_pages = 1; + this.limit_view = this.params.items.limit_view; + this.limit_collection = this.params.items.limit_collection; + }, + onCreate: function onCreate() { + var _this = this; - this.pause = function () {}; + this.scroll.onScroll = this.emit.bind(this, 'scroll'); - this.stop = function () {}; + this.scroll.onAnimateEnd = function () { + // Скрываем/показываем страницы + _this.emit('pageView'); // Обновляем навигатор - this.render = function () { - return html; - }; - this.destroy = function () { - network.clear(); - Arrays.destroy(items); - scroll.destroy(); - html.remove(); - items = null; - network = null; + _this.emit('scroll'); + }; - if (background_image) { - background_image.onload = function () {}; + this.body.addClass('mapping--' + this.params.items.mapping); + this.params.items.mapping == 'grid' && this.body.addClass('cols--' + this.params.items.cols); + }, + onAppend: function onAppend(item, element) { + var _this2 = this; - background_image.src = ''; + var render = item.render(true); + render.on('hover:focus', function () { + _this2.scroll.update(render, _this2.params.items.mapping == 'list'); + }); + render.on('hover:touch hover:enter hover:focus', function () { + _this2.last = render; + _this2.active = _this2.items.indexOf(item); + }); + + if (element.params.on && _typeof(element.params.on) == 'object') { + var _loop = function _loop(e) { + render.on(e, function () { + element.params.on[e].call(_this2, item, element); + }); + }; + + for (var e in element.params.on) { + _loop(e); + } } - }; + + this.frament.appendChild(render); + this.items.push(item); + this.added++; + var page = Math.ceil(this.added / 60); // 60 - количество элементов на странице + + if (!this.pages[page]) this.pages[page] = { + items: [] + }; + this.pages[page].items.push(item); + }, + onBuild: function onBuild(data) { + if (!data.results.length) return this.empty(); + this.total_pages = data.total_pages || 1; + this.loaded.push(data.results); + this.emit('pushLoaded'); + this.emit('scroll'); + }, + onPushLoaded: function onPushLoaded() { + var add = this.loaded.shift(); + + if (add && add.length) { + this.frament = document.createDocumentFragment(); + add.forEach(this.emit.bind(this, 'createAndAppend')); + this.body.append(this.frament); + } + }, + onPageView: function onPageView() { + var item = this.items[this.active]; + var page = 1; + var anyscroll; + var item_position = 0; + var scroll_position = this.screen ? 0 : this.scroll.render(true).scrollTop; + + if (item) { + for (var p in this.pages) { + this.pages[p].items.find(function (i) { + return i.data == item.data; + }) && (page = p); + } + } // Надо получить позицию до изменений + + + if (this.last) item_position = this.screen ? this.last.getBoundingClientRect().top : this.last.offsetTop; + + for (var _p in this.pages) { + var current = this.pages[_p]; + var visible = _p >= page - 1 && _p - 1 <= page; // Если страница видна, но была удалена, то вставляем её обратно + + if (visible && current.removed) { + (function () { + current.removed = false; + var frag = document.createDocumentFragment(); + current.items.forEach(function (i) { + return frag.appendChild(i.render(true)); + }); + current.items.forEach(function (i) { + return i.render(true).style.visibility = 'visible'; + }); + current.placeholder.replaceWith(frag); + current.placeholder = null; + anyscroll = true; + })(); + } // Если страница не видна, то удаляем её из DOM + else if (!visible && !current.removed) { + current.removed = true; + current.placeholder = document.createElement('div'); + current.placeholder.style.display = 'none'; + current.items[0].render(true).after(current.placeholder); + current.items.forEach(function (i) { + return i.render(true).remove(); + }); + anyscroll = true; + } + } // Если было удаление или добавление страниц, то надо подвинуть скролл + + + if (anyscroll && this.last) { + if (this.screen) { + this.scroll.shift(this.last.getBoundingClientRect().top - item_position); + } else { + this.scroll.render(true).scrollTop = scroll_position + (this.last.offsetTop - item_position); + } + } + }, + onScroll: function onScroll() { + // Грузим элементы которые ожидают своей очереди + this.emit('pushLoaded'); + + if (Controller.own(this)) { + Navigator.setCollection(this.items.slice(Math.max(0, this.active - this.limit_collection), this.active + this.limit_collection).map(function (c) { + return c.render(true); + })); + Navigator.focused(this.last); + } + + Layer.visible(this.scroll.render(true)); + }, + onResize: function onResize() { + if (this.last) this.scroll.update(this.last, this.params.items.mapping == 'list'); + }, + onDestroy: function onDestroy() { + Arrays.destroy(this.items); + this.pages = {}; + this.items = []; + this.loaded = []; + } + }; + + var Create = { + onCreateAndAppend: function onCreateAndAppend(element) { + var item = Utils$1.createInstance(Card$3, element); + this.emit('instance', item, element); + item.create(); + this.emit('append', item, element); + } + }; + + var Next = { + onInit: function onInit() { + this.next_wait; + this.builded_time = Date.now(); + }, + onBuild: function onBuild() { + this.scroll.onEnd = this.emit.bind(this, 'loadNext'); + this.builded_time = Date.now(); + }, + onLoadNext: function onLoadNext() { + var _this = this; + + if (!this.next_wait && this.items.length && this.builded_time < Date.now() - 1000 && this.object.page < this.total_pages) { + this.next_wait = true; + this.object.page++; + this.emit('next', function (new_data) { + _this.next_wait = false; + if (!_this.items.length || _this.destroyed) return; + var split_total = Math.ceil(new_data.results.length / _this.limit_view); // Разбиваем на части, чтобы не лагал браузер + + for (var i = 0; i < split_total; i++) { + _this.loaded.push(new_data.results.slice(i * _this.limit_view, (i + 1) * _this.limit_view)); + } // Если нет анимации у скрола, то можно грузить сразу + + + if (!_this.scroll.animated()) _this.scroll.onAnimateEnd();else _this.emit('scroll'); + }, function () { + _this.next_wait = false; + }); + } + } + }; + + /** + * Исследователь + * @param {object} object - объект с параметрами + * @param {object} object.movie - информация о фильме/сериале + * @param {string} object.source - источник фильма/сериала + * @param {boolean} object.params.noinfo - не показывать информацию о фильме/сериале + * @returns {Explorer} - экземпляр класса Explorer + */ + + var Explorer$1 = /*#__PURE__*/function (_Emit) { + _inherits(Explorer, _Emit); + + var _super = _createSuper(Explorer); + + function Explorer(object) { + var _this; + + _classCallCheck(this, Explorer); + + _this = _super.call(this); + Arrays.extend(object, { + params: {} + }); + _this.object = object; + _this.params = object.params || {}; + _this.html = Template.get('explorer', {}); + _this.scroll = new Scroll({ + mask: true, + over: true + }); + _this.card = _this.html.find('.explorer__card').clone(); + + _this.html.find('.explorer__left').empty().append(_this.scroll.render()); + + _this.html.find('.explorer__files-head').toggleClass('hide', true); + + _this.scroll.append(_this.card); + + _this.scroll.minus(); + + _this.movie(); + + _this.emit('init'); + + return _this; + } + + _createClass(Explorer, [{ + key: "movie", + value: function movie() { + var _this2 = this; + + var movie = this.object.movie || this.object.card || {}; + Arrays.extend(movie, { + title: 'Фильм не найден', + original_title: '', + img: './img/img_broken.svg', + genres: [{ + name: 'Комедия' + }, { + name: 'Боевик' + }, { + name: 'Драма' + }], + overview: 'Этот фильм мог бы быть интересным, но, к сожалению, нет данных о нём.', + release_date: new Date().getFullYear() + '-01-01', + vote_average: 8, + production_countries: [{ + iso_3166_1: 'US' + }] + }); + + if (movie.id) { + this.html.find('.selector').on('hover:enter', function () { + if (Activity.all().length > 1) { + Activity.back(); + } else { + Activity.push({ + url: movie.url, + component: 'full', + id: movie.id, + method: movie.name ? 'tv' : 'movie', + card: movie, + source: movie.source || _this2.object.source || 'tmdb' + }); + } + }); + } + + var year = ((movie.release_date || movie.first_air_date || '0000') + '').slice(0, 4); + var pg = TMDB.parsePG(movie); + var countries = TMDB.parseCountries(movie); + var rate = parseFloat((movie.vote_average || 0) + ''); + var title = movie.title || movie.name || ''; + var genres = (movie.genres || [{ + name: '' + }]).slice(0, 3).map(function (a) { + return Utils$1.capitalizeFirstLetter(a.name); + }); + this.html.find('.explorer-card__head-create').text(year + (countries.length ? ' - ' + countries[0] : '')).toggleClass('hide', Boolean(year == '0000')); + this.html.find('.explorer-card__head-rate').toggleClass('hide', !Boolean(rate > 0)).find('span').text(rate.toFixed(1)); + this.html.find('.explorer-card__title').text(title).toggleClass('small', Boolean(title.length > 50)); + this.html.find('.explorer-card__descr').text(movie.overview || ''); + this.html.find('.explorer-card__genres').text(genres.join(', ')); + if (pg) this.html.find('.explorer-card__head-body').append('
' + pg + '
'); + if (this.params.noinfo) this.html.addClass('explorer--fullsize'); + this.img = this.html.find('.explorer-card__head-img > img')[0]; + this.img.style.opacity = 0; + + this.img.onload = function () { + _this2.img.style.opacity = 1; + }; + + this.img.onerror = function () { + _this2.img.src = './img/img_broken.svg'; + }; + + this.img.src = movie.poster_path ? TMDB.img(movie.poster_path, 'w300') : movie.img || './img/img_broken.svg'; + this.emit('movie'); + } + }, { + key: "appendFiles", + value: function appendFiles(element) { + this.html.find('.explorer__files-body').append(element); + } + }, { + key: "appendLeft", + value: function appendLeft(element) { + this.scroll.append(element); + } + }, { + key: "appendHead", + value: function appendHead(element) { + this.html.find('.explorer__files-head').append(element).toggleClass('hide', false); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html[0] : this.html; + } + }, { + key: "clearFiles", + value: function clearFiles() { + this.html.find('.explorer__files-body').empty(); + } + }, { + key: "clearLeft", + value: function clearLeft() { + this.scroll.clear(); + } + }, { + key: "clearHead", + value: function clearHead() { + this.html.find('.explorer__files-head').empty().toggleClass('hide', true); + } + }, { + key: "toggle", + value: function toggle() { + var _this3 = this; + + var controller = { + link: this, + toggle: function toggle() { + Controller.collectionSet(_this3.scroll.render(true)); + Controller.collectionFocus(false, _this3.scroll.render(true)); + }, + left: function left() { + Controller.toggle('menu'); + }, + up: function up() { + if (_this3.scroll.position() == 0) Controller.toggle('head');else if (_this3.scroll.position() > -170) { + _this3.scroll.wheel(_this3.scroll.position()); + + Controller.toggle('explorer'); + } else _this3.scroll.wheel(-150); + }, + right: function right() { + Controller.toggle('content'); + }, + down: function down() { + Controller.clear(); + + _this3.scroll.wheel(150); + }, + back: function back() { + Activity.backward(); + } + }; + this.emit('controller', controller); + Controller.add('explorer', controller); + Controller.toggle('explorer'); + } + }, { + key: "destroy", + value: function destroy() { + this.scroll.destroy(); + this.html.remove(); + + this.img.onerror = function () {}; + + this.img.src = ''; + this.emit('destroy'); + } + }]); + + return Explorer; + }(Emit); + + var Explorer = { + onInit: function onInit() { + this.explorer = new Explorer$1(this.object); + }, + onCreate: function onCreate() { + this.explorer.appendFiles(this.scroll.render(true)); + this.scroll.minus(this.explorer.render(true).find('.explorer__files-head')); + this.html.append(this.explorer.render(true)); + }, + onController: function onController(controller) { + var _this = this; + + controller.left = function () { + if (Navigator.canmove('left')) Navigator.move('left');else _this.explorer.toggle(); + }; + }, + onEmpty: function onEmpty() { + var _this2 = this; + + if (this.empty_class) { + this.empty_class.use({ + onController: function onController(controller) { + controller.left = function () { + if (Navigator.canmove('left')) Navigator.move('left');else _this2.explorer.toggle(); + }; + } + }); + } + } + }; + + var Loading = { + onCreate: function onCreate() { + this.activity.loader(false); + Arrays.extend(this.params, { + loading: { + icon: 'card' + } + }); + var tpl = Template.get('ai_search_animation', { + icon: Template.string('icon_' + this.params.loading.icon) + }); + this.loading = $('
'); + this.loading.append(tpl); + this.scroll.append(this.loading); + }, + onBuild: function onBuild() { + this.loading.remove(); + }, + onEmpty: function onEmpty() { + this.loading.remove(); + } + }; + + function getSmartPages(current, total) { + var maxButtons = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 7; + var pages = []; // всегда добавляем первую и последнюю страницу + + pages.push(1); + pages.push(total); // добавляем текущую страницу + + pages.push(current); // добавляем несколько вокруг текущей + + for (var i = 1; i <= 2; i++) { + if (current - i > 1) pages.push(current - i); + if (current + i < total) pages.push(current + i); + } // добавляем промежуточные диапазоны (каждые ~10%) + + + var steps = Math.max(2, Math.floor(total / (maxButtons - 2))); + + for (var _i = steps; _i < total; _i += steps) { + pages.push(Math.round(_i)); + } // удаляем дубликаты + + + pages = Arrays.unique(pages); // сортируем и возвращаем массив с "..." где пропуски + + var sorted = pages.sort(function (a, b) { + return a - b; + }); + return sorted; + } + + var Pagination = { + onBuild: function onBuild() { + this.navigator = Template.elem('div', { + "class": 'head__navigator' + }); + this.navigator.on('click', this.emit.bind(this, 'right')); + }, + onStart: function onStart() { + if (this.total_pages > 5 && this.navigator) Head.addElement(this.navigator); + }, + onPause: function onPause() { + this.navigator && this.navigator.remove(); + }, + onScroll: function onScroll() { + this.navigator && this.navigator.text((this.object.page || 1) + ' / ' + (this.total_pages || 1)); + }, + onRight: function onRight() { + var _this = this; + + if (!this.navigator) return; + var controller = Controller.enabled().name; + var current_page = parseInt(this.object.page || 1); + var pages = getSmartPages(current_page, parseInt(this.total_pages || 1), 7); + pages = pages.map(function (page) { + return { + title: Lang$1.translate('title_page') + ' ' + page, + page: page, + selected: page === current_page + }; + }); + Select.show({ + title: Lang$1.translate('title_navigation'), + items: pages, + onSelect: function onSelect(a) { + _this.object.page = a.page; + Controller.toggle(controller); + + _this.activity.refresh(); + }, + onBack: function onBack() { + Controller.toggle(controller); + } + }); + }, + onDestroy: function onDestroy() { + this.navigator && this.navigator.remove(); + } + }; + + var CategoryMap = { + Items: Items, + Create: Create, + Next: Next, + Empty: Simple, + Explorer: Explorer, + Loading: Loading, + Pagination: Pagination + }; + + var Helper$5 = new Mask(Arrays.getKeys(CategoryMap)); + Helper$5.MASK.base = Helper$5.except('Loading', 'Explorer', 'Pagination'); + + var Full = /*#__PURE__*/function (_Base) { + _inherits(Full, _Base); + + var _super = _createSuper(Full); + + function Full(object) { + var _this; + + _classCallCheck(this, Full); + + _this = _super.call(this, object); + var module = typeof _this.params.module !== 'undefined' ? _this.params.module : Helper$5.MASK.base; + Helper$5.getNames(module).map(function (name) { + return CategoryMap[name]; + }).forEach(function (mod) { + return _this.use(mod); + }); + + _this.emit('init'); + + return _this; + } + + return Full; + }(Base); + + function component$k(object) { + var comp = Utils$1.createInstance(Full, object, { + module: Helper$5.toggle(Helper$5.MASK.base, 'Pagination') + }); + comp.use({ + onCreate: function onCreate() { + Api.list(object, this.build.bind(this), this.empty.bind(this)); + }, + onNext: function onNext(resolve, reject) { + Api.list(object, resolve.bind(this), reject.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } + }); + } + }); + return comp; + } + + function component$j(object) { + var comp = Utils$1.createInstance(Full$1, object); + var next = null; + comp.use({ + onCreate: function onCreate() { + var nextCall = Api.category(object, this.build.bind(this), this.empty.bind(this)); + if (typeof nextCall == 'function') next = nextCall; + }, + onNext: function onNext(resolve, reject) { + if (next) { + next(resolve.bind(this), reject.bind(this)); + } else reject.call(this); + }, + onInstance: function onInstance(item, data) { + item.use({ + onMore: router.call.bind(router, 'category_full', _objectSpread2(_objectSpread2({}, data), {}, { + genres: object.genres + })), + onInstance: function onInstance(card, data) { + card.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } + }); + } + }); + } + }); + return comp; } function component$i(object) { - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - step: 250, - end_ratio: 2 - }); - var items = []; - var html = document.createElement('div'); - var body = document.createElement('div'); - var total_pages = 0; - var last; - var waitload; - var active = 0; + var comp = Utils$1.createInstance(Full$1, object); + comp.use({ + onCreate: function onCreate() { + var _this = this; - this.create = function () {}; + Api.person(object, function (data) { + if (data.person) { + var lines = []; + lines.push({ + results: [], + params: { + module: Helper$b.toggle(Helper$b.MASK.none, 'Event'), + emit: { + onCreate: function onCreate() { + this.person = Utils$1.createInstance(Person, data.person, { + module: Helper$7.only('About') + }); + this.person.create(); + this.scroll.append(this.person.render(true)); + }, + onToggle: function onToggle() { + data.person.profile_path && Background.change(Api.img(data.person.profile_path, 'w200')); + }, + onDestroy: function onDestroy() { + var _this$person; - this.empty = function () { - var button; - - if (object.source == 'tmdb') { - button = $(''); - button.find('.selector').on('hover:enter', function () { - Storage.set('source', 'cub'); - Activity$1.replace({ - source: 'cub' - }); - }); - } - - var empty = new Empty(); - if (button) empty.append(button); - empty.addInfoButton(); - html.appendChild(empty.render(true)); - this.start = empty.start; - this.activity.loader(false); - this.activity.toggle(); - }; - - this.next = function () { - var _this = this; - - if (waitload) return; - - if (object.page < total_pages) { - waitload = true; - object.page++; - this.nextPageReuest(object, function (result) { - _this.append(result, true); - - waitload = false; - - _this.limit(); - }, function () { - waitload = false; - }); - } - }; - - this.nextPageReuest = function (object, resolve, reject) { - Api.list(object, resolve.bind(this), reject.bind(this)); - }; - - this.append = function (data, append) { - var _this2 = this; - - data.results.forEach(function (element) { - var params = { - object: object, - card_category: typeof data.card_category == 'undefined' ? true : data.category, - card_wide: data.wide, - card_small: data.small, - card_broad: data.broad, - card_collection: data.collection, - card_events: data.card_events - }; - var card = data.cardClass ? data.cardClass(element, params) : element.cardClass ? element.cardClass(element, params) : new Card(element, params); - card.create(); - - card.onFocus = function (target, card_data) { - last = target; - active = items.indexOf(card); - scroll.update(card.render(true)); - Background.change(Utils$2.cardImgBackground(card_data)); - }; - - card.onTouch = function (target, card_data) { - last = target; - active = items.indexOf(card); - }; - - card.onEnter = function (target, card_data) { - last = target; - - if (typeof card_data.gender !== 'undefined') { - Activity$1.push({ - url: element.url, - title: Lang.translate('title_person'), - component: 'actor', - id: element.id, - source: element.source || object.source + (_this$person = this.person) === null || _this$person === void 0 ? void 0 : _this$person.destroy(); + } + } + } }); + + if (data.credits && data.credits.knownFor && data.credits.knownFor.length > 0) { + for (var i = 0; i < data.credits.knownFor.length; i++) { + var departament = data.credits.knownFor[i]; + var credits = departament.credits.map(function (a) { + a.time_sort = new Date(a.first_air_date || a.release_date || '').getTime(); + return a; + }); + credits.sort(function (a, b) { + return b.time_sort - a.time_sort; + }); + + if (credits.length > 0) { + lines.push({ + title: departament.name + ' (' + credits.length + ')', + results: credits, + params: { + module: Helper$b.toggle(Helper$b.MASK.base, 'More', 'Event') + } + }); + } + } + } + + if (lines.length) _this.build(lines);else _this.empty(); } else { - Activity$1.push({ - url: card_data.url, - component: 'full', - id: element.id, - method: card_data.name ? 'tv' : 'movie', - card: element, - source: element.source || object.source + _this.empty(); + } + }, this.empty.bind(this)); + }, + onInstance: function onInstance(item) { + item.use({ + onInstance: function onInstance(card, data) { + card.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } }); } - }; - - body.appendChild(card.render(true)); - items.push(card); - if (_this2.cardRender) _this2.cardRender(object, element, card); - if (append) Controller.collectionAppend(card.render(true)); - }); - }; - - this.limit = function () { - var limit_view = 12; - var lilit_collection = 36; - var colection = items.slice(Math.max(0, active - limit_view), active + limit_view); - items.forEach(function (item) { - if (colection.indexOf(item) == -1) { - item.render(true).classList.remove('layer--render'); - } else { - item.render(true).classList.add('layer--render'); - } - }); - Navigator.setCollection(items.slice(Math.max(0, active - lilit_collection), active + lilit_collection).map(function (c) { - return c.render(true); - })); - Navigator.focused(last); - Layer.visible(scroll.render(true)); - }; - - this.build = function (data) { - var _this3 = this; - - if (data.results.length) { - total_pages = data.total_pages; - body.classList.add('category-full'); - scroll.minus(); - scroll.onEnd = this.next.bind(this); - scroll.onScroll = this.limit.bind(this); - - scroll.onWheel = function (step) { - if (!Controller.own(_this3)) _this3.start(); - if (step > 0) Navigator.move('down');else Navigator.move('up'); - }; - - this.append(data); - scroll.append(body); - html.appendChild(scroll.render(true)); - this.limit(); - this.activity.loader(false); - this.activity.toggle(); - } else { - this.empty(); + }); } - }; - - this.start = function () { - var _this4 = this; - - Controller.add('content', { - link: this, - toggle: function toggle() { - if (_this4.activity.canRefresh()) return false; - Controller.collectionSet(scroll.render(true)); - Controller.collectionFocus(last || false, scroll.render(true)); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - right: function right() { - if (_this4.onRight) { - if (Navigator.canmove('right')) Navigator.move('right');else _this4.onRight(); - } else Navigator.move('right'); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.refresh = function () { - this.activity.needRefresh(); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function (js) { - return js ? html : $(html); - }; - - this.destroy = function () { - network.clear(); - Arrays.destroy(items); - scroll.destroy(); - html.remove(); - body.remove(); - items = []; - }; - } - - function component$h(object) { - var comp = new component$i(object); - - comp.create = function () { - this.activity.loader(true); - Api.list(object, this.build.bind(this), this.empty.bind(this)); - }; - - return comp; - } - - function component$g(object) { - var comp = new Lampa.InteractionMain(object); - - comp.create = function () { - this.activity.loader(true); - var next = Api.category(object, this.build.bind(this), this.empty.bind(this)); - if (typeof next == 'function') this.next = next; - return this.render(); - }; - - return comp; - } - - function create$7(data) { - var html; - var last; - var subscribed = Storage.get('person_subscribes_id', '[]').find(function (a) { - return a == data.id; }); - var network = new create$e(); + return comp; + } - this.create = function () { + var Router = { + onEmpty: function onEmpty(e) { var _this = this; - html = Template.get('person_start', { - name: data.name, - birthday: data.birthday ? Utils$2.parseTime(data.birthday).full : Lang.translate('player_unknown'), - img: data.profile_path ? Api.img(data.profile_path) : data.img || 'img/img_broken.svg', - place: data.place_of_birth || Lang.translate('player_unknown') - }); - if (window.lampa_settings.account_use) this.substatus(); - html.find('.button--info').on('hover:enter', function () { - if (data.biography) { - Modal.open({ - title: data.name, - size: 'large', - html: $('
' + data.biography + '
'), - onBack: function onBack() { - Modal.close(); - Controller.toggle('content'); - }, - onSelect: function onSelect() { - Modal.close(); - Controller.toggle('content'); - } - }); - } else { - Noty.show(Lang.translate('empty_title_two')); + Arrays.extend(this.params, { + empty: { + width: 'medium', + buttons: [] } - }).on('hover:focus', function (e) { - last = e.target; }); + var params = this.params.empty; - if (window.lampa_settings.account_use) { - html.find('.button--subscribe').on('hover:enter', function () { - var subscribes = Storage.get('person_subscribes_id', '[]'); - subscribed = subscribes.find(function (a) { - return a == data.id; - }); - if (!subscribed && !Account.hasPremium()) return Account.showCubPremium(); - var account = Account.logged() ? Storage.get('account', '{}') : false; - if (!account) return Account.showNoAccount(); - network.silent(Utils$2.protocol() + object$2.cub_domain + '/api/person/' + (subscribed ? 'unsubscribe' : 'subscribe'), function (result) { - if (subscribed) Arrays.remove(subscribes, data.id);else if (subscribes.indexOf(data.id) == -1) subscribes.push(data.id); - Storage.set('person_subscribes_id', subscribes); - subscribed = subscribes.find(function (a) { - return a == data.id; - }); + if (params.router == 'subscribe') { + params.title = Lang$1.translate('empty_subscribes_title'); + params.descr = Lang$1.translate('empty_subscribes_text'); + params.icon = Template.string('icon_empty_subscribe'); + } - _this.substatus(); - }, function (err) { - if (err.responseJSON && err.responseJSON.code == 555) Account.showCubPremium();else Noty.show(Lang.translate('subscribe_error')); - }, { - person: JSON.stringify(data) - }, { - headers: { - token: account.token - } - }); - }).on('hover:focus', function (e) { - last = e.target; + if (params.router == 'bookmarks') { + params.title = Lang$1.translate('empty_bookmark_title'); + params.descr = Lang$1.translate('empty_bookmark_text'); + params.icon = Template.string('icon_empty_bookmarks'); + } + + if (params.router == 'favorites') { + params.title = Lang$1.translate(params.type == 'history' ? 'empty_history_title' : 'empty_bookmark_title'); + params.icon = Template.string(params.type == 'history' ? 'icon_empty_history' : 'icon_empty_bookmarks'); + if (params.type == 'history') params.descr = Lang$1.translate('empty_history_text');else params.descr = Lang$1.translate('empty_bookmark_text'); + } + + if (params.router == 'mytorrents') { + params.title = Lang$1.translate('empty_mytorrents_title'); + params.descr = Lang$1.translate('empty_mytorrents_text'); + params.icon = Template.string('icon_empty_torrents'); + } + + if (params.account && !permit.token) { + params.buttons.push({ + title: Lang$1.translate('settings_cub_signin_button'), + onEnter: function onEnter() { + Device.login(_this.start.bind(_this)); + } }); - } else html.find('.button--subscribe').remove(); - }; - - this.substatus = function () { - html.find('.button--subscribe path:eq(1)').attr('fill', subscribed ? 'currentColor' : 'transparent'); - html.find('.button--subscribe span').text(Lang.translate(subscribed ? 'title_unsubscribe' : 'title_subscribe')); - }; - - this.toggle = function () { - var _this2 = this; - - Controller.add('full_start', { - toggle: function toggle() { - Controller.collectionSet(_this2.render()); - Controller.collectionFocus(last, _this2.render()); - }, - update: function update() {}, - right: function right() { - Navigator.move('right'); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: this.onDown, - up: this.onUp, - gone: function gone() {}, - back: this.onBack - }); - Controller.toggle('full_start'); - }; - - this.render = function () { - return html; - }; - - this.destroy = function () { - last = null; - html.remove(); - }; - } - - var components = { - start: create$7, - line: create$i + } + } }; - function component$f(object) { - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - scroll_by_item: true - }); - var items = []; - var active = 0; - var poster; + /** + * Компонент избранного, просмотр папки или истории + * @param {*} object + * @returns + */ - this.create = function () { - var _this = this; - - this.activity.loader(true); - scroll.minus(); - Api.person(object, function (data) { - _this.activity.loader(false); - - if (data.person) { - poster = data.person.profile_path; - - _this.build('start', data.person); - - if (data.credits && data.credits.knownFor && data.credits.knownFor.length > 0) { - for (var i = 0; i < data.credits.knownFor.length; i++) { - var departament = data.credits.knownFor[i]; - var credits = departament.credits.map(function (a) { - a.time_sort = new Date(a.first_air_date || a.release_date || '').getTime(); - return a; - }); - credits.sort(function (a, b) { - return b.time_sort - a.time_sort; - }); - - _this.build('line', { - title: departament.name, - noimage: true, - results: credits - }); - } - } - - Layer.update(scroll.render(true)); - Layer.visible(scroll.render(true)); - - _this.activity.toggle(); - } else { - _this.empty(); - } - }, this.empty.bind(this)); - return this.render(); - }; - - this.empty = function () { - var empty = new Empty(); - scroll.append(empty.render()); - this.start = empty.start; - this.activity.loader(false); - this.activity.toggle(); - }; - - this.build = function (name, data) { - var item = new components[name](data, { - object: object, - nomore: true - }); - item.onDown = this.down; - item.onUp = this.up; - item.onBack = this.back; - - item.onToggle = function () { - active = items.indexOf(item); - }; - - items.push(item); - item.create(); - scroll.append(item.render()); - }; - - this.down = function () { - active++; - active = Math.min(active, items.length - 1); - scroll.update(items[active].render()); - items[active].toggle(); - }; - - this.up = function () { - active--; - - if (active < 0) { - active = 0; - Controller.toggle('head'); - } else { - items[active].toggle(); - scroll.update(items[active].render()); + function component$h(object) { + var comp = Utils$1.createInstance(Full, object, { + module: Helper$5.toggle(Helper$5.MASK.base, 'Pagination'), + empty: { + type: object.type, + router: 'favorites' } - }; - - this.back = function () { - Activity$1.backward(); - }; - - this.start = function () { - if (Activity$1.active().activity == this.activity && poster) Background.immediately(poster ? Api.img(poster, 'w200') : ''); - Controller.add('content', { - toggle: function toggle() { - if (items.length) { - items[active].toggle(); - } else { - Controller.collectionSet(scroll.render()); - Controller.collectionFocus(false, scroll.render()); + }); + comp.use(Router, 0); + comp.use({ + onCreate: function onCreate() { + Api.favorite(object, this.build.bind(this), this.empty.bind(this)); + }, + onNext: function onNext(resolve, reject) { + Api.favorite(object, resolve.bind(this), reject.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); } - }, - update: function update() {}, - left: function left() { - Controller.toggle('menu'); - }, - up: function up() { - Controller.toggle('head'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function () { - return scroll.render(); - }; - - this.destroy = function () { - network.clear(); - Arrays.destroy(items); - scroll.destroy(); - items = []; - }; - } - - function component$e(object) { - var comp = new component$i(object); - - comp.create = function () { - this.activity.loader(true); - Api.favorite(object, this.build.bind(this), this.empty.bind(this)); - }; - - comp.nextPageReuest = function (object, resolve, reject) { - Api.favorite(object, resolve.bind(this), reject.bind(this)); - }; - - if (object.type == 'history') { - comp.cardRender = function (object, data, card) { - card.onMenuShow = function (menu_list) { - menu_list.push({ - title: Lang.translate('menu_history'), - separator: true - }); - menu_list.push({ - title: Lang.translate('fav_clear_title'), - subtitle: Lang.translate('fav_clear_descr'), - all: true - }); - menu_list.push({ - title: Lang.translate('fav_clear_label_title'), - subtitle: Lang.translate('fav_clear_label_descr'), - label: true - }); - menu_list.push({ - title: Lang.translate('fav_clear_time_title'), - subtitle: Lang.translate('fav_clear_time_descr'), - timecode: true - }); - }; - - card.onMenuSelect = function (action) { - if (action.all) { - Favorite.clear('history'); - Lampa.Activity.replace({}); - } else if (action.label) { - Storage.set('online_view', []); - Storage.set('torrents_view', []); - Noty.show(Lang.translate('fav_label_cleared')); - } else if (action.timecode) { - Storage.set('file_view', {}); - Noty.show(Lang.translate('fav_time_cleared')); - } - }; - }; - } - + }); + } + }); return comp; } - function create$6() { + /** + * Отображает полноэкранный ввод текста с виртуальной клавиатурой + * @param {object} [params] - параметры + * @param {string} [params.input] - начальный текст + * @param {function} params.onSearch - вызывается при подтверждении ввода + * @param {function} params.onBack - вызывается при отмене ввода + * @return {void} + */ + + function SearchInput() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var search = Template.get('search_box'); var input = ''; @@ -28940,14 +32950,14 @@ if (input) { search.find('.search-box__input').toggleClass('filled', true).html(input.replace(/\s/g, ' ')); } else { - search.find('.search-box__input').toggleClass('filled', false).text(Lang.translate('search_input') + '...'); + search.find('.search-box__input').toggleClass('filled', false).text(Lang$1.translate('search_input') + '...'); } } if (Storage.field('keyboard_type') !== 'lampa') search.find('.search-box__input').hide(); $('body').append(search); $('body').toggleClass('ambience--enable', true); - var keyboard = new create$2({ + var keyboard = new Keyboard({ layout: 'clarify' }); keyboard.create(); @@ -28967,22 +32977,32 @@ keyboard.toggle(); } - function create$5() { + /** + * Фильтр + * @param {object} params - параметры фильтра + * @param {string} params.search - текущий поисковый запрос + * @param {object} params.movie - информация о фильме/сериале + * @param {string} params.search_one - основной поисковый запрос + * @param {string} params.search_two - дополнительный поисковый запрос + * @returns {Filter} - экземпляр класса Filter + */ + + function Filter() { var _this2 = this; var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var line = Template.get('filter').addClass('torrent-filter'); - var empty = $(''); + var empty = $(''); var data = { sort: [], filter: [] }; var similars = []; - var buttons_scroll = new create$f({ + var buttons_scroll = new Scroll({ horizontal: true, nopadding: true }); - if (typeof params.search == 'string') line.find('.filter--search div').text(Utils$2.shortText(params.search, 20)).removeClass('hide'); + if (typeof params.search == 'string') line.find('.filter--search div').text(Utils$1.shortText(params.search, 20)).removeClass('hide'); function selectSearch() { var _this = this; @@ -28991,13 +33011,13 @@ var year = ((params.movie ? params.movie.first_air_date || params.movie.release_date : '0000') + '').slice(0, 4); var earlier = Storage.get('user_clarifys', '{}')[params.movie.id]; search.push({ - title: Lang.translate('filter_set_name'), + title: Lang$1.translate('filter_set_name'), query: '' }); if (earlier) { search.push({ - title: Lang.translate('search'), + title: Lang$1.translate('search'), separator: true }); earlier.map(function (a) { @@ -29012,7 +33032,7 @@ if (params.movie.names && params.movie.names.length) { search.push({ - title: Lang.translate('filter_alt_names'), + title: Lang$1.translate('filter_alt_names'), separator: true }); params.movie.names.forEach(function (n) { @@ -29039,7 +33059,7 @@ } search.push({ - title: Lang.translate('filter_combinations'), + title: Lang$1.translate('filter_combinations'), separator: true }); @@ -29087,12 +33107,12 @@ if (elem.selected) selected = true; }); Select.show({ - title: Lang.translate('filter_clarify'), + title: Lang$1.translate('filter_clarify'), items: search, onBack: this.onBack, onSelect: function onSelect(a) { if (!a.query) { - new create$6({ + new SearchInput({ input: params.search, onSearch: function onSearch(new_query) { var earliers = Storage.get('user_clarifys', '{}'); @@ -29117,10 +33137,10 @@ empty.on('hover:enter', selectSearch.bind(this)); line.find('.filter--search').on('hover:enter', selectSearch.bind(this)); line.find('.filter--sort').on('hover:enter', function () { - _this2.show(Lang.translate('filter_sorted'), 'sort'); + _this2.show(Lang$1.translate('filter_sorted'), 'sort'); }); line.find('.filter--filter').on('hover:enter', function () { - _this2.show(Lang.translate('filter_filtred'), 'filter'); + _this2.show(Lang$1.translate('filter_filtred'), 'filter'); }); buttons_scroll.append(line); @@ -29128,10 +33148,10 @@ if (params.movie && params.movie.id) { line.prepend(Template.get('explorer_button_back')); line.find('.filter--back').on('hover:enter', function () { - if (Activity$1.all().length > 1) { - Activity$1.back(); + if (Activity.all().length > 1) { + Activity.back(); } else { - Activity$1.push({ + Activity.push({ url: params.movie.url, component: 'full', id: params.movie.id, @@ -29227,7 +33247,7 @@ }; this.chosen = function (type, select) { - line.find('.filter--' + type + ' > div').html(Utils$2.shortText(select.join(', '), 25)).toggleClass('hide', select.length ? false : true); + line.find('.filter--' + type + ' > div').html(Utils$1.shortText(select.join(', '), 25)).toggleClass('hide', select.length ? false : true); }; this.destroy = function () { @@ -29240,66 +33260,6 @@ }; } - var html$7 = $("
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
"); - var body = html$7.find('.helper__text'), - time; - var memorys = {}; - var remember = 1000 * 60 * 60 * 14; - - function show$4(name, text, elem) { - if (!Storage.field('helper')) return; - var help = memorys[name]; - - if (!help) { - help = { - time: 0, - count: 0 - }; - if (_typeof(memorys) !== 'object') memorys = {}; //хз, вылазит ошибка, что в переменную true нельзя записать значение, откуда там true хз - - memorys[name] = help; - } - - if (help.time + remember < Date.now() && help.count < 3) { - help.time = Date.now(); - help.count++; - Storage.set('helper', memorys); - clearTimeout(time); - time = setTimeout(function () { - html$7.removeClass('helper--visible'); - }, 10000); - body.html(text); - html$7.addClass('helper--visible'); - - if (elem) { - var blink = $(''); - elem.append(blink); - setTimeout(function () { - blink.remove(); - }, 3000); - } - } - } - - function init$r() { - memorys = Storage.cache('helper', 300, {}); - Settings.listener.follow('open', function (e) { - if (e.name == 'more') { - e.body.find('.helper--start-again').on('hover:enter', function () { - memorys = {}; - Storage.set('helper', memorys); - Noty.show(Lang.translate('helper_cleared')); - }); - } - }); - $('body').append(html$7); - } - - var Helper = { - show: show$4, - init: init$r - }; - var SERVER = {}; var timers = {}; var callback$1; @@ -29309,7 +33269,7 @@ var formats = ['asf', 'wmv', 'divx', 'avi', 'mp4', 'm4v', 'mov', '3gp', '3g2', 'mkv', 'trp', 'tp', 'mts', 'mpg', 'mpeg', 'dat', 'vob', 'rm', 'rmvb', 'm2ts', 'ts']; var formats_individual = ['vob', 'm2ts']; - function start$4(element, movie) { + function start$3(element, movie) { SERVER.object = element; if (movie) SERVER.movie = movie; @@ -29323,7 +33283,7 @@ } else install(); } - function open$2(hash, movie) { + function open$4(hash, movie) { SERVER.hash = hash; if (movie) SERVER.movie = movie; @@ -29344,7 +33304,7 @@ mask: true, onBack: function onBack() { Modal.close(); - close$3(); + close$5(); } }); } @@ -29373,8 +33333,8 @@ //Torserver.error() var jac = Storage.field('parser_torrent_type') == 'jackett'; var tpl = Template.get('torrent_nohash', { - title: Lang.translate('title_error'), - text: Lang.translate('torrent_parser_no_hash'), + title: Lang$1.translate('title_error'), + text: Lang$1.translate('torrent_parser_no_hash'), url: SERVER.object.MagnetUri || SERVER.object.Link, echo: echo }); @@ -29396,8 +33356,8 @@ if (repeat >= 45) { Modal.update(Template.get('error', { - title: Lang.translate('title_error'), - text: Lang.translate('torrent_parser_timeout') + title: Lang$1.translate('title_error'), + text: Lang$1.translate('torrent_parser_timeout') })); Torserver.clear(); Torserver.drop(SERVER.hash); @@ -29427,7 +33387,7 @@ }); return an.localeCompare(bn); }); - var active = Activity$1.active(), + var active = Activity.active(), movie = active.movie || SERVER.movie || {}; var plays = Torserver.clearFileName(files.filter(function (a) { var exe = a.path.split('.').pop().toLowerCase(); @@ -29449,14 +33409,14 @@ if (seasons.length) { Api.seasons(movie, seasons, function (data) { - list(plays, { + list$1(plays, { movie: movie, seasons: data, files: files }); }); } else { - list(plays, { + list$1(plays, { movie: movie, files: files }); @@ -29493,12 +33453,12 @@ if (need_preload) { var checkout; - var network = new create$e(); + var network = new Request(); var first = true; - Loading.start(function () { + Loading$1.start(function () { clearInterval(checkout); network.clear(); - Loading.stop(); + Loading$1.stop(); }); var update = function update() { @@ -29506,15 +33466,15 @@ network.silent(first ? data.url : data.url.replace('preload', 'stat'), function (res) { var pb = res.preloaded_bytes || 0, ps = res.preload_size || 0, - sp = res.download_speed ? Utils$2.bytesToSize(res.download_speed * 8, true) : '0.0'; + sp = res.download_speed ? Utils$1.bytesToSize(res.download_speed * 8, true) : '0.0'; var progress = Math.min(100, pb * 100 / ps); if (progress >= 95 || isNaN(progress)) { - Loading.stop(); + Loading$1.stop(); clearInterval(checkout); run(); } else { - Loading.setText(Math.round(progress) + '%' + ' - ' + sp); + Loading$1.setText(Math.round(progress) + '%' + ' - ' + sp); } }); first = false; @@ -29525,14 +33485,15 @@ } else run(); } - function list(items, params) { + function list$1(items, params) { var html = $('
'); var playlist = []; var scroll_to_element; var first_item; Lampa.Listener.send('torrent_file', { type: 'list_open', - items: items + items: items, + params: params }); var folder = ''; items.forEach(function (element, inx) { @@ -29544,14 +33505,14 @@ path: element.path, is_file: formats_individual.indexOf(exe) >= 0 }); - var view = Timeline$1.view(info.hash); + var view = Timeline.view(info.hash); var item; Arrays.extend(element, { season: info.season, episode: info.episode, title: element.path_human, first_title: params.movie.name || params.movie.title, - size: Utils$2.bytesToSize(element.length), + size: Utils$1.bytesToSize(element.length), url: Torserver.stream(element.path, SERVER.hash, element.id), torrent_hash: SERVER.hash, ffprobe: SERVER.object && SERVER.object.ffprobe ? SERVER.object.ffprobe : false, @@ -29573,7 +33534,7 @@ if (episode) { element.title = info.episode + ' / ' + episode.name; - element.air_date = Utils$2.parseTime(episode.air_date).full; + element.air_date = Utils$1.parseTime(episode.air_date).full; element.fname = episode.name; if (episode.still_path) element.img = Api.img(episode.still_path);else if (episode.img) element.img = episode.img; } @@ -29581,10 +33542,10 @@ if (info.episode) { item = Template.get('torrent_file_serial', element); - item.find('.torrent-serial__content').append(Timeline$1.render(view)); + item.find('.torrent-serial__content').append(Timeline.render(view)); } else { item = Template.get('torrent_file', element); - item.append(Timeline$1.render(view)); + item.append(Timeline.render(view)); } } else if (items.length == 1 && params.movie && !params.movie.name) { element.fname = params.movie.title || element.title; @@ -29592,10 +33553,10 @@ item = Template.get('torrent_file_serial', element); item.find('.torrent-serial__line').empty().text(params.movie.tagline || ''); item.find('.torrent-serial__episode').remove(); - item.find('.torrent-serial__content').append(Timeline$1.render(view)); + item.find('.torrent-serial__content').append(Timeline.render(view)); } else { item = Template.get('torrent_file', element); - item.append(Timeline$1.render(view)); + item.append(Timeline.render(view)); if (params.movie.title) element.title = params.movie.title; } @@ -29639,39 +33600,40 @@ type: 'onenter', element: element, item: item, - items: items + items: items, + params: params }); }); }).on('hover:long', function () { stopAutostart(); var enabled = Controller.enabled().name; var menu = [{ - title: Lang.translate('time_reset'), + title: Lang$1.translate('time_reset'), timeclear: true }]; if (Platform.is('webos')) { menu.push({ - title: Lang.translate('player_lauch') + ' - WebOS', + title: Lang$1.translate('player_lauch') + ' - WebOS', player: 'webos' }); } if (Platform.is('android')) { menu.push({ - title: Lang.translate('player_lauch') + ' - Android', + title: Lang$1.translate('player_lauch') + ' - Android', player: 'android' }); } menu.push({ - title: Lang.translate('player_lauch') + ' - Lampa', + title: Lang$1.translate('player_lauch') + ' - Lampa', player: 'lampa' }); if (!Platform.tv()) { menu.push({ - title: Lang.translate('copy_link'), + title: Lang$1.translate('copy_link'), link: true }); } @@ -29681,10 +33643,11 @@ element: element, item: item, menu: menu, - items: items + items: items, + params: params }); Select.show({ - title: Lang.translate('title_action'), + title: Lang$1.translate('title_action'), items: menu, onBack: function onBack() { Controller.toggle(enabled); @@ -29695,14 +33658,14 @@ view.time = 0; view.duration = 0; element.timeline = view; - Timeline$1.update(view); + Timeline.update(view); } if (a.link) { - Utils$2.copyTextToClipboard(element.url.replace('&preload', '&play'), function () { - Noty.show(Lang.translate('copy_secuses')); + Utils$1.copyTextToClipboard(element.url.replace('&preload', '&play'), function () { + Noty.show(Lang$1.translate('copy_secuses')); }, function () { - Noty.show(Lang.translate('copy_error')); + Noty.show(Lang$1.translate('copy_error')); }); } @@ -29719,9 +33682,9 @@ type: 'onfocus', element: element, item: item, - items: items + items: items, + params: params }); - Helper.show('torrents_view', Lang.translate('helper_torrents_view'), item); }).on('visible', function () { var img = item.find('img'); @@ -29743,13 +33706,14 @@ type: 'render', element: element, item: item, - items: items + items: items, + params: params }); }); if (items.length == 0) html = Template.get('error', { - title: Lang.translate('empty_title'), - text: Lang.translate('torrent_parser_nofiles') - });else Modal.title(Lang.translate('title_files')); + title: Lang$1.translate('empty_title'), + text: Lang$1.translate('torrent_parser_nofiles') + });else Modal.title(Lang$1.translate('title_files')); if (playlist.length == 1) autostart(first_item); Modal.update(html); if (scroll_to_element) Controller.collectionFocus(scroll_to_element, Modal.scroll().render()); @@ -29791,7 +33755,7 @@ callback_back = call; } - function close$3() { + function close$5() { Torserver.drop(SERVER.hash); Torserver.clear(); clearInterval(timers.files); @@ -29811,62 +33775,792 @@ } var Torrent = { - start: start$4, - open: open$2, + start: start$3, + open: open$4, opened: opened, back: back$4 }; - var url; - var network$3 = new create$e(); + function Results(source) { + var timer, + html = Template.elem('div'), + items = [], + active = 0, + query; + var source_name = 'search_' + source.title.toLowerCase(); + this.listener = Subscribe$2(); + this.params = source.params; - function init$q() { + this.create = function () { + this.empty(); + }; + + this.recall = function (last_query) { + var _this = this; + + console.log('recall', source_name + '_' + (last_query || 'last')); + Cache.getData('other', source_name + '_' + (last_query || 'last'), 60 * 24).then(function (data) { + _this.clear(); + + html.empty(); + source.onRecall && source.onRecall(data, last_query); + data.forEach(_this.build.bind(_this)); + + _this.listener.send('finded', { + count: _this.count(data), + data: data + }); + })["catch"](function () {}); + }; + + this.empty = function () { + html.empty().append($('
' + Lang$1.translate(query ? source.params.nofound || 'search_nofound' : source.params.start_typing || 'search_start_typing') + '
')); + }; + + this.loading = function () { + this.listener.send('start'); + html.empty().append($('
' + Lang$1.translate('search_searching') + '
')); + }; + + this.cancel = function () { + clearTimeout(timer); + if (source.onCancel) source.onCancel(); + }; + + this.search = function (value, immediately) { + var _this2 = this; + + clearTimeout(timer); + + if (value.length >= 3) { + timer = setTimeout(function () { + if (query == value) return; + query = value; + + _this2.loading(); + + source.search({ + query: encodeURIComponent(value) + }, function (data) { + _this2.clear(); + + _this2.dmca(data); + + var count = _this2.count(data); + + if (count > 0) { + html.empty(); + var copy = Arrays.clone(data); + Cache.rewriteData('other', source_name + '_' + value, copy)["catch"](function () {}); + Cache.rewriteData('other', source_name + '_last', copy)["catch"](function () {}); + data.forEach(_this2.build.bind(_this2)); + } else _this2.empty(); + + _this2.listener.send('finded', { + count: count, + data: data + }); + }); + }, immediately ? 10 : 2500); + } else { + query = value; + this.clear(); + if (!value) this.recall(''); + } + }; + + this.count = function (result) { + var count = 0; + result.forEach(function (data) { + count += data.results.length; + }); + return count; + }; + + this.dmca = function (result) { + if (Arrays.isArray(window.lampa_settings.dcma)) { + result.forEach(function (data) { + data.results = data.results.filter(function (item) { + return !window.lampa_settings.dcma.find(function (b) { + return b.id == item.id && b.cat == (item.name ? 'tv' : 'movie'); + }); + }); + }); + } + }; + + this.build = function (data) { + var _this3 = this; + + data.noimage = true; + source.params.card_view = 6; + + if (Arrays.isArray(window.lampa_settings.dcma)) { + data.results = data.results.filter(function (item) { + return !window.lampa_settings.dcma.find(function (b) { + return b.id == item.id && b.cat == (item.name ? 'tv' : 'movie'); + }); + }); + } + + var line = Utils$1.createInstance(Line$5, data, _objectSpread2(_objectSpread2({}, source.params), {}, { + module: Helper$b.only('Items', 'Create', 'More') + })); + line.use({ + onDown: this.down.bind(this), + onUp: this.up.bind(this), + onBack: this.back.bind(this), + onMore: function onMore() { + if (source.onMore) source.onMore({ + data: data, + line: line, + query: query + }, function () { + _this3.listener.send('select'); + }); + }, + onInstance: function onInstance(item, item_data) { + item.use({ + onEnter: function onEnter() { + if (source.onSelect) { + source.onSelect({ + data: data, + line: line, + query: query, + element: item_data, + item_data: item_data + }, function () { + _this3.listener.send('select'); + }); + } else { + _this3.listener.send('select'); + + router.call('full', item_data); + } + } + }); + } + }); + if (source.onRender) source.onRender(line); + line.create(); + items.push(line); + html.append(line.render(true)); + }; + + this.any = function () { + return items.length; + }; + + this.back = function () { + this.listener.send('back'); + }; + + this.down = function () { + active++; + active = Math.min(active, items.length - 1); + items[active].toggle(); + this.listener.send('toggle', { + element: items[active].render() + }); + }; + + this.up = function () { + active--; + if (active < 0) this.listener.send('up'); + + if (active < 0) { + active = 0; + } else { + items[active].toggle(); + this.listener.send('toggle', { + element: items[active].render() + }); + } + }; + + this.clear = function () { + this.empty(); + active = 0; + Arrays.destroy(items); + items = []; + this.listener.send('clear'); + }; + + this.toggle = function () { + var _this4 = this; + + Controller.add('search_results', { + invisible: true, + toggle: function toggle() { + Controller.collectionSet(html); + + if (items.length) { + items[active].toggle(); + + _this4.listener.send('toggle', { + element: items[active].render() + }); + } + }, + back: function back() { + _this4.listener.send('back'); + } + }); + Controller.toggle('search_results'); + }; + + this.render = function (js) { + return js ? html : $(html); + }; + + this.destroy = function () { + clearTimeout(timer); + this.clear(); + this.listener.destroy(); + }; + } + + var stop_keys = ['пор', 'порн', 'порно', 'секс', 'член', 'por', 'porn', 'porno', 'sex', 'hot', 'xxx']; + + function Sources() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var scroll, + last, + active, + last_query = ''; + var html = document.createElement('div'), + results = []; + this.listener = Subscribe$2(); + + this.create = function () { + scroll = new Scroll({ + over: true, + mask: false, + horizontal: true + }); + var sources = params.sources || Api.availableDiscovery(); + sources.forEach(this.build.bind(this)); + + if (!params.sources) { + params.additional.forEach(this.build.bind(this)); + } + + this.enable(results[0]); + + if (results.length < 2) { + scroll.render(true).addClass('hide'); + html.addClass('search__results-offset'); + } // results.forEach(source=>{ + // source.recall(last_query) + // }) + + }; + + this.enable = function (result) { + active = result; + if (active.params.lazy && last_query) active.search(last_query, true);else { + active.recall(last_query); + } + html.empty().append(result.render(true)); + scroll.render().find('.search-source').removeClass('active').eq(results.indexOf(result)).addClass('active'); + Layer.visible(result.render(true)); + }; + + this.build = function (source) { + var _this = this; + + var tab = $('
' + source.title + '
0
'); + var result = new Results(source); + result.create(); + if (source.params.lazy) tab.find('.search-source__count').remove(); + result.listener.follow('start', function () { + tab.addClass('search-source--loading'); + tab.find('.search-source__count').html(' '); + }); + result.listener.follow('clear', function () { + tab.find('.search-source__count').text(0); + }); + result.listener.follow('finded', function (e) { + tab.removeClass('search-source--loading'); + tab.find('.search-source__count').text(e.count); + if (active == result) Layer.visible(result.render(true)); + + _this.listener.send('finded', { + source: source, + result: result, + count: e.count, + data: e.data + }); + }); + result.listener.follow('up', function (e) { + if (results.length < 2) _this.listener.send('up');else _this.toggle(); + }); + result.listener.follow('select', this.listener.send.bind(this.listener, 'select')); + result.listener.follow('back', this.listener.send.bind(this.listener, 'back')); + result.listener.follow('toggle', function (e) { + _this.listener.send('toggle', { + source: source, + result: e.result, + element: e.element + }); + }); + tab.on('hover:enter', function () { + _this.enable(result); + }).on('hover:focus', function (e) { + last = e.target; + scroll.update($(e.target)); + }); + scroll.append(tab); + results.push(result); + this.listener.send('create', { + source: source, + result: result + }); + }; + + this.toggle = function (from_search) { + var _this2 = this; + + Controller.add('search_sources', { + toggle: function toggle() { + Controller.collectionSet(scroll.render(true)); + Controller.collectionFocus(last, scroll.render(true)); + if (from_search && results.length < 2 && active.any()) active.toggle(); + }, + update: function update() {}, + up: function up() { + _this2.listener.send('up'); + }, + down: function down() { + if (active.any()) active.toggle(); + }, + right: function right() { + Navigator.move('right'); + }, + left: function left() { + Navigator.move('left'); + }, + back: function back() { + _this2.listener.send('back'); + } + }); + Controller.toggle('search_sources'); + }; + + this.search = function (query, immediately) { + results.forEach(function (result) { + return result.cancel(); + }); + + if (!stop_keys.find(function (k) { + return k == query.toLowerCase(); + })) { + last_query = query; + this.listener.send('search', { + query: query, + immediately: immediately + }); + results.forEach(function (result) { + if (!result.params.lazy || active === result) result.search(query, immediately); + }); + } + }; + + this.cancel = function () { + results.forEach(function (result) { + return result.cancel(); + }); + }; + + this.tabs = function () { + return scroll.render(true); + }; + + this.render = function (js) { + return js ? html : $(html); + }; + + this.destroy = function () { + scroll.destroy(); + results.forEach(function (result) { + return result.cancel(); + }); + this.listener.destroy(); + }; + } + + function History() { + var scroll, + last, + keys = []; + this.listener = Subscribe$2(); + + this.create = function () { + var _this = this; + + scroll = new Scroll({ + over: true, + mask: false, + horizontal: true + }); + + scroll.onWheel = function (step) { + _this.toggle(); + + Controller.enabled().controller[step > 0 ? 'right' : 'left'](); + }; + + scroll.onScroll = function (step) {}; + + keys = Storage.get('search_history', '[]'); + keys.map(function (v) { + return v; + }).reverse().slice(0, 15).forEach(function (key) { + _this.append(key); + }); + if (!keys.length) scroll.append($('
' + Lang$1.translate('search_empty') + '
')); + }; + + this.append = function (value) { + var _this2 = this; + + var key = $('
' + value + '
'); + key.on('hover:enter', function () { + _this2.listener.send('enter', { + value: value + }); + }).on('hover:focus', function (e) { + last = e.target; + scroll.update($(e.target), true); + }).on('hover:long', function () { + var selc = scroll.render().find('.selector'); + Arrays.remove(keys, value); + Storage.set('search_history', keys); + Storage.remove('search_history', value); + var index = selc.index(key); + if (index > 0) last = selc.eq(index - 1)[0];else if (selc[index + 1]) last = selc.eq(index + 1)[0]; + key.remove(); + if (selc.length - 1 <= 0) last = false; + Controller.collectionFocus(last, scroll.render()); + }); + scroll.append(key); + }; + + this.add = function (value) { + var inx = keys.indexOf(value); + + if (inx == -1) { + keys.push(value); + } else { + Arrays.remove(keys, value); + keys.push(value); + } + + Storage.set('search_history', keys); + }; + + this.toggle = function () { + var _this3 = this; + + Controller.add('search_history', { + toggle: function toggle() { + Controller.collectionSet(scroll.render()); + Controller.collectionFocus(last, scroll.render()); + }, + update: function update() {}, + up: function up() { + _this3.listener.send('up'); + }, + down: function down() { + _this3.listener.send('down'); + }, + right: function right() { + Navigator.move('right'); + }, + back: function back() { + _this3.listener.send('back'); + }, + left: function left() { + Navigator.move('left'); + } + }); + Controller.toggle('search_history'); + }; + + this.any = function () { + return keys.length; + }; + + this.render = function () { + return scroll.render(); + }; + + this.destroy = function () { + scroll.destroy(); + this.listener.destroy(); + keys = null; + last = null; + }; + } + + var html$a = Template.elem('div', { + "class": 'main-search' + }), + search$1, + history, + sources, + keyboard$1, + scroll, + input$1 = '', + params$1 = {}, + additional = [], + listener$4 = Subscribe$2(); + + function init$w() { + Head.addIcon(Template.string('icon_search'), open$3).addClass('open--search'); + } + + function open$3() { + var use_params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + params$1 = use_params; + input$1 = use_params.input || ''; + $('body').toggleClass('ambience--enable', true); + $('body').toggleClass('search--open', true); + create$6(); + toggle$3(); + Layer.update(html$a); + listener$4.send('open'); + } + + function toggle$3() { + Controller.add('search', { + invisible: true, + toggle: function toggle() { + keyboard$1.toggle(); + }, + update: function update() {}, + back: destroy$3 + }); + Controller.toggle('search'); + } + + function scrollTo(element) { + scroll.update(element ? element : search$1.find('.search__input'), true); + } + + function create$6() { + search$1 = Template.get('search'); + scroll = new Scroll({ + step: 300 + }); + scroll.height(); + scroll.render().addClass('search'); + scroll.append(HeadBackward(Lang$1.translate('search'))); + scroll.append(search$1); + html$a.append(scroll.render(true)); + + scroll.onScroll = function (step) { + Layer.visible(scroll.render(true)); + }; + + if (Storage.field('keyboard_type') !== 'lampa') search$1.find('.search__input').hide(); + createKeyboard(); + createHistory(); + createSources(); + keyboard$1.value(input$1); + } + + function createSources() { + sources = new Sources({ + sources: params$1.sources, + additional: additional + }); + listener$4.send('sources', { + sources: sources + }); + sources.create(); + sources.listener.follow('back', destroy$3); + sources.listener.follow('up', function () { + if (history.any()) history.toggle();else keyboard$1.toggle(); + scrollTo(); + }); + sources.listener.follow('toggle', function (e) { + scrollTo(e.element); + }); + sources.listener.follow('select', function (e) { + if (input$1) history.add(input$1); + destroy$3(); + }); + search$1.find('.search__sources').append(sources.tabs()); + search$1.find('.search__results').append(sources.render()); + } + + function createHistory() { + history = new History(); + history.create(); + history.listener.follow('down', function () { + sources.toggle(true); + }); + history.listener.follow('up', function () { + keyboard$1.toggle(); + }); + history.listener.follow('enter', function (event) { + keyboard$1.value(event.value); + sources.search(event.value, true); + }); + history.listener.follow('back', destroy$3); + search$1.find('.search__history').append(history.render()); + } + + function createKeyboard() { + keyboard$1 = new Keyboard({ + layout: 'search' + }); + keyboard$1.create(); + keyboard$1.listener.follow('change', function (event) { + input$1 = event.value; + + if (input$1) { + search$1.find('.search__input').toggleClass('filled', true).html(input$1.replace(/\s/g, ' ')); + sources.search(input$1); + } else { + search$1.find('.search__input').toggleClass('filled', false).text(Lang$1.translate('search_input') + '...'); + sources.search(''); + } + }); + keyboard$1.listener.follow('down', function () { + if (history.any()) history.toggle();else sources.toggle(); + }); + keyboard$1.listener.follow('hover', function () { + input$1.length <= 2 ? sources.cancel() : sources.search(input$1); + }); + keyboard$1.listener.follow('back', destroy$3); + } + + function addSource(source) { + additional.push(source); + } + + function removeSource(source) { + Arrays.remove(additional, source); + } + + function render$3(js) { + return js ? html$a : $(html$a); + } + + function destroy$3() { + keyboard$1.destroy(); + history.destroy(); + sources.destroy(); + search$1.remove(); + html$a.empty(); + $('body').toggleClass('ambience--enable', false); + $('body').toggleClass('search--open', false); + if (params$1.onBack) params$1.onBack();else Controller.toggle('content'); + params$1 = {}; + input$1 = ''; + listener$4.send('close'); + } + + function close$4() { + destroy$3(); + } + + var Search = { + init: init$w, + listener: listener$4, + open: open$3, + render: render$3, + addSource: addSource, + removeSource: removeSource, + close: close$4 + }; + + var CardParser = /*#__PURE__*/function (_Constructor) { + _inherits(CardParser, _Constructor); + + var _super = _createSuper(CardParser); + + function CardParser(data) { + var _this; + + _classCallCheck(this, CardParser); + + _this = _super.call(this, data); + + _this.use(Callback$1); + + return _this; + } + + _createClass(CardParser, [{ + key: "create", + value: function create() { + this.html = Template.js('card_parser', this.data); + this.html.on('visible', this.emit.bind(this, 'visible')); + this.emit('create'); + } + }]); + + return CardParser; + }(Constructor({})); + + var url; + var network$2 = new Request(); + + function init$v() { Storage.set('parser_torrent_type', Storage.get('parser_torrent_type') || 'jackett'); var source = { - title: Lang.translate('title_parser'), + title: Lang$1.translate('title_parser'), search: function search(params, oncomplite) { - get$3({ + get$5({ search: decodeURIComponent(params.query), other: true, from_search: true }, function (json) { - json.title = Lang.translate('title_parser'); + json.Results.sort(function (a, b) { + return (b.Seeders || 0) - (a.Seeders || 0); + }); + json.title = Lang$1.translate('title_parser'); json.results = json.Results.slice(0, 20); + json.total = json.Results.length; + json.total_pages = Math.ceil(json.total / 20); json.Results = null; json.results.forEach(function (element) { - element.Title = Utils$2.shortText(element.Title, 110); + element.Title = Utils$1.shortText(element.Title, 110); + element.params = { + createInstance: function createInstance(item) { + return new CardParser(item); + } + }; }); oncomplite(json.results.length ? [json] : []); }, function () { oncomplite([]); }); }, - onCancel: function onCancel() { - network$3.clear(); + onRecall: function onRecall(data, last_query) { + data[0].results.forEach(function (element) { + element.params = { + createInstance: function createInstance(item) { + return new CardParser(item); + } + }; + }); }, + onCancel: network$2.clear.bind(network$2), params: { - lazy: true, - align_left: true, - isparser: true, - card_events: { - onMenu: function onMenu() {} - } + lazy: true }, onMore: function onMore(params, close) { close(); - Activity$1.push({ + Activity.push({ url: '', - title: Lang.translate('title_torrents'), + title: Lang$1.translate('title_torrents'), component: 'torrents', search: params.query, from_search: true, - noinfo: true, - movie: { - title: params.query, - original_title: '', - img: './img/img_broken.svg', - genres: [] - }, page: 1 }); }, @@ -29892,7 +34586,7 @@ addSource(); } - function get$3() { + function get$5() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; @@ -29907,28 +34601,28 @@ if (Storage.field('parser_torrent_type') == 'jackett') { if (Storage.field('jackett_url')) { - url = Utils$2.checkEmptyUrl(Storage.field('jackett_url')); + url = Utils$1.checkEmptyUrl(Storage.field('jackett_url')); var ignore = false; //params.from_search && !url.match(/\d+\.\d+\.\d+/g) if (ignore) error('');else { jackett(params, complite, error); } } else { - error(Lang.translate('torrent_parser_set_link') + ': Jackett'); + error(Lang$1.translate('torrent_parser_set_link') + ': Jackett'); } } else if (Storage.field('parser_torrent_type') == 'prowlarr') { if (Storage.field('prowlarr_url')) { - url = Utils$2.checkEmptyUrl(Storage.field('prowlarr_url')); + url = Utils$1.checkEmptyUrl(Storage.field('prowlarr_url')); prowlarr(params, complite, error); } else { - error(Lang.translate('torrent_parser_set_link') + ': Prowlarr'); + error(Lang$1.translate('torrent_parser_set_link') + ': Prowlarr'); } } else if (Storage.field('parser_torrent_type') == 'torrserver') { if (Storage.field(Storage.field('torrserver_use_link') == 'two' ? 'torrserver_url_two' : 'torrserver_url')) { - url = Utils$2.checkEmptyUrl(Storage.field(Storage.field('torrserver_use_link') == 'two' ? 'torrserver_url_two' : 'torrserver_url')); + url = Utils$1.checkEmptyUrl(Storage.field(Storage.field('torrserver_use_link') == 'two' ? 'torrserver_url_two' : 'torrserver_url')); torrserver(params, complite, error); } else { - error(Lang.translate('torrent_parser_set_link') + ': TorrServer'); + error(Lang$1.translate('torrent_parser_set_link') + ': TorrServer'); } } } @@ -29942,7 +34636,7 @@ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; - network$3.timeout(1000 * Storage.field('parse_timeout')); + network$2.timeout(1000 * Storage.field('parse_timeout')); var u = url + '/api/v2.0/indexers/' + (Storage.field('jackett_interview') == 'healthy' ? 'status:healthy' : 'all') + '/results?apikey=' + Storage.field('jackett_key') + '&Query=' + encodeURIComponent(params.search); if (!params.from_search) { @@ -29951,28 +34645,28 @@ }); if (!params.clarification) { - u = Utils$2.addUrlComponent(u, 'title=' + encodeURIComponent(params.movie.title)); - u = Utils$2.addUrlComponent(u, 'title_original=' + encodeURIComponent(params.movie.original_title)); + u = Utils$1.addUrlComponent(u, 'title=' + encodeURIComponent(params.movie.title)); + u = Utils$1.addUrlComponent(u, 'title_original=' + encodeURIComponent(params.movie.original_title)); } - u = Utils$2.addUrlComponent(u, 'year=' + encodeURIComponent(((params.movie.release_date || params.movie.first_air_date || '0000') + '').slice(0, 4))); - u = Utils$2.addUrlComponent(u, 'is_serial=' + (params.movie.original_name ? '2' : params.other ? '0' : '1')); - u = Utils$2.addUrlComponent(u, 'genres=' + encodeURIComponent(genres.join(','))); - u = Utils$2.addUrlComponent(u, 'Category[]=' + (params.movie.number_of_seasons > 0 ? 5000 : 2000) + (params.movie.original_language == 'ja' ? ',5070' : '')); + u = Utils$1.addUrlComponent(u, 'year=' + encodeURIComponent(((params.movie.release_date || params.movie.first_air_date || '0000') + '').slice(0, 4))); + u = Utils$1.addUrlComponent(u, 'is_serial=' + (params.movie.original_name ? '2' : params.other ? '0' : '1')); + u = Utils$1.addUrlComponent(u, 'genres=' + encodeURIComponent(genres.join(','))); + u = Utils$1.addUrlComponent(u, 'Category[]=' + (params.movie.number_of_seasons > 0 ? 5000 : 2000) + (params.movie.original_language == 'ja' ? ',5070' : '')); } - network$3["native"](u, function (json) { + network$2["native"](u, function (json) { if (json.Results) { json.Results.forEach(function (element) { - element.PublisTime = Utils$2.strToTime(element.PublishDate); - element.hash = Utils$2.hash(element.Title); + element.PublisTime = Utils$1.strToTime(element.PublishDate); + element.hash = Utils$1.hash(element.Title); element.viewed = viewed(element.hash); - element.size = Utils$2.bytesToSize(element.Size); + element.size = Utils$1.bytesToSize(element.Size); }); oncomplite(json); - } else onerror(Lang.translate('torrent_parser_no_responce') + ' (' + url + ')'); + } else onerror(Lang$1.translate('torrent_parser_no_responce') + ' (' + url + ')'); }, function (a, c) { - onerror(Lang.translate('torrent_parser_no_responce') + ' (' + url + ')'); + onerror(Lang$1.translate('torrent_parser_no_responce') + ' (' + url + ')'); }); } // доки https://wiki.servarr.com/en/prowlarr/search#search-feed @@ -30014,20 +34708,20 @@ }); } - var u = Utils$2.buildUrl(url, '/api/v1/search', q); - network$3.timeout(1000 * Storage.field('parse_timeout')); - network$3["native"](u, function (json) { + var u = Utils$1.buildUrl(url, '/api/v1/search', q); + network$2.timeout(1000 * Storage.field('parse_timeout')); + network$2["native"](u, function (json) { if (Array.isArray(json)) { oncomplite({ Results: json.filter(function (e) { return e.protocol === 'torrent'; }).map(function (e) { - var hash = Utils$2.hash(e.title); + var hash = Utils$1.hash(e.title); return { Title: e.title, Tracker: e.indexer, - size: Utils$2.bytesToSize(e.size), - PublishDate: Utils$2.strToTime(e.publishDate), + size: Utils$1.bytesToSize(e.size), + PublishDate: Utils$1.strToTime(e.publishDate), Seeders: parseInt(e.seeders), Peers: parseInt(e.leechers), MagnetUri: e.downloadUrl, @@ -30037,10 +34731,10 @@ }) }); } else { - onerror(Lang.translate('torrent_parser_request_error') + ' (' + JSON.stringify(json) + ')'); + onerror(Lang$1.translate('torrent_parser_request_error') + ' (' + JSON.stringify(json) + ')'); } }, function () { - onerror(Lang.translate('torrent_parser_no_responce') + ' (' + url + ')'); + onerror(Lang$1.translate('torrent_parser_no_responce') + ' (' + url + ')'); }); } @@ -30048,21 +34742,21 @@ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var oncomplite = arguments.length > 1 ? arguments[1] : undefined; var onerror = arguments.length > 2 ? arguments[2] : undefined; - network$3.timeout(1000 * Storage.field('parse_timeout')); - var u = Utils$2.buildUrl(url, '/search/', [{ + network$2.timeout(1000 * Storage.field('parse_timeout')); + var u = Utils$1.buildUrl(url, '/search/', [{ name: 'query', value: params.search }]); - network$3["native"](u, function (json) { + network$2["native"](u, function (json) { if (Array.isArray(json)) { oncomplite({ Results: json.map(function (e) { - var hash = Utils$2.hash(e.Title); + var hash = Utils$1.hash(e.Title); return { Title: e.Title, Tracker: e.Tracker, size: e.Size, - PublishDate: Utils$2.strToTime(e.CreateDate), + PublishDate: Utils$1.strToTime(e.CreateDate), Seeders: parseInt(e.Seed), Peers: parseInt(e.Peer), MagnetUri: e.Magnet, @@ -30073,187 +34767,395 @@ }; }) }); - } else onerror(Lang.translate('torrent_parser_request_error') + ' (' + JSON.stringify(json) + ')'); + } else onerror(Lang$1.translate('torrent_parser_request_error') + ' (' + JSON.stringify(json) + ')'); }, function (a, c) { - onerror(Lang.translate('torrent_parser_no_responce') + ' (' + url + ')'); + onerror(Lang$1.translate('torrent_parser_no_responce') + ' (' + url + ')'); }); } function clear$3() { - network$3.clear(); + network$2.clear(); } var Parser = { - init: init$q, - get: get$3, + init: init$v, + get: get$5, jackett: jackett, clear: clear$3 }; - function Explorer() { - var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var html = Template.get('explorer', {}); - var scroll = new create$f({ - mask: true, - over: true - }); - var card = html.find('.explorer__card').clone(); - html.find('.explorer__left').empty().append(scroll.render()); - scroll.append(card); - scroll.minus(); - Arrays.extend(params, { - movie: { - title: '', - original_title: '', - img: './img/img_broken.svg', - genres: [] - } - }); + var WatchedHistory = /*#__PURE__*/function () { + function WatchedHistory(movie) { + _classCallCheck(this, WatchedHistory); - if (params.movie.id) { - html.find('.selector').on('hover:enter', function () { - if (Activity$1.all().length > 1) { - Activity$1.back(); - } else { - Activity$1.push({ - url: params.movie.url, - component: 'full', - id: params.movie.id, - method: params.movie.name ? 'tv' : 'movie', - card: params.movie, - source: params.movie.source - }); - } - }); - } else { - html.find('.selector').removeClass('selector'); + this.file_id = Utils$1.hash(movie.number_of_seasons ? movie.original_name : movie.original_title); + this.html = Template.js('watched_history'); + this.update(); } - var year = ((params.movie.release_date || params.movie.first_air_date || '0000') + '').slice(0, 4); - var pg = Api.sources.tmdb.parsePG(params.movie); - var countries = Api.sources.tmdb.parseCountries(params.movie); - var img = html.find('.explorer-card__head-img > img')[0]; - var rate = parseFloat((params.movie.vote_average || 0) + ''); - var title = params.movie.title || params.movie.name || ''; - var genres = (params.movie.genres || [{ - name: '' - }]).slice(0, 3).map(function (a) { - return Utils$2.capitalizeFirstLetter(a.name); - }); - html.find('.explorer-card__head-create').text(year + (countries.length ? ' - ' + countries[0] : '')).toggleClass('hide', Boolean(year == '0000')); - html.find('.explorer-card__head-rate').toggleClass('hide', !Boolean(rate > 0)).find('span').text(rate.toFixed(1)); - html.find('.explorer-card__title').text(title).toggleClass('small', Boolean(title.length > 50)); - html.find('.explorer-card__descr').text(params.movie.overview || ''); - html.find('.explorer-card__genres').text(genres.join(', ')); - if (pg) html.find('.explorer-card__head-body').append('
' + pg + '
'); - if (params.noinfo) html.addClass('explorer--fullsize'); + _createClass(WatchedHistory, [{ + key: "set", + value: function set(_set) { + var watched = Storage.cache('online_watched_last', 5000, {}); + if (!watched[this.file_id]) watched[this.file_id] = {}; + Arrays.extend(watched[this.file_id], _set, true); + Storage.set('online_watched_last', watched); + this.update(); + } + }, { + key: "get", + value: function get() { + var watched = Storage.cache('online_watched_last', 5000, {}); + return watched[this.file_id]; + } + }, { + key: "update", + value: function update() { + var watched = this.get(); + var body = this.html.find('.watched-history__body').empty(); - img.onerror = function (e) { - img.src = './img/img_broken.svg'; - }; + if (watched) { + var line = []; + if (watched.balanser_name) line.push(watched.balanser_name); + if (watched.voice_name) line.push(watched.voice_name); + if (watched.season) line.push(Lang$1.translate('torrent_serial_season') + ' ' + watched.season); + if (watched.episode) line.push(Lang$1.translate('torrent_serial_episode') + ' ' + watched.episode); + line.forEach(function (n) { + body.append(Template.elem('span', { + text: n + })); + }); + } else body.append(Template.elem('span', { + text: Lang$1.translate('no_watch_history') + })); + } + }, { + key: "render", + value: function render(js) { + return js ? this.html : $(this.html); + } + }]); - img.src = params.movie.poster_path ? Api.img(params.movie.poster_path, 'w300') : params.movie.img; + return WatchedHistory; + }(); - this.appendFiles = function (element) { - html.find('.explorer__files-body').append(element); - }; + function Listener(movie) { + var _self = this; - this.appendHead = function (element) { - html.find('.explorer__files-head').append(element); - }; + function start(e) { + if (e.type == 'list_open') { + Lampa.Listener.follow('torrent_file', open); + } - this.render = function () { - return html; - }; + if (e.type == 'list_close') { + Lampa.Listener.remove('torrent_file', open); + } + } - this.clearFiles = function () { - html.find('.explorer__files-body').empty(); - }; + function open(e) { + if (e.type == 'onenter') { + var open_movie = e.params.movie || {}; + if (open_movie.id == movie.id) _self.listener.send('open', e); + } + } - this.clearHead = function () { - html.find('.explorer__files-head').empty(); - }; - - this.toggle = function () { - Controller.add('explorer', { - toggle: function toggle() { - Controller.collectionSet(scroll.render(true)); - Controller.collectionFocus(false, scroll.render(true)); - }, - left: function left() { - Controller.toggle('menu'); - }, - up: function up() { - if (scroll.position() == 0) Controller.toggle('head');else if (scroll.position() > -170) { - scroll.wheel(scroll.position()); - Controller.toggle('explorer'); - } else scroll.wheel(-150); - }, - right: function right() { - Controller.toggle('content'); - }, - down: function down() { - Controller.clear(); - scroll.wheel(150); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('explorer'); - }; + this.listener = Subscribe$2(); this.destroy = function () { - html.remove(); - - img.onerror = function () {}; - - img.src = ''; + Lampa.Listener.remove('torrent_file', start); + Lampa.Listener.remove('torrent_file', open); }; + + Lampa.Listener.follow('torrent_file', start); } - function component$d(object) { - var network = new create$e(); - var scroll = new create$f({ + var voices = ["Laci", "Kerob", "LE-Production", "Parovoz Production", "Paradox", "Omskbird", "LostFilm", "Причудики", "BaibaKo", "NewStudio", "AlexFilm", "FocusStudio", "Gears Media", "Jaskier", "ViruseProject", "Кубик в Кубе", "IdeaFilm", "Sunshine Studio", "Ozz.tv", "Hamster Studio", "Сербин", "To4ka", "Кравец", "Victory-Films", "SNK-TV", "GladiolusTV", "Jetvis Studio", "ApofysTeam", "ColdFilm", "Agatha Studdio", "KinoView", "Jimmy J.", "Shadow Dub Project", "Amedia", "Red Media", "Selena International", "Гоблин", "Universal Russia", "Kiitos", "Paramount Comedy", "Кураж-Бамбей", "Студия Пиратского Дубляжа", "Чадов", "Карповский", "RecentFilms", "Первый канал", "Alternative Production", "NEON Studio", "Колобок", "Дольский", "Синема УС", "Гаврилов", "Живов", "SDI Media", "Алексеев", "GreenРай Studio", "Михалев", "Есарев", "Визгунов", "Либергал", "Кузнецов", "Санаев", "ДТВ", "Дохалов", "Sunshine Studio", "Горчаков", "LevshaFilm", "CasStudio", "Володарский", "ColdFilm", "Шварко", "Карцев", "ETV+", "ВГТРК", "Gravi-TV", "1001cinema", "Zone Vision Studio", "Хихикающий доктор", "Murzilka", "turok1990", "FOX", "STEPonee", "Elrom", "Колобок", "HighHopes", "SoftBox", "GreenРай Studio", "NovaFilm", "Четыре в квадрате", "Greb&Creative", "MUZOBOZ", "ZM-Show", "RecentFilms", "Kerems13", "Hamster Studio", "New Dream Media", "Игмар", "Котов", "DeadLine Studio", "Jetvis Studio", "РенТВ", "Андрей Питерский", "Fox Life", "Рыбин", "Trdlo.studio", "Studio Victory Аsia", "Ozeon", "НТВ", "CP Digital", "AniLibria", "STEPonee", "Levelin", "FanStudio", "Cmert", "Интерфильм", "SunshineStudio", "Kulzvuk Studio", "Кашкин", "Вартан Дохалов", "Немахов", "Sedorelli", "СТС", "Яроцкий", "ICG", "ТВЦ", "Штейн", "AzOnFilm", "SorzTeam", "Гаевский", "Мудров", "Воробьев Сергей", "Студия Райдо", "DeeAFilm Studio", "zamez", "ViruseProject", "Иванов", "STEPonee", "РенТВ", "СВ-Дубль", "BadBajo", "Комедия ТВ", "Мастер Тэйп", "5-й канал СПб", "SDI Media", "Гланц", "Ох! Студия", "СВ-Кадр", "2x2", "Котова", "Позитив", "RusFilm", "Назаров", "XDUB Dorama", "Реальный перевод", "Kansai", "Sound-Group", "Николай Дроздов", "ZEE TV", "Ozz.tv", "MTV", "Сыендук", "GoldTeam", "Белов", "Dream Records", "Яковлев", "Vano", "SilverSnow", "Lord32x", "Filiza Studio", "Sony Sci-Fi", "Flux-Team", "NewStation", "XDUB Dorama", "Hamster Studio", "Dream Records", "DexterTV", "ColdFilm", "Good People", "RusFilm", "Levelin", "AniDUB", "SHIZA Project", "AniLibria.TV", "StudioBand", "AniMedia", "Kansai", "Onibaku", "JWA Project", "MC Entertainment", "Oni", "Jade", "Ancord", "ANIvoice", "Nika Lenina", "Bars MacAdams", "JAM", "Anika", "Berial", "Kobayashi", "Cuba77", "RiZZ_fisher", "OSLIKt", "Lupin", "Ryc99", "Nazel & Freya", "Trina_D", "JeFerSon", "Vulpes Vulpes", "Hamster", "KinoGolos", "Fox Crime", "Денис Шадинский", "AniFilm", "Rain Death", "LostFilm", "New Records", "Ancord", "Первый ТВЧ", "RG.Paravozik", "Profix Media", "Tycoon", "RealFake", "HDrezka", "Jimmy J.", "AlexFilm", "Discovery", "Viasat History", "AniMedia", "JAM", "HiWayGrope", "Ancord", "СВ-Дубль", "Tycoon", "SHIZA Project", "GREEN TEA", "STEPonee", "AlphaProject", "AnimeReactor", "Animegroup", "Shachiburi", "Persona99", "3df voice", "CactusTeam", "AniMaunt", "AniMedia", "AnimeReactor", "ShinkaDan", "Jaskier", "ShowJet", "RAIM", "RusFilm", "Victory-Films", "АрхиТеатр", "Project Web Mania", "ko136", "КураСгречей", "AMS", "СВ-Студия", "Храм Дорам ТВ", "TurkStar", "Медведев", "Рябов", "BukeDub", "FilmGate", "FilmsClub", "Sony Turbo", "ТВЦ", "AXN Sci-Fi", "NovaFilm", "DIVA Universal", "Курдов", "Неоклассика", "fiendover", "SomeWax", "Логинофф", "Cartoon Network", "Sony Turbo", "Loginoff", "CrezaStudio", "Воротилин", "LakeFilms", "Andy", "CP Digital", "XDUB Dorama + Колобок", "SDI Media", "KosharaSerials", "Екатеринбург Арт", "Julia Prosenuk", "АРК-ТВ Studio", "Т.О Друзей", "Anifilm", "Animedub", "AlphaProject", "Paramount Channel", "Кириллица", "AniPLague", "Видеосервис", "JoyStudio", "HighHopes", "TVShows", "AniFilm", "GostFilm", "West Video", "Формат AB", "Film Prestige", "West Video", "Екатеринбург Арт", "SovetRomantica", "РуФилмс", "AveBrasil", "Greb&Creative", "BTI Studios", "Пифагор", "Eurochannel", "NewStudio", "Кармен Видео", "Кошкин", "Кравец", "Rainbow World", "Воротилин", "Варус-Видео", "ClubFATE", "HiWay Grope", "Banyan Studio", "Mallorn Studio", "Asian Miracle Group", "Эй Би Видео", "AniStar", "Korean Craze", "LakeFilms", "Невафильм", "Hallmark", "Netflix", "Mallorn Studio", "Sony Channel", "East Dream", "Bonsai Studio", "Lucky Production", "Octopus", "TUMBLER Studio", "CrazyCatStudio", "Amber", "Train Studio", "Анастасия Гайдаржи", "Мадлен Дюваль", "Fox Life", "Sound Film", "Cowabunga Studio", "Фильмэкспорт", "VO-Production", "Sound Film", "Nickelodeon", "MixFilm", "GreenРай Studio", "Sound-Group", "Back Board Cinema", "Кирилл Сагач", "Bonsai Studio", "Stevie", "OnisFilms", "MaxMeister", "Syfy Universal", "TUMBLER Studio", "NewStation", "Neo-Sound", "Муравский", "IdeaFilm", "Рутилов", "Тимофеев", "Лагута", "Дьяконов", "Zone Vision Studio", "Onibaku", "AniMaunt", "Voice Project", "AniStar", "Пифагор", "VoicePower", "StudioFilms", "Elysium", "AniStar", "BeniAffet", "Selena International", "Paul Bunyan", "CoralMedia", "Кондор", "Игмар", "ViP Premiere", "FireDub", "AveTurk", "Sony Sci-Fi", "Янкелевич", "Киреев", "Багичев", "2x2", "Лексикон", "Нота", "Arisu", "Superbit", "AveDorama", "VideoBIZ", "Киномания", "DDV", "Alternative Production", "WestFilm", "Анастасия Гайдаржи + Андрей Юрченко", "Киномания", "Agatha Studdio", "GreenРай Studio", "VSI Moscow", "Horizon Studio", "Flarrow Films", "Amazing Dubbing", "Asian Miracle Group", "Видеопродакшн", "VGM Studio", "FocusX", "CBS Drama", "NovaFilm", "Novamedia", "East Dream", "Дасевич", "Анатолий Гусев", "Twister", "Морозов", "NewComers", "kubik&ko", "DeMon", "Анатолий Ашмарин", "Inter Video", "Пронин", "AMC", "Велес", "Volume-6 Studio", "Хоррор Мэйкер", "Ghostface", "Sephiroth", "Акира", "Деваль Видео", "RussianGuy27", "neko64", "Shaman", "Franek Monk", "Ворон", "Andre1288", "Selena International", "GalVid", "Другое кино", "Студия NLS", "Sam2007", "HaseRiLLoPaW", "Севастьянов", "D.I.M.", "Марченко", "Журавлев", "Н-Кино", "Lazer Video", "SesDizi", "Red Media", "Рудой", "Товбин", "Сергей Дидок", "Хуан Рохас", "binjak", "Карусель", "Lizard Cinema", "Варус-Видео", "Акцент", "RG.Paravozik", "Max Nabokov", "Barin101", "Васька Куролесов", "Фортуна-Фильм", "Amalgama", "AnyFilm", "Студия Райдо", "Козлов", "Zoomvision Studio", "Пифагор", "Urasiko", "VIP Serial HD", "НСТ", "Кинолюкс", "Project Web Mania", "Завгородний", "AB-Video", "Twister", "Universal Channel", "Wakanim", "SnowRecords", "С.Р.И", "Старый Бильбо", "Ozz.tv", "Mystery Film", "РенТВ", "Латышев", "Ващенко", "Лайко", "Сонотек", "Psychotronic", "DIVA Universal", "Gremlin Creative Studio", "Нева-1", "Максим Жолобов", "Good People", "Мобильное телевидение", "Lazer Video", "IVI", "DoubleRec", "Milvus", "RedDiamond Studio", "Astana TV", "Никитин", "КТК", "D2Lab", "НСТ", "DoubleRec", "Black Street Records", "Останкино", "TatamiFilm", "Видеобаза", "Crunchyroll", "Novamedia", "RedRussian1337", "КонтентикOFF", "Creative Sound", "HelloMickey Production", "Пирамида", "CLS Media", "Сонькин", "Мастер Тэйп", "Garsu Pasaulis", "DDV", "IdeaFilm", "Gold Cinema", "Че!", "Нарышкин", "Intra Communications", "OnisFilms", "XDUB Dorama", "Кипарис", "Королёв", "visanti-vasaer", "Готлиб", "Paramount Channel", "СТС", "диктор CDV", "Pazl Voice", "Прямостанов", "Zerzia", "НТВ", "MGM", "Дьяков", "Вольга", "АРК-ТВ Studio", "Дубровин", "МИР", "Netflix", "Jetix", "Кипарис", "RUSCICO", "Seoul Bay", "Филонов", "Махонько", "Строев", "Саня Белый", "Говинда Рага", "Ошурков", "Horror Maker", "Хлопушка", "Хрусталев", "Антонов Николай", "Золотухин", "АрхиАзия", "Попов", "Ultradox", "Мост-Видео", "Альтера Парс", "Огородников", "Твин", "Хабар", "AimaksaLTV", "ТНТ", "FDV", "3df voice", "The Kitchen Russia", "Ульпаней Эльром", "Видеоимпульс", "GoodTime Media", "Alezan", "True Dubbing Studio", "FDV", "Карусель", "Интер", "Contentica", "Мельница", "RealFake", "ИДДК", "Инфо-фильм", "Мьюзик-трейд", "Кирдин | Stalk", "ДиоНиК", "Стасюк", "TV1000", "Hallmark", "Тоникс Медиа", "Бессонов", "Gears Media", "Бахурани", "NewDub", "Cinema Prestige", "Набиев", "New Dream Media", "ТВ3", "Малиновский Сергей", "Superbit", "Кенс Матвей", "LE-Production", "Voiz", "Светла", "Cinema Prestige", "JAM", "LDV", "Videogram", "Индия ТВ", "RedDiamond Studio", "Герусов", "Элегия фильм", "Nastia", "Семыкина Юлия", "Электричка", "Штамп Дмитрий", "Пятница", "Oneinchnales", "Gravi-TV", "D2Lab", "Кинопремьера", "Бусов Глеб", "LE-Production", "1001cinema", "Amazing Dubbing", "Emslie", "1+1", "100 ТВ", "1001 cinema", "2+2", "2х2", "3df voice", "4u2ges", "5 канал", "A. Lazarchuk", "AAA-Sound", "AB-Video", "AdiSound", "ALEKS KV", "AlexFilm", "AlphaProject", "Alternative Production", "Amalgam", "AMC", "Amedia", "AMS", "Andy", "AniLibria", "AniMedia", "Animegroup", "Animereactor", "AnimeSpace Team", "Anistar", "AniUA", "AniWayt", "Anything-group", "AOS", "Arasi project", "ARRU Workshop", "AuraFilm", "AvePremier", "AveTurk", "AXN Sci-Fi", "Azazel", "AzOnFilm", "BadBajo", "BadCatStudio", "BBC Saint-Petersburg", "BD CEE", "Black Street Records", "Bonsai Studio", "Boльгa", "Brain Production", "BraveSound", "BTI Studios", "Bubble Dubbing Company", "Byako Records", "Cactus Team", "Cartoon Network", "CBS Drama", "CDV", "Cinema Prestige", "CinemaSET GROUP", "CinemaTone", "ColdFilm", "Contentica", "CP Digital", "CPIG", "Crunchyroll", "Cuba77", "D1", "D2lab", "datynet", "DDV", "DeadLine", "DeadSno", "DeMon", "den904", "Description", "DexterTV", "Dice", "Discovery", "DniproFilm", "DoubleRec", "DreamRecords", "DVD Classic", "East Dream", "Eladiel", "Elegia", "ELEKTRI4KA", "Elrom", "ELYSIUM", "Epic Team", "eraserhead", "erogg", "Eurochannel", "Extrabit", "F-TRAIN", "Family Fan Edition", "FDV", "FiliZa Studio", "Film Prestige", "FilmGate", "FilmsClub", "FireDub", "Flarrow Films", "Flux-Team", "FocusStudio", "FOX", "Fox Crime", "Fox Russia", "FoxLife", "Foxlight", "Franek Monk", "Gala Voices", "Garsu Pasaulis", "Gears Media", "Gemini", "General Film", "GetSmart", "Gezell Studio", "Gits", "GladiolusTV", "GoldTeam", "Good People", "Goodtime Media", "GoodVideo", "GostFilm", "Gramalant", "Gravi-TV", "GREEN TEA", "GreenРай Studio", "Gremlin Creative Studio", "Hallmark", "HamsterStudio", "HiWay Grope", "Horizon Studio", "hungry_inri", "ICG", "ICTV", "IdeaFilm", "IgVin & Solncekleshka", "ImageArt", "INTERFILM", "Ivnet Cinema", "IНТЕР", "Jakob Bellmann", "JAM", "Janetta", "Jaskier", "JeFerSon", "jept", "JetiX", "Jetvis", "JimmyJ", "KANSAI", "KIHO", "kiitos", "KinoGolos", "Kinomania", "KosharaSerials", "Kолобок", "L0cDoG", "LakeFilms", "LDV", "LE-Production", "LeDoyen", "LevshaFilm", "LeXiKC", "Liga HQ", "Line", "Lisitz", "Lizard Cinema Trade", "Lord32x", "lord666", "LostFilm", "Lucky Production", "Macross", "madrid", "Mallorn Studio", "Marclail", "Max Nabokov", "MC Entertainment", "MCA", "McElroy", "Mega-Anime", "Melodic Voice Studio", "metalrus", "MGM", "MifSnaiper", "Mikail", "Milirina", "MiraiDub", "MOYGOLOS", "MrRose", "MTV", "Murzilka", "MUZOBOZ", "National Geographic", "NemFilm", "Neoclassica", "NEON Studio", "New Dream Media", "NewComers", "NewStation", "NewStudio", "Nice-Media", "Nickelodeon", "No-Future", "NovaFilm", "Novamedia", "Octopus", "Oghra-Brown", "OMSKBIRD", "Onibaku", "OnisFilms", "OpenDub", "OSLIKt", "Ozz TV", "PaDet", "Paramount Comedy", "Paramount Pictures", "Parovoz Production", "PashaUp", "Paul Bunyan", "Pazl Voice", "PCB Translate", "Persona99", "PiratVoice", "Postmodern", "Profix Media", "Project Web Mania", "Prolix", "QTV", "R5", "Radamant", "RainDeath", "RATTLEBOX", "RealFake", "Reanimedia", "Rebel Voice", "RecentFilms", "Red Media", "RedDiamond Studio", "RedDog", "RedRussian1337", "Renegade Team", "RG Paravozik", "RinGo", "RoxMarty", "Rumble", "RUSCICO", "RusFilm", "RussianGuy27", "Saint Sound", "SakuraNight", "Satkur", "Sawyer888", "Sci-Fi Russia", "SDI Media", "Selena", "seqw0", "SesDizi", "SGEV", "Shachiburi", "SHIZA", "ShowJet", "Sky Voices", "SkyeFilmTV", "SmallFilm", "SmallFilm", "SNK-TV", "SnowRecords", "SOFTBOX", "SOLDLUCK2", "Solod", "SomeWax", "Sony Channel", "Sony Turbo", "Sound Film", "SpaceDust", "ssvss", "st.Elrom", "STEPonee", "SunshineStudio", "Superbit", "Suzaku", "sweet couple", "TatamiFilm", "TB5", "TF-AniGroup", "The Kitchen Russia", "The Mike Rec.", "Timecraft", "To4kaTV", "Tori", "Total DVD", "TrainStudio", "Troy", "True Dubbing Studio", "TUMBLER Studio", "turok1990", "TV 1000", "TVShows", "Twister", "Twix", "Tycoon", "Ultradox", "Universal Russia", "VashMax2", "VendettA", "VHS", "VicTeam", "VictoryFilms", "Video-BIZ", "Videogram", "ViruseProject", "visanti-vasaer", "VIZ Media", "VO-production", "Voice Project Studio", "VoicePower", "VSI Moscow", "VulpesVulpes", "Wakanim", "Wayland team", "WestFilm", "WiaDUB", "WVoice", "XL Media", "XvidClub Studio", "zamez", "ZEE TV", "Zendos", "ZM-SHOW", "Zone Studio", "Zone Vision", "Агапов", "Акопян", "Алексеев", "Артемьев", "Багичев", "Бессонов", "Васильев", "Васильцев", "Гаврилов", "Герусов", "Готлиб", "Григорьев", "Дасевич", "Дольский", "Карповский", "Кашкин", "Киреев", "Клюквин", "Костюкевич", "Матвеев", "Михалев", "Мишин", "Мудров", "Пронин", "Савченко", "Смирнов", "Тимофеев", "Толстобров", "Чуев", "Шуваев", "Яковлев", "ААА-sound", "АБыГДе", "Акалит", "Акира", "Альянс", "Амальгама", "АМС", "АнВад", "Анубис", "Anubis", "Арк-ТВ", "АРК-ТВ Studio", "Б. Федоров", "Бибиков", "Бигыч", "Бойков", "Абдулов", "Белов", "Вихров", "Воронцов", "Горчаков", "Данилов", "Дохалов", "Котов", "Кошкин", "Назаров", "Попов", "Рукин", "Рутилов", "Варус Видео", "Васька Куролесов", "Ващенко С.", "Векшин", "Велес", "Весельчак", "Видеоимпульс", "Витя «говорун»", "Войсовер", "Вольга", "Ворон", "Воротилин", "Г. Либергал", "Г. Румянцев", "Гей Кино Гид", "ГКГ", "Глуховский", "Гризли", "Гундос", "Деньщиков", "Есарев", "Нурмухаметов", "Пучков", "Стасюк", "Шадинский", "Штамп", "sf@irat", "Держиморда", "Домашний", "ДТВ", "Дьяконов", "Е. Гаевский", "Е. Гранкин", "Е. Лурье", "Е. Рудой", "Е. Хрусталёв", "ЕА Синема", "Екатеринбург Арт", "Живаго", "Жучков", "З Ранку До Ночі", "Завгородний", "Зебуро", "Зереницын", "И. Еремеев", "И. Клушин", "И. Сафронов", "И. Степанов", "ИГМ", "Игмар", "ИДДК", "Имидж-Арт", "Инис", "Ирэн", "Ист-Вест", "К. Поздняков", "К. Филонов", "К9", "Карапетян", "Кармен Видео", "Карусель", "Квадрат Малевича", "Килька", "Кипарис", "Королев", "Котова", "Кравец", "Кубик в Кубе", "Кураж-Бамбей", "Л. Володарский", "Лазер Видео", "ЛанселаП", "Лапшин", "Лексикон", "Ленфильм", "Леша Прапорщик", "Лизард", "Люсьена", "Заугаров", "Иванов", "Иванова и П. Пашут", "Латышев", "Ошурков", "Чадов", "Яроцкий", "Максим Логинофф", "Малиновский", "Марченко", "Мастер Тэйп", "Махонько", "Машинский", "Медиа-Комплекс", "Мельница", "Мика Бондарик", "Миняев", "Мительман", "Мост Видео", "Мосфильм", "Муравский", "Мьюзик-трейд", "Н-Кино", "Н. Антонов", "Н. Дроздов", "Н. Золотухин", "Н.Севастьянов seva1988", "Набиев", "Наталья Гурзо", "НЕВА 1", "Невафильм", "НеЗупиняйПродакшн", "Неоклассика", "Несмертельное оружие", "НЛО-TV", "Новий", "Новый диск", "Новый Дубляж", "Новый Канал", "Нота", "НСТ", "НТВ", "НТН", "Оверлорд", "Огородников", "Омикрон", "Гланц", "Карцев", "Морозов", "Прямостанов", "Санаев", "Парадиз", "Пепелац", "Первый канал ОРТ", "Переводман", "Перец", "Петербургский дубляж", "Петербуржец", "Пирамида", "Пифагор", "Позитив-Мультимедиа", "Прайд Продакшн", "Премьер Видео", "Премьер Мультимедиа", "Причудики", "Р. Янкелевич", "Райдо", "Ракурс", "РенТВ", "Россия", "РТР", "Русский дубляж", "Русский Репортаж", "РуФилмс", "Рыжий пес", "С. Визгунов", "С. Дьяков", "С. Казаков", "С. Кузнецов", "С. Кузьмичёв", "С. Лебедев", "С. Макашов", "С. Рябов", "С. Щегольков", "С.Р.И.", "Сolumbia Service", "Самарский", "СВ Студия", "СВ-Дубль", "Светла", "Селена Интернешнл", "Синема Трейд", "Синема УС", "Синта Рурони", "Синхрон", "Советский", "Сокуров", "Солодухин", "Сонотек", "Сонькин", "Союз Видео", "Союзмультфильм", "СПД - Сладкая парочка", "Строев", "СТС", "Студии Суверенного Лепрозория", "Студия «Стартрек»", "KOleso", "Студия Горького", "Студия Колобок", "Студия Пиратского Дубляжа", "Студия Райдо", "Студия Трёх", "Гуртом", "Супербит", "Сыендук", "Так Треба Продакшн", "ТВ XXI век", "ТВ СПб", "ТВ-3", "ТВ6", "ТВИН", "ТВЦ", "ТВЧ 1", "ТНТ", "ТО Друзей", "Толмачев", "Точка Zрения", "Трамвай-фильм", "ТРК", "Уолт Дисней Компани", "Хихидок", "Хлопушка", "Цікава Ідея", "Четыре в квадрате", "Швецов", "Штамп", "Штейн", "Ю. Живов", "Ю. Немахов", "Ю. Сербин", "Ю. Товбин", "Я. Беллманн", "Red Head Sound", "UKR"]; + + var filter_langs = [{ + title: '#{filter_lang_ru}', + code: 'ru' + }, { + title: '#{filter_lang_uk}', + code: 'uk' + }, { + title: '#{filter_lang_en}', + code: 'en' + }, { + title: '#{filter_lang_be}', + code: 'be' + }, { + title: '#{filter_lang_zh}', + code: 'zh|cn' + }, { + title: '#{filter_lang_ja}', + code: 'ja' + }, { + title: '#{filter_lang_ko}', + code: 'ko' + }, { + title: '#{filter_lang_af}', + code: 'af' + }, { + title: '#{filter_lang_sq}', + code: 'sq' + }, { + title: '#{filter_lang_ar}', + code: 'ar' + }, { + title: '#{filter_lang_az}', + code: 'az' + }, { + title: '#{filter_lang_hy}', + code: 'hy' + }, { + title: '#{filter_lang_ba}', + code: 'ba' + }, { + title: '#{filter_lang_bg}', + code: 'bg' + }, { + title: '#{filter_lang_bn}', + code: 'bn' + }, { + title: '#{filter_lang_bs}', + code: 'bs' + }, { + title: '#{filter_lang_ca}', + code: 'ca' + }, { + title: '#{filter_lang_ce}', + code: 'ce' + }, { + title: '#{filter_lang_cs}', + code: 'cs' + }, { + title: '#{filter_lang_da}', + code: 'da' + }, { + title: '#{filter_lang_ka}', + code: 'ka' + }, { + title: '#{filter_lang_de}', + code: 'de' + }, { + title: '#{filter_lang_el}', + code: 'el' + }, { + title: '#{filter_lang_es}', + code: 'es' + }, { + title: '#{filter_lang_et}', + code: 'et' + }, { + title: '#{filter_lang_fa}', + code: 'fa' + }, { + title: '#{filter_lang_fi}', + code: 'fi' + }, { + title: '#{filter_lang_fr}', + code: 'fr' + }, { + title: '#{filter_lang_ga}', + code: 'ga' + }, { + title: '#{filter_lang_gl}', + code: 'gl' + }, { + title: '#{filter_lang_gn}', + code: 'gn' + }, { + title: '#{filter_lang_he}', + code: 'he' + }, { + title: '#{filter_lang_hi}', + code: 'hi' + }, { + title: '#{filter_lang_hr}', + code: 'hr' + }, { + title: '#{filter_lang_hu}', + code: 'hu' + }, { + title: '#{filter_lang_id}', + code: 'id' + }, { + title: '#{filter_lang_is}', + code: 'is' + }, { + title: '#{filter_lang_it}', + code: 'it' + }, { + title: '#{filter_lang_kk}', + code: 'kk' + }, { + title: '#{filter_lang_ks}', + code: 'ks' + }, { + title: '#{filter_lang_ku}', + code: 'ku' + }, { + title: '#{filter_lang_ky}', + code: 'ky' + }, { + title: '#{filter_lang_lt}', + code: 'lt' + }, { + title: '#{filter_lang_lv}', + code: 'lv' + }, { + title: '#{filter_lang_mi}', + code: 'mi' + }, { + title: '#{filter_lang_mk}', + code: 'mk' + }, { + title: '#{filter_lang_mn}', + code: 'mn' + }, { + title: '#{filter_lang_mo}', + code: 'mo' + }, { + title: '#{filter_lang_mt}', + code: 'mt' + }, { + title: '#{filter_lang_no}', + code: 'no|nb|nn' + }, { + title: '#{filter_lang_ne}', + code: 'ne' + }, { + title: '#{filter_lang_nl}', + code: 'nl' + }, { + title: '#{filter_lang_pa}', + code: 'pa' + }, { + title: '#{filter_lang_pl}', + code: 'pl' + }, { + title: '#{filter_lang_ps}', + code: 'ps' + }, { + title: '#{filter_lang_pt}', + code: 'pt' + }, { + title: '#{filter_lang_ro}', + code: 'ro' + }, { + title: '#{filter_lang_si}', + code: 'si' + }, { + title: '#{filter_lang_sk}', + code: 'sk' + }, { + title: '#{filter_lang_sl}', + code: 'sl' + }, { + title: '#{filter_lang_sm}', + code: 'sm' + }, { + title: '#{filter_lang_so}', + code: 'so' + }, { + title: '#{filter_lang_sr}', + code: 'sr' + }, { + title: '#{filter_lang_sv}', + code: 'sv' + }, { + title: '#{filter_lang_sw}', + code: 'sw' + }, { + title: '#{filter_lang_ta}', + code: 'ta' + }, { + title: '#{filter_lang_tg}', + code: 'tg' + }, { + title: '#{filter_lang_th}', + code: 'th' + }, { + title: '#{filter_lang_tk}', + code: 'tk' + }, { + title: '#{filter_lang_tr}', + code: 'tr' + }, { + title: '#{filter_lang_tt}', + code: 'tt' + }, { + title: '#{filter_lang_ur}', + code: 'ur' + }, { + title: '#{filter_lang_uz}', + code: 'uz' + }, { + title: '#{filter_lang_vi}', + code: 'vi' + }, { + title: '#{filter_lang_yi}', + code: 'yi' + }]; + + /** + * Компонент "Torrents" + * @param {*} object + */ + + function component$g(object) { + Arrays.extend(object, { + movie: { + title: object.search, + original_title: object.search + }, + params: { + noinfo: object.from_search ? true : false + } + }); + var network = new Request(); + var scroll = new Scroll({ mask: true, over: true }); - var files = new Explorer(object); + var files = new Explorer$1(object); + var history = new WatchedHistory(object.movie); var filter; var results = []; var filtred = []; + var listener; var total_pages = 1; var last; var initialized; var filter_items = { - quality: [Lang.translate('torrent_parser_any_one'), '4k', '1080p', '720p'], - hdr: [Lang.translate('torrent_parser_no_choice'), Lang.translate('torrent_parser_yes'), Lang.translate('torrent_parser_no')], - dv: [Lang.translate('torrent_parser_no_choice'), 'Dolby Vision', 'Dolby Vision TV', Lang.translate('torrent_parser_no')], - sub: [Lang.translate('torrent_parser_no_choice'), Lang.translate('torrent_parser_yes'), Lang.translate('torrent_parser_no')], + quality: [Lang$1.translate('torrent_parser_any_one'), '4k', '1080p', '720p'], + hdr: [Lang$1.translate('torrent_parser_no_choice'), Lang$1.translate('torrent_parser_yes'), Lang$1.translate('torrent_parser_no')], + dv: [Lang$1.translate('torrent_parser_no_choice'), 'Dolby Vision', 'Dolby Vision TV', Lang$1.translate('torrent_parser_no')], + sub: [Lang$1.translate('torrent_parser_no_choice'), Lang$1.translate('torrent_parser_yes'), Lang$1.translate('torrent_parser_no')], voice: [], - tracker: [Lang.translate('torrent_parser_any_two')], - year: [Lang.translate('torrent_parser_any_two')], - lang: [Lang.translate('torrent_parser_any_two')] + tracker: [Lang$1.translate('torrent_parser_any_two')], + year: [Lang$1.translate('torrent_parser_any_two')], + lang: [Lang$1.translate('torrent_parser_any_two')] }; var filter_translate = { - quality: Lang.translate('torrent_parser_quality'), + quality: Lang$1.translate('torrent_parser_quality'), hdr: 'HDR', dv: 'Dolby Vision', - sub: Lang.translate('torrent_parser_subs'), - voice: Lang.translate('torrent_parser_voice'), - tracker: Lang.translate('torrent_parser_tracker'), - year: Lang.translate('torrent_parser_year'), - season: Lang.translate('torrent_parser_season'), - lang: Lang.translate('title_language_short') + sub: Lang$1.translate('torrent_parser_subs'), + voice: Lang$1.translate('torrent_parser_voice'), + tracker: Lang$1.translate('torrent_parser_tracker'), + year: Lang$1.translate('torrent_parser_year'), + season: Lang$1.translate('torrent_parser_season'), + lang: Lang$1.translate('title_language_short') }; var filter_multiple = ['quality', 'voice', 'tracker', 'season', 'lang']; var sort_translate = { - Seeders: Lang.translate('torrent_parser_sort_by_seeders'), - Size: Lang.translate('torrent_parser_sort_by_size'), - Title: Lang.translate('torrent_parser_sort_by_name'), - Tracker: Lang.translate('torrent_parser_sort_by_tracker'), - PublisTime: Lang.translate('torrent_parser_sort_by_date'), - viewed: Lang.translate('torrent_parser_sort_by_viewed') + Seeders: Lang$1.translate('torrent_parser_sort_by_seeders'), + Size: Lang$1.translate('torrent_parser_sort_by_size'), + Title: Lang$1.translate('torrent_parser_sort_by_name'), + Tracker: Lang$1.translate('torrent_parser_sort_by_tracker'), + PublisTime: Lang$1.translate('torrent_parser_sort_by_date'), + viewed: Lang$1.translate('torrent_parser_sort_by_viewed') }; var i = 20, y = new Date().getFullYear(); @@ -30265,235 +35167,8 @@ var viewed = Storage.cache('torrents_view', 5000, []); var finded_seasons = []; var finded_seasons_full = []; - var voices = ["Laci", "Kerob", "LE-Production", "Parovoz Production", "Paradox", "Omskbird", "LostFilm", "Причудики", "BaibaKo", "NewStudio", "AlexFilm", "FocusStudio", "Gears Media", "Jaskier", "ViruseProject", "Кубик в Кубе", "IdeaFilm", "Sunshine Studio", "Ozz.tv", "Hamster Studio", "Сербин", "To4ka", "Кравец", "Victory-Films", "SNK-TV", "GladiolusTV", "Jetvis Studio", "ApofysTeam", "ColdFilm", "Agatha Studdio", "KinoView", "Jimmy J.", "Shadow Dub Project", "Amedia", "Red Media", "Selena International", "Гоблин", "Universal Russia", "Kiitos", "Paramount Comedy", "Кураж-Бамбей", "Студия Пиратского Дубляжа", "Чадов", "Карповский", "RecentFilms", "Первый канал", "Alternative Production", "NEON Studio", "Колобок", "Дольский", "Синема УС", "Гаврилов", "Живов", "SDI Media", "Алексеев", "GreenРай Studio", "Михалев", "Есарев", "Визгунов", "Либергал", "Кузнецов", "Санаев", "ДТВ", "Дохалов", "Sunshine Studio", "Горчаков", "LevshaFilm", "CasStudio", "Володарский", "ColdFilm", "Шварко", "Карцев", "ETV+", "ВГТРК", "Gravi-TV", "1001cinema", "Zone Vision Studio", "Хихикающий доктор", "Murzilka", "turok1990", "FOX", "STEPonee", "Elrom", "Колобок", "HighHopes", "SoftBox", "GreenРай Studio", "NovaFilm", "Четыре в квадрате", "Greb&Creative", "MUZOBOZ", "ZM-Show", "RecentFilms", "Kerems13", "Hamster Studio", "New Dream Media", "Игмар", "Котов", "DeadLine Studio", "Jetvis Studio", "РенТВ", "Андрей Питерский", "Fox Life", "Рыбин", "Trdlo.studio", "Studio Victory Аsia", "Ozeon", "НТВ", "CP Digital", "AniLibria", "STEPonee", "Levelin", "FanStudio", "Cmert", "Интерфильм", "SunshineStudio", "Kulzvuk Studio", "Кашкин", "Вартан Дохалов", "Немахов", "Sedorelli", "СТС", "Яроцкий", "ICG", "ТВЦ", "Штейн", "AzOnFilm", "SorzTeam", "Гаевский", "Мудров", "Воробьев Сергей", "Студия Райдо", "DeeAFilm Studio", "zamez", "ViruseProject", "Иванов", "STEPonee", "РенТВ", "СВ-Дубль", "BadBajo", "Комедия ТВ", "Мастер Тэйп", "5-й канал СПб", "SDI Media", "Гланц", "Ох! Студия", "СВ-Кадр", "2x2", "Котова", "Позитив", "RusFilm", "Назаров", "XDUB Dorama", "Реальный перевод", "Kansai", "Sound-Group", "Николай Дроздов", "ZEE TV", "Ozz.tv", "MTV", "Сыендук", "GoldTeam", "Белов", "Dream Records", "Яковлев", "Vano", "SilverSnow", "Lord32x", "Filiza Studio", "Sony Sci-Fi", "Flux-Team", "NewStation", "XDUB Dorama", "Hamster Studio", "Dream Records", "DexterTV", "ColdFilm", "Good People", "RusFilm", "Levelin", "AniDUB", "SHIZA Project", "AniLibria.TV", "StudioBand", "AniMedia", "Kansai", "Onibaku", "JWA Project", "MC Entertainment", "Oni", "Jade", "Ancord", "ANIvoice", "Nika Lenina", "Bars MacAdams", "JAM", "Anika", "Berial", "Kobayashi", "Cuba77", "RiZZ_fisher", "OSLIKt", "Lupin", "Ryc99", "Nazel & Freya", "Trina_D", "JeFerSon", "Vulpes Vulpes", "Hamster", "KinoGolos", "Fox Crime", "Денис Шадинский", "AniFilm", "Rain Death", "LostFilm", "New Records", "Ancord", "Первый ТВЧ", "RG.Paravozik", "Profix Media", "Tycoon", "RealFake", "HDrezka", "Jimmy J.", "AlexFilm", "Discovery", "Viasat History", "AniMedia", "JAM", "HiWayGrope", "Ancord", "СВ-Дубль", "Tycoon", "SHIZA Project", "GREEN TEA", "STEPonee", "AlphaProject", "AnimeReactor", "Animegroup", "Shachiburi", "Persona99", "3df voice", "CactusTeam", "AniMaunt", "AniMedia", "AnimeReactor", "ShinkaDan", "Jaskier", "ShowJet", "RAIM", "RusFilm", "Victory-Films", "АрхиТеатр", "Project Web Mania", "ko136", "КураСгречей", "AMS", "СВ-Студия", "Храм Дорам ТВ", "TurkStar", "Медведев", "Рябов", "BukeDub", "FilmGate", "FilmsClub", "Sony Turbo", "ТВЦ", "AXN Sci-Fi", "NovaFilm", "DIVA Universal", "Курдов", "Неоклассика", "fiendover", "SomeWax", "Логинофф", "Cartoon Network", "Sony Turbo", "Loginoff", "CrezaStudio", "Воротилин", "LakeFilms", "Andy", "CP Digital", "XDUB Dorama + Колобок", "SDI Media", "KosharaSerials", "Екатеринбург Арт", "Julia Prosenuk", "АРК-ТВ Studio", "Т.О Друзей", "Anifilm", "Animedub", "AlphaProject", "Paramount Channel", "Кириллица", "AniPLague", "Видеосервис", "JoyStudio", "HighHopes", "TVShows", "AniFilm", "GostFilm", "West Video", "Формат AB", "Film Prestige", "West Video", "Екатеринбург Арт", "SovetRomantica", "РуФилмс", "AveBrasil", "Greb&Creative", "BTI Studios", "Пифагор", "Eurochannel", "NewStudio", "Кармен Видео", "Кошкин", "Кравец", "Rainbow World", "Воротилин", "Варус-Видео", "ClubFATE", "HiWay Grope", "Banyan Studio", "Mallorn Studio", "Asian Miracle Group", "Эй Би Видео", "AniStar", "Korean Craze", "LakeFilms", "Невафильм", "Hallmark", "Netflix", "Mallorn Studio", "Sony Channel", "East Dream", "Bonsai Studio", "Lucky Production", "Octopus", "TUMBLER Studio", "CrazyCatStudio", "Amber", "Train Studio", "Анастасия Гайдаржи", "Мадлен Дюваль", "Fox Life", "Sound Film", "Cowabunga Studio", "Фильмэкспорт", "VO-Production", "Sound Film", "Nickelodeon", "MixFilm", "GreenРай Studio", "Sound-Group", "Back Board Cinema", "Кирилл Сагач", "Bonsai Studio", "Stevie", "OnisFilms", "MaxMeister", "Syfy Universal", "TUMBLER Studio", "NewStation", "Neo-Sound", "Муравский", "IdeaFilm", "Рутилов", "Тимофеев", "Лагута", "Дьяконов", "Zone Vision Studio", "Onibaku", "AniMaunt", "Voice Project", "AniStar", "Пифагор", "VoicePower", "StudioFilms", "Elysium", "AniStar", "BeniAffet", "Selena International", "Paul Bunyan", "CoralMedia", "Кондор", "Игмар", "ViP Premiere", "FireDub", "AveTurk", "Sony Sci-Fi", "Янкелевич", "Киреев", "Багичев", "2x2", "Лексикон", "Нота", "Arisu", "Superbit", "AveDorama", "VideoBIZ", "Киномания", "DDV", "Alternative Production", "WestFilm", "Анастасия Гайдаржи + Андрей Юрченко", "Киномания", "Agatha Studdio", "GreenРай Studio", "VSI Moscow", "Horizon Studio", "Flarrow Films", "Amazing Dubbing", "Asian Miracle Group", "Видеопродакшн", "VGM Studio", "FocusX", "CBS Drama", "NovaFilm", "Novamedia", "East Dream", "Дасевич", "Анатолий Гусев", "Twister", "Морозов", "NewComers", "kubik&ko", "DeMon", "Анатолий Ашмарин", "Inter Video", "Пронин", "AMC", "Велес", "Volume-6 Studio", "Хоррор Мэйкер", "Ghostface", "Sephiroth", "Акира", "Деваль Видео", "RussianGuy27", "neko64", "Shaman", "Franek Monk", "Ворон", "Andre1288", "Selena International", "GalVid", "Другое кино", "Студия NLS", "Sam2007", "HaseRiLLoPaW", "Севастьянов", "D.I.M.", "Марченко", "Журавлев", "Н-Кино", "Lazer Video", "SesDizi", "Red Media", "Рудой", "Товбин", "Сергей Дидок", "Хуан Рохас", "binjak", "Карусель", "Lizard Cinema", "Варус-Видео", "Акцент", "RG.Paravozik", "Max Nabokov", "Barin101", "Васька Куролесов", "Фортуна-Фильм", "Amalgama", "AnyFilm", "Студия Райдо", "Козлов", "Zoomvision Studio", "Пифагор", "Urasiko", "VIP Serial HD", "НСТ", "Кинолюкс", "Project Web Mania", "Завгородний", "AB-Video", "Twister", "Universal Channel", "Wakanim", "SnowRecords", "С.Р.И", "Старый Бильбо", "Ozz.tv", "Mystery Film", "РенТВ", "Латышев", "Ващенко", "Лайко", "Сонотек", "Psychotronic", "DIVA Universal", "Gremlin Creative Studio", "Нева-1", "Максим Жолобов", "Good People", "Мобильное телевидение", "Lazer Video", "IVI", "DoubleRec", "Milvus", "RedDiamond Studio", "Astana TV", "Никитин", "КТК", "D2Lab", "НСТ", "DoubleRec", "Black Street Records", "Останкино", "TatamiFilm", "Видеобаза", "Crunchyroll", "Novamedia", "RedRussian1337", "КонтентикOFF", "Creative Sound", "HelloMickey Production", "Пирамида", "CLS Media", "Сонькин", "Мастер Тэйп", "Garsu Pasaulis", "DDV", "IdeaFilm", "Gold Cinema", "Че!", "Нарышкин", "Intra Communications", "OnisFilms", "XDUB Dorama", "Кипарис", "Королёв", "visanti-vasaer", "Готлиб", "Paramount Channel", "СТС", "диктор CDV", "Pazl Voice", "Прямостанов", "Zerzia", "НТВ", "MGM", "Дьяков", "Вольга", "АРК-ТВ Studio", "Дубровин", "МИР", "Netflix", "Jetix", "Кипарис", "RUSCICO", "Seoul Bay", "Филонов", "Махонько", "Строев", "Саня Белый", "Говинда Рага", "Ошурков", "Horror Maker", "Хлопушка", "Хрусталев", "Антонов Николай", "Золотухин", "АрхиАзия", "Попов", "Ultradox", "Мост-Видео", "Альтера Парс", "Огородников", "Твин", "Хабар", "AimaksaLTV", "ТНТ", "FDV", "3df voice", "The Kitchen Russia", "Ульпаней Эльром", "Видеоимпульс", "GoodTime Media", "Alezan", "True Dubbing Studio", "FDV", "Карусель", "Интер", "Contentica", "Мельница", "RealFake", "ИДДК", "Инфо-фильм", "Мьюзик-трейд", "Кирдин | Stalk", "ДиоНиК", "Стасюк", "TV1000", "Hallmark", "Тоникс Медиа", "Бессонов", "Gears Media", "Бахурани", "NewDub", "Cinema Prestige", "Набиев", "New Dream Media", "ТВ3", "Малиновский Сергей", "Superbit", "Кенс Матвей", "LE-Production", "Voiz", "Светла", "Cinema Prestige", "JAM", "LDV", "Videogram", "Индия ТВ", "RedDiamond Studio", "Герусов", "Элегия фильм", "Nastia", "Семыкина Юлия", "Электричка", "Штамп Дмитрий", "Пятница", "Oneinchnales", "Gravi-TV", "D2Lab", "Кинопремьера", "Бусов Глеб", "LE-Production", "1001cinema", "Amazing Dubbing", "Emslie", "1+1", "100 ТВ", "1001 cinema", "2+2", "2х2", "3df voice", "4u2ges", "5 канал", "A. Lazarchuk", "AAA-Sound", "AB-Video", "AdiSound", "ALEKS KV", "AlexFilm", "AlphaProject", "Alternative Production", "Amalgam", "AMC", "Amedia", "AMS", "Andy", "AniLibria", "AniMedia", "Animegroup", "Animereactor", "AnimeSpace Team", "Anistar", "AniUA", "AniWayt", "Anything-group", "AOS", "Arasi project", "ARRU Workshop", "AuraFilm", "AvePremier", "AveTurk", "AXN Sci-Fi", "Azazel", "AzOnFilm", "BadBajo", "BadCatStudio", "BBC Saint-Petersburg", "BD CEE", "Black Street Records", "Bonsai Studio", "Boльгa", "Brain Production", "BraveSound", "BTI Studios", "Bubble Dubbing Company", "Byako Records", "Cactus Team", "Cartoon Network", "CBS Drama", "CDV", "Cinema Prestige", "CinemaSET GROUP", "CinemaTone", "ColdFilm", "Contentica", "CP Digital", "CPIG", "Crunchyroll", "Cuba77", "D1", "D2lab", "datynet", "DDV", "DeadLine", "DeadSno", "DeMon", "den904", "Description", "DexterTV", "Dice", "Discovery", "DniproFilm", "DoubleRec", "DreamRecords", "DVD Classic", "East Dream", "Eladiel", "Elegia", "ELEKTRI4KA", "Elrom", "ELYSIUM", "Epic Team", "eraserhead", "erogg", "Eurochannel", "Extrabit", "F-TRAIN", "Family Fan Edition", "FDV", "FiliZa Studio", "Film Prestige", "FilmGate", "FilmsClub", "FireDub", "Flarrow Films", "Flux-Team", "FocusStudio", "FOX", "Fox Crime", "Fox Russia", "FoxLife", "Foxlight", "Franek Monk", "Gala Voices", "Garsu Pasaulis", "Gears Media", "Gemini", "General Film", "GetSmart", "Gezell Studio", "Gits", "GladiolusTV", "GoldTeam", "Good People", "Goodtime Media", "GoodVideo", "GostFilm", "Gramalant", "Gravi-TV", "GREEN TEA", "GreenРай Studio", "Gremlin Creative Studio", "Hallmark", "HamsterStudio", "HiWay Grope", "Horizon Studio", "hungry_inri", "ICG", "ICTV", "IdeaFilm", "IgVin & Solncekleshka", "ImageArt", "INTERFILM", "Ivnet Cinema", "IНТЕР", "Jakob Bellmann", "JAM", "Janetta", "Jaskier", "JeFerSon", "jept", "JetiX", "Jetvis", "JimmyJ", "KANSAI", "KIHO", "kiitos", "KinoGolos", "Kinomania", "KosharaSerials", "Kолобок", "L0cDoG", "LakeFilms", "LDV", "LE-Production", "LeDoyen", "LevshaFilm", "LeXiKC", "Liga HQ", "Line", "Lisitz", "Lizard Cinema Trade", "Lord32x", "lord666", "LostFilm", "Lucky Production", "Macross", "madrid", "Mallorn Studio", "Marclail", "Max Nabokov", "MC Entertainment", "MCA", "McElroy", "Mega-Anime", "Melodic Voice Studio", "metalrus", "MGM", "MifSnaiper", "Mikail", "Milirina", "MiraiDub", "MOYGOLOS", "MrRose", "MTV", "Murzilka", "MUZOBOZ", "National Geographic", "NemFilm", "Neoclassica", "NEON Studio", "New Dream Media", "NewComers", "NewStation", "NewStudio", "Nice-Media", "Nickelodeon", "No-Future", "NovaFilm", "Novamedia", "Octopus", "Oghra-Brown", "OMSKBIRD", "Onibaku", "OnisFilms", "OpenDub", "OSLIKt", "Ozz TV", "PaDet", "Paramount Comedy", "Paramount Pictures", "Parovoz Production", "PashaUp", "Paul Bunyan", "Pazl Voice", "PCB Translate", "Persona99", "PiratVoice", "Postmodern", "Profix Media", "Project Web Mania", "Prolix", "QTV", "R5", "Radamant", "RainDeath", "RATTLEBOX", "RealFake", "Reanimedia", "Rebel Voice", "RecentFilms", "Red Media", "RedDiamond Studio", "RedDog", "RedRussian1337", "Renegade Team", "RG Paravozik", "RinGo", "RoxMarty", "Rumble", "RUSCICO", "RusFilm", "RussianGuy27", "Saint Sound", "SakuraNight", "Satkur", "Sawyer888", "Sci-Fi Russia", "SDI Media", "Selena", "seqw0", "SesDizi", "SGEV", "Shachiburi", "SHIZA", "ShowJet", "Sky Voices", "SkyeFilmTV", "SmallFilm", "SmallFilm", "SNK-TV", "SnowRecords", "SOFTBOX", "SOLDLUCK2", "Solod", "SomeWax", "Sony Channel", "Sony Turbo", "Sound Film", "SpaceDust", "ssvss", "st.Elrom", "STEPonee", "SunshineStudio", "Superbit", "Suzaku", "sweet couple", "TatamiFilm", "TB5", "TF-AniGroup", "The Kitchen Russia", "The Mike Rec.", "Timecraft", "To4kaTV", "Tori", "Total DVD", "TrainStudio", "Troy", "True Dubbing Studio", "TUMBLER Studio", "turok1990", "TV 1000", "TVShows", "Twister", "Twix", "Tycoon", "Ultradox", "Universal Russia", "VashMax2", "VendettA", "VHS", "VicTeam", "VictoryFilms", "Video-BIZ", "Videogram", "ViruseProject", "visanti-vasaer", "VIZ Media", "VO-production", "Voice Project Studio", "VoicePower", "VSI Moscow", "VulpesVulpes", "Wakanim", "Wayland team", "WestFilm", "WiaDUB", "WVoice", "XL Media", "XvidClub Studio", "zamez", "ZEE TV", "Zendos", "ZM-SHOW", "Zone Studio", "Zone Vision", "Агапов", "Акопян", "Алексеев", "Артемьев", "Багичев", "Бессонов", "Васильев", "Васильцев", "Гаврилов", "Герусов", "Готлиб", "Григорьев", "Дасевич", "Дольский", "Карповский", "Кашкин", "Киреев", "Клюквин", "Костюкевич", "Матвеев", "Михалев", "Мишин", "Мудров", "Пронин", "Савченко", "Смирнов", "Тимофеев", "Толстобров", "Чуев", "Шуваев", "Яковлев", "ААА-sound", "АБыГДе", "Акалит", "Акира", "Альянс", "Амальгама", "АМС", "АнВад", "Анубис", "Anubis", "Арк-ТВ", "АРК-ТВ Studio", "Б. Федоров", "Бибиков", "Бигыч", "Бойков", "Абдулов", "Белов", "Вихров", "Воронцов", "Горчаков", "Данилов", "Дохалов", "Котов", "Кошкин", "Назаров", "Попов", "Рукин", "Рутилов", "Варус Видео", "Васька Куролесов", "Ващенко С.", "Векшин", "Велес", "Весельчак", "Видеоимпульс", "Витя «говорун»", "Войсовер", "Вольга", "Ворон", "Воротилин", "Г. Либергал", "Г. Румянцев", "Гей Кино Гид", "ГКГ", "Глуховский", "Гризли", "Гундос", "Деньщиков", "Есарев", "Нурмухаметов", "Пучков", "Стасюк", "Шадинский", "Штамп", "sf@irat", "Держиморда", "Домашний", "ДТВ", "Дьяконов", "Е. Гаевский", "Е. Гранкин", "Е. Лурье", "Е. Рудой", "Е. Хрусталёв", "ЕА Синема", "Екатеринбург Арт", "Живаго", "Жучков", "З Ранку До Ночі", "Завгородний", "Зебуро", "Зереницын", "И. Еремеев", "И. Клушин", "И. Сафронов", "И. Степанов", "ИГМ", "Игмар", "ИДДК", "Имидж-Арт", "Инис", "Ирэн", "Ист-Вест", "К. Поздняков", "К. Филонов", "К9", "Карапетян", "Кармен Видео", "Карусель", "Квадрат Малевича", "Килька", "Кипарис", "Королев", "Котова", "Кравец", "Кубик в Кубе", "Кураж-Бамбей", "Л. Володарский", "Лазер Видео", "ЛанселаП", "Лапшин", "Лексикон", "Ленфильм", "Леша Прапорщик", "Лизард", "Люсьена", "Заугаров", "Иванов", "Иванова и П. Пашут", "Латышев", "Ошурков", "Чадов", "Яроцкий", "Максим Логинофф", "Малиновский", "Марченко", "Мастер Тэйп", "Махонько", "Машинский", "Медиа-Комплекс", "Мельница", "Мика Бондарик", "Миняев", "Мительман", "Мост Видео", "Мосфильм", "Муравский", "Мьюзик-трейд", "Н-Кино", "Н. Антонов", "Н. Дроздов", "Н. Золотухин", "Н.Севастьянов seva1988", "Набиев", "Наталья Гурзо", "НЕВА 1", "Невафильм", "НеЗупиняйПродакшн", "Неоклассика", "Несмертельное оружие", "НЛО-TV", "Новий", "Новый диск", "Новый Дубляж", "Новый Канал", "Нота", "НСТ", "НТВ", "НТН", "Оверлорд", "Огородников", "Омикрон", "Гланц", "Карцев", "Морозов", "Прямостанов", "Санаев", "Парадиз", "Пепелац", "Первый канал ОРТ", "Переводман", "Перец", "Петербургский дубляж", "Петербуржец", "Пирамида", "Пифагор", "Позитив-Мультимедиа", "Прайд Продакшн", "Премьер Видео", "Премьер Мультимедиа", "Причудики", "Р. Янкелевич", "Райдо", "Ракурс", "РенТВ", "Россия", "РТР", "Русский дубляж", "Русский Репортаж", "РуФилмс", "Рыжий пес", "С. Визгунов", "С. Дьяков", "С. Казаков", "С. Кузнецов", "С. Кузьмичёв", "С. Лебедев", "С. Макашов", "С. Рябов", "С. Щегольков", "С.Р.И.", "Сolumbia Service", "Самарский", "СВ Студия", "СВ-Дубль", "Светла", "Селена Интернешнл", "Синема Трейд", "Синема УС", "Синта Рурони", "Синхрон", "Советский", "Сокуров", "Солодухин", "Сонотек", "Сонькин", "Союз Видео", "Союзмультфильм", "СПД - Сладкая парочка", "Строев", "СТС", "Студии Суверенного Лепрозория", "Студия «Стартрек»", "KOleso", "Студия Горького", "Студия Колобок", "Студия Пиратского Дубляжа", "Студия Райдо", "Студия Трёх", "Гуртом", "Супербит", "Сыендук", "Так Треба Продакшн", "ТВ XXI век", "ТВ СПб", "ТВ-3", "ТВ6", "ТВИН", "ТВЦ", "ТВЧ 1", "ТНТ", "ТО Друзей", "Толмачев", "Точка Zрения", "Трамвай-фильм", "ТРК", "Уолт Дисней Компани", "Хихидок", "Хлопушка", "Цікава Ідея", "Четыре в квадрате", "Швецов", "Штамп", "Штейн", "Ю. Живов", "Ю. Немахов", "Ю. Сербин", "Ю. Товбин", "Я. Беллманн", "Red Head Sound", "UKR"]; - var filter_langs = [{ - title: '#{filter_lang_ru}', - code: 'ru' - }, { - title: '#{filter_lang_uk}', - code: 'uk' - }, { - title: '#{filter_lang_en}', - code: 'en' - }, { - title: '#{filter_lang_be}', - code: 'be' - }, { - title: '#{filter_lang_zh}', - code: 'zh|cn' - }, { - title: '#{filter_lang_ja}', - code: 'ja' - }, { - title: '#{filter_lang_ko}', - code: 'ko' - }, { - title: '#{filter_lang_af}', - code: 'af' - }, { - title: '#{filter_lang_sq}', - code: 'sq' - }, { - title: '#{filter_lang_ar}', - code: 'ar' - }, { - title: '#{filter_lang_az}', - code: 'az' - }, { - title: '#{filter_lang_hy}', - code: 'hy' - }, { - title: '#{filter_lang_ba}', - code: 'ba' - }, { - title: '#{filter_lang_bg}', - code: 'bg' - }, { - title: '#{filter_lang_bn}', - code: 'bn' - }, { - title: '#{filter_lang_bs}', - code: 'bs' - }, { - title: '#{filter_lang_ca}', - code: 'ca' - }, { - title: '#{filter_lang_ce}', - code: 'ce' - }, { - title: '#{filter_lang_cs}', - code: 'cs' - }, { - title: '#{filter_lang_da}', - code: 'da' - }, { - title: '#{filter_lang_ka}', - code: 'ka' - }, { - title: '#{filter_lang_de}', - code: 'de' - }, { - title: '#{filter_lang_el}', - code: 'el' - }, { - title: '#{filter_lang_es}', - code: 'es' - }, { - title: '#{filter_lang_et}', - code: 'et' - }, { - title: '#{filter_lang_fa}', - code: 'fa' - }, { - title: '#{filter_lang_fi}', - code: 'fi' - }, { - title: '#{filter_lang_fr}', - code: 'fr' - }, { - title: '#{filter_lang_ga}', - code: 'ga' - }, { - title: '#{filter_lang_gl}', - code: 'gl' - }, { - title: '#{filter_lang_gn}', - code: 'gn' - }, { - title: '#{filter_lang_he}', - code: 'he' - }, { - title: '#{filter_lang_hi}', - code: 'hi' - }, { - title: '#{filter_lang_hr}', - code: 'hr' - }, { - title: '#{filter_lang_hu}', - code: 'hu' - }, { - title: '#{filter_lang_id}', - code: 'id' - }, { - title: '#{filter_lang_is}', - code: 'is' - }, { - title: '#{filter_lang_it}', - code: 'it' - }, { - title: '#{filter_lang_kk}', - code: 'kk' - }, { - title: '#{filter_lang_ks}', - code: 'ks' - }, { - title: '#{filter_lang_ku}', - code: 'ku' - }, { - title: '#{filter_lang_ky}', - code: 'ky' - }, { - title: '#{filter_lang_lt}', - code: 'lt' - }, { - title: '#{filter_lang_lv}', - code: 'lv' - }, { - title: '#{filter_lang_mi}', - code: 'mi' - }, { - title: '#{filter_lang_mk}', - code: 'mk' - }, { - title: '#{filter_lang_mn}', - code: 'mn' - }, { - title: '#{filter_lang_mo}', - code: 'mo' - }, { - title: '#{filter_lang_mt}', - code: 'mt' - }, { - title: '#{filter_lang_no}', - code: 'no|nb|nn' - }, { - title: '#{filter_lang_ne}', - code: 'ne' - }, { - title: '#{filter_lang_nl}', - code: 'nl' - }, { - title: '#{filter_lang_pa}', - code: 'pa' - }, { - title: '#{filter_lang_pl}', - code: 'pl' - }, { - title: '#{filter_lang_ps}', - code: 'ps' - }, { - title: '#{filter_lang_pt}', - code: 'pt' - }, { - title: '#{filter_lang_ro}', - code: 'ro' - }, { - title: '#{filter_lang_si}', - code: 'si' - }, { - title: '#{filter_lang_sk}', - code: 'sk' - }, { - title: '#{filter_lang_sl}', - code: 'sl' - }, { - title: '#{filter_lang_sm}', - code: 'sm' - }, { - title: '#{filter_lang_so}', - code: 'so' - }, { - title: '#{filter_lang_sr}', - code: 'sr' - }, { - title: '#{filter_lang_sv}', - code: 'sv' - }, { - title: '#{filter_lang_sw}', - code: 'sw' - }, { - title: '#{filter_lang_ta}', - code: 'ta' - }, { - title: '#{filter_lang_tg}', - code: 'tg' - }, { - title: '#{filter_lang_th}', - code: 'th' - }, { - title: '#{filter_lang_tk}', - code: 'tk' - }, { - title: '#{filter_lang_tr}', - code: 'tr' - }, { - title: '#{filter_lang_tt}', - code: 'tt' - }, { - title: '#{filter_lang_ur}', - code: 'ur' - }, { - title: '#{filter_lang_uz}', - code: 'uz' - }, { - title: '#{filter_lang_vi}', - code: 'vi' - }, { - title: '#{filter_lang_yi}', - code: 'yi' - }]; filter_items.lang = filter_items.lang.concat(filter_langs.map(function (a) { - return Lang.translate(a.title); + return Lang$1.translate(a.title); })); scroll.minus(files.render().find('.explorer__files-head')); scroll.body().addClass('torrent-list'); @@ -30526,7 +35201,7 @@ this.parse = function () { var _this2 = this; - filter = new create$5(object); + filter = new Filter(object); Parser.get(object, function (data) { results = data; @@ -30538,11 +35213,11 @@ _this2.activity.toggle(); }, function (text) { - _this2.empty(Lang.translate('torrent_error_connect') + ': ' + text); + _this2.empty(Lang$1.translate('torrent_error_connect') + ': ' + text); }); filter.onSearch = function (value) { - Activity$1.replace({ + Activity.replace({ search: value, clarification: true }); @@ -30567,41 +35242,44 @@ empty.render().find('.simple-button').on('hover:enter', function () { filter.render().find('.filter--search').trigger('hover:enter'); }); - this.start = empty.start; + scroll.body().removeClass('torrent-list'); + this.start = empty.start.bind(empty); this.activity.loader(false); this.activity.toggle(); }; this.listEmpty = function () { var em = Template.get('empty_filter'); - var bn = $('
' + Lang.translate('filter_clarify') + '
'); + var bn = $('
' + Lang$1.translate('filter_clarify') + '
'); bn.on('hover:enter', function () { filter.render().find('.filter--filter').trigger('hover:enter'); }); + em.find('.empty-filter__subtitle').text(Lang$1.translate('empty_text')); em.find('.empty-filter__title').remove(); em.find('.empty-filter__buttons').removeClass('hide').append(bn); + scroll.body().removeClass('torrent-list'); scroll.append(em); }; this.buildSorted = function () { var need = Storage.get('torrents_sort', 'Seeders'); var select = [{ - title: Lang.translate('torrent_parser_sort_by_seeders'), + title: Lang$1.translate('torrent_parser_sort_by_seeders'), sort: 'Seeders' }, { - title: Lang.translate('torrent_parser_sort_by_size'), + title: Lang$1.translate('torrent_parser_sort_by_size'), sort: 'Size' }, { - title: Lang.translate('torrent_parser_sort_by_name'), + title: Lang$1.translate('torrent_parser_sort_by_name'), sort: 'Title' }, { - title: Lang.translate('torrent_parser_sort_by_tracker'), + title: Lang$1.translate('torrent_parser_sort_by_tracker'), sort: 'Tracker' }, { - title: Lang.translate('torrent_parser_sort_by_date'), + title: Lang$1.translate('torrent_parser_sort_by_date'), sort: 'PublisTime' }, { - title: Lang.translate('torrent_parser_sort_by_viewed'), + title: Lang$1.translate('torrent_parser_sort_by_viewed'), sort: 'viewed' }]; select.forEach(function (element) { @@ -30672,9 +35350,9 @@ }); }; - filter_items.voice = [Lang.translate('torrent_parser_any_two'), Lang.translate('torrent_parser_voice_dubbing'), Lang.translate('torrent_parser_voice_polyphonic'), Lang.translate('torrent_parser_voice_two'), Lang.translate('torrent_parser_voice_amateur')]; - filter_items.tracker = [Lang.translate('torrent_parser_any_two')]; - filter_items.season = [Lang.translate('torrent_parser_any_two')]; + filter_items.voice = [Lang$1.translate('torrent_parser_any_two'), Lang$1.translate('torrent_parser_voice_dubbing'), Lang$1.translate('torrent_parser_voice_polyphonic'), Lang$1.translate('torrent_parser_voice_two'), Lang$1.translate('torrent_parser_voice_amateur')]; + filter_items.tracker = [Lang$1.translate('torrent_parser_any_two')]; + filter_items.season = [Lang$1.translate('torrent_parser_any_two')]; results.Results.forEach(function (element) { var title = element.Title.toLowerCase(), tracker = element.Tracker; @@ -30733,18 +35411,18 @@ need.season = Arrays.removeNoIncludes(Arrays.toArray(need.season), filter_items.season); this.setFilterData(need); select.push({ - title: Lang.translate('torrent_parser_reset'), + title: Lang$1.translate('torrent_parser_reset'), reset: true }); - add('quality', Lang.translate('torrent_parser_quality')); + add('quality', Lang$1.translate('torrent_parser_quality')); add('hdr', 'HDR'); add('dv', 'Dolby Vision'); - add('sub', Lang.translate('torrent_parser_subs')); - add('voice', Lang.translate('torrent_parser_voice')); - add('lang', Lang.translate('title_language_short')); - add('season', Lang.translate('torrent_parser_season')); - add('tracker', Lang.translate('torrent_parser_tracker')); - add('year', Lang.translate('torrent_parser_year')); + add('sub', Lang$1.translate('torrent_parser_subs')); + add('voice', Lang$1.translate('torrent_parser_voice')); + add('lang', Lang$1.translate('title_language_short')); + add('season', Lang$1.translate('torrent_parser_season')); + add('tracker', Lang$1.translate('torrent_parser_tracker')); + add('year', Lang$1.translate('torrent_parser_year')); filter.set('filter', select); this.selectedFilter(); }; @@ -30823,7 +35501,7 @@ }; if (results.Results.length) this.showResults();else { - this.empty(Lang.translate('torrent_parser_empty')); + this.empty(Lang$1.translate('torrent_parser_empty')); } }; @@ -30981,6 +35659,8 @@ total_pages = Math.ceil(filtred.length / 20); if (filtred.length) { + scroll.body().addClass('torrent-list'); + scroll.append(history.render(true)); this.append(filtred.slice(0, 20)); } else { this.listEmpty(); @@ -31029,7 +35709,7 @@ movie: object.movie } }, function () { - Noty.show(object.movie.title + ' - ' + Lang.translate('torrent_parser_added_to_mytorrents')); + Noty.show(object.movie.title + ' - ' + Lang$1.translate('torrent_parser_added_to_mytorrents')); }); }; @@ -31037,14 +35717,14 @@ var _this4 = this; items.forEach(function (element) { - var date = Utils$2.parseTime(element.PublishDate); - var bitrate = object.movie.runtime ? Utils$2.calcBitrate(element.Size, object.movie.runtime) : 0; + var date = Utils$1.parseTime(element.PublishDate); + var bitrate = object.movie.runtime ? Utils$1.calcBitrate(element.Size, object.movie.runtime) : 0; Arrays.extend(element, { title: element.Title, date: date.full, tracker: element.Tracker, bitrate: bitrate, - size: !isNaN(parseInt(element.Size)) ? Utils$2.bytesToSize(element.Size) : element.size, + size: !isNaN(parseInt(element.Size)) ? Utils$1.bytesToSize(element.Size) : element.size, seeds: element.Seeders, grabs: element.Peers }); @@ -31092,8 +35772,8 @@ return name.toLowerCase().indexOf(v.toLowerCase()) >= 0; }); name = translate ? translate : name; - if (name.toLowerCase().indexOf('dub') >= 0 || name.toLowerCase() == 'd') name = Lang.translate('torrent_parser_voice_dubbing'); - line.push(Utils$2.shortText(Utils$2.capitalizeFirstLetter(name), 20)); + if (name.toLowerCase().indexOf('dub') >= 0 || name.toLowerCase() == 'd') name = Lang$1.translate('torrent_parser_voice_dubbing'); + line.push(Utils$1.shortText(Utils$1.capitalizeFirstLetter(name), 20)); } if (line.length) ffprobe_tags.push({ @@ -31136,7 +35816,6 @@ item.on('hover:focus', function (e) { last = e.target; scroll.update($(e.target), true); - Helper.show('torrents', Lang.translate('helper_torrents'), item); }).on('hover:hover hover:touch', function (e) { last = e.target; Navigator.focused(last); @@ -31158,15 +35837,15 @@ }).on('hover:long', function () { var enabled = Controller.enabled().name; var menu = [{ - title: Lang.translate('torrent_parser_add_to_mytorrents'), + title: Lang$1.translate('torrent_parser_add_to_mytorrents'), tomy: true }, { - title: Lang.translate('torrent_parser_label_title'), - subtitle: Lang.translate('torrent_parser_label_descr'), + title: Lang$1.translate('torrent_parser_label_title'), + subtitle: Lang$1.translate('torrent_parser_label_descr'), mark: true }, { - title: Lang.translate('torrent_parser_label_cancel_title'), - subtitle: Lang.translate('torrent_parser_label_cancel_descr'), + title: Lang$1.translate('torrent_parser_label_cancel_title'), + subtitle: Lang$1.translate('torrent_parser_label_cancel_descr'), unmark: true }]; Lampa.Listener.send('torrent', { @@ -31176,7 +35855,7 @@ menu: menu }); Select.show({ - title: Lang.translate('title_action'), + title: Lang$1.translate('title_action'), items: menu, onBack: function onBack() { Controller.toggle(enabled); @@ -31205,18 +35884,16 @@ }; this.back = function () { - Activity$1.backward(); + Activity.backward(); }; this.start = function () { - if (Lampa.Activity.active().activity !== this.activity) return; - if (!initialized) { initialized = true; this.initialize(); } - Background.immediately(Utils$2.cardImgBackgroundBlur(object.movie)); + Background.immediately(Utils$1.cardImgBackgroundBlur(object.movie)); Controller.add('content', { toggle: function toggle() { Controller.collectionSet(scroll.render(), files.render(true)); @@ -31241,9 +35918,21 @@ back: this.back }); Controller.toggle('content'); + listener = new Listener(object.movie); + listener.listener.follow('open', function (e) { + if (object.movie.original_name) { + history.set({ + balanser_name: 'Torrent', + season: e.element.season, + episode: e.element.episode + }); + } + }); }; - this.pause = function () {}; + this.pause = function () { + listener.destroy(); + }; this.stop = function () {}; @@ -31256,418 +35945,174 @@ Parser.clear(); files.destroy(); scroll.destroy(); + listener.destroy(); results = null; network = null; }; } - function component$c(object) { - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - step: 250, - end_ratio: 2 - }); - var items = []; - var html = $('
'); - var body = $('
'); - var total_pages = 0; - var last; - var torrents = []; + /** + * Компонент "Мои торренты" + * @param {*} object + * @returns + */ - this.create = function () { - var _this = this; - - this.activity.loader(true); - Torserver.my(this.build.bind(this), function () { - var empty = new Empty(); - html.append(empty.render()); - _this.start = empty.start; - - _this.activity.loader(false); - - _this.activity.toggle(); - }); - return this.render(); - }; - - this.next = function () { - if (object.page < 15 && object.page < total_pages) { - object.page++; - var offset = object.page - 1; - this.append(torrents.slice(20 * offset, 20 * offset + 20), true); + function component$f(object) { + var comp = Utils$1.createInstance(Full, object, { + empty: { + router: 'mytorrents' } - }; + }); + comp.use(Router, 0); + comp.use({ + onCreate: function onCreate() { + var _this = this; - this.append = function (data, append) { - var _this2 = this; + Torserver.my(function (result) { + result.forEach(function (item) { + item.title = item.title.replace('[LAMPA] ', ''); + item.data = Arrays.decodeJson(item.data, {}); - data.forEach(function (element) { - element.title = element.title.replace('[LAMPA] ', ''); - var item_data = Arrays.decodeJson(element.data, {}); - var card = new Card(element, { - card_category: true - }); - card.create(); + if (item.data.movie && item.data.movie.poster) { + item.poster = item.data.movie.poster; + } - card.onFocus = function (target, card_data) { - last = target; - scroll.update(card.render(), true); - Background.change(item_data.movie ? Utils$2.cardImgBackground(item_data.movie) : element.poster); - if (scroll.isEnd()) _this2.next(); - }; + item.params = { + module: Helper$9.only('Card', 'Release', 'Callback') + }; + }); - card.onEnter = function (target, card_data) { - last = target; + _this.build({ + results: result + }); + }, this.empty.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onEnter: function onEnter() { + if (!this.disabled) Torrent.open(data.hash, data.data.lampa && data.data.movie ? data.data.movie : false); + }, + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + }, + onLong: function onLong() { + if (this.disabled) return; + var enabled = Controller.enabled().name; + var menu = []; - _this2.start(); + if (data.data.movie) { + menu.push({ + title: Lang$1.translate('title_card'), + onSelect: router.call.bind(router, 'full', data.data) + }); + } - Torrent.open(card_data.hash, item_data.lampa && item_data.movie ? item_data.movie : false); - }; - - card.onMenu = function (target, card_data) { - var enabled = Controller.enabled().name; - var menu = []; - - if (item_data.movie) { menu.push({ - title: Lang.translate('title_card') + title: Lang$1.translate('torrent_remove_title'), + subtitle: Lang$1.translate('torrent_remove_descr'), + onSelect: function onSelect() { + Torserver.remove(data.hash); + item.disable(); + Controller.toggle(enabled); + } + }); + Select.show({ + title: Lang$1.translate('title_action'), + items: menu, + onBack: function onBack() { + Controller.toggle(enabled); + } }); } - - menu.push({ - title: Lang.translate('torrent_remove_title'), - subtitle: Lang.translate('torrent_remove_descr'), - remove: true - }); - Select.show({ - title: Lang.translate('title_action'), - items: menu, - onBack: function onBack() { - Controller.toggle(enabled); - }, - onSelect: function onSelect(a) { - if (a.remove) { - Torserver.remove(card_data.hash); - Arrays.remove(items, card); - card.destroy(); - last = false; - Controller.toggle(enabled); - } else { - Activity$1.push({ - url: item_data.movie.url, - component: 'full', - id: item_data.movie.id, - method: item_data.movie.name ? 'tv' : 'movie', - card: item_data.movie, - source: item_data.movie.source || 'cub' - }); - } - } - }); - }; - - card.visible(); - body.append(card.render()); - if (append) Controller.collectionAppend(card.render()); - items.push(card); - }); - }; - - this.build = function (data) { - torrents = data; - total_pages = Math.ceil(torrents.length / 20); - scroll.minus(); - this.append(torrents.slice(0, 20)); - scroll.append(body); - html.append(scroll.render()); - this.activity.loader(false); - this.activity.toggle(); - }; - - this.start = function () { - Controller.add('content', { - toggle: function toggle() { - Controller.collectionSet(scroll.render()); - Controller.collectionFocus(last || false, scroll.render()); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - right: function right() { - Navigator.move('right'); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function () { - return html; - }; - - this.destroy = function () { - network.clear(); - Arrays.destroy(items); - scroll.destroy(); - html.remove(); - body.remove(); - network = null; - items = null; - html = null; - body = null; - }; - } - - function component$b(object) { - var comp = new component$i(object); - - comp.create = function () { - this.activity.loader(true); - Api.relise(object, this.build.bind(this), this.empty.bind(this)); - }; - - comp.nextPageReuest = function (object, resolve, reject) { - Api.relise(object, resolve.bind(this), reject.bind(this)); - }; - - return comp; - } - - function component$a(object) { - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - step: 250, - end_ratio: 2 + }); + } }); - var items = []; - var html = $('
'); - var body = $('
'); - var last; - var collections = []; - var waitload; - - this.create = function () { - var _this = this; - - this.activity.loader(true); - Api.collections(object, this.build.bind(this), function () { - var empty = new Empty(); - html.append(empty.render()); - _this.start = empty.start; - - _this.activity.loader(false); - - _this.activity.toggle(); - }); - return this.render(); - }; - - this.next = function () { - var _this2 = this; - - if (waitload) return; - - if (object.page < 30) { - waitload = true; - object.page++; - Api.collections(object, function (result) { - _this2.append(result.results, true); - - if (result.results.length) waitload = false; - }, function () {}); - } - }; - - this.append = function (data, append) { - var _this3 = this; - - data.forEach(function (element) { - var card = new Card(element, { - card_collection: true, - object: object - }); - card.create(); - - card.onFocus = function (target, card_data) { - last = target; - scroll.update(card.render(), true); - Background.change(Utils$2.cardImgBackground(card_data)); - if (scroll.isEnd()) _this3.next(); - }; - - card.onEnter = function (target, card_data) { - Activity$1.push({ - url: card_data.url, - id: card_data.id, - title: Lang.translate('title_collections') + ' - ' + card_data.title, - component: 'collections_view', - source: object.source, - page: 1 - }); - }; - - card.onMenu = function (target, card_data) {}; - - card.visible(); - body.append(card.render()); - if (append) Controller.collectionAppend(card.render()); - items.push(card); - }); - }; - - this.build = function (data) { - collections = data.results; - scroll.minus(); - this.append(collections.slice(0, 20)); - scroll.append(body); - html.append(scroll.render()); - this.activity.loader(false); - this.activity.toggle(); - }; - - this.start = function () { - Controller.add('content', { - toggle: function toggle() { - Controller.collectionSet(scroll.render()); - Controller.collectionFocus(last || false, scroll.render()); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - right: function right() { - Navigator.move('right'); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function () { - return html; - }; - - this.destroy = function () { - network.clear(); - Arrays.destroy(items); - scroll.destroy(); - html.remove(); - body.remove(); - network = null; - items = null; - html = null; - body = null; - }; - } - - function component$9(object) { - var comp = new component$i(object); - - comp.create = function () { - this.activity.loader(true); - Api.collections(object, this.build.bind(this), this.empty.bind(this)); - }; - return comp; } - function component$8(object) { - var html = $('
'); - var empty = new Empty(); + /** + * Компонент "Релизы" + * @param {*} object + * @returns + */ - this.create = function () { - var card = object.movie || object.card; - var foot = $(''); - var button_reset = $('
' + Lang.translate('title_reset') + '
'); - var button_movie = $('
' + Lang.translate('back_to_card') + '
'); - button_reset.on('hover:enter', function () { - Activity$1.replace(); - }); - foot.append(button_reset); - - if (card) { - button_movie.on('hover:enter', function () { - Activity$1.replace({ - component: 'full', - card: card, - id: card.id, - method: card.number_of_seasons ? 'tv' : 'movie', - source: card.source || 'cub' - }); + function component$e(object) { + var comp = Utils$1.createInstance(Full, object, { + module: Helper$5.toggle(Helper$5.MASK.base, 'Pagination') + }); + comp.use({ + onCreate: function onCreate() { + Api.relise(object, this.build.bind(this), this.empty.bind(this)); + }, + onNext: function onNext(resolve, reject) { + Api.relise(object, resolve.bind(this), reject.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } }); - foot.append(button_movie); } - - empty.append(foot); - html.append(empty.render()); - this.start = empty.start; - this.activity.loader(false); - this.activity.toggle(); - }; - - this.start = function () { - Controller.add('content', { - toggle: function toggle() { - Controller.collectionSet(empty.render()); - Controller.collectionFocus(false, empty.render()); - }, - left: function left() { - Controller.toggle('menu'); - }, - up: function up() { - Controller.toggle('head'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function () { - return html; - }; - - this.destroy = function () { - html.remove(); - }; + }); + return comp; } - function component$7(object) { + /** + * Компонент "Нет контента" + * @param {*} object + */ + + var Component$1 = /*#__PURE__*/function (_Emit) { + _inherits(Component, _Emit); + + var _super = _createSuper(Component); + + function Component(object) { + var _this; + + _classCallCheck(this, Component); + + _this = _super.call(this); + _this.object = object || {}; + + _this.emit('init'); + + return _this; + } + + _createClass(Component, [{ + key: "create", + value: function create() { + this.html = $('
'); + this.empty = new Empty({}); + this.html.append(this.empty.render()); + this.start = this.empty.start.bind(this.empty); + this.emit('create'); + this.activity.loader(false); + this.activity.toggle(); + } + }, { + key: "render", + value: function render() { + return this.html; + } + }, { + key: "destroy", + value: function destroy() { + this.html.remove(); + this.emit('destroy'); + } + }]); + + return Component; + }(Emit); + + function component$d(object) { var _this = this; - var scroll = new create$f({ + var scroll = new Scroll({ mask: true, over: true, step: 300 @@ -31679,7 +36124,7 @@ var last; this.create = function () { - if (Account.working()) cards = Account.all(); + if (Account$1.Permit.sync) cards = Account$1.Bookmarks.all(); if (table.length) { var date_max = 0; @@ -31688,7 +36133,7 @@ var date_one = 24 * 60 * 60 * 1000; table.forEach(function (elem) { elem.episodes.forEach(function (ep) { - var air = Utils$2.parseToDate(ep.air_date); + var air = Utils$1.parseToDate(ep.air_date); var tim = air.getTime(); if (date_max < tim) { @@ -31718,10 +36163,10 @@ this.empty = function () { var empty = new Empty({ - descr: Lang.translate('timetable_empty') + descr: Lang$1.translate('timetable_empty') }); html.append(empty.render()); - _this.start = empty.start; + _this.start = empty.start.bind(empty); _this.activity.loader(false); @@ -31732,8 +36177,8 @@ var item = $("\n
\n
\n
\n
\n
\n
\n "); var air_date = date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + date.getDate()).slice(-2); var air_epis = []; - var day_week = Utils$2.parseTime(date.getTime()); - var weeks = [Lang.translate('week_7'), Lang.translate('week_1'), Lang.translate('week_2'), Lang.translate('week_3'), Lang.translate('week_4'), Lang.translate('week_5'), Lang.translate('week_6')]; + var day_week = Utils$1.parseTime(date.getTime()); + var weeks = [Lang$1.translate('week_7'), Lang$1.translate('week_1'), Lang$1.translate('week_2'), Lang$1.translate('week_3'), Lang$1.translate('week_4'), Lang$1.translate('week_5'), Lang$1.translate('week_6')]; table.forEach(function (elem) { elem.episodes.forEach(function (ep) { var card = cards.find(function (card) { @@ -31753,7 +36198,7 @@ if (air_epis.length) { air_epis.slice(0, 3).forEach(function (elem) { - item.find('.timetable__body').append('
' + elem.card.name + '
'); + item.find('.timetable__body').append('
' + elem.card.name + '
'); }); if (air_epis.length > 3) { @@ -31761,8 +36206,8 @@ } if (air_epis.length == 1) { - var preview = $('
' + (air_epis[0].episode.name || Lang.translate('noname')) + '
'); - Utils$2.imgLoad(preview.find('img'), TMDB$1.image('t/p/w200/' + air_epis[0].episode.still_path), false, function () { + var preview = $('
' + (air_epis[0].episode.name || Lang$1.translate('noname')) + '
'); + Utils$1.imgLoad(preview.find('img'), TMDB$1.image('t/p/w200/' + air_epis[0].episode.still_path), false, function () { preview.find('img').remove(); }); item.find('.timetable__body').prepend(preview); @@ -31782,17 +36227,21 @@ last = $(this)[0]; var modal = $('
'); air_epis.forEach(function (elem) { + var foot = $(''); var noty = Template.get('notice_card', { - time: Utils$2.parseTime(air_date).full, + time: Utils$1.parseTime(air_date).full, title: elem.card.name, - descr: Lang.translate('full_season') + ' - ' + elem.episode.season_number + '
' + Lang.translate('full_episode') + ' - ' + elem.episode.episode_number + '' + descr: Lang$1.translate('card_new_episode') }); - Utils$2.imgLoad(noty.find('img'), elem.card.poster ? elem.card.poster : elem.card.img ? elem.card.img : TMDB$1.image('t/p/w200/' + elem.card.poster_path), function () { + foot.append('
S - ' + elem.episode.season_number + '
'); + foot.append('
E - ' + elem.episode.episode_number + '
'); + noty.find('.notice__descr').append(foot); + Utils$1.imgLoad(noty.find('img'), TMDB$1.image('t/p/w200/' + elem.card.poster_path), function () { noty.addClass('image--loaded'); }); noty.on('hover:enter', function () { Modal.close(); - Activity$1.push({ + Activity.push({ url: '', component: 'full', id: elem.card.id, @@ -31804,7 +36253,7 @@ modal.append(noty); }); Modal.open({ - title: Lang.translate('menu_tv'), + title: Lang$1.translate('menu_tv'), size: 'medium', html: modal, onBack: function onBack() { @@ -31817,7 +36266,7 @@ }; this.back = function () { - Activity$1.backward(); + Activity.backward(); }; this.start = function () { @@ -31826,6 +36275,7 @@ toggle: function toggle() { Controller.collectionSet(scroll.render()); Controller.collectionFocus(last || false, scroll.render()); + Background.change(TMDB$1.image('t/p/w200/oXPYD4c3bLtfAS2FzwjZh7NWqo4.jpg')); }, left: function left() { if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); @@ -31858,82 +36308,144 @@ }; } - function component$6(object) { - var comp = new component$i(object); + /** + * Компонент "Подписки" + * @param {*} object + * @returns + */ - comp.create = function () { - this.activity.loader(true); - Account.subscribes(object, this.build.bind(this), this.empty.bind(this)); - return this.render(); - }; + function component$c(object) { + var comp = Utils$1.createInstance(Full, object, { + empty: { + account: true, + router: 'subscribe' + } + }); + comp.use(Router, 0); + comp.use({ + onCreate: function onCreate() { + var _this = this; + Account$1.Api.subscribes({ + to_card_subscribe: true + }, function (data) { + data.results.forEach(function (card) { + card.params = { + module: Helper$9.toggle(Helper$9.MASK.base, 'Subscribe') + }; + }); + + _this.build(data); + }, this.empty.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } + }); + } + }); return comp; } - function Company(data) { - var html; - - this.create = function () { - html = Template.get('company', { - name: data.name, - img: data.logo_path ? Api.img(data.logo_path) : data.img || 'img/img_broken.svg', - place: (data.headquarters ? data.headquarters + (data.origin_country ? ', ' : '') : '') + (data.origin_country ? data.origin_country : '') + var About = { + onCreate: function onCreate() { + this.html = Template.js('company', { + name: this.data.name, + place: (this.data.headquarters ? this.data.headquarters + (this.data.origin_country ? ', ' : '') : '') + (this.data.origin_country ? this.data.origin_country : '') }); - if (!data.logo_path) html.addClass('icon--broken'); - }; - - this.toggle = function () { - var _this = this; - - Controller.add('company', { - invisible: true, - toggle: function toggle() { - Controller.collectionSet(_this.render()); - Controller.collectionFocus(false, _this.render()); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - down: this.onDown, - up: this.onUp, - back: this.onBack + Utils$1.imgLoad(this.html.find('img'), this.data.logo_path ? TMDB.img(this.data.logo_path, 'w500') : this.data.img || 'img/img_broken.svg', function (img) { + img.addClass('loaded'); }); - Controller.toggle('company'); - }; + } + }; - this.render = function (js) { - return js ? html[0] : html; - }; + var CompanyMap = { + About: About + }; - this.destroy = function () { - html.remove(); - }; - } + var Company = /*#__PURE__*/function (_Constructor) { + _inherits(Company, _Constructor); - function component$5(object) { - var comp = new Lampa.InteractionMain(object); + var _super = _createSuper(Company); - comp.create = function () { - var _this = this; + function Company() { + _classCallCheck(this, Company); - this.activity.loader(true); - Api.company(object, function (data) { - var company = new Company(data.company); - company.create(); + return _super.apply(this, arguments); + } - _this.push(company); + return Company; + }(Constructor(CompanyMap)); - _this.build(data.lines); - }, this.empty.bind(this)); - return this.render(); - }; + var Helper$4 = new Mask(Arrays.getKeys(CompanyMap)); + Helper$4.MASK.base = Helper$4.MASK.none; + function component$b(object) { + var comp = Utils$1.createInstance(Full$1, object); + comp.use({ + onCreate: function onCreate() { + var _this = this; + + Api.company(object, function (data) { + object.company = data.company; + Arrays.insert(data.lines, 0, { + results: [], + params: { + module: Helper$b.MASK.none, + emit: { + onCreate: function onCreate() { + this.company = Utils$1.createInstance(Company, object.company, { + module: Helper$4.only('About') + }); + this.company.create(); + this.scroll.append(this.company.render(true)); + }, + onDestroy: function onDestroy() { + var _this$company; + + (_this$company = this.company) === null || _this$company === void 0 ? void 0 : _this$company.destroy(); + } + } + } + }); + + _this.build(data.lines); + }, this.empty.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onMore: router.call.bind(router, 'category_full', { + url: data.url, + title: data.title, + companies: object.company.id, + sort_by: 'vote_count.desc', + source: 'tmdb' + }), + onInstance: function onInstance(card, data) { + card.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } + }); + } + }); + } + }); return comp; } + /** + * Компонент "Лента" + * @param {*} object + */ + function Feed(object) { - var network = new create$e(); - var scroll = new create$f({ + var network = new Request(); + var scroll = new Scroll({ mask: true, over: true, step: 250, @@ -31947,7 +36459,7 @@ var _this = this; this.activity.loader(true); - network.silent(Utils$2.protocol() + object$2.cub_domain + '/api/feed/all', this.build.bind(this), function () { + network.silent(Utils$1.protocol() + object$2.cub_domain + '/api/feed/all', this.build.bind(this), function () { var empty = new Empty(); html.append(empty.render(true)); _this.start = empty.start; @@ -32012,7 +36524,7 @@ if (element.type == 'episode') { tags = element.hash.split(';').map(function (a) { - return Lang.translate(a.slice(0, 1) == 's' ? 'torrent_serial_season' : 'torrent_serial_episode') + ' - ' + a.slice(1); + return Lang$1.translate(a.slice(0, 1) == 's' ? 'torrent_serial_season' : 'torrent_serial_episode') + ' - ' + a.slice(1); }); } else if (element.data.genres) tags.push(element.data.genres.join(', '));else if (element.data.genre_ids) { tags.push(Api.sources.tmdb.getGenresNameFromIds(element.card_type, element.data.genre_ids).join(', ')); @@ -32035,14 +36547,14 @@ scroll.append(item); var btn_watch = document.createElement('div'); btn_watch.addClass('simple-button selector'); - btn_watch.text(Lang.translate('title_watch')); + btn_watch.text(Lang$1.translate('title_watch')); btn_watch.on('hover:focus', function () { last = btn_watch; scroll.update(item); Background.change(Api.img(element.data.poster_path, 'w500')); }); btn_watch.on('hover:enter', function () { - Activity$1.push({ + Activity.push({ url: '', component: 'full', id: element.card_id, @@ -32060,8 +36572,8 @@ feed = data.result; html.addClass('feed'); var head = Template.js('feed_head'); - head.find('.feed-head__title').text(Lang.translate('lampa_movie_title')); - head.find('.feed-head__info').html(Lang.translate('lampa_movie_descr')); + head.find('.feed-head__title').text(Lang$1.translate('lampa_movie_title')); + head.find('.feed-head__info').html(Lang$1.translate('lampa_movie_descr')); head.on('hover:focus', scroll.update.bind(scroll, head)); scroll.minus(); @@ -32096,16 +36608,12 @@ if (Navigator.canmove('down')) Navigator.move('down'); }, back: function back() { - Activity$1.backward(); + Activity.backward(); } }); Controller.toggle('content'); }; - this.pause = function () {}; - - this.stop = function () {}; - this.render = function () { return html; }; @@ -32117,1154 +36625,844 @@ }; } + var Line$1 = { + onCreate: function onCreate() { + this.html = Template.js('register'); + this.html.addClass('selector register--line'); + this.html.find('.register__name').text(this.data.title); + this.html.find('.register__counter').text(this.data.count); + + if (this.data.limit) { + this.html.find('.register__counter').append(Template.elem('span', { + "class": 'register__limit', + text: '/ ' + this.data.limit + })); + } + } + }; + + var RegisterMap = { + Line: Line$1, + Callback: Callback$1 + }; + + var Register = /*#__PURE__*/function (_Constructor) { + _inherits(Register, _Constructor); + + var _super = _createSuper(Register); + + function Register() { + _classCallCheck(this, Register); + + return _super.apply(this, arguments); + } + + return Register; + }(Constructor(RegisterMap)); + + var Helper$3 = new Mask(Arrays.getKeys(RegisterMap)); + Helper$3.MASK.base = Helper$3.MASK.none; + /** - * Карточка - * @param {object} data - * @param {{isparser:boolean, card_small:boolean, card_category:boolean, card_collection:boolean, card_wide:true}} params + * Компонент "Избранное" + * @param {*} object + * @returns */ - function Folder(data) { - var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - this.data = data; - this.params = params; - this.card = this.data.length ? this.data[0] : {}; - - this.create = function () { - var _this = this; - - this.folder = Template.js('bookmarks_folder'); - this.folder.querySelector('.bookmarks-folder__title').innerText = Lang.translate('menu_' + params.media); - this.folder.querySelector('.bookmarks-folder__num').innerText = this.data.length; - this.folder.addEventListener('hover:focus', function () { - if (_this.onFocus) _this.onFocus(_this.folder, _this.card); - }); - this.folder.addEventListener('hover:touch', function () { - if (_this.onTouch) _this.onTouch(_this.folder, _this.card); - }); - this.folder.addEventListener('hover:hover', function () { - if (_this.onHover) _this.onHover(_this.folder, _this.card); - }); - this.folder.addEventListener('hover:enter', function () { - Activity$1.push({ - url: '', - title: Lang.translate('title_' + params.category) + ' - ' + Lang.translate('menu_' + params.media), - component: 'favorite', - type: params.category, - filter: params.media, - page: 1 - }); - }); - this.folder.addEventListener('visible', this.visible.bind(this)); - }; - /** - * Загрузить картинку - */ - - - this.image = function (src, i) { - var _this2 = this; - - var img = document.createElement('img'); - img.addClass('card__img'); - img.addClass('i-' + i); - - img.onload = function () { - _this2.folder.classList.add('card--loaded'); - }; - - img.onerror = function () { - img.src = './img/img_broken.svg'; - }; - - this.folder.querySelector('.bookmarks-folder__body').append(img); - img.src = src; - }; - /** - * Загружать картинку если видна карточка - */ - - - this.visible = function () { - var _this3 = this; - - var filtred = this.data.filter(function (a) { - return a.poster_path; - }).slice(0, 3); - filtred.forEach(function (a, i) { - _this3.image(Api.img(a.poster_path), i); - }); - if (filtred.length == 0) this.image('./img/img_load.svg'); - if (this.onVisible) this.onVisible(this.folder, data); - }; - /** - * Уничтожить - */ - - - this.destroy = function () { - this.folder.remove(); - }; - /** - * Рендер - * @returns {object} - */ - - - this.render = function (js) { - return js ? this.folder : $(this.folder); - }; - } - - function component$4(object) { + function component$a(object) { var all = Favorite.all(); - var comp = new Lampa.InteractionMain(object); - var viev_all = false; - var timer; - - comp.create = function () { - this.activity.loader(true); - Account.notice(function (notice) { - var invoice = notice.filter(function (a) { - return a.method == 'tv-voice'; - }); + var comp = Utils$1.createInstance(Full$1, object, { + empty: { + router: 'bookmarks' + } + }); + comp.use(Router, 0); + comp.use({ + onCreate: function onCreate() { var category = ['look', 'scheduled', 'book', 'like', 'wath', 'viewed', 'continued', 'thrown']; var lines = []; - var voice = []; var folders = ['book', 'like', 'wath', 'viewed', 'scheduled', 'thrown']; var media = ['movies', 'tv']; + var premium = Account$1.hasPremium(); + var sync = Account$1.Permit.sync; + lines.push({ + results: [], + params: { + module: Helper$b.toggle(Helper$b.MASK.base, 'More', 'Event'), + items: { + view: 20 + } + } + }); // Добавляем категории - function draw() { - category.forEach(function (a) { - if (all[a].length) { - var items = Arrays.clone(all[a].slice(0, 20)); - - if (folders.indexOf(a) > -1) { - var i = 0; - media.forEach(function (m) { - var filter = Utils$2.filterCardsByType(all[a], m); - - if (filter.length) { - Arrays.insert(items, i, { - cardClass: function cardClass() { - return new Folder(filter, { - category: a, - media: m - }); - } - }); - i++; - } - }); - items = items.slice(0, 20); + category.forEach(function (a) { + if (all[a].length) { + lines[0].results.push({ + title: Lang$1.translate('title_' + a), + count: all[a].length, + limit: sync ? premium ? 2000 : 500 : 0, + params: { + module: Helper$3.only('Line', 'Callback'), + createInstance: function createInstance(item) { + return new Register(item); + }, + emit: { + onEnter: router.call.bind(router, 'favorite', { + type: a + }) + } } + }); + } + }); + if (lines[0].results.length == 0) lines = []; // Добавляем карточки - items.forEach(function (a) { - return a.ready = false; - }); - lines.push({ - title: Lang.translate('title_' + a), - results: items, - type: a - }); - all[a].forEach(function (card) { - var noti = invoice.find(function (a) { - return a.card_id == card.id; - }); - - if (noti) { - // сам не помню, баг будет если не клонировать - var card_clone = Arrays.clone(card); - card_clone.ready = false; - var hash = Utils$2.hash([noti.season, noti.season > 10 ? ':' : '', noti.episode, card_clone.original_title].join('')); - var view = Timeline$1.view(hash); - - if (!view.percent && !voice.find(function (a) { - return a.id == card_clone.id; - })) { - voice.push(card_clone); + category.forEach(function (a) { + if (all[a].length) { + var items = Arrays.clone(all[a].slice(0, 20)); + items.forEach(function (item) { + item.params = { + emit: { + onEnter: router.call.bind(router, 'full', item), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(item)); } } + }; + }); // Если есть папки, то добавляем их + + if (folders.indexOf(a) > -1) { + var i = 0; + media.forEach(function (m) { + var filter = Utils$1.filterCardsByType(all[a], m); + + if (filter.length) { + Arrays.insert(items, i, { + results: filter, + media: m, + params: { + module: Helper$9.only('Folder', 'Callback'), + emit: { + onEnter: router.call.bind(router, 'favorite', { + title: Lang$1.translate('title_' + a) + ' - ' + Lang$1.translate('menu_' + m), + type: a, + filter: m + }), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(filter[0])); + } + } + } + }); + i++; + } }); } - }); - if (voice.length) { - Storage.set('player_continue_watch', Arrays.clone(voice.slice(0, 20))); - Arrays.insert(lines, 0, { - title: Lang.translate('card_new_episode'), - results: voice.slice(0, 20) - }); - } - - if (lines.length) { - Arrays.insert(lines, 0, { - title: '', - results: [] - }); - comp.build(lines); - setTimeout(function () { - Layer.visible(comp.render(true)); - }, 100); - } else comp.empty(); - } - - draw(); // if(Account.working()){ - // let tic = 0 - // timer = setInterval(()=>{ - // let any = Account.all() - // if(any.length){ - // all = Favorites.all() - // clearInterval(timer) - // draw() - // } - // else if(tic > 10){ - // clearInterval(timer) - // comp.empty() - // } - // tic++ - // },1000) - // } - // else{ - // all = Favorites.all() - // draw() - // } - }); - return this.render(); - }; - - comp.onAppend = function (line, elem) { - if (elem.results.length == 0) { - line.render(true).removeClass('items-line--type-cards').find('.items-line__head').addClass('hide'); - var body = line.render(true).find('.scroll__body'); - var category = ['book', 'like', 'wath', 'look', 'viewed', 'scheduled', 'continued', 'thrown']; - category.forEach(function (a) { - var register = Template.js('register'); - register.addClass('selector'); - register.find('.register__name').text(Lang.translate('title_' + a)); - register.find('.register__counter').text(all[a].length); - register.on('hover:enter', function () { - Activity$1.push({ - url: '', - title: Lang.translate('title_' + a), - component: 'favorite', + lines.push({ + title: Lang$1.translate('title_' + a), + results: items, type: a, - page: 1 - }); - }); - register.on('hover:focus', function () { - line.render(true).find('.scroll').Scroll.update(register, true); - }); - body.append(register); - }); - } else { - line.render(true).on('visible', function () { - var more = line.render(true).find('.items-line__more'); - - if (more) { - more.text(Lang.translate('settings_param_card_view_all')); - more.on('hover:enter', function () { - viev_all = true; + total_pages: all[a].length > 20 ? Math.ceil(all[a].length / 20) : 1, + params: { + module: Helper$b.toggle(Helper$b.MASK.base, 'Event'), + emit: { + onMore: router.call.bind(router, 'favorite', { + type: a, + page: 2 + }) + } + } }); } }); + + if (lines.length) { + comp.build(lines); + } else comp.empty(); } - }; - - comp.onMore = function (line) { - setTimeout(function () { - Activity$1.push({ - url: '', - title: Lang.translate('title_' + line.type), - component: 'favorite', - type: line.type, - page: viev_all ? 1 : 2 - }); - viev_all = false; - }, 50); - }; - - comp.onDestroy = function () { - clearInterval(timer); - }; - + }); return comp; } - function component$3(object) { - var explorer = new Explorer(object); - var filter = new create$5(object); - var scroll = new create$f({ - mask: true, - over: true - }); - var last; - var choice = { - season: object.movie.number_of_seasons - }; - - this.create = function () { - this.filter(); - this.selected(); - explorer.appendFiles(scroll.render()); - explorer.appendHead(filter.render()); - scroll.body().addClass('torrent-list'); - explorer.render().find('.filter--search, .filter--sort').remove(); - scroll.minus(explorer.render().find('.explorer__files-head')); - this.load(); - this.activity.toggle(); - return this.render(); - }; - - this.filter = function () { - var _this = this; - - filter.addButtonBack(); - - filter.onSelect = function (type, a, b) { - choice.season = b.season; //и так сойде ;] - - _this.selected(); - - _this.load(); - }; - - filter.onBack = function () { - _this.start(); - }; - }; - - this.selected = function () { - var select = []; - var seasons = []; - - for (var i in choice) { - if (i == 'season') select.push(Lang.translate('torrent_serial_season') + ': ' + choice[i]); - } - - for (var _i = 0; _i < object.movie.number_of_seasons; _i++) { - seasons.push({ - title: _i + 1, - season: _i + 1 - }); - } - - filter.set('filter', [{ - title: Lang.translate('torrent_serial_season'), - subtitle: choice.season, - noselect: true, - items: seasons - }]); - filter.chosen('filter', select); - }; - - this.load = function () { - var _this2 = this; - - this.activity.loader(true); - var season = choice.season; - Api.clear(); - Api.seasons(object.movie, [season], function (v) { - last = false; - scroll.clear(); - scroll.reset(); - - if (v[season] && v[season].episodes && v[season].episodes.length) { - _this2.season(v[season]); - - _this2.draw(v[season].episodes); - } else { - _this2.empty(); - } - - _this2.activity.loader(false); - }); - }; - - this.season = function (season) { + var Line = { + onCreate: function onCreate() { + this.html = Template.js('season_info', this.data); + this.prefix = Template.prefix(this.html, 'season-info'); var head = []; - if (season.vote_average) head.push(Lang.translate('title_rating') + ': ' + parseFloat(season.vote_average + '').toFixed(1)); - if (season.air_date) head.push(Lang.translate('full_date_of_release') + ': ' + Utils$2.parseTime(season.air_date).full); - head.push(Lang.translate('title_episodes') + ': ' + season.episodes.length); - season.head = head.join('  ●  '); - var tpl = Template.get('season_info', season); - tpl.on('hover:focus', function (e) { - scroll.update($(e.target), true); + if (this.data.vote_average) head.push(Lang$1.translate('title_rating') + ': ' + parseFloat(this.data.vote_average + '').toFixed(1)); + if (this.data.air_date) head.push(Lang$1.translate('full_date_of_release') + ': ' + Utils$1.parseTime(this.data.air_date).full); + if (this.data.episodes.length) head.push(Lang$1.translate('title_episodes') + ': ' + this.data.episodes.length); + if (head.length) this.prefix.head.append(Arrays.flatMap(head.map(function (s) { + return $('' + s + ''); + }), function () { + return $('  ●  '); + }));else this.prefix.head.remove(); + if (!this.html.overview) this.prefix.overview.remove(); + } + }; + + var SeasonMap = { + Line: Line, + Callback: Callback$1 + }; + + var Season = /*#__PURE__*/function (_Constructor) { + _inherits(Season, _Constructor); + + var _super = _createSuper(Season); + + function Season() { + _classCallCheck(this, Season); + + return _super.apply(this, arguments); + } + + return Season; + }(Constructor(SeasonMap)); + + var Helper$2 = new Mask(Arrays.getKeys(SeasonMap)); + Helper$2.MASK.base = Helper$2.MASK.none; + + function choiceSeason() { + var total = Utils$1.countSeasons(this.object.card); + var select = []; + + for (var i = total; i > 0; i--) { + select.push({ + title: Lang$1.translate('torrent_serial_season') + ' ' + i, + season: i }); - if (!season.overview) tpl.find('.season-info__overview').remove(); - scroll.append(tpl); - }; + } - this.empty = function () { - var em = Template.get('empty_filter'); - var bn = $('
' + Lang.translate('filter_clarify') + '
'); - bn.on('hover:enter', function () { - filter.render().find('.filter--filter').trigger('hover:enter'); - }); - em.find('.empty-filter__title').remove(); - em.find('.empty-filter__buttons').removeClass('hide').append(bn); - scroll.append(em); - Controller.enable('content'); - }; + Select.show({ + title: 'Выбрать сезон', + items: select, + onSelect: function onSelect(a) { + Controller.toggle('content'); + Activity.replace({ + season: a.season + }); + }, + onBack: function onBack() { + Controller.toggle('content'); + } + }); + } + /** + * Компонент "Сезоны сериала" + * @param {*} object + */ - this.draw = function (episodes) { - episodes.forEach(function (episode, index) { - var number = episode.episode_number || index + 1; - var hash = Utils$2.hash([choice.season, choice.season > 10 ? ':' : '', number, object.movie.original_title].join('')); - var info = []; - var out_air = new Date((episode.air_date + '').replace(/-/g, '/')); - var out_now = Date.now(); - var out_day = episode.air_date ? Math.round((out_air.getTime() - out_now) / (24 * 60 * 60 * 1000)) : 1; - var out_txt = Lang.translate('full_episode_days_left') + ': ' + (episode.air_date ? out_day : '- -'); - episode.timeline = Timeline$1.view(hash); - episode.time = Utils$2.secondsToTime(episode.runtime * 60, true); - episode.title = episode.name || Lang.translate('torrent_serial_episode') + ' ' + number; - episode.quality = out_day > 0 ? out_txt : ''; - if (episode.vote_average) info.push(Template.get('season_episode_rate', { - rate: parseFloat(episode.vote_average + '').toFixed(1) - }, true)); - if (episode.air_date) info.push(Utils$2.parseTime(episode.air_date).full); - episode.info = info.length ? info.map(function (i) { - return '' + i + ''; - }).join('') : ''; - var html = Template.get('season_episode', episode); - var loader = html.find('.season-episode__loader'); - var image = html.find('.season-episode__img'); - var viewed = function viewed() { - html.find('.season-episode__viewed').remove(); - if (Boolean(episode.timeline.percent)) html.find('.season-episode__img').append('
' + Template.get('icon_viewed', {}, true) + '
'); - }; + function component$9(object) { + var comp = Utils$1.createInstance(Full, object, { + module: Helper$5.toggle(Helper$5.MASK.base, 'Explorer'), + items: { + mapping: 'list' + } + }); + comp.use({ + onCreate: function onCreate() { + var _this = this; - html.find('.season-episode__timeline').append(Timeline$1.render(episode.timeline)); - if (out_day > 0) html.css('opacity', '0.5');else { - viewed(); - if (Boolean(episode.timeline.percent)) last = html[0]; - html.on('hover:enter', function () { - if (Boolean(episode.timeline.percent)) { - episode.timeline.time = 0; - episode.timeline.percent = 0; - } else { - episode.timeline.time = episode.timeline.duration * 0.95; - episode.timeline.percent = 95; + var season = object.season || Utils$1.countSeasons(object.card); + Api.seasons(object.card, [season], function (v) { + if (v[season] && v[season].episodes) { + Arrays.extend(v[season], { + params: { + createInstance: function createInstance(item) { + return new Season(item); + }, + module: Helper$2.only('Line', 'Callback'), + emit: { + onEnter: choiceSeason.bind(_this) + } + } + }); + var results = [v[season]]; + v[season].episodes.forEach(function (episode) { + // Передаем название сериала для таймкода + episode.original_name = object.card.original_name; + episode.params = { + createInstance: function createInstance() { + return new Episode(episode); + }, + module: Helper$a.toggle(Helper$a.MASK.base, 'Line') + }; + results.push(episode); + }); + + if (!v[season].episodes.length) { + Arrays.insert(results, 1, { + episode_number: 1, + season_number: season, + air_date: '', + name: Lang$1.translate('title_anons'), + comeing: true, + params: { + createInstance: function createInstance(item) { + return new Episode(item); + }, + module: Helper$a.only('Line') + } + }); } - Timeline$1.update(episode.timeline); - viewed(); - }); - } - html.on('hover:focus', function (e) { - last = e.target; - scroll.update($(e.target), true); - }).on('visible', function () { - var img = html.find('img')[0]; - - img.onerror = function () { - img.src = './img/img_broken.svg'; - }; - - img.onload = function () { - image.addClass('season-episode__img--loaded'); - loader.remove(); - image.append('
' + ('0' + number).slice(-2) + '
'); - }; - - if (episode.still_path) img.src = TMDB$1.image('t/p/w300' + episode.still_path);else if (episode.img) img.src = episode.img;else { - loader.remove(); - image.append('
' + ('0' + number).slice(-2) + '
'); - } - }).on('hover:hover hover:touch', function (e) { - last = e.target; - Navigator.focused(last); - }); - scroll.append(html); - }); - if (last) scroll.update($(last), true); - Layer.visible(scroll.render(true)); - Controller.enable('content'); - }; - - this.start = function () { - if (Activity$1.active().activity !== this.activity) return; - Background.immediately(Utils$2.cardImgBackgroundBlur(object.movie)); - Controller.add('content', { - toggle: function toggle() { - Controller.collectionSet(scroll.render(), explorer.render()); - Controller.collectionFocus(last || false, scroll.render()); - Navigator.remove(explorer.render().find('.explorer-card__head-img')[0]); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else explorer.toggle(); - }, - right: function right() { - filter.show(Lang.translate('title_filter'), 'filter'); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function () { - return explorer.render(); - }; - - this.destroy = function () {}; - } - - function component$2(object) { - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - step: 250, - end_ratio: 2 - }); - var items = []; - var html = document.createElement('div'); - var body = document.createElement('div'); - var last; - var active = 0; - - var follow = function follow(event) { - if (event.name == 'person_subscribes_id') { - items.forEach(function (card) { - if (event.value.indexOf(card.data.id) == -1) { - card.render(true).style.opacity = 0.5; - - card.onEnter = function () {}; + _this.build({ + results: results + }); + } else { + _this.empty(); } }); - } - }; - - this.create = function () { - this.activity.loader(true); - Storage.listener.follow('change', follow); - Account.persons(this.build.bind(this), this.empty.bind(this)); - }; - - this.empty = function () { - var empty = new Empty(); - html.appendChild(empty.render(true)); - this.start = empty.start; - this.activity.loader(false); - this.activity.toggle(); - }; - - this.append = function (data, append) { - data.forEach(function (element) { - var card = new Card(element.person, { - card_category: true - }); - card.create(); - - card.onFocus = function (target, card_data) { - last = target; - active = items.indexOf(card); - scroll.update(card.render(true)); - Background.change(Utils$2.cardImgBackgroundBlur(card_data)); - }; - - card.onTouch = function (target, card_data) { - last = target; - active = items.indexOf(card); - }; - - card.onEnter = function (target, card_data) { - last = target; - Activity$1.push({ - url: element.person.url, - title: Lang.translate('title_person'), - component: 'actor', - id: element.person_id, - source: object.source - }); - }; - - card.onMenu = function () {}; - - body.appendChild(card.render(true)); - items.push(card); - if (append) Controller.collectionAppend(card.render(true)); - }); - }; - - this.limit = function () { - var limit_view = 12; - var lilit_collection = 36; - var colection = items.slice(Math.max(0, active - limit_view), active + limit_view); - items.forEach(function (item) { - if (colection.indexOf(item) == -1) { - item.render(true).classList.remove('layer--render'); - } else { - item.render(true).classList.add('layer--render'); - } - }); - Navigator.setCollection(items.slice(Math.max(0, active - lilit_collection), active + lilit_collection).map(function (c) { - return c.render(true); - })); - Navigator.focused(last); - Layer.visible(scroll.render(true)); - }; - - this.build = function (data) { - var _this = this; - - if (data.length) { - body.classList.add('category-full'); - scroll.minus(); - scroll.onScroll = this.limit.bind(this); - - scroll.onWheel = function (step) { - if (!Controller.own(_this)) _this.start(); - if (step > 0) Navigator.move('down');else Navigator.move('up'); - }; - - this.append(data); - scroll.append(body); - html.appendChild(scroll.render(true)); - this.limit(); - this.activity.loader(false); - this.activity.toggle(); - } else { - this.empty(); - } - }; - - this.start = function () { - var _this2 = this; - - Controller.add('content', { - link: this, - toggle: function toggle() { - if (_this2.activity.canRefresh()) return false; - Controller.collectionSet(scroll.render(true)); - Controller.collectionFocus(last || false, scroll.render(true)); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); - }, - right: function right() { - if (_this2.onRight) { - if (Navigator.canmove('right')) Navigator.move('right');else _this2.onRight(); - } else Navigator.move('right'); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.refresh = function () { - this.activity.needRefresh(); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function (js) { - return js ? html : $(html); - }; - - this.destroy = function () { - network.clear(); - Arrays.destroy(items); - scroll.destroy(); - Storage.listener.remove('change', follow); - html.remove(); - body.remove(); - items = []; - }; - } - - var network$2 = new create$e(); - - function api$1() { - return Utils$2.protocol() + object$2.cub_domain + '/api/'; - } - - function account() { - return new Promise(function (resolve, reject) { - var account = Storage.get('account', '{}'); - - if (account.token) { - resolve(account); - } else { - reject({ - status: 345 - }); + }, + onController: function onController() { + Background.immediately(Utils$1.cardImgBackgroundBlur(object.card)); } }); + return comp; + } + + /** + * Компонент Персоны" + * @param {*} object + */ + + function component$8(object) { + var comp = new Full$1(object); + var next = null; + comp.use({ + onCreate: function onCreate() { + var _this = this; + + var parts = [function (call) { + Account$1.Api.persons(function (data) { + if (!data.length) return call(); + var persons = data.map(function (p) { + return p.person; + }); + persons.forEach(function (person) { + person.params = { + module: Helper$9.only('Card', 'Release', 'Callback'), + emit: { + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(person)); + }, + onEnter: router.call.bind(router, 'actor', person) + } + }; + }); + call({ + title: Lang$1.translate('title_persons'), + results: persons, + params: { + module: Helper$b.toggle(Helper$b.MASK.base, 'More', 'Event') + } + }); + }, call); + }]; + + function loadPart(partLoaded, partEmpty) { + Api.partNext(parts, 3, partLoaded, partEmpty); + } + + next = loadPart; + TMDB.get('person/popular', {}, function (json) { + json.results.sort(function (a, b) { + return a.popularity - b.popularity; + }); + var filtred = json.results.filter(function (p) { + return p.known_for_department && p.known_for; + }); + var persons = filtred.filter(function (p) { + return (p.known_for_department || '').toLowerCase() == 'acting' && p.known_for.length; + }).slice(0, 10); + persons.forEach(function (person_data, index) { + var event = function event(call_inner) { + TMDB.person({ + only_credits: 'movie', + id: person_data.id + }, function (result) { + if (!result.credits) return call_inner(); + var cards = (result.credits.movie || []).filter(function (m) { + return m.backdrop_path && m.vote_count > 20; + }); + cards.sort(function (a, b) { + var da = a.release_date || a.first_air_date; + var db = b.release_date || b.first_air_date; + if (db > da) return 1;else if (db < da) return -1;else return 0; + }); + var src = person_data.profile_path ? TMDB.img(person_data.profile_path, 'w90_and_h90_face') : person_data.img || './img/actor.svg'; + cards.forEach(function (item) { + item.params = { + emit: { + onEnter: router.call.bind(router, 'full', item), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(item)); + } + } + }; + }); + call_inner({ + title: person_data.name, + icon_img: src, + results: cards.length > 5 ? cards.slice(0, 20) : [], + params: { + module: Helper$b.toggle(Helper$b.MASK.base, 'Icon', 'More', 'MoreFirst', 'Event'), + text: Lang$1.translate('title_person_about'), + emit: { + onMore: router.call.bind(router, 'actor', person_data) + } + } + }); + }); + }; + + parts.push(event); + }); + loadPart(_this.build.bind(_this), _this.empty.bind(_this)); + }, function () { + loadPart(_this.build.bind(_this), _this.empty.bind(_this)); + }, { + life: 60 * 24 * 3 + }); + }, + onNext: function onNext(resolve, reject) { + if (next) { + next(resolve.bind(this), reject.bind(this)); + } else reject.call(this); + } + }); + return comp; } function facts(card_id, card_type, callback, error) { - account().then(function (acc) { - network$2.silent(api$1() + 'ai/generate/facts/' + card_id + '/' + card_type, callback, error, false, { - headers: { - token: acc.token, - profile: acc.profile.id - } - }); - })["catch"](error); + Api$1.load('ai/generate/facts/' + card_id + '/' + card_type).then(callback)["catch"](error); } function recommendations(card_id, card_type, callback, error) { - account().then(function (acc) { - network$2.silent(api$1() + 'ai/generate/recommend/' + card_id + '/' + card_type, callback, error, false, { - headers: { - token: acc.token, - profile: acc.profile.id - } - }); - })["catch"](error); + Api$1.load('ai/generate/recommend/' + card_id + '/' + card_type).then(callback)["catch"](error); } function _search(query, callback, error) { - account().then(function (acc) { - network$2.silent(api$1() + 'ai/search/' + encodeURIComponent(query), callback, error, false, { - headers: { - token: acc.token, - profile: acc.profile.id - } - }); - })["catch"](error); + Api$1.load('ai/search/' + encodeURIComponent(query)).then(callback)["catch"](error); } function discovery() { var source = { - title: Lang.translate('title_ai_assistant'), + title: Lang$1.translate('title_ai_assistant'), search: function search(params, oncomplite) { - source.params.nofound = Lang.translate('search_nofound'); + source.params.nofound = Lang$1.translate('search_nofound'); _search(decodeURIComponent(params.query), function (json) { - json.title = Lang.translate('title_ai_assistant'); + json.title = Lang$1.translate('title_ai_assistant'); json.results.forEach(function (element) { element.source = 'cub'; }); oncomplite(json.results.length ? [json] : []); }, function (e) { - if (e.decode_code == 600) source.params.nofound = Lang.translate('ai_search_limit'); + if (e.decode_code == 600) source.params.nofound = Lang$1.translate('ai_search_limit'); oncomplite([]); }); }, onCancel: function onCancel() { - network$2.clear(); + Api$1.clear(); }, params: { lazy: true, - align_left: true, - start_typing: Lang.translate('ai_search_start_typing') + save: true, + start_typing: Lang$1.translate('ai_search_start_typing') } }; return source; } - var Ai = { + var Ai$1 = { facts: facts, recommendations: recommendations, discovery: discovery }; - function Facts(object) { - var explorer = new Explorer(object); - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - nopadding: true - }); - var html = $('
'); - var cache = 'facts_' + object.movie.id + '_' + (object.movie.name ? 'tv' : 'movie'); - - this.create = function () { + var Ai = { + onEmpty: function onEmpty(e) { var _this = this; - this.activity.loader(false); - explorer.render().find('.explorer__files-head').remove(); - explorer.appendFiles(scroll.render(true)); - scroll.append(html); - scroll.minus(); - var text_cache = ''; - Lampa.Cache.getData('other', cache).then(function (text) { - text_cache = text; - })["finally"](function () { - if (text_cache) { - _this.build(text_cache); - } else { - _this.loading(); - - Layer.update(); - Ai.facts(object.movie.id, object.movie.name ? 'tv' : 'movie', function (data) { - Cache.rewriteData('other', cache, data.text)["finally"](function () {}); - - _this.build(data.text); - }, _this.empty.bind(_this)); - } - }); - return this.render(); - }; - - this.loading = function () { - var ico = Template.get('icon_text', {}, true); - var tpl = Template.get('ai_search_animation', { - icon: ico - }); - var box = $('
'); - box.append(tpl); - scroll.append(box); - }; - - this.empty = function (event) { - var code = network.errorCode(event); - var text = { - title: Lang.translate('network_error'), - descr: Lang.translate('subscribe_noinfo') + var code = e.decode_code; + var data = { + title: Lang$1.translate('network_error'), + descr: Lang$1.translate('subscribe_noinfo') }; if (code == 600) { - text.title = Lang.translate('ai_subscribe_title'); - text.descr = Lang.translate('ai_subscribe_descr'); - text.noicon = true; - text.width = 'medium'; + data.title = Lang$1.translate('ai_subscribe_title'); + data.descr = Lang$1.translate('ai_subscribe_descr'); + data.noicon = true; + data.width = 'medium'; + data.buttons = [{ + title: Lang$1.translate('account_premium_more'), + onEnter: Modal$1.premium.bind(Modal$1) + }]; } if (code == 347) { - text.title = Lang.translate('empty_title_two'); - text.descr = Lang.translate('empty_text_two'); + data.title = Lang$1.translate('empty_title_two'); + data.descr = Lang$1.translate('empty_text_two'); } - if (code == 345) { - text.title = Lang.translate('account_login_failed'); - text.descr = Lang.translate('account_login_wait'); + if (code == 345 || code == 403) { + data.title = Lang$1.translate('account_none_title'); + data.descr = Lang$1.translate('account_create'); + data.noicon = true; + data.buttons = [{ + title: Lang$1.translate('settings_cub_signin_button'), + onEnter: function onEnter() { + Device.login(_this.start.bind(_this)); + } + }]; } - if (code == 245) { - text.descr = event.message || Lang.translate('subscribe_noinfo'); + this.empty_class = new Empty(data); + this.scroll.append(this.empty_class.render(true)); + this.start = this.empty_class.start.bind(this.empty_class); + } + }; + + /** + * Компонент "Факты о фильме" + * @param {*} object + */ + + function component$7(object) { + var comp = Utils$1.createInstance(Full, object, { + module: Helper$5.only('Explorer', 'Loading'), + loading: { + icon: 'text' } + }); + comp.use(Ai, 2); + comp.use({ + onCreate: function onCreate() { + var _this = this; - scroll.clear(); - var empty = new Empty(text); + var cache_name = ['facts', this.object.card.id, this.object.card.name ? 'tv' : 'movie'].join('_'); + var cache_text = ''; + Cache.getData('other', cache_name).then(function (text) { + cache_text = text; + })["finally"](function () { + if (cache_text) { + _this.build(cache_text); + } else { + Ai$1.facts(_this.object.card.id, _this.object.card.name ? 'tv' : 'movie', function (data) { + Cache.rewriteData('other', cache_name, data.text)["catch"](function () {}); - empty.onLeft = function () { - explorer.toggle(); - }; - - empty.render().addClass('layer--wheight'); - html.append(empty.render()); - scroll.append(html); - this.start = empty.start.bind(empty); - this.activity.toggle(); - }; - - this.build = function (text) { - try { - html.html(Utils$2.simpleMarkdownParser(text)); - html.find('h1').remove(); - html.addClass('text-markdow'); - scroll.render(true).removeClass('scroll--nopadding'); - scroll.clear(); - scroll.append(html); - html.addClass('animate-up-content animate-opacity'); - this.activity.toggle(); - } catch (e) { - this.empty({ - status: 245, - message: e.message + _this.build(data.text); + }, _this.empty.bind(_this)); + } }); - } - }; + }, + onBuild: function onBuild(text) { + var _this2 = this; - this.start = function () { - if (Activity$1.active().activity !== this.activity) return; - Background.immediately(Utils$2.cardImgBackgroundBlur(object.movie)); - Controller.add('content', { - link: this, - invisible: true, - toggle: function toggle() { - Controller.collectionSet(scroll.render(true)); - Controller.collectionFocus(false, scroll.render(true)); - }, - left: function left() { - explorer.toggle(); - }, - up: function up() { - if (scroll.position() == 0) Controller.toggle('head');else scroll.wheel(-150); - }, - down: function down() { - scroll.wheel(150); - }, - back: function back() { - Activity$1.backward(); + try { + this.body.html(Utils$1.simpleMarkdownParser(text)); + this.body.find('h1').remove(); + this.body.addClass('text-markdow explorer-list animate-up-content animate-opacity'); + + this.scroll.onWheel = function (step) { + if (!Controller.own(_this2)) _this2.start(); + if (step > 0) Controller.move('down');else Controller.move('up'); + }; + } catch (e) { + this.empty({ + status: 245, + message: e.message + }); } - }); - Controller.toggle('content'); - }; + }, + onController: function onController(controller) { + var _this3 = this; - this.pause = function () {}; + controller.up = function () { + if (_this3.scroll.position() == 0) Controller.toggle('head');else _this3.scroll.wheel(-150); + }; - this.stop = function () {}; - - this.render = function () { - return explorer.render(); - }; - - this.destroy = function () { - network.clear(); - scroll.destroy(); - html.remove(); - }; + controller.down = function () { + _this3.scroll.wheel(150); + }; + } + }); + return comp; } - function Recommendations(object) { - var explorer = new Explorer(object); - var network = new create$e(); - var scroll = new create$f({ - mask: true, - over: true, - nopadding: true + /** + * Компонент "Рекомендации по фильму/сериалу" + * @param {*} object + */ + + function component$6(object) { + var comp = Utils$1.createInstance(Full, object, { + module: Helper$5.toggle(Helper$5.MASK.base, 'Explorer', 'Loading', 'Next', 'Empty'), + items: { + cols: 5 + } }); - var html = $('
'); - var items = []; - var last; - var active; + comp.use(Ai, 2); + comp.use({ + onCreate: function onCreate() { + var _this = this; - this.create = function () { - var _this = this; + Ai$1.recommendations(object.card.id, object.card.name ? 'tv' : 'movie', function (data) { + if (data.results.length == 0) _this.empty({ + status: 347 + });else _this.build(data); + }, this.empty.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } + }); + } + }); + return comp; + } - this.activity.loader(false); - explorer.render().find('.explorer__files-head').remove(); - explorer.appendFiles(scroll.render(true)); - scroll.append(html); - scroll.minus(); - this.loading(); - Ai.recommendations(object.movie.id, object.movie.name ? 'tv' : 'movie', function (data) { - if (data.results.length == 0) _this.empty({ - status: 347 - });else _this.build(data); - }, this.empty.bind(this)); - return this.render(); - }; + /** + * Компонент "Рекомендации" + * @param {*} object + */ - this.loading = function () { - var ico = Template.get('icon_card', {}, true); - var tpl = Template.get('ai_search_animation', { - icon: ico + function component$5(object) { + var comp = Utils$1.createInstance(Full, object, { + module: Helper$5.only('Explorer', 'Next', 'Empty', 'Items'), + items: { + mapping: 'list' + } + }); + comp.use({ + onCreate: function onCreate() { + var _this = this; + + CUB.discussGet(object, function (data) { + _this.build(_objectSpread2(_objectSpread2({}, data), {}, { + results: data.result || [] + })); + }, this.empty.bind(this)); + }, + onNext: function onNext(resolve, reject) { + CUB.discussGet(object, function (data) { + resolve(_objectSpread2(_objectSpread2({}, data), {}, { + results: data.result || [] + })); + }, reject); + }, + onCreateAndAppend: function onCreateAndAppend(element) { + var item = Utils$1.createInstance(Discuss, element, { + module: Helper$6.only('Line', 'Read'), + line: { + full_text: true + } + }); + this.emit('instance', item, element); + item.create(); + this.emit('append', item, element); + } + }); + return comp; + } + + var data = []; + /** + * Запуск + */ + + function init$u() { + data = Storage.cache('recomends_scan', 300, []); + Timer.add(120 * 1000, function () { + var history = Favorite.get({ + type: 'history' }); - var box = $('
'); - box.append(tpl); - scroll.append(box); - }; + var added = 0; + console.log('Recomendations', 'find history:', history.length); + history.forEach(function (elem) { + if (['cub', 'tmdb'].indexOf(elem.source) >= 0) { + var id = data.filter(function (a) { + return a.id == elem.id; + }); - this.empty = function (event) { - var code = network.errorCode(event); - var text = { - title: Lang.translate('network_error'), - descr: Lang.translate('subscribe_noinfo') - }; - - if (code == 600) { - text.title = Lang.translate('ai_subscribe_title'); - text.descr = Lang.translate('ai_subscribe_descr'); - text.noicon = true; - text.width = 'medium'; - } - - if (code == 347) { - text.title = Lang.translate('empty_title_two'); - text.descr = Lang.translate('empty_text_two'); - } - - if (code == 345) { - text.title = Lang.translate('account_login_failed'); - text.descr = Lang.translate('account_login_wait'); - } - - if (code == 245) { - text.descr = event.message || Lang.translate('subscribe_noinfo'); - } - - scroll.clear(); - var empty = new Empty(text); - - empty.onLeft = function () { - explorer.toggle(); - }; - - empty.render().addClass('layer--wheight'); - html.append(empty.render()); - scroll.append(html); - this.start = empty.start.bind(empty); - this.activity.toggle(); - }; - - this.build = function (data) { - var _this2 = this; - - try { - scroll.render(true).removeClass('scroll--nopadding'); - scroll.clear(); - html.addClass('category-full'); - scroll.onScroll = this.limit.bind(this); - - scroll.onWheel = function (step) { - if (!Controller.own(_this2)) _this2.start(); - if (step > 0) Navigator.move('down');else Navigator.move('up'); - }; - - this.draw(data.results); - scroll.append(html); - this.limit(); - this.activity.toggle(); - } catch (e) { - this.empty({ - status: 245, - message: e.message - }); - } - }; - - this.draw = function (results) { - results.forEach(function (element) { - var card = new Card(element, { - object: object, - card_explorer: true - }); - card.create(); - - card.onFocus = function (target, card_data) { - last = target; - active = items.indexOf(card); - scroll.update(card.render(true)); - Background.change(Utils$2.cardImgBackground(card_data)); - }; - - card.onTouch = function (target, card_data) { - last = target; - active = items.indexOf(card); - }; - - card.onEnter = function (target, card_data) { - last = target; - Activity$1.push({ - url: card_data.url, - component: 'full', - id: element.id, - method: card_data.name ? 'tv' : 'movie', - card: element, - source: element.source || object.source + if (!id.length) { + data.push({ + id: elem.id, + tv: elem.number_of_seasons || elem.seasons + }); + added++; + } + } + }); + console.log('Recomendations', 'added to scan:', added, 'ready:', data.length); + Storage.set('recomends_scan', data); + search(); + }); + ContentRows.add({ + index: 1, + screen: ['main', 'category'], + call: function call(params, screen) { + if (params.url == 'anime') return; + var media = screen == 'main' ? 'movie' : params.url; + var all = get$4(media); + var results = Arrays.shuffle(all).slice(0, 20); + var total_pages = Math.ceil(all.length / 20); + if (!results.length) return; + return function (call) { + call({ + results: results, + title: Lang$1.translate('title_recomend_watch'), + total_pages: total_pages, + page: 1, + params: { + emit: { + onlyMore: function onlyMore() { + router.call('recomend', { + media: media, + total_pages: total_pages + }); + } + } + } }); }; - - html.append(card.render(true)); - items.push(card); - }); - }; - - this.limit = function () { - var limit_view = 12; - var lilit_collection = 36; - var colection = items.slice(Math.max(0, active - limit_view), active + limit_view); - items.forEach(function (item) { - if (colection.indexOf(item) == -1) { - item.render(true).classList.remove('layer--render'); - } else { - item.render(true).classList.add('layer--render'); - } - }); - Navigator.setCollection(items.slice(Math.max(0, active - lilit_collection), active + lilit_collection).map(function (c) { - return c.render(true); - })); - Navigator.focused(last); - Layer.visible(scroll.render(true)); - }; - - this.start = function () { - if (Activity$1.active().activity !== this.activity) return; - Background.immediately(Utils$2.cardImgBackgroundBlur(object.movie)); - Controller.add('content', { - link: this, - invisible: true, - toggle: function toggle() { - Controller.collectionSet(scroll.render(true)); - Controller.collectionFocus(last || false, scroll.render(true)); - }, - left: function left() { - if (Navigator.canmove('left')) Navigator.move('left');else explorer.toggle(); - }, - right: function right() { - Navigator.move('right'); - }, - up: function up() { - if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - down: function down() { - if (Navigator.canmove('down')) Navigator.move('down'); - }, - back: function back() { - Activity$1.backward(); - } - }); - Controller.toggle('content'); - }; - - this.pause = function () {}; - - this.stop = function () {}; - - this.render = function () { - return explorer.render(); - }; - - this.destroy = function () { - network.clear(); - Arrays.destroy(items); - scroll.destroy(); - html.remove(); - items = []; - }; + } + }); } - var component$1 = { - main: component$k, - full: component$j, - category: component$g, - category_full: component$h, - actor: component$f, - favorite: component$e, - torrents: component$d, - mytorrents: component$c, - relise: component$b, - collections: component$a, - collections_view: component$9, - nocomponent: component$8, - timetable: component$7, - subscribes: component$6, - company: component$5, + function search() { + var ids = data.filter(function (e) { + return !e.scan; + }); + + if (ids.length) { + var elem = ids[0]; + elem.scan = 1; + console.log('Recomendations', 'scan:', elem.id, elem.title || elem.name); + TMDB.get((elem.tv ? 'tv' : 'movie') + '/' + elem.id + '/recommendations', {}, function (json) { + console.log('Recomendations', 'result:', json.results && json.results.length ? json.results.length : 0); + + if (json.results && json.results.length) { + var recomend = Storage.cache('recomends_list', 100, []); + var favorite = Favorite.get({ + type: 'history' + }); + json.results.forEach(function (e) { + var year = (e.first_air_date || e.release_date || '0000').split('-'); + + if (!recomend.filter(function (r) { + return r.id == e.id; + }).length && !favorite.filter(function (h) { + return h.id == e.id; + }).length && year[0] > new Date().getFullYear() - 20) { + recomend.push(e); + } + }); + Storage.set('recomends_list', recomend); + } + }); + } else { + data.forEach(function (a) { + return a.scan = 0; + }); + } + + Storage.set('recomends_scan', data); + } + + function get$4(type) { + var all = Storage.get('recomends_list', '[]'); + var items = all.filter(function (e) { + return type == 'tv' ? e.number_of_seasons || e.first_air_date : !(e.number_of_seasons || e.first_air_date); + }).reverse(); + var history = Favorite.get({ + type: 'history' + }); + items = items.filter(function (e) { + return !history.find(function (h) { + return h.id == e.id; + }); + }); + return items; + } + + function page(object, call, empty) { + var all = get$4(object.media); + var page = object.page || 1; + var result = all.slice((page - 1) * 20, page * 20); + if (result.length == 0) return empty({ + status: 404 + }); + call({ + results: result, + title: Lang$1.translate('title_recomend_watch'), + total_pages: Math.ceil(all.length / 20), + page: page + }); + } + + var Recomends = { + init: init$u, + get: get$4, + page: page + }; + + /** + * Компонент "Рекомендации по фильму/сериалу" + * @param {*} object + */ + + function component$4(object) { + var comp = Utils$1.createInstance(Full, object); + comp.use({ + onCreate: function onCreate() { + Recomends.page(object, this.build.bind(this), this.empty.bind(this)); + }, + onNext: function onNext(resolve, reject) { + Recomends.page(object, resolve.bind(this), reject.bind(this)); + }, + onInstance: function onInstance(item, data) { + item.use({ + onEnter: router.call.bind(router, 'full', data), + onFocus: function onFocus() { + Background.change(Utils$1.cardImgBackground(data)); + } + }); + } + }); + return comp; + } + + var component$3 = { + main: component$m, + full: component$l, + category: component$j, + category_full: component$k, + actor: component$i, + favorite: component$h, + torrents: component$g, + mytorrents: component$f, + relise: component$e, + nocomponent: Component$1, + timetable: component$d, + subscribes: component$c, + company: component$b, feed: Feed, - bookmarks: component$4, - episodes: component$3, - myperson: component$2, - ai_facts: Facts, - ai_recommendations: Recommendations + bookmarks: component$a, + episodes: component$9, + myperson: component$8, + ai_facts: component$7, + ai_recommendations: component$6, + discuss: component$5, + recomend: component$4 }; /** * Создать компонент @@ -33272,27 +37470,27 @@ * @returns */ - function create$4(object) { - if (component$1[object.component]) { + function create$5(object) { + if (component$3[object.component]) { try { - return new component$1[object.component](object); + return new component$3[object.component](object); } catch (e) { console.log('Component', 'create error', e.stack); - return new component$1.nocomponent(object); + return new component$3.nocomponent(object); } } else { - return new component$1.nocomponent(object); + return new component$3.nocomponent(object); } } /** - * Добавить + * Добавить компонент * @param {string} name * @param {class} comp */ function add$5(name, comp) { - component$1[name] = comp; + component$3[name] = comp; } /** * Получить компонент @@ -33301,46 +37499,65 @@ */ - function get$2(name) { - return component$1[name]; + function get$3(name) { + return component$3[name]; } var Component = { - create: create$4, + create: create$5, add: add$5, - get: get$2 + get: get$3 }; - var html$6; + var html$9; + /** + * Отображает прогресс загрузки приложения + * @returns {void} + */ - function init$p() { - html$6 = $("
\n
\n
\n
"); - $('body').append(html$6); + function init$t() { + html$9 = $("
\n
\n
\n
"); + $('body').append(html$9); step(0); } + /** + * Обновляет шаг загрузки + * @param {number} position - номер шага + */ + function step(position) { - html$6.find('.lp-step').text(Lang.translate('loading_progress_step_' + position)); - console.log('LoadingProgress', 'step:', position, Lang.translate('loading_progress_step_' + position)); + html$9.find('.lp-step').text(Lang$1.translate('loading_progress_step_' + position)); + console.log('LoadingProgress', 'step:', position, Lang$1.translate('loading_progress_step_' + position)); } + /** + * Обновляет статус загрузки + * @param {string} text - текст статуса + */ + function status(text) { - html$6.find('.lp-status').text(text); + html$9.find('.lp-status').text(text); console.log('LoadingProgress', 'status:', text); } + /** + * Удаляет прогресс загрузки + * @returns {void} + */ - function destroy$1() { - html$6.remove(); + + function destroy$2() { + html$9.remove(); } var LoadingProgress = { - init: init$p, + init: init$t, step: step, status: status, - destroy: destroy$1 + destroy: destroy$2 }; - function close$2() { + function close$3() { if (Platform.is('apple_tv')) window.location.assign('exit://exit'); if (Platform.is('tizen')) tizen.application.getCurrentApplication().exit(); if (Platform.is('webos') && typeof window.close == 'function') window.close(); @@ -33375,16 +37592,16 @@ urlStyle = Orsay.getLoaderUrl() + '/css/app.css?v'; } - Utils$2.putStyle([urlStyle + object$2.css_version], function () { + Utils$1.putStyle([urlStyle + object$2.css_version], function () { old_css.remove(); }); } else if (window.lampa_settings.fix_widget) { - Utils$2.putStyle([object$2.cdn_url + 'css/app.css?v' + object$2.css_version], function () { + Utils$1.putStyle([object$2.cdn_url + 'css/app.css?v' + object$2.css_version], function () { LoadingProgress.status('PutStyle ' + object$2.css_version); old_css.remove(); }, function () {}); } else if (old_css.length) { - Utils$2.putStyle([object$2.github_lampa + 'css/app.css?v' + object$2.css_version], function () { + Utils$1.putStyle([object$2.github_lampa + 'css/app.css?v' + object$2.css_version], function () { LoadingProgress.status('PutStyle ' + object$2.css_version); old_css.remove(); }, function () {}); @@ -33397,216 +37614,324 @@ title: '', align: 'center', zIndex: 300, - html: $('
' + Lang.translate('close_app_modal') + '
'), + html: $('
' + Lang$1.translate('close_app_modal') + '
'), buttons: [{ - name: Lang.translate('settings_param_no'), + name: Lang$1.translate('settings_param_no'), onSelect: function onSelect() { Modal.close(); Controller.toggle(controller); } }, { - name: Lang.translate('settings_param_yes'), + name: Lang$1.translate('settings_param_yes'), onSelect: function onSelect() { Modal.close(); Controller.toggle(controller); - close$2(); + close$3(); } }] }); } var App = { - close: close$2, + close: close$3, loadStyle: loadStyle, modalClose: modalClose }; - var listener$3 = start$8(); + /** + * Универсальный провайдер пропсов + * @param data - начальные данные + * @example + let props = new Props({a:1, b:2}) + + props.set('c', 3) + props.set({a:10, d:4}) + + console.log(props.get('a')) // 10 + console.log(props.get('b')) // 2 + console.log(props.get('c')) // 3 + console.log(props.get('d')) // 4 + console.log(props.get('e', 5)) // 5 + + console.log(props.pick('a','b','e')) // {a:10, b:2, e:undefined} + + console.log(props.all()) // {a:10, b:2, c:3, d:4} + */ + + var Props = function Props(data) { + var _this = this; + + _classCallCheck(this, Props); + + _defineProperty(this, "set", function (key, value) { + if (Arrays.isObject(key)) { + for (var k in key) { + _this.data[k] = key[k]; + } + + return; + } + + _this.data[key] = value; + }); + + _defineProperty(this, "get", function (key, def) { + return _this.data[key] || def; + }); + + _defineProperty(this, "pick", function () { + for (var _len = arguments.length, keys = new Array(_len), _key = 0; _key < _len; _key++) { + keys[_key] = arguments[_key]; + } + + return Object.fromEntries(keys.map(function (k) { + return [k, _this.data[k]]; + })); + }); + + _defineProperty(this, "all", function () { + return _this.data; + }); + + this.data = data || {}; + }; + + /** + * Слайд активности + * @param {Object} component - Компонент активности + * @param {Object} object - Параметры активности + */ + + var ActivitySlide = /*#__PURE__*/function () { + function ActivitySlide(component, object) { + _classCallCheck(this, ActivitySlide); + + this.component = component; + this.object = object || {}; + this.slide = Template.js('activity'); + this.body = this.slide.find('.activity__body'); + this.is_stopped = false; + this.is_started = false; + } + /** + * Создание активности + * @returns {void} + */ + + + _createClass(ActivitySlide, [{ + key: "create", + value: function create() { + try { + this.component.create(this.body); + this.body.append(this.component.render(true)); + } catch (e) { + console.log('Activity', 'create error:', e.stack); + this.component = Component.create({ + component: 'nocomponent' + }); + this.component.activity = this; + this.create(); + } + } + /** + * Показывает загрузку + * @param {boolean} status + */ + + }, { + key: "loader", + value: function loader(status) { + this.slide.toggleClass('activity--load', status); + } + /** + * Стартуем активную активность + * @return {void} + */ + + }, { + key: "start", + value: function start() { + this.is_started = true; + this.is_stopped = false; + Controller.add('content', { + invisible: true, + toggle: function toggle() { + Controller.clear(); + }, + left: function left() { + Controller.toggle('menu'); + }, + up: function up() { + Controller.toggle('head'); + }, + back: function back() { + Activity.backward(); + } + }); + Controller.toggle('content'); + if (this.waite_refresh) this.runRefresh();else { + try { + this.component.start(); + } catch (e) { + console.log('Activity', 'start error:', e.stack); + } + } + } + /** + * Пауза активности + * @return {void} + */ + + }, { + key: "pause", + value: function pause() { + this.is_started = false; + this.component.pause && this.component.pause(); + } + /** + * Включаем активность если она активна + * @return {void} + */ + + }, { + key: "toggle", + value: function toggle() { + if (this.is_started) this.start(); + } + /** + * Событие изменения размеров окна + * @return {void} + */ + + }, { + key: "resize", + value: function resize() { + if (this.component.resize) this.component.resize(); + } + /** + * Обновить активность (если активна) или при следующем старте + * @return {void} + */ + + }, { + key: "refresh", + value: function refresh() { + if (this.waite_refresh) return; + this.waite_refresh = true; + if (Activity.own(this.component)) this.runRefresh(); + } + /** + * Запуск обновления активности + * @returns {void} + */ + + }, { + key: "runRefresh", + value: function runRefresh() { + var _this = this; + + // Если нет пометки на обновление, то не обновляем + if (!this.waite_refresh) return; + clearTimeout(this.timer_refresh); // При переходе назад текушая активность уничтожается через 200мс, поэтому ждем на удаление и запускаем обновление + + this.timer_refresh = setTimeout(function () { + if (_this.component.beforeRefresh) _this.component.beforeRefresh(); + Activity.replace(); + }, 400); + this.loader(true); + } + }, { + key: "canRefresh", + value: function canRefresh() { + console.warn('activity.canRefresh is deprecated'); + return false; + } + }, { + key: "needRefresh", + value: function needRefresh() { + console.warn('activity.needRefresh is deprecated, use activity.refresh()'); + } + /** + * Останавливает активность когда открывается другая + * @return {void} + */ + + }, { + key: "stop", + value: function stop() { + this.is_started = false; + if (this.is_stopped) return; + this.is_stopped = true; + this.component.stop && this.component.stop(); + this.slide.remove(); + } + /** + * Вернуть HTML слайд активности + * @param {boolean} js - вернуть js объект + * @returns {jQuery|HTMLElement} - HTML слайд активности + */ + + }, { + key: "render", + value: function render(js) { + return js ? this.slide : $(this.slide); + } + /** + * Уничтожение активности + * @returns {void} + */ + + }, { + key: "destroy", + value: function destroy() { + try { + this.component.destroy(); + } catch (e) { + console.log('Activity', 'destroy error:', e.stack); + } // После create работает долгий запрос и затем вызывается build, однако уже было вызвано destroy и возникают ошибки, поэтому заодно чистим функцию build и остальные функции компонента + + + for (var f in this.component) { + if (typeof this.component[f] == 'function') { + this.component[f] = function () {}; + } + } // Помечаем что компонент уничтожен, для внутренних функций компонента + + + this.component.destroyed = true; + this.slide.remove(); + clearTimeout(this.timer_refresh); + } + }]); + + return ActivitySlide; + }(); + + var listener$3 = Subscribe$2(); var activites = []; var callback = false; var fullout = false; + var focustime = Date.now(); var content; var slides; var maxsave; var base; - - function Activity(component, object) { - var slide = Template.js('activity'); - var body = slide.querySelector('.activity__body'); - this.stoped = false; - this.started = false; - /** - * Добовляет активити в список активитис - */ - - this.append = function () { - slides.appendChild(slide); - }; - /** - * Создает новую активность - */ - - - this.create = function () { - try { - component.create(body); - - var _render = component.render(true); - - body.appendChild(_render instanceof jQuery ? _render[0] : _render); - } catch (e) { - console.log('Activity', 'create error:', e.stack); - } - }; - /** - * Показывает загрузку - * @param {boolean} status - */ - - - this.loader = function (status) { - if (status) slide.classList.add('activity--load');else slide.classList.remove('activity--load'); - }; - /** - * Создает повторно - */ - - - this.restart = function () { - this.append(); - this.stoped = false; - component.start(); - }; - /** - * Стартуем активную активность - */ - - - this.start = function () { - this.started = true; - Controller.add('content', { - invisible: true, - update: function update() {}, - toggle: function toggle() {}, - left: function left() { - Controller.toggle('menu'); - }, - up: function up() { - Controller.toggle('head'); - }, - back: function back() { - backward(); - } - }); - Controller.toggle('content'); //Layer.update(slide) - - if (this.stoped) this.restart();else component.start(); - }; - /** - * Пауза - */ - - - this.pause = function () { - this.started = false; - component.pause(); - }; - /** - * Включаем активность если она активна - */ - - - this.toggle = function () { - if (this.started) this.start(); - }; - - this.refresh = function () { - if (component.refresh) component.refresh(); - }; - - this.canRefresh = function () { - var status = this.started && this.need_refresh && inActivity() ? true : false; - - if (status) { - this.need_refresh = false; - replace(object); - } - - return status; - }; - - this.needRefresh = function () { - var _this = this; - - if (body.parentElement) body.parentElement.removeChild(body); - this.need_refresh = true; - var wait = Template.js('activity_wait_refresh'); - wait.addEventListener('click', function (e) { - if (DeviceInput.canClick(e.originalEvent)) _this.canRefresh(); - }); - slide.appendChild(wait); - }; - /** - * Стоп - */ - - - this.stop = function () { - this.started = false; - if (this.stoped) return; - this.stoped = true; - component.stop(); - if (slide.parentElement) slide.parentElement.removeChild(slide); - }; - /** - * Рендер - */ - - - this.render = function (js) { - return js ? slide : $(slide); - }; - /** - * Получить класс компонента - */ - - - this.component = function () { - return component; - }; - /** - * Уничтожаем активность - */ - - - this.destroy = function () { - component.destroy(); //после create работает долгий запрос и затем вызывается build, однако уже было вызвано destroy и возникают ошибки, поэтому заодно чистим функцию build и empty - - for (var f in component) { - if (typeof component[f] == 'function') { - component[f] = function () {}; - } - } - - slide.remove(); - }; - - this.append(); - } + var refresh_timer; function parseStart() { if (window.start_deep_link) return; - var id = Utils$2.gup('card'); + var id = Utils$1.gup('card'); if (id) { window.start_deep_link = { id: id, component: "full", - method: Utils$2.gup('media') || 'movie', - source: Utils$2.gup('source') || 'cub', + method: Utils$1.gup('media') || 'movie', + source: Utils$1.gup('source') || 'cub', card: { id: id, - source: Utils$2.gup('source') || 'cub' + source: Utils$1.gup('source') || 'cub' } }; } else if (!(Platform.is('orsay') || Platform.is('netcast') || Platform.is('webos') || Platform.is('tizen'))) { @@ -33629,7 +37954,7 @@ */ - function init$o() { + function init$s() { content = Template.js('activitys'); slides = content.querySelector('.activitys__slides'); maxsave = Storage.get('pages_save_total', 5); @@ -33643,9 +37968,8 @@ setTimeout(function () { wait = false; }, 1500); - setTimeout(last$1, 500); + setTimeout(last, 500); window.addEventListener('popstate', function () { - if (window.god_enabled) Lampa.Noty.show('Popstate - [' + (fullout || wait) + ']'); if (fullout || wait) return; Screensaver$2.stop(); if (swip_status == 0) empty(); //это чтоб не выходило с приложения, однако на айфонах это вызвает зависание на 2-3 сек @@ -33659,13 +37983,18 @@ }); Storage.listener.follow('change', function (event) { if (event.name == 'pages_save_total') maxsave = Storage.get('pages_save_total', 5); + if (event.name == 'light_version' || event.name == 'account_use' || event.name == 'interface_size' || event.name == 'account' && !event.value) refresh(true); + }); // Обновляем активность при изменении профиля, протокола или прочитаных ссылок в закладках и истории - if (event.name == 'light_version') { - activites.forEach(function (activity) { - if (activity.activity) activity.activity.refresh(); - }); - } - }); // исключительно для огрызков пришлось мутить работу свайпа назад + Lampa.Listener.follow('state:changed', function (e) { + if (e.target == 'favorite' && (e.reason == 'profile' || e.reason == 'read')) refresh(true); + }); // После имземения размера окна возникает поломанный интерфейс, надо перезапустить активность или уведомить компонент о изменении + + Lampa.Listener.follow('resize_end', function (e) { + activites.forEach(function (activity) { + if (activity.activity) activity.activity.resize(); + }); + }); // Исключительно для огрызков пришлось мутить работу свайпа назад if (Platform.is('apple')) { var body = document.querySelector('body'); @@ -33682,7 +38011,7 @@ swip_status = 0; } }); - } // выход из приложения + } // Выход из приложения listener$3.follow('backward', function (event) { @@ -33691,12 +38020,12 @@ if (event.count == 1 && Date.now() > start_time + 1000 * 2 && !noout) { var enabled = Controller.enabled().name; Select.show({ - title: Lang.translate('title_out'), + title: Lang$1.translate('title_out'), items: [{ - title: Lang.translate('title_out_confirm'), + title: Lang$1.translate('title_out_confirm'), out: true }, { - title: Lang.translate('cancel') + title: Lang$1.translate('cancel') }], onSelect: function onSelect(a) { if (a.out) { @@ -33712,15 +38041,54 @@ } }); } + }); // Обновляем активность при уходе и возвращении на страницу + + document.addEventListener('visibilitychange', function () { + // Если фокус не был на странице больше часа, то обновляем активность + if (Date.now() - focustime > 1000 * 60 * 60) refresh(true); + resetFocusTime(); }); + PlayerVideo.listener.follow('timeupdate', resetFocusTime); + Keypad.listener.follow('keydown', resetFocusTime); + } + /** + * Сбросить время фокуса + */ + + + function resetFocusTime() { + focustime = Date.now(); + } + /** + * Обновить активность или все активности + * @param {boolean} all - обновить все активности + * @return {void} + */ + + + function refresh() { + var all = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + clearTimeout(refresh_timer); // Обновляем активность через 1 секунду, чтобы не было сразу нескольких обновлений + + refresh_timer = setTimeout(function () { + if (all) { + activites.forEach(function (activity) { + if (activity.activity) activity.activity.refresh(); + }); + } else { + var curent = active$3(); + if (curent && curent.activity) curent.activity.refresh(); + } + }, 1000); } /** * Лимит активностей, уничтожать если больше maxsave + * @return {void} */ function limit() { - var curent = active$2(); + var curent = active$3(); if (curent && curent.activity) curent.activity.pause(); var tree_stop = activites.slice(-2); if (tree_stop.length > 1 && tree_stop[0].activity) tree_stop[0].activity.stop(); @@ -33742,18 +38110,21 @@ } /** * Обновить адрес в строке из активности + * @param {object} object - параметры активности + * @param {boolean} replace - заменить текущий адрес, по умолчанию false (добавить в историю) + * @param {string} mix - дополнительные параметры в строку + * @returns {void} */ function pushState(object, replace, mix) { var path = window.location.protocol == 'file:' ? '' : base ? '/' : ''; if (!window.lampa_settings.push_state) return window.history.pushState(null, null, path); - var data = Arrays.clone(object); - delete data.activity; + var data = Arrays.clone(extractObject(object)); var comp = []; for (var n in data) { - if (typeof data[n] == 'string' || typeof data[n] == 'number' || typeof data[n] == 'boolean') comp.push(n + '=' + encodeURIComponent(data[n])); + if ((typeof data[n] == 'string' || typeof data[n] == 'number' || typeof data[n] == 'boolean') && data[n]) comp.push(n + '=' + encodeURIComponent(data[n])); } var card = object.card || object.movie; @@ -33765,36 +38136,42 @@ } /** * Обновить адрес в строке из активности с добавлением дополнительных параметров + * @param {string} mix - дополнительные параметры в строку + * @returns {void} */ function mixState(mix) { - var curent = active$2(); + var curent = active$3(); if (curent && curent.activity) pushState(curent, true, mix); } /** * Добавить новую активность - * @param {{component:string}} object + * @param {{component:string}} object - параметры активности + * @returns {void} */ - function push$2(object) { + function push$3(object) { limit(); - create$3(object); + create$4(object); activites.push(object); - start$3(object); + start$2(object); pushState(object); } /** * Создать новую активность - * @param {{component:string}} object + * @param {{component:string}} object - параметры активности + * @returns {void} */ - function create$3(object) { + function create$4(object) { var comp = Component.create(object); - object.activity = new Activity(comp, object); + comp.props = new Props(Arrays.clone(extractObject(object))); + object.activity = new ActivitySlide(comp, object); comp.activity = object.activity; + slides.append(object.activity.render(true)); Lampa.Listener.send('activity', { component: object.component, type: 'init', @@ -33808,7 +38185,8 @@ }); } /** - * Вызов обратно пользователем + * Вызов (назад) пользователем + * @return {void} */ @@ -33823,10 +38201,11 @@ /** * Получить активную активность * @returns {object} + * @return {{component:string, activity:class}} - параметры активности */ - function active$2() { + function active$3() { return activites[activites.length - 1]; } @@ -33835,11 +38214,12 @@ } /** * Создать пустую историю + * @return {void} */ function empty() { - var curent = active$2(); + var curent = active$3(); if (curent && curent.activity) pushState(curent, false, 'r=' + Math.random()); } /** @@ -33853,6 +38233,7 @@ } /** * Получить рендеры всех активностей + * @param {boolean} js - вернуть js объекты * @returns {array} */ @@ -33866,6 +38247,7 @@ } /** * Обработать событие назад + * @return {void} */ @@ -33894,14 +38276,14 @@ var previous_tree = activites.slice(-maxsave); if (previous_tree.length > maxsave - 1) { - create$3(previous_tree[0]); + create$4(previous_tree[0]); } previous_tree = activites.slice(-1)[0]; if (previous_tree) { if (previous_tree.activity) { - start$3(previous_tree); + start$2(previous_tree); Lampa.Listener.send('activity', { component: previous_tree.component, type: 'archive', @@ -33909,8 +38291,8 @@ }); pushState(previous_tree, true); } else { - create$3(previous_tree); - start$3(previous_tree); + create$4(previous_tree); + start$2(previous_tree); pushState(previous_tree); } } @@ -33918,21 +38300,16 @@ /** * Сохранить активность в память * @param {{component:string, activity:class}} object + * @return {void} */ function save(object) { - var saved = {}; - - for (var i in object) { - if (i !== 'activity') saved[i] = object[i]; - } - - Storage.set('activity', saved); + Storage.set('activity', extractObject(object)); } /** * Получить данные активности - * @param {{component:string, activity:class}} object + * @param {{component:string, activity:class}} object - параметры активности * @returns {{component:string}} */ @@ -33941,25 +38318,31 @@ var saved = {}; for (var i in object) { - if (i !== 'activity') saved[i] = object[i]; + if (!(i == 'activity' || i == 'props' || i == 'params')) saved[i] = object[i]; } return saved; } /** * Активируем следующию активность - * @param {{component:string, activity:class}} object + * @param {{component:string, activity:class}} object - параметры активности + * @return {void} */ - function start$3(object) { + function start$2(object) { + Head.title(object.title); + + if (object.activity.is_stopped) { + slides.append(object.activity.render(true)); + } + object.activity.start(); save(object); Array.from(slides.children).forEach(function (slide) { - return slide.classList.remove('activity--active'); + slide.hasClass('activity--active') && slide.removeClass('activity--active'); }); - object.activity.render(true).classList.add('activity--active'); - Head.title(object.title); + object.activity.render().addClass('activity--active'); Lampa.Listener.send('activity', { component: object.component, type: 'start', @@ -33968,10 +38351,11 @@ } /** * С какой активности начать запуск лампы + * @return {void} */ - function last$1() { + function last() { var active = Storage.get('activity', 'false'); var start_from = Storage.field("start_page"); @@ -33980,12 +38364,12 @@ component: 'iptv', page: 1 }; - push$2(active); + push$3(active); } else if (window.start_deep_link) { - push$2(window.start_deep_link); + push$3(window.start_deep_link); } else if (active && start_from === "last") { if (active.page) active.page = 1; - push$2(active); + push$3(active); } else { var _start_from$split = start_from.split('@'), _start_from$split2 = _slicedToArray(_start_from$split, 2), @@ -33993,24 +38377,24 @@ type = _start_from$split2[1]; if (action == 'favorite') { - push$2({ + push$3({ url: '', - title: Lang.translate(type == 'bookmarks' ? 'settings_input_links' : 'title_history'), + title: Lang$1.translate(type == 'bookmarks' ? 'settings_input_links' : 'title_history'), component: type == 'bookmarks' ? 'bookmarks' : 'favorite', type: type, page: 1 }); } else if (action == 'mytorrents') { - push$2({ + push$3({ url: '', - title: Lang.translate('title_mytorrents'), + title: Lang$1.translate('title_mytorrents'), component: 'mytorrents', page: 1 }); } else { - push$2({ + push$3({ url: '', - title: Lang.translate('title_main') + ' - ' + Storage.field('source').toUpperCase(), + title: Lang$1.translate('title_main') + ' - ' + Storage.field('source').toUpperCase(), component: 'main', source: Storage.field('source'), page: 1 @@ -34020,16 +38404,17 @@ } /** * Рендер - * @returns {object} + * @returns {HTMLElement} */ - function render$3() { + function render$2() { return content; } /** * Подключить обратный вызов при изменени истории - * @param {*} call + * @param {function} call - функция обратного вызова + * @return {void} */ @@ -34038,6 +38423,7 @@ } /** * Выход из лампы + * @return {void} */ @@ -34056,20 +38442,22 @@ } /** * Заменить активную активность - * @param {object} replace + * @param {object} replace - заменить на новые параметры + * @param {boolean} clear - использовать только новые параметры, по умолчанию false + * @return {void} */ function replace() { var replace = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var clear = arguments.length > 1 ? arguments[1] : undefined; - var object = extractObject(active$2()); + var clear = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var object = extractObject(active$3()); for (var i in replace) { object[i] = replace[i]; } - var made = active$2(); + var made = active$3(); made.activity.destroy(); Lampa.Listener.send('activity', { component: made.component, @@ -34077,37 +38465,50 @@ object: made }); activites.pop(); - push$2(clear ? replace : object); + push$3(clear ? replace : object); + } + /** + * Проверить что активность принадлежит компоненту + * @param {object} component - компонент + * @returns {boolean} + */ + + + function own$1(component) { + var curent = active$3(); + return curent && curent.activity && curent.activity === component.activity; } - var Activity$1 = { - init: init$o, + var Activity = { + init: init$s, listener: listener$3, - push: push$2, + push: push$3, back: back$3, - render: render$3, + render: render$2, backward: backward, call: call, - last: last$1, + last: last, out: out, replace: replace, - active: active$2, + active: active$3, all: all, extractObject: extractObject, renderLayers: renderLayers, inActivity: inActivity, pushState: pushState, - mixState: mixState + mixState: mixState, + own: own$1, + refresh: refresh }; - var listener$2 = start$8(); - var active$1; + var listener$2 = Subscribe$2(); + var active$2; var active_name = ''; var controlls = {}; var select_active; var try_close = false; - function observe$1() { + function observe() { if (typeof MutationObserver == 'undefined') return; var observer = new MutationObserver(function (mutations) { for (var i = 0; i < mutations.length; i++) { @@ -34153,10 +38554,10 @@ function run(name, params) { - if (active$1) { - if (active$1[name]) { - if (typeof active$1[name] == 'function') active$1[name](params);else if (typeof active$1[name] == 'string') { - run(active$1[name], params); + if (active$2) { + if (active$2[name]) { + if (typeof active$2[name] == 'function') active$2[name](params);else if (typeof active$2[name] == 'string') { + run(active$2[name], params); } } } @@ -34176,9 +38577,9 @@ function enter() { - if (active$1 && active$1.enter) run('enter');else if (select_active) { + if (active$2 && active$2.enter) run('enter');else if (select_active) { animateTriggerEnter(select_active); - Utils$2.trigger(select_active, 'hover:enter'); + Utils$1.trigger(select_active, 'hover:enter'); } } /** @@ -34187,7 +38588,7 @@ function _long() { - if (active$1 && active$1["long"]) run('long');else if (select_active) Utils$2.trigger(select_active, 'hover:long'); + if (active$2 && active$2["long"]) run('long');else if (select_active) Utils$1.trigger(select_active, 'hover:long'); } /** * Завершить @@ -34212,17 +38613,17 @@ function toggle$2(name) { - if (active$1 && active$1.gone) active$1.gone(name); + if (active$2 && active$2.gone) active$2.gone(name); if (controlls[name]) { if (name == 'content') toContent(); - active$1 = controlls[name]; + active$2 = controlls[name]; active_name = name; - Activity$1.call(function () { + Activity.call(function () { run('back'); }); - if (active$1.toggle) active$1.toggle(); - if (active$1.update) active$1.update();else { + if (active$2.toggle) active$2.toggle(); + if (active$2.update) active$2.update();else { Layer.update(); } listener$2.send('toggle', { @@ -34246,7 +38647,7 @@ if (time + 100 < Date.now()) { var mutation = Math.abs(long_position - (offset.top + offset.left)); - if (mutation < 30) Utils$2.trigger(elem, 'hover:long'); + if (mutation < 30) Utils$1.trigger(elem, 'hover:long'); } elem.long_time = Date.now(); @@ -34260,37 +38661,35 @@ var touchStart = function touchStart() { longStart(); - Utils$2.trigger(elem, 'hover:touch'); + Utils$1.trigger(elem, 'hover:touch'); }; var rightClick = function rightClick(e) { - Utils$2.trigger(elem, 'hover:long'); + Utils$1.trigger(elem, 'hover:long'); }; elem.trigger_click = function (e) { - if (Storage.field('navigation_type') == 'mouse' || Platform.screen('mobile')) { - if (DeviceInput.canClick(e)) { - animateTriggerEnter(elem); - Utils$2.trigger(elem, 'hover:enter'); - } + if (DeviceInput.canClick(e) && DeviceInput.noDubleClick(e)) { + animateTriggerEnter(elem); + Utils$1.trigger(elem, 'hover:enter'); } }; elem.trigger_mouseenter = function () { clearAllFocus(); - elem.classList.add('focus'); - Utils$2.trigger(elem, 'hover:hover'); + elem.toggleClass('focus', true); + Utils$1.trigger(elem, 'hover:hover'); }; elem.trigger_mouseleave = function () { - elem.classList.remove('focus'); + elem.toggleClass('focus', false); }; - if (Storage.field('navigation_type') == 'mouse' || Platform.screen('mobile')) { - elem.addEventListener('click', elem.trigger_click); - } + elem.addEventListener('click', function (e) { + setTimeout(elem.trigger_click.bind(null, e), 20); + }); - if (!Utils$2.isTouchDevice() && Storage.field('navigation_type') == 'mouse') { + if (!Utils$1.isTouchDevice() && Storage.field('navigation_type') == 'mouse') { elem.addEventListener('mouseenter', elem.trigger_mouseenter); elem.addEventListener('mouseleave', elem.trigger_mouseleave); elem.addEventListener('mouseout', longClear); @@ -34299,7 +38698,7 @@ elem.addEventListener('contextmenu', rightClick); } - if (Utils$2.isTouchDevice()) { + if (Utils$1.isTouchDevice()) { elem.addEventListener('touchstart', touchStart); elem.addEventListener('touchend', longClear); elem.addEventListener('touchmove', longClear); @@ -34319,7 +38718,7 @@ function clearAllFocus() { var collection = Array.from(document.body.querySelectorAll('.selector')); collection.forEach(function (item) { - return item.classList.remove('focus'); + return item.toggleClass('focus', false); }); } /** @@ -34342,7 +38741,7 @@ if (Navigator._collection) { Navigator._collection.forEach(function (element) { classes.forEach(function (class_name) { - element.classList.remove(class_name); + element.toggleClass(class_name, false); }); }); } @@ -34354,11 +38753,11 @@ function focus(target) { - Utils$2.trigger(target, 'hover:focus'); + Utils$1.trigger(target, 'hover:focus'); if (Platform.screen('tv')) { removeClass(['focus']); - target.classList.add('focus'); + target.toggleClass('focus', true); } select_active = target; @@ -34378,7 +38777,7 @@ colection = colection.concat(Array.from(append.querySelectorAll('.selector'))); } - if (colection.length || active$1.invisible) { + if (colection.length || active$2.invisible) { clearSelects(); Navigator.setCollection(colection); } @@ -34410,13 +38809,13 @@ } function own(link) { - return active$1 && active$1.link == link; + return active$2 && active$2.link == link; } function enabled() { return { name: active_name, - controller: active$1 + controller: active$2 }; } @@ -34467,7 +38866,7 @@ var Controller = { listener: listener$2, - observe: observe$1, + observe: observe, add: add$4, move: move, enter: enter, @@ -34523,17 +38922,27 @@ layers[name][code] = layout; } - function get$1(name) { + function get$2(name) { return layers[name]; } var Layers = { add: add$3, addLang: addLang, - get: get$1 + get: get$2 }; - function create$2() { + /** + * Виртуальная клавиатура + * @param {object} [params] - параметры клавиатуры + * @param {string} [params.layout] - имя слоя клавиатуры из Layers (default, extended, full, ru, en и т.д.) или сам слой + * @param {boolean} [params.textarea=false] - использовать textarea вместо input (для мобильных устройств) + * @param {boolean} [params.nomic=false] - отключить микрофон + * @param {string} [params.keyboard] - тип клавиатуры (lampa или simple) + * @return {Keyboard} + */ + + function Keyboard() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _keyClass = window.SimpleKeyboard["default"], @@ -34562,16 +38971,17 @@ simple = params.keyboard !== 'lampa'; } - this.listener = start$8(); + if (Platform.screen('mobile')) simple = true; + this.listener = Subscribe$2(); this.create = function () { var _this = this; if (simple) { - input = $(''); + input = $(''); if (mobile) { - input = $(''); + input = $(''); input.on('input', function () { input[0].style.height = 'auto'; input[0].style.height = input[0].scrollHeight + 'px'; @@ -34592,7 +39002,7 @@ ime.inputboxID = 'orsay-keyboard'; ime.setUseIMEDim(false); ime.setMaxlength(256); - ime.inputTitle = Lang.translate('search_input') + "..."; + ime.inputTitle = Lang$1.translate('search_input') + "..."; ime.onKeyPressFunc = function (key, str, id) { switch (key) { @@ -34655,13 +39065,13 @@ var valu = input.val(); var cart = e.target.selectionStart; - if (keys.indexOf(e.keyCode) >= 0 && !(Utils$2.isTouchDevice() && params.textarea && Platform.screen('mobile'))) { + if (keys.indexOf(e.keyCode) >= 0 && !(Utils$1.isTouchDevice() && params.textarea && Platform.screen('mobile'))) { e.preventDefault(); console.log('Keyboard', 'blur key:', e.keyCode, 'value:', valu); input.blur(); } - if ((e.keyCode == 13 || e.keyCode == 65376) && !(Utils$2.isTouchDevice() && params.textarea && Platform.screen('mobile'))) _this.listener.send('enter'); + if ((e.keyCode == 13 || e.keyCode == 65376) && !(Utils$1.isTouchDevice() && params.textarea && Platform.screen('mobile'))) _this.listener.send('enter'); if (e.keyCode == 37 && cart == 0 && height == window.innerHeight) { if (stated) input.blur(), _this.listener.send('left'); @@ -34696,7 +39106,7 @@ }); var keyboard = $('.simple-keyboard'); - if (!Platform.is('orsay') && (window.SpeechRecognition || window.webkitSpeechRecognition) && !params.nomic) { + if (!Platform.is('orsay') && (window.SpeechRecognition || window.webkitSpeechRecognition) && !params.nomic && Platform.screen('tv')) { var mic = $("
\n \n \n \n \n \n
"); mic.on('hover:enter', function () { if (Platform.is('android')) { @@ -34717,7 +39127,7 @@ if (mobile) keyboard.addClass('simple-keyboard--with-textarea'); if (Platform.screen('mobile')) { - var buttons = $('
' + Lang.translate('ready') + '
' + Lang.translate('cancel') + '
'); + var buttons = $('
' + Lang$1.translate('ready') + '
' + Lang$1.translate('cancel') + '
'); buttons.find('.simple-keyboard-buttons__enter').on('click', function () { input.blur(); @@ -34742,7 +39152,7 @@ '{LANG}': ' ', '{ABC}': 'Aa', '{SIM}': '#+', - '{SEARCH}': Lang.translate('search'), + '{SEARCH}': Lang$1.translate('search'), '{MIC}': "\n \n \n \n " }, layout: layout, @@ -34766,7 +39176,7 @@ } } } else if (button === '{LANG}') { - var codes = Lang.codes(); + var codes = Lang$1.codes(); var items = []; var select_code = _keyBord.options.layoutName.split('-')[0]; @@ -34787,7 +39197,7 @@ }); setTimeout(function () { Select.show({ - title: Lang.translate('title_choice_language'), + title: Lang$1.translate('title_choice_language'), items: items, onSelect: function onSelect(item) { Select.hide(); @@ -34850,7 +39260,7 @@ $('.simple-keyboard [data-skbtn="{mic}"]').css('color', 'red'); $('.simple-keyboard-mic').addClass('record'); recognition.record = true; - Noty.show(Lang.translate('keyboard_listen')); + Noty.show(Lang$1.translate('keyboard_listen')); }); recognition.addEventListener("end", function () { console.log('Speech', 'end'); @@ -34878,7 +39288,7 @@ console.log('Speech', 'error:', event); if (event.error == 'not-allowed') { - Noty.show(Lang.translate('keyboard_nomic')); + Noty.show(Lang$1.translate('keyboard_nomic')); } recognition.stop(); @@ -35016,7 +39426,7 @@ }; } - var html$5, + var html$8, keyboard, input, input_value = ''; @@ -35027,68 +39437,68 @@ */ function edit(params, call) { - html$5 = Template.get('settings_input'); - input = html$5.find('.settings-input__input'); - var lamp = Storage.field('keyboard_type') == 'lampa' || params.keyboard == 'lampa'; - if (!lamp) input.hide(); - $('body').addClass('keyboard-input--visible').append(html$5); + html$8 = Template.get('settings_input'); + input = html$8.find('.settings-input__input'); + if ((params.keyboard || Storage.field('keyboard_type')) !== 'lampa') input.hide(); + $('body').addClass('keyboard-input--visible').append(html$8); + html$8.addClass('settings-input--align-' + (params.align || 'center')); var pass = function pass(v) { return params.password ? v.replace(/./g, '*') : v; }; - keyboard = new create$2(params); + keyboard = new Keyboard(params); keyboard.listener.follow('change', function (event) { input_value = event.value.trim(); input.toggleClass('filled', Boolean(event.value)); - input.html(pass(Utils$2.inputDisplay(event.value))); + input.html(pass(Utils$1.inputDisplay(event.value))); }); keyboard.listener.follow('enter', function (event) { back$1(); call(input_value); }); keyboard.listener.follow('focus', function (event) { - html$5.toggleClass('settings-input--focus', true); + html$8.toggleClass('settings-input--focus', true); }); keyboard.listener.follow('blur', function (event) { - html$5.toggleClass('settings-input--focus', false); + html$8.toggleClass('settings-input--focus', false); }); - html$5.toggleClass('settings-input--free', params.free ? true : false); - $('.settings-input__links', html$5).toggleClass('hide', params.nosave ? true : false); - if (params.title) html$5.find('.settings-input__content').prepend('
' + params.title + '
'); + html$8.toggleClass('settings-input--free', params.free ? true : false); + $('.settings-input__links', html$8).toggleClass('hide', params.nosave ? true : false); + if (params.title) html$8.find('.settings-input__content').prepend('
' + params.title + '
'); keyboard.listener.follow('down', function (event) { if (params.nosave) return; var members = Storage.get('setting_member', []); var links = []; links.push({ - title: (members.indexOf(input_value) == -1 ? Lang.translate('settings_add') : Lang.translate('settings_remove')) + ' ' + Lang.translate('settings_this_value'), + title: (members.indexOf(input_value) == -1 ? Lang$1.translate('settings_add') : Lang$1.translate('settings_remove')) + ' ' + Lang$1.translate('settings_this_value'), subtitle: input_value, add: true }); members.forEach(function (link) { links.push({ title: link, - subtitle: Lang.translate('settings_user_links'), + subtitle: Lang$1.translate('settings_user_links'), url: link, member: true }); }); links = links.concat([{ title: '127.0.0.1:8090', - subtitle: Lang.translate('settings_for_local'), + subtitle: Lang$1.translate('settings_for_local'), url: '127.0.0.1:8090' }]); Select.show({ - title: Lang.translate('title_links'), + title: Lang$1.translate('title_links'), items: links, onSelect: function onSelect(a) { if (a.add) { if (members.indexOf(a.subtitle) == -1) { Arrays.insert(members, 0, a.subtitle); - Noty.show(Lang.translate('settings_added') + ' (' + a.subtitle + ')'); + Noty.show(Lang$1.translate('settings_added') + ' (' + a.subtitle + ')'); } else { Arrays.remove(members, a.subtitle); - Noty.show(Lang.translate('settings_removed') + ' (' + a.subtitle + ')'); + Noty.show(Lang$1.translate('settings_removed') + ' (' + a.subtitle + ')'); } Storage.set('setting_member', members); @@ -35101,7 +39511,7 @@ onLong: function onLong(a, elem) { if (a.member) { Arrays.remove(members, a.url); - Noty.show(Lang.translate('settings_removed') + ' (' + a.url + ')'); + Noty.show(Lang$1.translate('settings_removed') + ' (' + a.url + ')'); Storage.set('setting_member', members); $(elem).css({ opacity: 0.4 @@ -35121,7 +39531,6 @@ keyboard.value(params.value); keyboard.toggle(); input_value = params.value; - Helper.show('keyboard', Lang.translate('helper_keyboard')); return keyboard; } /** @@ -35130,7 +39539,7 @@ function back$1() { - destroy(); + destroy$1(); Controller.toggle('settings_component'); } /** @@ -35138,11 +39547,11 @@ */ - function destroy() { + function destroy$1() { keyboard.destroy(); - html$5.remove(); + html$8.remove(); $('body').removeClass('keyboard-input--visible'); - html$5 = null; + html$8 = null; keyboard = null; input = null; } @@ -35153,81 +39562,81 @@ var values = {}; var defaults = {}; - var listener$1 = start$8(); + var listener$1 = Subscribe$2(); /** * Запуск */ - function init$n() { + function init$r() { if (Platform.is('tizen')) { - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}', 'tizen': 'Tizen' }, 'tizen'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}', 'tizen': 'Tizen' }, 'tizen'); - select$1('player_torrent', { + select('player_torrent', { 'inner': '#{settings_param_player_inner}', 'tizen': 'Tizen' }, 'tizen'); } if (Platform.is('orsay')) { - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}', 'orsay': 'Orsay' }, 'orsay'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}', 'orsay': 'Orsay' }, 'orsay'); - select$1('player_torrent', { + select('player_torrent', { 'inner': '#{settings_param_player_inner}', 'orsay': 'Orsay' }, 'orsay'); } else if (Platform.is('webos')) { - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}', 'webos': 'WebOS' }, 'inner'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}', 'webos': 'WebOS' }, 'inner'); - select$1('player_torrent', { + select('player_torrent', { 'inner': '#{settings_param_player_inner}', 'webos': 'WebOS' }, 'inner'); } else if (Platform.is('android')) { - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}', 'android': 'Android' }, 'android'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}', 'android': 'Android' }, 'android'); - select$1('player_torrent', { + select('player_torrent', { 'android': 'Android' }, 'android'); trigger('internal_torrclient', false); } else if (Platform.desktop() && !Platform.macOS()) { - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}', 'other': '#{settings_param_player_outside}' }, 'inner'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}', 'other': '#{settings_param_player_outside}' }, 'inner'); - select$1('player_torrent', { + select('player_torrent', { 'inner': '#{settings_param_player_inner}', 'other': '#{settings_param_player_outside}' }, 'inner'); } else if (Platform.macOS()) { - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}', 'iina': 'IINA', 'infuse': 'Infuse', @@ -35235,7 +39644,7 @@ 'nplayer': 'nPlayer', 'tracyplayer': 'TracyPlayer' }, 'inner'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}', 'iina': 'IINA', 'infuse': 'Infuse', @@ -35243,7 +39652,7 @@ 'nplayer': 'nPlayer', 'tracyplayer': 'TracyPlayer' }, 'inner'); - select$1('player_torrent', { + select('player_torrent', { 'inner': '#{settings_param_player_inner}', 'iina': 'IINA', 'infuse': 'Infuse', @@ -35252,7 +39661,7 @@ 'tracyplayer': 'TracyPlayer' }, 'inner'); } else if (Platform.is('apple')) { - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}', 'ios': 'iOS', 'vlc': 'VLC', @@ -35263,7 +39672,7 @@ 'tracyplayer': 'TracyPlayer', 'senplayer': 'SenPlayer' }, 'inner'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}', 'ios': 'iOS', 'vlc': 'VLC', @@ -35273,7 +39682,7 @@ 'tracyplayer': 'TracyPlayer', 'senplayer': 'SenPlayer' }, 'inner'); - select$1('player_torrent', { + select('player_torrent', { 'inner': '#{settings_param_player_inner}', 'ios': 'iOS', 'vlc': 'VLC', @@ -35285,7 +39694,7 @@ 'senplayer': 'SenPlayer' }, 'inner'); } else if (Platform.is('apple_tv')) { - select$1('player', { + select('player', { 'tvos': '#{settings_param_player_inner_tvos} tvOS Universal', 'tvosl': '#{settings_param_player_inner_tvos} tvOS Online', 'tvosSelect': '#{settings_param_player_outside}', @@ -35295,7 +39704,7 @@ 'inner': '#{settings_param_player_inner}', 'svplayer': 'SVPlayer' }, 'tvos'); - select$1('player_iptv', { + select('player_iptv', { 'tvos': '#{settings_param_player_inner_tvos} tvOS Universal', 'tvosl': '#{settings_param_player_inner_tvos} tvOS Online', 'tvosSelect': '#{settings_param_player_outside}', @@ -35305,7 +39714,7 @@ 'inner': '#{settings_param_player_inner}', 'svplayer': 'SVPlayer' }, 'inner'); - select$1('player_torrent', { + select('player_torrent', { 'tvos': '#{settings_param_player_inner_tvos} tvOS Universal', 'tvosSelect': '#{settings_param_player_outside}', 'infuse': 'Infuse', @@ -35324,18 +39733,19 @@ 'cub': 'CUB', 'aerial': 'Aerial' }; - select$1('screensaver_type', screensaver_types, 'aerial'); - select$1('keyboard_type', { + select('screensaver_type', screensaver_types, 'aerial'); + select('keyboard_type', { 'lampa': '#{settings_param_keyboard_lampa}', 'integrate': '#{settings_param_keyboard_system}' - }, Platform.screen('mobile') || Platform.is('apple_tv') || Platform.macOS() ? 'integrate' : 'lampa'); - select$1('navigation_type', { + }, Platform.screen('mobile') || Platform.is('apple_tv') || Platform.macOS() || Platform.desktop() || Platform.is('browser') ? 'integrate' : 'lampa'); + select('navigation_type', { 'controll': '#{settings_param_navigation_remote}', - 'mouse': '#{settings_param_navigation_mouse}' - }, Platform.is('browser') || Platform.desktop() ? 'mouse' : 'controll'); //язык и комбинации для поиска + 'mouse': '#{settings_param_navigation_mouse}', + 'touch': '#{settings_param_navigation_touch}' + }, Platform.is('browser') || Platform.desktop() ? 'mouse' : Platform.screen('mobile') ? 'touch' : 'controll'); //язык и комбинации для поиска var langcode = Storage.get('language', 'ru'); - var langname = Lang.codes()[langcode]; + var langname = Lang$1.codes()[langcode]; var selector = { 'df': '#{settings_param_torrent_lang_orig}', 'df_year': '#{settings_param_torrent_lang_orig} + #{torrent_parser_year}', @@ -35347,14 +39757,14 @@ 'lg_df_year': langname + ' + #{settings_param_torrent_lang_orig} + #{torrent_parser_year}' }; if (Arrays.getKeys(selector).indexOf(Storage.get('parse_lang', 'df')) == -1) Storage.set('parse_lang', 'df'); - select$1('parse_lang', selector, 'df'); - select$1('tmdb_lang', Lang.codes(), 'ru'); // баг со старыми телеками, неправильно работает Utils.protocol() + select('parse_lang', selector, 'df'); + select('tmdb_lang', Lang$1.codes(), 'ru'); // баг со старыми телеками, неправильно работает Utils.protocol() // let agent = navigator.userAgent.toLowerCase() // let versi = agent.match(/chrome\/(\d+)/) // versi = versi ? parseInt(versi[1]) : 60 // versi = isNaN(versi) ? 60 : versi - select$1('protocol', { + select('protocol', { 'http': '#{settings_param_no}', 'https': '#{settings_param_yes}' }, 'https'); @@ -35381,7 +39791,7 @@ */ - function select$1(name, select_data, select_default_value) { + function select(name, select_data, select_default_value) { values[name] = select_data; defaults[name] = select_default_value; } @@ -35408,7 +39818,7 @@ position = Math.max(0, Math.min(keys.length - 1, position)); value = keys[position]; Storage.set(name, value); - update$1(elem, elems, elems_html); + update$3(elem, elems, elems_html); if (onChange) onChange(value); } @@ -35420,7 +39830,7 @@ value: elem.data('string') ? window.localStorage.getItem(name) || defaults[name] : Storage.get(name, defaults[name]) + '' }, function (new_value) { Storage.set(name, new_value); - update$1(elem, elems, elems_html); + update$3(elem, elems, elems_html); if (onChange) onChange(new_value); }); } @@ -35452,7 +39862,7 @@ for (var i in _params) { items.push({ - title: Lang.translate(_params[i]), + title: Lang$1.translate(_params[i]), value: i, selected: i == _value }); @@ -35460,23 +39870,23 @@ var enabled = Controller.enabled().name; Select.show({ - title: Lang.translate('title_choice'), + title: Lang$1.translate('title_choice'), items: items, onBack: function onBack() { Controller.toggle(enabled); }, onSelect: function onSelect(a) { Storage.set(name, a.value); - update$1(elem, elems, elems_html); + update$3(elem, elems, elems_html); Controller.toggle(enabled); if (onChange) onChange(a.value); } }); } - }).on('hover:hover', function (e) { + }).on('hover:hover hover:touch', function (e) { Navigator.focused(e.target); }).each(function () { - if (!$(this).data('static')) update$1($(this), elems, elems_html); + if (!$(this).data('static')) update$3($(this), elems, elems_html); }); if (elems.eq(0).data('type') == 'add') { @@ -35522,13 +39932,13 @@ */ - function update$1(elem, elems, elems_html) { + function update$3(elem, elems, elems_html) { var name = elem.data('name'); var key = elem.data('string') ? window.localStorage.getItem(name) || defaults[name] : Storage.get(name, defaults[name] + ''); var val = typeof values[name] == 'string' ? key : values[name][key] || values[name][defaults[name]]; var plr = elem.attr('placeholder'); if (!val && plr) val = plr; - elem.find('.settings-param__value').text(Lang.translate(val)); + elem.find('.settings-param__value').text(Lang$1.translate(val)); var children = elem.data('children'); if (children) { @@ -35554,74 +39964,81 @@ return Storage.get(name, defaults[name] + ''); } /** - * Добовляем селекторы - */ + * Добовляем селекторы + */ - select$1('interface_size', { + select('interface_size', { 'small': '#{settings_param_interface_size_small}', 'normal': '#{settings_param_interface_size_normal}', 'bigger': '#{settings_param_interface_size_bigger}' - }, 'normal'); - select$1('poster_size', { + }, 'bigger'); + select('navigation_type', { + 'controll': '#{settings_param_navigation_remote}', + 'mouse': '#{settings_param_navigation_mouse}', + 'touch': '#{settings_param_navigation_touch}' + }, 'controll'); + select('poster_size', { 'w200': '#{settings_param_poster_quality_low}', 'w300': '#{settings_param_poster_quality_average}', 'w500': '#{settings_param_poster_quality_high}' - }, 'w200'); - select$1('parser_torrent_type', { + }, 'w300'); + select('parser_torrent_type', { 'jackett': 'Jackett', 'prowlarr': 'Prowlarr', 'torrserver': 'TorrServer' }, 'jackett'); - select$1('jackett_interview', { + select('jackett_interview', { 'all': '#{settings_param_jackett_interview_all}', 'healthy': '#{settings_param_jackett_interview_healthy}' }, 'all'); - select$1('background_type', { + select('background_type', { 'complex': '#{settings_param_background_complex}', 'simple': '#{settings_param_background_simple}', 'poster': '#{settings_param_background_image}' }, 'simple'); - select$1('pages_save_total', { + select('pages_save_total', { '1': '1', '2': '2', '3': '3', '4': '4', - '5': '5' + '5': '5', + '10': '10', + '20': '20' }, '5'); - select$1('player', { + select('player', { 'inner': '#{settings_param_player_inner}' }, 'inner'); - select$1('player_iptv', { + select('player_iptv', { 'inner': '#{settings_param_player_inner}' }, 'inner'); - select$1('player_torrent', { + select('player_torrent', { 'inner': '#{settings_param_player_inner}' }, 'inner'); - select$1('torrserver_use_link', { + select('torrserver_use_link', { 'one': '#{settings_param_link_use_one}', 'two': '#{settings_param_link_use_two}' }, 'one'); - select$1('subtitles_size', { + select('subtitles_size', { 'small': '#{settings_param_subtitles_size_small}', 'normal': '#{settings_param_subtitles_size_normal}', 'large': '#{settings_param_subtitles_size_bigger}' }, 'normal'); - select$1('screensaver_time', { + select('screensaver_time', { '1': '1', '2': '2', '5': '5', '10': '10' }, '5'); - select$1('parse_lang', { + select('parse_lang', { 'df': '#{settings_param_torrent_lang_orig}' }, 'df'); - select$1('parse_timeout', { + select('parse_timeout', { '15': '15', '30': '30', '60': '60' }, '15'); - select$1('player_rewind', { + select('player_rewind', { '5': '5', '10': '10', '15': '15', @@ -35630,59 +40047,59 @@ '50': '50', '100': '100' }, '20'); - select$1('player_timecode', { + select('player_timecode', { 'again': '#{settings_param_player_timecode_again}', 'continue': '#{settings_param_player_timecode_continue}', 'ask': '#{settings_param_player_timecode_ask}' }, 'continue'); - select$1('player_scale_method', { + select('player_scale_method', { 'transform': 'Transform', 'calculate': '#{settings_param_player_scale_method}' }, 'transform'); - select$1('player_hls_method', { + select('player_hls_method', { 'application': '#{settings_param_player_hls_app}', 'hlsjs': '#{settings_param_player_hls_js}' }, 'application'); - select$1('source', { + select('source', { 'tmdb': 'TMDB', 'cub': 'CUB' }, 'tmdb'); - select$1('start_page', { + select('start_page', { 'main': '#{title_main}', 'favorite@bookmarks': '#{settings_input_links}', 'favorite@history': '#{title_history}', 'mytorrents': '#{title_mytorrents}', 'last': '#{title_last}' }, 'main'); - select$1('scroll_type', { + select('scroll_type', { 'css': 'CSS', 'js': 'Javascript' }, 'css'); - select$1('card_views_type', { + select('card_views_type', { 'preload': '#{settings_param_card_view_load}', 'view': '#{settings_param_card_view_all}' }, 'preload'); - select$1('keyboard_type', { + select('keyboard_type', { 'lampa': '#{settings_param_keyboard_lampa}', 'integrate': '#{settings_param_keyboard_system}' }, 'lampa'); - select$1('card_interfice_type', { + select('card_interfice_type', { 'old': '#{settings_param_card_interface_old}', 'new': '#{settings_param_card_interface_new}' }, 'new'); - select$1('glass_opacity', { + select('glass_opacity', { 'easy': '#{settings_param_glass_easy}', 'medium': '#{settings_param_glass_medium}', 'blacked': '#{settings_param_glass_blacked}' }, 'easy'); - select$1('interface_sound_level', { + select('interface_sound_level', { '100': '100', '80': '80', '60': '60', '40': '40', '20': '20' }, '60'); - select$1('time_offset', { + select('time_offset', { 'n-10': '-10', 'n-9': '-9', 'n-8': '-8', @@ -35705,14 +40122,14 @@ 'n9': '9', 'n10': '10' }, 'n0'); - select$1('video_quality_default', { + select('video_quality_default', { '480': '480p', '720': '720p', '1080': '1080p', '1440': '1440p', '2160': '2160p' }, '1080'); - select$1('player_launch_trailers', { + select('player_launch_trailers', { 'inner': '#{settings_param_player_inner}', 'youtube': 'YouTube' }, 'inner'); @@ -35720,7 +40137,7 @@ object$2.cub_mirrors.forEach(function (mirror) { mirrors_select[mirror] = mirror; }); - select$1('cub_domain', mirrors_select, object$2.cub_domain); + select('cub_domain', mirrors_select, object$2.cub_domain); /** * Добовляем триггеры */ @@ -35761,38 +40178,38 @@ * Добовляем поля */ - select$1('jackett_url', '', ''); - select$1('jackett_key', '', ''); - select$1('prowlarr_url', '', ''); - select$1('prowlarr_key', '', ''); - select$1('torrserver_url', '', ''); - select$1('torrserver_url_two', '', ''); - select$1('torrserver_login', '', ''); - select$1('torrserver_password', '', ''); - select$1('parser_website_url', '', ''); - select$1('cloud_token', '', ''); - select$1('account_email', '', ''); - select$1('account_password', '', ''); - select$1('device_name', '', 'Lampa'); - select$1('player_nw_path', '', 'C:/Program Files/VideoLAN/VLC/vlc.exe'); - select$1('tmdb_proxy_api', '', ''); - select$1('tmdb_proxy_image', '', ''); + select('jackett_url', '', ''); + select('jackett_key', '', ''); + select('prowlarr_url', '', ''); + select('prowlarr_key', '', ''); + select('torrserver_url', '', ''); + select('torrserver_url_two', '', ''); + select('torrserver_login', '', ''); + select('torrserver_password', '', ''); + select('parser_website_url', '', ''); + select('cloud_token', '', ''); + select('account_email', '', ''); + select('account_password', '', ''); + select('device_name', '', 'Lampa'); + select('player_nw_path', '', 'C:/Program Files/VideoLAN/VLC/vlc.exe'); + select('tmdb_proxy_api', '', ''); + select('tmdb_proxy_image', '', ''); var Params = { listener: listener$1, - init: init$n, + init: init$r, bind: bind, - update: update$1, + update: update$3, field: field$1, - select: select$1, + select: select, trigger: trigger, values: values, defaults: defaults }; - var network$1 = new create$e(); + var network$1 = new Request(); function api() { - return Utils$2.protocol() + object$2.cub_domain + '/api/'; + return Utils$1.protocol() + object$2.cub_domain + '/api/'; } var WorkerArray = /*#__PURE__*/function () { @@ -35816,7 +40233,7 @@ this.class_type = class_type; console.log('StorageWorker', this.field, 'start follow'); Storage.listener.follow('change', function (e) { - if (_this.field == e.name && _this.loaded && Account.canSync() && Account.hasPremium()) { + if (_this.field == e.name && _this.loaded && Account$1.Permit.sync && Account$1.hasPremium()) { try { _this.save(e.value); } catch (e) { @@ -35845,7 +40262,7 @@ } }); this.update(); - setInterval(this.update.bind(this), 1000 * 60 * 10); + Timer.add(1000 * 60 * 10, this.update.bind(this)); } }, { key: "restrict", @@ -35891,9 +40308,8 @@ value: function update(full, nolisten) { var _this2 = this; - var account = Account.canSync(); - - if (account && Account.hasPremium()) { + if (Account$1.Permit.sync && Account$1.hasPremium()) { + var account = Account$1.Permit.account; console.log('StorageWorker', this.field, 'update start'); var url = api() + 'storage/data/' + encodeURIComponent(this.field) + '/' + this.class_type; var all = full; @@ -35935,7 +40351,7 @@ }, { key: "send", value: function send(id, value) { - if (!Account.hasPremium()) return; + if (!Account$1.hasPremium()) return; console.log('StorageWorker', 'save:', this.field, id, value); var str = JSON.stringify(value); @@ -36185,12 +40601,12 @@ object_string: WorkerObject }; - var listener = start$8(); + var listener = Subscribe$2(); var readed = {}; var workers = {}; var reserve = {}; - function init$m() { + function init$q() { sync('online_view', 'array_string'); sync('torrents_view', 'array_string'); sync('search_history', 'array_string'); @@ -36219,7 +40635,7 @@ */ - function get(name, empty) { + function get$1(name, empty) { var item; var value = readed[name]; @@ -36320,7 +40736,7 @@ function add$2(name, new_value) { - var list = get(name, '[]'); + var list = get$1(name, '[]'); if (list.indexOf(new_value) == -1) { list.push(new_value); @@ -36358,7 +40774,7 @@ function cache(name, max, empty) { - var result = get(name, JSON.stringify(empty)); + var result = get$1(name, JSON.stringify(empty)); if (Arrays.isObject(empty)) { var keys = Arrays.getKeys(result); @@ -36429,10 +40845,10 @@ function clear$1(full) { if (full) { - Noty.show(Lang.translate('settings_clear_cache')); + Noty.show(Lang$1.translate('settings_clear_cache')); localStorage.clear(); } else { - Noty.show(Lang.translate('settings_clear_cache_only')); + Noty.show(Lang$1.translate('settings_clear_cache_only')); var need = ['online_view', 'ser_clarifys', 'torrents_view', 'account_bookmarks', 'recomends_list', 'file_view', 'timetable', 'search_history', 'recomends_scan']; var more = ['online_', 'file_view_', 'storage_']; @@ -36482,8 +40898,8 @@ var Storage = { listener: listener, - init: init$m, - get: get, + init: init$q, + get: get$1, set: set, field: field, cache: cache, @@ -36903,6 +41319,7 @@ title_actress: 'Актриса', title_person: 'Персона', title_persons: 'Персоны', + title_person_about: 'О персоне', title_comments: 'Комментарии', title_torrents: 'Торренты', title_trailers: 'Трейлеры', @@ -36990,6 +41407,10 @@ title_top_100: 'Топ 100', title_ai_assistant: 'AI-ассистент', title_facts: 'Интересные факты', + title_anons: 'Анонс', + title_developer: 'Разработчик', + title_navigation: 'Навигация', + title_page: 'Страница', reactions_none: 'Нет реакций', reactions_fire: 'Супер', reactions_nice: 'Неплохо', @@ -37000,6 +41421,7 @@ subscribe_success: 'Вы успешно подписались', subscribe_error: 'Возникла ошибка при подписке, попробуйте позже', subscribe_noinfo: 'Не удалось получить информацию, попробуйте позже', + subscribe_info: 'В разделе (Подписки) у вас будут отображаться все ваши подписки на переводы. Когда выйдет новая серия с выбранным переводом, вы получите уведомление.', company_headquarters: 'Штаб', company_homepage: 'Сайт', company_country: 'Страна', @@ -37276,6 +41698,14 @@ empty_text: 'По вашему фильтру ничего не нашлось, уточните фильтр.', empty_title_two: 'Здесь пусто', empty_text_two: 'На данный момент список пустой', + empty_subscribes_title: 'Ваши подписки на переводы', + empty_subscribes_text: 'Просто подпишитесь на любимый перевод и мы будем уведомлять вас о выходе новой серии.', + empty_history_title: 'Ваша история просмотров', + empty_history_text: 'Здесь будет отображаться ваша история просмотров.', + empty_bookmark_title: 'Ваше избранное', + empty_bookmark_text: 'Добавляйте в избранное понравившиеся фильмы и сериалы, чтобы быстро находить их в этом разделе.', + empty_mytorrents_title: 'Ваши торренты', + empty_mytorrents_text: 'Здесь будут отображаться загруженные вами торренты через TorServer.', back_to_card: 'Вернуться в карточку', menu_main: 'Главная', menu_movies: 'Фильмы', @@ -37360,6 +41790,7 @@ settings_param_card_view_all: 'Показать все', settings_param_navigation_remote: 'Пульт', settings_param_navigation_mouse: 'Пульт с мышкой', + settings_param_navigation_touch: 'Сенсор', settings_param_keyboard_lampa: 'Встроенная', settings_param_keyboard_system: 'Системная', settings_param_card_interface_old: 'Старый', @@ -37433,6 +41864,14 @@ player_normalization_type_down: 'Только понижение', player_youtube_no_played: 'К сожалению, это видео не доступно в вашем регионе, возможно, оно было заблокировано или удалено.', player_youtube_start_play: 'Для начала проигрывания видео, нажмите кнопку "Плей"', + player_segments_title: 'Сегменты', + player_segments_descr: 'Пропуск интро и другие части видео', + player_segments_ad_title: 'Рекламные вставки', + player_segments_skip_title: 'Интро и другое', + player_segments_value_none: 'Не пропускать', + player_segments_value_auto: 'Автопропуск', + player_segments_value_user: 'Пользовательский', + player_segments_skiped: 'Cегмент пропущен', broadcast_open: 'Открыть карточку на другом устройстве', broadcast_play: 'Выберите устройство для просмотра', card_new_episode: 'Новая серия', @@ -37481,7 +41920,7 @@ account_imported: 'импортировано', account_reload_after: 'перезагрузка через 5 сек.', account_create: 'Откройте больше возможностей с аккаунтом CUB. Зарегистрируйтесь на сайте и получите доступ к синхронизации ваших закладок, тайм-кодов и других возможностей аккаунта CUB.', - account_premium: 'Раскройте новые горизонты с аккаунтом CUB Premium! Наслаждайтесь увеличенными лимитами и обогащенным функционалом сервиса. Дополнительные возможности ждут вас уже сегодня!', + account_premium: 'Раскройте новые горизонты с аккаунтом CUB Premium! Наслаждайтесь увеличенными лимитами и обогащенным функционалом сервиса. Перейдите на сайт и узнайте больше о преимуществах премиум аккаунта.', account_premium_more: 'Подробнее о CUB Premium', account_limited: 'Вы достигли максимального лимита. Увеличьте лимит с аккаунтом CUB Premium. Подробнее на сайте ', account_premium_include_1: 'Увеличение количество закладок', @@ -37501,6 +41940,21 @@ account_code_wrong: 'Возможно, вы указали неверный формат', account_code_where: 'Перейдите на сайт и введите указанный там код.', account_code_input: 'Ввести код', + account_qr_premium: 'Отсканируйте QR-код, чтобы узнать больше о CUB Premium', + account_qr_code: 'Отсканируйте QR-код для получения кода добавления устройства', + account_qr_create: 'Отсканируйте QR-код, чтобы создать аккаунт', + account_add_device_title: 'Добавить устройство', + account_add_device_text: 'Перейдите на сайт по ссылки чтобы получить код для добавления устройства.', + account_none_title: 'Еще нет аккаунта?', + account_none_include_1: 'Закладки и история просмотров сохраняются в облаке', + account_none_include_2: 'Синхронизация между устройствами', + account_none_include_3: 'Уведомления о новых сериях и релизах', + account_none_include_4: 'Создание нескольких профилей на одном аккаунте', + account_discuss_add_qr: 'Отсканируйте QR-код', + account_discuss_add_title: 'Хотите оставить комментарий?', + account_discuss_add_text: 'Отсканируйте QR-код, чтобы перейти в приложение и добавить комментарий к этому фильму или сериалу.

- Возьмите телефон или планшет
- Откройте камеру
- Наведите на QR-код
- Перейдите по ссылки, которая появится на экране', + account_discuss_added: 'Спасибо за ваш комментарий!', + account_discuss_added_ready: 'Вы уже оставили комментарий к этому фильму или сериалу.', network_noconnect: 'Нет подключения к сети', network_404: 'Запрошенная страница не найдена. [404]', network_401: 'Авторизация не удалась', @@ -37644,7 +42098,7 @@ discuss_rules_rule_4: 'Избегайте непонятных символов !?#%', discuss_rules_rule_5: 'Пишите полные предложения, используйте предложение из 5 и более слов.', discuss_rules_rule_6: 'Не используйте слишком длинные слова.', - discuss_rules_rule_7: 'Постарайтесь уместится в 300 символов.', + discuss_rules_rule_7: 'Постарайтесь уместиться в 300 символов.', discuss_voited: 'Спасибо за вашу оценку! Ваш голос помогает улучшать контент.', confirm_open_player: 'Другое устройство запрашивает доступ к плееру. Хотите воспроизвести видео?', pincode_use_remote: 'Используйте пульт для ввода кода, нажимая стрелки для выбора нужной цифры.', @@ -37675,7 +42129,18 @@ terminal_deny: 'Запретить', terminal_update: 'Обновить', terminal_code: 'Код доступа', - terminal_text: 'Вы запрашиваете доступ к терминалу. Разработчики могут получить доступ к вашему устройству и управлять им. Это может быть полезно для диагностики и устранения проблем, но также может представлять риск безопасности. Пожалуйста, убедитесь, что вы доверяете разработчикам, прежде чем предоставлять доступ.

Вы можете в любой момент отключить эту функцию нажав на кнопку "Запретить".' + terminal_text: 'Вы запрашиваете доступ к терминалу. Разработчики могут получить доступ к вашему устройству и управлять им. Это может быть полезно для диагностики и устранения проблем, но также может представлять риск безопасности. Пожалуйста, убедитесь, что вы доверяете разработчикам, прежде чем предоставлять доступ.

Вы можете в любой момент отключить эту функцию нажав на кнопку "Запретить".', + developer_param_enabled: 'Режим разработчика', + developer_param_nopremium: 'Отключить CUB Premium', + developer_param_nodemo: 'Отключить демонстрационный режим', + developer_param_ads: 'Показывать рекламу', + developer_param_fps: 'Показывать FPS', + developer_trigger_help_1: 'Почти догадались :)', + developer_trigger_help_2: 'Еще немного :)', + developer_trigger_help_3: 'Точно хочешь войти в режим разработчика?', + developer_trigger_help_4: 'Режим разработчика активирован', + remote_helper_long: 'Удерживайте кнопку (ОК) для вызова меню', + no_watch_history: 'Нет истории просмотра' }; var en = { @@ -38485,7 +42950,6 @@ account_imported: 'imported', account_reload_after: 'reboot after 5 sec.', account_create: 'Discover more opportunities with a CUB account. Register at and get access to sync your bookmarks, timecodes and other CUB account features.', - account_premium: 'Discover more features with a CUB Premium account. Increasing limits and access to additional features of the service.', account_premium_more: 'Learn more about CUB Premium', account_limited: 'You have reached the maximum limit. Increase the limit with a CUB Premium account. Learn more at ', account_code_enter: 'Enter a six-digit code', @@ -38775,7 +43239,61 @@ terminal_deny: 'Deny', terminal_update: 'Update', terminal_code: 'Access code', - terminal_text: 'You are requesting access to the terminal. Developers may gain access to your device and control it. This can be useful for diagnostics and troubleshooting, but may also pose a security risk. Please make sure you trust the developers before granting access.

You can disable this feature at any time by clicking the "Deny" button.' + terminal_text: 'You are requesting access to the terminal. Developers may gain access to your device and control it. This can be useful for diagnostics and troubleshooting, but may also pose a security risk. Please make sure you trust the developers before granting access.

You can disable this feature at any time by clicking the "Deny" button.', + title_anons: 'Announcement', + title_developer: 'Developer', + title_navigation: 'Navigation', + title_page: 'Page', + title_person_about: 'About', + account_qr_premium: 'Scan the QR code to learn more about CUB Premium', + account_qr_code: 'Scan the QR code to receive a device linking code', + account_qr_create: 'Scan the QR code to create an account', + account_add_device_title: 'Add Device', + account_add_device_text: 'Go to to get a code for adding a device.', + account_none_title: 'Don’t have an account yet?', + account_none_include_1: 'Bookmarks and watch history are stored in the cloud', + account_none_include_2: 'Sync between devices', + account_none_include_3: 'Notifications about new episodes and releases', + account_none_include_4: 'Create multiple profiles under one account', + account_premium_include_1: 'Increased number of bookmarks', + account_premium_include_2: 'Extended watch history', + account_premium_include_3: 'More timecodes available', + account_premium_include_4: 'Number of profiles per account', + empty_subscribes_title: 'Your translation subscriptions', + empty_subscribes_text: 'Just subscribe to your favorite translation and we’ll notify you when a new episode is released.', + empty_history_title: 'Your watch history', + empty_history_text: 'Your watch history will appear here.', + empty_bookmark_title: 'Your favorites', + empty_bookmark_text: 'Add movies and TV shows you like to favorites to quickly find them in this section.', + empty_mytorrents_title: 'Your torrents', + empty_mytorrents_text: 'Torrents you’ve downloaded via TorServer will appear here.', + developer_param_enabled: 'Developer Mode', + developer_param_nopremium: 'Disable CUB Premium', + developer_param_nodemo: 'Disable Demo Mode', + developer_param_ads: 'Show Ads', + developer_param_fps: 'Show FPS', + developer_trigger_help_1: 'Almost guessed it :)', + developer_trigger_help_2: 'Just a little more :)', + developer_trigger_help_3: 'Are you sure you want to enter Developer Mode?', + developer_trigger_help_4: 'Developer Mode activated', + settings_param_navigation_touch: 'Sensor', + account_discuss_add_qr: 'Scan the QR code', + account_discuss_add_title: 'Want to leave a comment?', + account_discuss_add_text: 'Scan the QR code to go to the app and add a comment on this movie or TV series.

- Take your phone or tablet
- Open the camera
- Point to the QR code
- Follow the link that appears on the screen', + account_discuss_added: 'Thank you for your comment!', + account_discuss_added_ready: 'You have already left a comment on this movie or TV series.', + remote_helper_long: 'Hold the (OK) button to open the menu', + account_premium: 'Unlock new horizons with a CUB Premium account! Enjoy increased limits and enhanced service functionality. Visit and learn more about the benefits of a premium account.', + player_segments_title: 'Segments', + player_segments_descr: 'Skip intro and other parts of the video', + player_segments_ad_title: 'Ads', + player_segments_skip_title: 'Intro and other', + player_segments_value_none: 'Do not skip', + player_segments_value_auto: 'Auto skip', + player_segments_value_user: 'Custom', + player_segments_skiped: 'Segment skipped', + subscribe_info: 'In the Subscriptions section, you\'ll see all your translation subscriptions. You\'ll receive a notification when a new episode with your selected translation is released.', + no_watch_history: 'No browsing history' }; var langs = {}; @@ -38821,7 +43339,7 @@ } result = result.replace(/{site}/g, object$2.cub_site); - result = result.replace(/{mirror}/g, Utils$2.protocol() + object$2.cub_domain); + result = result.replace(/{mirror}/g, Utils$1.protocol() + object$2.cub_domain); return result; } /** @@ -38875,1266 +43393,103 @@ return Arrays.clone(keys); } - function selected$1(check_codes) { + function selected(check_codes) { return check_codes.indexOf(Storage.get('language', 'ru')) >= 0 ? true : false; } - var Lang = { + var Lang$1 = { translate: translate, add: add$1, codes: codes, addCodes: addCodes, AddTranslation: AddTranslation, - selected: selected$1 + selected: selected }; - var data = {}; - data.type = { - title: '#{title_type}', - items: [{ - title: '#{menu_movies}', - selected: true, - cat: 'movie' - }, { - title: '#{menu_multmovie}', - cat: 'multmovie' - }, { - title: '#{menu_tv}', - cat: 'tv' - }, { - title: '#{menu_multtv}', - cat: 'multtv' - }, { - title: '#{menu_anime}', - cat: 'anime' - }] - }; - data.rating = { - title: '#{title_rating}', - items: [{ - title: '#{filter_any}' - }, { - title: '#{filter_rating_from} 8', - start: 8 - }, { - title: '#{filter_rating_from} 6', - start: 6 - }, { - title: '#{filter_rating_from} 4', - start: 4 - }, { - title: '#{filter_rating_from} 2', - start: 2 - }, { - title: '#{filter_rating_from} 1 #{filter_rating_to} 3', - voite: '1-3' - }, { - title: '#{filter_rating_from} 3 #{filter_rating_to} 6', - voite: '3-6' - }, { - title: '#{filter_rating_from} 6 #{filter_rating_to} 8', - voite: '6-8' - }, { - title: '#{filter_rating_from} 8 #{filter_rating_to} 9', - voite: '8-9' - }] - }; - data.pgrating = { - title: '#{title_pgrating}', - items: [{ - title: '#{filter_any}' - }] - }; - data.language = { - title: '#{title_language}', - items: [{ - title: '#{filter_lang_ru}', - code: 'ru' - }, { - title: '#{filter_lang_uk}', - code: 'uk' - }, { - title: '#{filter_lang_en}', - code: 'en' - }, { - title: '#{filter_lang_be}', - code: 'be' - }, { - title: '#{filter_lang_zh}', - code: 'zh|cn' - }, { - title: '#{filter_lang_ja}', - code: 'ja' - }, { - title: '#{filter_lang_ko}', - code: 'ko' - }, { - title: '#{filter_lang_af}', - code: 'af' - }, { - title: '#{filter_lang_sq}', - code: 'sq' - }, { - title: '#{filter_lang_ar}', - code: 'ar' - }, { - title: '#{filter_lang_az}', - code: 'az' - }, { - title: '#{filter_lang_hy}', - code: 'hy' - }, { - title: '#{filter_lang_ba}', - code: 'ba' - }, { - title: '#{filter_lang_bg}', - code: 'bg' - }, { - title: '#{filter_lang_bn}', - code: 'bn' - }, { - title: '#{filter_lang_bs}', - code: 'bs' - }, { - title: '#{filter_lang_ca}', - code: 'ca' - }, { - title: '#{filter_lang_ce}', - code: 'ce' - }, { - title: '#{filter_lang_cs}', - code: 'cs' - }, { - title: '#{filter_lang_da}', - code: 'da' - }, { - title: '#{filter_lang_ka}', - code: 'ka' - }, { - title: '#{filter_lang_de}', - code: 'de' - }, { - title: '#{filter_lang_el}', - code: 'el' - }, { - title: '#{filter_lang_es}', - code: 'es' - }, { - title: '#{filter_lang_et}', - code: 'et' - }, { - title: '#{filter_lang_fa}', - code: 'fa' - }, { - title: '#{filter_lang_fi}', - code: 'fi' - }, { - title: '#{filter_lang_fr}', - code: 'fr' - }, { - title: '#{filter_lang_ga}', - code: 'ga' - }, { - title: '#{filter_lang_gl}', - code: 'gl' - }, { - title: '#{filter_lang_gn}', - code: 'gn' - }, { - title: '#{filter_lang_he}', - code: 'he' - }, { - title: '#{filter_lang_hi}', - code: 'hi' - }, { - title: '#{filter_lang_hr}', - code: 'hr' - }, { - title: '#{filter_lang_hu}', - code: 'hu' - }, { - title: '#{filter_lang_id}', - code: 'id' - }, { - title: '#{filter_lang_is}', - code: 'is' - }, { - title: '#{filter_lang_it}', - code: 'it' - }, { - title: '#{filter_lang_kk}', - code: 'kk' - }, { - title: '#{filter_lang_ks}', - code: 'ks' - }, { - title: '#{filter_lang_ku}', - code: 'ku' - }, { - title: '#{filter_lang_ky}', - code: 'ky' - }, { - title: '#{filter_lang_lt}', - code: 'lt' - }, { - title: '#{filter_lang_lv}', - code: 'lv' - }, { - title: '#{filter_lang_mi}', - code: 'mi' - }, { - title: '#{filter_lang_mk}', - code: 'mk' - }, { - title: '#{filter_lang_mn}', - code: 'mn' - }, { - title: '#{filter_lang_mo}', - code: 'mo' - }, { - title: '#{filter_lang_mt}', - code: 'mt' - }, { - title: '#{filter_lang_no}', - code: 'no|nb|nn' - }, { - title: '#{filter_lang_ne}', - code: 'ne' - }, { - title: '#{filter_lang_nl}', - code: 'nl' - }, { - title: '#{filter_lang_pa}', - code: 'pa' - }, { - title: '#{filter_lang_pl}', - code: 'pl' - }, { - title: '#{filter_lang_ps}', - code: 'ps' - }, { - title: '#{filter_lang_pt}', - code: 'pt' - }, { - title: '#{filter_lang_ro}', - code: 'ro' - }, { - title: '#{filter_lang_si}', - code: 'si' - }, { - title: '#{filter_lang_sk}', - code: 'sk' - }, { - title: '#{filter_lang_sl}', - code: 'sl' - }, { - title: '#{filter_lang_sm}', - code: 'sm' - }, { - title: '#{filter_lang_so}', - code: 'so' - }, { - title: '#{filter_lang_sr}', - code: 'sr' - }, { - title: '#{filter_lang_sv}', - code: 'sv' - }, { - title: '#{filter_lang_sw}', - code: 'sw' - }, { - title: '#{filter_lang_ta}', - code: 'ta' - }, { - title: '#{filter_lang_tg}', - code: 'tg' - }, { - title: '#{filter_lang_th}', - code: 'th' - }, { - title: '#{filter_lang_tk}', - code: 'tk' - }, { - title: '#{filter_lang_tr}', - code: 'tr' - }, { - title: '#{filter_lang_tt}', - code: 'tt' - }, { - title: '#{filter_lang_ur}', - code: 'ur' - }, { - title: '#{filter_lang_uz}', - code: 'uz' - }, { - title: '#{filter_lang_vi}', - code: 'vi' - }, { - title: '#{filter_lang_yi}', - code: 'yi' - }] - }; - data.genres_movie = { - title: '#{title_genre}', - items: [{ - "id": 28, - "title": "#{filter_genre_ac}", - checkbox: true - }, { - "id": 12, - "title": "#{filter_genre_ad}", - checkbox: true - }, { - "id": 16, - "title": "#{filter_genre_mv}", - checkbox: true - }, { - "id": 35, - "title": "#{filter_genre_cm}", - checkbox: true - }, { - "id": 80, - "title": "#{filter_genre_cr}", - checkbox: true - }, { - "id": 99, - "title": "#{filter_genre_dc}", - checkbox: true - }, { - "id": 18, - "title": "#{filter_genre_dr}", - checkbox: true - }, { - "id": 10751, - "title": "#{filter_genre_fm}", - checkbox: true - }, { - "id": 14, - "title": "#{filter_genre_fe}", - checkbox: true - }, { - "id": 36, - "title": "#{filter_genre_hi}", - checkbox: true - }, { - "id": 27, - "title": "#{filter_genre_ho}", - checkbox: true - }, { - "id": 10402, - "title": "#{filter_genre_mu}", - checkbox: true - }, { - "id": 9648, - "title": "#{filter_genre_de}", - checkbox: true - }, { - "id": 10749, - "title": "#{filter_genre_md}", - checkbox: true - }, { - "id": 878, - "title": "#{filter_genre_fa}", - checkbox: true - }, { - "id": 10770, - "title": "#{filter_genre_tv}", - checkbox: true - }, { - "id": 53, - "title": "#{filter_genre_tr}", - checkbox: true - }, { - "id": 10752, - "title": "#{filter_genre_mi}", - checkbox: true - }, { - "id": 37, - "title": "#{filter_genre_ve}", - checkbox: true - }] - }; - data.genres_tv = { - title: '#{title_genre}', - items: [{ - "id": 10759, - "title": "#{filter_genre_aa}", - checkbox: true - }, { - "id": 16, - "title": "#{filter_genre_mv}", - checkbox: true - }, { - "id": 35, - "title": "#{filter_genre_cm}", - checkbox: true - }, { - "id": 80, - "title": "#{filter_genre_cr}", - checkbox: true - }, { - "id": 99, - "title": "#{filter_genre_dc}", - checkbox: true - }, { - "id": 18, - "title": "#{filter_genre_dr}", - checkbox: true - }, { - "id": 10751, - "title": "#{filter_genre_fm}", - checkbox: true - }, { - "id": 10762, - "title": "#{filter_genre_ch}", - checkbox: true - }, { - "id": 9648, - "title": "#{filter_genre_de}", - checkbox: true - }, { - "id": 10763, - "title": "#{filter_genre_nw}", - checkbox: true - }, { - "id": 10764, - "title": "#{filter_genre_rs}", - checkbox: true - }, { - "id": 10765, - "title": "#{filter_genre_hf}", - checkbox: true - }, { - "id": 10766, - "title": "#{filter_genre_op}", - checkbox: true - }, { - "id": 10767, - "title": "#{filter_genre_tc}", - checkbox: true - }, { - "id": 10768, - "title": "#{filter_genre_mp}", - checkbox: true - }, { - "id": 37, - "title": "#{filter_genre_ve}", - checkbox: true - }] - }; - data.sort = { - title: '#{filter_sorted}', - items: [{ - title: '#{filter_any}' - }, { - title: '#{title_new}', - sort: 'now' - }, { - title: '#{title_now_watch}', - sort: 'now_playing' - }, { - title: '#{title_in_top}', - sort: 'top' - }, { - title: '#{title_ongoing}', - sort: 'airing' - }] - }; - data.quality = { - title: '#{player_quality}', - items: [{ - title: '#{filter_any}' - }, { - title: '#{title_in_high_quality}', - uhd: true - }] - }; - data.year = { - title: '#{title_year}', - items: [{ - title: '#{filter_any}', - any: true - }] - }; - var i = 100, - y = new Date().getFullYear(); - - for (var a = 0; a < 5; a++) { - data.year.items.push({ - title: y - a - }); - } - - while (i -= 5) { - var end = y - (99 - i); - data.year.items.push({ - title: end + 5 + '-' + end - }); - } - - for (var _a = 18; _a >= 0; _a -= 3) { - data.pgrating.items.push({ - title: _a + '+', - pg: _a - }); - } - - for (var _a2 = 15; _a2 >= 0; _a2 -= 3) { - data.pgrating.items.push({ - title: '#{filter_rating_from} ' + _a2 + ' #{filter_rating_to} ' + (_a2 + 3), - pg: _a2 + '-' + (_a2 + 3) - }); - } - - data.language.items.forEach(function (i) { - return i.checkbox = true; - }); - - function select(where, a) { - where.forEach(function (element) { - element.selected = false; - }); - a.selected = true; - } - - function selected(where) { - var title = []; - where.items.forEach(function (a) { - if (a.selected || a.checked) title.push(a.title); - }); - where.subtitle = title.length ? title.join(', ') : Lang.translate('nochoice'); - } - - function main() { - for (var i in data) { - selected(data[i]); - } - - var cat = data.type.items.find(function (s) { - return s.selected; - }).cat; - var type = cat.indexOf('movie') >= 0 ? 'movie' : 'tv'; - var items = [{ - title: Lang.translate('search_start'), - search: true - }, data.type, data.rating, data['genres_' + type], data.language, data.year]; - if (Storage.field('source') == 'cub') items.push(data.pgrating, data.sort, data.quality); - items.forEach(function (itm) { - itm.title = Lang.translate(itm.title); - if (itm.subtitle) itm.subtitle = Lang.translate(itm.subtitle); - - if (itm.items) { - itm.items.forEach(function (inr) { - inr.title = Lang.translate(inr.title); - }); - } - }); - Select.show({ - title: Lang.translate('title_filter'), - items: items, - onBack: function onBack() { - Controller.toggle('content'); - }, - onSelect: function onSelect(a) { - if (a.search) search();else submenu(a); - } - }); - } - - function queryForTMDB() { - var query = []; - var cat = data.type.items.find(function (s) { - return s.selected; - }).cat; - var type = cat.indexOf('movie') >= 0 ? 'movie' : 'tv'; - var genres = []; - var languages = []; - data.rating.items.forEach(function (a) { - if (a.selected && (a.voite || a.start)) { - if (a.start) { - query.push('vote_average.gte=' + a.start); - } else { - query.push('vote_average.gte=' + a.voite.split('-')[0]); - query.push('vote_average.lte=' + a.voite.split('-')[1]); - } - } - }); - data.language.items.forEach(function (a) { - if (a.checked) languages.push(a.code); - }); - data.year.items.forEach(function (a) { - if (a.selected && !a.any) { - var need = type == 'movie' ? 'primary_release_date' : 'first_air_date'; - - if (a.title.indexOf('-') >= 0) { - query.push(need + '.lte=' + a.title.split('-')[0] + '-12-31'); - query.push(need + '.gte=' + a.title.split('-')[1] + '-01-01'); - } else { - query.push((type == 'movie' ? 'primary_release_year' : 'first_air_date_year') + '=' + a.title); - } - } - }); - data['genres_' + type].items.forEach(function (a) { - if (a.checked) genres.push(a.id); - }); - if (cat == 'multmovie' || cat == 'multtv' && genres.indexOf(16) == -1) genres.push(16); - if (cat == 'movie' || cat == 'tv') query.push('without_genres=16'); - - if (genres.length) { - query.push('with_genres=' + genres.join(',')); - } - - if (cat == 'anime' && languages.indexOf('ja') == -1) languages.push('ja'); - - if (languages.length) { - query.push('with_original_language=' + languages.join('|')); - } - - return 'discover/' + type + '?' + query.join('&'); - } - - function queryForCUB() { - var query = []; - var cat = data.type.items.find(function (s) { - return s.selected; - }).cat; - var type = cat.indexOf('movie') >= 0 ? 'movie' : 'tv'; - var genres = []; - var sort = data.sort.items.find(function (s) { - return s.selected && s.sort; - }); - var quality = data.quality.items.find(function (s) { - return s.selected && s.uhd; - }); - var languages = []; - data.rating.items.forEach(function (a) { - if (a.selected && (a.voite || a.start)) { - if (a.start) { - query.push('vote=' + a.start); - } else { - query.push('vote=' + a.voite.split('-')[0] + '-' + a.voite.split('-')[1]); - } - } - }); - data.language.items.forEach(function (a) { - if (a.checked) languages.push(a.code.split('|')[0]); - }); - data.year.items.forEach(function (a) { - if (a.selected && !a.any) { - if (a.title.indexOf('-') >= 0) { - query.push('airdate=' + a.title.split('-')[1] + '-' + a.title.split('-')[0]); - } else { - query.push('airdate=' + a.title); - } - } - }); - data.pgrating.items.forEach(function (a) { - if (a.selected) { - if (a.title.indexOf('-') >= 0) { - query.push('pgrating=' + a.pg.split('-')[0] + '-' + a.pg.split('-')[1]); - } else { - query.push('pgrating=' + a.pg); - } - } - }); - data['genres_' + type].items.forEach(function (a) { - if (a.checked) genres.push(a.id); - }); - if (cat == 'multmovie' || cat == 'multtv' && genres.indexOf(16) == -1) genres.push(16); - if (cat == 'movie' || cat == 'tv') query.push('without_genres=16'); - - if (genres.length) { - query.push('genre=' + genres.join(',')); - } - - if (cat == 'anime') type = 'anime'; - - if (languages.length) { - query.push('language=' + languages.join(',')); - } - - if (sort) query.push('sort=' + sort.sort); - if (quality) query.push('uhd=true'); - return '?cat=' + type + '&' + query.join('&'); - } - - function search() { - Controller.toggle('content'); - var source = Storage.field('source'); - var query = source == 'cub' ? queryForCUB() : queryForTMDB(); - var activity = { - url: query, - title: Lang.translate('title_filter'), - component: 'category_full', - source: source == 'cub' ? 'cub' : 'tmdb', - card_type: true, - page: 1 - }; - var object = Activity$1.active(); - if (object.component == 'category_full' && (object.url.indexOf('discover') == 0 || object.url.indexOf('?cat=') == 0)) Activity$1.replace(activity, true);else Activity$1.push(activity); - } - - function submenu(item) { - Select.show({ - title: item.title, - items: item.items, - onBack: main, - onSelect: function onSelect(a) { - select(item.items, a); - main(); - } - }); - } - - function show$2() { - main(); - } - - var Filter = { - show: show$2 - }; - - var html$4; - var last; - var scroll; - var edit_mode; - var sort_item; - var sort_timer; - var visible_timer; - - function init$l() { - html$4 = Template.get('menu'); - scroll = new create$f({ - mask: true, - over: true - }); - if (!window.lampa_settings.torrents_use) html$4.find('[data-action="mytorrents"]').remove(); - if (window.lampa_settings.disable_features.persons) html$4.find('[data-action="myperson"]').remove(); - if (window.lampa_settings.disable_features.subscribe) html$4.find('[data-action="subscribes"]').remove(); - - if (!Lang.selected(['ru', 'uk', 'be'])) { - html$4.find('[data-action="relise"],[data-action="anime"],[data-action="feed"]').remove(); - } - - if (!window.lampa_settings.feed) html$4.find('[data-action="feed"]').remove(); - Lampa.Listener.send('menu', { - type: 'start', - body: html$4 - }); - updateSort(); - observe(); - controller(); - $('body').on('mouseup', function (e) { - if ($('body').hasClass('menu--open') && DeviceInput.canClick(e.originalEvent)) { - $('body').toggleClass('menu--open', false); - disableEditMode(); - Controller.toggle('content'); - } - }); - scroll.minus(); - scroll.append(html$4); - Lampa.Listener.send('menu', { - type: 'end' - }); - Lampa.Listener.follow('app', function (e) { - if (e.type == 'ready') ready(); - }); - } - - function observe() { - if (typeof MutationObserver == 'undefined') return; - var observer = new MutationObserver(function (mutations) { - for (var i = 0; i < mutations.length; i++) { - var mutation = mutations[i]; - - if (mutation.type == 'childList' && !mutation.removedNodes.length) { - var selectors = Array.from(mutation.target.querySelectorAll('.selector')).filter(function (s) { - return !s.checked; - }); - if (selectors.length) updateSort(); - selectors.forEach(function (s) { - s.checked = true; - - if (!$(s).data('binded_events')) { - $(s).on('hover:focus', function (e) { - last = e.target; - scroll.update($(e.target), true); - }).on('hover:hover hover:touch', function (e) { - last = e.target; - }); - } - }); - } - } - }); - observer.observe(html$4[0], { - childList: true, - subtree: true - }); - } - - function controller() { - Controller.add('menu', { - toggle: function toggle() { - Controller.collectionSet(html$4); - Controller.collectionFocus(last, html$4, true); - clearTimeout(visible_timer); - $('.wrap__left').removeClass('wrap__left--hidden'); - $('body').toggleClass('menu--open', true); - }, - update: function update() {}, - right: function right() { - if (edit_mode) { - if (sort_item) { - sort_item.removeClass('traverse'); - sort_item = false; - } else disableEditMode(); - } else Controller.toggle('content'); - }, - up: function up() { - if (sort_item) { - sort_item.prev().insertAfter(sort_item); - scroll.update(sort_item, true); - saveSort(); - } else if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); - }, - left: function left() { - if (edit_mode) { - if (!sort_item) { - sort_item = $(last); - sort_item.addClass('traverse'); - } else { - sort_item.removeClass('traverse'); - sort_item = false; - var name = $(last).text().trim(); - var hide = Storage.get('menu_hide', '[]'); - - if (hide.indexOf(name) == -1) { - if ($('.menu__list:eq(0) .menu__item:not(.hidden)', html$4).length > 3) hide.push(name); - } else hide.splice(hide.indexOf(name), 1); - - Storage.set('menu_hide', hide); - hideItems(); - } - } - }, - down: function down() { - if (sort_item) { - sort_item.next().insertBefore(sort_item); - scroll.update(sort_item, true); - saveSort(); - } else if (Navigator.canmove('down')) Navigator.move('down'); - }, - gone: function gone() { - $('body').toggleClass('menu--open', false); - visible_timer = setTimeout(function () { - $('.wrap__left').addClass('wrap__left--hidden'); - }, 300); - }, - back: function back() { - Activity$1.backward(); - } - }); - } - - function updateSort() { - clearTimeout(sort_timer); - sort_timer = setTimeout(function () { - checkSort(); - bindItems(); - }, 500); - } - - function checkSort() { - var memory = Storage.get('menu_sort', '[]'); - var anon = getSort(); - anon.forEach(function (item) { - if (memory.indexOf(item) == -1) memory.push(item); - }); - Storage.set('menu_sort', memory); - orderSort(); - hideItems(); - } - - function getSort() { - var items = []; - $('.menu__list:eq(0) .menu__item', html$4).each(function () { - items.push($(this).text().trim()); - }); - return items; - } - - function saveSort() { - Storage.set('menu_sort', getSort()); - } - - function orderSort() { - var items = Storage.get('menu_sort', '[]'); - - if (items.length) { - var list = $('.menu__list:eq(0)', html$4); - items.forEach(function (item) { - var el = $('.menu__item:contains("' + item + '")', list); - if (el.length) el.appendTo(list); - }); - } - } - - function hideItems() { - var items = Storage.get('menu_hide', '[]'); - $('.menu__item', html$4).removeClass('hidden'); - - if (items.length) { - var list = $('.menu__list:eq(0)', html$4); - items.forEach(function (item) { - var el = $('.menu__item:contains("' + item + '")', list); - if (el.length) el.addClass('hidden'); - }); - } - } - - function enableEditMode() { - html$4.addClass('editable'); - edit_mode = true; - scroll.update($(last), true); - } - - function disableEditMode() { - html$4.removeClass('editable'); - edit_mode = false; - - if (sort_item) { - sort_item.removeClass('traverse'); - sort_item = false; - } - - if ($(last).hasClass('hidden')) { - var list = $('.menu__list:eq(0)', html$4); - var items = $('.menu__item', list); - var inx = items.index($(last)); - var nohide = items.not('.hidden'); - if (nohide.eq(inx).length) last = nohide.eq(inx)[0];else if (nohide.eq(inx - 1).length) last = nohide.eq(inx - 1)[0];else last = nohide.eq(0)[0]; - Controller.collectionFocus(last, html$4); - scroll.update($(last), true); - } - } - - function bindItems() { - var list = $('.menu__list:eq(0)', html$4); - $('.menu__item', list).not('.binded').each(function () { - var item = $(this); - item.on('hover:long', function () { - if (typeof MutationObserver !== 'undefined') enableEditMode(); - }); - item.addClass('binded'); - }); - } - - function prepared(action, name) { - if (name.indexOf(action) >= 0) { - var comp = Lampa.Activity.active().component; - if (name.indexOf(comp) >= 0) Activity$1.replace();else return true; - } - } - - function ready() { - html$4.find('.selector').data('binded_events', true).on('hover:enter', function (e) { - var action = $(e.target).data('action'); - $(e.target).data('type'); - if (action == 'catalog') catalog(); - - if (action == 'movie' || action == 'tv' || action == 'anime') { - Activity$1.push({ - url: action, - title: (action == 'movie' ? Lang.translate('menu_movies') : action == 'anime' ? Lang.translate('menu_anime') : Lang.translate('menu_tv')) + ' - ' + Storage.field('source').toUpperCase(), - component: 'category', - source: action == 'anime' ? 'cub' : Storage.field('source') - }); - } - - if (prepared(action, ['main'])) { - Activity$1.push({ - url: '', - title: Lang.translate('title_main') + ' - ' + Storage.field('source').toUpperCase(), - component: 'main', - source: Storage.field('source') - }); - } - - if (prepared(action, ['myperson'])) { - Activity$1.push({ - title: Lang.translate('title_persons'), - component: 'myperson' - }); - } - - if (action == 'search') Controller.toggle('search'); - - if (action == 'settings') { - ParentalControl.personal('settings', function () { - Controller.toggle('settings'); - }, false, true); - } - - if (action == 'about') { - var about = Template.get('about'); - - if (window.lampa_settings.white_use) { - about.find('.about__contacts > div:eq(1)').remove(); - } - - if (Platform.is('android')) { - about.find('.platform_android').removeClass('hide'); - about.find('.version_android').text(Platform.version('android')); - } - - about.find('.version_app').text(Platform.version('app')); - Modal.open({ - title: Lang.translate('title_about'), - html: about, - size: 'medium', - onBack: function onBack() { - Modal.close(); - Controller.toggle('content'); - } - }); - } - - if (action == 'favorite') { - ParentalControl.personal('bookmarks', function () { - if (prepared('bookmarks', ['bookmarks'])) { - Activity$1.push({ - url: '', - title: Lang.translate('settings_input_links'), - component: 'bookmarks', - page: 1 - }); - } - }, false, true); - } - - if (action == 'history') { - ParentalControl.personal('bookmarks', function () { - if (prepared('favorite', ['favorite'])) { - Activity$1.push({ - url: '', - title: Lang.translate('title_history'), - component: 'favorite', - type: 'history', - page: 1 - }); - } - }, false, true); - } - - if (action == 'subscribes') { - Activity$1.push({ - url: '', - title: Lang.translate('title_subscribes'), - component: 'subscribes', - page: 1 - }); - } - - if (prepared(action, ['timetable'])) { - Activity$1.push({ - url: '', - title: Lang.translate('title_timetable'), - component: 'timetable', - page: 1 - }); - } - - if (prepared(action, ['feed'])) { - Activity$1.push({ - url: '', - title: Lang.translate('menu_feed'), - component: 'feed', - page: 1 - }); - } - - if (prepared(action, ['mytorrents'])) { - Activity$1.push({ - url: '', - title: Lang.translate('title_mytorrents'), - component: 'mytorrents', - page: 1 - }); - } - - if (prepared(action, ['relise'])) { - Activity$1.push({ - url: '', - title: Lang.translate('title_relises'), - component: 'relise', - page: 1 - }); - } - - if (action == 'console') { - Controller.toggle('console'); - } - - if (action == 'filter') Filter.show(); - }).on('hover:focus', function (e) { - last = e.target; - scroll.update($(e.target), true); - }).on('hover:hover hover:touch', function (e) { - last = e.target; - }); - } - - function catalog() { - Api.menu({ - source: Storage.field('source') - }, function (menu) { - Select.show({ - title: Lang.translate('title_catalog'), - items: menu, - onSelect: function onSelect(a) { - var tmdb = Storage.field('source') == 'tmdb' || Storage.field('source') == 'cub'; - Activity$1.push({ - url: Storage.field('source') == 'tmdb' ? 'movie' : 'movie', - title: (a.title || Lang.translate('title_catalog')) + ' - ' + Storage.field('source').toUpperCase(), - component: tmdb ? 'category' : 'category_full', - genres: a.id, - id: a.id, - source: Storage.field('source'), - card_type: true, - page: 1 - }); - }, - onBack: function onBack() { - Controller.toggle('menu'); - } - }); - }); - } - - function render$2() { - return scroll.render(); - } - - var Menu = { - render: render$2, - init: init$l, - ready: ready - }; - - function render$1() { - var icon = "\n \n \n "; - var text = { - ru: "\u0422\u0440\u0438 \u0433\u043E\u0434\u0430 \u043D\u0430\u0437\u0430\u0434 \u043C\u044B \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 Lampa, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0430\u0440\u0438\u0442\u044C \u0432\u0430\u043C \u043C\u0438\u0440 \u043B\u044E\u0431\u0438\u043C\u044B\u0445 \u0444\u0438\u043B\u044C\u043C\u043E\u0432, \u0441\u0435\u0440\u0438\u0430\u043B\u043E\u0432 \u0438 \u043C\u0443\u043B\u044C\u0442\u0444\u0438\u043B\u044C\u043C\u043E\u0432 \u0432 \u0443\u0434\u043E\u0431\u043D\u043E\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0435. \u0411\u043B\u0430\u0433\u043E\u0434\u0430\u0440\u044F \u0432\u0430\u043C, \u043D\u0430\u0448\u0435\u043C\u0443 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0443, \u043C\u044B \u0441\u0442\u0430\u043B\u0438 \u0431\u043E\u043B\u044C\u0448\u0435, \u043B\u0443\u0447\u0448\u0435 \u0438 \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u0435\u0435! \u0412 \u0447\u0435\u0441\u0442\u044C \u043D\u0430\u0448\u0435\u0433\u043E \u0434\u043D\u044F \u0440\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u043C\u044B \u043F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u0438\u043B\u0438 \u043E\u0441\u043E\u0431\u044B\u0439 \u043F\u043E\u0434\u0430\u0440\u043E\u043A: \u0441\u043A\u0438\u0434\u043A\u0438 \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443 CUB Premium! \u0422\u0435\u043F\u0435\u0440\u044C \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u043D\u0430\u0441\u043B\u0430\u0434\u0438\u0442\u044C\u0441\u044F \u0432\u0441\u0435\u043C\u0438 \u043F\u0440\u0435\u0438\u043C\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043C\u0438 \u043F\u0440\u0435\u043C\u0438\u0443\u043C-\u0444\u0443\u043D\u043A\u0446\u0438\u0439 \u043F\u043E \u0435\u0449\u0451 \u0431\u043E\u043B\u0435\u0435 \u0432\u044B\u0433\u043E\u0434\u043D\u043E\u0439 \u0446\u0435\u043D\u0435.\n

\n \u0410\u043A\u0446\u0438\u044F \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 10 \u0434\u043D\u0435\u0439 \u2014 \u0441 20 \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F \u043F\u043E 30 \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044F! \u041D\u0435 \u0443\u043F\u0443\u0441\u0442\u0438\u0442\u0435 \u0448\u0430\u043D\u0441 \u0441\u0442\u0430\u0442\u044C \u0447\u0430\u0441\u0442\u044C\u044E \u043A\u043B\u0443\u0431\u0430 CUB Premium \u0438 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u043E\u0442 \u0432\u0430\u0448\u0435\u0433\u043E \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F! \u0412\u0441\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u043D\u0430 \u043D\u0430\u0448\u0435\u043C \u0441\u0430\u0439\u0442\u0435 cub.red/premium\n

\n \u0421\u043F\u0430\u0441\u0438\u0431\u043E, \u0447\u0442\u043E \u0432\u044B\u0431\u0438\u0440\u0430\u0435\u0442\u0435 Lampa \u0438 \u043F\u0440\u0430\u0437\u0434\u043D\u0443\u0435\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u043D\u0430\u043C\u0438!", - uk: "\u0422\u0440\u0438 \u0440\u043E\u043A\u0438 \u0442\u043E\u043C\u0443 \u043C\u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u043B\u0438 \u0434\u043E\u0434\u0430\u0442\u043E\u043A Lampa, \u0449\u043E\u0431 \u043F\u043E\u0434\u0430\u0440\u0443\u0432\u0430\u0442\u0438 \u0432\u0430\u043C \u0441\u0432\u0456\u0442 \u0443\u043B\u044E\u0431\u043B\u0435\u043D\u0438\u0445 \u0444\u0456\u043B\u044C\u043C\u0456\u0432, \u0441\u0435\u0440\u0456\u0430\u043B\u0456\u0432 \u0442\u0430 \u043C\u0443\u043B\u044C\u0442\u0444\u0456\u043B\u044C\u043C\u0456\u0432 \u0443 \u0437\u0440\u0443\u0447\u043D\u043E\u043C\u0443 \u0444\u043E\u0440\u043C\u0430\u0442\u0456. \u0417\u0430\u0432\u0434\u044F\u043A\u0438 \u0432\u0430\u043C, \u043D\u0430\u0448\u0456\u0439 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u0456, \u043C\u0438 \u0441\u0442\u0430\u043B\u0438 \u0431\u0456\u043B\u044C\u0448\u0438\u043C\u0438, \u043A\u0440\u0430\u0449\u0438\u043C\u0438 \u0442\u0430 \u0446\u0456\u043A\u0430\u0432\u0456\u0448\u0438\u043C\u0438! \u041D\u0430 \u0447\u0435\u0441\u0442\u044C \u043D\u0430\u0448\u043E\u0433\u043E \u0434\u043D\u044F \u043D\u0430\u0440\u043E\u0434\u0436\u0435\u043D\u043D\u044F \u043C\u0438 \u043F\u0456\u0434\u0433\u043E\u0442\u0443\u0432\u0430\u043B\u0438 \u043E\u0441\u043E\u0431\u043B\u0438\u0432\u0438\u0439 \u043F\u043E\u0434\u0430\u0440\u0443\u043D\u043E\u043A: \u0437\u043D\u0438\u0436\u043A\u0438 \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443 CUB Premium! \u0422\u0435\u043F\u0435\u0440 \u0443 \u0432\u0430\u0441 \u0454 \u043C\u043E\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C \u043D\u0430\u0441\u043E\u043B\u043E\u0434\u0438\u0442\u0438\u0441\u044F \u0432\u0441\u0456\u043C\u0430 \u043F\u0435\u0440\u0435\u0432\u0430\u0433\u0430\u043C\u0438 \u043F\u0440\u0435\u043C\u0456\u0443\u043C-\u0444\u0443\u043D\u043A\u0446\u0456\u0439 \u0437\u0430 \u0449\u0435 \u0431\u0456\u043B\u044C\u0448 \u0432\u0438\u0433\u0456\u0434\u043D\u043E\u044E \u0446\u0456\u043D\u043E\u044E.\n

\n \u0410\u043A\u0446\u0456\u044F \u0434\u0456\u0454 10 \u0434\u043D\u0456\u0432 \u2014 \u0437 20 \u0432\u0435\u0440\u0435\u0441\u043D\u044F \u0434\u043E 30 \u0432\u0435\u0440\u0435\u0441\u043D\u044F! \u041D\u0435 \u0432\u0442\u0440\u0430\u0442\u044C\u0442\u0435 \u0448\u0430\u043D\u0441 \u0441\u0442\u0430\u0442\u0438 \u0447\u0430\u0441\u0442\u0438\u043D\u043E\u044E \u043A\u043B\u0443\u0431\u0443 CUB Premium \u0442\u0430 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0432\u0456\u0434 \u0432\u0430\u0448\u043E\u0433\u043E \u0434\u043E\u0434\u0430\u0442\u043A\u0430! \u0423\u0441\u0456 \u0434\u0435\u0442\u0430\u043B\u0456 \u043D\u0430 \u043D\u0430\u0448\u043E\u043C\u0443 \u0441\u0430\u0439\u0442\u0456 cub.red/premium.\n

\n \u0414\u044F\u043A\u0443\u0454\u043C\u043E, \u0449\u043E \u043E\u0431\u0438\u0440\u0430\u0454\u0442\u0435 Lampa \u0456 \u0441\u0432\u044F\u0442\u043A\u0443\u0454\u0442\u0435 \u0440\u0430\u0437\u043E\u043C \u0437 \u043D\u0430\u043C\u0438!" - }; - var html = $("\n
\n
\n \n
\n\n
".concat(text[Storage.get('language', 'ru')], "
\n
")); - var btn = $(''); - btn.on('hover:enter', function () { - Modal.open({ - title: '', - size: 'medium', - html: html, - mask: false, - onBack: function onBack() { - Modal.close(); - Controller.toggle('head'); - } - }); - Utils$2.imgLoad(html.find('img')[0], 'https://cdn.cub.red/img/other/birthday_3_years.jpg', function () { - html.addClass('loaded'); - }, function () { - html.addClass('noload'); - }); - }); - btn.append(icon); - $('.head .head__actions .open--settings').after(btn); - } - - function start$2() { - var date_start = '2024-09-20T10:00:00'; - var date_end = '2024-09-30T22:00:00'; - var time_start = new Date(date_start).getTime(); - var time_end = new Date(date_end).getTime(); - var time_now = new Date().getTime(); - if (time_now > time_start && time_now < time_end && Lang.selected(['ru', 'uk'])) render$1(); - } - - var Birthday = { - start: start$2 - }; + /** + * Инициализирует основное приложение + * @returns {void} + */ function app() { var app = $('#app').empty(); var wrap = Template.get('wrap'); - wrap.find('.wrap__left').append(Menu.render()); - wrap.find('.wrap__content').append(Activity$1.render()); + app.append(Template.get('icons_sprite')); + wrap.find('.wrap__left').append(Menu$1.render()); + wrap.find('.wrap__content').append(Activity.render()); app.append(Background.render()); app.append(Head.render()); app.append(wrap); app.append(Settings.render()); app.append(Search.render()); - Birthday.start(); } var Render = { app: app }; - var html$3; + var html$7; var object; - function init$k() { - html$3 = Template.get('iframe'); + function init$p() { + html$7 = Template.get('iframe'); } - function show$1() { + function show$2() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; object = params; - html$3.find('iframe').attr('src', params.url)[0].onload = function () { - html$3.addClass('iframe--loaded'); + html$7.find('iframe').attr('src', params.url)[0].onload = function () { + html$7.addClass('iframe--loaded'); }; - $('body').append(html$3); + $('body').append(html$7); toggle$1(); } function toggle$1() { Controller.add('iframe', { toggle: function toggle() {}, - back: close$1 + back: close$2 }); Controller.toggle('iframe'); } - function close$1() { - html$3.removeClass('iframe--loaded'); - html$3.detach(); - html$3.find('iframe').attr('src', ''); + function close$2() { + html$7.removeClass('iframe--loaded'); + html$7.detach(); + html$7.find('iframe').attr('src', ''); if (object.onBack) object.onBack(); } - function render() { - return html$3; + function render$1() { + return html$7; } var Iframe = { - init: init$k, - show: show$1, - close: close$1, - render: render + init: init$p, + show: show$2, + close: close$2, + render: render$1 }; - var items = {}; - var original = {}; + var items = { + App: [], + Errors: [], + Warnings: [] + }; + var original = { + App: [], + Errors: [], + Warnings: [] + }; var times = 0; - var html$2; + var html$6; var scroll_tabs; var scroll_body; var last_tab; - function init$j() { + function init$o() { Keypad.listener.follow('keydown', function (e) { if (e.code == 38 || e.code == 29460) { var enable = Controller.enabled(); @@ -40160,7 +43515,7 @@ Controller.add('console-tabs', { toggle: function toggle() { Controller.collectionSet(scroll_tabs.render()); - Controller.collectionFocus(scroll_tabs.render().find('.console__tab[data-name="' + Utils$2.hash(last_tab) + '"]')[0], scroll_tabs.render()); + Controller.collectionFocus(scroll_tabs.render().find('.console__tab[data-name="' + Utils$1.hash(last_tab) + '"]')[0], scroll_tabs.render()); }, down: function down() { Controller.toggle('console-body'); @@ -40180,11 +43535,11 @@ times = 0; scroll_tabs.destroy(); scroll_body.destroy(); - html$2.remove(); + html$6.remove(); Controller.toggle('head'); } - function show(name) { + function show$1(name) { scroll_body.clear(); scroll_body.reset(); @@ -40232,25 +43587,25 @@ } function tab(name, lines) { - var elem = $('
' + Utils$2.shortText(name, 10) + ' - ' + lines.length + '
'); + var elem = $('
' + Utils$1.shortText(name, 10) + ' - ' + lines.length + '
'); elem.on('hover:enter', function () { - show(name); + show$1(name); last_tab = name; }).on('hover:focus', function (e) { scroll_tabs.update($(e.target)); }); scroll_tabs.append(elem); if (!last_tab) last_tab = name; - if (last_tab == name) show(name); + if (last_tab == name) show$1(name); } function build() { - html$2 = Template.get('console'); - scroll_body = new create$f({ + html$6 = Template.get('console'); + scroll_body = new Scroll({ over: true, mask: true }); - scroll_tabs = new create$f({ + scroll_tabs = new Scroll({ horizontal: true }); @@ -40258,10 +43613,10 @@ tab(i, items[i]); } - html$2.find('.console__tabs').append(HeadBackward(Lang.translate('menu_console'))).append(scroll_tabs.render()); - html$2.find('.console__body').append(scroll_body.render()); - scroll_body.height(html$2.find('.console__tabs')); - $('body').append(html$2); + html$6.find('.console__tabs').append(HeadBackward(Lang$1.translate('menu_console'))).append(scroll_tabs.render()); + html$6.find('.console__body').append(scroll_body.render()); + scroll_body.height(html$6.find('.console__tabs')); + $('body').append(html$6); } function add(name, message, message_original) { @@ -40272,7 +43627,7 @@ var where_items = items[name]; var where_original = original[name]; - var time = Utils$2.parseTime(Date.now()).time; + var time = Utils$1.parseTime(Date.now()).time; try { Arrays.insert(where_items, 0, '
' + time + ' - ' + message + '
'); @@ -40336,7 +43691,7 @@ while (arguments.length) { var arr = [].shift.call(arguments); - msgs.push(Utils$2.shortText(decode(arr), 600)); + msgs.push(Utils$1.shortText(decode(arr), 600)); mcon.push(arr); orgn.push(decode(arr)); } @@ -40347,15 +43702,18 @@ name = 'Other'; } else { // Add color and prefix to lampa console - var spanColor = color || Utils$2.stringToHslColor(msgs[0], 50, 65); - prefix = prefix ? ' ' + prefix : ''; - msgs[0] = '' + msgs[0] + prefix + ''; // Add brackets to real log + var spanColor = color || Utils$1.stringToHslColor(msgs[0], 50, 65); + msgs[0] = '' + msgs[0] + ''; // Add brackets to real log if (mcon.length > 0) { mcon[0] = '[' + mcon[0] + ']'; } } + if (prefix == 'ERROR' || prefix == 'WARNING') { + add(prefix == 'ERROR' ? 'Errors' : 'Warnings', msgs.join(' '), orgn); + } + add(name, msgs.join(' '), orgn); func.apply(console, mcon); }; @@ -40377,7 +43735,7 @@ var stack = (e.error && e.error.stack ? e.error.stack : e.stack || '').split("\n").join('
'); var message = typeof e.error == 'string' ? e.error : (e.error || e).message; - add('Script', message + '

' + stack, message + "\n\n" + stack); + add('Errors', message + '

' + stack, message + "\n\n" + stack); if (!(stack.indexOf('resetTopStyle') >= 0 || stack.indexOf('Blocked a frame') >= 0)) Noty.show('Error: ' + message + '

' + stack, { time: 8000 }); @@ -40385,23 +43743,23 @@ } var Console = { - init: init$j, + init: init$o, "export": function _export() { return original; } }; - function create$1() { + function create$3() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var html = Template.get('files', params.movie); html.addClass('layer--width'); if (params.movie.id) { html.find('.selector').on('hover:enter', function () { - if (Activity$1.all().length > 1) { - Activity$1.back(); + if (Activity.all().length > 1) { + Activity.back(); } else { - Activity$1.push({ + Activity.push({ url: params.movie.url, component: 'full', id: params.movie.id, @@ -40433,7 +43791,7 @@ }; } - function create() { + function create$2() { var html; this.create = function () { @@ -40466,8 +43824,8 @@ this.empty = function () { this.update({ - title: Lang.translate('more'), - original_title: Lang.translate('more_results'), + title: Lang$1.translate('more'), + original_title: Lang$1.translate('more_results'), vote_average: 0 }, true); }; @@ -40478,13 +43836,558 @@ }; } - var VideoQuality = { - get: function get() { - return ''; - }, - add: function add() { - return false; + /** + * Карточка + * @param {object} data + * @param {{isparser:boolean, card_small:boolean, card_category:boolean, card_collection:boolean, card_wide:true}} params + */ + + function Card(data) { + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + console.warn('Card is deprecated'); + this.data = data; + this.params = params; + Arrays.extend(data, { + title: data.name, + original_title: data.original_name, + release_date: data.first_air_date + }); + data.release_year = ((data.release_date || data.birthday || '0000') + '').slice(0, 4); + + function remove(elem) { + if (elem) elem.remove(); } + /** + * Загрузить шаблон + */ + + + this.build = function () { + this.card = Template.js(params.isparser ? 'card_parser' : 'card', data); + this.img = this.card.querySelector('.card__img') || {}; + this.card.card_data = data; + + if (params.isparser) { + var elem_title = this.card.querySelector('.card-parser__title'); + var elem_size = this.card.querySelector('.card-parser__size'); + var elem_details = this.card.querySelector('.card-parser__details'); + if (elem_title) elem_title.innerText = data.Title; + if (elem_size) elem_size.innerText = data.size; + var seeds = document.createElement('div'); + var grabs = document.createElement('div'); + elem_details.innerHTML = ''; + seeds.innerHTML = Lang$1.translate('torrent_item_seeds') + ': ' + data.Seeders + ''; + grabs.innerHTML = Lang$1.translate('torrent_item_grabs') + ': ' + data.Peers + ''; + elem_details.appendChild(seeds); + elem_details.appendChild(grabs); + } else { + var _elem_title = this.card.querySelector('.card__title'); + + if (_elem_title) _elem_title.innerText = data.title; + + if (data.original_name) { + var type_elem = document.createElement('div'); + type_elem.classList.add('card__type'); + type_elem.innerText = data.original_name ? 'TV' : 'MOV'; + this.card.querySelector('.card__view').appendChild(type_elem); + this.card.classList.add(data.original_name ? 'card--tv' : 'card--movie'); + } + + if (params.card_small) { + this.card.classList.add('card--small'); + remove(this.card.querySelector('.card__title')); + remove(this.card.querySelector('.card__age')); + } + + if (params.card_category) { + this.card.classList.add('card--category'); + } + + if (params.card_explorer) { + this.card.classList.add('card--explorer'); + } + + if (params.card_collection) { + this.card.classList.add('card--collection'); + remove(this.card.querySelector('.card__age')); + } + + if (params.card_wide) { + this.card.classList.add('card--wide'); + data.poster = data.cover; + + if (data.promo || data.promo_title) { + var promo_wrap = document.createElement('div'); + promo_wrap.classList.add('card__promo'); + + if (data.promo_title) { + var promo_title = document.createElement('div'); + promo_title.classList.add('card__promo-title'); + promo_title.innerText = data.promo_title; + promo_wrap.appendChild(promo_title); + } + + if (data.promo) { + var promo_text = document.createElement('div'); + promo_text.classList.add('card__promo-text'); + promo_text.innerText = data.promo.slice(0, 110) + (data.promo.length > 110 ? '...' : ''); + promo_wrap.appendChild(promo_text); + } + + this.card.querySelector('.card__view').appendChild(promo_wrap); + } + + if (Storage.field('light_version')) remove(this.card.querySelector('.card__title')); + remove(this.card.querySelector('.card__age')); + } + + if (data.release_year == '0000') { + remove(this.card.querySelector('.card__age')); + } else { + var year = this.card.querySelector('.card__age'); + if (year) year.innerText = data.release_year; + } + + var vote = parseFloat((data.cub_hundred_rating || data.vote_average || 0) + '').toFixed(1); + + if (vote > 0) { + var vote_elem = document.createElement('div'); + vote_elem.classList.add('card__vote'); + vote_elem.innerText = data.cub_hundred_fire ? Utils$1.bigNumberToShort(data.cub_hundred_fire) : vote >= 10 ? 10 : vote; + this.card.querySelector('.card__view').appendChild(vote_elem); + } + + var qu = data.quality || data.release_quality; + + if (qu && Storage.field('card_quality') && !data.original_name) { + var quality = document.createElement('div'); + quality.classList.add('card__quality'); + var quality_inner = document.createElement('div'); + quality_inner.innerText = qu; + quality.appendChild(quality_inner); + this.card.querySelector('.card__view').appendChild(quality); + } + } + + this.card.addEventListener('visible', this.visible.bind(this)); + this.card.addEventListener('update', this.update.bind(this)); + }; + /** + * Загрузить картинку + */ + + + this.image = function () { + var _this = this; + + if (params.isparser) return; + + this.img.onload = function () { + _this.card.classList.add('card--loaded'); + }; + + this.img.onerror = function () { + TMDB$1.broken(); + console.log('Img', 'noload', _this.img.src); + _this.img.src = './img/img_broken.svg'; + }; + }; + /** + * Добавить иконку + * @param {string} name + */ + + + this.addicon = function (name) { + var icon = document.createElement('div'); + icon.classList.add('card__icon'); + icon.classList.add('icon--' + name); + this.card.querySelector('.card__icons-inner').appendChild(icon); + }; + /** + * Обносить состояние карточки + */ + + + this.update = function () { + if (params.isparser) return; + this.watched_checked = false; + if (this.watched_wrap) remove(this.watched_wrap); + this.favorite(); + if (this.card.classList.contains('focus')) this.watched(); + }; + /** + * Какие серии просмотрено + */ + + + this.watched = function () { + var _this2 = this; + + if (!Storage.field('card_episodes')) return; + + if (!this.watched_checked) { + var get = function get(callback) { + if (data.original_name) TimeTable.get(data, callback);else callback([]); + }; + + get(function (episodes) { + var viewed; + episodes.forEach(function (ep) { + var hash = Utils$1.hash([ep.season_number, ep.season_number > 10 ? ':' : '', ep.episode_number, data.original_title].join('')); + var view = Timeline.view(hash); + if (view.percent) viewed = { + ep: ep, + view: view + }; + }); + + if (!viewed && data.original_name) { + var last = Storage.get('online_watched_last', '{}'); + var filed = last[Utils$1.hash(data.original_title)]; + + if (filed && filed.episode) { + viewed = { + ep: { + episode_number: filed.episode, + name: Lang$1.translate('full_episode') + ' ' + filed.episode + }, + view: Timeline.view(Utils$1.hash([filed.season, filed.season > 10 ? ':' : '', filed.episode, data.original_title].join(''))) + }; + } + } + + if (!viewed && !data.original_name) { + var time = Timeline.view(Utils$1.hash([data.original_title].join(''))); + + if (time.percent) { + viewed = { + ep: { + name: Lang$1.translate('title_viewed') + ' ' + (time.time ? Utils$1.secondsToTimeHuman(time.time) : time.percent + '%') + }, + view: time + }; + } + } + + if (viewed) { + var soon = []; + var next = episodes.slice(episodes.indexOf(viewed.ep)).filter(function (ep) { + return ep.air_date; + }).filter(function (ep) { + var date = Utils$1.parseToDate(ep.air_date).getTime(); + if (date > Date.now()) soon.push(ep); + return date < Date.now(); + }).slice(0, 5); + if (next.length == 0) next = [viewed.ep]; + if (soon.length && next.length < 5 && !next.find(function (n) { + return n.episode_number == soon[0].episode_number; + })) next.push(soon[0]); + var wrap = Template.js('card_watched', {}); + next.forEach(function (ep) { + var div = document.createElement('div'); + var span = document.createElement('span'); + var date = Utils$1.parseToDate(ep.air_date); + var now = Date.now(); + var days = Math.ceil((date.getTime() - now) / (24 * 60 * 60 * 1000)); + div.classList.add('card-watched__item'); + div.appendChild(span); + span.innerText = (ep.episode_number ? ep.episode_number + ' - ' : '') + (days > 0 ? Lang$1.translate('full_episode_days_left') + ': ' + days : ep.name || Lang$1.translate('noname')); + if (ep == viewed.ep) div.appendChild(Timeline.render(viewed.view)[0]); + wrap.querySelector('.card-watched__body').appendChild(div); + }); + _this2.watched_wrap = wrap; + + var view = _this2.card.querySelector('.card__view'); + + view.insertBefore(wrap, view.firstChild); + } + }); + this.watched_checked = true; + } + }; + /** + * Обновить иконки на закладки + */ + + + this.favorite = function () { + var status = Favorite.check(data); + var marker = this.card.querySelector('.card__marker'); + var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; + this.card.querySelector('.card__icons-inner').innerHTML = ''; + if (status.book) this.addicon('book'); + if (status.like) this.addicon('like'); + if (status.wath) this.addicon('wath'); + if (status.history || Timeline.watched(data)) this.addicon('history'); + var any_marker = marks.find(function (m) { + return status[m]; + }); + + if (any_marker) { + if (!marker) { + marker = document.createElement('div'); + marker.addClass('card__marker'); + marker.append(document.createElement('span')); + this.card.querySelector('.card__view').append(marker); + } + + marker.find('span').text(Lang$1.translate('title_' + any_marker)); + marker.removeClass(marks.map(function (m) { + return 'card__marker--' + m; + }).join(' ')).addClass('card__marker--' + any_marker); + } else if (marker) marker.remove(); + }; + /** + * Вызвали меню + * @param {object} target + * @param {object} data + */ + + + this.onMenu = function (target, data) { + var _this3 = this; + + var enabled = Controller.enabled().name; + var status = Favorite.check(data); + var menu_plugins = []; + var menu_favorite = [{ + title: Lang$1.translate('title_book'), + where: 'book', + checkbox: true, + checked: status.book + }, { + title: Lang$1.translate('title_like'), + where: 'like', + checkbox: true, + checked: status.like + }, { + title: Lang$1.translate('title_wath'), + where: 'wath', + checkbox: true, + checked: status.wath + }, { + title: Lang$1.translate('menu_history'), + where: 'history', + checkbox: true, + checked: status.history + }, { + title: Lang$1.translate('settings_cub_status'), + separator: true + }]; + var marks = ['look', 'viewed', 'scheduled', 'continued', 'thrown']; + marks.forEach(function (m) { + menu_favorite.push({ + title: Lang$1.translate('title_' + m), + where: m, + picked: status[m], + collect: true, + noenter: !Account$1.hasPremium() + }); + }); + object$2.plugins.forEach(function (plugin) { + if (plugin.type == 'video' && plugin.onContextMenu && plugin.onContextLauch) { + menu_plugins.push({ + title: plugin.name, + subtitle: plugin.subtitle || plugin.description, + onSelect: function onSelect() { + if (document.body.classList.contains('search--open')) Search.close(); + + if (!data.imdb_id && data.source == 'tmdb') { + Loading$1.start(function () { + Loading$1.stop(); + Controller.toggle(enabled); + }); + TMDB.external_imdb_id({ + type: data.name ? 'tv' : 'movie', + id: data.id + }, function (imdb_id) { + Loading$1.stop(); + data.imdb_id = imdb_id; + plugin.onContextLauch(data); + }); + } else plugin.onContextLauch(data); + } + }); + } + }); + if (menu_plugins.length) menu_plugins.push({ + title: Lang$1.translate('more'), + separator: true + }); + var menu_main = menu_plugins.length ? menu_plugins.concat(menu_favorite) : menu_favorite; + if (this.onMenuShow) this.onMenuShow(menu_main, this.card, data); + Select.show({ + title: Lang$1.translate('title_action'), + items: menu_main, + onBack: function onBack() { + Controller.toggle(enabled); + }, + onCheck: function onCheck(a) { + if (params.object) data.source = params.object.source; + + if (a.where) { + Favorite.toggle(a.where, data); + + _this3.favorite(); + } + }, + onSelect: function onSelect(a) { + if (params.object) data.source = params.object.source; + + if (a.collect) { + Favorite.toggle(a.where, data); + + _this3.favorite(); + } + + if (_this3.onMenuSelect) _this3.onMenuSelect(a, _this3.card, data); + Controller.toggle(enabled); + }, + onDraw: function onDraw(item, elem) { + if (elem.collect) { + if (!Account$1.hasPremium()) { + var wrap = $('
'); + wrap.append(Template.js('icon_lock')); + item.find('.selectbox-item__checkbox').remove(); + item.append(wrap); + item.on('hover:enter', function () { + Select.close(); + Account$1.showCubPremium(); + }); + } + } + } + }); + }; + /** + * Создать + */ + + + this.create = function () { + var _this4 = this; + + this.build(); + this.card.addEventListener('hover:focus', function () { + _this4.watched(); + + if (_this4.onFocus) _this4.onFocus(_this4.card, data); + }); + this.card.addEventListener('hover:touch', function () { + _this4.watched(); + + if (_this4.onTouch) _this4.onTouch(_this4.card, data); + }); + this.card.addEventListener('hover:hover', function () { + _this4.watched(); + + if (_this4.onHover) _this4.onHover(_this4.card, data); + }); + this.card.addEventListener('hover:enter', function () { + if (_this4.onEnter) _this4.onEnter(_this4.card, data); + }); + this.card.addEventListener('hover:long', function () { + if (_this4.onMenu) _this4.onMenu(_this4.card, data); + }); + this.image(); + }; + /** + * Загружать картинку если видна карточка + */ + + + this.visible = function () { + var src = ''; + if (params.card_wide && data.backdrop_path) src = Api.img(data.backdrop_path, 'w780');else if (params.card_collection && data.backdrop_path) src = Api.img(data.backdrop_path, 'w500');else if (data.poster_path) src = Api.img(data.poster_path);else if (data.profile_path) src = Api.img(data.profile_path);else if (data.poster) src = data.poster;else if (data.img) src = data.img;else src = './img/img_broken.svg'; + this.img.src = src; + this.update(); + if (this.onVisible) this.onVisible(this.card, data); + }; + /** + * Уничтожить + */ + + + this.destroy = function () { + this.img.onerror = function () {}; + + this.img.onload = function () {}; + + this.img.src = ''; + remove(this.card); + this.card = null; + this.img = null; + }; + /** + * Рендер + * @returns {object} + */ + + + this.render = function (js) { + return js ? this.card : $(this.card); + }; + } + + var html$5 = $("
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
"); + var body = html$5.find('.helper__text'), + time; + var memorys = {}; + var remember = 1000 * 60 * 60 * 14; + + function show(name, text, elem) { + if (!Storage.field('helper')) return; + var help = memorys[name]; + + if (!help) { + help = { + time: 0, + count: 0 + }; + if (_typeof(memorys) !== 'object') memorys = {}; //хз, вылазит ошибка, что в переменную true нельзя записать значение, откуда там true хз + + memorys[name] = help; + } + + if (help.time + remember < Date.now() && help.count < 3) { + help.time = Date.now(); + help.count++; + Storage.set('helper', memorys); + clearTimeout(time); + time = setTimeout(function () { + html$5.removeClass('helper--visible'); + }, 10000); + body.html(text); + html$5.addClass('helper--visible'); + + if (elem) { + var blink = $(''); + elem.append(blink); + setTimeout(function () { + blink.remove(); + }, 3000); + } + } + } + + function init$n() { + memorys = Storage.cache('helper', 300, {}); + Settings.listener.follow('open', function (e) { + if (e.name == 'more') { + e.body.find('.helper--start-again').on('hover:enter', function () { + memorys = {}; + Storage.set('helper', memorys); + Noty.show(Lang$1.translate('helper_cleared')); + }); + } + }); + $('body').append(html$5); + } + + var Helper$1 = { + show: show, + init: init$n }; /* @@ -40501,9 +44404,9 @@ * Запуск */ - function init$i() { + function init$m() { if (typeof tizen !== 'undefined') { - setInterval(lauchPick, 1000 * 60 * 10); + Timer.add(1000 * 60 * 10, lauchPick); lauchPick(); deepLink(); window.addEventListener('appcontrol', deepLink); @@ -40559,7 +44462,7 @@ sections: [] }; console.log('Tizen', 'start pick'); - var status = new status$2(3); + var status = new Status(3); status.onComplite = function (result) { if (result.popular) data.sections.push(result.popular); @@ -40569,20 +44472,20 @@ if (data.sections.length) setPick(data); }; - Account.notice(function (notices) { + Account$1.Api.notices(function (notices) { var new_notices = notices.filter(function (n) { return !n.viewed; }).slice(0, 3); if (new_notices.length) { var section = { - title: Lang.translate('title_notice'), + title: Lang$1.translate('title_notice'), tiles: [], position: 0 }; new_notices.forEach(function (noty) { var info = JSON.parse(noty.data); - section.tiles.push(cardToTile(info.card, info.type == 'new_episode' ? Lang.translate('notice_new_episode') : Lang.translate('notice_in_quality'))); + section.tiles.push(cardToTile(info.card, info.type == 'new_episode' ? Lang$1.translate('notice_new_episode') : Lang$1.translate('notice_in_quality'))); }); status.append('notice', section); } else status.error(); @@ -40590,7 +44493,7 @@ TMDB.get('movie/popular', {}, function (result) { if (result.results.length) { var section = { - title: Lang.translate('title_popular_movie'), + title: Lang$1.translate('title_popular_movie'), position: 2, tiles: result.results.slice(0, 10).map(function (c) { return cardToTile(c); @@ -40598,12 +44501,14 @@ }; status.append('popular', section); } else status.error(); - }, status.error.bind(status)); + }, status.error.bind(status), { + life: 60 * 24 * 3 + }); var continues = Favorite.continues('tv'); if (continues.length) { var section = { - title: Lang.translate('title_continue'), + title: Lang$1.translate('title_continue'), position: 1, tiles: continues.slice(0, 7).map(function (c) { return cardToTile(c); @@ -40637,7 +44542,7 @@ }; if (window.appready) { - Activity$1.push(window.start_deep_link); + Activity.push(window.start_deep_link); } console.log('Tizen', 'open deep link', window.start_deep_link); @@ -40647,11 +44552,251 @@ } var Tizen = { - init: init$i + init: init$m }; - function component(object) { - var scroll = new create$f({ + function create$1(data) { + var _this = this; + + var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var content = Template.js('items_line', { + title: data.title + }); + var body = content.querySelector('.items-line__body'); + var scroll = new Scroll({ + horizontal: true, + step: params.card_wide ? 600 : 300 + }); + var items = []; + var active = 0; + var tv = Platform.screen('tv'); + var view = (tv ? Lampa.Storage.field('interface_size') == 'small' ? 7 : 6 : 12) + (params.align_left ? 4 : 0); + var more; + var last; + console.warn('Component InteractionLine is deprecated.'); + + var onmore = function onmore() { + if (_this.onEnter) _this.onEnter(); + if (data.onMore) data.onMore(data);else if (_this.onMore) { + _this.onMore(data); + } else { + Activity.push({ + url: data.url, + title: data.title || Lang$1.translate('title_category'), + component: 'category_full', + page: 1, + genres: params.genres, + filter: data.filter, + source: data.source || params.object.source + }); + } + }; + + this.event = function (type) { + Lampa.Listener.send('line', { + line: this, + type: type, + params: params, + data: data, + scroll: scroll, + body: body, + items: items, + active: active + }); + }; + + this.create = function () { + var _this2 = this; + + this.event('create'); + scroll.body(true).addClass('items-cards mapping--line'); + content.querySelector('.items-line__title').innerHTML = data.title; + content.classList.add('items-line--type-' + (params.type || 'none')); + content.addEventListener('visible', this.visible.bind(this)); + data.results.slice(0, view).forEach(this.append.bind(this)); + body.appendChild(scroll.render(true)); + + scroll.onWheel = function (step) { + if (!Controller.own(_this2)) _this2.toggle(); + Controller.enabled().controller[step > 0 ? 'right' : 'left'](); + }; + + scroll.onScroll = this.attach.bind(this); + }; + /* + События + + this.onAppend = function(){} + this.onFocus = function(){} + this.onEnter = function(){} + this.onSelect = function(){} + this.onMore = function(){} + this.onFocusMore = function(){} + this.onLeft = function(){} + this.onBack = function(){} + this.onDown = function(){} + this.onUp = function(){} + */ + + + this.visible = function () { + data.results.slice(0, view).forEach(this.append.bind(this)); + + if ((data.results.length >= 20 || data.more) && !params.nomore) { + var button = document.createElement('div'); + button.classList.add('items-line__more'); + button.classList.add('selector'); + button.innerText = Lang$1.translate('more'); + button.addEventListener('hover:enter', onmore); + content.querySelector('.items-line__head').appendChild(button); + } + + this.event('visible'); + Layer.visible(scroll.render(true)); + }; + + this.append = function (element) { + var _this3 = this; + + if (element.ready) return; + element.ready = true; + var card = params.cardClass ? params.cardClass(element, params) : element.cardClass ? element.cardClass(element, params) : new Card(element, params); + card.create(); + + card.onFocus = function (target, card_data) { + last = target; + var prev_active = active; + active = items.indexOf(card); + if (active > 0 || prev_active > active) scroll.update(items[active].render(true), params.align_left ? false : true); + if (!data.noimage) Background.change(Utils$1.cardImgBackground(card_data)); + if (_this3.onFocus) _this3.onFocus(card_data); + }; + + card.onEnter = function (target, card_data) { + last = target; + if (_this3.onEnter) _this3.onEnter(target, card_data); + if (_this3.onSelect) return _this3.onSelect(target, card_data); + if (!card_data.source) card_data.source = params.object.source; + + if (typeof card_data.gender !== 'undefined') { + Activity.push({ + url: card_data.url, + title: Lang$1.translate('title_person'), + component: 'actor', + id: card_data.id, + source: card_data.source || params.object.source + }); + } else { + Activity.push({ + url: card_data.url, + component: 'full', + id: card_data.id, + method: card_data.name ? 'tv' : 'movie', + card: card_data, + source: card_data.source || params.object.source + }); + } + }; + + card.onHover = function (target, card_data) { + if (_this3.onHover) _this3.onHover(card_data); + }; + + card.onVisible = function () { + if (Controller.own(_this3)) Controller.collectionAppend(card.render(true)); + }; + + if (this.onMenu) card.onMenu = this.onMenu; + + if (params.card_events) { + for (var i in params.card_events) { + card[i] = params.card_events[i]; + } + } + + scroll.append(card.render(true)); + items.push(card); + if (this.onAppend) this.onAppend(card); + this.event('append'); + return card.render(true); + }; + + this.more = function () { + var _this4 = this; + + more = new More$1(params); + more.create(); + more.render(true).on('hover:focus', function (target) { + last = target; + active = items.indexOf(more); + scroll.update(more.render(true), params.align_left ? false : true); + if (_this4.onFocusMore) _this4.onFocusMore(); + }); + more.render(true).on('hover:enter', onmore.bind(this)); + scroll.append(more.render(true)); + more.size(items[items.length - 1].render(true)); + items.push(more); + return more.render(true); + }; + + this.attach = function () { + var size = tv ? (Math.round(active / view) + 1) * view + 1 : data.results.length; + data.results.slice(0, size).filter(function (e) { + return !e.ready; + }).forEach(this.append.bind(this)); + + if (!more && !params.nomore && data.results.length == data.results.filter(function (e) { + return e.ready; + }).length && data.results.length >= 20) { + var more_item = this.more(); + if (Controller.own(this)) Controller.collectionAppend(more_item); + } + + Layer.visible(scroll.render(true)); + }; + + this.toggle = function () { + var _this5 = this; + + Controller.add('items_line', { + link: this, + toggle: function toggle() { + Controller.collectionSet(scroll.render(true)); + Controller.collectionFocus(items.length ? last : false, scroll.render(true)); + if (_this5.onToggle) _this5.onToggle(_this5); + + _this5.event('toggle'); + }, + update: function update() {}, + right: function right() { + Navigator.move('right'); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else if (_this5.onLeft) _this5.onLeft();else Controller.toggle('menu'); + }, + down: this.onDown, + up: this.onUp, + gone: function gone() {}, + back: this.onBack + }); + Controller.toggle('items_line'); + }; + + this.render = function (js) { + return js ? content : $(content); + }; + + this.destroy = function () { + Arrays.destroy(items); + scroll.destroy(); + content.remove(); + items = null; + this.event('destroy'); + }; + } + + function component$2(object) { + var scroll = new Scroll({ mask: true, over: true, scroll_by_item: true, @@ -40660,6 +44805,7 @@ var items = []; var html = document.createElement('div'); var active = 0; + console.warn('Component InteractionMain is deprecated.'); this.create = function () {}; @@ -40667,10 +44813,10 @@ var button; if (object.source == 'tmdb') { - button = $(''); + button = $(''); button.find('.selector').on('hover:enter', function () { Storage.set('source', 'cub'); - Activity$1.replace({ + Activity.replace({ source: 'cub' }); }); @@ -40724,7 +44870,7 @@ this.append = function (element) { if (element.ready) return; element.ready = true; - var item = new create$i(element, { + var item = new create$1(element, { url: element.url, genres: object.genres, object: object, @@ -40743,7 +44889,7 @@ }; this.back = function () { - Activity$1.backward(); + Activity.backward(); }; this.push = function (item, element) { @@ -40823,17 +44969,244 @@ }; } - function open$1(callSelected, callCancel) { + function component$1(object) { + var network = new Request(); + var scroll = new Scroll({ + mask: true, + over: true, + step: 250, + end_ratio: 2 + }); + var items = []; + var html = document.createElement('div'); + var body = document.createElement('div'); + var total_pages = 0; + var last; + var waitload; + var active = 0; + console.warn('Component InteractionCategory is deprecated.'); + + this.create = function () {}; + + this.empty = function () { + var button; + + if (object.source == 'tmdb') { + button = $(''); + button.find('.selector').on('hover:enter', function () { + Storage.set('source', 'cub'); + Activity.replace({ + source: 'cub' + }); + }); + } + + var empty = new Empty(); + if (button) empty.append(button); + empty.addInfoButton(); + html.appendChild(empty.render(true)); + this.start = empty.start; + this.activity.loader(false); + this.activity.toggle(); + }; + + this.next = function () { + var _this = this; + + if (waitload) return; + + if (object.page < total_pages) { + waitload = true; + object.page++; + this.nextPageReuest(object, function (result) { + _this.append(result, true); + + waitload = false; + + _this.limit(); + }, function () { + waitload = false; + }); + } + }; + + this.nextPageReuest = function (object, resolve, reject) { + Api.list(object, resolve.bind(this), reject.bind(this)); + }; + + this.append = function (data, append) { + var _this2 = this; + + data.results.forEach(function (element) { + var params = { + object: object, + card_category: typeof data.card_category == 'undefined' ? true : data.category, + card_wide: data.wide, + card_small: data.small, + card_broad: data.broad, + card_collection: data.collection, + card_events: data.card_events + }; + var card = data.cardClass ? data.cardClass(element, params) : element.cardClass ? element.cardClass(element, params) : new Card(element, params); + card.create(); + + card.onFocus = function (target, card_data) { + last = target; + active = items.indexOf(card); + scroll.update(card.render(true)); + Background.change(Utils$1.cardImgBackground(card_data)); + }; + + card.onTouch = function (target, card_data) { + last = target; + active = items.indexOf(card); + }; + + card.onEnter = function (target, card_data) { + last = target; + + if (typeof card_data.gender !== 'undefined') { + Activity.push({ + url: element.url, + title: Lang$1.translate('title_person'), + component: 'actor', + id: element.id, + source: element.source || object.source + }); + } else { + Activity.push({ + url: card_data.url, + component: 'full', + id: element.id, + method: card_data.name ? 'tv' : 'movie', + card: element, + source: element.source || object.source + }); + } + }; + + body.appendChild(card.render(true)); + items.push(card); + if (_this2.cardRender) _this2.cardRender(object, element, card); + if (append) Controller.collectionAppend(card.render(true)); + }); + }; + + this.limit = function () { + var limit_view = 12; + var lilit_collection = 36; + var colection = items.slice(Math.max(0, active - limit_view), active + limit_view); + items.forEach(function (item) { + if (colection.indexOf(item) == -1) { + item.render(true).classList.remove('layer--render'); + } else { + item.render(true).classList.add('layer--render'); + } + }); + Navigator.setCollection(items.slice(Math.max(0, active - lilit_collection), active + lilit_collection).map(function (c) { + return c.render(true); + })); + Navigator.focused(last); + Layer.visible(scroll.render(true)); + }; + + this.build = function (data) { + var _this3 = this; + + if (data.results.length) { + total_pages = data.total_pages; + body.addClass('category-full'); + scroll.minus(); + scroll.onEnd = this.next.bind(this); + scroll.onScroll = this.limit.bind(this); + + scroll.onWheel = function (step) { + if (!Controller.own(_this3)) _this3.start(); + if (step > 0) Navigator.move('down');else Navigator.move('up'); + }; + + this.append(data); + scroll.append(body); + html.appendChild(scroll.render(true)); + this.limit(); + this.activity.loader(false); + this.activity.toggle(); + } else { + this.empty(); + } + }; + + this.start = function () { + var _this4 = this; + + Controller.add('content', { + link: this, + toggle: function toggle() { + if (_this4.activity.canRefresh()) return false; + Controller.collectionSet(scroll.render(true)); + Controller.collectionFocus(last || false, scroll.render(true)); + }, + left: function left() { + if (Navigator.canmove('left')) Navigator.move('left');else Controller.toggle('menu'); + }, + right: function right() { + if (_this4.onRight) { + if (Navigator.canmove('right')) Navigator.move('right');else _this4.onRight(); + } else Navigator.move('right'); + }, + up: function up() { + if (Navigator.canmove('up')) Navigator.move('up');else Controller.toggle('head'); + }, + down: function down() { + if (Navigator.canmove('down')) Navigator.move('down'); + }, + back: function back() { + Activity.backward(); + } + }); + Controller.toggle('content'); + }; + + this.refresh = function () { + this.activity.needRefresh(); + }; + + this.pause = function () {}; + + this.stop = function () {}; + + this.render = function (js) { + return js ? html : $(html); + }; + + this.destroy = function () { + network.clear(); + Arrays.destroy(items); + scroll.destroy(); + html.remove(); + body.remove(); + items = []; + }; + } + + /** + * Открывает окно выбора языка на начальном экране + * @param {function} callSelected - вызывается при выборе языка, получает код языка + * @param {function} callCancel - вызывается при отмене выбора + * @returns {void} + */ + + function open$2(callSelected, callCancel) { var html = Template.get('lang_choice', {}); - var scroll = new create$f({ + var scroll = new Scroll({ mask: true, over: true }); - var codes = Lang.codes(); + var codes = Lang$1.codes(); function selector(code) { var item = $('
' + codes[code] + '
'); - item.on('hover:enter', function (e) { + item.on('hover:enter click', function (e) { if (callSelected) callSelected(code); html.fadeOut(300, function () { scroll.destroy(); @@ -40845,8 +45218,8 @@ scroll.update($(e.target), true); $('.lang__selector-item', html).removeClass('last-focus'); $(e.target).addClass('last-focus'); - html.find('.lang__title').text(Lang.translate('lang_choice_title', code)); - html.find('.lang__subtitle').text(Lang.translate('lang_choice_subtitle', code)); + html.find('.lang__title').text(Lang$1.translate('lang_choice_title', code)); + html.find('.lang__subtitle').text(Lang$1.translate('lang_choice_subtitle', code)); }); scroll.append(item); } @@ -40883,12 +45256,112 @@ } var LangChoice = { - open: open$1 + open: open$2 }; - function init$h() { + var player; + var html$4; + var timer; + /** + * Создать плеер YouTube + * @param {string} id - ID видео на YouTube + * @return {void} + */ + + function create(id) { + html$4 = $('
'); + $('body').append(html$4); + player = new YT.Player('youtube-player', { + height: window.innerHeight, + width: window.innerWidth, + playerVars: { + 'controls': 0, + 'showinfo': 0, + 'autohide': 1, + 'modestbranding': 1, + 'autoplay': 1, + 'suggestedQuality': 'hd1080', + 'setPlaybackQuality': 'hd1080' + }, + videoId: id, + events: { + onReady: function onReady(event) { + event.target.setPlaybackQuality('hd1080'); + event.target.playVideo(); + update$2(); + }, + onStateChange: function onStateChange(state) { + if (state.data == 0) { + Controller.toggle('content'); + } + + if (state.data == YT.PlayerState.BUFFERING) { + state.target.setPlaybackQuality('hd1080'); + } + }, + onPlaybackQualityChange: function onPlaybackQualityChange(state) { + console.log('YouTube', 'quality', state.target.getPlaybackQuality()); + } + } + }); + } + + function update$2() { + timer = setTimeout(function () { + var progress = player.getCurrentTime() / player.getDuration() * 100; + $('#youtube-player__progress').css('width', progress + '%'); + Screensaver$2.resetTimer(); + update$2(); + }, 400); + } + /** + * Начать воспроизведение видео с YouTube + * @param {string} id - ID видео на YouTube (например, dQw4w9WgXcQ) + * @returns {void} + */ + + + function play(id) { + if (typeof YT == 'undefined') return; + create(id); + Controller.add('youtube', { + invisible: true, + toggle: function toggle() {}, + right: function right() { + player.seekTo(player.getCurrentTime() + 10, true); + }, + left: function left() { + player.seekTo(player.getCurrentTime() - 10, true); + }, + enter: function enter() {}, + gone: function gone() { + destroy(); + }, + back: function back() { + Controller.toggle('content'); + } + }); + Controller.toggle('youtube'); + } + + function destroy() { + clearTimeout(timer); + player.destroy(); + html$4.remove(); + html$4 = null; + } + + var YouTube = { + play: play + }; + + /** + * LG webOS добавление/удаление приложения из лаунчера, но только для виджетов ручной установки + */ + + function init$l() { if (!Platform.is('webos')) return; - var field = $("
\n
\n \n \n \n \n \n \n
\n
".concat(Lang.translate('settings_webos_launcher'), "
\n
")); + var field = $("
\n
\n \n \n \n \n \n \n
\n
".concat(Lang$1.translate('settings_webos_launcher'), "
\n
")); Settings.main().render().find('[data-component="more"]').after(field); Settings.main().update(); Lampa.Template.add('settings_webos_launcher', "
\n
\n
#{settings_webos_launcher_add_device}
\n
\n
\n
#{settings_webos_launcher_remove_device}
\n
\n
"); @@ -40910,10 +45383,10 @@ "description": "Lampa app for LG webOS" }, onSuccess: function onSuccess(res) { - Noty.show(Lang.translate('settings_added')); + Noty.show(Lang$1.translate('settings_added')); }, onFailure: function onFailure(res) { - Noty.show(Lang.translate('title_error') + ': ' + res.errorText); + Noty.show(Lang$1.translate('title_error') + ': ' + res.errorText); } }); }); @@ -40925,10 +45398,10 @@ "showPopup": true }, onSuccess: function onSuccess(res) { - Noty.show(Lang.translate('settings_added')); + Noty.show(Lang$1.translate('settings_added')); }, onFailure: function onFailure(res) { - Noty.show(Lang.translate('title_error') + ': ' + res.errorText); + Noty.show(Lang$1.translate('title_error') + ': ' + res.errorText); } }); }); @@ -40937,12 +45410,17 @@ } var WebOSLauncher = { - init: init$h + init: init$l }; - function open(callSelected) { + /** + * Режим разработчика + * @param {function} callSelected Функция, которая вызывается при закрытии меню разработчика + */ + + function open$1(callSelected) { var html = Template.get('lang_choice', {}); - var scroll = new create$f({ + var scroll = new Scroll({ mask: true, over: true }); @@ -40977,16 +45455,16 @@ } var btns = [{ - name: Lang.translate('title_continue_two'), + name: Lang$1.translate('title_continue_two'), select: close }, { - name: Lang.translate('plugins_remove'), + name: Lang$1.translate('plugins_remove'), select: function select() { Storage.set('plugins', []); close(); } }, { - name: Lang.translate('settings_reset'), + name: Lang$1.translate('settings_reset'), select: function select() { localStorage.clear(); window.location.reload(); @@ -41014,7 +45492,7 @@ } var Developer = { - open: open + open: open$1 }; var CardClass = /*#__PURE__*/function () { @@ -41045,8 +45523,8 @@ this.card.querySelector('.card__view').appendChild(this.box); this.card.addEventListener('hover:enter', function () { var tpl = Template.get('cub_premium'); - tpl.find('.cub-premium__title').text(Lang.translate('title_notice')); - tpl.find('.cub-premium__descr').eq(0).empty().text(Lang.translate('ad_notice_' + _this.params.type)); + tpl.find('.cub-premium__title').text(Lang$1.translate('title_notice')); + tpl.find('.cub-premium__descr').eq(0).empty().text(Lang$1.translate('ad_notice_' + _this.params.type)); Modal.open({ title: '', size: 'medium', @@ -41111,9 +45589,9 @@ var n = Math.floor(Math.random() * 5) + 1; Arrays.extend(params, { title: params.card.title || params.card.name, - subtitle: Lang.translate('title_notice'), + subtitle: Lang$1.translate('title_notice'), poster: params.card.poster_path, - text: Lang.translate('ad_notice_' + params.type + '_text_' + n) + text: Lang$1.translate('ad_notice_' + params.type + '_text_' + n) }); this.card = new CardClass(params); this.card.create(); @@ -41136,14 +45614,14 @@ var network; - function init$g() { - network = new create$e(); + function init$k() { + network = new Request(); Socket.listener.follow('message', function (e) { - if (e.method == 'premiere') update(e.data); + if (e.method == 'premiere') update$1(e.data); }); } - function update(data) { + function update$1(data) { var id = data.type + '/' + data.id; console.log('Premiere', 'load:', data, 'exist:', Boolean(Notice$1.classes.lampa.notices.find(function (n) { return n.id == id; @@ -41151,7 +45629,7 @@ if (Notice$1.classes.lampa.notices.find(function (n) { return n.id == id; })) return; - var codes = Arrays.getKeys(Lang.codes()); + var codes = Arrays.getKeys(Lang$1.codes()); network.silent(TMDB$1.api(id + '?append_to_response=translations,credits&language=' + Storage.get('language', 'ru') + '&api_key=' + TMDB$1.key()), function (movie) { network.silent(TMDB$1.api(id + '/images?include_image_language=' + codes.join(',') + '&language=' + Storage.get('language', 'ru') + '&api_key=' + TMDB$1.key()), function (images) { var card = Arrays.clone(movie); @@ -41174,7 +45652,7 @@ movie.translations.translations.filter(function (t) { return codes.indexOf(t.iso_639_1) >= 0; }).forEach(function (t) { - notice.title[t.iso_639_1] = Lang.translate('premiere_title') + ': ' + (t.data.title || t.data.name || movie.title || movie.name); + notice.title[t.iso_639_1] = Lang$1.translate('premiere_title') + ': ' + (t.data.title || t.data.name || movie.title || movie.name); notice.text[t.iso_639_1] = (t.data.overview || movie.overview || '').slice(0, 130) + '...'; }); images.posters.forEach(function (i) { @@ -41192,7 +45670,7 @@ notice.author[c] = { name: casts[0].name || casts[0].character, img: casts[0].profile_path, - text: Lang.translate('premiere_author_recomend_' + (Math.floor(Math.random() * 5) + 1)) + text: Lang$1.translate('premiere_author_recomend_' + (Math.floor(Math.random() * 5) + 1)) }; }); } @@ -41208,7 +45686,7 @@ } var Premiere = { - init: init$g + init: init$k }; var BotClass = /*#__PURE__*/function () { @@ -41229,12 +45707,12 @@ this.img = this.card.querySelector('.ad-bot__img') || {}; this.card.querySelector('.ad-bot__title').innerText = this.params.title; this.card.querySelector('.ad-bot__text').innerText = this.params.text; - this.card.querySelector('.ad-bot__more').innerText = Lang.translate('full_detail'); - this.card.querySelector('.ad-bot__info').innerText = Lang.translate('ad_disable'); + this.card.querySelector('.ad-bot__more').innerText = Lang$1.translate('full_detail'); + this.card.querySelector('.ad-bot__info').innerText = Lang$1.translate('ad_disable'); this.card.addEventListener('hover:enter', function () { var tpl = Template.get('cub_premium'); - tpl.find('.cub-premium__title').text(Lang.translate('title_notice')); - tpl.find('.cub-premium__descr').eq(0).empty().text(Lang.translate('ad_notice_' + _this.params.type)); + tpl.find('.cub-premium__title').text(Lang$1.translate('title_notice')); + tpl.find('.cub-premium__descr').eq(0).empty().text(Lang$1.translate('ad_notice_' + _this.params.type)); Modal.open({ title: '', size: 'medium', @@ -41290,14 +45768,13 @@ return BotClass; }(); - function init$f() { - if (Account.logged() && Lang.selected(['ru', 'uk', 'be', 'bg']) && window.lampa_settings.account_use) { - var user = Storage.get('account_user', '{}'); - if (user.premium && !Account.hasPremium()) setTimeout(push$1, 5000); + function init$j() { + if (Account$1.Permit.access && Lang$1.selected(['ru', 'uk', 'be', 'bg']) && window.lampa_settings.account_use) { + if (Account$1.Permit.user.premium && !Account$1.hasPremium()) setTimeout(push$2, 5000); } } - function push$1() { + function push$2() { var now = new Date(); var id = 'extend_premium_' + now.getFullYear() + '_' + now.getMonth(); if (Notice$1.classes.lampa.notices.find(function (n) { @@ -41319,17 +45796,17 @@ bg: 'Вашият абонамент за CUB Premium е изтекъл! Не пропускайте шанса си да подновите достъпа си до ексклузивно съдържание и допълнителни функции. Надстройте до премиум статус сега и се насладете на всички предимства на CUB без ограничения!' }, time: Date.now(), - icon: Utils$2.protocol() + object$2.cub_domain + '/img/icons/premium_two.svg' + icon: Utils$1.protocol() + object$2.cub_domain + '/img/icons/premium_two.svg' }; Notice$1.pushNotice('lampa', notice, function () {}, function (er) {}); } var Extend = { - init: init$f + init: init$j }; - function init$e() { - Lang.add({ + function init$i() { + Lang$1.add({ ad_notice_tv_text_1: { ru: 'Будьте в курсе новых серий - получайте уведомления о переводах на свой смартфон!', uk: 'Будьте в курсі нових серій - отримуйте сповіщення про переклади на свій смартфон!', @@ -41380,15 +45857,15 @@ } }); Lampa.Listener.follow('line', function (event) { - if (event.type == 'create' && event.data.ad && !Account.hasPremium() && window.lampa_settings.account_use && !window.lampa_settings.disable_features.ads && Lang.selected(['ru', 'uk', 'be', 'bg']) && !Personal.confirm()) { + if (event.type == 'create' && event.data.ad && !Account$1.hasPremium() && window.lampa_settings.account_use && !window.lampa_settings.disable_features.ads && Lang$1.selected(['ru', 'uk', 'be', 'bg']) && !Personal.confirm()) { var item; if (event.data.ad == 'bot') { item = new BotClass({ card: event.data.results[0], type: event.data.type, - title: Lang.translate('ad_bot_tv_title'), - text: Lang.translate('ad_bot_tv_text'), + title: Lang$1.translate('ad_bot_tv_title'), + text: Lang$1.translate('ad_bot_tv_text'), poster: event.data.results[0].poster_path }); } else { @@ -41411,18 +45888,23 @@ } var AdManager = { - init: init$e + init: init$i }; - function init$d() { + /** + * Инициализирует навигационную панель (только для мобильных устройств) + * @returns {void} + */ + + function init$h() { if (Platform.screen('mobile')) { var bar = Template.get('navigation_bar', {}); bar.find('.navigation-bar__item').on('click', function () { var action = $(this).data('action'); if (action == 'back') Controller.back();else if (action == 'main') { - Activity$1.push({ + Activity.push({ url: '', - title: Lang.translate('title_main') + ' - ' + Storage.field('source').toUpperCase(), + title: Lang$1.translate('title_main') + ' - ' + Storage.field('source').toUpperCase(), component: 'main', source: Storage.field('source') }); @@ -41437,7 +45919,7 @@ } var NavigationBar = { - init: init$d + init: init$h }; function Endless(onRender) { @@ -41522,6 +46004,10 @@ this.draw(0); } + /** + * Скрыть ненужные элементы интерфейса + */ + function hide() { Settings.listener.follow('open', function (e) { if (e.name == 'main') { @@ -41555,8 +46041,13 @@ } }); } + /** + * Инициализация демо режима + * @returns {void} + */ - function init$c() { + + function init$g() { if (window.lampa_settings.demo) { Lampa.Listener.follow('app', function (e) { if (e.type == 'ready') hide(); @@ -41565,20 +46056,24 @@ } var Demo = { - init: init$c + init: init$g }; - var html$1; + var html$3; var tout; var xmlHTTP; - var controll; - var active = {}; + var controll$1; + var active$1 = {}; var graph = []; + /** + * Инициализация теста скорости + * @returns {void} + */ - function init$b() { + function init$f() { Settings.listener.follow('open', function (e) { if (e.name == 'server') { - var btn = $("
\n
".concat(Lang.translate('speedtest_button'), "
\n
")); + var btn = $("
\n
".concat(Lang$1.translate('speedtest_button'), "
\n
")); btn.on('hover:enter', function () { if (Torserver.ip()) { var params = { @@ -41597,21 +46092,32 @@ } }); } + /** + * Запуск теста скорости + * @param {object} params - параметры теста + * @param {string} params.url - URL для теста скорости + * @param {string} [params.login] - логин для авторизации + * @param {string} [params.password] - пароль для авторизации + * @param {function} [params.onEnd] - вызывается по окончании теста + * @param {function} [params.onBack] - вызывается при выходе из теста + * @returns {void} + */ + function start$1(params) { - if (html$1) html$1.remove(); - active = params; - controll = Controller.enabled().name; - html$1 = Template.js('speedtest'); - html$1.append(HeadBackward('', true)); - document.body.append(html$1); - var textpath = Array.from(html$1.querySelectorAll('textpath')); + if (html$3) html$3.remove(); + active$1 = params; + controll$1 = Controller.enabled().name; + html$3 = Template.js('speedtest'); + html$3.append(HeadBackward('', true)); + document.body.append(html$3); + var textpath = Array.from(html$3.querySelectorAll('textpath')); textpath.forEach(function (element) { element.html(element.getAttribute('data-text')); }); - html$1.find('#speedtest_num-text').html('Mbps'); + html$3.find('#speedtest_num-text').html('Mbps'); toggle(); - if (active.url) testUrl(active.url); + if (active$1.url) testUrl(active$1.url); } function speed2deg(v) { @@ -41633,13 +46139,13 @@ function setSpeed(v) { v = parseFloat(v); - html$1.find('#speedtest_num').innerHTML = v < 1 ? v.toFixed(3) : v < 10 ? v.toFixed(2) : v < 100 ? v.toFixed(1) : Math.round(v); + html$3.find('#speedtest_num').innerHTML = v < 1 ? v.toFixed(3) : v < 10 ? v.toFixed(2) : v < 100 ? v.toFixed(1) : Math.round(v); var r = speed2deg(v); - var b = html$1.find('#speedtest_progress'); + var b = html$3.find('#speedtest_progress'); var l = 1256.8; b.style['stroke-dasharray'] = l * r / 360 + ',' + l; b.style.stroke = hslToRgb(330 + r, 80, 45); - html$1.find('#speedtest_graph').setAttribute('points', graph.map(function (pt) { + html$3.find('#speedtest_graph').setAttribute('points', graph.map(function (pt) { return pt.join(','); }).join(' ')); } @@ -41655,7 +46161,7 @@ if (!/\.m3u8?(\?.*)?$/i.test(url)) return testSpeed(url); var errorFn = function errorFn(e) { - html$1.find('#speedtest_status').html(Lang.translate('network_error')); + html$3.find('#speedtest_status').html(Lang$1.translate('network_error')); }; xmlHTTP = new XMLHttpRequest(); @@ -41700,10 +46206,10 @@ function testM3u8Stream(links) { if (links.length === 0) { - return html$1.find('#speedtest_status').html(Lang.translate('network_error')); + return html$3.find('#speedtest_status').html(Lang$1.translate('network_error')); } - var status = html$1.find('#speedtest_status'); + var status = html$3.find('#speedtest_status'); var time; var speed = 0, speedMbps = 0; @@ -41714,7 +46220,7 @@ var startTime; // Время начала всего теста - status.innerHTML = Lang.translate('speedtest_connect'); + status.innerHTML = Lang$1.translate('speedtest_connect'); graph = [[-250, -250]]; setSpeed(0); @@ -41722,10 +46228,10 @@ if (currentSegment >= maxSegments) { // Завершаем тест setSpeed(speedMbps); - status.innerHTML = Lang.translate('speedtest_ready'); + status.innerHTML = Lang$1.translate('speedtest_ready'); - if (typeof active.onEnd === 'function') { - active.onEnd.apply(self, [speedMbps, xmlHTTP]); + if (typeof active$1.onEnd === 'function') { + active$1.onEnd.apply(self, [speedMbps, xmlHTTP]); } return; @@ -41734,7 +46240,7 @@ var segmentUrl = links[currentSegment]; console.log('Speed', 'testM3u8', 'loading segment', currentSegment + 1, '/', maxSegments, segmentUrl); xmlHTTP = new XMLHttpRequest(); - xmlHTTP.open('GET', Utils$2.addUrlComponent(segmentUrl, 'vr=' + Date.now()), true); + xmlHTTP.open('GET', Utils$1.addUrlComponent(segmentUrl, 'vr=' + Date.now()), true); xmlHTTP.responseType = 'arraybuffer'; xmlHTTP.onprogress = function (e) { @@ -41760,7 +46266,7 @@ // Устанавливаем время начала только для первого сегмента time = e.timeStamp; startTime = e.timeStamp; - status.innerHTML = Lang.translate('speedtest_test'); // Общий таймаут на весь тест + status.innerHTML = Lang$1.translate('speedtest_test'); // Общий таймаут на весь тест tout = setTimeout(function () { xmlHTTP.abort(); @@ -41783,10 +46289,10 @@ xmlHTTP.onabort = function (e) { clearTimeout(tout); setSpeed(speedMbps); - status.innerHTML = Lang.translate('speedtest_ready'); + status.innerHTML = Lang$1.translate('speedtest_ready'); - if (typeof active.onEnd === 'function') { - active.onEnd.apply(self, [speedMbps, xmlHTTP]); + if (typeof active$1.onEnd === 'function') { + active$1.onEnd.apply(self, [speedMbps, xmlHTTP]); } }; @@ -41799,16 +46305,16 @@ function testSpeed(url) { var context = this; - var status = html$1.find('#speedtest_status'); + var status = html$3.find('#speedtest_status'); var time; - status.innerHTML = Lang.translate('speedtest_connect'); + status.innerHTML = Lang$1.translate('speedtest_connect'); graph = [[-250, -250]]; var speed = 0, speedMbps = 0; setSpeed(0); xmlHTTP = new XMLHttpRequest(); - xmlHTTP.open('GET', Utils$2.addUrlComponent(url, 'vr=' + new Date() * 1), true); - if (active.login && active.password) xmlHTTP.setRequestHeader("Authorization", "Basic " + Base64.encode(active.login + ":" + active.password)); + xmlHTTP.open('GET', Utils$1.addUrlComponent(url, 'vr=' + new Date() * 1), true); + if (active$1.login && active$1.password) xmlHTTP.setRequestHeader("Authorization", "Basic " + Base64.encode(active$1.login + ":" + active$1.password)); xmlHTTP.responseType = 'arraybuffer'; xmlHTTP.onprogress = function (e) { @@ -41827,7 +46333,7 @@ xmlHTTP.onreadystatechange = function (e) { if (xmlHTTP.readyState === 2) { time = e.timeStamp; - status.innerHTML = Lang.translate('speedtest_test'); + status.innerHTML = Lang$1.translate('speedtest_test'); tout = setTimeout(function () { xmlHTTP.abort(); }, 15e3); @@ -41837,9 +46343,9 @@ var endTest = function endTest(e) { clearTimeout(tout); setSpeed(speedMbps); - status.innerHTML = Lang.translate('speedtest_ready'); + status.innerHTML = Lang$1.translate('speedtest_ready'); time = false; - if (typeof active.onEnd === 'function') active.onEnd.apply(context, [speedMbps, xmlHTTP]); + if (typeof active$1.onEnd === 'function') active$1.onEnd.apply(context, [speedMbps, xmlHTTP]); }; xmlHTTP.onload = endTest; @@ -41853,33 +46359,106 @@ toggle: function toggle() { Controller.clear(); }, - back: close + back: close$1 }); Controller.toggle('speedtest'); } + /** + * Закрыть тест скорости + * @returns {void} + */ - function close() { + + function close$1() { if (xmlHTTP) xmlHTTP.abort(); clearTimeout(tout); - html$1.remove(); - html$1 = false; + html$3.remove(); + html$3 = false; xmlHTTP = false; - if (active.onBack) active.onBack();else Controller.toggle(controll); - active = {}; + if (active$1.onBack) active$1.onBack();else Controller.toggle(controll$1); + active$1 = {}; } var Speedtest = { - init: init$b, - close: close, + init: init$f, + close: close$1, start: start$1 }; - function init$a() { + var html$2, text; + var processing = []; + /** + * Инициализирует слой прогресса обработки + * @returns {void} + */ + + function init$e() { + html$2 = $('
'); + text = html$2.find('.processing__text'); + update(); + } + /** + * Обновляет слой прогресса обработки + * @returns {void} + */ + + + function update() { + if (processing.length) { + text.text(processing.length > 1 ? processing.length : '1 / ' + Math.round(processing[0].percent) + '%'); + var complite = processing.find(function (a) { + return a.percent >= 100; + }); + if (complite) Lampa.Arrays.remove(processing, complite); + requestAnimationFrame(update); + } else html$2.addClass('hide'); + } + /** + * Добавляет процесс обработки + * @param {string} id - уникальный идентификатор процесса + * @param {number} percent - процент выполнения процесса (0-100) + * @returns {void} + */ + + + function push$1(id, percent) { + var find = processing.find(function (a) { + return a.id == id; + }); + + if (!find) { + processing.push({ + id: id, + percent: percent, + start: Date.now() + }); + html$2.removeClass('hide'); + update(); + } else find.percent = percent; + } + /** + * Возвращает HTML слой прогресса обработки + * @param {boolean} [js=false] - возвращать как JS объект или jQuery + * @returns {jQuery|HTMLElement} + */ + + + function render(js) { + return js ? html$2[0] : html$2; + } + + var Processing = { + init: init$e, + push: push$1, + render: render + }; + + function init$d() { if (!window.lampa_settings.iptv) return; var components = ['tmdb', 'plugins']; var titles = ['card_interfice_type']; var params = ['light_version', 'card_interfice_type', 'card_interfice_reactions', 'player_timecode', 'pages_save_total', 'device_name', 'playlist_next', 'background_type', 'card_views_type', 'hide_outside_the_screen', 'card_interfice_cover', 'card_interfice_poster', 'start_page', 'source', 'card_quality', 'card_episodes', 'player']; - Lang.add({ + Lang$1.add({ about_text: { ru: 'Наслаждайтесь любимыми телепередачами, фильмами и спортивными событиями на вашем устройстве с нашим приложением для просмотра IPTV каналов. Наше приложение просто в использовании и позволяет настроить список избранных каналов для быстрого доступа к любимым программам. Просматривайте телевизор в любое время и в любом месте, не пропуская ни одного важного момента благодаря нашему надежному и удобному IPTV приложению.', uk: 'Насолоджуйтесь улюбленими телепередачами, фільмами та спортивними подіями на вашому пристрої з нашим програмою для перегляду IPTV каналів. Наша програма просто у використанні та дозволяє налаштувати список вибраних каналів для швидкого доступу до улюблених програм. Переглядайте телевізор у будь-який час та в будь-якому місці, не пропускаючи жодного важливого моменту завдяки нашому надійному та зручному IPTV додатку.', @@ -41930,7 +46509,7 @@ window.iptvClearFunction(); }, 10); Lampa.Settings.listener.follow('open', window.iptvClearSettingsFunction); - Utils$2.putScript([Utils$2.protocol() + object$2.cub_domain + '/plugin/iptv'], function () { + Utils$1.putScript([Utils$1.protocol() + object$2.cub_domain + '/plugin/iptv'], function () { console.log('IPTV', 'load from lampa', 'complite'); }, function () { console.log('IPTV', 'load from lampa', 'error'); @@ -41940,16 +46519,15 @@ } var Iptv = { - init: init$a + init: init$d }; - // Style to disable hover effects - var noHoverStyle = document.createElement("style"); - noHoverStyle.innerHTML = "* { pointer-events: none !important; }"; - var isKeyboardMode = false; + function init$c() { + var keyboard_mode = false; // Style to disable hover effects + + var style = document.createElement("style"); + style.innerHTML = "* { pointer-events: none !important; }"; // Disable hover on any keyboard event - function init$9() { - // Disable hover on any keyboard event document.addEventListener("keydown", function (event) { var tagName = ''; @@ -41957,33 +46535,38 @@ tagName = event.target.tagName.toLowerCase(); } catch (e) {} - if (!isKeyboardMode && !(tagName == "input" || tagName == "textarea")) { + if (!keyboard_mode && !(tagName == "input" || tagName == "textarea")) { console.log('HoverSwitcher', 'Keyboard moved, disabling pointer events'); - isKeyboardMode = true; - document.head.appendChild(noHoverStyle); - } - }); // Re-enable hover on mouse movement - - document.addEventListener("mousemove", function () { - if (isKeyboardMode) { - console.log('HoverSwitcher', 'Mouse moved, enabling pointer events'); - isKeyboardMode = false; - document.head.removeChild(noHoverStyle); + keyboard_mode = true; + document.head.appendChild(style); } }); + + function mouse() { + if (keyboard_mode) { + console.log('HoverSwitcher', 'Mouse moved, enabling pointer events'); + keyboard_mode = false; + document.head.removeChild(style); + } + } // Re-enable hover on mouse movement or touch + + + document.addEventListener("mousemove", mouse); + document.addEventListener("touchmove", mouse); } var HoverSwitcher = { - init: init$9 + init: init$c }; var errors = 0; + /** + * Инициализация отслеживания ошибок HTTPS запросов + * Если более 5 запросов подряд к домену cub.red завершаются ошибкой статуса 0, + * то в настройках сохраняется протокол http вместо https + */ - function init$8() { - listen(); - } - - function listen() { + function init$b() { Lampa.Listener.follow('request_error', function (e) { if (e.error.status == 0 && e.params.url.indexOf(object$2.cub_domain) >= 0 && Storage.field('protocol') == 'https') { errors++; @@ -41997,9 +46580,25 @@ } var HTTPS = { - init: init$8 + init: init$b }; + /** + * Последовательное выполнение задач + * @param {Array} data - массив данных для обработки + * @property {function(object, function)} onProgress - функция, которая будет вызвана для каждого элемента массива, принимает элемент и функцию next для продолжения + * @property {function()} onComplite - функция, которая будет вызвана по завершении всех задач + * @example + * let task = new Task([1,2,3,4,5]) + * task.onProgress = (item, next)=>{ + * console.log('Process item:', item) + * next() //обязательно вызвать для продолжения + * } + * task.onComplite = ()=>{ + * console.log('All items processed') + * } + * task.start() //начать выполнение + */ function Task$1(data) { this.data = data; this.work = 0; @@ -42033,6 +46632,12 @@ function secondary(call) { secondary_calls.push(call); } + /** + * Запуск очереди загрузки + * 1. Выполняет задачи из очереди queue_calls последовательно + * 2. После завершения всех задач из очереди queue_calls выполняет задачи из очереди secondary_calls параллельно + */ + function start() { var task = new Task$1(queue_calls); @@ -42067,7 +46672,7 @@ start: start }; - function init$7() { + function init$a() { var loader; var waite; SettingsApi.addParam({ @@ -42086,7 +46691,7 @@ type: 'button' }, field: { - name: Lang.translate('settings_cub_backup_export') + name: Lang$1.translate('settings_cub_backup_export') }, onChange: function onChange() { if (waite) return; @@ -42095,12 +46700,12 @@ push().then(function (code) { Modal.open({ title: '', - html: $('
' + Lang.translate('account_export_secuses') + ': ' + code + '
'), + html: $('
' + Lang$1.translate('account_export_secuses') + ': ' + code + '
'), size: 'small', onBack: closeModal }); })["catch"](function (code) { - Noty.show(Lang.translate('account_export_fail' + (code && typeof code == 'number' ? '_' + code : ''))); + Noty.show(Lang$1.translate('account_export_fail' + (code && typeof code == 'number' ? '_' + code : ''))); })["finally"](function () { waite = false; loader.addClass('hide'); @@ -42117,7 +46722,7 @@ function terminalDrawCode() { if (!terminal_elem) return; terminal_code = Storage.get('terminal_access', ''); - terminal_elem.find('.settings-param__descr').text(terminal_code ? Lang.translate('terminal_code') + ': ' + terminal_code : Lang.translate('terminal_no_access')); + terminal_elem.find('.settings-param__descr').text(terminal_code ? Lang$1.translate('terminal_code') + ': ' + terminal_code : Lang$1.translate('terminal_no_access')); } function terminalWriteCode(code) { @@ -42133,22 +46738,22 @@ type: 'button' }, field: { - name: Lang.translate('terminal_title'), - description: Lang.translate('terminal_no_access') + name: Lang$1.translate('terminal_title'), + description: Lang$1.translate('terminal_no_access') }, onChange: function onChange(a, b, c) { Modal.open({ title: '', - html: $('
' + Lang.translate('terminal_text') + '
'), + html: $('
' + Lang$1.translate('terminal_text') + '
'), size: 'medium', buttons: [{ - name: Lang.translate(terminal_code ? 'terminal_update' : 'terminal_confirm'), + name: Lang$1.translate(terminal_code ? 'terminal_update' : 'terminal_confirm'), onSelect: function onSelect() { closeModal(); terminalWriteCode(Math.floor(100000 + Math.random() * 900000).toString()); } }, { - name: Lang.translate('terminal_deny'), + name: Lang$1.translate('terminal_deny'), onSelect: function onSelect() { closeModal(); terminalWriteCode(''); @@ -42195,7 +46800,7 @@ var formData = new FormData($('
')[0]); formData.append("file", file, "lampa_logs.json"); $.ajax({ - url: Utils$2.protocol() + object$2.cub_domain + '/api/lampa/logs/write', + url: Utils$1.protocol() + object$2.cub_domain + '/api/lampa/logs/write', type: 'POST', data: formData, async: true, @@ -42216,12 +46821,322 @@ } var Logs = { - init: init$7 + init: init$a }; - var torrent_net = new create$e(); + var html$1; + var controll; + var active = {}; + /** + * Открыть менеджер хранилища + * @param {object} [params] - параметры + * @param {function} [params.onBack] - вызывается при выходе из менеджера + * @returns {void} + */ - function init$6() { + function open() { + var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + active = params; + controll = Controller.enabled().name; + html$1 = $('
'); + var keys = Object.keys(localStorage); + var hide = ['parental_', 'vast_', 'account_']; + + if (window.lampa_settings.hide_important_params) { + keys = keys.filter(function (key) { + return !hide.find(function (h) { + return key.indexOf(h) == 0; + }); + }); + } + + keys.sort(function (a, b) { + return a.localeCompare(b); + }); + keys.forEach(function (key) { + var value = Utils$1.shortText(localStorage.getItem(key), 50); // Не показывать метки времени + + if (parseInt(value) > 0 && (value + '').length == 13) return; + var line = $('
' + key + ' ' + value + '
'); + line.on('hover:enter', function () { + Select.show({ + title: key, + items: [{ + title: Lang$1.translate('settings_remove'), + action: 'delete' + }], + onSelect: function onSelect(selected) { + Controller.toggle('modal'); + + if (selected.action == 'delete') { + localStorage.removeItem(key); + line.remove(); + } + }, + onBack: function onBack() { + Controller.toggle('modal'); + } + }); + }); + html$1.append(line); + }); + Modal.open({ + title: 'StorageManager', + size: 'large', + html: html$1, + onBack: close + }); + } + + function close() { + html$1.remove(); + Modal.close(); + if (active.onBack) active.onBack();else Controller.toggle(controll); + active = {}; + } + + var StorageMenager = { + close: close, + open: open + }; + + var component = 'data'; + var icon$1 = "\n \n \n"; + + function init$9() { + SettingsApi.addComponent({ + component: component, + icon: icon$1, + name: Lang$1.translate('settings_rest_cache_all'), + after: 'parental_control' + }); + var status; + SettingsApi.addParam({ + component: component, + param: { + type: 'button' + }, + field: { + name: Lampa.Lang.translate('settings_rest_cache_calculate') + }, + onRender: function onRender(item) { + status = $("
"); + item.append(status); + }, + onChange: function onChange(a, b) { + status.removeClass('hide'); + Storage.getsize(function (size) { + status.text(Lang$1.translate('title_left') + ' - ' + Utils$1.bytesToSize(size)); + }); + } + }); + SettingsApi.addParam({ + component: component, + param: { + type: 'title' + }, + field: { + name: Lampa.Lang.translate('more') + } + }); + SettingsApi.addParam({ + component: component, + param: { + type: 'button' + }, + field: { + name: Lampa.Lang.translate('extensions_edit') + }, + onChange: function onChange() { + StorageMenager.open({ + onBack: function onBack() { + Controller.toggle('settings_component'); + } + }); + } + }); + SettingsApi.addParam({ + component: component, + param: { + type: 'button' + }, + field: { + name: Lampa.Lang.translate('fav_clear_title') + }, + onChange: function onChange() { + Favorite.clear('history'); + Noty.show(Lang$1.translate('torrent_error_made')); + } + }); + SettingsApi.addParam({ + component: component, + param: { + type: 'button' + }, + field: { + name: Lampa.Lang.translate('settings_rest_cache') + }, + onChange: function onChange() { + Select.show({ + title: Lang$1.translate('settings_rest_cache'), + items: [{ + title: Lang$1.translate('settings_rest_cache_only'), + subtitle: Lang$1.translate('settings_rest_cache_only_descr') + }, { + title: Lang$1.translate('settings_rest_cache_all'), + subtitle: Lang$1.translate('settings_rest_cache_all_descr'), + full: true + }], + onSelect: function onSelect(a) { + Controller.toggle('settings_component'); + Storage.clear(a.full); + Cache.clearAll(); + }, + onBack: function onBack() { + Controller.toggle('settings_component'); + } + }); + } + }); + } + + var DataBase = { + init: init$9 + }; + + var EmptyMap = { + Ai: Ai, + Simple: Simple, + Router: Router + }; + + var Helper = new Mask(Arrays.getKeys(EmptyMap)); + Helper.MASK.base = Helper.only('Simple'); + + var classes = { + Card: Card$3, + Main: Full$1, + Category: Full, + Line: Line$5, + Company: Company, + Discuss: Discuss, + Episode: Episode, + Person: Person, + Register: Register, + Season: Season, + CardParser: CardParser, + Empty: Empty + }; + var modules = { + Card: Helper$9, + Main: Helper$8, + Category: Helper$5, + Line: Helper$b, + Company: Helper$4, + Discuss: Helper$6, + Episode: Helper$a, + Person: Helper$7, + Register: Helper$3, + Season: Helper$2, + Empty: Helper + }; + var maps = { + Card: CardMap, + Episode: EpisodeMap, + Main: MainMap, + Category: CategoryMap, + Line: LineMap, + Company: CompanyMap, + Discuss: DiscussMap, + Person: PersonMap, + Register: RegisterMap, + Season: SeasonMap, + Empty: EmptyMap + }; + + var None = /*#__PURE__*/function (_Constructor) { + _inherits(None, _Constructor); + + var _super = _createSuper(None); + + function None() { + _classCallCheck(this, None); + + return _super.apply(this, arguments); + } + + return None; + }(Constructor({})); + + function make(class_name) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var createModule = arguments.length > 2 ? arguments[2] : undefined; + var createName = get(class_name, data, createModule); + var createClass = new createName(data); + + if (data.params.emit && _typeof(data.params.emit) == 'object' && typeof createClass.use == 'function') { + createClass.use(data.params.emit); + + if (typeof data.params.emit.onInit == 'function') { + data.params.emit.onInit(createClass); + } + } + + return createClass; + } + + function get(class_name) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var createModule = arguments.length > 2 ? arguments[2] : undefined; + + if (typeof classes[class_name] == 'undefined') { + console.log('Maker', 'error', 'no class', class_name); + return None; + } else { + Arrays.extend(data, { + params: {} + }); + + if (typeof createModule !== 'undefined') { + if (typeof modules[class_name] !== 'undefined') { + data.params.module = createModule(modules[class_name]); + } + } + + return classes[class_name]; + } + } + + function module$1(class_name) { + if (typeof modules[class_name] !== 'undefined') return modules[class_name]; + console.log('Maker', 'error', 'no module', class_name); + return new Mask([]); + } + + function map(class_name) { + if (typeof maps[class_name] == 'undefined') return {}; + return maps[class_name]; + } + + function list() { + return Object.keys(classes); + } + + var Maker = { + get: get, + make: make, + module: module$1, + list: list, + map: map + }; + + var torrent_net = new Request(); + /** + * Инициализация работы с локальным торрент сервером, проверка доступности и настройка + * @returns {void} + */ + + function init$8() { Storage.listener.follow('change', function (e) { if (e.name == 'torrserver_url') check(e.name); if (e.name == 'torrserver_url_two') check(e.name); @@ -42232,11 +47147,10 @@ var name = Storage.field('torrserver_use_link') == 'one' ? 'torrserver_url' : 'torrserver_url_two'; check(name); - if (Lang.selected(['ru', 'be', 'uk']) && !Personal.confirm()) { - var ad = $("\n
\n
\n \u041D\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044F \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443?
tsarea.tv \u2014 \u0433\u043E\u0442\u043E\u0432\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u0431\u0435\u0437 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n
\n \n
\n "); - var im = ad.find('img'); - Utils$2.imgLoad(im[0], 'https://i.ibb.co/fVVYWnV2/qr-code-6.png', function () { - im.css('opacity', 1); + if (Lang$1.selected(['ru', 'be', 'uk']) && !Personal.confirm()) { + var ad = $("\n
\n
\n \u041D\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044F \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443?
tsarea.tv \u2014 \u0433\u043E\u0442\u043E\u0432\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442 \u0431\u0435\u0437 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n
\n \n
\n "); + Utils$1.imgLoad(ad.find('img'), 'https://i.ibb.co/fVVYWnV2/qr-code-6.png', function (im) { + im.style.opacity = 1; }); $('[data-name="torrserver_use_link"]', e.body).after(ad); } @@ -42262,12 +47176,12 @@ }; } - torrent_net["native"](Utils$2.checkEmptyUrl(Storage.get(name)), function () { + torrent_net["native"](Utils$1.checkEmptyUrl(Storage.get(name)), function () { item.removeClass('wait').addClass('active'); }, function (a, c) { if (a.status == 401) { item.removeClass('wait').addClass('active'); - Noty.show(Lang.translate('torrent_error_check_no_auth') + ' - ' + url, { + Noty.show(Lang$1.translate('torrent_error_check_no_auth') + ' - ' + url, { time: 5000 }); } else { @@ -42280,23 +47194,33 @@ } } - var OtherTorserver = { - init: init$6 + var ServiceTorserver = { + init: init$8 }; - function init$5() { + /** + * Инициализация отправки информации о просмотренных фильмах/сериалах на сервер, для обновления популярности + * @returns {void} + */ + + function init$7() { Favorite.listener.follow('add,added', function (e) { if (e.where == 'history' && e.card.id) { - $.get(Utils$2.protocol() + 'tmdb.' + object$2.cub_domain + '/watch?id=' + e.card.id + '&cat=' + (e.card.original_name ? 'tv' : 'movie')); + $.get(Utils$1.protocol() + 'tmdb.' + object$2.cub_domain + '/watch?id=' + e.card.id + '&cat=' + (e.card.original_name ? 'tv' : 'movie')); } }); } - var OtherWatched = { - init: init$5 + var ServiceWatched = { + init: init$7 }; - function init$4() { + /** + * Инициализация дополнительных настроек + * @returns {void} + */ + + function init$6() { Settings.listener.follow('open', function (e) { if (e.name == 'more' && window.location.protocol == 'https:') { $('[data-name="protocol"]', e.body).remove(); @@ -42305,29 +47229,20 @@ if (e.name == 'interface' && window.lampa_settings.lang_use) { $('.settings-param:eq(0)', e.body).on('hover:enter', function () { LangChoice.open(function (code) { - Modal.open({ - title: '', - html: $('
' + Lang.translate('settings_interface_lang_reload') + '
'), - onBack: function onBack() { - window.location.reload(); - }, - onSelect: function onSelect() { - window.location.reload(); - } - }); Storage.set('language', code, true); Storage.set('tmdb_lang', code, true); + window.location.reload(); }, function () { Controller.toggle('settings_component'); }); - }).find('.settings-param__value').text(Lang.translate(Lang.codes()[Storage.get('language', 'ru')])); + }).find('.settings-param__value').text(Lang$1.translate(Lang$1.codes()[Storage.get('language', 'ru')])); } if (e.name == 'main' && Platform.is('apple_tv')) { var append = e.body.find('.appletv-setting'); if (!append.length) { - append = $("
\n
\n \n
\n
".concat(Lang.translate('menu_settings'), "
\n
")); + append = $("
\n
\n \n
\n
".concat(Lang$1.translate('menu_settings'), "
\n
")); e.body.find('.scroll__body > div').append(append); } @@ -42338,107 +47253,137 @@ }); } - var OtherSettings = { + var ServiceSettings = { + init: init$6 + }; + + /** + * Инициализация дополнительных библиотек + * @returns {void} + */ + + function init$5() { + var video_libs = ['hls/hls.js', 'dash/dash.js']; + video_libs = video_libs.map(function (lib) { + return window.location.protocol == 'file:' ? object$2.github_lampa + 'vender/' + lib : './vender/' + lib; + }); + Utils$1.putScript(video_libs, function () {}); + if (window.youtube_lazy_load) Utils$1.putScript([Utils$1.protocol() + 'youtube.com/iframe_api'], function () {}); + Utils$1.putScript([Utils$1.protocol() + 'cdn.' + object$2.cub_domain + '/qrcode.js'], function () {}); + + if (!window.lampa_settings.iptv) { + Utils$1.putScript([Utils$1.protocol() + object$2.cub_domain + '/plugin/sport'], function () {}); + } + } + + var ServiceLibs = { + init: init$5 + }; + + var open_about = false; + var press_button = 0; + var buttons = ['enabled', 'nopremium', 'nodemo', 'ads', 'fps']; + var icon = "\n\n\n\n\n\n\n"; + + function init$4() { + Modal.listener.follow('toggle', function (e) { + open_about = e.active.about; + + if (e.active.about) { + e.html.find('.modal__body').on('click', function (e) { + if (DeviceInput.canClick(e.originalEvent)) press(); + }); + } + }); + Modal.listener.follow('preshow,close', function (e) { + open_about = false; + press_button = 0; + }); + Keypad.listener.follow('enter', press); + Storage.listener.follow('change', function (e) { + if (e.name == 'developer_nodemo') Storage.set('remove_white_and_demo', e.value, true); + }); + if (Storage.get('developer_enabled', 'false')) activate(); + } + + function press() { + if (!open_about || window.lampa_settings.developer.enabled) return; + press_button++; + + if (press_button == 10) { + Bell.push({ + text: Lang$1.translate('developer_trigger_help_1'), + icon: icon + }); + } else if (press_button == 20) { + Bell.push({ + text: Lang$1.translate('developer_trigger_help_2'), + icon: icon + }); + } else if (press_button == 30) { + Bell.push({ + text: Lang$1.translate('developer_trigger_help_3'), + icon: icon + }); + } else if (press_button == 40) { + Storage.set('developer_enabled', 'true'); + activate(); + Bell.push({ + text: Lang$1.translate('developer_trigger_help_4'), + icon: icon + }); + } + } + + function params() { + var component = 'developer'; + SettingsApi.addComponent({ + component: component, + icon: icon, + name: Lang$1.translate('title_developer') + }); + var display = Arrays.clone(buttons); + + if (!Account$1.hasPremium()) { + Arrays.remove(display, 'ads'); + } + + display.forEach(function (name) { + Lampa.SettingsApi.addParam({ + component: component, + param: { + name: 'developer_' + name, + type: 'trigger', + "default": false + }, + field: { + name: Lampa.Lang.translate('developer_param_' + name) + }, + onChange: function onChange(e) { + window.lampa_settings.developer[name] = Storage.get('developer_' + name, 'false'); + } + }); + }); + } + + function activate() { + buttons.forEach(function (name) { + window.lampa_settings.developer[name] = Storage.get('developer_' + name, 'false'); + }); + SettingsApi.removeComponent('developer'); + if (window.lampa_settings.developer.enabled) params(); + } + + var ServiceDeveloper = { init: init$4 }; + /** + * Инициализация быстрого доступа к закладкам через цветные кнопки пульта + * @returns {void} + */ + function init$3() { - var video_libs = ['hls/hls.js', 'dash/dash.js']; - video_libs = video_libs.map(function (lib) { - return window.location.protocol == 'file:' ? (window.lampa_settings.fix_widget ? object$2.cdn_url : object$2.github_lampa) + 'vender/' + lib : './vender/' + lib; - }); - Utils$2.putScript(video_libs, function () {}); - if (window.youtube_lazy_load) Utils$2.putScript([Utils$2.protocol() + 'youtube.com/iframe_api'], function () {}); - - if (!window.lampa_settings.iptv) { - Utils$2.putScript([Utils$2.protocol() + object$2.cub_domain + '/plugin/sport'], function () {}); - } - - if (VPN.code() == 'ru') { - Utils$2.putScript([Utils$2.protocol() + 'plugin.rootu.top/rutube.js'], function () {}); - } - } - - var OtherLibs = { - init: init$3 - }; - - function init$2() { - /** Start - активация режима GOD, жмем 🠔🠔 🠕🠕 🠖🠖 🠗🠗 */ - var mask = [37, 37, 38, 38, 39, 39, 40, 40], - psdg = -1; - Keypad.listener.follow('keydown', function (e) { - if (e.code == 37 && psdg < 0) { - psdg = 0; - } - - if (psdg >= 0 && mask[psdg] == e.code) psdg++;else psdg = -1; - - if (psdg == 8) { - psdg = -1; - console.log('God', 'enabled'); - Bell.push({ - text: 'God mode activated' - }); - Mirrors.test(function () { - Bell.push({ - text: 'Mirrors test complite' - }); - }); - Account.test(function () { - Bell.push({ - text: 'Account test complite' - }); - }); - window.god_enabled = true; - } - }); - /** Start - активация полной лампы, жмем 🠔🠔 🠕🠕 🠔🠔 🠕🠕 */ - - var mask_full = [37, 37, 38, 38, 37, 37, 38, 38], - psdg_full = -1; - Keypad.listener.follow('keydown', function (e) { - if (e.code == 37 && psdg_full < 0) { - psdg_full = 0; - } - - if (psdg_full >= 0 && mask_full[psdg_full] == e.code) psdg_full++;else psdg_full = -1; - - if (psdg_full == 8) { - psdg_full = -1; - Bell.push({ - text: 'Full enabled' - }); - window.localStorage.setItem('remove_white_and_demo', 'true'); - var controller = Controller.enabled().name; - Modal.open({ - title: '', - align: 'center', - zIndex: 300, - html: $('
' + Lang.translate('settings_interface_lang_reload') + '
'), - buttons: [{ - name: Lang.translate('settings_param_no'), - onSelect: function onSelect() { - Modal.close(); - Controller.toggle(controller); - } - }, { - name: Lang.translate('settings_param_yes'), - onSelect: function onSelect() { - window.location.reload(); - } - }] - }); - } - }); - } - - var OtherGOD = { - init: init$2 - }; - - function init$1() { - /** Быстрый доступ к закладкам через кнопки */ var color_keys = { '406': 'history', '405': 'wath', @@ -42449,9 +47394,9 @@ if (!Player.opened()) { if (color_keys[e.code]) { var type = color_keys[e.code]; - Activity$1.push({ + Activity.push({ url: '', - title: type == 'book' ? Lang.translate('title_book') : type == 'like' ? Lang.translate('title_like') : type == 'history' ? Lang.translate('title_history') : Lang.translate('title_wath'), + title: type == 'book' ? Lang$1.translate('title_book') : type == 'like' ? Lang$1.translate('title_like') : type == 'history' ? Lang$1.translate('title_history') : Lang$1.translate('title_wath'), component: 'favorite', type: type, page: 1 @@ -42461,46 +47406,163 @@ }); } - var OtherRemoteFavorites = { + var ServiceRemoteFavorites = { + init: init$3 + }; + + /** + * Инициализация DMCA, блокировка карточек к показу по требованию правообладателей + * @returns {void} + */ + + function init$2() { + if (!window.lampa_settings.disable_features.dmca) { + Lampa.Network.silent(Utils$1.protocol() + 'tmdb.' + object$2.cub_domain + '/blocked', function (dcma) { + window.lampa_settings.dcma = dcma; + }); + } + } + + var ServiceDMCA = { + init: init$2 + }; + + function init$1() { + var counter = Template.elem('div', { + "class": 'head__fps-counter' + }); + var canvas = Template.elem('canvas', { + "class": 'head__fps-graph' + }); + var ctx = canvas.getContext("2d"); + var html = Template.elem('div', { + "class": 'head__fps', + children: [canvas, counter] + }); + var last_time = typeof performance !== 'undefined' ? performance.now() : Date.now(); + var fps = 0; + var smoothing = 0.8; + var history = []; + var max_history = 0; + + function updateFPS(now) { + var delta = now - last_time; + last_time = now; + var current_fps = 1000 / delta; + fps = fps * smoothing + current_fps * (1 - smoothing); + counter.textContent = fps.toFixed(1); // Добавляем FPS в историю + + history.push(fps); + if (history.length > max_history) history.shift(); + drawGraph(); + if (window.lampa_settings.developer.fps) requestAnimationFrame(updateFPS); + } + + function drawGraph() { + var w = canvas.width; + var h = canvas.height; + var m = 60; // Ищем максимальный FPS в истории для масштабирования + + history.forEach(function (v) { + m = Math.max(m, v); + }); // небольшой запас сверху + + m += m * 0.2; // Масштаб по вертикали + + var scale = h / m; + ctx.clearRect(0, 0, w, h); + var gradient = ctx.createLinearGradient(0, 0, 0, h); + gradient.addColorStop(0, "rgba(0,255,0,0.4)"); + gradient.addColorStop(1, "rgba(0,255,0,0)"); + ctx.beginPath(); + + for (var i = 0; i < history.length; i++) { + var y = h - history[i] * scale; + if (i === 0) ctx.moveTo(i, y);else ctx.lineTo(i, y); + } // Замыкаем форму до низа графика + + + ctx.lineTo(history.length, h); + ctx.lineTo(0, h); + ctx.closePath(); // Заливка + + ctx.fillStyle = gradient; + ctx.fill(); // Контур линии FPS + + ctx.beginPath(); + + for (var _i = 0; _i < history.length; _i++) { + var _y = h - history[_i] * scale; + + if (_i === 0) ctx.moveTo(_i, _y);else ctx.lineTo(_i, _y); + } + + ctx.strokeStyle = "#0f0"; + ctx.lineWidth = 1.5; + ctx.stroke(); + } + + function start() { + Head.render(true).find('.head__title').after(html); + canvas.width = $(canvas).width(); + canvas.height = $(canvas).height(); + history = []; + max_history = canvas.width; + requestAnimationFrame(updateFPS); + } + + Storage.listener.follow('change', function (e) { + if (e.name === 'developer_fps') { + if (e.value == 'true') start();else { + html.remove(); + } + } + }); + if (window.lampa_settings.developer.fps) start(); + } + + var ServiceFPS = { init: init$1 }; + var events = [{ + start: '10-25T00:00:00', + end: '10-31T23:59:00', + name: 'halloween' + }]; + function init() { - /** Обновление состояния карточек каждые 5 минут */ - var last_card_update = Date.now(); + events.forEach(function (event) { + var now = new Date().getTime(); + var year = new Date().getFullYear(); + var start_time = new Date(year + '-' + event.start).getTime(); + var end_time = new Date(year + '-' + event.end).getTime(); - var lets_card_update = function lets_card_update() { - if (last_card_update < Date.now() - 1000 * 60 * 5) { - last_card_update = Date.now(); - Activity$1.renderLayers(true).forEach(function (layer) { - var cards = Array.from(layer.querySelectorAll('.card')); - cards.forEach(function (card) { - Utils$2.trigger(card, 'update'); - }); - }); + if (end_time < start_time) { + end_time = new Date(year + 1 + '-' + event.end).getTime(); } - }; - setInterval(function () { - if (!Player.opened()) lets_card_update(); - }, 1000 * 60); - Player.listener.follow('destroy', function () { - setTimeout(lets_card_update, 1000); + event.start_time = start_time; + event.end_time = end_time; + event.enabled = start_time < now && now < end_time; }); - Lampa.Listener.follow('activity', function (e) { - if (e.type == 'archive' && e.object.activity) { - var cards = Array.from(e.object.activity.render(true).querySelectorAll('.card.focus')); - cards.forEach(function (card) { - Utils$2.trigger(card, 'update'); - }); - } + var enabled = events.filter(function (e) { + return e.enabled; }); + + if (enabled.length) { + Utils$1.putScript(enabled.map(function (e) { + return Utils$1.protocol() + object$2.cub_domain + '/plugin/' + e.name; + }), function () {}); + } } - var OtherCards = { + var ServiceEvents = { init: init }; + window.screen_width = window.innerWidth; + window.screen_height = window.innerHeight; /** * Настройки приложения */ @@ -42511,46 +47573,80 @@ var torrents_use = true; var agent = navigator.userAgent.toLowerCase(); - var conditions = [agent.indexOf("ipad") > -1 && window.innerWidth == 1920 && window.innerHeight == 1080, agent.indexOf("lampa_client_yasha") > -1, typeof AndroidJS !== 'undefined' && (AndroidJS.appVersion() + '').toLowerCase().indexOf('rustore') > -1 && !localStorage.getItem('parser_use')]; + var conditions = [agent.indexOf("ipad") > -1 && window.innerWidth == 1920 && window.innerHeight == 1080, agent.indexOf("lampa_client_yasha") > -1, typeof AndroidJS !== 'undefined' && (AndroidJS.appVersion() + '').toLowerCase().indexOf('rustore') > -1 && !localStorage.getItem('parser_use')]; // Если есть условия из списка, то отключаем торренты, дабы пройти модерацию в сторе + if (conditions.indexOf(true) >= 0) torrents_use = false; Arrays.extend(window.lampa_settings, { + // Использовать сокеты для синхронизации данных socket_use: true, + // Адрес сокета, по умолчанию лампа берет адреса из манифеста socket_url: undefined, + // Обрабатывать сообщения сокетов socket_methods: true, + // Использовать аккаунты CUB account_use: true, + // Синхронизировать закладки, таймкоды и прочее account_sync: true, + // Разрешить установку плагинов и расширений plugins_use: true, + // Разрешить использование магазина расширений plugins_store: true, + // Показывать кнопку торрентов torrents_use: torrents_use, - white_use: false, + // Отключить фитчи куба и лампы disable_features: { + // Блокировку карточек dmca: false, + // Реакции reactions: false, + // Обсуждения discuss: false, + // ИИ ai: false, + // Подписка на уведомления subscribe: false, + // Черный список плагинов blacklist: false, + // Подписка на актеров persons: false, + // Вспомогатиленые сервисы на подписку према ads: false, + // Трейлеры trailers: false, + // Установка прокси для запросов install_proxy: false }, + // Подключить другие языки интерфейса, по умолчанию только русский и английский lang_use: true, + // Белая и пушистая лампа, для одобрения модерации + white_use: false, + // Режим только для чтения, без кнопок онлайн и расширений read_only: false, + // Добавить список блокировки карточек, пример: [{"id":3566556,"cat":"movie"},...] dcma: false, + // Добавлять в адресную строку название текущего экрана push_state: true, + // Является ли приложение IPTV iptv: false, - feed: true - }); + // Показать ленту + feed: true, + // Режим разработчика + developer: { + enabled: false + }, + // Размывать постер для мобильных устройств, эффект стекла + blur_poster: true, + // Скрывать важные параметры в приложении + hide_important_params: true, + // Фикс для виджетов, чтобы не подгружались стили с github + fix_widget: window.localStorage.getItem('fix_widget') ? true : false + }); // Если отключили if (window.localStorage.getItem('remove_white_and_demo')) { window.lampa_settings.demo = false; window.lampa_settings.white_use = false; - } + } // Если IPTV, то отключаем все лишнее - if (window.localStorage.getItem('fix_widget')) { - window.lampa_settings.fix_widget = true; - } if (window.lampa_settings.iptv) { window.lampa_settings.socket_use = false; @@ -42566,14 +47662,14 @@ function initClass() { window.Lampa = { - Listener: start$8(), - Lang: Lang, - Subscribe: start$8, + Listener: Subscribe$2(), + Lang: Lang$1, + Subscribe: Subscribe$2, Storage: Storage, Platform: Platform, - Utils: Utils$2, + Utils: Utils$1, Params: Params, - Menu: Menu, + Menu: Menu$1, Head: Head, Notice: Notice$1, NoticeClass: NoticeClass, @@ -42582,15 +47678,15 @@ Favorite: Favorite, Select: Select, Controller: Controller, - Activity: Activity$1, + Activity: Activity, Keypad: Keypad, Template: Template, Component: Component, - Reguest: create$e, - Filter: create$5, - Files: create$1, - Explorer: Explorer, - Scroll: create$f, + Reguest: Request, + Filter: Filter, + Files: create$3, + Explorer: Explorer$1, + Scroll: Scroll, Empty: Empty, Arrays: Arrays, Noty: Noty, @@ -42600,27 +47696,26 @@ PlayerPanel: PlayerPanel, PlayerIPTV: PlayerIPTV, PlayerPlaylist: PlayerPlaylist, - Timeline: Timeline$1, + Timeline: Timeline, Modal: Modal, Api: Api, Settings: Settings, SettingsApi: SettingsApi, Android: Android, Card: Card, - Info: create, - Account: Account, + Info: create$2, + Account: Account$1, Socket: Socket, Input: Input, Screensaver: Screensaver$2, Recomends: Recomends, - VideoQuality: VideoQuality, TimeTable: TimeTable, Broadcast: Broadcast, - Helper: Helper, - InteractionMain: component, - InteractionCategory: component$i, - InteractionLine: create$i, - Status: status$2, + Helper: Helper$1, + InteractionMain: component$2, + InteractionCategory: component$1, + InteractionLine: create$1, + Status: Status, Plugins: Plugins, Extensions: Extensions, Tizen: Tizen, @@ -42631,7 +47726,7 @@ Manifest: object$2, TMDB: TMDB$1, Base64: Base64, - Loading: Loading, + Loading: Loading$1, YouTube: YouTube, WebOSLauncher: WebOSLauncher, Event: Event, @@ -42650,7 +47745,15 @@ ParentalControl: ParentalControl, VPN: VPN, Bell: Bell, - StorageMenager: StorageMenager + StorageMenager: StorageMenager, + RemoteHelper: RemoteHelper, + Network: new Request(), + Maker: Maker, + MaskHelper: Mask, + ContentRows: ContentRows, + Emit: Emit, + Router: router, + Timer: Timer }; } /** @@ -42661,11 +47764,11 @@ function prepareApp() { if (window.prepared_app) return; LoadingProgress.init(); - $('body').append(Noty.render()); - DeviceInput.init(); - LoadingProgress.status('DeviceInput init'); + document.body.append(Noty.render()); Platform.init(); LoadingProgress.status('Platform init'); + DeviceInput.init(); + LoadingProgress.status('DeviceInput init'); Params.init(); LoadingProgress.status('Params init'); Controller.observe(); @@ -42676,17 +47779,17 @@ LoadingProgress.status('Keypad init'); Layer.init(); LoadingProgress.status('Layer init'); - HoverSwitcher.init(); //передаем фокус в контроллер + HoverSwitcher.init(); // Передаем фокус в контроллер Navigator.follow('focus', function (event) { Controller.focus(event.elem); - }); //выход в начальном скрине + }); // Выход в начальном скрине Keypad.listener.follow('keydown', function (e) { if (window.appready || Controller.enabled().name == 'modal' || Platform.is('browser') || Platform.desktop()) return; if (e.code == 8 || e.code == 27 || e.code == 461 || e.code == 10009 || e.code == 88) App.modalClose(); }); - LoadingProgress.status('Subscribe on keydown'); //отключаем правый клик + LoadingProgress.status('Subscribe on keydown'); // Отключаем правый клик if (window.innerWidth > 1280) window.addEventListener("contextmenu", function (e) { return e.preventDefault(); @@ -42727,7 +47830,7 @@ var keydown = function keydown(event) { if (expect) { - if (event.keyCode === 38 || event.keyCode === 29460 || event.keyCode === 50400012) check(); + if (event.keyCode == 38 || event.keyCode == 29460 || event.keyCode == 50400012) check(); } else { document.removeEventListener('keydown', keydown); } @@ -42748,35 +47851,37 @@ if (window.appready) return; window.app_time_launch = Date.now(); - window.app_time_end = 0; //стартуем + window.app_time_end = 0; // Стартуем LoadingProgress.status('Launching the application'); Lampa.Listener.send('app', { type: 'start' - }); //инициализируем классы + }); // Инициализируем классы + Timer.init(); Storage.init(); + Timeline.init(); HTTPS.init(); Mirrors.init(); Personal.init(); + Head.init(); Settings.init(); Select.init(); Favorite.init(); Background.init(); - Head.init(); Markers.init(); Notice$1.init(); Bell.init(); - Menu.init(); - Activity$1.init(); + Menu$1.init(); + Activity.init(); Screensaver$2.init(); Socket.init(); - Account.init(); + Account$1.init(); Extensions.init(); Plugins.init(); Recomends.init(); TimeTable.init(); - Helper.init(); + Helper$1.init(); Tizen.init(); Player.init(); Iframe.init(); @@ -42792,27 +47897,31 @@ Android.init(); Sound$1.init(); Iptv.init(); - Logs.init(); //добавляем источники поиска + Logs.init(); + Broadcast.init(); + Search.init(); + DataBase.init(); // Добавляем источники поиска - if (window.lampa_settings.account_use && !window.lampa_settings.disable_features.ai) Search.addSource(Ai.discovery()); - LoadingProgress.status('Initialization successful'); //выводим информацию о приложении + if (window.lampa_settings.account_use && !window.lampa_settings.disable_features.ai) Search.addSource(Ai$1.discovery()); + LoadingProgress.status('Initialization successful'); // Выводим информацию о приложении var ratio = window.devicePixelRatio || 1; console.log('App', 'screen size:', Math.round(window.innerWidth * ratio) + ' / ' + Math.round(window.innerHeight * ratio)); console.log('App', 'interface size:', window.innerWidth + ' / ' + window.innerHeight); console.log('App', 'pixel ratio:', window.devicePixelRatio); console.log('App', 'user agent:', navigator.userAgent); + console.log('App', 'touch points:', navigator.maxTouchPoints); console.log('App', 'is tv:', Platform.screen('tv')); console.log('App', 'is mobile:', Platform.screen('mobile')); - console.log('App', 'is touch:', Utils$2.isTouchDevice()); - console.log('App', 'is PWA:', Utils$2.isPWA()); + console.log('App', 'is touch:', Utils$1.isTouchDevice()); + console.log('App', 'is PWA:', Utils$1.isPWA()); console.log('App', 'platform:', Storage.get('platform', 'noname')); - console.log('App', 'version:', object$2.app_version); //записываем uid + console.log('App', 'version:', object$2.app_version); // Записываем uid - if (!Storage.get('lampa_uid', '')) Storage.set('lampa_uid', Utils$2.uid()); //ренедрим лампу + if (!Storage.get('lampa_uid', '')) Storage.set('lampa_uid', Utils$1.uid()); // Ренедрим лампу Render.app(); - LoadingProgress.status('Render app'); //скрытие логотипа + LoadingProgress.status('Render app'); // Скрытие логотипа setTimeout(function () { LoadingProgress.destroy(); @@ -42821,19 +47930,21 @@ $('.welcome').fadeOut(500, function () { $(_this).remove(); }); - }, 1000); //инициализируем остальные классы + }, 1000); // Инициализируем остальные сервисы - OtherTorserver.init(); - OtherWatched.init(); - OtherSettings.init(); - OtherMetric.init(); - OtherGOD.init(); - OtherRemoteFavorites.init(); - OtherCards.init(); //сообщаем о готовности + ServiceDeveloper.init(); + ServiceTorserver.init(); + ServiceWatched.init(); + ServiceSettings.init(); + ServiceMetric.init(); + ServiceRemoteFavorites.init(); + ServiceDMCA.init(); + ServiceFPS.init(); + ServiceEvents.init(); // Сообщаем о готовности - LoadingProgress.status('Send app ready'); //обновляем слои + LoadingProgress.status('Send app ready'); // Обновляем слои - Layer.update(); //лампа полностью готова + Layer.update(); // Лампа полностью готова window.appready = true; window.app_time_end = Date.now(); @@ -42861,10 +47972,10 @@ }); Task.queue(function (next) { LoadingProgress.step(5); - Account.task(next); + Account$1.task(next); }); Task.secondary(function () { - OtherLibs.init(); + ServiceLibs.init(); }); Task.secondary(function () { setTimeout(startApp, 5000); @@ -42892,7 +48003,7 @@ try { var translate = {}; eval((data + '').replace(/export default/g, 'translate = ').trim()); - Lang.AddTranslation(code, translate); + Lang$1.AddTranslation(code, translate); } catch (e) {} loadTask(); @@ -42907,14 +48018,14 @@ function loadApp() { - prepareApp(); //готовим приложение - //если язык уже установлен, то запускаем приложение + prepareApp(); // Готовим приложение + // Если язык уже установлен, то запускаем приложение if (window.localStorage.getItem('language') || !window.lampa_settings.lang_use) { - //но сперва ожидаем не вызвали ли пользователь меню разработчика, затем подгружаем язык + // Но сперва ожидаем не вызвали ли пользователь меню разработчика, затем подгружаем язык developerApp(loadLang); } else { - //иначе предлагаем выбрать язык + // Иначе предлагаем выбрать язык LangChoice.open(function (code) { Storage.set('language', code, true); Storage.set('tmdb_lang', code, true); diff --git a/assembly.json b/assembly.json index 80c9d56..23e57af 100644 --- a/assembly.json +++ b/assembly.json @@ -1,8 +1,8 @@ { - "app_version": "2.4.7", - "css_version": "2.7.0", - "css_digital": 270, - "app_digital": 247, - "time": 1760790672642, - "hash": "ca7cfbb4effdd596e27eba74086997d0" + "app_version": "3.0.0", + "css_version": "3.0.0", + "css_digital": 300, + "app_digital": 300, + "time": 1761315887009, + "hash": "0c13e011cb0842f252e2d35c51b914a8" } \ No newline at end of file diff --git a/css/app.css b/css/app.css index d8060ac..41aee1d 100644 --- a/css/app.css +++ b/css/app.css @@ -109,6 +109,13 @@ -moz-box-sizing: border-box; box-sizing: border-box; outline: none; + -webkit-user-drag: none; +} + +* { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + /* чтобы не показывало меню при долгом тапе */ } html { @@ -121,6 +128,10 @@ html { vertical-align: middle; } +*:focus { + outline: none !important; +} + input::-webkit-input-placeholder { color: #6a6a6a; opacity: 1; @@ -414,6 +425,12 @@ body:not(.glass--style).keyboard-input--visible .head { overflow: hidden; } +.no-shrink { + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + /* Фикс для orsay */ .online-prestige-watched__icon { width: 1.5em; @@ -952,8 +969,8 @@ body.ambience--enable .navigation-bar { padding: 1.5em; } .head-backward__button > svg { - width: 1.7em; - height: 1.7em; + width: 1.7em !important; + height: 1.7em !important; } .head-backward__title { font-size: 2em; @@ -963,7 +980,8 @@ body.ambience--enable .navigation-bar { padding: 0 2em; } -body.true--mobile .head-backward { +body.true--mobile .head-backward, +body.mouse--controll .head-backward { display: block; } @@ -1051,134 +1069,6 @@ body.light--version .wrap__left { transform: translate3d(15em, 0, 0); } } -@-webkit-keyframes logo-halloween-fire { - 0% { - background: #FFEB3B; - } - 10% { - background: #ffd13b; - } - 14% { - background: #ffb73b; - } - 25% { - background: #FFEB3B; - } - 27% { - background: #fbea53; - } - 50% { - background: #ffc13b; - } - 58% { - background: #fbeb57; - } - 80% { - background: #ffcb3b; - } - 90% { - background: #fff493; - } - 95% { - background: #fcaa38; - } -} -@-moz-keyframes logo-halloween-fire { - 0% { - background: #FFEB3B; - } - 10% { - background: #ffd13b; - } - 14% { - background: #ffb73b; - } - 25% { - background: #FFEB3B; - } - 27% { - background: #fbea53; - } - 50% { - background: #ffc13b; - } - 58% { - background: #fbeb57; - } - 80% { - background: #ffcb3b; - } - 90% { - background: #fff493; - } - 95% { - background: #fcaa38; - } -} -@-o-keyframes logo-halloween-fire { - 0% { - background: #FFEB3B; - } - 10% { - background: #ffd13b; - } - 14% { - background: #ffb73b; - } - 25% { - background: #FFEB3B; - } - 27% { - background: #fbea53; - } - 50% { - background: #ffc13b; - } - 58% { - background: #fbeb57; - } - 80% { - background: #ffcb3b; - } - 90% { - background: #fff493; - } - 95% { - background: #fcaa38; - } -} -@keyframes logo-halloween-fire { - 0% { - background: #FFEB3B; - } - 10% { - background: #ffd13b; - } - 14% { - background: #ffb73b; - } - 25% { - background: #FFEB3B; - } - 27% { - background: #fbea53; - } - 50% { - background: #ffc13b; - } - 58% { - background: #fbeb57; - } - 80% { - background: #ffcb3b; - } - 90% { - background: #fff493; - } - 95% { - background: #fcaa38; - } -} @-webkit-keyframes marker-status-live { 0% { -webkit-box-shadow: 0 0 0 0 rgba(118, 230, 122, 0.7); @@ -1331,57 +1221,23 @@ body.light--version .wrap__left { -moz-border-radius: 0.2em; border-radius: 0.2em; } -.head__logo-halloween { - position: relative; - width: 2.7em; - height: 2.7em; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - margin-right: 1em; -} -.head__logo-halloween-svg { - position: absolute; - left: 0; - top: 0; - width: 2.7em; - height: 2.7em; -} -.head__logo-halloween-svg svg { - width: 2.7em !important; - height: 2.7em !important; -} -.head__logo-halloween-fire { - position: absolute; - top: 0.9em; - left: 10%; - width: 80%; - bottom: 0.5em; - background: #FFEB3B; - -webkit-animation: logo-halloween-fire 5s ease infinite; - -moz-animation: logo-halloween-fire 5s ease infinite; - -o-animation: logo-halloween-fire 5s ease infinite; - animation: logo-halloween-fire 5s ease infinite; -} -.head__logo-cap { - position: absolute; - top: -0.95em; - left: -1.25em; -} -.head__logo-cap svg { - width: 3.2em !important; - height: 3.2em !important; -} -.head__menu-icon { +.head__menu-icon, .head__backward { -webkit-flex-shrink: 0; -ms-flex-negative: 0; flex-shrink: 0; margin-right: 1em; display: none; + cursor: pointer; } -.head__menu-icon svg { - width: 2.1em; - height: 2.1em; +.head__menu-icon svg, .head__backward svg { + width: 2.1em !important; + height: 2.1em !important; +} +.head__backward { + cursor: pointer; +} +.head__backward svg { + height: 1.7em !important; } .head__split { background: url(../img/icons/split.svg) no-repeat 50% 50%; @@ -1467,12 +1323,13 @@ body.light--version .wrap__left { .head__action.open--profile { padding: 0.2em; } -.head__action.open--profile img { +.head__action.open--profile img, +.head__action.open--profile svg { -webkit-border-radius: 100%; -moz-border-radius: 100%; border-radius: 100%; - width: 2.4em; - height: 2.4em; + width: 2.4em !important; + height: 2.4em !important; } @media screen and (max-width: 480px) { .head__action { @@ -1534,6 +1391,32 @@ body.light--version .wrap__left { -o-animation: marker-status-pass 0.1s ease infinite; animation: marker-status-pass 0.1s ease infinite; } +.head__fps { + position: relative; + width: 11em; + height: 2.8em; +} +.head__fps-graph { + position: absolute; + left: 0; + top: 0; + width: 11em; + height: 2.8em; + border: 1px solid #fff; +} +.head__fps-counter { + position: absolute; + right: 0.2em; + bottom: 0.1em; + font-size: 0.9em; + font-weight: 300; + color: #fff; +} +.head__navigator { + -webkit-align-self: center; + -ms-flex-item-align: center; + align-self: center; +} body.true--mobile .head__logo-icon, body.true--mobile .head__action.open--search, @@ -1554,6 +1437,17 @@ body.true--mobile.orientation--landscape .head .head__body { padding-right: 10em; } +body.mouse--controll:not(.true--mobile) .head__logo-icon { + display: none; +} +body.mouse--controll:not(.true--mobile) .head__menu-icon { + display: block; + margin-right: 1.2em; +} +body.mouse--controll:not(.true--mobile) .head__backward { + display: block; +} + .processing { display: -webkit-box; display: -webkit-flex; @@ -1707,7 +1601,8 @@ body.true--mobile.orientation--landscape .head .head__body { display: none; background: url(../img/loader.svg) no-repeat 50% 50%; } -.activity--load .activity__body { +.activity--load .activity__body, +.activity--load .activity__refresh { opacity: 0; } .activity--load .activity__loader { @@ -1787,7 +1682,7 @@ body.true--mobile.orientation--landscape .head .head__body { -moz-box-align: center; -ms-flex-align: center; align-items: center; - color: #ddd; + color: #fff; position: relative; padding: 0.9em 1.5em; -webkit-border-radius: 1em; @@ -1871,6 +1766,100 @@ body.true--mobile.orientation--landscape .head .head__body { margin-top: -0.5em; } +.menu-edit-list__item { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + padding: 0.3em; + -webkit-border-radius: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; +} +.menu-edit-list__item:nth-child(even) { + background: rgba(255, 255, 255, 0.1); +} +.menu-edit-list__icon { + width: 2.4em; + height: 2.4em; + margin-right: 1em; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-border-radius: 100%; + -moz-border-radius: 100%; + border-radius: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.menu-edit-list__icon > svg, .menu-edit-list__icon > img { + width: 1.4em !important; + height: 1.4em !important; +} +.menu-edit-list__title { + font-size: 1.3em; + font-weight: 300; + line-height: 1.2; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -moz-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +.menu-edit-list__move, .menu-edit-list__toggle { + width: 2.4em; + height: 2.4em; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.menu-edit-list__move svg, .menu-edit-list__toggle svg { + width: 1em !important; + height: 1em !important; +} +.menu-edit-list__move.focus, .menu-edit-list__toggle.focus { + background: white; + -webkit-border-radius: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; + color: #000; +} +.menu-edit-list__toggle svg { + width: 1.2em !important; + height: 1.2em !important; +} + body.light--version .menu__item { -webkit-border-radius: 0.3em; -moz-border-radius: 0.3em; @@ -2121,20 +2110,23 @@ body.light--version .menu__item { transition: opacity 0.2s; will-change: opacity; } -.background__one, .background__two { +.background__one, .background__two, .background__fade { position: fixed; top: 0; left: 0; right: 0; bottom: 0; opacity: 0; - -webkit-transition: opacity 0.4s; - -o-transition: opacity 0.4s; - -moz-transition: opacity 0.4s; - transition: opacity 0.4s; + -webkit-transition: opacity 0.5s; + -o-transition: opacity 0.5s; + -moz-transition: opacity 0.5s; + transition: opacity 0.5s; will-change: opacity; } -.background__one.visible, .background__two.visible { +.background__one.visible, .background__two.visible, .background__fade.visible { + opacity: 1; +} +.background__fade { opacity: 1; } @@ -2438,6 +2430,27 @@ body.light--version .menu__item { -ms-flex-pack: start; justify-content: start; } +.settings-input--align-top .settings-input__content { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -moz-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.settings-input--align-center .settings-input__content { + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +.settings-input--align-bottom .settings-input__content { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -moz-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} body.settings--open .settings__layer { display: block; @@ -2489,17 +2502,17 @@ body.settings--open .settings__layer { } .discuss-rules-helper { - position: absolute; - bottom: 100%; font-size: 1.2em; color: #fff; - margin-bottom: 1.4em; line-height: 1.2; background: rgba(255, 255, 255, 0.1); padding: 0.7em; -webkit-border-radius: 0.6em; -moz-border-radius: 0.6em; border-radius: 0.6em; + margin-top: 1.2em; + padding-left: 2.4em; + position: relative; } .discuss-rules-helper::before { content: "🚫"; @@ -2507,6 +2520,8 @@ body.settings--open .settings__layer { margin-right: 0.5em; vertical-align: text-bottom; display: inline-block; + position: absolute; + left: 0.6em; } .scroll { @@ -2526,12 +2541,12 @@ body.settings--open .settings__layer { } } .scroll__body { - -webkit-transition: -webkit-transform 0.2s; - transition: -webkit-transform 0.2s; - -o-transition: -o-transform 0.2s; - -moz-transition: transform 0.2s, -moz-transform 0.2s; - transition: transform 0.2s; - transition: transform 0.2s, -webkit-transform 0.2s, -moz-transform 0.2s, -o-transform 0.2s; + -webkit-transition: -webkit-transform 0.3s; + transition: -webkit-transform 0.3s; + -o-transition: -o-transform 0.3s; + -moz-transition: transform 0.3s, -moz-transform 0.3s; + transition: transform 0.3s; + transition: transform 0.3s, -webkit-transform 0.3s, -moz-transform 0.3s, -o-transform 0.3s; will-change: transform; } .scroll__body.notransition, .scroll__body.transition-reset { @@ -2582,6 +2597,9 @@ body.settings--open .settings__layer { cursor: ew-resize; } +.items-line { + padding-bottom: 3em; +} .items-line__head { padding: 0 1.5em; margin-bottom: 1.4em; @@ -2605,12 +2623,19 @@ body.settings--open .settings__layer { font-size: 1.6em; font-weight: 400; } +.items-line__title .full-person__name { + font-size: 1em; +} .items-line__title .full-person__photo { width: 2em; height: 2em; } -.items-line__title .full-person__name { - font-size: 1em; +.items-line__title .full-person__photo svg { + width: 1em !important; + height: 1em !important; +} +.items-line__title .full-person--svg .full-person__photo { + padding: 0.5em; } .items-line__more { margin-left: 2em; @@ -2624,9 +2649,6 @@ body.settings--open .settings__layer { background-color: #fff; color: #000; } -.items-line + .items-line { - margin-top: 3em; -} .items-line--type-cards { min-height: 24em; } @@ -2770,19 +2792,28 @@ body.settings--open .settings__layer { line-height: 1.4; position: relative; min-width: 9em; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; } .register__name { font-size: 1.1em; overflow: hidden; -o-text-overflow: ellipsis; text-overflow: ellipsis; - max-width: 6em; + max-width: 7em; white-space: nowrap; } .register__counter { font-size: 2em; font-weight: 600; } +.register__limit { + font-size: 0.6em; + margin-left: 0.5em; + opacity: 0.7; + font-weight: 300; +} .register.focus::after { content: ""; position: absolute; @@ -2797,9 +2828,6 @@ body.settings--open .settings__layer { z-index: -1; pointer-events: none; } -.register + .register { - margin-left: 1em; -} .card { -webkit-flex-shrink: 0; @@ -2809,9 +2837,6 @@ body.settings--open .settings__layer { position: relative; will-change: transform; } -.card + .card { - margin-left: 1em; -} .card__img { -webkit-border-radius: 1em; -moz-border-radius: 1em; @@ -2839,10 +2864,16 @@ body.settings--open .settings__layer { -webkit-line-clamp: 3; line-clamp: 3; -webkit-box-orient: vertical; + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + transform: translateZ(0); } .card__age { font-size: 0.9em; margin-top: 0.6em; + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + transform: translateZ(0); } .card__icons { position: absolute; @@ -2859,6 +2890,7 @@ body.settings--open .settings__layer { -moz-box-pack: center; -ms-flex-pack: center; justify-content: center; + z-index: 1; } .card__icons-inner { background: rgba(0, 0, 0, 0.5); @@ -2896,6 +2928,7 @@ body.settings--open .settings__layer { -ms-flex-align: center; align-items: center; padding-right: 0.6em; + z-index: 1; } .card__marker::before { content: ""; @@ -3006,6 +3039,7 @@ body.settings--open .settings__layer { -webkit-border-radius: 0.3em; -moz-border-radius: 0.3em; border-radius: 0.3em; + z-index: 1; } .card__new-episode { position: absolute; @@ -3035,6 +3069,7 @@ body.settings--open .settings__layer { -moz-border-radius: 0.3em; border-radius: 0.3em; text-transform: uppercase; + z-index: 1; } .card__vote { position: absolute; @@ -3049,6 +3084,7 @@ body.settings--open .settings__layer { -webkit-border-radius: 1em; -moz-border-radius: 1em; border-radius: 1em; + z-index: 1; } .card__textbox { position: absolute; @@ -3077,6 +3113,57 @@ body.settings--open .settings__layer { -ms-flex-align: end; align-items: flex-end; } +.card__subscribe { + background: rgba(0, 0, 0, 0.3); + padding: 0.4em 0.7em; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-border-radius: 1em; + -moz-border-radius: 1em; + border-radius: 1em; + margin-bottom: 0.6em; + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + line-height: 1.4; +} +.card__subscribe-status { + width: 0.6em; + height: 0.6em; + -webkit-border-radius: 100%; + -moz-border-radius: 100%; + border-radius: 100%; + background-color: #ddd; + margin-right: 0.6em; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.card__subscribe-status.on { + background-color: #9bce54; +} +.card__subscribe-status.off { + background-color: #f05757; +} +.card__subscribe-position { + font-weight: 700; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.card__subscribe-voice { + margin-left: auto; + padding-left: 1em; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} .card.focus .card__view::after, .card.hover .card__view::after { content: ""; position: absolute; @@ -3101,77 +3188,33 @@ body.settings--open .settings__layer { background: #ff4242; color: #fff; } -.card--small { - width: 10.8em; +.card--disabled { + opacity: 0.5; } -.card--small + .card { - margin-left: 1em; -} -.card--small .card__view { - margin-bottom: 0; -} -.card--small.card--wide { +.card--wide { width: 34.3em; } -.card--small.card--wide .card__view { +.card--wide .card__view { padding-bottom: 56%; } -.card--small.card--wide .card-watched { +.card--wide .card-watched { top: 1em; left: 1.4em; right: 62%; bottom: auto; } -.card--small.card--wide .card-watched__title { +.card--wide .card-watched__title { display: none; } -.card--small.card--wide .card-watched__body { +.card--wide .card-watched__body { padding-top: 1em; } -.card--small.card--wide .card-watched__item { +.card--wide .card-watched__item { margin: 0; } -.card--small.card--wide .card-watched__item:not(:first-child) { +.card--wide .card-watched__item:not(:first-child) { display: none; } -.card--category { - width: 16.666%; - padding-bottom: 1em; -} -@media screen and (max-width: 991px) { - .card--category { - width: 16.666%; - } -} -@media screen and (max-width: 767px) { - .card--category { - width: 20%; - } -} -@media screen and (max-width: 580px) { - .card--category { - width: 25%; - } -} -@media screen and (max-width: 480px) { - .card--category { - width: 33.3%; - } -} -.card--explorer { - width: 20%; - padding-bottom: 1em; -} -@media screen and (max-width: 580px) { - .card--explorer { - width: 25%; - } -} -@media screen and (max-width: 480px) { - .card--explorer { - width: 33.3%; - } -} .card--collection { padding-bottom: 1em; width: 25%; @@ -3179,35 +3222,6 @@ body.settings--open .settings__layer { .card--collection .card__view { padding-bottom: 60%; } -@media screen and (max-width: 580px) { - .card--collection { - width: 33.3%; - } -} -@media screen and (max-width: 400px) { - .card--collection { - width: 50%; - } -} -.card--radio { - padding-bottom: 1em; - width: 16.666%; -} -@media screen and (max-width: 767px) { - .card--radio { - width: 14.266%; - } -} -@media screen and (max-width: 580px) { - .card--radio { - width: 33.333%; - } -} -@media screen and (max-width: 400px) { - .card--radio { - width: 25%; - } -} @media screen and (min-width: 767px) { body.size--bigger .card { @@ -3223,6 +3237,13 @@ body.settings--open .settings__layer { width: 33.33%; } } +body.platform--orsay .card__title, +body.platform--netcast .card__title { + -webkit-line-clamp: 1; + line-clamp: 1; + height: 1.4em; +} + .card-parser { padding: 0.75em; -webkit-flex-shrink: 0; @@ -3298,13 +3319,6 @@ body.settings--open .settings__layer { z-index: -1; pointer-events: none; } -.card-parser + .card-parser { - margin-left: 2em; -} -.card-parser + .card-more { - width: 14.6em; - margin-left: 2em; -} .card-watched { position: absolute; @@ -3826,6 +3840,11 @@ body.card--no-cover .full-start__background { display: none; } +body.touch-device.orientation--landscape .full-start__background { + width: 113%; + max-width: 113%; +} + @media screen and (min-width: 767px) { body.no--poster .full-start__right { display: none; @@ -4291,14 +4310,6 @@ body.card--no-cover .full-start__background { margin: 0.5em; } -.full-persons { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; -} - .full-person { display: -webkit-box; display: -webkit-flex; @@ -4310,7 +4321,6 @@ body.card--no-cover .full-start__background { -moz-box-align: center; -ms-flex-align: center; align-items: center; - margin-right: 2em; -webkit-border-radius: 1em; -moz-border-radius: 1em; border-radius: 1em; @@ -4370,22 +4380,12 @@ body.card--no-cover .full-start__background { opacity: 1; } -.full-reviews { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; -} - .full-review { padding: 1.5em; background-color: rgba(0, 0, 0, 0.4); -webkit-border-radius: 1em; -moz-border-radius: 1em; border-radius: 1em; - min-width: 20em; - max-width: 30em; -webkit-flex-shrink: 0; -ms-flex-negative: 0; flex-shrink: 0; @@ -4458,6 +4458,7 @@ body.card--no-cover .full-start__background { text-overflow: ellipsis; max-width: 7em; line-height: 1.4; + white-space: nowrap; } .full-review__user:not(.loaded) .full-review__user-icon { background: #494949; @@ -4488,9 +4489,6 @@ body.card--no-cover .full-start__background { width: 1.1em !important; height: 1.2em !important; } -.full-review + .full-review { - margin-left: 1.5em; -} .full-review.type--vertical { margin-bottom: 1.5em; min-width: unset; @@ -4513,6 +4511,10 @@ body.card--no-cover .full-start__background { -o-transform: scaleY(-1) translateY(-0.2em); transform: scaleY(-1) translateY(-0.2em); } +.full-review--full-text .full-review__text { + -webkit-line-clamp: 12; + line-clamp: 12; +} .full-review-add { padding: 1.5em; @@ -4520,11 +4522,9 @@ body.card--no-cover .full-start__background { -moz-border-radius: 1em; border-radius: 1em; border: dashed 2px #ddd; - width: 12em; -webkit-flex-shrink: 0; -ms-flex-negative: 0; flex-shrink: 0; - margin-right: 1.5em; position: relative; min-height: 10em; } @@ -4579,26 +4579,12 @@ body.card--no-cover .full-start__background { margin-top: 0.5em; } -.full-episodes { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -webkit-align-items: flex-start; - -moz-box-align: start; - -ms-flex-align: start; - align-items: flex-start; +.mapping--line > .full-review { + min-width: 20em; + max-width: 30em; } -.full-episodes .full-episode { - width: 15em; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.full-episodes .full-episode + .full-episode { - margin-left: 1em; +.mapping--line > .full-review-add { + width: 12em; } .full-episode { @@ -4710,6 +4696,12 @@ body.card--no-cover .full-start__background { .full-episode--viewed .full-episode__viewed { display: block; } +.full-episode--small { + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + width: 15em; +} .full-episode--next .full-episode__body { display: -webkit-box; display: -webkit-flex; @@ -4767,6 +4759,11 @@ body.true--mobile .full-episode .full-episode__body { display: flex; } +@media screen and (min-width: 767px) { + body.size--bigger .full-episode--small { + font-size: 1.14em; + } +} .card-episode { width: 19.65em; -webkit-flex-shrink: 0; @@ -5289,6 +5286,20 @@ body.true--mobile.orientation--portrait .player-video__paused { -o-transform: translateY(-50%) translateX(50%) scale(1.5) !important; transform: translateY(-50%) translateX(50%) scale(1.5) !important; } +.player-panel__timeline-segment { + position: absolute; + height: 100%; + top: 0; + -webkit-border-radius: 5em; + -moz-border-radius: 5em; + border-radius: 5em; +} +.player-panel__timeline-segment--ad { + background-color: rgba(252, 198, 60, 0.5); +} +.player-panel__timeline-segment--skip { + background-color: rgba(110, 219, 255, 0.5); +} .player-panel__peding, .player-panel__position { position: absolute; top: 0; @@ -5338,6 +5349,7 @@ body.true--mobile.orientation--portrait .player-video__paused { -o-transform: translateY(-50%) translateX(50%); transform: translateY(-50%) translateX(50%); font-size: 0.8em; + z-index: 1; } .player-panel__time { position: absolute; @@ -6123,6 +6135,18 @@ body.true--mobile .player-info .head-backward__button { display: none; } +body.mouse--controll .player-info__body { + padding-left: 5em; +} +body.mouse--controll .player-info .head-backward { + position: absolute; + left: 0; + top: 1.1em; +} +body.mouse--controll .player-info .head-backward__title { + display: none; +} + .player-footer { position: fixed; left: 1.5em; @@ -6424,14 +6448,18 @@ body.selectbox--open .selectbox__layer { font-size: 1.1em; margin-top: 0.4em; opacity: 0.7; + line-height: 1.4; } .selectbox-item__checkbox { width: 1.4em; height: 1.4em; - border: 0.3em solid rgba(255, 255, 255, 0.2); + border: 0.2em solid rgba(255, 255, 255, 0.2); position: absolute; top: 1.7em; right: 2em; + -webkit-border-radius: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; } .selectbox-item__icon { margin-right: 1em; @@ -6463,11 +6491,24 @@ body.selectbox--open .selectbox__layer { padding-right: 4em; } .selectbox-item--checked .selectbox-item__checkbox { - -webkit-border-radius: 100%; - -moz-border-radius: 100%; - border-radius: 100%; border-color: #fff; } +.selectbox-item--checked .selectbox-item__checkbox::after { + content: ""; + display: block; + width: 0.3em; + height: 0.6em; + border-right: 0.2em solid #fff; + border-bottom: 0.2em solid #fff; + position: absolute; + top: 0em; + right: 0.25em; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} .selectbox-item--icon { display: -webkit-box; display: -webkit-flex; @@ -6480,6 +6521,9 @@ body.selectbox--open .selectbox__layer { -ms-flex-align: center; align-items: center; } +.selectbox-item.selected:not(.nomark), .selectbox-item.picked { + padding-right: 4em; +} .selectbox-item.selected:not(.nomark)::after, .selectbox-item.picked::after { content: ""; display: block; @@ -6489,7 +6533,7 @@ body.selectbox--open .selectbox__layer { border-bottom: 0.2em solid #fff; position: absolute; top: 50%; - right: 1.4em; + right: 2em; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -ms-transform: rotate(45deg); @@ -6778,7 +6822,11 @@ body.selectbox--open .selectbox__layer { -ms-flex-negative: 0; flex-shrink: 0; width: 12.75em; - margin-bottom: 2em; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; } .card-more__box { -webkit-transition: border-color 0.2s, -webkit-transform 0.3s; @@ -6787,11 +6835,18 @@ body.selectbox--open .selectbox__layer { -moz-transition: transform 0.3s, border-color 0.2s, -moz-transform 0.3s; transition: transform 0.3s, border-color 0.2s; transition: transform 0.3s, border-color 0.2s, -webkit-transform 0.3s, -moz-transform 0.3s, -o-transform 0.3s; - background-color: #3E3E3E; + background: rgba(0, 0, 0, 0.3); -webkit-border-radius: 1em; -moz-border-radius: 1em; border-radius: 1em; - padding-bottom: 150%; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -moz-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; position: relative; } .card-more__title { @@ -6817,29 +6872,24 @@ body.selectbox--open .selectbox__layer { border-radius: 1.4em; z-index: -1; } -.card-more--small { - width: 10.8em; +.card-more--small-radius .card-more__box { + -webkit-border-radius: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; } - -.card + .card-more { - margin-left: 1em; +.card-more--small-radius.focus .card-more__box::after { + -webkit-border-radius: 0.7em; + -moz-border-radius: 0.7em; + border-radius: 0.7em; } - -.card.card--wide + .card-more .card-more__box { - padding-bottom: 177%; -} - -.card.card--collection + .card-more .card-more__box { - padding-bottom: 95%; +.card-more--fixed-size { + display: block; } @media screen and (min-width: 767px) { body.size--bigger .card-more { font-size: 1.14em; } - body.size--bigger .card.card--collection + .card-more { - width: 14.3em; - } } .loading-layer { position: fixed; @@ -7227,9 +7277,6 @@ body.platform--netcast .category-full:after { .search-source.focus { background: rgba(221, 221, 221, 0.3); opacity: 1; - -webkit-box-shadow: inset 0 0 0 0.15em #fff; - -moz-box-shadow: inset 0 0 0 0.15em #fff; - box-shadow: inset 0 0 0 0.15em #fff; color: #fff; } .search-source + .search-source { @@ -7251,10 +7298,6 @@ body.true--mobile .search .simple-keyboard input { padding-left: 1.3em; height: 2.7em; } -body.true--mobile .search .search-history-key, -body.true--mobile .search .search-source:not(.active) { - background: transparent; -} .simple-keyboard { background: transparent; @@ -7436,7 +7479,7 @@ body.true--mobile .search .search-source:not(.active) { } @media screen and (max-width: 480px) { .simple-keyboard-input { - font-size: 1.3em; + font-size: 1.5em; } } .simple-keyboard-buttons { @@ -7606,6 +7649,9 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { width: 100%; } } +.modal .head-backward { + margin: 0; +} .modal__head { margin-bottom: 2em; } @@ -7674,6 +7720,7 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { border-radius: 100%; padding: 0.4em; color: #000; + cursor: pointer; } .modal__close-button > svg { width: 1.1em; @@ -7733,8 +7780,14 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { border-radius: 0; padding: 0; } +.modal--full .modal__head { + padding: 1em 1.5em; +} +.modal--full .modal__footer { + padding: 1em 1.5em; +} .modal--empty-title .modal__head { - margin-bottom: 0; + display: none; } .modal--overlay { z-index: 60; @@ -7855,13 +7908,11 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { } .company-start { - padding: 0 1.5em; display: -webkit-box; display: -webkit-flex; display: -moz-box; display: -ms-flexbox; display: flex; - padding-bottom: 4em; line-height: 1.4; } .company-start__left { @@ -7904,6 +7955,14 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { height: 80%; -o-object-fit: contain; object-fit: contain; + opacity: 0; + -webkit-transition: opacity 0.3s; + -o-transition: opacity 0.3s; + -moz-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.company-start__img.loaded { + opacity: 1; } .company-start__name { font-size: 4em; @@ -7940,7 +7999,6 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { } .person-start { - padding: 0 1.5em; display: -webkit-box; display: -webkit-flex; display: -moz-box; @@ -7953,7 +8011,6 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { -moz-box-direction: normal; -ms-flex-direction: column; flex-direction: column; - margin-bottom: 4em; } .person-start__tags { display: -webkit-box; @@ -8007,6 +8064,14 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { border-radius: 1em; width: 15em; height: 15em; + opacity: 0; + -webkit-transition: opacity 0.3s; + -o-transition: opacity 0.3s; + -moz-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.person-start__img.loaded { + opacity: 1; } @media screen and (max-width: 580px) { .person-start__img { @@ -8024,7 +8089,6 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { -webkit-border-radius: 5em; -moz-border-radius: 5em; border-radius: 5em; - background-color: rgba(0, 0, 0, 0.3); padding: 0.3em 0.5em; display: -webkit-box; display: -webkit-flex; @@ -8045,7 +8109,7 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { margin-right: 0.8em; } .person-start__name { - font-size: 3.8em; + font-size: 3.5em; font-weight: 700; margin-bottom: 0.3em; max-width: 90%; @@ -8062,10 +8126,10 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { } } .person-start__place { - font-size: 1.9em; + font-size: 1.8em; font-weight: 300; max-width: 80%; - margin-bottom: 0.7em; + margin-bottom: 1.1em; } @media screen and (max-width: 991px) { .person-start__place { @@ -8076,11 +8140,13 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { .person-start__place { font-size: 1.8em; max-width: 100%; + margin-bottom: 0.9em; } } @media screen and (max-width: 480px) { .person-start__place { font-size: 1.5em; + margin-bottom: 1.1em; } } .person-start__descr { @@ -8142,7 +8208,6 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { .empty { width: 100%; text-align: center; - height: 90vh; display: -webkit-box; display: -webkit-flex; display: -moz-box; @@ -8171,6 +8236,11 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { background-size: contain; margin-bottom: 3em; } +.empty__icon svg, .empty__icon img { + width: 22em !important; + height: 14em !important; + margin-bottom: 3em; +} .empty__title { font-size: 2.4em; line-height: 1.4; @@ -8232,6 +8302,9 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { .empty--noicon .empty__descr { margin-top: 2.5em; } +.empty--custom-icon .empty__img { + display: none; +} .empty--width-large { max-width: 90%; } @@ -8430,6 +8503,170 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { opacity: 1; } +.account-modal-split { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + line-height: 1.6; +} +.account-modal-split__qr { + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + text-align: center; + width: 45%; +} +.account-modal-split__qr-img { + width: 16em; + height: 16em; + -webkit-border-radius: 1em; + -moz-border-radius: 1em; + border-radius: 1em; + padding: 0.5em; + background: #3c3e3f; + margin-bottom: 1.8em; + opacity: 0; + -webkit-transform: translate3d(0, 20%, 0); + -moz-transform: translate3d(0, 20%, 0); + transform: translate3d(0, 20%, 0); + -webkit-transition: opacity 0.2s, -webkit-transform 0.2s; + transition: opacity 0.2s, -webkit-transform 0.2s; + -o-transition: opacity 0.2s, -o-transform 0.2s; + -moz-transition: opacity 0.2s, transform 0.2s, -moz-transform 0.2s; + transition: opacity 0.2s, transform 0.2s; + transition: opacity 0.2s, transform 0.2s, -webkit-transform 0.2s, -moz-transform 0.2s, -o-transform 0.2s; +} +.account-modal-split__qr-img.loaded { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.account-modal-split__qr-code { + width: 16em; + height: 16em; + padding: 0.5em; + background: #3c3e3f; + -webkit-border-radius: 1.1em; + -moz-border-radius: 1.1em; + border-radius: 1.1em; + margin: 0 auto; + margin-bottom: 1.8em; +} +.account-modal-split__qr-code svg { + -webkit-border-radius: 0.7em; + -moz-border-radius: 0.7em; + border-radius: 0.7em; + width: 15em !important; + height: 15em !important; +} +.account-modal-split__qr-text { + font-size: 1em; + font-size: 1em; + max-width: 16em; + margin: 0 auto; +} +.account-modal-split__info { + width: 55%; + padding-right: 1.5em; +} +.account-modal-split__title { + font-size: 2.2em; + margin-bottom: 0.5em; + font-weight: 300; +} +.account-modal-split__text { + font-size: 1.2em; + margin-bottom: 2em; +} +.account-modal-split__code { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + margin-bottom: 4em; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -moz-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + width: 80%; +} +.account-modal-split__code-num { + -webkit-border-radius: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -moz-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + background: #ffffff0f; + padding: 1.6em 1.4em; + position: relative; +} +.account-modal-split__code-num > span { + display: block; + line-height: 1; + font-size: 2em; + width: 0.6em; + text-align: center; + font-weight: 700; +} +.account-modal-split__code-num:before { + display: block; + content: ""; + position: absolute; + bottom: -1em; + left: 0; + width: 100%; + height: 0.2em; + background-color: #ddd; +} +.account-modal-split__keyboard { + width: 80%; +} +.account-modal-split__keyboard .hg-button { + padding: 0.5em 0; +} +.account-modal-split .account-modal__site { + color: #D8C39A; +} +.account-modal-split--mobile .account-modal-split__qr { + display: none; +} +.account-modal-split--mobile .account-modal-split__info { + width: 100%; + padding: 0; +} +.account-modal-split--mobile .account-modal-split__keyboard, +.account-modal-split--mobile .account-modal-split__code { + width: 100%; +} + .cub-premium { text-align: center; } @@ -8576,6 +8813,10 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { margin-top: 0.9em; line-height: 1.4; } +.notice__descr span, .notice__descr b { + font-weight: 300; + color: #d8c39a; +} .notice__time { -webkit-flex-shrink: 0; -ms-flex-negative: 0; @@ -8615,7 +8856,8 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { transition: background, border-radius 0.2s; transition: background, border-radius 0.2s, -webkit-border-radius 0.2s, -moz-border-radius 0.2s; } -.notice__img img { +.notice__img img, +.notice__img svg { position: absolute; top: 0; left: 0; @@ -8630,6 +8872,9 @@ body.true--mobile .simple-keyboard--with-mic .simple-keyboard-buttons { -moz-transition: opacity 0.2s; transition: opacity 0.2s; } +.notice__img svg { + opacity: 1; +} .notice__footer { display: -webkit-box; display: -webkit-flex; @@ -8761,6 +9006,21 @@ body.true--mobile .notice { pointer-events: none; padding-top: 1em; } +@media screen and (max-width: 580px) { + .bell { + width: 80%; + padding: 1.5em; + font-size: 1.2em; + margin-left: -40%; + } +} +@media screen and (max-width: 480px) { + .bell { + width: 100%; + margin-left: -50%; + padding: 0.8em; + } +} .bell__item { display: -webkit-box; display: -webkit-flex; @@ -8789,6 +9049,13 @@ body.true--mobile .notice { transition: transform 0.3s, opacity 0.2s; transition: transform 0.3s, opacity 0.2s, -webkit-transform 0.3s, -moz-transform 0.3s, -o-transform 0.3s; } +@media screen and (max-width: 480px) { + .bell__item { + -webkit-border-radius: 2em; + -moz-border-radius: 2em; + border-radius: 2em; + } +} .bell__item-icon { -webkit-flex-shrink: 0; -ms-flex-negative: 0; @@ -10043,6 +10310,10 @@ body.platform--netcast .torrent-item__ffprobe > div::before { .explorer__files .torrent-filter .simple-button:not(.focus) { background-color: rgba(0, 0, 0, 0.07); } +.explorer__files .empty-filter { + max-width: 100%; + padding: 3em 1.5em 0 1.5em; +} .explorer__search { display: -webkit-box; display: -webkit-flex; @@ -10071,6 +10342,10 @@ body.platform--netcast .torrent-item__ffprobe > div::before { width: 100%; } +.explorer-list { + padding: 0 1.5em; +} + .explorer-card { line-height: 1.4; } @@ -10385,6 +10660,20 @@ body.platform--netcast .torrent-item__ffprobe > div::before { .season-info__overview { margin-top: 1em; } +.season-info.focus::after, .season-info.hover::after { + content: ""; + position: absolute; + top: -0.5em; + left: -0.5em; + right: -0.5em; + bottom: -0.5em; + border: 0.3em solid #fff; + -webkit-border-radius: 0.7em; + -moz-border-radius: 0.7em; + border-radius: 0.7em; + z-index: -1; + pointer-events: none; +} .season-episode { position: relative; @@ -10398,6 +10687,9 @@ body.platform--netcast .torrent-item__ffprobe > div::before { display: -ms-flexbox; display: flex; will-change: transform; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; } .season-episode__body { padding: 1.2em; @@ -10504,7 +10796,7 @@ body.platform--netcast .torrent-item__ffprobe > div::before { height: 2em; margin-left: -1em; margin-top: -1em; - background: url(./img/loader.svg) no-repeat center center; + background: url(../img/loader.svg) no-repeat center center; -webkit-background-size: contain; -moz-background-size: contain; -o-background-size: contain; @@ -10599,9 +10891,6 @@ body.platform--netcast .torrent-item__ffprobe > div::before { z-index: -1; pointer-events: none; } -.season-episode + .season-episode { - margin-top: 1.5em; -} .season-episode--folder .season-episode__footer { margin-top: 0.8em; } @@ -10696,6 +10985,14 @@ body.platform--netcast .torrent-item__ffprobe > div::before { white-space: nowrap; } } +.simple-button--inline { + display: inline; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -moz-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} .simple-button--invisible:not(.focus) { background-color: rgba(0, 0, 0, 0.07); } @@ -10875,6 +11172,7 @@ body.system--keyboard .search-box .simple-keyboard-input { transition: transform 0.3s, opacity 0.3s; transition: transform 0.3s, opacity 0.3s, -webkit-transform 0.3s, -moz-transform 0.3s, -o-transform 0.3s; opacity: 0; + line-height: 1.4; } .noty__body { padding: 1.5em; @@ -11120,6 +11418,9 @@ body.system--keyboard .search-box .simple-keyboard-input { line-height: 1.6; font-size: 1.2em; } +.pincode .head-backward { + margin: 0; +} .pincode.mobile .pincode__container { padding-top: 2em; height: 90vh; @@ -11186,6 +11487,16 @@ body.system--keyboard .search-box .simple-keyboard-input { opacity: 1; } +body.mouse--controll .pincode__container { + padding-top: 1em; +} +@media screen and (min-width: 580px) { + body.mouse--controll .pincode.mobile .pincode__container { + padding: 0; + height: 80vh; + } +} + .pincode-remote { height: 30em; width: 13em; @@ -11513,6 +11824,14 @@ body.system--keyboard .search-box .simple-keyboard-input { width: 2.4em !important; height: 2.4em !important; } +.pincode-keyboard > div.focus { + background: white; + color: #000; +} +.pincode-keyboard > div.focus svg { + -webkit-filter: invert(1); + filter: invert(1); +} .no-network { position: fixed; @@ -11940,6 +12259,62 @@ body.system--keyboard .search-box .simple-keyboard-input { color: #000; } +.watched-history { + position: relative; + -webkit-border-radius: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; + background-color: rgba(0, 0, 0, 0.3); + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + padding: 1em; + margin-bottom: 1em; +} +.watched-history__icon { + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.watched-history__icon > svg { + width: 1.5em !important; + height: 1.5em !important; +} +.watched-history__body { + padding-left: 1em; + padding-top: 0.1em; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} +.watched-history__body > span + span::before { + content: " ● "; + vertical-align: top; + display: inline-block; + margin: 0 0.5em; +} +.watched-history.focus::after { + content: ""; + position: absolute; + top: -0.5em; + left: -0.5em; + right: -0.5em; + bottom: -0.5em; + -webkit-border-radius: 0.7em; + -moz-border-radius: 0.7em; + border-radius: 0.7em; + border: solid 0.3em #fff; + z-index: -1; + pointer-events: none; +} + .timetable { padding: 0 1.5em; } @@ -12996,6 +13371,13 @@ body.size--bigger .ad-bot__body { -ms-flex-negative: 0; flex-shrink: 0; } +.ad-server__qr svg { + width: 8em !important; + height: 8em !important; + -webkit-border-radius: 0.3em; + -moz-border-radius: 0.3em; + border-radius: 0.3em; +} .ad-server__label { position: absolute; left: 0; @@ -13048,6 +13430,161 @@ body.size--bigger .ad-bot__body { padding: 1.2em 1.8em; } +@-webkit-keyframes animation-remote-button-blink { + 0% { + fill-opacity: 0.4; + } + 20% { + fill-opacity: 1; + } + 60% { + fill-opacity: 1; + } + 100% { + fill-opacity: 0.4; + } +} + +@-moz-keyframes animation-remote-button-blink { + 0% { + fill-opacity: 0.4; + } + 20% { + fill-opacity: 1; + } + 60% { + fill-opacity: 1; + } + 100% { + fill-opacity: 0.4; + } +} + +@-o-keyframes animation-remote-button-blink { + 0% { + fill-opacity: 0.4; + } + 20% { + fill-opacity: 1; + } + 60% { + fill-opacity: 1; + } + 100% { + fill-opacity: 0.4; + } +} + +@keyframes animation-remote-button-blink { + 0% { + fill-opacity: 0.4; + } + 20% { + fill-opacity: 1; + } + 60% { + fill-opacity: 1; + } + 100% { + fill-opacity: 0.4; + } +} +.remote-helper { + position: absolute; + top: 100%; + right: 1.5em; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -moz-box-align: center; + -ms-flex-align: center; + align-items: center; + z-index: 10; + pointer-events: none; + opacity: 0; + -webkit-transition: opacity 0.15s ease, -webkit-transform 0.2s ease; + transition: opacity 0.15s ease, -webkit-transform 0.2s ease; + -o-transition: opacity 0.15s ease, -o-transform 0.2s ease; + -moz-transition: opacity 0.15s ease, transform 0.2s ease, -moz-transform 0.2s ease; + transition: opacity 0.15s ease, transform 0.2s ease; + transition: opacity 0.15s ease, transform 0.2s ease, -webkit-transform 0.2s ease, -moz-transform 0.2s ease, -o-transform 0.2s ease; + line-height: 1.4; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.remote-helper.active { + opacity: 1; + -webkit-transform: translate3d(0, -100%, 0); + -moz-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); +} +.remote-helper__textbox { + background: rgba(0, 0, 0, 0.6); + -webkit-border-radius: 0.5em; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + padding: 0.8em 1em; + margin-right: 1em; + width: 11em; + margin-top: 1.5em; +} +.remote-helper__text { + overflow: hidden; + -o-text-overflow: "."; + text-overflow: "."; + display: -webkit-box; + -webkit-line-clamp: 3; + line-clamp: 3; + -webkit-box-orient: vertical; +} +.remote-helper__remote { + width: 9.5em; + height: auto; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} +.remote-helper__remote svg { + width: 9.5em !important; + height: 12.8em !important; +} +.remote-helper.highlight--ok .remote-helper__button-ok { + -webkit-animation: animation-remote-button-blink 1s ease infinite; + -moz-animation: animation-remote-button-blink 1s ease infinite; + -o-animation: animation-remote-button-blink 1s ease infinite; + animation: animation-remote-button-blink 1s ease infinite; +} +.remote-helper.highlight--up .remote-helper__button-up { + -webkit-animation: animation-remote-button-blink 1s ease infinite; + -moz-animation: animation-remote-button-blink 1s ease infinite; + -o-animation: animation-remote-button-blink 1s ease infinite; + animation: animation-remote-button-blink 1s ease infinite; +} +.remote-helper.highlight--down .remote-helper__button-down { + -webkit-animation: animation-remote-button-blink 1s ease infinite; + -moz-animation: animation-remote-button-blink 1s ease infinite; + -o-animation: animation-remote-button-blink 1s ease infinite; + animation: animation-remote-button-blink 1s ease infinite; +} +.remote-helper.highlight--left .remote-helper__button-left { + -webkit-animation: animation-remote-button-blink 1s ease infinite; + -moz-animation: animation-remote-button-blink 1s ease infinite; + -o-animation: animation-remote-button-blink 1s ease infinite; + animation: animation-remote-button-blink 1s ease infinite; +} +.remote-helper.highlight--right .remote-helper__button-right { + -webkit-animation: animation-remote-button-blink 1s ease infinite; + -moz-animation: animation-remote-button-blink 1s ease infinite; + -o-animation: animation-remote-button-blink 1s ease infinite; + animation: animation-remote-button-blink 1s ease infinite; +} + .iframe { position: fixed; top: 0; @@ -13089,6 +13626,301 @@ body.size--bigger .ad-bot__body { background-color: #fff; } +.mapping--line { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; +} +.mapping--line > * + * { + margin-left: 1em; +} +.mapping--list { + padding: 0 1em; +} +.mapping--list > * + * { + margin-top: 1em; +} +.mapping--grid { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0 1em; +} +.mapping--grid > * { + padding: 0 0.5em 1em 0.5em; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.cols--3 > * { + width: 33.3333333333%; +} +@media screen and (max-width: 767px) { + .cols--3 > * { + width: 50%; + } +} +@media screen and (max-width: 580px) { + .cols--3 > * { + width: 100%; + } +} +@media screen and (max-width: 480px) { + .cols--3 > * { + width: 100%; + } +} + +.cols--4 > * { + width: 25%; +} +@media screen and (max-width: 767px) { + .cols--4 > * { + width: 33.3333333333%; + } +} +@media screen and (max-width: 580px) { + .cols--4 > * { + width: 50%; + } +} +@media screen and (max-width: 480px) { + .cols--4 > * { + width: 100%; + } +} + +.cols--5 > * { + width: 20%; +} +@media screen and (max-width: 767px) { + .cols--5 > * { + width: 25%; + } +} +@media screen and (max-width: 580px) { + .cols--5 > * { + width: 33.3333333333%; + } +} +@media screen and (max-width: 480px) { + .cols--5 > * { + width: 50%; + } +} + +.cols--6 > * { + width: 16.6666666667%; +} +@media screen and (max-width: 767px) { + .cols--6 > * { + width: 20%; + } +} +@media screen and (max-width: 580px) { + .cols--6 > * { + width: 25%; + } +} +@media screen and (max-width: 480px) { + .cols--6 > * { + width: 33.3333333333%; + } +} + +@media screen and (min-width: 767px) { + body.size--bigger .cols--3 > * { + width: 50%; + } + body.size--bigger .cols--4 > * { + width: 33.3333333333%; + } + body.size--bigger .cols--5 > * { + width: 25%; + } + body.size--bigger .cols--6 > * { + width: 20%; + } +} +.cols--3 > * { + width: 33.3333333333%; +} +@media screen and (max-width: 767px) { + .cols--3 > * { + width: 50%; + } +} +@media screen and (max-width: 580px) { + .cols--3 > * { + width: 100%; + } +} +@media screen and (max-width: 480px) { + .cols--3 > * { + width: 100%; + } +} + +.cols--4 > * { + width: 25%; +} +@media screen and (max-width: 767px) { + .cols--4 > * { + width: 33.3333333333%; + } +} +@media screen and (max-width: 580px) { + .cols--4 > * { + width: 50%; + } +} +@media screen and (max-width: 480px) { + .cols--4 > * { + width: 100%; + } +} + +.cols--5 > * { + width: 20%; +} +@media screen and (max-width: 767px) { + .cols--5 > * { + width: 25%; + } +} +@media screen and (max-width: 580px) { + .cols--5 > * { + width: 33.3333333333%; + } +} +@media screen and (max-width: 480px) { + .cols--5 > * { + width: 50%; + } +} + +@media screen and (min-width: 767px) { + body.size--bigger .cols--3 > * { + width: 50%; + } + body.size--bigger .cols--4 > * { + width: 33.3333333333%; + } + body.size--bigger .cols--5 > * { + width: 25%; + } +} +.cols--3 > * { + width: 33.3333333333%; +} +@media screen and (max-width: 767px) { + .cols--3 > * { + width: 50%; + } +} +@media screen and (max-width: 580px) { + .cols--3 > * { + width: 100%; + } +} +@media screen and (max-width: 480px) { + .cols--3 > * { + width: 100%; + } +} + +.cols--4 > * { + width: 25%; +} +@media screen and (max-width: 767px) { + .cols--4 > * { + width: 33.3333333333%; + } +} +@media screen and (max-width: 580px) { + .cols--4 > * { + width: 50%; + } +} +@media screen and (max-width: 480px) { + .cols--4 > * { + width: 100%; + } +} + +@media screen and (min-width: 767px) { + body.size--bigger .cols--3 > * { + width: 50%; + } + body.size--bigger .cols--4 > * { + width: 33.3333333333%; + } +} +.cols--3 > * { + width: 33.3333333333%; +} +@media screen and (max-width: 767px) { + .cols--3 > * { + width: 50%; + } +} +@media screen and (max-width: 580px) { + .cols--3 > * { + width: 100%; + } +} +@media screen and (max-width: 480px) { + .cols--3 > * { + width: 100%; + } +} + +@media screen and (min-width: 767px) { + body.size--bigger .cols--3 > * { + width: 50%; + } +} +body.platform--orsay .cols--3, +body.platform--orsay .cols--4, +body.platform--orsay .cols--5, +body.platform--orsay .cols--6, +body.platform--netcast .cols--3, +body.platform--netcast .cols--4, +body.platform--netcast .cols--5, +body.platform--netcast .cols--6 { + display: block; +} +body.platform--orsay .cols--3::after, +body.platform--orsay .cols--4::after, +body.platform--orsay .cols--5::after, +body.platform--orsay .cols--6::after, +body.platform--netcast .cols--3::after, +body.platform--netcast .cols--4::after, +body.platform--netcast .cols--5::after, +body.platform--netcast .cols--6::after { + content: ""; + display: block; + clear: both; +} +body.platform--orsay .cols--3 > *, +body.platform--orsay .cols--4 > *, +body.platform--orsay .cols--5 > *, +body.platform--orsay .cols--6 > *, +body.platform--netcast .cols--3 > *, +body.platform--netcast .cols--4 > *, +body.platform--netcast .cols--5 > *, +body.platform--netcast .cols--6 > * { + float: left; +} + body.platform--orsay svg, body.platform--netcast svg { max-width: 100%; @@ -13114,7 +13946,13 @@ body.platform--orsay .head__actions, body.platform--netcast .head__actions { position: absolute; top: 0.4em; - right: 16em; + right: 18em; +} +body.platform--orsay .head__markers, +body.platform--netcast .head__markers { + position: absolute; + top: 1.15em; + right: 15em; } body.platform--orsay .head__action svg, body.platform--netcast .head__action svg { @@ -13727,6 +14565,50 @@ body.touch-device .selectbox__body .scroll { opacity: 1; } } +@-webkit-keyframes animation-opacity-blink { + 0% { + opacity: 0; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@-moz-keyframes animation-opacity-blink { + 0% { + opacity: 0; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@-o-keyframes animation-opacity-blink { + 0% { + opacity: 0; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@keyframes animation-opacity-blink { + 0% { + opacity: 0; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0; + } +} @-webkit-keyframes animation-zoom-down { 0% { -webkit-transform: scale(1.2); @@ -14010,6 +14892,12 @@ body.advanced--animation:not(.no--animation) .modal.animate .modal__content { -o-animation: animation-modal 0.3s; animation: animation-modal 0.3s; } +body.advanced--animation:not(.no--animation) .modal.modal--full.animate .modal__content { + -webkit-animation: animation-from-below 0.3s; + -moz-animation: animation-from-below 0.3s; + -o-animation: animation-from-below 0.3s; + animation: animation-from-below 0.3s; +} body.advanced--animation:not(.no--animation) .full-start__background.loaded { -webkit-animation: animation-full-background 0.3s; -moz-animation: animation-full-background 0.3s; @@ -14091,9 +14979,6 @@ body.advanced--animation:not(.no--animation) .animate-up-content { body.light--version .card--small .card__title { margin-top: 0.5em; } - body.light--version .items-line .card { - margin-bottom: 2em; - } } @media screen and (max-width: 767px) { body.light--version.menu--open .wrap__content { diff --git a/lang/be.js b/lang/be.js index a826ff1..0cc98f2 100644 --- a/lang/be.js +++ b/lang/be.js @@ -849,7 +849,7 @@ export default { account_imported: 'імпартавана', account_reload_after: 'перазагрузка праз 5 сек.', account_create: 'Адкрыйце больш магчымасцяў з акаўнтам CUB. Зарэгіструйцеся на сайце і атрымайце доступ да сінхранізацыі вашых закладак, тайм-кодаў і іншых магчымасцяў акаўнта CUB.', - account_premium: 'Раскрыйце новыя гарызонты з акаўнтам CUB Premium! Атрымлівайце асалоду ад павялічанымі лімітамі і ўзбагачаным функцыяналам сэрвісу. Дадатковыя магчымасці чакаюць вас ужо сёння!', + account_premium: 'Раскрыйце новыя гарызонты з акаўнтам CUB Premium! Атрымлівайце асалоду ад павялічанымі лімітамі і ўзбагачаным функцыяналам сэрвісу. Перайдзіце на сайт і даведайцеся больш пра перавагі прэміум акаўнта.', account_premium_more: 'Больш падрабязна пра CUB Premium', account_limited: 'Вы дасягнулі максімальнага ліміту. Павялічце ліміт з акаўнтам CUB Premium. Падрабязней на сайце ', account_premium_include_1: 'Павелічэнне колькасць закладак', @@ -1201,5 +1201,61 @@ export default { terminal_deny: 'Забараніць', terminal_update: 'Абнавіць', terminal_code: 'Код доступу', - terminal_text: 'Вы запытваеце доступ да тэрміналу. Распрацоўшчыкі могуць атрымаць доступ да вашай прылады і кіраваць ёй. Гэта можа быць карысна для дыягностыкі і ліквідацыі праблем, але таксама можа ўяўляць рызыку бяспекі. Калі ласка, пераканайцеся, што вы давяраеце распрацоўшчыкам, перш чым даваць доступ.

Вы можаце ў любы момант адключыць гэтую функцыю, націснуўшы кнопку "Забараніць".' + terminal_text: 'Вы запытваеце доступ да тэрміналу. Распрацоўшчыкі могуць атрымаць доступ да вашай прылады і кіраваць ёй. Гэта можа быць карысна для дыягностыкі і ліквідацыі праблем, але таксама можа ўяўляць рызыку бяспекі. Калі ласка, пераканайцеся, што вы давяраеце распрацоўшчыкам, перш чым даваць доступ.

Вы можаце ў любы момант адключыць гэтую функцыю, націснуўшы кнопку "Забараніць".', + + title_anons: 'Анонс', + title_developer: 'Распрацоўшчык', + title_navigation: 'Навігацыя', + title_page: 'Старонка', + title_person_about: 'Пра чалавека', + account_qr_premium: 'Адскануйце QR-код, каб даведацца больш пра CUB Premium', + account_qr_code: 'Адскануйце QR-код, каб атрымаць код для прывязкі прылады', + account_qr_create: 'Адскануйце QR-код, каб стварыць уліковы запіс', + account_add_device_title: 'Дадаць прыладу', + account_add_device_text: 'Перайдзіце на , каб атрымаць код для дадання прылады.', + account_none_title: 'Яшчэ няма ўліковага запісу?', + account_none_include_1: 'Закладкі і гісторыя праглядаў захоўваюцца ў воблаку', + account_none_include_2: 'Сінхранізацыя паміж прыладамі', + account_none_include_3: 'Апавяшчэнні пра новыя серыі і рэлізы', + account_none_include_4: 'Стварайце некалькі профіляў у адным уліковым запісе', + account_premium_include_1: 'Павялічаная колькасць закладак', + account_premium_include_2: 'Пашыраная гісторыя праглядаў', + account_premium_include_3: 'Больш даступных таймкодаў', + account_premium_include_4: 'Колькасць профіляў на адзін уліковы запіс', + empty_subscribes_title: 'Вашы падпіскі на пераклады', + empty_subscribes_text: 'Проста падпішыцеся на ўлюбёны пераклад, і мы паведамім вам, калі выйдзе новая серыя.', + empty_history_title: 'Ваша гісторыя праглядаў', + empty_history_text: 'Ваша гісторыя праглядаў з’явіцца тут.', + empty_bookmark_title: 'Вашы абраныя', + empty_bookmark_text: 'Дадавайце фільмы і серыялы, якія вам падабаюцца, у абраныя, каб хутка знаходзіць іх у гэтым раздзеле.', + empty_mytorrents_title: 'Вашы торэнты', + empty_mytorrents_text: 'Торэнты, загружаныя праз TorServer, з’явяцца тут.', + developer_param_enabled: 'Рэжым распрацоўшчыка', + developer_param_nopremium: 'Адключыць CUB Premium', + developer_param_nodemo: 'Адключыць дэма-рэжым', + developer_param_ads: 'Паказваць рэкламу', + developer_param_fps: 'Паказваць FPS', + developer_trigger_help_1: 'Амаль адгадалі :)', + developer_trigger_help_2: 'Яшчэ крыху :)', + developer_trigger_help_3: 'Вы ўпэўнены, што хочаце ўвайсці ў рэжым распрацоўшчыка?', + developer_trigger_help_4: 'Рэжым распрацоўшчыка актываваны', + settings_param_navigation_touch: 'Сэнсар', + account_discuss_add_qr: 'Адскануйце QR-код', + account_discuss_add_title: 'Хочаце пакінуць каментар?', + account_discuss_add_text: 'Адскануйце QR-код, каб перайсці ў дадатак і пакінуць каментар да гэтага фільма ці серыяла.

- Вазьміце тэлефон або планшэт
- Адкрыйце камеру
- Навядзіце на QR-код
- Перайдзіце па спасылцы, якая з’явіцца на экране', + account_discuss_added: 'Дзякуй за ваш каментар!', + account_discuss_added_ready: 'Вы ўжо пакідалі каментар да гэтага фільма ці серыяла.', + remote_helper_long: 'Утрымлівайце кнопку (OK), каб адкрыць меню', + account_premium: 'Адкрыйце новыя гарызонты з уліковым запісам CUB Premium! Атрымлівайце асалоду ад павялічаных лімітаў і пашыраных магчымасцей сэрвісу. Наведайце , каб даведацца больш пра перавагі прэміум-акаўнта.', + player_segments_title: 'Сегменты', + player_segments_descr: 'Прапуск уступу і іншых частак відэа', + player_segments_ad_title: 'Рэклама', + player_segments_skip_title: 'Уступ і іншае', + player_segments_value_none: 'Не прапускаць', + player_segments_value_auto: 'Аўтапрапуск', + player_segments_value_user: 'Карыстальніцкі', + player_segments_skiped: 'Сегмент прапушчаны', + subscribe_info: 'У раздзеле «Падпіскі» вы ўбачыце ўсе свае падпіскі на пераклады. Вы атрымаеце апавяшчэнне, калі выйдзе новая серыя з выбраным перакладам.', + no_watch_history: 'Няма гісторыі прагляду', + } diff --git a/lang/bg.js b/lang/bg.js index 5bf72e5..190a04c 100644 --- a/lang/bg.js +++ b/lang/bg.js @@ -848,7 +848,7 @@ export default { account_imported: 'импортирано', account_reload_after: 'рестарт след 5 сек.', account_create: 'Открийте повече възможности с CUB акаунт. Регистрирайте се на и получете достъп за синхронизиране на вашите отметки, времеви кодове и други функции на CUB акаунта.', - account_premium: 'Открийте повече функции с CUB Premium акаунт. Увеличаване на ограниченията и достъпа до допълнителни функции на услугата.', + account_premium: 'Отключете нови хоризонти с CUB Premium акаунт! Възползвайте се от увеличени лимити и подобрена функционалност на услугата. Посетете и научете повече за предимствата на премиум акаунта.', account_premium_more: 'Научете повече за CUB Premium', account_limited: 'Достигнали сте максималния лимит. Увеличете лимита с CUB Premium акаунт. Научете повече на ', @@ -1187,5 +1187,60 @@ export default { terminal_deny: 'Забрани', terminal_update: 'Обнови', terminal_code: 'Код за достъп', - terminal_text: 'Заявявате достъп до терминала. Разработчиците могат да получат достъп до вашето устройство и да го управляват. Това може да е полезно за диагностика и отстраняване на проблеми, но също така може да представлява риск за сигурността. Моля, уверете се, че имате доверие на разработчиците, преди да предоставите достъп.

Можете да изключите тази функция по всяко време, като натиснете бутона "Забрани".' + terminal_text: 'Заявявате достъп до терминала. Разработчиците могат да получат достъп до вашето устройство и да го управляват. Това може да е полезно за диагностика и отстраняване на проблеми, но също така може да представлява риск за сигурността. Моля, уверете се, че имате доверие на разработчиците, преди да предоставите достъп.

Можете да изключите тази функция по всяко време, като натиснете бутона "Забрани".', + + title_anons: 'Съобщение', + title_developer: 'Разработчик', + title_navigation: 'Навигация', + title_page: 'Страница', + title_person_about: 'За актьора', + account_qr_premium: 'Сканирайте QR кода, за да научите повече за CUB Premium', + account_qr_code: 'Сканирайте QR кода, за да получите код за свързване на устройство', + account_qr_create: 'Сканирайте QR кода, за да създадете акаунт', + account_add_device_title: 'Добавяне на устройство', + account_add_device_text: 'Отидете на , за да получите код за добавяне на устройство.', + account_none_title: 'Все още нямате акаунт?', + account_none_include_1: 'Отметките и историята на гледане се съхраняват в облака', + account_none_include_2: 'Синхронизация между устройства', + account_none_include_3: 'Известия за нови епизоди и издания', + account_none_include_4: 'Създавайте няколко профила под един акаунт', + account_premium_include_1: 'Повече отметки', + account_premium_include_2: 'Разширена история на гледане', + account_premium_include_3: 'Повече налични таймкодове', + account_premium_include_4: 'Брой профили на акаунт', + empty_subscribes_title: 'Вашите абонаменти за преводи', + empty_subscribes_text: 'Просто се абонирайте за любимия си превод и ще ви уведомим, когато излезе нов епизод.', + empty_history_title: 'Вашата история на гледане', + empty_history_text: 'Историята на гледане ще се появи тук.', + empty_bookmark_title: 'Вашите любими', + empty_bookmark_text: 'Добавете филми и сериали, които харесвате, в „Любими“, за да ги намирате бързо в този раздел.', + empty_mytorrents_title: 'Вашите торенти', + empty_mytorrents_text: 'Торентите, които сте изтеглили чрез TorServer, ще се появят тук.', + developer_param_enabled: 'Режим за разработчици', + developer_param_nopremium: 'Деактивиране на CUB Premium', + developer_param_nodemo: 'Деактивиране на демо режим', + developer_param_ads: 'Показване на реклами', + developer_param_fps: 'Показване на FPS', + developer_trigger_help_1: 'Почти познахте :)', + developer_trigger_help_2: 'Още малко :)', + developer_trigger_help_3: 'Сигурни ли сте, че искате да влезете в режим за разработчици?', + developer_trigger_help_4: 'Режимът за разработчици е активиран', + settings_param_navigation_touch: 'Сензор', + account_discuss_add_qr: 'Сканирайте QR кода', + account_discuss_add_title: 'Искате да оставите коментар?', + account_discuss_add_text: 'Сканирайте QR кода, за да отворите приложението и да добавите коментар за този филм или сериал.

- Вземете телефона или таблета си
- Отворете камерата
- Насочете я към QR кода
- Следвайте връзката, която ще се появи на екрана', + account_discuss_added: 'Благодарим за вашия коментар!', + account_discuss_added_ready: 'Вече сте оставили коментар за този филм или сериал.', + remote_helper_long: 'Задръжте бутона (OK), за да отворите менюто', + account_premium: 'Отключете нови хоризонти с акаунт CUB Premium! Насладете се на увеличени лимити и разширени функции на услугата. Посетете , за да научите повече за предимствата на премиум акаунта.', + player_segments_title: 'Сегменти', + player_segments_descr: 'Прескачайте интрото и други части на видеото', + player_segments_ad_title: 'Реклами', + player_segments_skip_title: 'Интро и други', + player_segments_value_none: 'Без прескачане', + player_segments_value_auto: 'Автоматично прескачане', + player_segments_value_user: 'Персонализирано', + player_segments_skiped: 'Сегментът е пропуснат', + subscribe_info: 'В раздела „Абонаменти“ ще видите всички ваши абонаменти за преводи. Ще получите известие, когато излезе нов епизод с избрания от вас превод.', + no_watch_history: 'Няма история на сърфиране', } diff --git a/lang/cs.js b/lang/cs.js index 151cf42..12dede1 100644 --- a/lang/cs.js +++ b/lang/cs.js @@ -967,7 +967,7 @@ export default { account_imported: "importováno", account_reload_after: "restart za 5 sek.", account_create: 'Otevřete více možností s účtem CUB. Zaregistrujte se na webu a získejte přístup k synchronizaci vašich záložek, časových kódů a dalších možností účtu CUB.', - account_premium: "Otevřete nové obzory s účtem CUB Premium! Užijte si zvýšené limity a obohacenou funkčnost služby. Další možnosti na vás čekají již dnes", + account_premium: 'Odemkněte nové obzory s prémiovým účtem CUB! Využijte zvýšené limity a vylepšené funkce služeb. Navštivte a dozvíte se více o výhodách prémiového účtu.', account_premium_more: "Více o CUB Premium", account_limited: 'Dosáhli jste maximálního limitu. Zvýšte limit s účtem CUB Premium. Více na webu ', account_premium_include_1: "Zvýšení počtu záložek", @@ -1197,5 +1197,60 @@ export default { terminal_deny: 'Zakázat', terminal_update: 'Aktualizovat', terminal_code: 'Přístupový kód', - terminal_text: 'Žádáte o přístup k terminálu. Vývojáři mohou získat přístup k vašemu zařízení a ovládat jej. To může být užitečné pro diagnostiku a řešení problémů, ale také to může představovat bezpečnostní riziko. Ujistěte se, že důvěřujete vývojářům, než udělíte přístup.

Tuto funkci můžete kdykoli vypnout kliknutím na tlačítko "Zakázat".' + terminal_text: 'Žádáte o přístup k terminálu. Vývojáři mohou získat přístup k vašemu zařízení a ovládat jej. To může být užitečné pro diagnostiku a řešení problémů, ale také to může představovat bezpečnostní riziko. Ujistěte se, že důvěřujete vývojářům, než udělíte přístup.

Tuto funkci můžete kdykoli vypnout kliknutím na tlačítko "Zakázat".', + + title_anons: 'Oznámení', + title_developer: 'Vývojář', + title_navigation: 'Navigace', + title_page: 'Stránka', + title_person_about: 'O osobě', + account_qr_premium: 'Naskenujte QR kód a zjistěte více o CUB Premium', + account_qr_code: 'Naskenujte QR kód a získejte kód pro propojení zařízení', + account_qr_create: 'Naskenujte QR kód a vytvořte účet', + account_add_device_title: 'Přidat zařízení', + account_add_device_text: 'Přejděte na a získejte kód pro přidání zařízení.', + account_none_title: 'Ještě nemáte účet?', + account_none_include_1: 'Záložky a historie sledování se ukládají do cloudu', + account_none_include_2: 'Synchronizace mezi zařízeními', + account_none_include_3: 'Upozornění na nové epizody a vydání', + account_none_include_4: 'Vytvářejte více profilů pod jedním účtem', + account_premium_include_1: 'Zvětšený počet záložek', + account_premium_include_2: 'Rozšířená historie sledování', + account_premium_include_3: 'Více dostupných časových značek', + account_premium_include_4: 'Počet profilů na jeden účet', + empty_subscribes_title: 'Vaše odběry překladů', + empty_subscribes_text: 'Stačí se přihlásit k odběru oblíbeného překladu a my vás upozorníme, až vyjde nová epizoda.', + empty_history_title: 'Vaše historie sledování', + empty_history_text: 'Vaše historie sledování se zobrazí zde.', + empty_bookmark_title: 'Vaše oblíbené', + empty_bookmark_text: 'Přidejte filmy a seriály, které se vám líbí, do oblíbených, abyste je snadno našli v této sekci.', + empty_mytorrents_title: 'Vaše torrenty', + empty_mytorrents_text: 'Torrenty stažené přes TorServer se zobrazí zde.', + developer_param_enabled: 'Režim vývojáře', + developer_param_nopremium: 'Vypnout CUB Premium', + developer_param_nodemo: 'Vypnout demo režim', + developer_param_ads: 'Zobrazovat reklamy', + developer_param_fps: 'Zobrazovat FPS', + developer_trigger_help_1: 'Téměř jste to uhodli :)', + developer_trigger_help_2: 'Ještě trochu :)', + developer_trigger_help_3: 'Opravdu chcete vstoupit do režimu vývojáře?', + developer_trigger_help_4: 'Režim vývojáře aktivován', + settings_param_navigation_touch: 'Dotykové ovládání', + account_discuss_add_qr: 'Naskenujte QR kód', + account_discuss_add_title: 'Chcete přidat komentář?', + account_discuss_add_text: 'Naskenujte QR kód a otevřete aplikaci, kde můžete přidat komentář k tomuto filmu nebo seriálu.

- Vezměte telefon nebo tablet
- Otevřete fotoaparát
- Namiřte na QR kód
- Otevřete odkaz, který se objeví na obrazovce', + account_discuss_added: 'Děkujeme za váš komentář!', + account_discuss_added_ready: 'Komentář k tomuto filmu nebo seriálu jste již přidali.', + remote_helper_long: 'Podržte tlačítko (OK) pro otevření menu', + account_premium: 'Odemkněte nové možnosti s účtem CUB Premium! Užijte si vyšší limity a rozšířené funkce služby. Navštivte a zjistěte více o výhodách prémiového účtu.', + player_segments_title: 'Segmenty', + player_segments_descr: 'Přeskočit úvod a další části videa', + player_segments_ad_title: 'Reklamy', + player_segments_skip_title: 'Úvod a další', + player_segments_value_none: 'Nepřeskakovat', + player_segments_value_auto: 'Automaticky přeskočit', + player_segments_value_user: 'Vlastní', + player_segments_skiped: 'Segment přeskočen', + subscribe_info: 'V sekci „Odběry“ uvidíte všechny své odběry překladů. Dostanete upozornění, až vyjde nová epizoda s vaším vybraným překladem.', + no_watch_history: 'Žádná historie prohlížení', }; \ No newline at end of file diff --git a/lang/en.js b/lang/en.js index 24601ca..1ffd27e 100644 --- a/lang/en.js +++ b/lang/en.js @@ -848,7 +848,6 @@ export default { account_imported: 'imported', account_reload_after: 'reboot after 5 sec.', account_create: 'Discover more opportunities with a CUB account. Register at and get access to sync your bookmarks, timecodes and other CUB account features.', - account_premium: 'Discover more features with a CUB Premium account. Increasing limits and access to additional features of the service.', account_premium_more: 'Learn more about CUB Premium', account_limited: 'You have reached the maximum limit. Increase the limit with a CUB Premium account. Learn more at ', @@ -1186,5 +1185,61 @@ export default { terminal_deny: 'Deny', terminal_update: 'Update', terminal_code: 'Access code', - terminal_text: 'You are requesting access to the terminal. Developers may gain access to your device and control it. This can be useful for diagnostics and troubleshooting, but may also pose a security risk. Please make sure you trust the developers before granting access.

You can disable this feature at any time by clicking the "Deny" button.' + terminal_text: 'You are requesting access to the terminal. Developers may gain access to your device and control it. This can be useful for diagnostics and troubleshooting, but may also pose a security risk. Please make sure you trust the developers before granting access.

You can disable this feature at any time by clicking the "Deny" button.', + + + title_anons: 'Announcement', + title_developer: 'Developer', + title_navigation: 'Navigation', + title_page: 'Page', + title_person_about: 'About', + account_qr_premium: 'Scan the QR code to learn more about CUB Premium', + account_qr_code: 'Scan the QR code to receive a device linking code', + account_qr_create: 'Scan the QR code to create an account', + account_add_device_title: 'Add Device', + account_add_device_text: 'Go to to get a code for adding a device.', + account_none_title: 'Don’t have an account yet?', + account_none_include_1: 'Bookmarks and watch history are stored in the cloud', + account_none_include_2: 'Sync between devices', + account_none_include_3: 'Notifications about new episodes and releases', + account_none_include_4: 'Create multiple profiles under one account', + account_premium_include_1: 'Increased number of bookmarks', + account_premium_include_2: 'Extended watch history', + account_premium_include_3: 'More timecodes available', + account_premium_include_4: 'Number of profiles per account', + empty_subscribes_title: 'Your translation subscriptions', + empty_subscribes_text: 'Just subscribe to your favorite translation and we’ll notify you when a new episode is released.', + empty_history_title: 'Your watch history', + empty_history_text: 'Your watch history will appear here.', + empty_bookmark_title: 'Your favorites', + empty_bookmark_text: 'Add movies and TV shows you like to favorites to quickly find them in this section.', + empty_mytorrents_title: 'Your torrents', + empty_mytorrents_text: 'Torrents you’ve downloaded via TorServer will appear here.', + developer_param_enabled: 'Developer Mode', + developer_param_nopremium: 'Disable CUB Premium', + developer_param_nodemo: 'Disable Demo Mode', + developer_param_ads: 'Show Ads', + developer_param_fps: 'Show FPS', + developer_trigger_help_1: 'Almost guessed it :)', + developer_trigger_help_2: 'Just a little more :)', + developer_trigger_help_3: 'Are you sure you want to enter Developer Mode?', + developer_trigger_help_4: 'Developer Mode activated', + settings_param_navigation_touch: 'Sensor', + account_discuss_add_qr: 'Scan the QR code', + account_discuss_add_title: 'Want to leave a comment?', + account_discuss_add_text: 'Scan the QR code to go to the app and add a comment on this movie or TV series.

- Take your phone or tablet
- Open the camera
- Point to the QR code
- Follow the link that appears on the screen', + account_discuss_added: 'Thank you for your comment!', + account_discuss_added_ready: 'You have already left a comment on this movie or TV series.', + remote_helper_long: 'Hold the (OK) button to open the menu', + account_premium: 'Unlock new horizons with a CUB Premium account! Enjoy increased limits and enhanced service functionality. Visit and learn more about the benefits of a premium account.', + player_segments_title: 'Segments', + player_segments_descr: 'Skip intro and other parts of the video', + player_segments_ad_title: 'Ads', + player_segments_skip_title: 'Intro and other', + player_segments_value_none: 'Do not skip', + player_segments_value_auto: 'Auto skip', + player_segments_value_user: 'Custom', + player_segments_skiped: 'Segment skipped', + subscribe_info: 'In the Subscriptions section, you\'ll see all your translation subscriptions. You\'ll receive a notification when a new episode with your selected translation is released.', + no_watch_history: 'No browsing history', } diff --git a/lang/he.js b/lang/he.js index 8ec69ad..cfe5099 100644 --- a/lang/he.js +++ b/lang/he.js @@ -800,7 +800,7 @@ export default { account_imported: 'מיובא', account_reload_after: 'אתחל אחרי 5 שניות.', account_create: '', - account_premium: '', + account_premium: 'פתחו אופקים חדשים עם חשבון CUB Premium! תיהנו ממגבלות מוגדלות ופונקציונליות שירות משופרת. בקרו באתר ולמדו עוד על היתרונות של חשבון פרימיום.', account_premium_more: 'למד עוד על CUB Premium', account_limited: '', account_code_enter: 'הזן קוד בעל שש ספרות', @@ -1083,5 +1083,60 @@ export default { terminal_deny: 'לסרב', terminal_update: 'לעדכן', terminal_code: 'קוד גישה', - terminal_text: 'אתה מבקש גישה לטרמינל. מפתחים עשויים לקבל גישה למכשיר שלך ולשלוט בו. זה יכול להיות שימושי לאבחון ופתרון בעיות, אך גם עלול להוות סיכון אבטחה. ודא שאתה סומך על המפתחים לפני מתן גישה.

באפשרותך להשבית תכונה זו בכל עת על ידי לחיצה על כפתור "לסרב".' + terminal_text: 'אתה מבקש גישה לטרמינל. מפתחים עשויים לקבל גישה למכשיר שלך ולשלוט בו. זה יכול להיות שימושי לאבחון ופתרון בעיות, אך גם עלול להוות סיכון אבטחה. ודא שאתה סומך על המפתחים לפני מתן גישה.

באפשרותך להשבית תכונה זו בכל עת על ידי לחיצה על כפתור "לסרב".', + + title_anons: 'הודעה', + title_developer: 'מפתח', + title_navigation: 'ניווט', + title_page: 'עמוד', + title_person_about: 'על', + account_qr_premium: 'סרקו את קוד ה-QR כדי ללמוד עוד על CUB Premium', + account_qr_code: 'סרקו את קוד ה-QR כדי לקבל קוד לקישור המכשיר', + account_qr_create: 'סרקו את קוד ה-QR כדי ליצור חשבון', + account_add_device_title: 'הוספת מכשיר', + account_add_device_text: 'גשו אל כדי לקבל קוד להוספת המכשיר.', + account_none_title: 'עדיין אין לכם חשבון?', + account_none_include_1: 'סימניות והיסטוריית צפייה נשמרות בענן', + account_none_include_2: 'סנכרון בין מכשירים', + account_none_include_3: 'התראות על פרקים חדשים והוצאות חדשות', + account_none_include_4: 'צרו מספר פרופילים תחת חשבון אחד', + account_premium_include_1: 'מספר מוגדל של סימניות', + account_premium_include_2: 'היסטוריית צפייה מורחבת', + account_premium_include_3: 'יותר סימוני זמן זמינים', + account_premium_include_4: 'מספר פרופילים לחשבון', + empty_subscribes_title: 'המנויים שלכם לתרגומים', + empty_subscribes_text: 'פשוט הירשמו לתרגום המועדף עליכם ונודיע לכם כשיצא פרק חדש.', + empty_history_title: 'היסטוריית הצפייה שלכם', + empty_history_text: 'היסטוריית הצפייה שלכם תופיע כאן.', + empty_bookmark_title: 'המועדפים שלכם', + empty_bookmark_text: 'הוסיפו סרטים וסדרות שאהבתם למועדפים כדי למצוא אותם במהירות בחלק זה.', + empty_mytorrents_title: 'הטורנטים שלכם', + empty_mytorrents_text: 'הטורנטים שהורדו דרך TorServer יופיעו כאן.', + developer_param_enabled: 'מצב מפתח', + developer_param_nopremium: 'השבת CUB Premium', + developer_param_nodemo: 'השבת מצב הדגמה', + developer_param_ads: 'הצג פרסומות', + developer_param_fps: 'הצג FPS', + developer_trigger_help_1: 'כמעט ניחשתם :)', + developer_trigger_help_2: 'עוד קצת :)', + developer_trigger_help_3: 'האם אתם בטוחים שברצונכם להיכנס למצב מפתח?', + developer_trigger_help_4: 'מצב מפתח הופעל', + settings_param_navigation_touch: 'מגע', + account_discuss_add_qr: 'סרקו את קוד ה-QR', + account_discuss_add_title: 'רוצים להשאיר תגובה?', + account_discuss_add_text: 'סרקו את קוד ה-QR כדי לעבור לאפליקציה ולהוסיף תגובה לסרט או לסדרה הזו.

- קחו את הטלפון או הטאבלט שלכם
- פתחו את המצלמה
- כוונו אל קוד ה-QR
- עקבו אחרי הקישור שמופיע על המסך', + account_discuss_added: 'תודה על תגובתכם!', + account_discuss_added_ready: 'כבר השארתם תגובה לסרט או לסדרה הזו.', + remote_helper_long: 'החזיקו את הכפתור (OK) כדי לפתוח את התפריט', + account_premium: 'פתחו אופקים חדשים עם חשבון CUB Premium! תהנו ממגבלות מוגדלות ומפונקציות משופרות. בקרו ב- למידע נוסף על יתרונות החשבון הפרימיום.', + player_segments_title: 'קטעים', + player_segments_descr: 'דלגו על פתיח וחלקים אחרים של הסרטון', + player_segments_ad_title: 'פרסומות', + player_segments_skip_title: 'פתיח ואחרים', + player_segments_value_none: 'אל תדלג', + player_segments_value_auto: 'דלג אוטומטית', + player_segments_value_user: 'מותאם אישית', + player_segments_skiped: 'קטע דולג', + subscribe_info: 'בקטע "מנויים" תוכלו לראות את כל מנויי התרגום שלכם. תקבלו התראה כאשר יצא פרק חדש עם התרגום שבחרתם.', + no_watch_history: 'אין היסטוריית גלישה', } \ No newline at end of file diff --git a/lang/pt.js b/lang/pt.js index 627e993..c6235ab 100644 --- a/lang/pt.js +++ b/lang/pt.js @@ -847,7 +847,7 @@ export default { account_imported: 'Importado', account_reload_after: 'Reinicializar após 5 segundos.', account_create: 'Descubra mais oportunidades com uma conta CUB. Registe-se em e tenha acesso para sincronizar seus favoritos, tempos visualizados e outros recursos da conta CUB.', - account_premium: 'Descubra mais recursos com uma conta CUB Premium. Aumentando limites e acesso a recursos adicionais do serviço.', + account_premium: 'Desbrave novos horizontes com uma conta CUB Premium! Tire partido de limites maiores e funcionalidades de serviço melhoradas. Visite e saiba mais sobre os benefícios de uma conta premium.', account_premium_more: 'Saiba mais sobre CUB Premium', account_limited: 'Você atingiu o limite máximo. Aumente o limite com uma conta CUB Premium. Saiba mais em ', @@ -1171,5 +1171,60 @@ export default { terminal_deny: 'Negar', terminal_update: 'Atualizar', terminal_code: 'Código de acesso', - terminal_text: 'Você está solicitando acesso ao terminal. Os desenvolvedores podem acessar e controlar seu dispositivo. Isso pode ser útil para diagnóstico e solução de problemas, mas também pode representar um risco de segurança. Certifique-se de confiar nos desenvolvedores antes de conceder acesso.

Você pode desativar este recurso a qualquer momento clicando no botão "Negar".' + terminal_text: 'Você está solicitando acesso ao terminal. Os desenvolvedores podem acessar e controlar seu dispositivo. Isso pode ser útil para diagnóstico e solução de problemas, mas também pode representar um risco de segurança. Certifique-se de confiar nos desenvolvedores antes de conceder acesso.

Você pode desativar este recurso a qualquer momento clicando no botão "Negar".', + + title_anons: 'Anúncio', + title_developer: 'Desenvolvedor', + title_navigation: 'Navegação', + title_page: 'Página', + title_person_about: 'Sobre', + account_qr_premium: 'Escaneie o código QR para saber mais sobre o CUB Premium', + account_qr_code: 'Escaneie o código QR para obter o código de vinculação do dispositivo', + account_qr_create: 'Escaneie o código QR para criar uma conta', + account_add_device_title: 'Adicionar dispositivo', + account_add_device_text: 'Acesse para obter um código e adicionar o dispositivo.', + account_none_title: 'Ainda não tem uma conta?', + account_none_include_1: 'Favoritos e histórico de exibição são salvos na nuvem', + account_none_include_2: 'Sincronização entre dispositivos', + account_none_include_3: 'Notificações sobre novos episódios e lançamentos', + account_none_include_4: 'Crie vários perfis em uma única conta', + account_premium_include_1: 'Número aumentado de favoritos', + account_premium_include_2: 'Histórico de exibição expandido', + account_premium_include_3: 'Mais marcadores de tempo disponíveis', + account_premium_include_4: 'Número de perfis por conta', + empty_subscribes_title: 'Suas assinaturas de tradução', + empty_subscribes_text: 'Basta se inscrever na sua tradução favorita e nós avisaremos quando um novo episódio for lançado.', + empty_history_title: 'Seu histórico de exibição', + empty_history_text: 'Seu histórico de exibição aparecerá aqui.', + empty_bookmark_title: 'Seus favoritos', + empty_bookmark_text: 'Adicione filmes e séries que você gosta aos favoritos para encontrá-los facilmente nesta seção.', + empty_mytorrents_title: 'Seus torrents', + empty_mytorrents_text: 'Os torrents baixados via TorServer aparecerão aqui.', + developer_param_enabled: 'Modo desenvolvedor', + developer_param_nopremium: 'Desativar CUB Premium', + developer_param_nodemo: 'Desativar modo de demonstração', + developer_param_ads: 'Mostrar anúncios', + developer_param_fps: 'Mostrar FPS', + developer_trigger_help_1: 'Quase acertou :)', + developer_trigger_help_2: 'Mais um pouco :)', + developer_trigger_help_3: 'Tem certeza de que deseja entrar no modo desenvolvedor?', + developer_trigger_help_4: 'Modo desenvolvedor ativado', + settings_param_navigation_touch: 'Sensor', + account_discuss_add_qr: 'Escaneie o código QR', + account_discuss_add_title: 'Quer deixar um comentário?', + account_discuss_add_text: 'Escaneie o código QR para abrir o aplicativo e deixar um comentário sobre este filme ou série.

- Pegue seu celular ou tablet
- Abra a câmera
- Aponte para o código QR
- Siga o link que aparecer na tela', + account_discuss_added: 'Obrigado pelo seu comentário!', + account_discuss_added_ready: 'Você já deixou um comentário sobre este filme ou série.', + remote_helper_long: 'Segure o botão (OK) para abrir o menu', + account_premium: 'Desbloqueie novos horizontes com uma conta CUB Premium! Aproveite limites maiores e funcionalidades aprimoradas. Visite e saiba mais sobre os benefícios da conta premium.', + player_segments_title: 'Segmentos', + player_segments_descr: 'Pule a introdução e outras partes do vídeo', + player_segments_ad_title: 'Anúncios', + player_segments_skip_title: 'Introdução e outros', + player_segments_value_none: 'Não pular', + player_segments_value_auto: 'Pular automaticamente', + player_segments_value_user: 'Personalizado', + player_segments_skiped: 'Segmento pulado', + subscribe_info: 'Na seção "Assinaturas", você verá todas as suas assinaturas de tradução. Você receberá uma notificação quando um novo episódio com sua tradução selecionada for lançado.', + no_watch_history: 'Sem histórico de navegação', } diff --git a/lang/ru.js b/lang/ru.js index 449bc3f..65647bd 100644 --- a/lang/ru.js +++ b/lang/ru.js @@ -372,6 +372,7 @@ export default { title_actress: 'Актриса', title_person: 'Персона', title_persons: 'Персоны', + title_person_about: 'О персоне', title_comments: 'Комментарии', title_torrents: 'Торренты', title_trailers: 'Трейлеры', @@ -459,6 +460,10 @@ export default { title_top_100: 'Топ 100', title_ai_assistant: 'AI-ассистент', title_facts: 'Интересные факты', + title_anons: 'Анонс', + title_developer: 'Разработчик', + title_navigation: 'Навигация', + title_page: 'Страница', reactions_none: 'Нет реакций', reactions_fire: 'Супер', @@ -471,6 +476,7 @@ export default { subscribe_success: 'Вы успешно подписались', subscribe_error: 'Возникла ошибка при подписке, попробуйте позже', subscribe_noinfo: 'Не удалось получить информацию, попробуйте позже', + subscribe_info: 'В разделе (Подписки) у вас будут отображаться все ваши подписки на переводы. Когда выйдет новая серия с выбранным переводом, вы получите уведомление.', company_headquarters: 'Штаб', company_homepage: 'Сайт', @@ -754,6 +760,15 @@ export default { empty_title_two: 'Здесь пусто', empty_text_two: 'На данный момент список пустой', + empty_subscribes_title: 'Ваши подписки на переводы', + empty_subscribes_text: 'Просто подпишитесь на любимый перевод и мы будем уведомлять вас о выходе новой серии.', + empty_history_title: 'Ваша история просмотров', + empty_history_text: 'Здесь будет отображаться ваша история просмотров.', + empty_bookmark_title: 'Ваше избранное', + empty_bookmark_text: 'Добавляйте в избранное понравившиеся фильмы и сериалы, чтобы быстро находить их в этом разделе.', + empty_mytorrents_title: 'Ваши торренты', + empty_mytorrents_text: 'Здесь будут отображаться загруженные вами торренты через TorServer.', + back_to_card: 'Вернуться в карточку', menu_main: 'Главная', @@ -844,6 +859,7 @@ export default { settings_param_card_view_all: 'Показать все', settings_param_navigation_remote: 'Пульт', settings_param_navigation_mouse: 'Пульт с мышкой', + settings_param_navigation_touch: 'Сенсор', settings_param_keyboard_lampa: 'Встроенная', settings_param_keyboard_system: 'Системная', settings_param_card_interface_old: 'Старый', @@ -923,6 +939,14 @@ export default { player_normalization_type_down: 'Только понижение', player_youtube_no_played: 'К сожалению, это видео не доступно в вашем регионе, возможно, оно было заблокировано или удалено.', player_youtube_start_play: 'Для начала проигрывания видео, нажмите кнопку "Плей"', + player_segments_title: 'Сегменты', + player_segments_descr: 'Пропуск интро и другие части видео', + player_segments_ad_title: 'Рекламные вставки', + player_segments_skip_title: 'Интро и другое', + player_segments_value_none: 'Не пропускать', + player_segments_value_auto: 'Автопропуск', + player_segments_value_user: 'Пользовательский', + player_segments_skiped: 'Cегмент пропущен', broadcast_open: 'Открыть карточку на другом устройстве', broadcast_play: 'Выберите устройство для просмотра', @@ -977,7 +1001,7 @@ export default { account_imported: 'импортировано', account_reload_after: 'перезагрузка через 5 сек.', account_create: 'Откройте больше возможностей с аккаунтом CUB. Зарегистрируйтесь на сайте и получите доступ к синхронизации ваших закладок, тайм-кодов и других возможностей аккаунта CUB.', - account_premium: 'Раскройте новые горизонты с аккаунтом CUB Premium! Наслаждайтесь увеличенными лимитами и обогащенным функционалом сервиса. Дополнительные возможности ждут вас уже сегодня!', + account_premium: 'Раскройте новые горизонты с аккаунтом CUB Premium! Наслаждайтесь увеличенными лимитами и обогащенным функционалом сервиса. Перейдите на сайт и узнайте больше о преимуществах премиум аккаунта.', account_premium_more: 'Подробнее о CUB Premium', account_limited: 'Вы достигли максимального лимита. Увеличьте лимит с аккаунтом CUB Premium. Подробнее на сайте ', account_premium_include_1: 'Увеличение количество закладок', @@ -997,6 +1021,21 @@ export default { account_code_wrong: 'Возможно, вы указали неверный формат', account_code_where: 'Перейдите на сайт и введите указанный там код.', account_code_input: 'Ввести код', + account_qr_premium: 'Отсканируйте QR-код, чтобы узнать больше о CUB Premium', + account_qr_code: 'Отсканируйте QR-код для получения кода добавления устройства', + account_qr_create: 'Отсканируйте QR-код, чтобы создать аккаунт', + account_add_device_title: 'Добавить устройство', + account_add_device_text: 'Перейдите на сайт по ссылки чтобы получить код для добавления устройства.', + account_none_title: 'Еще нет аккаунта?', + account_none_include_1: 'Закладки и история просмотров сохраняются в облаке', + account_none_include_2: 'Синхронизация между устройствами', + account_none_include_3: 'Уведомления о новых сериях и релизах', + account_none_include_4: 'Создание нескольких профилей на одном аккаунте', + account_discuss_add_qr: 'Отсканируйте QR-код', + account_discuss_add_title: 'Хотите оставить комментарий?', + account_discuss_add_text: 'Отсканируйте QR-код, чтобы перейти в приложение и добавить комментарий к этому фильму или сериалу.

- Возьмите телефон или планшет
- Откройте камеру
- Наведите на QR-код
- Перейдите по ссылки, которая появится на экране', + account_discuss_added: 'Спасибо за ваш комментарий!', + account_discuss_added_ready: 'Вы уже оставили комментарий к этому фильму или сериалу.', network_noconnect: 'Нет подключения к сети', @@ -1160,7 +1199,7 @@ export default { discuss_rules_rule_4: 'Избегайте непонятных символов !?#%', discuss_rules_rule_5: 'Пишите полные предложения, используйте предложение из 5 и более слов.', discuss_rules_rule_6: 'Не используйте слишком длинные слова.', - discuss_rules_rule_7: 'Постарайтесь уместится в 300 символов.', + discuss_rules_rule_7: 'Постарайтесь уместиться в 300 символов.', discuss_voited: 'Спасибо за вашу оценку! Ваш голос помогает улучшать контент.', confirm_open_player: 'Другое устройство запрашивает доступ к плееру. Хотите воспроизвести видео?', @@ -1199,5 +1238,19 @@ export default { terminal_deny: 'Запретить', terminal_update: 'Обновить', terminal_code: 'Код доступа', - terminal_text: 'Вы запрашиваете доступ к терминалу. Разработчики могут получить доступ к вашему устройству и управлять им. Это может быть полезно для диагностики и устранения проблем, но также может представлять риск безопасности. Пожалуйста, убедитесь, что вы доверяете разработчикам, прежде чем предоставлять доступ.

Вы можете в любой момент отключить эту функцию нажав на кнопку "Запретить".' + terminal_text: 'Вы запрашиваете доступ к терминалу. Разработчики могут получить доступ к вашему устройству и управлять им. Это может быть полезно для диагностики и устранения проблем, но также может представлять риск безопасности. Пожалуйста, убедитесь, что вы доверяете разработчикам, прежде чем предоставлять доступ.

Вы можете в любой момент отключить эту функцию нажав на кнопку "Запретить".', + + developer_param_enabled: 'Режим разработчика', + developer_param_nopremium: 'Отключить CUB Premium', + developer_param_nodemo: 'Отключить демонстрационный режим', + developer_param_ads: 'Показывать рекламу', + developer_param_fps: 'Показывать FPS', + + developer_trigger_help_1: 'Почти догадались :)', + developer_trigger_help_2: 'Еще немного :)', + developer_trigger_help_3: 'Точно хочешь войти в режим разработчика?', + developer_trigger_help_4: 'Режим разработчика активирован', + + remote_helper_long: 'Удерживайте кнопку (ОК) для вызова меню', + no_watch_history: 'Нет истории просмотра', } diff --git a/lang/uk.js b/lang/uk.js index 869f395..5b840c8 100644 --- a/lang/uk.js +++ b/lang/uk.js @@ -805,7 +805,7 @@ export default { account_imported: 'імпортовано', account_reload_after: 'перезавантаження через 5 с.', account_create: 'Відкрийте більше можливостей з облікового запису CUB. Зареєструйтесь на сайті та отримайте доступ до синхронізації ваших закладок, тайм-кодів та інших можливостей облікового запису CUB.', - account_premium: 'Розкрийте нові горизонти з обліковим записом CUB Premium! Насолоджуйтесь збільшеними лімітами та збагаченим функціоналом сервісу. Додаткові можливості чекають на вас вже сьогодні!', + account_premium: 'Розкрийте нові горизонти з обліковим записом CUB Premium! Насолоджуйтесь збільшеними лімітами та збагаченим функціоналом сервісу. Перейдіть на сайт та дізнайтесь більше про переваги преміум акаунту.', account_premium_more: 'Докладніше про CUB Premium', account_limited: 'Ви досягли максимального ліміту. Збільште ліміт з обліковим записом CUB Premium. Докладніше на сайті ', account_premium_include_1: 'Збільшення кількості закладок', @@ -1161,5 +1161,60 @@ export default { terminal_deny: 'Заборонити', terminal_update: 'Оновити', terminal_code: 'Код доступу', - terminal_text: 'Ви запитуєте доступ до терміналу. Розробники можуть отримати доступ до вашого пристрою та керувати ним. Це може бути корисно для діагностики та усунення проблем, але також може становити ризик безпеки. Будь ласка, переконайтеся, що ви довіряєте розробникам, перш ніж надавати доступ.

Ви можете будь-коли вимкнути цю функцію, натиснувши кнопку "Заборонити".' + terminal_text: 'Ви запитуєте доступ до терміналу. Розробники можуть отримати доступ до вашого пристрою та керувати ним. Це може бути корисно для діагностики та усунення проблем, але також може становити ризик безпеки. Будь ласка, переконайтеся, що ви довіряєте розробникам, перш ніж надавати доступ.

Ви можете будь-коли вимкнути цю функцію, натиснувши кнопку "Заборонити".', + + title_anons: 'Анонс', + title_developer: 'Розробник', + title_navigation: 'Навігація', + title_page: 'Сторінка', + title_person_about: 'Про актора', + account_qr_premium: 'Скануйте QR-код, щоб дізнатися більше про CUB Premium', + account_qr_code: 'Скануйте QR-код, щоб отримати код для прив’язки пристрою', + account_qr_create: 'Скануйте QR-код, щоб створити обліковий запис', + account_add_device_title: 'Додати пристрій', + account_add_device_text: 'Перейдіть на , щоб отримати код для додавання пристрою.', + account_none_title: 'Ще не маєте облікового запису?', + account_none_include_1: 'Закладки та історія переглядів зберігаються у хмарі', + account_none_include_2: 'Синхронізація між пристроями', + account_none_include_3: 'Сповіщення про нові серії та релізи', + account_none_include_4: 'Створюйте кілька профілів в одному обліковому записі', + account_premium_include_1: 'Збільшена кількість закладок', + account_premium_include_2: 'Розширена історія переглядів', + account_premium_include_3: 'Більше таймкодів доступно', + account_premium_include_4: 'Кількість профілів на один обліковий запис', + empty_subscribes_title: 'Ваші підписки на переклади', + empty_subscribes_text: 'Просто підпишіться на улюблений переклад, і ми повідомимо вас, коли вийде нова серія.', + empty_history_title: 'Ваша історія переглядів', + empty_history_text: 'Ваша історія переглядів з’явиться тут.', + empty_bookmark_title: 'Ваші улюблені', + empty_bookmark_text: 'Додавайте фільми та серіали, які вам подобаються, до улюблених, щоб швидко знаходити їх у цьому розділі.', + empty_mytorrents_title: 'Ваші торенти', + empty_mytorrents_text: 'Торенти, завантажені через TorServer, з’являться тут.', + developer_param_enabled: 'Режим розробника', + developer_param_nopremium: 'Вимкнути CUB Premium', + developer_param_nodemo: 'Вимкнути демо-режим', + developer_param_ads: 'Показувати рекламу', + developer_param_fps: 'Показувати FPS', + developer_trigger_help_1: 'Майже вгадали :)', + developer_trigger_help_2: 'Ще трохи :)', + developer_trigger_help_3: 'Ви впевнені, що хочете увійти в режим розробника?', + developer_trigger_help_4: 'Режим розробника активовано', + settings_param_navigation_touch: 'Сенсор', + account_discuss_add_qr: 'Скануйте QR-код', + account_discuss_add_title: 'Хочете залишити коментар?', + account_discuss_add_text: 'Скануйте QR-код, щоб перейти до застосунку та залишити коментар до цього фільму чи серіалу.

- Візьміть телефон або планшет
- Відкрийте камеру
- Наведіть на QR-код
- Перейдіть за посиланням, що з’явиться на екрані', + account_discuss_added: 'Дякуємо за ваш коментар!', + account_discuss_added_ready: 'Ви вже залишали коментар до цього фільму чи серіалу.', + remote_helper_long: 'Утримуйте кнопку (OK), щоб відкрити меню', + account_premium: 'Відкрийте нові горизонти з обліковим записом CUB Premium! Насолоджуйтесь збільшеними лімітами та розширеними можливостями сервісу. Відвідайте , щоб дізнатися більше про переваги преміум-акаунта.', + player_segments_title: 'Сегменти', + player_segments_descr: 'Пропуск вступу та інших частин відео', + player_segments_ad_title: 'Реклама', + player_segments_skip_title: 'Вступ та інше', + player_segments_value_none: 'Не пропускати', + player_segments_value_auto: 'Автоматично пропускати', + player_segments_value_user: 'Користувацький', + player_segments_skiped: 'Сегмент пропущено', + subscribe_info: 'У розділі «Підписки» ви побачите всі свої підписки на переклади. Ви отримаєте сповіщення, коли вийде нова серія з вибраним перекладом.', + no_watch_history: 'Немає історії перегляду', } diff --git a/lang/zh.js b/lang/zh.js index 7e39df9..5bcfd05 100644 --- a/lang/zh.js +++ b/lang/zh.js @@ -805,7 +805,7 @@ export default { account_imported: '导入', account_reload_after: '5 秒后重启', account_create: '使用 CUB 帐户发现更多机会。 在 注册并获得同步您的书签、时间码和其他 CUB 帐户功能的权限。', - account_premium: '使用 CUB Premium 帐户发现更多功能。 增加对服务附加功能的限制和访问权限。', + account_premium: '使用 CUB Premium 账户开启新视野!享受更高的限额和更强大的服务功能。访问 了解更多高级账户的权益。', account_premium_more: '了解有关 CUB 高级版的更多信息', account_code_enter: '请输入六位验证码', @@ -1135,5 +1135,60 @@ export default { terminal_deny: '拒绝', terminal_update: '更新', terminal_code: '访问码', - terminal_text: '您正在请求访问终端。开发者可能会访问您的设备并进行控制。这对于诊断和排除问题很有用,但也可能带来安全风险。请确保您信任开发者后再授权访问。

您可以随时点击“拒绝”按钮关闭此功能。' + terminal_text: '您正在请求访问终端。开发者可能会访问您的设备并进行控制。这对于诊断和排除问题很有用,但也可能带来安全风险。请确保您信任开发者后再授权访问。

您可以随时点击“拒绝”按钮关闭此功能。', + + title_anons: '公告', + title_developer: '开发者', + title_navigation: '导航', + title_page: '页面', + title_person_about: '关于', + account_qr_premium: '扫描二维码以了解更多关于 CUB Premium 的信息', + account_qr_code: '扫描二维码以获取设备绑定代码', + account_qr_create: '扫描二维码以创建账户', + account_add_device_title: '添加设备', + account_add_device_text: '前往 获取添加设备的代码。', + account_none_title: '还没有账户?', + account_none_include_1: '书签和观看历史保存在云端', + account_none_include_2: '多设备同步', + account_none_include_3: '新剧集和新片发布通知', + account_none_include_4: '一个账户可创建多个个人资料', + account_premium_include_1: '增加书签数量', + account_premium_include_2: '扩展的观看历史', + account_premium_include_3: '更多可用的时间码', + account_premium_include_4: '每个账户的个人资料数量', + empty_subscribes_title: '您的翻译订阅', + empty_subscribes_text: '只需订阅您喜欢的翻译,我们会在新剧集发布时通知您。', + empty_history_title: '您的观看历史', + empty_history_text: '您的观看历史将显示在这里。', + empty_bookmark_title: '您的收藏', + empty_bookmark_text: '将您喜欢的电影和电视剧添加到收藏,以便在此部分快速找到。', + empty_mytorrents_title: '您的种子', + empty_mytorrents_text: '通过 TorServer 下载的种子文件将显示在这里。', + developer_param_enabled: '开发者模式', + developer_param_nopremium: '禁用 CUB Premium', + developer_param_nodemo: '禁用演示模式', + developer_param_ads: '显示广告', + developer_param_fps: '显示 FPS', + developer_trigger_help_1: '差一点就猜到了 :)', + developer_trigger_help_2: '再接近一点 :)', + developer_trigger_help_3: '您确定要进入开发者模式吗?', + developer_trigger_help_4: '开发者模式已激活', + settings_param_navigation_touch: '触控', + account_discuss_add_qr: '扫描二维码', + account_discuss_add_title: '想要发表评论吗?', + account_discuss_add_text: '扫描二维码进入应用程序,为此电影或电视剧添加评论。

- 拿起您的手机或平板
- 打开相机
- 对准二维码
- 点击屏幕上出现的链接', + account_discuss_added: '感谢您的评论!', + account_discuss_added_ready: '您已经为此电影或电视剧发表过评论。', + remote_helper_long: '长按 (OK) 键打开菜单', + account_premium: '通过 CUB Premium 账户解锁新体验!享受更高的限制和更强大的功能。访问 了解更多高级账户的优势。', + player_segments_title: '片段', + player_segments_descr: '跳过片头和视频的其他部分', + player_segments_ad_title: '广告', + player_segments_skip_title: '片头及其他', + player_segments_value_none: '不跳过', + player_segments_value_auto: '自动跳过', + player_segments_value_user: '自定义', + player_segments_skiped: '片段已跳过', + subscribe_info: '在“订阅”部分,您可以查看所有翻译订阅。当您选择的翻译发布新剧集时,您将收到通知。', + no_watch_history: '没有浏览历史记录', }