Merge branch 'origin/main' into main

This commit is contained in:
2026-05-17 22:14:03 +06:00
75 changed files with 650 additions and 1124 deletions
+8 -6
View File
@@ -1,14 +1,16 @@
---
title: "💬 Афоризмы и тосты"
aliases: ["Афоризмы", "Тосты", "Мысли", "Aphorisms", "aphorisms"]
title: "💬 Афоризмы и мысли"
aliases: ["Афоризмы", "Aphorisms", "aphorisms"]
tags: ["personal", "creative", "humor"]
updated: "2026-05-17"
related:
- "[[personal/creative/toasts]]"
- "[[personal/creative/poems]]"
- "[[personal/creative/songs]]"
---
# 💬 Афоризмы и тосты
# 💬 Афоризмы и мысли
## Тост
Без хуя бы - нихуя бы
> Стихи → [[personal/creative/poems]] | Тосты → [[personal/creative/toasts]] | Песни → [[personal/creative/songs]]
Глобально никаких перспектив. Осталось чуть-чуть.
+91
View File
@@ -0,0 +1,91 @@
---
title: Генерация идей — методы и темы
aliases:
- генерация-идей-творчество
- keep-import
tags:
- personal
- creative
- ideas
- music
- poetry
updated: '2026-05-17'
---
# Генерация идей (творчество, процесс мозгового штурма)
- смерть, принятие конечности, перерождение, бойцовский клуб
-
- цель
- минимизация шума
- атмосфера: проекция, стилистика, одежда, свечи
- подбор референсов
- тема: ночь, город, одиночество, абсурд
Музыка:
- Ограничения: 1 тональность, 1 темп, 3 аккорда → снижает хаос.
- Лупинг: короткий цикл (4–8 тактов) и вариации поверх.
- Случайные входы: генерация аккордов/ритма (dice/random apps).
Поэтические
- Автоматическое письмо (5–10 мин без остановки).
- Ассоциативные цепочки (каждый добавляет слово).
- Ограниченные формы (например: 4 строки, фиксированный ритм).
Темы (по направлениям)
1. Урбанистика и среда
Ночной транспорт, пустые станции, последний поезд
Дворы, подъезды, лифты как «переходные пространства», клаустрофобия, паранойя: шёпот
Камеры наблюдения / ощущение наблюдаемости
Неон, витрины, отражения в стекле
Заброшенные здания, индустриальные зоны
2. Время и состояние
Застывшее время / петля
Потеря последовательности событий
«5 минут, растянутые в вечность»
Утро после бессонной ночи
Распад дня на фрагменты
3. Идентичность
Раздвоение личности
«Я» как персонаж, наблюдающий себя
Потеря имени / языка
Маски (социальные, цифровые)
Альтернативные версии себя
4. Тело и восприятие
Замедленные движения
Синестезия (звук как цвет, слово как вкус)
Тело как чужой объект
Изменённое ощущение веса / гравитации
Дыхание как ритм композиции
5. Технологии и цифровое
Переписка без ответа
Ошибки интерфейса как поэзия
Глитчи, лаги, цифровые «артефакты»
Потерянные файлы / corrupted память
Человек как алгоритм
6. Природа (искажённая)
Лес ночью как лабиринт
Вода как зеркало/портал
Ветер как голос
Космос как пустота/шум
Растения как наблюдатели
7. Социальные сцены
Разговор, который не происходит
Случайная встреча с незнакомцем
Тишина в компании
Неловкость, паузы, недосказанность
Коллективное молчание
8. Абсурд и сюрреализм
Нелогичные переходы сцен
Объекты, меняющие свойства
Диалоги без смысла
Повторяющиеся символы
Нарушение причинно-следственных связей
Быстрые генераторы (для запуска)
1 эмоция + 1 место + 1 ограничение
→ «паранойя + лифт + только шёпот»
1 объект + 1 искажение
→ «телефон, который отвечает сам»
1 временной сдвиг
→ «разговор из будущего с самим собой»
@@ -0,0 +1,14 @@
---
title: Да будь я евреем (пародия на Маяковского)
tags:
- personal
- creative
- poetry
- humor
updated: '2026-05-17'
---
Да будь я евреем преклонных годов,
И то — nicht zweifelnd und bitter,
Немецкий я б выучил только за то,
Что им разговаривал Гитлер.
@@ -0,0 +1,35 @@
---
title: Крематорий на танцполе
tags:
- personal
- creative
- poetry
- humor
updated: '2026-05-17'
---
Осыпаются ресницы,
Разбегаются глаза,
Отказала поясница,
Приказала железа
Мне тут Яндекс.Навигатор,
Как его не полюбить!
Присоветовал Крематор..
И теперь мне с этим жить.
Применение простое:
Вжух! И все, и насовсем!
Никаких тебе отстоев,
Никаких тебе проблем!
Жизнь прекрасная нас ищет,
Нахер яхты, Феберже!
..жалко лишь, что на кладбище
Нам не выспаться, уже..
*Припев:*
Крематорий на танцполе
Крематорий — жизнь моя
Не горю я по неволе
Мне Крематор нахуя
-142
View File
@@ -209,89 +209,6 @@ related: ["[[family/documents/karaoke-songs]]"]
Старая бы блядь
х2
## Самоизоляция
Баста карапузики
Кончилися танцы
Помирать так с музыкой
Зажигаем, братцы!
Эй вы, бронхиальные
Эй вы, астматичные
Эй вы ненормальные,
Пневмоатипичные
Эй вы объебошенные,
Пучащие глазки,
Мерзкие, непрошеные,
Надеваем маски!
[Эй, судьбою брошенные
Мерзкие букашки
Нищие, непрошенные,
Надеваем маски!]
Эй, ухнем!
Эй, охнем!
Пусть рухнем!
Зато не сдохнем!
Все переболевшие,
Сильные и хилые,
Ну, как очумевшие,
Отдыхаем, милые
Полуотмороженная
недопопуляция
выполняй положенную
самоизоляцию!
Эй, ухнем!
Эй, охнем!
Пусть рухнем!
Зато не сдохнем!
Все вы виноватые,
Суки, что чихали ртом,
Ну давай намазывай,
Руки санитайзером
Победим заразу мы
Классовой дистанцией
Захлебнись в сортире ты
Чтоб не заражаться!
[В том что покидали дом,
Нука обрабатывай
Руки санитайзером!
Нету голодающих,
Жральни позакрыты
Ну а всем нуждающимся -
Выдадим кредиты!
Эй, ухнем!
Эй, охнем!
Пусть рухнем!
Зато не сдохнем!
Всех вражин поборим мы
Внутренних, и внешних мы!
Половцы непрошены,
Будут все низвержены!
Победим Ковидину
Классовой дистанцией!
И поправки примем мы,
Мы на все согласные!
Ух, плато!
Эх, ой-ли?
Все всрато,
Зато не сдохли!]
## Птицы Рагнарёка
@@ -385,12 +302,7 @@ related: ["[[family/documents/karaoke-songs]]"]
## Реп
Делай добро и бросай его в воду
Зелень богатым работу народу
Смерть для солдата
Для зэка - свободу
Скажу своей Натусе я что чёдня на тусе я
И пусть не ждёт меня друзья моя фамилия
## Искупление
@@ -434,42 +346,6 @@ related: ["[[family/documents/karaoke-songs]]"]
Крой раскрывает кривые свершения
Под искрометной любви до скончания
## И много много радости Light
Пустой вокзал (Мечты причал)
Собака чует уфф.. палево в ночи
Дрова последние сгорают под окном
И кто-то заунывно воет из печи
Тихонько заползает счастие твой дом
А где-то там
В дремучей подворотне под Устюгом в тишине
Рисует дым зловещий ёлку на снегу
Лохмотья бархата запятнаны в вине
Заплешины мешка с заплаткой на боку
В далёкий путь
Заряжены олени и с дороги не свернуть
И где-то волки под прикрытием овец
Рога качаются на стуже и звезда
Лишь далеко в ночи пылающий фонарь нее
А дети ждут
И в маленьком сердечке расчленяет душу лёд
А жертвенное дерево тенями на стене
Игриво догорает в праздничном огне как будто старый дед кродется в новый год
И без пяти
Ленивая селёдка уползает под под ковёр
И нолиты спасительные шрамы на хрусталь
Но за окном всё снег и проклятый декабрь
Но скоро счастье хлопнет газом весь двор
Часы стучат
А это значит кто-то как обычно не успел
И кто-то неумело наступил на провода
И мы смеёмся нас переполняет детский смех
И с нами только радость, счастье, ёлка и звезда
## Песня
@@ -530,24 +406,6 @@ related: ["[[family/documents/karaoke-songs]]"]
У черного моря https://youtu.be/iIzjCEB0Nu8
## Идеи под песни
Моря и океаны
Бродяга Блядь
Бродяга Биль.. (принц и нищий)
Хомякадзе
Космонавтика
Про динозавров
Джунгли: тигры Пакистан храм
Черный плащ
Чуйская муха
Сон про инопланетян которые убивают взрослых и оставляют детей
## Группа/песня
+14
View File
@@ -0,0 +1,14 @@
---
title: Боже боже
tags:
- personal
- creative
- song
- satire
updated: '2026-05-17'
---
Боже боже боже наш хранитель
Боже боже боже круглый год
Боже он же наш освободитель
Боже он спасает наш народ
@@ -0,0 +1,45 @@
---
title: И много много радости (оригинал)
tags:
- personal
- creative
- song
- newyear
related:
- '[[personal/creative/songs/i-mnogo-radosti-light]]'
updated: '2026-05-17'
---
И много много радости
Детишкам принесла
Пустой вокзал
Собака чует (нюхом запах) палева в ночи
(Когда) дрова последние сгорают под окном
(И) кто-то заунывно завывает из печи тихонько заползает смех, веселье с радостью в твой дом
А где-то там
В дремучей подворотне под Устюгом в тишине
Задумчиво рисует дым зловещий на снегу как будто бы лохмотья бархата запятнаны в вине
Заплешины мешка с кривой заплаткой на боку
Вперёд далёкий путь
Заряжены олени и налево и направо не свернуть и где-то волки закупают белый снег
Рога то вверх то в душу заползают и звезда
Всего лишь далеко в ночи пылающий (фонарь)
А дети ждут
И в маленьком сердечке расчленяет душу лёд
А жертвенное дерево тенями на стене
Игриво догорает в светлом праздничном огне как будто старый дед кродется принести нам новый год
И без пяти
Ленивая селёдка уползает под под ковёр
И нолиты спасительные шрамы на хрусталь
Но за окном всё стужа снег и проклятый декабрь но скоро счастье сдетонирует на весь наш тихий двор
Часы стучат
А это значит кто-то как обычно не успел
И кто-то неумело наступил на провода
И мы смеёмся нас переполняет детский смех
И с нами только радость, счастье, ёлка и звезда
@@ -0,0 +1,34 @@
---
title: Не покупают никакой еды (COVID)
tags:
- personal
- creative
- song
- satire
updated: '2026-05-17'
---
Не покупают никакой еды —
Все экономят вынужденно деньги:
Корона косит стройные ряды,—
Но люди вновь смыкаются в шеренги.
Закрыт Вухань, Анталия горит
И в Дании поистребляли норок
Но наш мужик всё у станка стоит
И не пройдет к нам половецкий ворог
Убытки терпит целая страна,
Но вера есть, все зиждется в иконе,—
Объявлена народная война
Одной несчастной, бедненькой короне.
Я погадал вчера на даму треф,
Назвав ее для юмора короной,—
И понял я: корона — это блеф,
Она теперь мне кажется палёной.
Уверен я: короне скоро тлеть.
А ну-ка — залп из тысячи орудий!
Вперед! С Короны могут помереть
Лишь мы (те), некоронованные, люди.
@@ -0,0 +1,19 @@
---
title: Я хуярящий макет
tags:
- personal
- creative
- song
- rap
updated: '2026-05-17'
---
Я хуярящий макет
Сам себе бестселлер
Сам себе велосипед
Сам себе пропеллер
Я хуярю в высоту
Feelин сраку хряку
И комиссией к хвосту
Жопа пуделяки
@@ -0,0 +1,28 @@
---
title: Заходи на уголёк
tags:
- personal
- creative
- song
updated: '2026-05-17'
---
Заходи на уголёк
Я дровишек приволок
Весёлый выдался у нас Рагнарёк
В глухой деревеньке
Приводи с собой подруг
Сало, Пыво, клёвый лук
Весенний ветер вырывает из рук
Последние деньги
Я бухой уже с утра
Все вокруг кричат ура
Непонятная игра
Со вкусом бунтарства
Ещё пива ебану
Разговоры про войну
Я так люблю свою страну
Но ненавижу государство
+16
View File
@@ -0,0 +1,16 @@
---
title: Тост про Антона
tags:
- personal
- creative
- toast
updated: '2026-05-17'
---
Помню-помню! А как же познакомились мы с Антоном? Да всё просто — как будто судьба сама вывела нас на ту тропинку, по которой он однажды подошёл и сказал: «Ну что, пойдём?» И с тех пор и пошли, долго шли, ночами напролёт, то по городским улицам, то по полям, где туман укутывал нас, словно плед. Антон пел тогда, и не просто так — для меня. Да так пел, что даже ветер на мгновение стихал, слушая его голос. И понял я, что с таким человеком можно не только под звёздами, но и по всей жизни идти бок о бок.
Помню-помню, как жопку твою в фонтане мыл в Баден-Бадене, как будто это было вчера. Вот помню, как вчера, как мы Антоху в Турцию провожали — вся компания собралась, охранник у дома уже всех в лицо знает, машет рукой, как своим. Сели тогда на лавочку, конины наелись, и сидим, болтаем о всяком. Глаза блестят, как у детей, а душа поёт — такие моменты не забываются.
Антон пел тогда, и не просто так пел, а словно для меня пел. Ветер на мгновение стихал над мангалом, оставляя причудливые искры красным лисом улыбаться над углями при свете луны. И понял я тогда, что с таким человеком можно не только под звёздами, но и по всей жизни идти бок о бок.
Какой был скромный мальчик, и какой сейчас вырос! Человек с большой буквы, всегда знает, что сказать, как поддержать.
+28
View File
@@ -0,0 +1,28 @@
---
title: Тост общий
tags:
- personal
- creative
- toast
updated: '2026-05-17'
---
Счастья вам, здоровья, неба
Мирного над головой
Летом чтоб побольше снега
Много зелени зимой
Чаще баловать друг дружку
Вместе бегать до пивнушки
Подливать в пустую кружку
Содержать в тепле ватрушку
Чтобы все всегда стояло,
В гараже, под одеялом,
Чтобы дым был коромыслом
Но дружите с здравым смыслом
Все желаю вам по два я
Двух котов, два одеяла
Две машин и гаража вам
И одной любви — навалом
+50
View File
@@ -0,0 +1,50 @@
---
title: Тост про Олега (Поприветствуем)
tags:
- personal
- creative
- toast
updated: '2026-05-17'
---
Вот перед нами король вечеринок
Лучший для нас среди прочих блондинок
Трезвый куражится словно бухой
Но был наш герой не с рожденья такой
Жил в эмиграции Павлиш Олег
Бросила жена он бухал как генсек
Сел на мели посредине Бали
Ловил просветление с утра спохмели
Всёж иногда протрезвевшим он был
Тогда ел грибы и прозренье ловил
Акции, фьючерсы, бабки, обнал
Бабов по пятницам практиковал
Но тут он решил переехать в Бишкек
Чтоб на Бали не закончить свой век
Вобщем друзья завелися тут быстро,
Еще бы, уж год как тут живут программисты!
*Припев:*
И взвыла печень от бухла, дымится ум!
И краска жизни вдруг ушла от грустных дум
Но наш Олег — он парень цепкий, не дурак
Он чистит печень, карму, чакры, зодиак!
Мантры, ашрамы, ретриты, посты,
Веганство, йога и дух чистоты.
Но в жизни без джина не нужен успех,
И вот он вернулся, чтоб радовать всех!
Снова с друзьями – но только без драмы,
С шутками, светом, без грязи и хлама.
"Всё трансцендентно!" — заявит герой,
"Теперь у меня позитивный настрой!"
*Припев:*
И вот собрались мы чтоб друга развязать
Чтоб водкой, пивом, и Бишкеком накачать
Чтоб день рожденья закружил чад кутежа
И с кармой чистой ты усыновил бомжа!
+2
View File
@@ -122,6 +122,8 @@ related: "[[personal/documents/todo-list]]"
- [ ] Абдулла Аджалан демократическая конфедерация?
- [ ] Чё Гевара партизанская война
- [x] Сорокин метель
- [ ] Дилемма инноватора (Clayton Christensen)
- [ ] Google Project Management курс (Coursera)
- [x] Бегущий человек
+14
View File
@@ -10,6 +10,20 @@ related:
- [ ] immich to jellyfin tv
- [ ] скачать флибусту с обновлениями
- https://booktracker.org/viewforum.php?f=253
- [ ] Закопать яму / вывезти глину
- [ ] Спилить берёзу
- [ ] Мультируль
- [ ] Настроить эмуляторы
- [ ] Коптер
- [ ] Камера вело, тормоза
- [ ] Настроить ТВ пульт
- [ ] Коробку поменять (авто)
- [ ] Клипсы в авто поменять
- [ ] Камера заднего вида
- [ ] rutracker хранители: https://rutracker.org/forum/viewtopic.php?t=3118460
- [ ] Купить плавки
- [ ] Сифон (газатор)
- [ ] Ручка на перфоратор (взамен сломанной)
- [ ] objc.io Advanced Swift (in Downloads) videos -> watch; upload to truenas/edu ()
- [ ] Hermes memories -> obsidian, purge
- [ ] Смеситель
+19
View File
@@ -0,0 +1,19 @@
---
title: Маркс — теория стоимости (заметки из разговора)
tags:
- personal
- ideas
- economics
- marxism
updated: '2026-05-17'
---
Добро пожаловать к Карлу Марксу с теорией стоимости 🙂
Из золота делают много всякой высокотехнологичной хероты, так что это таки тоже товар. А ещё когда оно было деньгами, оно истиралось, теряло форму, тупо терялось, в частности поэтому «безопаснее» его было хранить в банке а платить расписками.
Чтобы что-то купить — кто-то должен произвести эквивалентную стоимость. Стоимость производит только производительный труд. Ты добыл золото, а кто-то много еды, ты купил часть еды за своё золото — это должно быть эквивалентно тому что ты потратил свой труд на добычу этой еды.
Хоть золото при этом никуда не исчезает, у «них» тоже есть своё потребление, то есть стоимость потребляют (переводят в ничто) так или иначе все, только богатеет тот у кого труд производительней — то есть производятся излишки.
3. То есть современная денежная система так изначально задумана (евреями, рокфеллерами, рептилоидами — нужное подчеркнуть), чтобы обеспечивать эксплуатацию рабочих, понижение цены труда и рост власти и капитала у буржуев. Гипотетическая справедливая система должна устранить это...
@@ -1,5 +1,5 @@
---
title: Media Pipeline — Multi-Tracker Support
title: Media Pipeline — Roadmap
created: '2026-05-17'
updated: '2026-05-17'
status: active
@@ -9,90 +9,77 @@ tags:
- rutor
- nnm-club
---
# Media Pipeline — Multi-Tracker Support
# Media Pipeline — Roadmap
## Текущее состояние
## ✅ Сделано
✅ Реализовано и задеплоено на Kraken:
- `TrackerPageParserRegistry` — dispatch по `url.host`, парсеры: Rutracker, Rutor, NNMClub, PirateBay, Nyaa
- `RutrackerPageParser` — CP1251 decode через `/usr/bin/iconv`, SwiftSoup парсинг
- Жанры извлекаются из `[...]` в заголовке топика, страны фильтруются
- KP/IMDb ID extraction работает
- `TorrentSourceStrategy` использует registry вместо прямого вызова `RutrackerAPI`
### Шаг A — Transmission flow + Rutracker парсинг
- `TrackerPageParserRegistry` — dispatch по `url.host`
- `RutrackerPageParser` — CP1251/iconv, SwiftSoup, жанры из заголовка топика, KP/IMDb IDs
- `TrackerMediaKind` — enum: movie/series/cartoon/documentary/music/audiobook/game/book/unknown
- `extractMediaKind` — детект по `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)
### TrackerPageParser protocol
### Шаг C — DirectoryPolicy + transmissionMove
- `DirectoryPolicy` / `MatchPolicy` / `MoveStrategy` в конфиге — backward-compatible
- `FileAction.transmissionMove(torrentId:, from:, to:)` — Codable
- `ApplyPhase` — async execute, RPC → fallback filesystem
- `buildMovieActions` — читает policy, `needsSymlink`, `needsNFO`, `effectiveOutputDir`
- `kindKey` из реального `TrackerMediaKind``destination_by_kind`
- `transmissionMove` когда есть `torrentId`, иначе `move`
- `config.json` на Кракене — `directory_policies` для всех директорий
- Canonical маркер `.media-pipeline-canonical` для music/books/games пишется в `output` директорию рядом с файлом
```swift
public protocol TrackerPageParser: Sendable {
var supportedHosts: [String] { get }
func parse(data: Data, url: URL) throws -> TorrentPageMetadata
}
```
## ⚠️ Частично работает
### TrackerPageParserRegistry
### Фильмы из downloads
- `.mkv/.mp4` → scanner видит → регион → `transmissionMove``/media/movies/` → canonical marker → повторный run скипает ✅
- `TrackerMediaKind` детектится по forum_id → правильная `destination_by_kind`
```swift
public struct TrackerPageParserRegistry: Sendable {
public static let defaults: [TrackerPageParser] = [
RutrackerPageParser(),
RutorPageParser(),
NNMClubPageParser(),
PirateBayPageParser(),
NyaaPageParser(),
]
public func parser(for url: URL) -> TrackerPageParser?
}
```
### Музыка/книги/игры из downloads
- Scanner не видит `.mp3/.flac/.epub/.zip` — нет `videoExtensions` для аудио ❌
- Регион не создаётся → `buildMovieActions` не вызывается → файл остаётся в downloads
## Парсеры по трекерам
## 📋 Следующие шаги
### RutrackerPageParser ✅
- Encoding: Windows-1251 (через `/usr/bin/iconv` temp files — swift-corelibs-foundation не поддерживает CP1251 на Linux)
- Title selector: `#topic-title`, `h1.maintitle`, `a.topictitle`
- **Genres: из заголовка топика `[YEAR, жанр1, жанр2, ..., TECH-TAG]`** — не из поста
- Страны фильтруются через `countryNames: Set<String>` (30+ стран RU+EN)
- Poster: первый img в `div.post_body` не из rutracker UI
- IDs: `imdb.com/title/tt\d+`, `kinopoisk.ru/film/\d+`
### Шаг D — Audio/non-video scanner (приоритет)
Чтобы музыка/книги/игры из downloads реально перекладывались:
### RutorPageParser ✅ (структура реализована)
- Encoding: UTF-8
- Title: `h1.topic-header` / `div#topic-title`
- Genres: паттерн `Жанр:` в тексте
1. **`AudioClassifier`** — `isAudioFile()` для `.mp3/.flac/.m4a/.ogg/.aac/.wav/.opus`
2. **`NonVideoRegionBuilder`** — создаёт регионы для директорий без video но с audio/doc файлами
3. **`FileScanner`** — при наличии `TrackerMediaKind != .movie/.series` (из Transmission метаданных) создавать регион даже без video
4. **`buildAudioActions`** в `MediaFinalizer` — move + NFO рядом, без symlink, canonical marker рядом
5. **Альтернатива (проще)**: unsorted fallback — отдельный pass по `unsorted_dir` через Transmission API, для торрентов без региона вызывать `torrent-set-location` на основе `mediaKind` из страницы трекера
### NNMClubPageParser ✅ (структура реализована)
- Encoding: Windows-1251 (тот же iconv путь)
- Title: `h1.maintitle` / `a.maintitle`
### Шаг E — Верификация парсеров
- HTML fixture тесты для rutor, nnm-club на живых страницах
- Проверить `extractMediaKind` на реальных forum_id
### PirateBayPageParser ✅ (структура реализована)
- Encoding: UTF-8
- Title: `<h1 id="title">`
- Нет IMDb/KP ссылок обычно → только title/year из названия торрента
### NyaaPageParser ✅ (структура реализована)
- Encoding: UTF-8
- Аниме: title из `h3.panel-title`, AniDB ID если есть
### Шаг F — Series из downloads
- `buildSeriesActions` сейчас не читает policy → нет move для сериалов из downloads
- Нужно прокинуть `torrentURLFacts`/`torrentPageFacts` аналогично movie
## Ключевые питфоллы
- `extractGenres` должен парсить из **заголовка топика** (`#topic-title`), а не из тела поста — Rutracker кодирует жанры в `[YEAR, жанр, ...]` в title
- CP1251 decode: использовать `/usr/bin/iconv` через temp files — единственный способ на Linux
- Кеш хранит сырые байты (binary) — `grep` по кешу не работает для CP1251 файлов
- `TrackerParsers.swift` — боевой файл (используется в продакшне); `RutrackerAPI.swift` — legacy, параллельно существует
- 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 (боевой)
- `Sources/MediaSources/APIs/RutrackerAPI.swift` — legacy парсер (используется в части flow)
- `Sources/MediaSources/Providers/TorrentSourceStrategy.swift` — dispatch через registry
- `Sources/MediaDomain/Facts/TorrentPageMetadataFact.swift` — модель: title, year, genres, posterURL, description, externalLinks
## Roadmap
- [ ] Шаг B — новые типы медиа: игры, музыка, книги (следующий)
- [ ] Реальные HTML fixture тесты для каждого трекера (rutor, nnm-club)
- [ ] Верификация RutorPageParser/NNMClubPageParser на живых торрентах
- [ ] `MediaKind` detection по категории торрента (напр. "Игры PC" → `.game`)
- `Sources/MediaSources/APIs/TrackerParsers.swift` — парсеры + registry + `extractMediaKind`
- `Sources/MediaDomain/Facts/TorrentPageMetadataFact.swift``TrackerMediaKind`, поля
- `Sources/MediaDomain/Facts/TorrentInfoURLFact.swift``torrentId: Int?`
- `Sources/MediaSources/Protocol/TorrentInfoProvider.swift``TorrentLocator.torrentId`
- `Sources/MediaPipeline/Config/Config.swift``DirectoryPolicy`, `MatchPolicy`, `MoveStrategy`
- `Sources/MediaPipeline/Apply/FileAction.swift``transmissionMove` case
- `Sources/MediaPipeline/Apply/ApplyPhase.swift` — async execute, RPC fallback
- `Sources/MediaPipeline/Apply/MediaFinalizer.swift` — policy-aware routing, torrent extractors
@@ -71,6 +71,7 @@ updated: "2026-05-17"
Блиц
Скар
Голлум
Буцефал
## Связанные заметки
- [[personal/projects/personal-os/obsidian-vault-strategy]] — стратегия развития vault