Универсальный медиа-комбайн под Windows: скачивание видео/аудио (YouTube, TikTok, Instagram и др. через yt-dlp), перекодирование видео в AV1, обработка звука, конвертация изображений (AVIF/WebP/PNG/JPG/ICO), монтаж (обрезка видео/аудио по волне с предпросмотром, кадрирование и удаление объектов с видео нейросетью), редактор фото (кисть, фигуры, текст, кадрирование, поворот/отражение, удаление объектов нейросетью LaMa и удаление фона нейросетью RMBG-2.0), объединение фото, Base64 и менеджер промптов. Плюс экспериментальные вкладки SiQuesterHYX и ShikimoriHYX. Есть браузерное расширение для отправки ссылок прямо в программу.
Текущая версия — 0.6.0.
Готовую программу бери во вкладке Releases → скачай архив с суффиксом -full (например SI-HYX-v0.6.0-full.zip), распакуй и запусти SI-HYX.exe.
Устанавливать ничего не нужно — ffmpeg, yt-dlp и deno лежат в папке bin/, а нейросетевые модели — в папке models/ рядом с программой.
В релизе три файла:
…-full.zip(код + bin + models, ставится с нуля),…-update.zip(только код, для дельта-обновления) иmanifest.json. Для первой установки нужен именно full;update/manifestпрограмма использует сама при автообновлении.
Вкладки можно перетаскивать и сортировать; порядок запоминается. Часть вкладок по умолчанию выключена и включается в настройках.
- Обработка — сжатие и перекодирование медиа: видео в AV1 (SVT-AV1) с настройкой скорости, разрешения и FPS; аудиоэффекты (нормализация громкости/loudnorm, fade); конвертация изображений в AVIF/WebP/PNG/JPG/ICO с лимитом разрешения и размера файла (для прозрачных PNG корректно сохраняется альфа в AVIF). Очередь файлов, двойной клик — кодировать файл отдельно.
- Загрузчик — видео/аудио по ссылке через yt-dlp: выбор качества, обрезка по таймингам, субтитры, куки, режим «только аудио» (MP3/M4A). Поддержка проблемных площадок (TikTok) через nightly-канал yt-dlp и повторные попытки.
- Монтаж (бета) — обрезка видео/аудио по звуковой волне с зумом: точки IN/OUT (мышь, таймкоды, кадры), предпросмотр с плеером, покадровая перемотка со скраб-звуком, субтитры (внешние и встроенные, рендер в кадр как в VLC), полноэкранный режим. Быстрый режим (copy без перекодирования), Smart Cut (склейка по ключевым кадрам), полный реэнкод (CPU/GPU), перекодировка настройками вкладки «Обработка» (точный рез и текущие кодек/CRF/скорость/громкость одним проходом, без двойной перекодировки) и её же аудио-вариант — «(Аудио) Перекодировать настройками «Обработки»»: видеоряд отбрасывается, на выходе только звуковая дорожка (.opus) с текущими настройками звука (битрейт/громкость/фейды/скорость). Покадровая точность: перемотка и шаг стрелками считаются в номерах кадров, а не в миллисекундах, точный кадр рисуется из собственного буфера (предекодирование соседних кадров вокруг плейхеда) и не зависит от того, какой кадр вернёт плеер; метка таймлайна, звук покадрового шага и картинка идут по одним часам — времени показанного кадра. Старт воспроизведения с произвольного места прогревается «с разбега», без обратной перемотки, которая раньше и давала заминку в пару секунд. Кадрирование видео прямо на кадре, удаление объектов/водяных знаков с видео покадрово той же нейросетью LaMa, что и в фото, привязка текста или картинки к движущемуся объекту (обвёл руку рамкой — нейросетевой трекер DyHiT ведёт её по кадрам, накладка едет следом; накладка сразу видна в плеере, а в файл её вшивает обычная «Обрезать» — с учётом выделенного отрезка), пикселизация-проявление (для угадаек), наложение картинки поверх видео (логотип, водяной знак, рамка: слой сразу виден в плеере — тащится мышью, тянется за уголки, крутится за «антенну» сверху, кадрируется отдельным окном, прозрачность — ползунком в списке слоёв; в файл вшивается при «Обрезать» фильтром overlay, то есть перекодировкой, и попадает в «Сохранить кадр»), загрузка картинки как видео. Экспорт только звука в MP3, сохранение текущего кадра в PNG, смена озвучки. Папку сохранения можно указать на любом диске (результат корректно переносится между томами). Исходные файлы можно удалять из Проводника прямо во время работы — программа не держит их намертво. Клик по значку динамика выключает и возвращает звук (с прежним уровнем), клик по шкале громкости ставит её ровно в точку клика. Горячие клавиши: Space, I/O, ←/→, Ctrl+Z/Ctrl+Y.
- Редактирование фото — два режима:
- Редактирование фото — кисть и ластик, кадрирование прямо на холсте, обрезка чёрных полос (тот же детект, что во вкладке «Обработка»), поворот и отражение (значки сверху холста), фигуры как в Paint (прямоугольник, эллипс, линия, стрелка — с заливкой или контуром), текст системными шрифтами (выбор шрифта и размера), выбор цвета (окно палитры, Alt-пипетка по картинке и пипетка по всему экрану), зум/панорама (WASD/стрелки — на любой раскладке), отмена/возврат (Ctrl+Z/Ctrl+Y). Отдельно — удаление объектов и водяных знаков нейросетью LaMa (закрасил лишнее кистью — оно убирается и фон дорисовывается) и удаление фона нейросетью RMBG-2.0 (объект отделяется от фона, прозрачность сохраняется в PNG). Считается на CPU или GPU (CUDA/DirectML через onnxruntime). Сохранение без потерь.
- Объединить фото — склейка нескольких изображений в одно.
- Base64 — кодирование/декодирование файлов и текста, опция «Создавать .txt файл» на выходе.
- Промпт (по умолчанию выключена) — менеджер промптов: хранение и быстрый выбор заготовок.
- SiQuesterHYX (экспериментальная, по умолчанию выключена) — просмотр и работа с .siq-пакетами вопросов (с защитой от XXE/zip-slip при разборе файлов).
- ShikimoriHYX (экспериментальная, по умолчанию выключена) — поиск аниме/манги через API Shikimori с фильтрами (жанры, темы, статус) и превью.
- Генерация аниме-пака (экспериментальная, по умолчанию выключена) — собирает готовый
.siq«угадай аниме по песне»: аниме берутся из каталога Shikimori (случайная выборка, фильтры уходят прямо на сервер — база по умолчанию; набранный каталог вместе с узнаваемостью франшиз сохраняется рядом с настройками и переживает перезапуск программы, так что следующие паки собираются без похода за ним, а обновляется он только кнопкой «Обновить базу Shikimori» — она проходит каталог ЦЕЛИКОМ, сколько бы тайтлов под текущие фильтры в нём ни было, поэтому идти может долго, и той же кнопкой сбор останавливается: набранное к этому моменту остаётся в кэше и годится для паков), из базы AnimeMusicQuiz (её мастер-лист состоит из тайтлов С ПЕСНЯМИ, поэтому для паков из кадров и персонажей галочка гаснет и база всё равно берётся с Shikimori) или из списков людей на MyAnimeList/Shikimori/AniList (списки спрашиваются только с галочкой «Похожие»: «1 чел.» — всё, что у них есть, «2» и больше — только общее; без галочки пак просто случайный; список одного и того же человека спрашивается один раз за запуск программы, дальше он берётся из памяти — следующий пак собирается быстрее), песни — из AnisongDB, обложки и кадры — с Shikimori (а если постера в карточке нет вовсе или ссылка не открылась, обложка ищется на themoviedb.org — по вашему бесплатному ключу TMDB, вводится там же). Скачанные обложки складываются в общую папку рядом с настройками и в следующий раз берутся оттуда: папка ОБЩАЯ с «Апгрейдом аниме-пака», так что постер, скачанный одной вкладкой, другой уже не качается (размер и кнопка «Очистить» — под галочкой «Хранить обложки на диске», больше 200 МБ папка не занимает). Каждому списку задаётся его ДОЛЯ пака отдельным ползунком: у кого 1500 тайтлов, а у кого 300 — неважно, очередь раздаётся по процентам, и длинный список больше не забивает пак целиком. Списку можно поставить пометку «в основном музыка» (кнопка «♪» в его карточке) — его тайтлы по возможности идут в песенные вопросы, а не в кадры и персонажей (для тех, кто угадывает музыку, но сам тайтл в лицо не узнаёт); включённая пометка заливается синим, так что видно, у каких списков она стоит, а сайт в карточке подписан коротко (MAL, Shiki, AniList), чтобы место доставалось нику. Настраиваются раунды/темы/вопросы, соотношение опенингов/эндингов/OST (тоже ползунком — доли, а не штуки), сложность, категории песен, жанры, годы, оценка и типы аниме, длина отрезка, коллаж из кадров поверх песни. Над ползунком состава одной строкой написано, что именно получится: «Кадров — 18, Опенингов — 19, Эндингов — 7, OST — 6, Персонажей — 14, Видео — 13, Манги — 13». Типы песен включаются галочками (можно собрать пак из одних эндингов). Состав пака задаётся одним ползунком — доли вопросов-песен, вопросов-роликов, вопросов-кадров и вопросов-персонажей: утащите границу до края, и получится пак только из кадров или только из персонажей. Кадр всегда случайный и собирается из всех источников сразу. Вопрос «угадай персонажа»: показывается портрет с Shikimori и одновременно с ним — задание «Назвать персонажа» (текстом перед картинкой, иначе портрет неотличим от обычного кадра и игроки называют аниме), ответ пишется как «Название аниме (2020) — 『Имя персонажа』», причём название стоит в нём РОВНО ОДИН РАЗ, а доп-варианты состоят из одних только других имён персонажа (русское, ромадзи и «Прочие» с его страницы Shikimori); отвечать надо по САМОМУ ПЕРВОМУ произведению, где этот персонаж появлялся, — если он вытащен из третьего сезона или спин-оффа, ответом всё равно будет оригинал. Сложность вопроса-персонажа считается по двум мерам сразу: узнаваемость тайтла и «в избранном» на Shikimori — чем большему числу людей персонаж попал в избранное, тем он легче (у главных героев хитов это тысячи, у проходного второстепенного — единицы); для персонажей задаётся СВОЯ средняя сложность, отдельно от общей, а в таблице состава у них своя колонка «Перс.» с уровнем и числом добавивших. Узнаваемость тайтла весит в этой сложности половину, поэтому она работает и полом, и потолком разом: из тайтлов шестого уровня персонаж легче четвёртого не получится, сколько бы народу ни добавило его в избранное. Если просимая средняя недостижима, генератор не хватает что попало, а пишет об этом прямо («Сложность персонажей 3 недостижима: легче 4 в этом паке пока не попадалось — держу ближайшую, 4») и дальше держит ближайшую достижимую; попадутся персонажи полегче — вернётся к запрошенной, а в итоговой строке будет видно и то, что просили, и то, что реально держали. Цена берётся как за сам тайтл и умножается на полтора за главного героя и на 1,8 за второстепенного, а известность персонажа её слегка двигает: за популярного вопрос дешевеет, за редкого дорожает. Кого спрашивать (главных героев, второстепенных или и тех, и других) выбирается настройкой. Отдельная доля ползунка — МАНГА, манхва, манхуа и ранобэ (появляется в ползунке только с галочкой «Вопрос — манга», как и ролики): списки берутся из тех же трёх сайтов (у каждого это отдельный раздел), а спрашивается такой вопрос либо портретом персонажа, либо обложкой; типы изданий выбираются галочками. Кадров у книги нет, песен тоже — сканы страниц не используются вовсе (публичного API у читалок вроде MangaLib и ReManga для этого нет, а сами страницы защищены авторским правом), поэтому годятся только портреты персонажей и обложки с Shikimori. К скриншотам Shikimori всегда добавляются превью серий с AniList и Kitsu — сцены получаются разные, а один и тот же тайтл в разных паках выглядит по-новому. Галочка «Вопрос — ролик» добавляет в тот же ползунок долю вопросов-РОЛИКОВ: вместо отрезка песни играет ВИДЕО опенинга или эндинга с animethemes.moe (ролики там без кредитов, то есть без названия прямо в кадре). Ролик режется прямо с сервера по Range-запросу и кодируется в 720p тем же libsvtav1, что и во вкладке «Обработка» (по умолчанию 15 секунд, CRF 45, самый быстрый пресет), звук — в opus 192 кбит с той же нормализацией, что и у всех дорожек пака, а ответ у ролика ровно такой же, как у песни; если ролика для песни нет — вопрос всё равно состоится, просто звуком. «Опенинг»/«Эндинг» ведущий над роликом ПРОИЗНОСИТ одновременно с видео, а не пишет на экране (надпись загородила бы картинку); поверх звука эта подсказка по-прежнему висит подписью. Ещё три доли того же ползунка появляются со своими галочками. «Вопрос — пиксели»: тот же случайный кадр аниме, но не картинкой, а РОЛИКОМ-проявлением — он начинается крупными «пикселями» и за несколько ступеней проясняется, ровно тем же эффектом, что кнопка «Пикселизация» во вкладке «Монтаж» (обе вкладки зовут одну функцию, так что блоки и тайминги у них не разъезжаются); длительность, число ступеней, стартовый размер блока и кадры в секунду настраиваются, а под ними написано, какими блоками пойдёт проявление («64px → 35px → … → чётко»). «Вопрос — анаграмма»: буквы названия тайтла перемешаны, ответ — само название; форма слов сохраняется (сколько слов и какой длины было, столько и останется), язык названия выбирается — русское, английское или ромадзи, а если выбранного у тайтла нет, берётся любое другое; длина названия ограничивается настройкой «Не длиннее» (по умолчанию 40 символов, «без предела» снимает ограничение) — названия-простыни у ранобэ и новинок перемешиваются в нерешаемую кашу, а потолок проверяется у каждого языка отдельно, так что слишком длинное русское название не отменяет вопрос, а уводит анаграмму на ромадзи; засчитываются ВСЕ написания тайтла, на каком бы языке ни была составлена анаграмма. Ни сети, ни медиа анаграмме не нужно — это самый быстрый и самый лёгкий по весу род вопросов. «Вопрос — по сюжету»: программа находит вики тайтла на fandom.com, берёт со страницы случайной СЕРИИ раздел с пересказом и просит Gemini сделать из него вопрос — либо «ведущий читает эпизод сюжета, игроки называют тайтл» (название и имена героев из текста вычищаются, иначе вопрос решается с первого слова, а ответ и цена считаются как у любого другого вопроса пака), либо «вопрос про деталь сюжета» с коротким ответом от модели (тайтл в таком вопросе назван прямо — такие вопросы стоит проглядеть глазами перед игрой). Fandom работает без ключей, для Gemini нужен ВАШ бесплатный ключ (вводится тут же); вики есть не у всякого тайтла — если пересказа не нашлось, вопрос просто достаётся следующему. Устного текста в ответе у таких вопросов нет вовсе — ни адреса вики, ни названия тайтла ведущему зачитывать не надо. Сорванный запрос к модели («в тексте недопустимые слова» — у аниме такое сплошь и рядом) отменяет только ЭТОТ тайтл; вопросы по сюжету выключаются целиком, лишь когда дело в самом ключе или в кончившейся квоте, и тогда их места в паке достаются остальным родам вопросов, а не пропадают. С общей базой работает галочка «Отмечать, у кого из списков есть»: тайтлы берутся случайно, но когда вопросы уже отобраны, программа проверяет списки добавленных людей и пишет ник нашедшегося в реплике ведущего (на отбор это не влияет — списки только подписывают готовое). Порядок в реплике всегда один и тот же, откуда бы ни собрался пак: сперва исполнитель песни, следом голые никнеймы через запятую. Кнопкой «Не повторять из паков…» подкладываются готовые.siq: программа читает их правильные ответы и больше не спрашивает те же франшизы. Галочка «Не повторять кадры прошлых паков» запоминает показанные кадры, и в следующем паке тайтл спрашивается другой сценой (а если свободных кадров у него не осталось — берётся другой тайтл). Галочки «Сжимать аудио» и «Сжимать картинки» включают кодирование как во вкладке «Обработка»: звук — opus 192 кбит с нормализацией громкости (−20 LUFS, LRA 11, TP −1.5) и затуханием в конце, картинки — AVIF (вес и скорость настраиваются, кодирование идёт с низким приоритетом процесса); выключены — медиа кладётся в пак ровно как пришло с сервера (mp3 320 кбит, оригинальный постер), без единого перекодирования. В ответе — постер (сколько секунд он висит, задаётся настройкой: от 1 до 5 секунд, дольше нельзя — игра на это время стоит; ноль — до перехода ведущего) и строка «Название OP1 (год) — 『Песня』» (OP/ED/OST — что именно за песня), а верными засчитываются и ромадзи, английское, синонимы и российское лицензионное название с Shikimori (иероглифы не берутся). Любой вписанный ник запоминается сразу, не дожидаясь запуска генерации, — кнопка «Из сохранённых» открывает окно с поиском и галочками и добавляет их пачкой, кнопка «Очистить» убирает все списки разом (сами ники остаются). Цена растёт на единицу от опенингов к эндингам и OST, галочка «По индексу популярности» выстраивает вопросы и цены по тому же индексу узнаваемости, что и сортировка во вкладке ShikimoriHYX, а «Вопросы в разнобой» перемешивает их внутри темы. Сложность пака задаётся шкалой 1–10 по узнаваемости тайтла (1 — знают все, 10 — не знает никто) и работает даже когда песен нет вовсе; кроме рамок «от … до» задаётся ещё и СРЕДНЯЯ сложность — «от 1 до 10, в среднем 4» соберёт пак с редкими крайностями и серединой около четвёрки (если подходящих тайтлов не хватает, генератор всё же добирает пак и пишет об этом в лог). Часть серии наследует узнаваемость всей франшизы, поэтому «Доктор Стоун: Научное будущее. Часть 3» считается таким же известным, как «Доктор Стоун»; сама узнаваемость франшизы считается по всем её заметным частям сразу: за каждый живой сезон сверх первого идёт небольшая надбавка, а штраф за возраст смягчается, если у старого тайтла есть популярное продолжение («Наруто» 2002 года с «Ураганными хрониками» 2007-го теряет за год заметно меньше одиночки-ровесника); один тайтл даёт ровно один вопрос, а одна франшиза — ровно один тайтл (это не отключается). Медиа внутри пака называется «Сгенерировано в SI-HYX(Название тайтла)», а не номерами песен. Вес готового.siqдержится под заданным потолком (по умолчанию 150 МБ): генератор считает набранное по ходу и, как только по среднему весу вопроса видно, что пак вылезет за лимит, останавливается на том, что уже собрано, и говорит об этом в логе. Состав готового пака показан таблицей с сортировкой по любой колонке, кнопки запуска закреплены под панелью настроек и не уезжают при её прокрутке, а в общей полосе внизу окна идут счётчик вопросов, оценка остатка времени и, по окончании, строка «Готово за столько-то: файл». В конце генерации в лог выводится раскладка времени по этапам — списки, поиск кандидатов, аудио, ролики, картинки, персонажи и сборка .siq; время считается ПО ЧАСАМ (отрезки параллельных загрузок склеиваются), а сумма по потокам показана отдельно в скобках, поэтому «487% на картинки» больше не бывает. Shikimori спрашивается не чаще 80 запросов в минуту — у него лимита два сразу (5 в секунду И 90 в минуту), и раньше вопросы-персонажи (у каждого свой запрос про избранное и про другие тайтлы) утыкались в 429 и растягивались на десятки минут; заодно кандидат, не прошедший по средней сложности, отсеивается ДО этих запросов, а повторяющаяся ошибка пишется в лог трижды, дальше только итогом. Порт генератора ASPG (Leleath, MIT) с разрешения автора. - Апгрейд пака (экспериментальная, по умолчанию выключена) — доводит ГОТОВЫЙ
.siq, свой или чужой: названия для ответов ищутся на Shikimori. Файл выбирается кнопкой или перетаскивается мышью на вкладку, а результат пишется отдельным файлом «…(апгрейд).siq» — исходный пак не меняется никогда, медиа из архива переносится байт в байт, без распаковки и обратного сжатия (пак на 75 МБ собирается за десятую долю секунды вместо пяти секунд, а весит ровно столько же). Пока апгрейд не запущен, на месте таблицы стоит карточка выбранного пака: название крупными буквами, автор, число вопросов и тем и список тем по раундам — читается это из одногоcontent.xml, медиа при этом не трогается. «Убрать спецвопросы» превращает вопросы со ставкой, с секретом, для себя, для всех и для всех со ставкой в обычные: снимается и тип вопроса, и параметры, которые его задавали (чужая тема и цена «кота», минимум ставки, режим выбора игрока), а сам вопрос, ответы и цена остаются на месте; понятны оба формата — и старый v4 (<type name="cat">), и v5 из SIGame 7 (type="secret"). Типы называются так же, как их зовёт SIQuester, а не ходовыми прозвищами. Тип «с секретом без вопроса» (secretNoQuestion— деньги выдаются сразу) по умолчанию не трогается: самого вопроса в нём нет, и обычным он станет пустым — о каждом таком пишется в отчёт (отдельной галочкой можно всё же превратить). «Дописать варианты названий» ищет тайтл на Shikimori по правильному ответу и дописывает в него все остальные названия — ромадзи, английское, российское лицензионное, синонимы и русское (иероглифика не берётся вовсе, как и в генераторе). Ответ разбирается так же, как его пишет генератор («Наруто OP1 (2002) — 『Song』» → «Наруто»), а сверх того — по названию до тире («Эхо террора - Trigger» → «Эхо террора») и по остальным строкам ответа: в живых паках голое название лежит второй строкой, и без этого не опознавался каждый третий ответ. Ответ, записанный двумя названиями через косую черту («Ueno-san wa Bukiyou/ Неуклюжая Уэно», «Kokoro Connect/Связь сердец» — ровно так тайтл показывает и сам Shikimori), ищется ещё и каждой частью по отдельности; строка целиком при этом пробуется первой, поэтому «Fate/Zero» опознаётся как цельное название и на части не разбивается. По умолчанию засчитывается только точное совпадение названия (регистр и знаки не в счёт), иначе чужой ответ утащил бы за собой варианты постороннего тайтла. Опечатка в букву-другую в точное совпадение ВХОДИТ: «Gokukoku no Brunhildr» — это «Brynhildr», а не другой тайтл, и раньше из-за одной буквы пропадали и постер, и все варианты названия. Границы у этого послабления жёсткие: короткие названия (меньше восьми букв) сравниваются только слово в слово («Air» и «Aria» — разное), слов должно быть поровну («Hellsing» и «Hellsing Ultimate» — разные вещи), а номера сезонов обязаны совпасть точно («Sword Art Online II» и «III» отличаются одним символом, но это разные тайтлы); на длинных названиях прощаются две буквы, на прочих — одна. Лишний пробел прощается там же: «Tegami bachi» — это «Tegamibachi» (то же слово, разбитое на слоги по вкусу писавшего), но склеивать разрешено только названия от восьми букв — «K-On!» склеенное превратилось бы в «kon», а это уже другое слово. О каждом таком совпадении пишется в лог: в паке-то ошибка. Галочкой строгость снимается вовсе — тогда засчитывается и просто близкое название. Записи, которые аниме не являются — вокалоид-клипы, промо-ролики и реклама (//), — не рассматриваются вовсе (одно исключение ниже): на живом паке ровно на них пришлись все промахи (ответ «Mumei» находил одноимённый клип, «Teto Kasane» — клип «Yababaina», у которого это лежит в синонимах), а два ответа после отсева получили наконец ПРАВИЛЬНЫЙ тайтл вместо одноимённого клипа. Исключение одно, и оно про известность: если ответ совпал с СОБСТВЕННЫМ названием клипа, а одноимённый тайтл известен в разы хуже (порог — десятикратный), ответом признаётся всё-таки клип. Живой случай — «Shelter»: так зовут и знаменитый клип Porter Robinson (221 тыс. в списках), и никому не известный фильм 2015 года (832), — и в пак вставлялась обложка фильма. Если же одноимённого тайтла не нашлось вовсе, клип ответом не становится и вопрос просто не трогается: правило остаётся правилом, а исключение сделано ровно для случая, где иначе в ответ попадёт заведомо чужая обложка. Совпадение, пришедшее только из чужих синонимов, тоже не считается — синонимы на Shikimori правит кто угодно; а вот ответ «Наруто ТВ-1» засчитывается, потому что собственное название тайтла в нём есть. Из этого правила есть одно исключение, и решает его известность: если синонимом совпал тайтл, который знают в разы лучше, верен он — ответ «За гранью» это «Kyoukai no Kanata» (у него это синоним, 1,26 млн в списках), а не одноимённая OVA «Sweat Punch» (собственное русское название, 53 тыс.). По известности же выбирается и между несколькими точными совпадениями вообще. Если же ответ похож на имя героя (латиница в одно-три слова — «Mumei», «Teto Kasane») и собственное название найденного тайтла с ним точь-в-точь НЕ совпало, вопрос переспрашивается по базе персонажей Shikimori: имя нашлось — вопрос не трогается вовсе, о нём пишется строкой «Персонаж». Кириллица так не проверяется намеренно (у героя «Naruto-kun» русское имя — «Наруто», и проверка съела бы настоящий тайтл), а точное совпадение с собственным названием запроса не стоит вовсе — «Shiki», «Monster» и «Goblin Slayer» это настоящие аниме, у которых герой зовётся так же. То, что в паке уже написано, второй раз не пишется — даже если название стоит внутри более длинного ответа («Багровые осколки» из ответа «Багровые осколки - Nee» отдельной строкой не добавится), а год не дописывается никогда, хотя у части тайтлов Shikimori держит его прямо в названии. Там же, но только на точном совпадении, работают ещё две правки: написание названия приводится к тому, как оно записано на Shikimori («наруто» и «НАРУТО» → «Наруто»; меняется только регистр букв — иначе это был бы уже другой ответ, а заглавная буква в начале не понижается никогда, и японское поле карточки в написаниях не участвует: у части записей там латиница строчными, и «исправление» портило ответ), и в ответ кладётся постер тайтла — так же, как это делает «Генерация аниме-пака» (AVIF под тот же лимит, три секунды на экране,Images/в архиве). Постер не добавляется, если своя картинка в ответе уже есть, а на один тайтл в паке приходится один файл, сколько бы вопросов про него ни было. Обложки берутся из ТОЙ ЖЕ общей папки, что и у генератора паков: скачанное там здесь уже не качается (и наоборот), а если постера в карточке Shikimori нет вовсе — обложка ищется на themoviedb.org по ключу TMDB, введённому в «Генерации аниме-пака» (ключ и папка у обеих вкладок одни). Если же в названии темы написано «манга», «манхва» или «ранобэ» (латиницей тоже — «Manga(что полегче)»), ответ ищется по книгам, а не по аниме: в такой вопрос идёт обложка манги, а не постер экранизации, и находятся ответы, у которых аниме нет вовсе («Soul Cartel», «Noblesse» — манхва). Книга не нашлась — названия всё равно доищутся по аниме, но обложка из него уже не берётся. Число дописываемых строк ограничивается, а один и тот же тайтл спрашивается ровно раз на пак (Shikimori держит 5 запросов в секунду). «Убрать повторяющийся текст» убирает подпись, стоящую в КАЖДОМ вопросе темы («Назвать аниме»): за ней всё равно идёт скрин или отрывок, и так понятно, что назвать надо аниме, а на экране это лишние секунды на каждом вопросе. Правило именно «в каждом»: хватает одного вопроса без этой подписи, чтобы тему не трогать вовсе, а тема из одного вопроса не в счёт. Одного этого правила живым пакам мало, поэтому рядом работает закрытый список знакомых подписей («Назвать аниме», «Назвать персонажа», «Назвать фильм», «Назвать песню» и подобные) — эти убираются, даже если в одном вопросе темы их нет: в теме «Hayami Saori» из «Anime by Hinoriku 6» «Назвать персонажа» стоит в семи вопросах из восьми, а восьмой спрашивает своё («А сколько персонажей Hayami Saori озвучила в зимнем сезоне 2018 года?») — и из-за него подпись оставалась во всех семи. Список выключается отдельной галочкой. Текст сравнивается без регистра и знаков («Назвать аниме:» и «назвать аниме» — одно и то же), длина ограничивается настройкой (по умолчанию 60 символов: короткая подпись — это указание, длинный текст скорее сам вопрос), убирается только текст (картинки, звук и ролики остаются на месте), и вопрос никогда не остаётся пустым — если убирать пришлось бы всё его содержимое, он не трогается. Понятны оба формата: v5 (<item>в параметре вопроса) и v4 (<atom>сценария до маркера ответа — то, что за маркером, это уже ответ). «Текст под звук» ставит текстовому блоку, за которым СРАЗУ идёт отрывок, «играть одновременно» — то самое «Объединить со следующим (играть одновременно)» из SIQuester. Без этого игра сначала держит текст на экране по таймеру и только потом включает музыку, хотя текст там как раз подпись к ней («Назвать аниме по опенингу»). Понятны оба формата: v5 (waitForFinish="False"у<item>) и v4 (time="-1"у<atom>— ровно так это читает сам SIGame). Ни новых блоков, ни параметров при этом не заводится, правится атрибут у того, что в вопросе уже есть; там, где автор одновременное воспроизведение включил сам, ничего не меняется, а картинки и ролики правило не трогает вовсе — только текст перед звуком. «Сжать тяжёлые картинки» пережимает картинки в архиве тяжелее порога (по умолчанию 1 МБ) в AVIF под лимит (по умолчанию 500 КБ) — тем же кодированием и с теми же быстрыми настройками, что в «Генерации аниме-пака» (libaom,tune=iq, подбор CQ, сторона не больше 1280, низкий приоритет процесса); ссылки вcontent.xmlпереводятся на новое имя файла, GIF и уже готовый AVIF не трогаются, а картинка, которая после сжатия не стала легче, остаётся исходной. «Удалить пустые вопросы» выкидывает из пака вопросы, в которых нет ничего — ни текста, ни картинки, ни звука, ни ролика: играть в такой вопрос нечем, на экране пустота. Записанный ответ не в счёт (вопрос удаляется, даже если ответ есть), у v4 всё, что стоит после маркера, считается уже ответом, а не вопросом; тема, оставшаяся совсем без вопросов, убирается следом за ними, каждое удаление попадает в таблицу правок. Если же пустыми выглядят ВСЕ вопросы пака, не трогается ни один: значит, содержимое лежит как-то иначе, а пустой пак игре не открыть. «Сжать тяжёлое аудио» перекодирует дорожки тяжелее порога (по умолчанию 5 МБ) в opus на выбранном битрейте — список тот же, что во вкладке «Обработка» (по умолчанию 192 кбит/с), кодер тот же libopus с переменным битрейтом и низким приоритетом процесса. Битрейт исходника сначала спрашивается у ffprobe: если он и так не выше выбранного, файл не трогается вовсе — перекод только испортил бы звук, ничего не выиграв (а wav на 1536 кбит/с ужимается в десять с лишним раз). Громкость по умолчанию не трогается — в готовом паке её уже выставил автор, — но отдельной галочкой включается нормализация: тот жеloudnormи с теми же тремя числами (LUFS/LRA/TP), что во вкладке «Обработка». Включённая, она снимает обе оговорки «не трогаю»: дорожка перекодируется, даже если и так не богаче выбранного битрейта и даже если легче не станет, — иначе нормализовать было бы нечего, ради чего галочку и включают. Ссылки вcontent.xmlпереводятся на новое имя файла (.opus), а дорожка, которая после перекода не стала легче, остаётся исходной. «Сжать тяжёлое видео» перекодирует ролики в AV1 — тем же кодером и с теми же флагами, что во вкладке «Обработка» и в генераторе паков (libsvtav1,tune=0:keyint=-1:scd=1— ключевые кадры только на сменах сцены), с настраиваемыми CRF (по умолчанию 45), пресетом (13) и ограничением высоты кадра (по умолчанию исходная; ролик только уменьшается, растянуть 480p до 1080p нельзя). Звук ролика идёт в тот же opus на том же битрейте и с той же нормализацией, что и дорожки пака, — иначе ролик звучал бы громче соседних вопросов. Берутся ролики тяжелее порога (по умолчанию 20 МБ), а отдельной галочкой — вообще все, у кого кодек отличается от AV1: mp4 с H.264 из чужого пака в AV1 худеет вдвое-втрое даже без ужимания разрешения. Кодек виден только после распаковки (ffprobe читает файл, а не запись архива), поэтому с этой галочкой из архива достаётся каждый ролик; ролик, который уже в AV1 и легче порога, не трогается, как и тот, что после перекода не стал легче. Сама функция по умолчанию ВЫКЛЮЧЕНА, в отличие от остальных: перекод ролика идёт минутами, и включать такое молча за пользователя нельзя. Ролики кодируются по одному — libsvtav1 и сам занимает все ядра. «Удалить неиспользуемые файлы» не переносит в новый пак медиа, на которое вcontent.xmlнет ни одной ссылки: автор поменял картинку, а старая осталась лежать в архиве и весить (на 168 паках с диска такой мусор нашёлся в 46 — от одного файла до двух десятков, в отдельных паках это 13 МБ). Занятым считается файл, чьё имя встретилось где угодно вcontent.xml— и в тексте, и в любом атрибуте: логотип пака, например, записан атрибутомlogo, а не ссылкой в вопросе, и ошибаться тут можно только в сторону «оставить». Служебные части пака (content.xml,Texts/,[Content_Types].xml) не трогаются вовсе, ищется мусор уже ПОСЛЕ всех правок (постеры, только что поставленные в ответы, и пережатые картинки мусором не считаются), а если «неиспользуемым» вышло ВСЁ медиа пака, не удаляется ни один файл: так не бывает. Тяжёлое медиа кодируется по нескольку файлов разом (картинок — три, дорожек — шесть, но не больше, чем ядер у процессора), а постеры качаются и жмутся ФОНОМ, пока идёт опрос Shikimori: он отвечает не быстрее двух раз в секунду, и раньше эти два ожидания стояли в очередь друг за другом. На живых паках: прогон со всеми функциями (91 вопрос) — 50 секунд вместо 129, пак с 23 тяжёлыми картинками — 9 секунд вместо 20, пак с десятью тяжёлыми дорожками — 10 вместо 27. Дальше упирается уже не в программу, а в сам Shikimori: он отвечает не быстрее двух раз в секунду, и на 91 вопрос это 47 секунд из полусотни. Что именно изменилось, показано таблицей «Раунд · Тема · Цена · Функция · Было · Стало» (пропущенные вопросы там же — молчать о них нельзя): ширина колонок идёт по содержимому, а сама таблица ездит горизонтальной полосой — длинное «Стало» больше не обрывается многоточием. У правок, которые к вопросу не относятся вовсе (сжатая картинка, дорожка, ролик, удалённый мусор), ни раунда, ни цены нет — там имя файла занимает все три колонки разом, а не жмётся в «Тему» между двумя пустыми клетками. В лог по окончании идут по три примера с каждой функции и итоговые числа. - ⚙ Настройки — Discord-канал, локальный сервер для браузерного расширения, обновление yt-dlp, автообновление программы, аппаратное декодирование видео, выгрузка нейросетевых моделей из ОЗУ при простое (вкл/выкл) и прочие опции.
В комплекте — расширение, которое отправляет ссылку с открытой страницы прямо в «Загрузчик». Для связи программа поднимает локальный HTTP-сервер (включается в настройках).
Программа сама проверяет GitHub Releases. Если внешние ассеты (bin/ — ffmpeg/yt-dlp/deno — и models/ — нейросети) не менялись, качается только лёгкий update-архив (десятки МБ) вместо полного (сотни МБ); если менялись — полный. Старые версии и установки без манифеста всегда получают full-архив.
Если перестало качать с YouTube/TikTok — открой ⚙ Настройки → Обновить yt-dlp. Обновится bin/yt-dlp.exe без переустановки программы.
Нужен Python 3.10+ и зависимости:
pip install -r requirements.txtЗапуск из исходников:
python main.pyСборка в .exe (Windows):
build.batbuild.bat собирает строго по SI-HYX.spec (единый источник правды: иконка, hidden-imports, исключения тяжёлых неиспользуемых пакетов — torch/transformers/pandas/scipy и т.п., которые иначе раздували сборку на ~0.5 ГБ). Затем рядом с .exe кладутся внешние ассеты bin/ и models/, считается их общий хеш (bin/.binver) и собираются три ассета релиза: …-full.zip (код + bin + models), …-update.zip (только код) и manifest.json.
Папки
bin/иmodels/намеренно не хранятся в репозитории из-за размера — их нужно положить рядом самому или взять из релиз-архива.
bin/(ffmpeg, ffprobe, yt-dlp, deno):
- ffmpeg/ffprobe: https://www.gyan.dev/ffmpeg/builds/ (ffmpeg-release-essentials)
- yt-dlp: https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe
- deno: https://github.com/denoland/deno/releases
models/(нейросети ONNX для вкладки «Фото»):lama_fp32.onnx(удаление объектов, ~200 МБ) иmodel_uint8.onnx(удаление фона RMBG-2.0, ~360 МБ). Дополнительно нужныnumpy,opencv-pythonиonnxruntime(либоonnxruntime-gpu/onnxruntime-directml— код сам подхватит GPU: CUDA → DirectML → CPU). Без моделей или без onnxruntime подвкладки показывают понятную заглушку, остальное работает как обычно.
models/dyhit.onnx(~36 МБ) — модель трекера для «Монтаж → Привязать к объекту»: быстрая ветка (route 1) DyHiT из kangben258/HIT. Готового.onnxавторы не публикуют — в их Google Drive лежат веса.pth.tar, которые конвертируются скриптомtools/export_dyhit_onnx.py(нужен отдельный venv с torch/timm — в самой программе PyTorch нет). Модель необязательная: без неё кнопка работает на запасном трекере CSRT из OpenCV — менее устойчиво, но без лишних загрузок.
| Файл | Назначение |
|---|---|
main.py |
главное окно, точка входа, HTTP-сервер для расширения, автообновление |
config.py |
импорты, пути, константы, стили, версия |
utils.py |
утилиты (ffmpeg/ffprobe, cookies, deno) |
widgets.py |
кастомные виджеты, превью, лента файлов |
workers.py |
фоновые потоки: загрузка (yt-dlp) и обработка (ffmpeg) |
tabs.py |
вкладки: Обработка, Загрузчик, Base64, Промпт, Редактирование фото (кисть/фигуры/текст/кадрирование/поворот/удаление объектов/удаление фона) и объединение фото |
edit_tab.py |
вкладка «Монтаж»: волна, плеер, обрезка (copy/Smart Cut/реэнкод), кадрирование и удаление объектов с видео, прокси-предпросмотр |
edit_tab_frames.py |
покадровый слой «Монтажа»: сетка кадров (время ↔ номер кадра) и предекодирование точных кадров вокруг плейхеда через bundled ffmpeg |
lama_inpaint.py |
удаление объектов/водяных знаков нейросетью LaMa (ONNX) |
dyhit_tracker.py |
отслеживание объекта на видео (DyHiT/HiT, ONNX; запасной трекер — CSRT из OpenCV) |
rmbg_bg.py |
удаление фона нейросетью RMBG-2.0 / BiRefNet (ONNX) |
libass_renderer.py |
рендер субтитров (libass) для монтажа |
shikimori_api.py, shikimori_tab.py |
вкладка ShikimoriHYX (поиск аниме/манги) |
animepack_api.py, animepack.py, animepack_tab.py |
вкладка «Генерация аниме-пака» (сеть / отбор и сборка .siq / интерфейс) |
animepack_upgrade.py, animepack_upgrade_tab.py |
вкладка «Апгрейд пака» (правка готового .siq: спецвопросы → обычные, варианты названий и их написание с Shikimori, постер в ответе, уборка повторяющихся подписей, текст под звук, удаление пустых вопросов, сжатие тяжёлых картинок в AVIF, аудио в opus и роликов в AV1, удаление файлов без ссылок / интерфейс с карточкой пака) |
poster_cache.py |
общая кладовая обложек на диске (генератор и апгрейд паков берут постеры отсюда; там же ключ TMDB) |
avif_fit.py |
кодирование картинки в AVIF под лимит размера (общее для «Обработки» и генератора паков) |
siquester_tab.py, siquester/ |
вкладка SiQuesterHYX (просмотр .siq) |
error_report.py |
отправка отчёта об ошибке |
taskbar.py |
прогресс в панели задач Windows |
make_manifest.py |
генерация manifest.json для дельта-обновлений |