(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}'; $('