162 lines
6.4 KiB
JavaScript
162 lines
6.4 KiB
JavaScript
(function () {
|
||
'use strict';
|
||
|
||
var PLUGIN = { name: 'mymovies', title: 'Мои фильмы' };
|
||
var DEFAULT_BASE = 'https://movies-lmp-18.dynv6.net/';
|
||
|
||
function base() {
|
||
var b = Lampa.Storage.get(PLUGIN.name + '_base', DEFAULT_BASE);
|
||
return b.replace(/\/+$/, '') + '/';
|
||
}
|
||
function resolve(p) {
|
||
if (!p) return '';
|
||
if (/^https?:\/\//.test(p)) return p;
|
||
if (/^magnet:/.test(p)) return p;
|
||
return base() + p.replace(/^\/+/, '');
|
||
}
|
||
|
||
// ---- Компонент: список фильмов ----
|
||
Lampa.Component.add(PLUGIN.name, {
|
||
create: function () {
|
||
var comp = this;
|
||
comp.activity.loader(true);
|
||
var content = comp.activity.render().find('.main__content');
|
||
content.html('<div class="mymovies"><div class="movies-grid"></div></div>');
|
||
|
||
fetch(base() + 'movies/catalog.json')
|
||
.then(function (r) { return r.json(); })
|
||
.then(function (data) {
|
||
comp.activity.loader(false);
|
||
renderMovies(content.find('.movies-grid'), data.movies || []);
|
||
})
|
||
.catch(function () {
|
||
comp.activity.loader(false);
|
||
Lampa.Noty.show('Не удалось загрузить каталог');
|
||
});
|
||
}
|
||
});
|
||
|
||
function renderMovies(grid, movies) {
|
||
grid.empty();
|
||
if (!movies.length) {
|
||
grid.append('<div class="mymovies-empty">Каталог пуст</div>');
|
||
return;
|
||
}
|
||
movies.forEach(function (m) {
|
||
var card = $('<div class="card selector" data-id="' + m.id + '">');
|
||
card.append($('<img class="card__img">').attr('src', resolve(m.poster || m.cover)).attr('loading', 'lazy'));
|
||
card.append($('<div class="card__title">').text(m.title));
|
||
if (m.year) card.append($('<div class="card__subtitle">').text(m.year));
|
||
card.on('hover:enter', function () { openMovie(m); });
|
||
grid.append(card);
|
||
});
|
||
Lampa.Selector.update();
|
||
}
|
||
|
||
// ---- Компонент: детали фильма ----
|
||
var selected = null;
|
||
Lampa.Component.add(PLUGIN.name + '_detail', {
|
||
create: function () {
|
||
var m = selected;
|
||
if (!m) { Lampa.Activity.back(); return; }
|
||
var html = '<div class="mymovies-detail">';
|
||
html += '<div class="detail-head">';
|
||
html += '<img class="detail-poster" src="' + resolve(m.poster || m.cover) + '">';
|
||
html += '<div class="detail-info"><h1>' + esc(m.title) + '</h1>';
|
||
if (m.original_title) html += '<div class="detail-orig">' + esc(m.original_title) + '</div>';
|
||
if (m.year) html += '<div class="detail-year">' + m.year + '</div>';
|
||
if (m.genre && m.genre.length) html += '<div class="detail-genre">' + m.genre.join(', ') + '</div>';
|
||
if (m.rating) html += '<div class="detail-rating">★ ' + m.rating + '</div>';
|
||
if (m.description) html += '<div class="detail-desc">' + esc(m.description) + '</div>';
|
||
html += '</div></div>';
|
||
html += '<div class="detail-actions"><div class="btn selector" data-act="play">Смотреть</div></div>';
|
||
html += '</div>';
|
||
|
||
var content = this.activity.render().find('.main__content');
|
||
content.html(html);
|
||
content.find('[data-act="play"]').on('hover:enter', function () { play(m); });
|
||
Lampa.Selector.update();
|
||
}
|
||
});
|
||
|
||
function openMovie(m) {
|
||
selected = m;
|
||
Lampa.Activity.push({
|
||
url: '',
|
||
component: PLUGIN.name + '_detail',
|
||
title: m.title,
|
||
page: m.title
|
||
});
|
||
}
|
||
|
||
function play(m) {
|
||
var url = m.magnet ? m.magnet : resolve(m.torrent);
|
||
Lampa.Player.play({
|
||
url: url,
|
||
title: m.title,
|
||
img: resolve(m.poster || m.cover),
|
||
season: 0,
|
||
episode: 0
|
||
});
|
||
}
|
||
|
||
function esc(s) {
|
||
return String(s == null ? '' : s)
|
||
.replace(/&/g, '&').replace(/</g, '<')
|
||
.replace(/>/g, '>').replace(/"/g, '"');
|
||
}
|
||
|
||
// ---- Пункт меню ----
|
||
// bylampa строит главное меню из menu_items и ПЕРЕД отрисовкой шлёт
|
||
// событие 'menu:start' с body = jQuery-объект меню (.menu__list внутри).
|
||
// Добавляем <li class="menu__item"> в .menu__list. Защита от дублей по data-action.
|
||
var added = false;
|
||
function addMenuItem() {
|
||
var list = $('.menu__list');
|
||
if (!list.length) return;
|
||
if (list.find('[data-action="' + PLUGIN.name + '"]').length) return; // уже есть в этом меню
|
||
if (added) return; // уже добавляли когда-либо
|
||
added = true;
|
||
|
||
var item = $(
|
||
'<li class="menu__item selector" data-action="' + PLUGIN.name + '">' +
|
||
'<div class="menu__ico">' +
|
||
'<svg class="sprite-folder"><use xlink:href="#sprite-folder"></use></svg>' +
|
||
'</div>' +
|
||
'<div class="menu__text">' + PLUGIN.title + '</div>' +
|
||
'</li>'
|
||
);
|
||
item.on('hover:enter', function () {
|
||
Lampa.Activity.push({
|
||
url: '',
|
||
component: PLUGIN.name,
|
||
title: PLUGIN.title,
|
||
page: PLUGIN.title
|
||
});
|
||
});
|
||
list.append(item);
|
||
Lampa.Selector.update();
|
||
}
|
||
|
||
function start() {
|
||
// подписываемся на сборку меню (при каждом открытии меню)
|
||
Lampa.Listener.follow('menu', function (e) {
|
||
if (e.type === 'start') {
|
||
setTimeout(addMenuItem, 50);
|
||
}
|
||
});
|
||
// если меню уже отрисовано — добавляем сразу (один раз)
|
||
addMenuItem();
|
||
}
|
||
|
||
// Стартуем когда Lampa готова (или сразу, если уже готова)
|
||
if (window.Lampa && Lampa.Listener && Lampa.Activity) {
|
||
start();
|
||
Lampa.Listener.follow('app', function (e) {
|
||
if (e.type === 'ready') start();
|
||
});
|
||
} else {
|
||
document.addEventListener('lampa', start);
|
||
}
|
||
})();
|