# Audion TC Updater

[English](README_EN.md)

**Содержание**

- [Окно](#окно)
- [Три файла без окна](#три-файла-без-окна)
- [Какие сборки берутся](#какие-сборки-берутся)
- [ОБНОВЛЕНИЕ](#обновление)
- [СБОРКА](#сборка)
  - [Лицензия](#лицензия)
- [Ключ GitHub](#ключ-github)
- [Отпечатки вместо версий](#отпечатки-вместо-версий)
- [Прокси](#прокси)
- [Настройки](#настройки)

Проверяет, обновляет и собирает с нуля релизные сборки Audion TC — снаружи, не заходя в каждую руками.

## Окно

`Start.exe` открывает окно. Сверху — папка с релизами и переключатель секций
**ОБНОВЛЕНИЕ | СБОРКА**, справа во всю высоту — журнал: на экране 16:9 первой
кончается высота.

Рядом с переключателем секций — **RU | EN**: язык окна. По умолчанию окно и три
файла без окна говорят по-английски, на каком бы языке ни была Windows. Кнопка
меняет подписи, подсказки и язык, на котором пишут проверка, обновление и сборка;
выбор запоминается в `._runtime\ui-lang.txt` и держится до следующей смены. Уже
напечатанные строки журнала остаются как были, а что пишут Windows и чужие
программы, от выбора не зависит. Пока идёт работа, язык не переключить: на
полпути это сбило бы отчёт.

При первом старте окно спрашивает, с чем работать на этой машине: папку с
релизами, установщик и ключ GitHub. Обязательна только папка с релизами: без
установщика подождёт секция СБОРКА, без ключа GitHub даёт 60 запросов в час.
Установщик, который лежит внутри выбранной папки релизов, подставляется сам.

Пока идёт проверка, обновление или сборка, внизу бежит полоса и стоит строка: что
именно идёт, сколько уже идёт и на каком шаге — «Идёт проверка · 0:04 · Опрашиваю
источники…». Она обновляется четыре раза в секунду вместе с журналом, так что видно,
что программа жива, а не встала.

Окно само начинает с проверки — она ничего не меняет. Другая папка с релизами —
кнопка «Обзор» или путь в поле: он применяется по Enter или когда уходите из поля,
и следующий старт откроется на нём же.

## Три файла без окна

| Файл | Что делает | Что меняет |
| --- | --- | --- |
| `Check-Releases.cmd` | смотрит, что в сборках устарело | ничего — в сборки не пишет ни байта |
| `Update-Releases.cmd` | показывает план, спрашивает и обновляет | программы в сборках, их кнопки, меню и атлас |
| `Build-Releases.cmd` | показывает план, спрашивает и собирает с нуля все сборки из списка | сборка встаёт на место прежней, только если собралась целиком |

Запускаются двойным кликом и берут папки, выбранные при первом старте. Чтобы
работать с другой папкой релизов, перетащите её на файл. Пока первого старта не
было, файлы просят открыть `Start.exe` или перетащить папку.

## Какие сборки берутся

Любая папка `Audion TC…` в папке релизов: Initial, Audion, Ultimate, Creator,
Developer, Admin — сколько есть. Контейнер вида `Audion TC Portable\Audion TC` тоже находится.
Сборкой считается папка, где лежит `TOTALCMD64.EXE`.

## ОБНОВЛЕНИЕ

Проверка показывает таблицу: строки — программы, столбцы — сборки. В клетке —
версия в сборке, версия у автора и галочка «обновить». Клик по программе отмечает
всю строку, по сборке — весь столбец.

Под таблицей:

- **актуально** — какие программы свежие, по сборкам;
- **версию у источника не узнать** — сайт автора не называет номер, пока файл не
  скачан (FastStone, HWiNFO, Sysinternals и ещё несколько).

Total Commander попадает в таблицу, если на ghisler.com вышел новее.

Пометка **«эталон»** значит: файл приезжает из установщика и при установке не качается.
Обновление в релизе его освежит, но следующая сборка с нуля привезёт старый — обновите
и установщик. fzf так больше не помечается: с 14.09.2026 установка сама качает его свежим.

Отчёт сохраняется таблицей в `._runtime\reports\`. В конце проверка сама убеждается,
что в сборках не изменился ни один файл, и пишет об этом.

Плагины Total Commander не проверяются: их архивы лежат на сайтах без номера версии.

«Обновить отмеченное» сначала спрашивает. Дальше для каждой сборки:

1. если из неё сейчас что-то запущено — сборка пропускается;
2. обновляются отмеченные программы, а если нужно — сам Total Commander;
3. убираются прежние версии (`.bak`);
4. пересобираются кнопки, меню, атлас и окно выбора программ;
5. убирается машинное: кеш проверки, временные загрузки, кеш значков;
6. проверяется, что обновилось на самом деле.

Обновление идёт скриптами самой сборки — теми же, что в её пульте.

## СБОРКА

Сборка с нуля идёт тем же планом, что установка мастером: файл плана
`Setup\Scripts\Invoke-AudionInstall.ps1` берётся из установщика
`Audion Setup for Total Commander`. Поэтому релиз не расходится с тем, что получает
человек, поставивший Audion TC сам.

Установщик — отдельное поле с кнопкой «Обзор», версия — бейджем рядом с заголовком.
Его спрашивает первый старт, а сменить можно здесь — хоть на мастер установщика, хоть
на его раздачу; папка релизов от этого не меняется.

В секции — строка на каждую сборку: галочка, папка, сколько программ в наборе,
язык меню и когда собрана текущая. Язык меню можно переставить перед сборкой.

Отмеченные сборки собираются **по одной** — так опрос источников укладывается в
лимит GitHub. Для каждой:

1. Total Commander скачивается с ghisler.com в черновик
   `_stage\<набор>-<время>\Audion TC` в папке релизов;
2. ставятся программы набора и все плагины, у которых есть источник; каждый плагин
   записывается в `Wincmd.ini`;
3. атлас и окно выбора программ пересобираются на языке меню;
4. из черновика убирается машинное: временные загрузки, кеши, файл токена;
5. встало всё — прежняя сборка уходит, новая занимает её место;
6. что-то не встало — прежний релиз остаётся как был, черновик лежит в `_stage`, а
   в журнале и отчёте видно, чего не хватает.

Контейнер вокруг сборки — `README.md`, `licenses` и прочее у `Audion TC Portable` —
не трогается. Initial собирается за несколько минут, Ultimate — полчаса и дольше.
Отчёт — `._runtime\reports\build-*.md`.

| Сборка | Набор | Папка | Меню |
| --- | --- | --- | --- |
| Initial | `initial` | `Audion TC Portable\Audion TC` | EN |
| Audion | `audion` | `Audion TC Audion` | RU |
| Ultimate | `ultimate` | `Audion TC Ultimate` | RU |
| Admin | `admin` | `Audion TC Admin` | RU |
| Creator | `creator` | `Audion TC Creator` | RU |
| Developer | `programmer` | `Audion TC Developer` | RU |

Admin, Creator и Developer — наборы по занятию: собираются ровно по своему списку, как
их ставит мастер.

### Лицензия

Над списком сборок — поле для `WINCMD.KEY`. Выбранный ключ ляжет в каждую отмеченную
сборку рядом с `TOTALCMD64.EXE`. Ключ не запоминается: при следующем открытии окна
поле снова пустое. Вопрос перед сборкой и отчёт называют файл ключа, а строка
сборки, в которой ключ уже лежит, помечена «с ключом».

Сборка с ключом — личная: публиковать её нельзя.

Без окна — перетащите `WINCMD.KEY` на `Build-Releases.cmd`, можно вместе с папкой
релизов.

## Ключ GitHub

Без ключа GitHub даёт 60 запросов в час, а программ в сборках полсотни. Ключ лежит
открытым текстом в `config\api_key_github.txt` — одной строкой, и больше в файле
ничего нет.

Первый старт спрашивает ключ вместе с папками. Потом он стоит в окне рядом с папкой
релизов: бейдж показывает, принял ли его GitHub, а кнопка «Ключ GitHub» открывает
диалог — вставить новый ключ, проверить сохранённый или убрать его. Новый ключ
сохраняется, только если GitHub его принял, а если GitHub не ответил — без проверки.
Без окна ключ меняют прямо в файле.

В начале проверки, обновления и сборки журнал сообщает, принял ли GitHub ключ и
сколько запросов в час осталось. Ключ, который GitHub не принял, дальше не
передаётся, и опрос идёт без него. Принятый уходит процессам через окружение и в
сборки не попадает. Файл ключа исключён из git.

## Отпечатки вместо версий

У десятка программ версию с сайта не узнать — раньше они всегда сидели в списке
«версию у источника не узнать без скачивания». Теперь загрузчик сборки снимает для них
отпечаток — имя файла со ссылки, тег ночной сборки или ETag из запроса `HEAD`, —
и кладёт его в `Ware\State\app-fingerprints.json`. Проверка сравнивает отпечаток источника
с тем, что сборка сняла, когда качала: разошлись — программа в списке на обновление,
совпали — актуальна. В строке отчёта видно, что именно сменилось: `FSViewer84.zip →
FSViewer85.zip`. Файл ради этого не скачивается.

Серая зона остаётся для тех, у кого отпечатка ещё нет ни с одной стороны: сборка не
качала эту программу сама или источник не ответил.

## Прокси

Адрес всегда ваш: ни одного адреса нет ни в коде, ни в `config` — проект публичный.
Порядок такой: адрес, заданный в окне, затем `HTTPS_PROXY` из окружения, затем
системный прокси Windows — его выставляют v2rayN, Hiddify, Clash и корпоративные сети.

В окне прокси стоит рядом с ключом GitHub: бейдж говорит, свой прокси или
системный, а кнопка «Прокси» открывает диалог — задать адрес, проверить
сохранённый или убрать его. Проверка — стук в GitHub через этот адрес; он идёт
в стороне от окна, поэтому окно не замирает. Адрес сохраняется и тогда, когда
стук не прошёл: прокси мог ещё не подняться, а перенабирать адрес с паролем
заново — удовольствие ниже среднего.

Адрес лежит в `._runtime\proxy.txt` — одной строкой, вне git и вне публичного
архива: в нём может быть логин с паролем. В журнал он не пишется никогда —
ни целиком, ни хостом в чужом сообщении об ошибке; журнал называет только
схему — `http`, `https` или `socks5`.

Проверке, обновлению и сборке адрес передаётся через окружение (`HTTPS_PROXY`,
`HTTP_PROXY`, `ALL_PROXY`), как и ключ GitHub, и возвращается как было после прогона.
`curl` и PowerShell 7 берут его сами; для собственных запросов ставится `DefaultWebProxy`.
`socks5` понимают `curl` и PowerShell 7, Windows PowerShell 5.1 — нет, и журнал об этом
говорит.

## Настройки

Ни в коде, ни в `config` нет папок какой-либо машины. Что выбрал первый старт, лежит
в `._runtime\folders.json`:

- `releasesRoot` — папка с релизами;
- `installerRoot` — установщик.

Папка `._runtime` не уходит ни в git, ни в публичный архив, поэтому там же лежат
отчёты: в них названы эти папки. Смена папки или установщика в окне переписывает
файл; несуществующая папка и установщик без плана не запоминаются. Удалите файл — и
первый старт спросит снова. Папка, перетащенная на `.cmd`-файл, действует только на
этот запуск.

`config\settings.json` — `buildMask`, маска папок сборок, по умолчанию `Audion TC*`.

`config\builds.json` — что собирает секция СБОРКА: набор, название, папка и язык
меню по умолчанию.
