kindKey из реального TrackerMediaKind → destination_by_kind
transmissionMove когда есть torrentId, иначе move
config.json на Кракене — directory_policies для всех директорий
Canonical маркер .media-pipeline-canonical для music/books/games пишется в output директорию рядом с файлом
⚠️ Частично работает
Фильмы из downloads
.mkv/.mp4 → scanner видит → регион → transmissionMove → /media/movies/ → canonical marker → повторный run скипает ✅
TrackerMediaKind детектится по forum_id → правильная destination_by_kind✅
Музыка/книги/игры из downloads
Scanner не видит .mp3/.flac/.epub/.zip — нет videoExtensions для аудио ❌
Регион не создаётся → buildMovieActions не вызывается → файл остаётся в downloads
📋 Следующие шаги
Шаг D — Audio/non-video scanner (приоритет)
Чтобы музыка/книги/игры из downloads реально перекладывались:
AudioClassifier — isAudioFile() для .mp3/.flac/.m4a/.ogg/.aac/.wav/.opus
NonVideoRegionBuilder — создаёт регионы для директорий без video но с audio/doc файлами
FileScanner — при наличии TrackerMediaKind != .movie/.series (из Transmission метаданных) создавать регион даже без video
buildAudioActions в MediaFinalizer — move + NFO рядом, без symlink, canonical marker рядом
Альтернатива (проще): unsorted fallback — отдельный pass по unsorted_dir через Transmission API, для торрентов без региона вызывать torrent-set-location на основе mediaKind из страницы трекера
Шаг E — Верификация парсеров
HTML fixture тесты для rutor, nnm-club на живых страницах
Проверить extractMediaKind на реальных forum_id
Шаг F — Series из downloads
buildSeriesActions сейчас не читает policy → нет move для сериалов из downloads
Нужно прокинуть torrentURLFacts/torrentPageFacts аналогично movie
Ключевые питфоллы
CP1251: /usr/bin/iconv через temp files — единственный способ на Linux
extractGenres — из заголовка топика [YEAR, жанр, ...], не из тела поста
transmissionMove генерируется только если scanner создал регион (нужен video файл)
Canonical marker для music/books: output == source dir → повторный run скипает через agentResolvedInLibrary
allOutputDirs в PipelineRunner не включает directoryPolicies[].output → нужно обновить