Skip to content

Releases: Ucellar/Local_Booru

Local_Booru_windows v1.5

Choose a tag to compare

@Ucellar Ucellar released this 09 Jul 15:43

ENGLISH

Local Booru Changelog

v1.5 — first-run language picker and safer SQLite rebuilds

Release date: 2026-07-09

Added

  • First-run language dialog for choosing English or Russian before the main window opens.
  • Persistent language selection via the language and language_selected_once settings keys.
  • English public README for GitHub publication.
  • Russian companion documentation for users who prefer the Russian interface and release notes.

Fixed

  • Fixed m024_reverse_branch_status missing NAME, which could crash migration journaling after a clean SQLite database rebuild.
  • Migration runner now falls back to a safe generated migration name if a migration module misses NAME, preventing a secondary AttributeError from masking the real migration error.
  • Legacy NO_MATCH cache import and deleted-file registry import now commit in batches to avoid long SQLite writer locks during clean database rebuilds.
  • Parser startup no longer treats a locked SQLite database as an empty database.

Improved

  • Safer SQLite startup and readiness checks after abnormal shutdowns.
  • Low-memory parser profile for large archive runs.
  • Better release documentation for GitHub users.

v413 — first-run language picker

  • Added a first-run startup dialog for choosing the interface language: Russian or English.
  • The choice is saved into settings as language and language_selected_once, so the dialog appears only once per workspace/profile.
  • The existing Settings page language switch remains available for later changes.
  • Added Qt-free language bootstrap helpers and tests.

v412 — SQLite migration m024 / deleted-DB startup fix

  • Fixed m024_reverse_branch_status missing NAME, which crashed schema migration journaling after a database rebuild.
  • Migration runner now uses a safe fallback name, so a future migration without NAME no longer masks the real migration error.
  • Legacy NO_MATCH and deleted-registry imports now commit in batches to avoid holding SQLite writer locks for minutes during clean database rebuilds.
  • This specifically targets the deleted-SQLite test path where the media archive remains intact but the working database is recreated.

v411 — DB lock hard-stop and low-RAM parser profile

  • Parser startup no longer treats database is locked during status/site-status checks as an empty database. If SQLite is still locked after crash recovery, the parser stops before queue construction.
  • Added a startup SQLite readiness probe: a read test plus a short BEGIN IMMEDIATE / rollback write-lock test before scanning and status queue construction.
  • Added runtime performance profiles: auto, low_memory, balanced, and performance. Auto resolves by detected RAM and only changes the worker session copy, not app_settings.json.
  • The low-memory profile clamps the reverse admission window and worker count, disables pHash preflight for large runs, uses FILE temp store, applies a smaller SQLite cache, and sets RAM limits based on total system memory.
  • Large-run local preflight is skipped on low-memory systems instead of warming pHash/video-frame caches over tens of thousands of files.
  • Reverse scheduler stops advancing already-archived skip_existing files to later stages after a branch returns SKIP ARCHIVED.

v405 — audit hotfixes

  • Fixed tests shipped in v404: tag-group merge expectations now match preserved first spelling.
  • Removed an engine side effect from core.tagger package import; helper modules can be imported without loading the full Tagger engine.
  • Made imagehash optional for hashing helper imports; pHash functions return a safe fallback when it is missing.
  • Removed the save_settings() side effect from SQLite connect() / ensure_initialized(); database initialization now writes only a marker file.
  • Added startup handling for DatabaseMissingError with a clear dialog and exit code instead of silently continuing.
  • Parser database error handler now treats DatabaseMissingError as a hard safe-stop.
  • Fixed resumed reverse clean-state logic by counting only _should_reverse()-eligible already-journaled files.
  • Added effective-category refresh after indexer tag rebuild, e621 metadata repair, and invariant repair.
  • Replaced category-maintenance URL LIKE '%host%' scan with indexed sources.host matching.
  • Release zip builder now runs pytest by default and has stronger nested-folder excludes.
  • Added ui/tagger/__init__.py and PyInstaller hidden imports for ui.tagger.workers and the new tagger helper modules.
  • VACUUM no longer force-closes pooled SQLite connections owned by other threads.

v404 — full audit refactor

  • First safe split of core/tagger/engine.py: hashing, tag groups, cookie I/O, and ATF HTML helpers were moved into separate testable modules, while engine.py remains a compatibility facade.
  • Major split of ui/tagger_page.py: TaggerWorker and BrowserLoginWorker were moved into ui/tagger/workers.py, leaving the page as a UI layer.
  • SQLite schema v23: added materialized image_effective_tag_category table to speed up all-source tag facets; storage now refreshes the cache when tags or categories change.
  • DONE / clean-session logic is stricter: runs with errors, deferred items, or reverse retry rows are no longer marked clean.
  • Release hygiene: AI_MEMORY was renamed to dev-only, old changelogs were consolidated, tools/release/make_release_zip.py was added, and release exclude rules were added.
  • reactor_scraper and architecture leftovers were moved into tools/deprecated with compatibility shims.
  • Added initial pytest smoke tests for helpers and release excludes.

v403 — safety/reverse/UI audit patch

  • SQLite safety guard: a previously initialized database is not silently recreated as an empty file when the expected local_booru_index.sqlite3 is missing. Intentional full reset: create ALLOW_CREATE_EMPTY_DB.txt beside the expected database or launch with LOCAL_BOORU_ALLOW_NEW_DB=1.
  • Startup log moved from the app directory to Local_Booru_Archive/settings/output/logs/startup_console.log.
  • Browser companion GET endpoints now require the same extension origin/header authorization as POST; extension status fetch was updated accordingly.
  • Reverse temporary network defer is persisted into reverse_retry_queue instead of remaining only in RAM.
  • e621 IQDB 429/temporary failures set a branch-local cooldown and retry row; the whole parser is not stopped.
  • Reverse branch claim/cancel: when a file is already found by another branch, pending sibling branches skip it and the summary reports REVERSE_CANCELED.
  • Summary now reports REVERSE_RETRY_QUEUED.
  • Gallery/grabber source sidebars: collapsed view shows all + top 3 sources by count; expanded view shows all. No configurable sorting.
  • r34 theme made more angular: gallery cards/containers in that theme no longer use rounded corners.
  • Library diagnostics now includes source folder vs site_scan_status reconciliation.
  • Added safe SQLite identifier validation for maintenance/count helper SQL.

v399 — parser recovery uses latest completed files

  • Fixed the “recheck last 10 files” recovery logic.
  • Previous builds tracked files when they were submitted/started, so with a large conveyor window the recovery pass could recheck the first/oldest files in the queue.
  • Recovery now tracks completed_recent: the last files that actually finished parser processing.
  • On an unclean shutdown, the next parser run forces recheck for those latest completed files first.
  • recent_started is kept only as a compatibility fallback for old recovery state files.

v396 — general-only category maintenance

  • Added a button in Settings → Library Maintenance: “Reclassify general-only tags”.
  • The button finds already saved Gelbooru/rule34/xbooru/hypnohub source bundles where all source-specific tags are still under general.
  • Starts a network category recheck using the already confirmed source URL.
  • No new tags are added: only categories for existing tags in that specific source bundle are updated.
  • A SQLite backup is created before the bulk update.
  • The repair runs in the background through TaskManager, with progress shown in the maintenance status.

v395 — current-run category drain

  • Gelbooru/rule34 category background now prioritizes jobs created by the current parser run.
  • The live parser no longer loads the full historical category-backfill backlog into RAM at startup by default. Old backlog can still be enabled explicitly with tagger_category_startup_seed_backlog=true.
  • Before DONE, parser waits for current-run category jobs to finish, so freshly matched Gelbooru/rule34 posts do not remain visibly stuck in general.
  • Added task accounting for category queue shutdown.

v394 — Gelbooru category backfill fix

  • Gelbooru source-specific tag view should no longer remain entirely under general when post DAPI returned flat tags.
  • Background tag category queue key bumped to flat-sites::tag-groups-v8-gelbooru-rule34-dapi-overlay to re-run old Gelbooru/rule34 category jobs.
  • Gelbooru category recovery now tries the tag catalogue per tag when the multi-name DAPI batch does not classify the confirmed post tags.
  • Membership remains guarded: Gelbooru HTML/tag-catalogue may only classify tags already present in the exact Gelbooru post response; it cannot add sidebar/recommendation tags.

v391 — embedded ExifTool bootstrap

  • Added built-in ExifTool lookup locations:
    • <app>/tools/exiftool/exiftool.exe
    • <app>/tools/exiftool/exiftool_files/
    • Local_Booru_Archive/settings/tools/exiftool/exiftool.exe
  • Added automatic Windows bootstrap for ExifTool when it is missing:
    • downloads the official 64-bit ExifTool archive into settings/tools/exiftool
    • extracts exiftool.exe and exiftool_files...
Read more

Local_Booru_windows v1.4

Choose a tag to compare

@Ucellar Ucellar released this 17 Jun 16:13

Local Booru v1.4

Краткое описание изменений относительно v1.3.

Добавлено

  • Blueprint-парсер — визуальная схема парсера с блоками, соединениями, пресетами, настройками workers/delay/retry/rate group и режимом полного доступа.
  • Unreal-style Blueprint canvas — тёмный холст с сеткой, цветными блоками, портами, проводами, группами и почти бесконечной рабочей областью.
  • Свободное дерево интерфейса — страницы приложения можно вкладывать друг в друга и менять порядок, например “Дубли” внутри “Обзор” или “Граббер” внутри “Манга”.
  • Async reverse side queue — reverse-поиск вынесен в отдельную очередь и больше не должен тормозить основной MD5-конвейер.
  • Per-site checkpoints — приложение запоминает, какие сайты уже проверены для каждого файла, и при повторном запуске проверяет только незавершённые источники.
  • SQLite recovery/write gate — после падения или ошибки диска запись в SQLite временно блокируется до фоновой проверки базы.
  • Power-loss recovery — после аварийного завершения последние обработанные файлы перепроверяются, чтобы не оставлять битые состояния.
  • e621 browser companion / page-context fetch — добавлен запасной способ API-запросов через контекст браузерной вкладки.
  • rule34 image-key relay — добавлена side-ветка для 40hex image-key: image-key → пост → MD5 → проверка по сайтам.
  • ATF pixel_hash locator — добавлен поиск ATF через media_assets.json по pixel_hash с переходом к MD5 и посту.
  • Source/Post URL → MD5 relay — ссылки из SauceNAO/TinEye/IQDB/source-результатов могут превращаться в MD5 и прогоняться через обычные MD5-сайты.
  • Официальные/API-first клиенты — переработаны клиенты e621, Danbooru, rule34.xxx и ATF.
  • MD5 в статусе парсера — в таблицу текущих задач добавлена колонка MD5.
  • FHD-режим интерфейса — Blueprint и панели уплотнены для 1920×1080.

Изменено

  • Парсер стал модульным — стандартный конвейер теперь описывается Blueprint-схемой, а не только жёсткой последовательностью в коде.
  • MD5-конвейер отделён от медленных fallback-веток — быстрые exact-MD5 проверки идут отдельно от IQDB/SauceNAO/TinEye/rule34 image-key.
  • Reverse запускается только после MD5 miss — обратный поиск используется как запасной путь, а не мешает основному поиску.
  • Отключатели парсера стали главнее Blueprint — если модуль выключен в настройках, Blueprint больше не включает его обратно без явного override.
  • TinEye используется только как locator — он не является источником тегов, а только даёт ссылки, которые можно попытаться превратить в MD5.
  • rule34.xxx переведён на DAPI-first — теги и совпадения берутся через API; HTML используется только как ограниченный вспомогательный overlay.
  • ATF переведён на API-first — основной путь работает через Danbooru-compatible API и обработку anti-bot/PoW.
  • e621 переведён на более устойчивый API-путь — с cookie, companion fallback и отдельной обработкой IQDB.
  • FOUND/NO_MATCH логика стала безопаснее — найденный файл не должен оставаться в старом NO_MATCH-состоянии.
  • Поведение при повторном запуске изменено — завершённые сайты не гоняются повторно без необходимости.
  • Интерфейс Blueprint переработан — панели можно переносить, группировать как вкладки и откреплять в отдельные окна.
  • Логи стали подробнее — отдельно видны MD5-проверки, reverse, relay, exact merge, network temporary failure и slow fallback.

Исправлено

  • Reverse блокировал основной парсер — исправлено: MD5-конвейер продолжает работу, пока reverse обрабатывает свою очередь.
  • TinEye запускался при выключенном модуле — исправлено: Blueprint уважает выключатели парсера.
  • Отключённые сайты могли оставаться активными через Blueprint — исправлено.
  • Создание физических копий одного MD5 — исправлено: источники и теги объединяются в существующую карточку.
  • NO_MATCH мог перебить найденный файл — исправлено через promotion/stale cleanup.
  • Ошибки после bad shutdown / disk I/O — добавлена защита записи и ожидание проверки SQLite.
  • Повторная обработка завершённых сайтов — исправлено через per-site journal и pending-only resume.
  • Падение Blueprint из-за reload_graph_view — исправлено.
  • Падение Blueprint из-за setTabData у QTabWidget — исправлено.
  • Маленькая рабочая область Blueprint — исправлено: холст расширен и автоматически растёт.
  • Блоки Blueprint были свалены в кучу — стандартная раскладка разнесена шире.
  • Плохой вид на Full HD — интерфейс уплотнён для 1920×1080.
  • rule34 image-key тормозил MD5-путь — вынесен в side queue.
  • ATF мог уходить в HTML/PoW вместо нормального API-пути — добавлена обработка API/cookie/PoW.
  • e621 мог ломаться на Cloudflare/доступе — добавлен browser companion fallback.
  • Сетевые временные ошибки могли выглядеть как окончательный NO_MATCH — теперь такие файлы откладываются как incomplete/deferred.
  • Непонятное состояние “SITES UP TO DATE” — частично улучшена диагностика; основной смысл: сайты уже проверены, файл может идти в reverse.

Удалено

  • Дублирующие кнопки Blueprint — убраны лишние действия вроде отдельной кнопки “Разложить красиво” и дублирующей загрузки стандартного плана при наличии пресетов.
  • Старые небезопасные HTML-пути как основной источник совпадений — заменены API-first логикой там, где это возможно.
  • Лишние физические копии при exact-MD5 совпадении — больше не создаются как штатное поведение.

Важно при обновлении

  • Перед обновлением желательно сделать резервную копию SQLite и папки settings.
  • После обновления не рекомендуется открывать новую базу в старой версии v1.3.
  • После первого запуска приложение может выполнить фоновую проверку SQLite, особенно если прошлое завершение было аварийным.
  • Для проверки новой async-логики в логах должна быть строка reverse side queue async.

Local_Booru_windows v1.3

Choose a tag to compare

@Ucellar Ucellar released this 03 Jun 19:19

Хранилище файлов и целостность библиотеки

Единая карточка по MD5 — введено правило хранения: один MD5 соответствует одному физическому файлу и одной карточке с несколькими источниками.

Объединение источников — если один и тот же файл находится через несколько подключённых booru-источников, приложение больше не создаёт физические копии, а объединяет ссылки и теги в существующей записи.

Нормализация старых дублей — добавлена автоматическая обработка уже существующих точных MD5-дублей с переносом метаданных в одну карточку и отправкой лишних физических копий в корзину.

Защита основного архива — исходный архив переведён в режим только для чтения. Приложение может копировать из него файлы, но не удаляет, не перемещает и не перезаписывает оригиналы.

Рабочая библиотека — галерея, SQLite, кэш и корзина отделены от исходного архива и могут безопасно пересоздаваться во время тестирования или восстановления.

Безопасные файловые операции — копирование, удаление, восстановление, очистка и склейка точных копий переведены через единый слой хранения медиа.

Защита от перезаписи — если в рабочей библиотеке уже существует другой файл с тем же именем, новый файл получает уникальное имя вместо перезаписи существующего.

SQLite и метаданные

SQLite-first модель — живое состояние библиотеки переведено в SQLite: теги, источники, брак, очереди повторов, удалённые MD5 и состояния фоновых сервисов теперь хранятся в базе.

Отказ от sidecar в рабочем режиме.tags.txt, .sources.txt и marker-файлы больше не используются как действующее хранилище метаданных.

Импорт старых метаданных — для прежних библиотек оставлена отдельная операция импорта sidecar-файлов в SQLite с созданием резервной копии базы.

NO MATCH в SQLite — состояние ненайденных файлов больше не требует создания вспом состояние ненайденных файлов больше не требует создания вспомогательных marker-файлов рядом с изображениями.

Редактирование карточек — изменения тегов и источников из просмотрщика теперь записываются непосредственно в SQLite.

Миграции и обслуживание базы

Миграции SQLite — добавлен механизм нумерованных миграций с журналом применённых изменений и контролем версии схемы.

Версия схемы — структура базы обновлена до SQLite v14.

Проверка при запуске — целостность базы проверяется до начала операций записи.

Безопасный режим — при обнаружении повреждения SQLite операции записи блокируются, а решение о восстановлении остаётся за пользователем.

Панель обслуживания — добавлены создание backup, статистика SQLite и безопасное сжатие базы при остановленном парсере.

Реестр удалённых MD5 — перенесён в SQLite и теперь различает ручное удаление пользователем и автоматическую уборку точных копий.

Корректная политика возврата — автоматически удалённая точная копия больше не блокирует повторное добавление полезного файла в библиотеку.

Корзина и восстановление

Безопасное восстановление — если точная копия файла уже существует в галерее, второй физический файл не восстанавливается, а теги и источники объединяются с существующей карточкой.

Сохранение метаданных — удаление и восстановление точных копий больше не приводят к потере дополнительных источников или тегов.

Ремонт библиотеки — операции склейки дублей и обслуживания данных выполняются с предварительным созданием резервной копии базы.

Парсер и запасной поиск

Возобновление очередей — очередь SauceNAO сохраняется между перезапусками приложения и автоматически продолжает работу после окончания кулдауна.

Состояние кулдауна — время ожидания SauceNAO и история повторных попыток перенесены в SQLite.

Защита от повторной обработки — IQDB и уже завершённые этапы поиска не запускаются повторно для файлов, ожидающих повторной проверки через SauceNAO.

Фоновая раскладка тегов — добавлена операция возврата устаревших задач категоризации обратно в очередь без повторного основного поиска.

Понятные журналы — реальные добавления нового источника к существующей MD5-карточке фиксируются отдельным событием, а устаревшие сообщения о marker-файлах заменены на состояние SQLite.

Диагностика и безопасность

Страница диагностики — добавлен отдельный read-only раздел для проверки состояния библиотеки без автоматического изменения данных.

Аудит библиотеки — диагностика показывает количество живых файлов, содержимое корзины, точные MD5-дубли, файлы без тегов и источников, карточки с несколькими источниками, незавершённые проверки, фоновые очереди, состояние индексов SQLite, ошибки и медленные операции.

Защита оригиналов — диагностика показывает путь исходного архива, путь рабочей библиотеки и журнал заблокированных попыток изменения оригинальных файлов.

Экспорт отчёта — добавлено сохранение диагностического отчёта в JSON.

Отчёты об ошибках — добавлены журнал падений приложения и журнал медленных операций.

Обезличивание журналов — исправлена утечка API-ключей, токенов и авторизационных параметров в логах и диагностических архивах.

Очистка старых логов — из интерфейса можно обезличить уже созданные журналы с потенциально чувствительными параметрами.

Галерея и производительность

Исправление пустой галереи — устранена ошибка, при которой SQLite содержала живые файлы и корректные счётчики, но сетка карточек оставалась пустой.

Загрузка карточек — добавлены видимые placeholders на время построения миниатюр или при ошибке генерации превью.

Ошибки превью — сбои создания миниатюр теперь записываются в журнал вместо молчаливого пустого экрана.

Фоновые счётчики — тяжёлые подсчёты тегов и источников загружаются в фоне и больше не должны подвешивать интерфейс при открытии страниц.

Профилирование SQLite — через диагностику можно выполнить замер скорости основных запросов библиотеки.

Настройки превью — добавлены параметры качества миниатюр, лимита кэша, количества потоков загрузки и предзагрузки соседних страниц.

Интерфейс и настройки

Структура настроек — параметры переработаны в горизонтальные подразделы с закреплённой нижней панелью действий.

Постоянные действия — кнопки сохранения настроек, инструкции и списка изменений больше не перемещаются вместе с содержимым вкладок.

Настройка бокового меню — разделы интерфейса можно менять местами перетаскиванием мышью.

Дополнительные разделы — добавлена сворачиваемая группа для редко используемых вкладок.

Безопасный drag-and-drop — исправлена ошибка, из-за которой пункт бокового меню мог исчезнуть при переносе.

Группы тегов — порядок и цвета категорий тегов теперь настраиваются перетаскиванием.

Единый стиль элементов — чекбоксы приведены к единому визуальному оформлению без системных символов поверх пользовательского дизайна.

Предпросмотр парсера — отображение разделено на облегчённый одиночный preview и полный список состояния источников без дублирования панелей.

Исправлено

Точные дубли — устранено создание нескольких физических копий одного файла при наличии нескольких источников.

Потеря метаданных — исправлена потеря дополнительных источников и тегов при удалении или восстановлении точной копии.

Ошибочная блокировка MD5 — автоматическая уборка дубля больше не запрещает повторное добавление полезного файла.

Повторная обработка после перезапуска — завершённые этапы поиска больше не запускаются повторно без необходимости.

Счётчик общего количества — исправлен подсчёт all, который раньше суммировал совпадения источников вместо уникальных файлов.

Избранное — исправлен фильтр, из-за которого избранные файлы отображались только на своей прежней странице, а остальные страницы оставались пустыми.

Страница тегов — устранена повторная тяжёлая загрузка при каждом открытии.

Отображение галереи — исправлена пустая сетка карточек при наличии корректных данных в SQLite.

Защита исходного архива — закрыты старые пути удаления и восстановления, которые потенциально могли затронуть оригинальные файлы.

Безопасность логов — устранено попадание приватных параметров авторизации в журналы ошибок и диагностические отчёты.

Порядок разделов — устранена потеря пунктов бокового меню при переносе мышью.

Важно при обновлении

Исходный архив используется только как источник для копирования и не должен изменяться приложением.

Рабочую библиотеку и SQLite можно пересоздать из исходного архива при необходимости.

После обновления схемы базы не рекомендуется открывать ту же SQLite в старых версиях приложения.

Перед операциями ремонта и обслуживания создаётся резервная копия базы.

Local_Booru_windows v1.2

Choose a tag to compare

@Ucellar Ucellar released this 30 May 15:13

Обновлено:

Галерея — новый GalleryCardDelegate рисует рамку только вокруг реального изображения, не вокруг всей ячейки. Портретные и пейзажные картинки больше не обрезаются и не растягиваются
Галерея — миниатюры запрашиваются в 2x разрешении для чёткости на больших экранах и high-DPI
Подписки — автодополнение тегов в поле запроса (берёт теги из библиотеки)
Подписки — таблица расширена до 6 колонок, улучшенные подсказки
Манга — кнопка "Обновить", фильтр и сортировка в панели манги
Темы — добавлены r34 и r34dark цветовые схемы
Иконки — новые: add, delete, save, cookie, login, login_all (light/dark варианты)

Пофикшено:

Галерея — ячейки больше не мигают при загрузке (фон прозрачный пока грузится миниатюра)
Подписки — поле запроса использует тот же виджет с автодополнением что и галерея
Тэги — мелкие правки нормализации

Local_Booru_windows v1.1

Choose a tag to compare

@Ucellar Ucellar released this 27 May 02:12

-кратко
починил:
темы
парсер некоторых сайтов (брались не нужные посты или те которых не существовало)
некоторые баги интерфейса
-добавил:
чуток оптимизации (я блять тестить не успеваю так что может что-то сломалось)
темы (или одну тему я не помню уже)
все что вспомнил и самое критичное добавил остальное не помню

есть некоторые баги в темах и интерфейсе впринцепе стараюсь починить (некогда не используйте claude для создания тем в интерфейсе который написал он сам же будете потом отмываться от того ушата говна который он навалит)

наделе это не v1.1 а где-то 250-270 версия

Local_Booru_windows

Choose a tag to compare

@Ucellar Ucellar released this 25 May 03:57

Local_booru_windows_x64 — сборка с EXE для людей, у которых нет Python для запуска исходного кода.

Не кидайтесь помидорами. Писалось через ИИ, а именно ChatGPT и Claude Sonnet 4.6. Я отполировал всё, насколько смог, чтобы программой можно было пользоваться без критических багов.

Программа создавалась как более простой и автоматизированный аналог Hydrus Network для ленивых и не желающих разбираться в перегруженном интерфейсе.

Local Booru создавался именно для Booru-сайтов, а не как универсальная замена Hydrus.

Я в кодинге полный 0. Считайте, это моя первая программа. Делал в первую очередь для себя, но решил залить на GitHub — может, кому-нибудь тоже пригодится.

Буду стараться обновлять проект и постепенно улучшать его.