diff --git a/telegram-archiver/TODO_NEXT.md b/telegram-archiver/TODO_NEXT.md new file mode 100644 index 0000000..e251854 --- /dev/null +++ b/telegram-archiver/TODO_NEXT.md @@ -0,0 +1,237 @@ +# 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*