OnlineBase.js
· 5.3 KiB · JavaScript
Исходник
(function () {
'use strict';
var network = new Lampa.Reguest();
var filmixHost = 'https://filmix.ac'; // Основной хост Filmix (может измениться, используйте зеркала)
var collapsHost = 'https://collaps.org'; // Хост для embeds Collaps
// Утилиты
function proxy(url) {
// Простой прокси для CORS (можно использовать ваш или встроенный Lampa)
return Lampa.Proxy.cors(url);
}
function cleanTitle(title) {
return title.replace(/[^a-zA-Z0-9 ]/g, '').toLowerCase();
}
// Провайдер для Filmix
var filmixProvider = {
search: function (query, callback, error) {
var url = proxy(filmixHost + '/search?query=' + encodeURIComponent(query));
network.silent(url, function (data) {
// Парсинг HTML результатов поиска (пример: извлечение ссылок на фильмы/сериалы)
var results = [];
// Предполагаем, что data - HTML, парсим с помощью DOMParser
var parser = new DOMParser();
var doc = parser.parseFromString(data, 'text/html');
$(doc).find('.film-item').each(function () {
var item = $(this);
var title = item.find('.title').text();
var year = item.find('.year').text();
var link = filmixHost + item.find('a').attr('href');
results.push({
title: title,
year: year,
url: link
});
});
callback(results);
}, error);
},
getStreams: function (url, callback, error) {
network.silent(proxy(url), function (data) {
// Извлечение embed из Filmix (обычно iframe с Collaps)
var embedUrl = $(data).find('iframe[src*="collaps"]').attr('src');
if (embedUrl) {
getCollapsStreams(embedUrl, callback, error);
} else {
error('No embed found');
}
}, error);
}
};
// Провайдер для Collaps (извлечение потоков из embed)
function getCollapsStreams(url, callback, error) {
network.silent(proxy(url), function (data) {
// Парсинг JS из embed для потоков (HLS/M3U8 или MP4)
var streams = [];
// Пример: поиск в скрипте плейлиста
var script = $(data).find('script').text();
var m3uMatch = script.match(/file:"([^"]+)"/);
if (m3uMatch) {
var m3uUrl = m3uMatch[1];
// Разбор M3U для качеств
network.silent(proxy(m3uUrl), function (m3uData) {
var lines = m3uData.split('\n');
for (var i = 0; i < lines.length; i++) {
if (lines[i].startsWith('#EXT-X-STREAM-INF')) {
var quality = lines[i].match(/RESOLUTION=\d+x(\d+)/)[1];
var file = lines[i+1];
streams.push({
quality: quality + 'p',
url: file
});
}
}
callback(streams);
}, error);
} else {
error('No streams found');
}
}, error);
}
// Компонент для Lampa
function component(object) {
var comp = Lampa.Component.create('online_services', object);
comp.search = function (query) {
filmixProvider.search(query, function (results) {
comp.render(results);
}, function (err) {
Lampa.Noty.show('Ошибка поиска: ' + err);
});
};
comp.getStream = function (item, call) {
filmixProvider.getStreams(item.url, function (streams) {
var playlist = streams.map(function (s) {
return {
title: s.quality,
url: s.url
};
});
call({ playlist: playlist });
}, function (err) {
Lampa.Noty.show('Ошибка загрузки потоков: ' + err);
});
};
// Фильтры и UI
comp.filter = function () {
// Добавьте сезоны/озвучки, если нужно
return {
seasons: [],
voices: []
};
};
return comp;
}
// Инициализация плагина
function init() {
Lampa.Component.add('online_services', component);
Lampa.Template.add('online_services_folder', '<div class="online-services-folder"></div>');
// Добавьте другие шаблоны по необходимости
}
if (window.appready) init();
else Lampa.Listener.follow('app', function (e) { if (e.type == 'ready') init(); });
})();
| 1 | (function () { |
| 2 | 'use strict'; |
| 3 | |
| 4 | var network = new Lampa.Reguest(); |
| 5 | var filmixHost = 'https://filmix.ac'; // Основной хост Filmix (может измениться, используйте зеркала) |
| 6 | var collapsHost = 'https://collaps.org'; // Хост для embeds Collaps |
| 7 | |
| 8 | // Утилиты |
| 9 | function proxy(url) { |
| 10 | // Простой прокси для CORS (можно использовать ваш или встроенный Lampa) |
| 11 | return Lampa.Proxy.cors(url); |
| 12 | } |
| 13 | |
| 14 | function cleanTitle(title) { |
| 15 | return title.replace(/[^a-zA-Z0-9 ]/g, '').toLowerCase(); |
| 16 | } |
| 17 | |
| 18 | // Провайдер для Filmix |
| 19 | var filmixProvider = { |
| 20 | search: function (query, callback, error) { |
| 21 | var url = proxy(filmixHost + '/search?query=' + encodeURIComponent(query)); |
| 22 | network.silent(url, function (data) { |
| 23 | // Парсинг HTML результатов поиска (пример: извлечение ссылок на фильмы/сериалы) |
| 24 | var results = []; |
| 25 | // Предполагаем, что data - HTML, парсим с помощью DOMParser |
| 26 | var parser = new DOMParser(); |
| 27 | var doc = parser.parseFromString(data, 'text/html'); |
| 28 | $(doc).find('.film-item').each(function () { |
| 29 | var item = $(this); |
| 30 | var title = item.find('.title').text(); |
| 31 | var year = item.find('.year').text(); |
| 32 | var link = filmixHost + item.find('a').attr('href'); |
| 33 | results.push({ |
| 34 | title: title, |
| 35 | year: year, |
| 36 | url: link |
| 37 | }); |
| 38 | }); |
| 39 | callback(results); |
| 40 | }, error); |
| 41 | }, |
| 42 | getStreams: function (url, callback, error) { |
| 43 | network.silent(proxy(url), function (data) { |
| 44 | // Извлечение embed из Filmix (обычно iframe с Collaps) |
| 45 | var embedUrl = $(data).find('iframe[src*="collaps"]').attr('src'); |
| 46 | if (embedUrl) { |
| 47 | getCollapsStreams(embedUrl, callback, error); |
| 48 | } else { |
| 49 | error('No embed found'); |
| 50 | } |
| 51 | }, error); |
| 52 | } |
| 53 | }; |
| 54 | |
| 55 | // Провайдер для Collaps (извлечение потоков из embed) |
| 56 | function getCollapsStreams(url, callback, error) { |
| 57 | network.silent(proxy(url), function (data) { |
| 58 | // Парсинг JS из embed для потоков (HLS/M3U8 или MP4) |
| 59 | var streams = []; |
| 60 | // Пример: поиск в скрипте плейлиста |
| 61 | var script = $(data).find('script').text(); |
| 62 | var m3uMatch = script.match(/file:"([^"]+)"/); |
| 63 | if (m3uMatch) { |
| 64 | var m3uUrl = m3uMatch[1]; |
| 65 | // Разбор M3U для качеств |
| 66 | network.silent(proxy(m3uUrl), function (m3uData) { |
| 67 | var lines = m3uData.split('\n'); |
| 68 | for (var i = 0; i < lines.length; i++) { |
| 69 | if (lines[i].startsWith('#EXT-X-STREAM-INF')) { |
| 70 | var quality = lines[i].match(/RESOLUTION=\d+x(\d+)/)[1]; |
| 71 | var file = lines[i+1]; |
| 72 | streams.push({ |
| 73 | quality: quality + 'p', |
| 74 | url: file |
| 75 | }); |
| 76 | } |
| 77 | } |
| 78 | callback(streams); |
| 79 | }, error); |
| 80 | } else { |
| 81 | error('No streams found'); |
| 82 | } |
| 83 | }, error); |
| 84 | } |
| 85 | |
| 86 | // Компонент для Lampa |
| 87 | function component(object) { |
| 88 | var comp = Lampa.Component.create('online_services', object); |
| 89 | |
| 90 | comp.search = function (query) { |
| 91 | filmixProvider.search(query, function (results) { |
| 92 | comp.render(results); |
| 93 | }, function (err) { |
| 94 | Lampa.Noty.show('Ошибка поиска: ' + err); |
| 95 | }); |
| 96 | }; |
| 97 | |
| 98 | comp.getStream = function (item, call) { |
| 99 | filmixProvider.getStreams(item.url, function (streams) { |
| 100 | var playlist = streams.map(function (s) { |
| 101 | return { |
| 102 | title: s.quality, |
| 103 | url: s.url |
| 104 | }; |
| 105 | }); |
| 106 | call({ playlist: playlist }); |
| 107 | }, function (err) { |
| 108 | Lampa.Noty.show('Ошибка загрузки потоков: ' + err); |
| 109 | }); |
| 110 | }; |
| 111 | |
| 112 | // Фильтры и UI |
| 113 | comp.filter = function () { |
| 114 | // Добавьте сезоны/озвучки, если нужно |
| 115 | return { |
| 116 | seasons: [], |
| 117 | voices: [] |
| 118 | }; |
| 119 | }; |
| 120 | |
| 121 | return comp; |
| 122 | } |
| 123 | |
| 124 | // Инициализация плагина |
| 125 | function init() { |
| 126 | Lampa.Component.add('online_services', component); |
| 127 | Lampa.Template.add('online_services_folder', '<div class="online-services-folder"></div>'); |
| 128 | // Добавьте другие шаблоны по необходимости |
| 129 | } |
| 130 | |
| 131 | if (window.appready) init(); |
| 132 | else Lampa.Listener.follow('app', function (e) { if (e.type == 'ready') init(); }); |
| 133 | })(); |