(function () { 'use strict'; function translate() { Lampa.Lang.add({ lme_parser: { ru: 'Каталог парсеров', en: 'Parsers catalog', uk: 'Каталог парсерів', zh: '解析器目录' // Chinese translation }, lme_parser_description: { ru: 'Нажмите для выбора парсера из ', en: 'Click to select a parser from the ', uk: 'Натисніть для вибору парсера з ', zh: '单击以从可用的 ' }, lme_parser_current: { ru: 'Текущий выбор:', en: 'Current selection:', uk: 'Поточний вибір:', zh: '当前选择:' }, lme_parser_selected: { ru: 'Выбрано', en: 'Selected', uk: 'Обрано', zh: '已选择' }, lme_parser_refresh: { ru: 'Обновить проверку', en: 'Refresh check', uk: 'Оновити перевірку', zh: '刷新检测' }, lme_parser_none: { ru: 'Не выбран', en: 'Not selected', uk: 'Не вибрано', zh: '未选择' }, lme_parser_none_description: { ru: 'Без активного парсера', en: 'No active parser', uk: 'Без активного парсера', zh: '未启用解析器' }, lme_parser_health: { ru: 'Индикация состояния парсеров', en: 'Parser health indicator', uk: 'Індикація стану парсерів', zh: '解析器状态指示' }, lme_parser_status_ok: { ru: 'Доступен', en: 'Available', uk: 'Доступний', zh: '可用' }, lme_parser_status_auth: { ru: 'Ошибка ключа', en: 'Auth error', uk: 'Помилка ключа', zh: '密钥错误' }, lme_parser_status_network: { ru: 'Недоступен', en: 'Unavailable', uk: 'Недоступний', zh: '不可用' }, lme_parser_status_unknown: { ru: 'Не проверен', en: 'Unchecked', uk: 'Не перевірено', zh: '未检查' }, lme_parser_status_checking: { ru: 'Проверка...', en: 'Checking...', uk: 'Перевірка...', zh: '检查中...' }, lme_pubtorr: { ru: 'Каталог TorrServer', en: 'TorrServer catalog', uk: 'Каталог TorrServer', zh: '解析器目录' // Chinese translation }, lme_pubtorr_description: { ru: 'Бесплатные серверы от проекта LME', en: 'Free servers from the LME project', uk: 'Безкоштовні сервери від проєкту LME', zh: '来自 LME 项目的免费服务器 ' }, lme_pubtorr_firstrun: { "ru": "Привет! Ты установил плагин LME PubTorr, учти что если стоит Mods's то в разделе парсеров будет ошибка, которая не влияет на работу. Хочешь избавиться - оставь или LME PubTorr или Mods's.", "en": "Hello! You have installed the LME PubTorr plugin. Note that if Mods's is enabled, there will be an error in the parsers section that does not affect functionality. If you want to get rid of it, keep either LME PubTorr or Mods's.", "uk": "Привіт! Ви встановили плагін LME PubTorr, врахуйте, що якщо активовано Mods's, то в розділі парсерів буде помилка, яка не впливає на роботу. Якщо хочете позбутися - залиште або LME PubTorr, або Mods's.", "zh": "你好!你安装了LME PubTorr插件,请注意,如果启用了Mods's,解析器部分将出现错误,但这不会影响功能。如果你想摆脱它,请保留LME PubTorr或Mods's。" } }); } var Lang = { translate: translate }; var parsersInfo = [{ id: 'lampa_app', name: 'Lampa.app', settings: { url: 'lampa.app', key: '', parser_torrent_type: 'jackett' } }, { id: 'jacred_viewbox_dev', name: 'Viewbox', settings: { url: 'jacred.viewbox.dev', key: 'viewbox', parser_torrent_type: 'jackett' } }, { id: 'unknown', name: 'Unknown', settings: { url: '188.119.113.252:9117', key: '1', parser_torrent_type: 'jackett' } }, { id: 'trs_my_to', name: 'Trs.my.to', settings: { url: 'trs.my.to:9118', key: '', parser_torrent_type: 'jackett' } }, { id: 'jacred_my_to', name: 'Jacred.my.to', settings: { url: 'jacred.my.to', key: '', parser_torrent_type: 'jackett' } }, { id: 'jacred', name: 'Jac.red', settings: { url: 'jac.red', key: '', parser_torrent_type: 'jackett' } }, { id: 'JaCred_su', name: 'JacRed.su', settings: { url: 'jacred.su', key: '', parser_torrent_type: 'jackett' } }, { id: 'jac_red_ru', name: 'jac-red.ru', settings: { url: 'jac-red.ru', key: '', parser_torrent_type: 'jackett' } }]; function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } var STATUS = { ok: 'ok', authError: 'auth_error', networkError: 'network_error', unknown: 'unknown', checking: 'checking' }; var cache = { data: {}, TTL: 10 * 60 * 1000, get: function get(key) { var cached = this.data[key]; if (cached && Date.now() < cached.expiresAt) return cached; return null; }, set: function set(key, value) { this.data[key] = _objectSpread2(_objectSpread2({}, value), {}, { expiresAt: Date.now() + this.TTL }); } }; function getProtocol() { if (Lampa.Utils && typeof Lampa.Utils.protocol === 'function') return Lampa.Utils.protocol(); return location.protocol === 'https:' ? 'https://' : 'http://'; } function createHealthCheckUrl(parser) { if (!parser || !parser.settings || !parser.settings.url) return null; var settings = parser.settings; var parserType = settings.parser_torrent_type || 'jackett'; var hasProtocol = /^https?:\/\//.test(settings.url); var protocol = hasProtocol ? '' : getProtocol(); var apiKey = ''; if (parserType === 'prowlarr') apiKey = settings.key || '';else if (settings.url === 'spawn.pp.ua:59117') apiKey = '2';else apiKey = settings.key || ''; var basePath = parserType === 'prowlarr' ? '/api/v1/health' : '/api/v2.0/indexers/status:healthy/results'; return "".concat(protocol).concat(settings.url).concat(basePath, "?apikey=").concat(apiKey); } function cacheKey(parserId, url) { return "".concat(parserId, "::").concat(url); } function statusFromXhr(xhr) { if (!xhr) return STATUS.networkError; if (xhr.status === 200) return STATUS.ok; if (xhr.status === 401) return STATUS.authError; return STATUS.networkError; } function checkAlive(parsers) { if (!Array.isArray(parsers) || !parsers.length) return Promise.resolve({}); var results = {}; var requests = parsers.map(function (parser) { return new Promise(function (resolve) { var url = createHealthCheckUrl(parser); var parserId = parser.id || parser.name || 'unknown'; if (!url) { results[parserId] = STATUS.unknown; resolve(); return; } var key = cacheKey(parserId, url); var cached = cache.get(key); if (cached) { results[parserId] = cached.status; resolve(); return; } $.ajax({ url: url, method: 'GET', timeout: 5000, success: function success(response, textStatus, xhr) { var status = statusFromXhr(xhr); if (xhr.status === 200 || xhr.status === 401) { cache.set(key, { status: status }); } results[parserId] = status; resolve(); }, error: function error(xhr) { results[parserId] = statusFromXhr(xhr); resolve(); } }); }); }); return Promise.allSettled(requests).then(function () { return results; }); } var STORAGE_KEY = 'lme_url_two'; var NO_PARSER_ID = 'no_parser'; function getSelectedParserId() { return Lampa.Storage.get(STORAGE_KEY, NO_PARSER_ID); } function getParserById(parserId) { return parsersInfo.find(function (parser) { return parser.id === parserId; }); } function applySelectedParser() { var parserId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getSelectedParserId(); var selectedParser = getParserById(parserId); if (!selectedParser || !selectedParser.settings) { if (parserId !== NO_PARSER_ID) console.warn('PubTorr', 'parser not found', parserId); return false; } var settings = selectedParser.settings; var parserType = settings.parser_torrent_type || 'jackett'; Lampa.Storage.set(parserType === 'prowlarr' ? 'prowlarr_url' : 'jackett_url', settings.url); Lampa.Storage.set(parserType === 'prowlarr' ? 'prowlarr_key' : 'jackett_key', settings.key || ''); Lampa.Storage.set('parser_torrent_type', parserType); return true; } var HEALTH_KEY$1 = 'lme_parser_health'; var STATUS_CLASS = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, STATUS.ok, 'status-ok'), STATUS.authError, 'status-auth-error'), STATUS.networkError, 'status-network-error'), STATUS.unknown, 'status-unknown'), STATUS.checking, 'status-checking'); function statusLabel(status) { switch (status) { case STATUS.ok: return Lampa.Lang.translate('lme_parser_status_ok'); case STATUS.authError: return Lampa.Lang.translate('lme_parser_status_auth'); case STATUS.networkError: return Lampa.Lang.translate('lme_parser_status_network'); case STATUS.checking: return Lampa.Lang.translate('lme_parser_status_checking'); default: return Lampa.Lang.translate('lme_parser_status_unknown'); } } function applyStatus(item, status) { var classes = Object.values(STATUS_CLASS).join(' '); item.removeClass(classes); item.addClass(STATUS_CLASS[status] || STATUS_CLASS[STATUS.unknown]); item.find('.pubtorr-parser-modal__status').text(statusLabel(status)); } function applySelection(list, selectedId) { list.find('.pubtorr-parser-modal__item').removeClass('is-selected'); list.find("[data-parser-id=\"".concat(selectedId, "\"]")).addClass('is-selected'); } function buildItem(parser) { var item = $("