mirror of
https://gitverse.ru/kpa39l/chronicle.nixg.ru.git
synced 2026-09-29 18:05:07 +00:00
255 lines
8.1 KiB
Markdown
255 lines
8.1 KiB
Markdown
# 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*
|