(function () {
'use strict';
var PLUGIN = { name: 'mymovies', title: 'My Movies', menu_action: 'mymovies' };
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(/^\/+/, '');
}
function esc(s) {
return String(s == null ? '' : s)
.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"');
}
// Load catalog via Lampa native network layer (TV-safe, fetch fails on some devices)
function loadCatalog(cb) {
var url = base() + 'movies/catalog.json';
if (Lampa.Reguest && Lampa.Reguest.get) {
Lampa.Reguest.get(url, function (html) {
try {
cb(null, JSON.parse(html));
} catch (e) {
cb(e, null);
}
}, function (err) {
cb(err || new Error('request failed'), null);
});
} else {
fetch(url).then(function (r) { return r.json(); })
.then(function (d) { cb(null, d); })
.catch(function (e) { cb(e, null); });
}
}
// ---------- Component: movie list ----------
function MyMovies() {
var comp = this;
this.create = function () {
return comp.render();
};
this.render = function () {
var html = document.createElement('div');
html.className = 'mymovies';
var grid = document.createElement('div');
grid.className = 'movies-grid';
html.appendChild(grid);
if (comp.activity) comp.activity.loader(true);
injectStyles();
loadCatalog(function (err, data) {
if (comp.activity) comp.activity.loader(false);
if (err) {
console.error('[mymovies] catalog error', err);
grid.innerHTML = '
Catalog load error
';
Lampa.Layer.update(html);
Lampa.Layer.visible(html);
return;
}
var movies = (data && data.movies) || [];
console.log('[mymovies] loaded', movies.length, 'films');
renderMovies($(grid), movies);
Lampa.Layer.update(html);
Lampa.Layer.visible(html);
});
return html;
};
}
Lampa.Component.add(PLUGIN.name, MyMovies);
function renderMovies(grid, movies) {
grid.empty();
if (!movies.length) {
grid.append('Catalog is empty
');
if (Lampa.Selector) Lampa.Selector.update();
return;
}
movies.forEach(function (m) {
var card = $('');
card.append($('
![]()
').attr('src', resolve(m.poster || m.cover)).attr('loading', 'lazy'));
card.append($('
').text(m.title || m.id));
if (m.year) card.append($('
').text(m.year));
card.on('hover:enter', function () { openMovie(m); });
grid.append(card);
});
if (Lampa.Selector) Lampa.Selector.update();
}
// Inject plugin styles so the grid looks like native Lampa movie cards
function injectStyles() {
if (window.__mymovies_css_injected) return;
window.__mymovies_css_injected = true;
var css = '' +
'.mymovies{padding:2.2em 3.4em;overflow-y:auto;height:100%;box-sizing:border-box}' +
'.movies-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:1.4em}' +
'.movie-card{background:#1c1f26;border-radius:10px;overflow:hidden;cursor:pointer;transition:transform .15s}' +
'.movie-card .card__poster{width:100%;aspect-ratio:2/3;object-fit:cover;display:block;background:#2a2e38}' +
'.movie-card .card__title{padding:.6em .7em .2em;font-size:1em;line-height:1.2;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}' +
'.movie-card .card__subtitle{padding:0 .7em .6em;font-size:.85em;opacity:.6}' +
'.movie-card.focus,.movie-card.hover{transform:scale(1.05)}' +
'.mymovies-detail{padding:3em;max-width:900px}' +
'.detail-head{display:flex;gap:2em}' +
'.detail-poster{width:220px;border-radius:10px}' +
'.detail-info h1{margin:0 0 .4em;font-size:1.8em}' +
'.detail-info>div{margin:.3em 0;opacity:.85}' +
'.detail-actions{margin-top:1.5em}' +
'.mymovies-empty{padding:2em;opacity:.6;font-size:1.2em}';
$('