SILVER-Renamer
Утилита для переименования фото украшений после фотосессии партии. Заменяет ручную работу менеджера со сканером 1С + копи-пастой артикула.
Сейчас работает по адресу: https://renamer.6sl.ru (приватный сервер, временно).
Финальная форма: одна silver-renamer.exe на машине менеджера, без сервера. Web-режим — для отладки и общей доступности на время обкатки.
Как работает
- Фотограф снимает партию на Samsung — первый кадр в серии = бирка (с Data Matrix-кодом), дальше ракурсы украшения. Имена
YYYYMMDD_HHMMSS[(N)].jpg, сортируются хронологически. - Скрипт сортирует
.jpgпо имени, для каждого фото пытается декодировать штрихкод (Data Matrix / QR) черезzxing-cpp. - Если задекодировался числовой UIN → бирка → ищем артикул в Excel → начинаем новую серию: бирка →
АРТ_001.jpg(технический кадр для проверки, не для сайта). - Если штрихкода нет → фото украшения текущей серии →
АРТ_01.jpg, АРТ_02.jpg…(рабочие для сайта). - Папка-результат:
-
output/— все переименованные фото в одной папке (бирки_001, изделия_01, _02…). Лексическая сортировка ставит бирку первой. -_unknown/— фото до первой бирки и бирки, чей UIN не нашёлся в Excel -rename_log.csv— журналoriginal,new,kind,uin,article(UTF-8 BOM, открывается в Excel)
Оригиналы не модифицируются — всё копируется (shutil.copy2).
Контракт входной папки
В папке должно быть:
- 1+ файлов
.jpg/.jpeg - ровно один
.xlsxс заголовкамиУИН | Артикулв первой строке (колонки A=УИН, B=Артикул)
Пример Excel (Вега 20.05.xlsx):
| УИН | Артикул |
|---|---|
| 6432600251969238 | 4090-62 |
| 6432600251969265 | 4090С-62 |
| 6432501454966972 | 3173-нат АА+-340 |
Если в артикуле есть / или \ (например 3199-39/36г) — в имени файла слеш заменяется на - с предупреждением в отчёте. По договорённости Excel будет очищаться на стороне 1С.
Использование
Веб (сейчас)
- Открыть https://renamer.6sl.ru
- Нажать «Кликните, чтобы выбрать папку» → выбрать папку с фото + xlsx (в Chrome работает
webkitdirectory, в Firefox/Safari может потребоваться вручную выбрать все файлы) - Нажать «Обработать», дождаться окончания загрузки и обработки. При обрыве соединения — автоматический retry 3 раза с паузой 3 с, кнопка «Повторить» для ручного перезапуска.
- Просмотреть отчёт: статистика, таблица каждого файла со старым и новым именем, превью 100×100 (генерируются по требованию, кешируются), предупреждения
- Скачать ZIP — только переименованные файлы (
output/,_unknown/) +rename_log.csv. Оригиналы и xlsx не возвращаются (у менеджера они уже есть).
Документация (этот README) дублирована на сайте: https://renamer.6sl.ru/docs
Лимит на партию: 2 ГБ.
CLI (на любой машине с Python 3.12)
git clone git@github.com:vclaude-creator/silver-renamer.git
cd silver-renamer
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python src/silver_renamer.py /путь/к/папке
Папка должна содержать фото + один .xlsx. После выполнения в папке появятся output/, _unknown/, rename_log.csv.
Standalone .exe для Windows (финальный режим)
На Windows-машине менеджера (Python 3.12 + git):
git clone https://github.com/vclaude-creator/silver-renamer.git
cd silver-renamer
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt pyinstaller
.venv\Scripts\pyinstaller --onefile --name silver-renamer src/silver_renamer.py
dist\silver-renamer.exe — самодостаточный, никаких зависимостей. Запуск:
silver-renamer.exe C:\путь\к\папке
zxing-cpp уже содержит свои нативные либы и упаковывается в exe без libzbar0.
Структура репозитория
src/
silver_renamer.py # ядро: process(folder) → ProcessResult + CLI entrypoint
web.py # FastAPI веб-обёртка (использует тот же process)
templates/
base.html
index.html # форма загрузки + howto
report.html # отчёт по партии
docs.html # /docs — обёртка для отрендеренного README
static/
style.css
deploy/
silver-renamer.service # systemd unit
Caddyfile.snippet # блок reverse_proxy + LE для renamer.6sl.ru
initialdocs/
2026-05-21 Ренеймер файлов Виталика.pdf # исходное ТЗ
Вега 20.05.xlsx # пример маппинга UIN→Артикул
renamer_tests/ # 15 тестовых фото (smoke-test)
requirements.txt # web-вариант (CLI — requirements-cli.txt)
README.md # дублируется на сайте /docs
CLAUDE.md # конвенции проекта для AI-ассистента
Деплой на VPS (Hetzner)
На сервере уже работает Caddy с другими сервисами по образцу legal.6sl.ru. Schema:
client → renamer.6sl.ru (Caddy, TLS, LE)
→ 127.0.0.1:8767 (uvicorn в systemd silver-renamer.service)
Команды установки на чистый сервер:
git clone git@github.com:vclaude-creator/silver-renamer.git /home/vadim/PROJECTS/SILVER-Renamer
cd /home/vadim/PROJECTS/SILVER-Renamer
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
sudo cp deploy/silver-renamer.service /etc/systemd/system/
sudo bash -c 'cat deploy/Caddyfile.snippet >> /etc/caddy/Caddyfile'
sudo systemctl daemon-reload
sudo systemctl enable --now silver-renamer.service
sudo systemctl reload caddy
DNS: renamer.6sl.ru A → IP сервера, Caddy получит LE-серт автоматически.
Логи: journalctl -u silver-renamer -f и /var/log/caddy/renamer.6sl.ru.log.
Технические замечания
Стек
| Что | Чем сделано | Почему |
|---|---|---|
| QR/Data Matrix | zxing-cpp (pure pip) |
Не требует системных либ — критично для PyInstaller-сборки .exe. Pyzbar отброшен по этой причине. Читает оба формата. |
| Excel | openpyxl |
Стандарт, поддерживает .xlsx, read-only режим. |
| Чтение изображения | opencv-python-headless (cv2.imread) |
Любой JPEG для декодирования QR (zxing-cpp инвариантен к ориентации). |
| Превью | Pillow (PIL.ImageOps.exif_transpose + thumbnail) |
100×100 для отчёта; учёт EXIF-ориентации; кеш в job_dir/thumbs/. Только web-обвязка. |
| Документация | markdown (Python-Markdown) |
Рендер README.md на /docs — один источник истины для GitHub и сайта. |
| Web | FastAPI + Jinja2 | Совместимо с Caddy reverse-proxy, async upload, простые шаблоны. |
| Прод | uvicorn под systemd + Caddy | Аналогия с соседним legal.6sl.ru, общий паттерн на сервере. |
Что НЕ используется и почему
pyzbar— нужен системныйlibzbar0, ломает портативность.exe.- Vision-LLM (Groq/Claude/OpenAI) — MVP не нуждается. По договорённости комплекты обрабатываются вручную; в будущем фотограф будет вставлять чёрный кадр между сериями (см. ниже).
- Yandex.Disk API — менеджер скачивает партию на локальную машину руками.
- БД / persistence — каждая партия = stateless job (UUID, TTL 6 часов в
/tmp/silver-renamer-jobs/).
Допущения (проверять на каждой реальной партии)
- Все бирки декодируются. На тестовой выборке (15 фото, 6 бирок) — 100%. Если на реальной партии будут пропуски — добавить fallback: OCR текста «УИН …» рядом с биркой.
- UIN в Data Matrix = UIN в Excel.
- Фотограф снимает бирку + изделие в одном кадре (первый кадр серии), затем только изделие. На бирковом кадре изделие тоже видно — это технический ракурс для проверки, отдельным файлом
{артикул}_001.jpgвoutput/. - В партии нет двух разных украшений с одинаковым UIN.
Будущие улучшения (не сейчас)
- Прогон реальной партии ~600 фото. Тестировали только 15. Главный риск — пропуски декодирования бирок на массиве. До этого пункта остальные второстепенны.
- Standalone
.exeдля офлайн-использования. Сейчас CLI работает, нужно прогнать PyInstaller на Windows-машине и проверить, чтоzxing-cppDLL подхватываются. - OCR-fallback «УИН …» рядом с бирки. Делать только если на (1) увидим реальные пропуски декодирования.
- Комплекты. Фотограф будет вставлять чёрный кадр-разделитель между сериями (одна пара серьги+кольцо+подвеска — одна серия). Тогда фото комплекта в конце серии можно автоматически размножать по всем артикулам серии. Сейчас комплекты не обрабатываются — менеджер размножает фото руками.
- Drag & drop поверх dropzone. Сейчас работает только клик по dropzone.
История
- 2026-05-21 — MVP CLI + Web. Тест на 15 фото пройден (6 бирок задекодировано, 9 фото переименовано). Развёрнут на https://renamer.6sl.ru.
- 2026-05-22 — Все переименованные файлы в одной папке
output/. Бирка переименовывается в{артикул}_001.jpg(технический кадр), рабочие фото для сайта —_01, _02…. Папка_tags/упразднена. Web UI: retry загрузки (3 попытки с паузой 3 с), превью 100×100 в отчёте (вместо полных JPEG-ов, кешjob_dir/thumbs/), ZIP без оригиналов и xlsx, страница/docsс рендером README.