mirror of
https://gitverse.ru/kpa39l/chronicle.nixg.ru.git
synced 2026-09-29 09:55:08 +00:00
Phase 0 MVP: Telegram Archiver fully functional (992 posts tested)
This commit is contained in:
@@ -0,0 +1,254 @@
|
||||
# Telegram Archiver — Ответы на вопросы
|
||||
|
||||
## 📊 Итоги полного тестирования (март 2026)
|
||||
|
||||
**Канал:** dedinit
|
||||
**Постов заархивировано:** 992
|
||||
**Время выполнения:** 7335 секунд (≈ 2 часа 2 минуты)
|
||||
**Медиафайлов скачано:** 454
|
||||
**Таймаутов:** ~50 файлов (пропущены, процесс не застрял)
|
||||
|
||||
---
|
||||
|
||||
## ❓ Вопросы и ответы
|
||||
|
||||
### 1. Размер файлов: когда считается?
|
||||
|
||||
**Ответ:** Размер должен браться **из Telegram ДО скачивания** через атрибут `doc.size`.
|
||||
|
||||
**Проблема:** В текущей версии `size: 0` во front-matter — это баг.
|
||||
|
||||
**Решение (задача 0.15):**
|
||||
```python
|
||||
# Брать из атрибутов Telegram
|
||||
size = doc.size
|
||||
|
||||
# ИЛИ проверять после записи
|
||||
size = Path(filepath).stat().st_size
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Можно ли получить прямые ссылки на файлы для дозагрузки?
|
||||
|
||||
**Ответ:** **Да, но с ограничениями.**
|
||||
|
||||
Telethon может получить прямую ссылку через `message.media.document.id`, но:
|
||||
- Ссылка **временная** (действует несколько часов)
|
||||
- Требует активной сессии Telegram
|
||||
- Нельзя просто сохранить URL и скачать позже
|
||||
|
||||
**Решение (задача 0.14, 0.19):**
|
||||
1. Сохранять `message_id` и `media_id` во front-matter
|
||||
2. Для дозагрузки:
|
||||
- Переподключаться к Telegram
|
||||
- Запрашивать файл по ID через API
|
||||
- Скачивать заново
|
||||
|
||||
**Пример front-matter:**
|
||||
```yaml
|
||||
media_files:
|
||||
- filename: photo.jpg
|
||||
type: photo
|
||||
message_id: 12345
|
||||
media_id: "AgADAgAD..."
|
||||
download_url: "https://t.me/dedinit/12345/file" # временная!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Hugo и формат тегов
|
||||
|
||||
**Вопрос:** Поймёт ли Hugo такой формат?
|
||||
```yaml
|
||||
tags:
|
||||
- 1с
|
||||
- debian
|
||||
- postgres
|
||||
```
|
||||
|
||||
**Ответ:** **Да, Hugo понимает оба формата:**
|
||||
|
||||
```yaml
|
||||
# YAML list (сейчас)
|
||||
tags:
|
||||
- linux
|
||||
- debian
|
||||
|
||||
# Inline JSON-style (компактнее)
|
||||
tags: ["linux", "debian", "postgres"]
|
||||
```
|
||||
|
||||
**Рекомендация:** Оба работают одинаково. Задача **0.22** — опционально изменить на inline для компактности.
|
||||
|
||||
---
|
||||
|
||||
### 4. Многопоточное скачивание (задача 0.17)
|
||||
|
||||
**Вопрос:** Можно ли скачивать в несколько потоков?
|
||||
|
||||
**Ответ:** **Да, это возможно и ускорит процесс в 2-3 раза.**
|
||||
|
||||
**Техническая реализация:**
|
||||
```python
|
||||
import asyncio
|
||||
|
||||
# Параллельная загрузка 3 файлов
|
||||
await asyncio.gather(
|
||||
download_file_1(),
|
||||
download_file_2(),
|
||||
download_file_3(),
|
||||
)
|
||||
```
|
||||
|
||||
**Ограничения:**
|
||||
- Telegram блокирует при >5 одновременных загрузок
|
||||
- Рекомендовано: **3 параллельных потока**
|
||||
- Нужно соблюдать rate limits (паузы между запросами)
|
||||
|
||||
**План (задача 0.19):**
|
||||
1. Первый проход: собрать все URL файлов в очередь
|
||||
2. Второй проход: загружать параллельно (3 потока)
|
||||
3. Resume: продолжать с места обрыва
|
||||
|
||||
**Ожидаемое ускорение:**
|
||||
- Сейчас: ~1000 постов за 2 часа (500 постов/час)
|
||||
- С многопоточностью: ~1000-1500 постов/час
|
||||
|
||||
---
|
||||
|
||||
### 5. Resume прерванной архивации (задача 0.21)
|
||||
|
||||
**Вопрос:** Есть ли средство возобновить прерванный процесс?
|
||||
|
||||
**Ответ:** **Частично работает уже сейчас.**
|
||||
|
||||
**Текущее состояние:**
|
||||
- ✅ Дедупликация по ID существует
|
||||
- ✅ Повторный запуск пропускает скачанные посты
|
||||
- ❌ Нет сохранения последнего обработанного ID
|
||||
- ❌ Нет команды `--resume`
|
||||
|
||||
**План (задача 0.21):**
|
||||
1. Сохранять `last_message_id` в лог или файл состояния
|
||||
2. Добавить флаг `--resume` для продолжения
|
||||
3. При старте проверять последний ID и начинать с него
|
||||
|
||||
**Пример:**
|
||||
```bash
|
||||
# Первый запуск
|
||||
python run_archiver.py -c dedinit
|
||||
# Прерван на посте 624
|
||||
|
||||
# Возобновление
|
||||
python run_archiver.py -c dedinit --resume
|
||||
# Продолжит с поста 624
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. Голосовые сообщения и аудио (задача 0.20, 0.24)
|
||||
|
||||
**Вопрос:** Как обрабатывать голосовые сообщения?
|
||||
|
||||
**Текущее состояние:**
|
||||
- Голосовухи скачиваются как `.bin` или `.ogg`
|
||||
- Нет метаданных (длительность, формат)
|
||||
- Нет красивого отображения в Hugo
|
||||
|
||||
**План:**
|
||||
1. Определять формат по MIME:
|
||||
- `audio/ogg` → `.ogg`
|
||||
- `audio/mp3` → `.mp3`
|
||||
2. Извлекать длительность: `doc.attributes.duration`
|
||||
3. Сохранять во front-matter:
|
||||
```yaml
|
||||
media_files:
|
||||
- filename: voice.ogg
|
||||
type: audio
|
||||
duration: 45 # секунд
|
||||
size: 127359
|
||||
```
|
||||
4. Для Hugo: использовать shortcode с wavesurfer.js
|
||||
```markdown
|
||||
{{< audio-player src="voice.ogg" waveform="true" >}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7. Видео-кружки (задача 0.11)
|
||||
|
||||
**Вопрос:** Как обрабатывать video_note (кружочки)?
|
||||
|
||||
**Проблема:** Сохраняются как `.bin` без расширения.
|
||||
|
||||
**Решение:**
|
||||
1. Определять по MIME: `video/mp4` → `.mp4`
|
||||
2. Переименовывать после скачивания
|
||||
3. Опционально: конвертировать в нормальное видео (убрать круг)
|
||||
|
||||
---
|
||||
|
||||
### 8. Временная зона (задача 0.13)
|
||||
|
||||
**Проблема:** `date: '2026-01-18T08:11:24+00:00'` — UTC вместо Москвы.
|
||||
|
||||
**Пост был в 11:11 по Москве, указано 08:11 UTC.**
|
||||
|
||||
**Решение:**
|
||||
```python
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
# Конвертировать в московское время
|
||||
moscow_tz = ZoneInfo('Europe/Moscow')
|
||||
date_moscow = date.astimezone(moscow_tz)
|
||||
|
||||
# Результат: 2026-01-18T11:11:24+03:00
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. Прямые ссылки на посты (задача 0.9, 0.16)
|
||||
|
||||
**Вопрос:** Где ссылки на оригинальные посты?
|
||||
|
||||
**Текущее состояние:**
|
||||
- Сохраняется `repost_from` (ID) и `repost_channel` (название)
|
||||
- Нет прямой ссылки `https://t.me/...`
|
||||
|
||||
**План:**
|
||||
```yaml
|
||||
# Для всех постов
|
||||
channel_url: "https://t.me/dedinit"
|
||||
post_url: "https://t.me/dedinit/1234"
|
||||
|
||||
# Для репостов
|
||||
original_post_url: "https://t.me/otherchannel/987"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 Метрики производительности
|
||||
|
||||
| Параметр | Значение |
|
||||
|----------|----------|
|
||||
| Скорость архивации | ~500 постов/час |
|
||||
| Время на 1 пост | ~7.4 секунды |
|
||||
| Время на 1 медиафайл | ~15-30 секунд (с таймаутами) |
|
||||
| Процент таймаутов | ~5% (50 из 992) |
|
||||
| Успешных загрузок | 95% |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Следующие шаги
|
||||
|
||||
1. **Исправить критичные баги** (0.10, 0.15)
|
||||
2. **Добавить resume** (0.21)
|
||||
3. **Добавить отчёт о таймаутах** (0.12)
|
||||
4. **Исправить временную зону** (0.13)
|
||||
5. **Многопоточность** (0.17, 0.19)
|
||||
|
||||
---
|
||||
|
||||
*Документ создан: 6 марта 2026 г.*
|
||||
*Версия: 1.0*
|
||||
Reference in New Issue
Block a user