diff --git a/Dockerfile b/Dockerfile index ff02415..4ea079c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,4 @@ FROM nginx:alpine COPY nginx.conf /etc/nginx/conf.d/default.conf COPY . /usr/share/nginx/html +RUN mkdir -p /usr/share/nginx/html/movies diff --git a/build_catalog.sh b/build_catalog.sh new file mode 100644 index 0000000..bd5702e --- /dev/null +++ b/build_catalog.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# Сборка catalog.json из папок фильмов. +# Запускать НА spb-easy-dale (где смонтирован volume): +# bash /data/coolify/applications/e9ghwyp5n5kyfshk55krbhki/build_catalog.sh +# +# Структура (ты заливаешь по SSH в MOVIES_DIR): +# / +# poster.jpg (обложка, имя неважно, берётся первая .jpg/.png) +# *.torrent (торрент, берётся первый .torrent) +# meta.txt (поля через "key: value", см. ниже) +# +# meta.txt поддерживает: title, original_title, year, genre(через запятую), +# rating, description. Если meta.txt нет — берётся как title. + +set -euo pipefail + +MOVIES_DIR="/data/coolify/applications/e9ghwyp5n5kyfshk55krbhki/movies" +OUT="$MOVIES_DIR/catalog.json" + +[[ -d "$MOVIES_DIR" ]] || { echo "Нет папки $MOVIES_DIR"; exit 1; } + +python3 - "$MOVIES_DIR" "$OUT" <<'PY' +import sys, os, json, datetime + +movies_dir, out = sys.argv[1], sys.argv[2] +movies = [] + +for entry in sorted(os.listdir(movies_dir)): + d = os.path.join(movies_dir, entry) + if not os.path.isdir(d) or entry.startswith('.'): + continue + meta = {'id': entry} + # читаем meta.txt + metafile = os.path.join(d, 'meta.txt') + if os.path.exists(metafile): + for line in open(metafile, encoding='utf-8'): + line = line.strip() + if not line or ':' not in line: + continue + k, v = line.split(':', 1) + k, v = k.strip().lower(), v.strip() + if k in ('genre',): + meta['genre'] = [x.strip() for x in v.split(',') if x.strip()] + elif k in ('year',): + meta['year'] = int(v) + elif k in ('rating',): + meta['rating'] = float(v) + elif k in ('title', 'original_title', 'description'): + meta[k] = v + # обложка + poster = None + for f in os.listdir(d): + if f.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')): + poster = f; break + if poster: + meta['poster'] = f"movies/{entry}/{poster}" + # торрент + torrent = None + for f in os.listdir(d): + if f.lower().endswith('.torrent'): + torrent = f; break + if torrent: + meta['torrent'] = f"movies/{entry}/{torrent}" + # fallback title + if 'title' not in meta: + meta['title'] = entry + movies.append(meta) + +catalog = { + 'name': 'Мой видеокаталог', + 'updated': datetime.date.today().isoformat(), + 'movies': movies, +} +with open(out, 'w', encoding='utf-8') as f: + json.dump(catalog, f, ensure_ascii=False, indent=2) +print(f'Готово: {len(movies)} фильм(ов) -> {out}') +for m in movies: + print(' -', m.get('title'), m.get('year', '')) +PY diff --git a/movies/.gitkeep b/movies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/nginx.conf b/nginx.conf index 7cb6ab0..7bf2e5f 100644 --- a/nginx.conf +++ b/nginx.conf @@ -23,6 +23,12 @@ server { try_files $uri =404; } + # Папка фильмов (persistent volume, монтируется в /movies) + location /movies/ { + add_header Access-Control-Allow-Origin * always; + try_files $uri $uri/ =404; + } + location / { try_files $uri $uri/ =404; } diff --git a/plugin.js b/plugin.js index f0ca7a2..476e90f 100644 --- a/plugin.js +++ b/plugin.js @@ -23,7 +23,7 @@ var content = comp.activity.render().find('.main__content'); content.html('
'); - fetch(base() + 'catalog.json') + fetch(base() + 'movies/catalog.json') .then(function (r) { return r.json(); }) .then(function (data) { comp.activity.loader(false);