Files
jellybit/docs/specs/jellyfin-layout.md
T

69 lines
3.7 KiB
Markdown

# Конвенции раскладки Jellyfin
Целевые имена и структура, в которые jellybit раскладывает файлы
хардлинками. Источники:
[Movies](https://jellyfin.org/docs/general/server/media/movies),
[Shows](https://jellyfin.org/docs/general/server/media/shows).
## Фильмы
```
movies/
Дюна Часть вторая (2024) [tmdbid-693134]/
Дюна Часть вторая (2024).mkv
Дюна Часть вторая (2024).ru.srt
```
- Папка и файл — `Название (Год)`.
- provider-id в имени папки (`[tmdbid-...]`) добавляется при работе с
базой — снимает неоднозначность для русских названий, которые Jellyfin
иначе может опознать неверно.
- Внешние субтитры — `Имя.<lang>[.flag].srt` (флаги `forced`/`sdh`/
`default`/`hi`), напр. `…ru.forced.srt`; база имени совпадает с именем
видеофайла. Пары VobSub — `.idx` + `.sub`.
## Сериалы
```
series/
Название (2024) [tvdbid-123456]/
Season 01/
Название (2024) S01E01.mkv
Название (2024) S01E02.mkv
```
- provider-id — на папке сериала.
- Сезоны — `Season 01`, файлы — `... SxxEyy`.
## Сопоставление источник → цель
Источник берём по пути из qBittorrent (`save_path`/`content_path` +
относительное имя, после трансляции `path_map` в хост-путь). Для каждого
распознанного **файла** (не каталога) создаётся **хардлинк** в
`paths.movies`/`paths.series`; целевые каталоги — `mkdir` (0755,
`1000:1000`). Исходный файл остаётся на месте (раздача продолжается),
inode общий — диск не дублируется.
Целевое имя строится из распознанных полей и **санитизируется** (без
разделителей пути, `..`, управляющих символов); финальный путь обязан
быть строго под библиотекой. Существующую цель **не перезаписываем** (тот
же inode → готово; другой файл → коллизия → review). Инварианты и undo —
в [architecture.md](architecture.md) → «Раскладка файлов».
Требование: целевой и исходный каталоги — на одной ФС (внутри контейнера
jellybit это обеспечивает mount `/srv`).
## Крайние случаи
- **Многофайловый фильм** (части) — стэкинг по точному токену Jellyfin
(`… - part1`/`cd1`); точный формат уточнить при реализации.
- **Редакции** — `Имя (Год) [edition-Director's Cut]` либо отдельные
версии в папке фильма.
- **Двойная серия** в одном файле — `… SxxEyy-Eyy`.
- **Спецвыпуски** — `Season 00`.
- **Сезон-пак** — серии в один `Season xx`; смешанный пак — по per-file
сезонам.
- **Несколько аудиодорожек** — обычно внутри mkv, не наша забота.
- **Аниме с абсолютной нумерацией** — пересчёт в S·E, отдельная проработка
([drafts/ideas.md](../drafts/ideas.md)).