переименование фото украшений по бирке

SILVER-Renamer

Утилита для переименования фото украшений после фотосессии партии. Заменяет ручную работу менеджера со сканером 1С + копи-пастой артикула.

Сейчас работает по адресу: https://renamer.6sl.ru (приватный сервер, временно).

Финальная форма: одна silver-renamer.exe на машине менеджера, без сервера. Web-режим — для отладки и общей доступности на время обкатки.


Как работает

  1. Фотограф снимает партию на Samsung — первый кадр в серии = бирка (с Data Matrix-кодом), дальше ракурсы украшения. Имена YYYYMMDD_HHMMSS[(N)].jpg, сортируются хронологически.
  2. Скрипт сортирует .jpg по имени, для каждого фото пытается декодировать штрихкод (Data Matrix / QR) через zxing-cpp.
  3. Если задекодировался числовой UIN → бирка → ищем артикул в Excel → начинаем новую серию: бирка → АРТ_001.jpg (технический кадр для проверки, не для сайта).
  4. Если штрихкода нет → фото украшения текущей серии → АРТ_01.jpg, АРТ_02.jpg… (рабочие для сайта).
  5. Папка-результат: - output/ — все переименованные фото в одной папке (бирки _001, изделия _01, _02…). Лексическая сортировка ставит бирку первой. - _unknown/ — фото до первой бирки и бирки, чей UIN не нашёлся в Excel - rename_log.csv — журнал original,new,kind,uin,article (UTF-8 BOM, открывается в Excel)

Оригиналы не модифицируются — всё копируется (shutil.copy2).

Контракт входной папки

В папке должно быть:

Пример Excel (Вега 20.05.xlsx):

УИН Артикул
6432600251969238 4090-62
6432600251969265 4090С-62
6432501454966972 3173-нат АА+-340

Если в артикуле есть / или \ (например 3199-39/36г) — в имени файла слеш заменяется на - с предупреждением в отчёте. По договорённости Excel будет очищаться на стороне 1С.


Использование

Веб (сейчас)

  1. Открыть https://renamer.6sl.ru
  2. Нажать «Кликните, чтобы выбрать папку» → выбрать папку с фото + xlsx (в Chrome работает webkitdirectory, в Firefox/Safari может потребоваться вручную выбрать все файлы)
  3. Нажать «Обработать», дождаться окончания загрузки и обработки. При обрыве соединения — автоматический retry 3 раза с паузой 3 с, кнопка «Повторить» для ручного перезапуска.
  4. Просмотреть отчёт: статистика, таблица каждого файла со старым и новым именем, превью 100×100 (генерируются по требованию, кешируются), предупреждения
  5. Скачать 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, общий паттерн на сервере.

Что НЕ используется и почему

Допущения (проверять на каждой реальной партии)

Будущие улучшения (не сейчас)

  1. Прогон реальной партии ~600 фото. Тестировали только 15. Главный риск — пропуски декодирования бирок на массиве. До этого пункта остальные второстепенны.
  2. Standalone .exe для офлайн-использования. Сейчас CLI работает, нужно прогнать PyInstaller на Windows-машине и проверить, что zxing-cpp DLL подхватываются.
  3. OCR-fallback «УИН …» рядом с бирки. Делать только если на (1) увидим реальные пропуски декодирования.
  4. Комплекты. Фотограф будет вставлять чёрный кадр-разделитель между сериями (одна пара серьги+кольцо+подвеска — одна серия). Тогда фото комплекта в конце серии можно автоматически размножать по всем артикулам серии. Сейчас комплекты не обрабатываются — менеджер размножает фото руками.
  5. Drag & drop поверх dropzone. Сейчас работает только клик по dropzone.

История