Skip to content

Latest commit

 

History

History
238 lines (144 loc) · 28.8 KB

CHANGELOG.md

File metadata and controls

238 lines (144 loc) · 28.8 KB

Changelog

Все значимые изменения в проекте документируются в этом файле.

Формат основан на Keep a Changelog.

[Unreleased]

Fixed

  • Docker: пустой сайт Hugo — run-docker.sh больше не создаёт симлинк site/content, а готовит обычный каталог-точку монтирования. Hugo не заходит в content, если это симлинк за пределы корня проекта, и молча собирал сайт без статей. Ранее поломка была незаметна, так как устаревший site/public не удалялся между сборками.
  • Docker: пропуск дедупликации assets — цикл копирования CSS в compose-командах больше не завершает контейнер с ненулевым кодом, когда каталог одной из платформ отсутствует. Из-за этого run-docker.sh прерывался до шага дедупликации.
  • Локальная сборка: пустой сайт Hugo — backup.py добавляет в hugo.toml секцию [[module.mounts]] с путём до каталога бэкапа. Ранее локальная сборка и hugo server опирались только на симлинк site/content, который Hugo игнорирует. Симлинк сохраняется для совместимости и используется site/build.sh при дедупликации assets.

[0.3.14] - 2026-05-12

Fixed

  • Hugo: конфигурация языка — генерация hugo.toml теперь явно задаёт defaultContentLanguage и [languages.ru].locale, устраняя deprecated-предупреждение .Language.LanguageCode в новых версиях Hugo.

Changed

  • Скачивание assets: устойчивость к сбоям CDN — скачивание assets теперь повторяет весь цикл GET + streaming + запись файла до 10 раз, удаляет partial-файлы после сбоя и использует задержки 3, 5, 7, 10, 15, 15, 15, 15, 15 секунд между попытками.

[0.3.13] - 2026-05-07

Added

  • Boosty: вложенные файлы — добавлена обработка блоков file: файлы скачиваются как assets и выводятся в Markdown как ссылки на локальные файлы.

Fixed

  • Boosty: подписанные медиа — для audio_file и file URL теперь используются параметры signedQuery из API-ответа поста. Это устраняет некорректные запросы к CDN без подписи, которые могли приводить к 403 Access denied.

Changed

  • Документация для LLM/агента — уточнены правила работы с пользователем, git-коммитами, release notes и generated artifacts.

[0.3.12] - 2026-05-07

Added

  • Синхронизация: политика обработки ошибок — добавлена настройка sync.on_error (stop по умолчанию, continue для пропуска проблемных источников). Перед скачиванием выполняется preflight-проверка авторизации всех источников, чтобы при stop не создавать частичный архив.

Fixed

  • Sponsr: двойные пробелы в Markdown — устранены лишние пробелы вокруг inline-разметки, возникавшие при замене внутренних spacer-маркеров после конвертации HTML.
  • Hugo: deprecated-предупреждения — генерация hugo.toml теперь использует locale вместо устаревшего languageCode, а RSS-шаблон читает .Language.Locale вместо .Language.LanguageCode.

[0.3.11] - 2026-03-07

Added

  • Boosty: превью-картинка для видео — для блоков ok_video превью-картинка (preview/previewUrl) теперь скачивается всегда, независимо от настройки asset_types. В Markdown вставляется кликабельная картинка-превью [![...](assets/preview.jpg)](video_link) вместо текстовой ссылки. Если превью недоступно — fallback на текстовую ссылку как раньше.
  • Hugo: кликабельное имя автора — имя автора в метаданных статьи теперь является ссылкой на список постов автора.

Changed

  • Скачивание assets: поддержка force-флага — assets с force=True скачиваются в обход фильтра asset_types (используется для превью видео).

[0.3.10] - 2026-02-17

Changed

  • Boosty: ok_video в Markdown — для блоков ok_video ссылка теперь строится из реальных playerUrls с приоритетом качества (full_hd → ... → lowest, затем hls/dash), а не из videoembed/{id}.

Fixed

  • Boosty: недоступные ссылки OK.ru — исправлен кейс, когда id в ok_video был UUID и ссылка https://ok.ru/videoembed/{id} вела на 404.
  • Boosty: скачивание встроенного видео — ok_video теперь добавляется в список ассетов как видеофайл (лучший playerUrl), поэтому при успешной загрузке Markdown ссылается на локальный файл assets/<video>.mp4.
  • Boosty: fallback для ok_video — при отсутствии playerUrls используется https://ok.ru/video/{vid}, и только потом legacy https://ok.ru/videoembed/{id}.

[0.3.9] - 2026-02-16

Fixed

  • Sponsr: тире в прямой речи — исправлена регрессия конвертации, из-за которой строка вида - <em>текст</em> в абзаце могла превращаться в markdown-список. Теперь standalone тире в начале абзаца корректно сохраняется как обычный текст (\- ...) и Hugo не рендерит буллет.

Changed

  • Документация релизов — зафиксировано соглашение: сообщения git-коммитов, аннотации git-тегов и release notes ведутся на русском языке (обновлены CONTEXT.md и README.md).

[0.3.8] - 2026-02-16

Fixed

  • Sponsr: консистентность single/full sync — при синхронизации новых постов теперь используется загрузка полного поста по ID (как в режиме скачивания одного поста), а не урезанный HTML из списка /more-posts. Это устраняет расхождение в Markdown-разметке между ./run-docker.sh <url> и полной синхронизацией ./run-docker.sh.

[0.3.7] - 2026-02-16

Added

  • Docker: публикация образов в GHCR — настроен GitHub Actions workflow для автоматической сборки и публикации Docker-образов в GitHub Container Registry при создании релиза. Теперь пользователи могут использовать готовый образ ghcr.io/strannick-ru/article-backup:latest вместо локальной сборки.
  • Docker: разделение конфигурации — docker-compose.yml теперь по умолчанию использует готовый образ для удобства пользователей. Для разработчиков и сборки из исходников добавлен отдельный файл docker-compose-dev.yml.

Fixed

  • Sponsr: экранирование спецсимволов — символы _, *, [ и ] в обычном тексте теперь корректно экранируются и не превращаются в ошибочную разметку (курсив, жирный, ссылки). Это исправляет проблему с "поплывшей" вёрсткой в статьях, содержащих много нижних подчеркиваний или математических знаков.
  • Sponsr: пробелы вокруг жирного текста — исправлено "склеивание" жирного текста с окружающими словами (например, слово**жирное** → слово **жирное**). Использован надежный метод вставки маркеров в DOM, так как html2text игнорировал обычные пробелы.
  • Sponsr: пунктуация после ссылок — устранены лишние пробелы между ссылкой и знаками препинания (точка, запятая), даже если они были выделены курсивом.
  • Python 3.12: SyntaxWarning — исправлены предупреждения invalid escape sequence в регулярных выражениях.

[0.3.5] - 2026-02-13

Fixed

  • Безопасность данных: коллизии имен — предотвращена перезапись постов с одинаковой датой и заголовком. Для новых записей к имени папки (slug) добавляется короткий хеш ID. Для существующих постов сохраняется обратная совместимость (пути не меняются).
  • CLI: обработка ошибок — скрипт теперь возвращает код возврата 1 (ошибка), если синхронизация хотя бы одного источника не удалась. В конце выводится сводка по ошибкам. Ранее скрипт мог завершаться успешно, скрывая сбои.
  • Сетевая стабильность — добавлены retry (повторные попытки) для всех API-запросов (списки постов, получение метаданных) в Sponsr и Boosty. Ранее retry использовался только для скачивания медиафайлов. Тайм-аут чтения увеличен до 60 секунд.
  • Ресурсы — исправлена потенциальная утечка соединений при скачивании файлов (гарантированное закрытие response).
  • Конфигурация — исправлено падение с AttributeError при пустом файле config.yaml. Добавлено безопасное экранирование спецсимволов при генерации hugo.toml (исправляет ошибки с кавычками в названии сайта).
  • Sponsr: форматирование в ссылках — устранены артефакты вида [ _текст_ ], возникавшие при конвертации ссылок, начинающихся или заканчивающихся курсивом. Теперь пробелы внутри скобок ссылок удаляются корректно.

Changed

  • Boosty — добавлено логирование предупреждений при обнаружении неизвестных типов блоков контента, чтобы избежать "молчаливой" потери данных.

[0.3.4] - 2026-02-13

Changed

  • Видео: встроенные плееры вместо текстовых ссылок — встроенные видео (iframe/embed в Sponsr, ok_video в Boosty) теперь сохраняются в Markdown как обычные ссылки [📹 Видео](embed_url) вместо текста 📹 Видео: url. Hugo render hook (render-link.html) автоматически распознаёт embed URL известных видеохостингов (Rutube, YouTube, Vimeo, OK.ru, VK) и отображает полноценный адаптивный плеер (<iframe> в .video-container). Markdown-файлы остаются чистыми — без HTML-вставок.
  • Boosty: фильтрация пустых ссылок — исправлено появление артефактов вида <url> в Markdown. Это происходило, когда редактор Boosty оставлял блоки ссылок с пустым текстом. Теперь такие блоки игнорируются при конвертации.

Fixed

  • Sponsr: фрагментация курсива — исправлена проблема, когда сплошной курсивный текст с вложенным жирным (например, <em>текст <b>жирный</b> текст</em>) разбивался на отдельные фрагменты (_текст_ **жирный** _текст_) при конвертации. Теперь соседние теги <em> объединяются в один блок перед конвертацией, что даёт корректный результат: _текст **жирный** текст_.
  • Hugo: форматирование в ссылках — исправлен рендеринг ссылок, содержащих Markdown-форматирование (жирный, курсив). Ранее Hugo экранировал HTML-теги внутри ссылок (&lt;em&gt;...), теперь они выводятся корректно благодаря safeHTML в render hook.

[0.3.3] - 2026-02-13

Fixed

  • Sponsr: пробелы и курсив — исправлена проблема, когда пробелы внутри тегов форматирования (например, <em>текст </em>) приводили к невалидному Markdown (_текст _). Теперь пробелы выносятся наружу тегов перед конвертацией.
  • Sponsr: вложенное форматирование — устранены артефакты **** (четыре звёздочки), возникавшие при конвертации конструкций вида <b><em>text</em></b> внутри ссылок. Добавлено слияние вложенных одинаковых тегов (<em><em> → <em>) и улучшен regex-постпроцессинг.
  • Sponsr: пробелы в ссылках — исправлено появление пробелов внутри Markdown-ссылок ([текст ](url)), которые возникали из-за пробелов в конце тега <a>.

[0.3.2] - 2026-02-12

Fixed

  • Sponsr: потеря пробелов при конвертации — исправлена проблема, когда пробел между ссылкой и следующим текстом терялся, если в HTML он находился внутри пустого тега форматирования (<em> </em>). Такие теги теперь заменяются на своё текстовое содержимое вместо полного удаления.
  • Boosty: конвертация параграфов и стилей — исправлена проблема, когда inline-блоки (текст + ссылка + текст) внутри одного параграфа разбивались на отдельные строки вместо склейки. Исправлено применение стилей (italic/bold) в блоках со ссылками, где API использует глобальные позиции. Пробелы на границах стилизованных фрагментов теперь выносятся наружу маркеров.
  • Markdown: дублирование заголовка — заголовок статьи больше не добавляется в body Markdown при конвертации. Hugo берёт заголовок из frontmatter, поэтому исчезает повторяющийся H1 на странице поста.
  • Hugo RSS: метаданные и язык — RSS на уровне /{platform}/{author}/posts/index.xml теперь использует description из параметров секции (берётся из display_name в конфиге), а язык берётся из languageCode (по умолчанию ru), вместо en.

[0.3.0] - 2026-02-05

Added

  • Инкрементальная синхронизация — после первой полной синхронизации автора скрипт загружает только начало индекса (чанками по 20 постов) до тех пор, пока не встретит посты, которые уже есть в локальной базе. Это значительно сокращает время повторных запусков для авторов с большим количеством статей (с 2156 запросов до ~40-60). Добавлена таблица sync_state в БД для отслеживания статуса синхронизации. Обратная совместимость: старые базы автоматически обновляются при первом запуске. Производительность: автор с 2000+ постами — первый запуск ~30 мин, повторные ~30 сек (⚡ 98% быстрее).

[0.2.3] - 2026-02-04

Fixed

  • Sponsr: форматирование в ссылках — исправлена проблема, когда bold+italic форматирование внутри ссылок конвертировалось с лишними звёздочками снаружи (******[***текст***](url) вместо [***текст***](url)). Теперь используется предобработка HTML перед конвертацией html2text: удаляются пустые теги форматирования, а вложенные <b><em> корректно схлопываются в ***текст*** внутри ссылок.
  • Sponsr: парсинг тегов — исправлена ошибка Hugo "unable to cast map[string]interface{} to string" при обработке тегов. API Sponsr вернул теги как массив объектов (с полями tag_name, id, project_id), а не как массив строк. Теперь корректно извлекаются только имена тегов из объектов, поддерживается обратная совместимость с форматом строк.

[0.2.2] - 2026-02-04

Fixed

  • Sponsr: пробелы вокруг bold — восстановлены пробелы, которые пропадали рядом с **...** при конвертации.

[0.2.1] - 2026-02-04

Fixed

  • Конвертация Sponsr Markdown — исправлена проблема, из-за которой конвертер html2text добавлял лишние пробелы вокруг Unicode-кавычек (например, « *текст* » вместо «*текст*»).
  • Sponsr: вложенные em/strong — нормализовано преобразование вложенного курсива/жирного, устранены лишние пробелы и bidi-маркеры, из-за которых ломалась разметка и заголовки.
  • Assets: коллизии имён — исправлена дедупликация имён файлов при параллельной загрузке: ссылки в Markdown больше не указывают на несуществующие файлы.
  • Внутренние ссылки — исправление ссылок между статьями теперь ограничено одной платформой и одним автором (не затрагивает внешние/чужие ссылки).
  • Hugo: ссылки в списках — восстановлена генерация ссылок через path.Base .RelPermalink для корректной работы при раздаче автора через субдомен.
  • Тесты — добавлены unit-тесты на дедупликацию ассетов.

[0.2.0] - 2026-02-03

Added

  • Скрипт run-docker.sh — удобная обертка для запуска Docker. Автоматически считывает output_dir из config.yaml и монтирует правильный volume, решая проблему потери данных при смене пути бэкапа.
  • Улучшенный дизайн и типографика — полный редизайн шаблонов Hugo:
    • Добавлены новые темы: Light, Sepia, Dark, Gruvbox, Everforest.
    • Переключатель тем прямо в интерфейсе (выбор сохраняется в браузере).
    • Улучшенная типографика: шрифт PT Serif для текста и PT Serif Caption для заголовков.
    • Дизайн "лист на столе" с комфортными отступами и тенью.
    • Поддержка настройки default_theme в конфиге (по умолчанию "light").
  • Фильтрация типов ассетов — в config.yaml теперь можно указать asset_types для каждого источника. Пример: asset_types: ["image", "document"]. Поддерживаемые типы: image, video, audio, document (только PDF). Если параметр не указан, скачиваются все поддерживаемые типы.
  • Docker: поддержка BACKUP_OUTPUT_DIR — добавлена переменная окружения для принудительного указания пути сохранения внутри контейнера. Это решает проблему потери данных, если пользователь изменит output_dir в config.yaml, но забудет обновить volume mapping в Docker.

Fixed

  • Генерация _index.md — исправлена проблема, когда при скачивании одного поста (single mode) не создавался индексный файл раздела, из-за чего Hugo отображал "Boosties" вместо "Boosty". Теперь индекс создается всегда.
  • Ссылки в списках — исправлены "битые" ссылки (404) в списках постов. Заменен механизм генерации путей с path.Base на стандартный RelPermalink.
  • Симлинки в Docker — исправлено создание некорректных симлинков внутри контейнера. Теперь скрипт run-docker.sh автоматически обновляет симлинк site/content на хосте, указывая на правильную директорию с данными.
  • Загрузка картинок с Boosty — исправлена ошибка, когда картинки без расширения в URL (формат /image/uuid) не скачивались при включенной фильтрации asset_types. Теперь предварительная проверка пропускает такие файлы для анализа заголовков Content-Type.
  • Sponsr Parser — исправлена ошибка получения post_id (API платформы изменилось).
  • Boosty Parser — исправлено получение превью для видео с OK.ru (изменилось имя поля в API).

Changed

  • Рефакторинг шаблонов Hugo — внедрен базовый шаблон baseof.html для унификации структуры страниц.

[0.1.0] - 2026-02-02

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

Added

  • Публикация на PyPI — пакет можно установить через pip install article-backup. Команда для запуска: article-backup.

  • Hugo: конфигурация из config.yaml — hugo.toml теперь генерируется автоматически при запуске backup.py из секции hugo: в конфиге. Поддерживаемые параметры: base_url, title, language_code. Это позволяет управлять настройками Hugo из единого файла конфигурации.

  • Hugo: поддержка субдоменов для авторов — добавлен скрипт site/build.sh для сборки сайта с автономными папками авторов. Каждый автор получает свою копию CSS, что позволяет раздавать их через отдельные субдомены nginx (pushkin.example.site, lermontov.example.site). Включены относительные URL (relativeURLs = true).

  • Hugo: RSS-ленты для каждого автора — теперь для каждого автора генерируется отдельный RSS-фид (/sponsr/pushkin/index.xml). На странице списка постов автора отображается ссылка 📡 на RSS.

  • Sponsr: сохранение ссылок на встроенные видео — при скачивании статей встроенные видео (iframe/embed) преобразуются в markdown-ссылки вида 📹 Видео: URL. Поддерживаемые платформы:

    • Rutube
    • YouTube
    • Vimeo
    • OK.ru (Одноклассники)
    • VK Video
  • Docker Compose — добавлена конфигурация для запуска на серверах с устаревшим Python. Включает:

    • backup — сервис с Python 3.12 для скрипта бэкапа
    • hugo — сервис с официальным образом Hugo для сборки сайта
    • Подходит для автоматизации через cron: docker compose run --rm backup && docker compose run --rm hugo

Changed

  • Docker: Hugo автоматически копирует CSS — сервис hugo после сборки автоматически копирует CSS в папки авторов (public/sponsr/*/css/, public/boosty/*/css/). Это позволяет раздавать авторов через субдомены без ручного запуска build.sh.

Fixed

  • SQLite: "database is locked" — исправлена ошибка при синхронизации нескольких источников подряд. Добавлен timeout 30 секунд и включён режим WAL (Write-Ahead Logging) для лучшей конкурентной работы с базой данных.

  • Hugo: 404 на ссылках при субдоменной раздаче — исправлены относительные пути в шаблоне list.html. Ранее ссылки генерировались как ../../../sponsr/author/posts/slug/, что приводило к 404 при раздаче автора через субдомен. Теперь используются прямые пути: slug/ для постов и index.xml для RSS.