fix: register menu via Lampa.Controller.add, start only on app:ready

This commit is contained in:
Hermes committed 2026-08-08 03:08:06 +02:00
1 parent 6eb73c2c40
commit e832651e4a
2 files changed
+85 -79

No files matched your search

+62 -61
View File
@@ -1,72 +1,73 @@
# Lampa Plugin — «Мои фильмы»
# Lampa Movies — плагин «Мои фильмы»
Плагин добавляет в меню Lampa раздел **«Мои фильмы»**: каталог фильмов с обложками,
описанием и торрентами. Клик по фильму → детали → «Смотреть» → воспроизведение
через настроенный в Lampa torrserver (localhost:8090).
Статический сервер (nginx) на Coolify. Каталог и файлы фильмов живут в **persistent volume** (переживают деплои).
## Структура на сервере
**Сервер приложения:** `e9ghwyp5n5kyfshk55krbhki.31.129.103.242.sslip.io`
**Volume на spb-easy-dale:** `/data/coolify/applications/e9ghwyp5n5kyfshk55krbhki/movies` → смонтирован в контейнере как `/movies` (nginx отдаёт по URL `/movies/`).
Всё раздаётся по одному базовому URL (например `https://movies.example.com/`):
## Как добавить фильм (по SSH на spb-easy-dale)
1. Создай папку фильма в volume:
```
mkdir -p /data/coolify/applications/e9ghwyp5n5kyfshk55krbhki/movies/<id>
```
`<id>` — латиницей, без пробелов (например `inception`, `dune-2021`).
2. Залей в неё файлы:
- `meta.txt` — описание (см. формат ниже)
- обложка: любой `*.jpg` / `*.png` (берётся первая)
- торрент: любой `*.torrent` (берётся первый)
3. Пересобери `catalog.json`:
```
bash /data/coolify/applications/e9ghwyp5n5kyfshk55krbhki/build_catalog.sh
```
Готово — плагин в Lampa сразу увидит фильм (обновления страницы достаточно).
## Формат `meta.txt`
Строки `ключ: значение`:
```
server-root/
├── catalog.json описание каталога (массив фильмов)
├── covers/
│ ├── inception.jpg
│ └── interstellar.jpg
├── torrents/
│ ├── inception.torrent
│ └── interstellar.torrent
└── plugin.js (можно раздавать отсюда же или с отдельного хоста)
title: Начало
original_title: Inception
year: 2010
genre: фантастика, боевик
rating: 8.8
description: Дом Кобб — талантливый вор...
```
Поддерживаются: `title`, `original_title`, `year` (число), `genre` (через запятую),
`rating` (число), `description`. Если `meta.txt` нет — заголовком будет `<id>`.
## Пример (bash)
```bash
B=/data/coolify/applications/e9ghwyp5n5kyfshk55krbhki/movies
mkdir -p $B/inception
cat > $B/inception/meta.txt <<'EOF'
title: Начало
original_title: Inception
year: 2010
genre: фантастика, боевик
rating: 8.8
description: Дом Кобб — талантливый вор, специалист по извлечению секретов.
EOF
# скопируй обложку и торрент в $B/inception/
bash /data/coolify/applications/e9ghwyp5n5kyfshk55krbhki/build_catalog.sh
```
`catalog.json` — см. `catalog.example.json`. Поля фильма:
## Плагин в Lampa
| поле | обязательно | назначение |
|-----------------|-------------|---------------------------------------------|
| `id` | да | уникальный id |
| `title` | да | название |
| `original_title`| нет | оригинальное название |
| `year` | нет | год |
| `genre` | нет | массив жанров |
| `rating` | нет | рейтинг |
| `description` | нет | описание |
| `poster` | нет | путь к обложке в `covers/` (или полный URL) |
| `torrent` | да* | путь к `.torrent` в `torrents/` (или URL) |
| `magnet` | нет | magnet-ссылка (приоритетнее `torrent`) |
Настройки → Плагины → Добавить плагин → URL:
`http://e9ghwyp5n5kyfshk55krbhki.31.129.103.242.sslip.io/plugin.js`
\* нужен либо `torrent`, либо `magnet`.
Базовый URL захардкожен в `plugin.js` (менять в настройках не нужно).
## Требования к серверу
- Отдавать `catalog.json`, `covers/*`, `torrents/*` по HTTPS (или HTTP, если Lampa на
том же устройстве).
- **CORS**: заголовок `Access-Control-Allow-Origin: *` на `catalog.json` и обложки
(Lampa грузит их из WebView). Торрент torrserver забирает сам — CORS для него не нужен,
но файл должен отдаваться с корректным типом.
- Любой статический хостинг: nginx, Caddy, GitHub Pages, хостинг торрент-бокса и т.п.
Пример nginx:
```nginx
location / {
add_header Access-Control-Allow-Origin *;
try_files $uri $uri/ =404;
}
```
## Установка плагина в Lampa
1. Положи `plugin.js` на доступный по URL хост, запомни прямую ссылку
(например `https://movies.example.com/plugin.js`).
2. В Lampa: **Настройки → Плагины → Добавить плагин** → вставить URL `plugin.js` → OK.
3. В **Настройки → Плагины → Мои фильмы** (параметр «Адрес сервера каталога»)
вписать базовый URL сервера (с `/` на конце), напр. `https://movies.example.com/`.
4. В главном меню появится пункт **«Мои фильмы»**.
## Поток воспроизведения
При нажатии «Смотреть» плагин передаёт torrent/magnet в `Lampa.Player`. Дальше
работает уже настроенный в Lampa torrserver (локально `localhost:8090`), который
раздаёт видеопоток плееру. Плагин сам torrserver не трогает.
## Файлы репо (Gitea `admin/mymovies`)
- `Dockerfile` — nginx + создание `/usr/share/nginx/html/movies`
- `nginx.conf` — раздача `catalog.json`, `/covers/`, `/torrents/`, `/movies/` с CORS
- `plugin.js` — код плагина (тянет `/movies/catalog.json`)
- `build_catalog.sh` — скан папок → `catalog.json` (копируется на spb при необходимости)
- `catalog.json` — **старый** корневой каталог (не используется плагином, можно удалить)
- `add_movie.sh` — альтернативный хелпер (правит корневой `catalog.json`, не volume)
+23 -18
View File
@@ -106,28 +106,33 @@
.replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
// ---- Пункт меню ----
function addMenuItem() {
if ($('.menu__item[data-component="' + PLUGIN.name + '"]').length) return;
var item = $('<div class="menu__item selector" data-component="' + PLUGIN.name + '">')
.append($('<span>').text(PLUGIN.title));
$('.menu__list').append(item);
item.on('hover:enter', function () {
Lampa.Activity.push({ url: '', component: PLUGIN.name, title: PLUGIN.title, page: PLUGIN.title });
// ---- Пункт меню (нативный API Lampa) ----
function addMenu() {
Lampa.Controller.add('menu', {
component: PLUGIN.name,
name: PLUGIN.title,
icon: 'archive',
action: function () {
Lampa.Activity.push({
url: '',
component: PLUGIN.name,
title: PLUGIN.title,
page: PLUGIN.title
});
}
});
Lampa.Selector.update();
}
function start() {
addMenuItem();
Lampa.Listener.follow('app', function (e) {
if (e.type === 'ready') addMenuItem();
});
Lampa.Listener.follow('menu', function (e) {
if (e.type === 'open' || e.type === 'update') addMenuItem();
});
addMenu();
}
if (window.Lampa) start();
else document.addEventListener('lampa', start);
// Стартуем ТОЛЬКО когда Lampa готова — иначе Lampa.Selector не проинициализирован
if (window.Lampa && Lampa.Controller) {
Lampa.Listener.follow('app', function (e) {
if (e.type === 'ready') start();
});
} else {
document.addEventListener('lampa', start);
}
})();