mirror of
https://gitverse.ru/kpa39l/chronicle.nixg.ru.git
synced 2026-09-29 18:05:07 +00:00
238 lines
8.2 KiB
Markdown
238 lines
8.2 KiB
Markdown
# Telegram Archiver — Список задач для продолжения работы
|
||
|
||
**Дата:** 6 марта 2026 г.
|
||
**Статус:** Phase 0 MVP завершён, 992 поста заархивировано
|
||
|
||
---
|
||
|
||
## 🔴 Высокий приоритет (критичные баги)
|
||
|
||
### 0.10 — Посты без index.md
|
||
**Проблема:** Пост 987 — в папке только mp3 файл, index.md отсутствует.
|
||
|
||
**Что сделать:**
|
||
- [ ] Проверять наличие index.md после записи
|
||
- [ ] Создавать минимальный front-matter даже если текст пуст
|
||
- [ ] Логировать ошибки записи
|
||
|
||
**Файлы:** `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.13 — Временная зона (GMT+3 Москва)
|
||
**Проблема:** `date: '2026-01-18T08:11:24+00:00'` — UTC вместо Москвы.
|
||
|
||
**Что сделать:**
|
||
- [ ] Конвертировать время: `date.astimezone(ZoneInfo('Europe/Moscow'))`
|
||
- [ ] Сохранять с offset +03:00
|
||
|
||
**Файлы:** `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.15 — Размер файла = 0 во front-matter
|
||
**Проблема:** `size: 0` вместо реального размера.
|
||
|
||
**Что сделать:**
|
||
- [ ] Брать размер из атрибутов Telegram: `doc.size`
|
||
- [ ] Либо проверять после записи: `Path(filepath).stat().st_size`
|
||
|
||
**Файлы:** `app/telethon_client.py`, `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.21 — Resume прерванной архивации
|
||
**Проблема:** 2 часа на 1000 постов — при обрыве начинать заново.
|
||
|
||
**Что сделать:**
|
||
- [ ] Сохранять `last_message_id` в файл состояния
|
||
- [ ] Добавить флаг `--resume` для продолжения
|
||
- [ ] При старте проверять последний ID
|
||
|
||
**Файлы:** `app/main.py`, `app/archiver.py`
|
||
|
||
---
|
||
|
||
## 🟡 Средний приоритет (улучшения)
|
||
|
||
### 0.9 — Прямые ссылки на посты
|
||
**Проблема:** Нет ссылок на оригинальные посты для репостов.
|
||
|
||
**Что сделать:**
|
||
- [ ] Для репостов: `original_post_url: https://t.me/channel/123`
|
||
- [ ] Для канала: `channel_url: https://t.me/dedinit`
|
||
- [ ] Для поста: `post_url: https://t.me/dedinit/1234`
|
||
|
||
**Файлы:** `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.12 — Отчёт о неуспешно скачанных файлах
|
||
**Проблема:** Файлы по таймауту пропускаются без информации для дозагрузки.
|
||
|
||
**Что сделать:**
|
||
- [ ] Создавать `to_download_later.md` со списком URL
|
||
- [ ] Сохранять `message_id` и `media_id`
|
||
- [ ] Добавить команду `--resume-downloads`
|
||
|
||
**Файлы:** `app/archiver.py`, `app/main.py`
|
||
|
||
---
|
||
|
||
### 0.14 — Прямые ссылки на файлы
|
||
**Проблема:** При таймауте нет ссылки для дозагрузки.
|
||
|
||
**Что сделать:**
|
||
- [ ] Сохранять `download_url` во front-matter (временная ссылка)
|
||
- [ ] Для дозагрузки переподключаться к Telegram
|
||
- [ ] Запрашивать файл по ID через API
|
||
|
||
**Файлы:** `app/telethon_client.py`
|
||
|
||
---
|
||
|
||
### 0.16 — Расширенный front-matter
|
||
**Проблема:** Нет ссылок на канал, автора, оригинальный пост.
|
||
|
||
**Что сделать:**
|
||
```yaml
|
||
author: Дед in АйТи
|
||
author_username: "@dedinit"
|
||
channel_title: "Дед in АйТи"
|
||
channel_username: "@dedinit"
|
||
channel_url: "https://t.me/dedinit"
|
||
post_url: "https://t.me/dedinit/1234"
|
||
original_post_url: "https://t.me/otherchannel/987"
|
||
```
|
||
|
||
**Файлы:** `app/models.py`, `app/archiver.py`
|
||
|
||
---
|
||
|
||
## 🟢 Низкий приоритет (оптимизации)
|
||
|
||
### 0.11 — Видео-кружки и .bin файлы
|
||
**Проблема:** Пост 988 — видео-кружок сохранился как `.bin`.
|
||
|
||
**Что сделать:**
|
||
- [ ] Определять тип по MIME: `video/mp4` → `.mp4`
|
||
- [ ] Переименовывать после скачивания
|
||
- [ ] Опционально: конвертировать через ffmpeg
|
||
|
||
**Файлы:** `app/telethon_client.py`
|
||
|
||
---
|
||
|
||
### 0.17 — Многопоточное скачивание медиа
|
||
**Идея:** Скачивать медиафайлы параллельно (3-5 потоков).
|
||
|
||
**Что сделать:**
|
||
- [ ] Создать очередь на скачивание
|
||
- [ ] Запускать 3-5 корутин через `asyncio.gather()`
|
||
- [ ] Соблюдать rate limits (паузы)
|
||
|
||
**Ожидаемое ускорение:** в 2-3 раза
|
||
|
||
**Файлы:** `app/telethon_client.py`, `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.18 — Валидация скачанных файлов
|
||
**Проблема:** Нет проверки целостности файлов.
|
||
|
||
**Что сделать:**
|
||
- [ ] Проверять размер после скачивания
|
||
- [ ] Проверять magic bytes
|
||
- [ ] Логировать битые файлы в `corrupted.md`
|
||
|
||
**Файлы:** `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.19 — Очередь на скачивание + многопоточность
|
||
**Идея:** Разделить на 2 прохода: сбор URL → загрузка.
|
||
|
||
**Что сделать:**
|
||
- [ ] Первый проход: собрать все `download_url`
|
||
- [ ] Сохранить в `queue.json`
|
||
- [ ] Второй проход: загружать параллельно
|
||
|
||
**Файлы:** `app/archiver.py`, `app/main.py`
|
||
|
||
---
|
||
|
||
## 🔵 Долгий приоритет (фичи для Hugo)
|
||
|
||
### 0.20 — Аудио-файлы для Hugo
|
||
**Проблема:** Голосовые сообщения без метаданных.
|
||
|
||
**Что сделать:**
|
||
- [ ] Извлекать длительность: `doc.attributes.duration`
|
||
- [ ] Сохранять во front-matter: `duration: 45`
|
||
- [ ] Для Hugo: shortcode с wavesurfer.js
|
||
|
||
**Файлы:** `app/telethon_client.py`, `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.22 — Формат тегов для Hugo
|
||
**Проблема:** Сейчас список YAML, Hugo предпочитает inline.
|
||
|
||
**Что сделать:**
|
||
- [ ] Изменить формат: `tags: ["tag1", "tag2"]`
|
||
- [ ] Протестировать в Hugo
|
||
|
||
**Файлы:** `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.23 — Обработка трансляций
|
||
**Проблема:** Посты 122, 120 — трансляции без текста.
|
||
|
||
**Что сделать:**
|
||
- [ ] Изучить `message.media` для трансляций
|
||
- [ ] Сохранять метаданные во front-matter
|
||
- [ ] Создавать index.md с информацией
|
||
|
||
**Файлы:** `app/archiver.py`
|
||
|
||
---
|
||
|
||
### 0.24 — Голосовые сообщения
|
||
**Проблема:** Голосовухи как `.bin` или `.ogg`.
|
||
|
||
**Что сделать:**
|
||
- [ ] Определять по MIME: `audio/ogg` → `.ogg`
|
||
- [ ] Извлекать длительность
|
||
- [ ] Сохранять: `duration: 45, size: 127359`
|
||
|
||
**Файлы:** `app/telethon_client.py`
|
||
|
||
---
|
||
|
||
## 📋 План на следующую сессию
|
||
|
||
### Рекомендуется начать с:
|
||
1. **0.21** — Resume (критично для длинных каналов)
|
||
2. **0.13** — Временная зона (важно для корректности)
|
||
3. **0.15** — Размер файлов (простое исправление)
|
||
4. **0.10** — Посты без index.md (критичный баг)
|
||
|
||
### Затем:
|
||
5. **0.9, 0.16** — Ссылки на посты (важно для навигации)
|
||
6. **0.12, 0.14** — Отчёт о таймаутах (удобство)
|
||
7. **0.17, 0.19** — Многопоточность (производительность)
|
||
|
||
---
|
||
|
||
## 🎯 Глобальные цели
|
||
|
||
- [ ] Завершить Phase 0 (исправить все баги)
|
||
- [ ] Перейти к Phase 1 (лендинг + GitHub)
|
||
- [ ] Подготовить к продакшену
|
||
|
||
---
|
||
|
||
*Документ создан: 6 марта 2026 г.*
|
||
*Следующее обновление: после исправления задач 0.10, 0.13, 0.15, 0.21*
|