fix: register menu via Lampa.Controller.add, start only on app:ready
This commit is contained in:
1 parent
6eb73c2c40
commit
e832651e4a
2 files changed
+85
-79
No files matched your search
@@ -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)
|
||||
@@ -106,28 +106,33 @@
|
||||
.replace(/>/g, '>').replace(/"/g, '"');
|
||||
}
|
||||
|
||||
// ---- Пункт меню ----
|
||||
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);
|
||||
}
|
||||
})();
|
||||
Reference in new issue
Block a user