5.4 KiB
5.4 KiB
title, created, updated, status, tags
| title | created | updated | status | tags | ||||
|---|---|---|---|---|---|---|---|---|
| Media Pipeline — Roadmap | 2026-05-17 | 2026-05-17 | active |
|
Media Pipeline — Roadmap
✅ Сделано
Шаг A — Transmission flow + Rutracker парсинг
TrackerPageParserRegistry— dispatch поurl.hostRutrackerPageParser— CP1251/iconv, SwiftSoup, жанры из заголовка топика, KP/IMDb IDsTrackerMediaKind— enum: movie/series/cartoon/documentary/music/audiobook/game/book/unknownextractMediaKind— детект поBB.catId/FORUM_IDна странице Rutracker (100+ forum IDs)TorrentPageMetadataFact.mediaKind+TorrentLocator.torrentId— пробрасывается через весь стекQueryBuilderStrategy—torrentTitleкак предпочитаемый source для поиска- Fallback NFO при unresolved +
torrentPageMetadata.hasRichData
Шаг B — Структура парсеров других трекеров
RutorPageParser,NNMClubPageParser,PirateBayPageParser,NyaaPageParser— структура реализована- Требуют верификации на живых HTML (нет тестовых fixture)
Шаг C — DirectoryPolicy + transmissionMove
DirectoryPolicy/MatchPolicy/MoveStrategyв конфиге — backward-compatibleFileAction.transmissionMove(torrentId:, from:, to:)— CodableApplyPhase— async execute, RPC → fallback filesystembuildMovieActions— читает policy,needsSymlink,needsNFO,effectiveOutputDirkindKeyиз реальногоTrackerMediaKind→destination_by_kindtransmissionMoveкогда естьtorrentId, иначеmoveconfig.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/.opusNonVideoRegionBuilder— создаёт регионы для директорий без video но с audio/doc файламиFileScanner— при наличииTrackerMediaKind != .movie/.series(из Transmission метаданных) создавать регион даже без videobuildAudioActionsв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→ нужно обновить
Файлы
Sources/MediaSources/APIs/TrackerParsers.swift— парсеры + registry +extractMediaKindSources/MediaDomain/Facts/TorrentPageMetadataFact.swift—TrackerMediaKind, поляSources/MediaDomain/Facts/TorrentInfoURLFact.swift—torrentId: Int?Sources/MediaSources/Protocol/TorrentInfoProvider.swift—TorrentLocator.torrentIdSources/MediaPipeline/Config/Config.swift—DirectoryPolicy,MatchPolicy,MoveStrategySources/MediaPipeline/Apply/FileAction.swift—transmissionMovecaseSources/MediaPipeline/Apply/ApplyPhase.swift— async execute, RPC fallbackSources/MediaPipeline/Apply/MediaFinalizer.swift— policy-aware routing, torrent extractors