Files
telegram-tui/ROADMAP.md
Mikhail Kilin b0f1f9fdc2 feat: implement Phase 11 — inline photo viewing with ratatui-image
Add feature-gated (`images`) inline photo support:
- New types: MediaInfo, PhotoInfo, PhotoDownloadState, ImagesConfig
- Media module: ImageCache (LRU filesystem cache), ImageRenderer (terminal protocol detection)
- Photo metadata extraction from TDLib MessagePhoto with download_file() API
- ViewImage command (v/м) to toggle photo expand/collapse in message selection
- Two-pass UI rendering: placeholder lines in message bubbles + StatefulImage overlay
- Collapse all expanded photos on Esc (exit selection mode)

Dependencies: ratatui-image 8.1, image 0.25 (optional, behind `images` feature flag)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 21:25:17 +03:00

130 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Roadmap
## Завершённые фазы
| Фаза | Описание | Ключевые результаты |
|------|----------|---------------------|
| 1 | Базовая инфраструктура | ratatui + crossterm, vim-навигация, русская раскладка |
| 2 | TDLib интеграция | tdlib-rs, авторизация, загрузка чатов и сообщений |
| 3 | Улучшение UX | Отправка, поиск, скролл, realtime обновления |
| 4 | Папки и фильтрация | Загрузка папок из Telegram, переключение 1-9 |
| 5 | Расширенный функционал | Онлайн-статус, галочки прочтения, медиа-заглушки, muted |
| 6 | Полировка | 60 FPS, оптимизация памяти, graceful shutdown, динамический инпут |
| 7 | Рефакторинг памяти | Единый источник данных, LRU-кэш (500 users), lazy loading |
| 8 | Дополнительные фичи | Markdown, edit/delete, reply/forward, блочный курсор |
| 9 | Расширенные возможности | Typing, pinned, поиск в чате, черновики, профиль, копирование, реакции, конфиг |
| 10 | Desktop уведомления (83%) | notify-rust, muted фильтр, mentions, медиа. TODO: кастомные звуки |
| 13 | Глубокий рефакторинг | 5 файлов (4582→модули), 5 traits, shared components, docs |
---
## Фаза 11: Inline просмотр фото в чате [IN PROGRESS]
**UX**: `v`/`м` на фото → загрузка → inline превью (~30x15) → Esc/навигация → свернуть обратно в текст.
Повторное `v` — мгновенно из кэша. Целевой терминал: iTerm2.
### Этап 1: Инфраструктура [TODO]
- [ ] Обновить ratatui 0.29 → 0.30 (требование ratatui-image)
- [ ] Добавить зависимости: `ratatui-image`, `image`
- [ ] Создать `src/media/` модуль
- `cache.rs` — LRU кэш файлов, лимит 500 MB, `~/.cache/tele-tui/images/`
- `loader.rs` — загрузка через TDLib downloadFile API
### Этап 2: Расширить MessageInfo [TODO]
- [ ] Добавить `MediaInfo` в `MessageContent` (PhotoInfo: file_id, width, height)
- [ ] Сохранять метаданные фото при конвертации TDLib → MessageInfo
- [ ] Обновить FakeTdClient для тестов
### Этап 3: Загрузка файлов [TODO]
- [ ] Добавить `download_file()` в TdClientTrait
- [ ] Реализация через TDLib `downloadFile` API
- [ ] Состояния загрузки: Idle → Downloading → Ready → Error
- [ ] Кэширование в `~/.cache/tele-tui/images/`
### Этап 4: UI рендеринг [TODO]
- [ ] `Picker::from_query_stdio()` при старте (определение iTerm2 протокола)
- [ ] Команда `ViewImage` (`v`/`м`) в режиме выбора → запуск загрузки
- [ ] Inline рендеринг через `StatefulImage` (ширина ~30, высота по aspect ratio)
- [ ] Esc/навигация → сворачивание обратно в текст `📷 caption`
### Этап 5: Полировка [TODO]
- [ ] Индикатор загрузки (`📷 ⏳ Загрузка...`)
- [ ] Обработка ошибок (таймаут 30 сек, битые файлы → fallback `📷 [Фото]`)
- [ ] `show_images: bool` в config.toml
- [ ] Логирование через tracing
### Технические детали
- **Библиотека:** ratatui-image 10.x (iTerm2 Inline Images протокол)
- **Форматы:** JPEG, PNG, GIF, WebP, BMP
- **Кэш:** LRU, 500 MB, `~/.cache/tele-tui/images/`
- **Хоткеи:** `v`/`м` — показать/скрыть inline превью
---
## Фаза 12: Прослушивание голосовых сообщений [PLANNED]
### Этап 1: Инфраструктура аудио [TODO]
- [ ] Модуль src/audio/
- player.rs - AudioPlayer на rodio
- cache.rs - VoiceCache для загруженных файлов
- state.rs - PlaybackState (статус, позиция, громкость)
- [ ] Зависимости
- rodio 0.17 - Pure Rust аудио библиотека
- Feature flag "audio" в Cargo.toml
- [ ] AudioPlayer API
- play(), pause()/resume(), stop(), seek(), set_volume(), get_position()
- [ ] VoiceCache
- Кэш загруженных OGG файлов в ~/.cache/tele-tui/voice/
- LRU политика очистки, MAX_VOICE_CACHE_SIZE = 100 MB
### Этап 2: Интеграция с TDLib [TODO]
- [ ] Обработка MessageContentVoiceNote
- Добавить VoiceNoteInfo в MessageInfo
- Извлечение file_id, duration, mime_type, waveform
- [ ] Загрузка файлов
- Метод TdClient::download_voice_note(file_id)
- Асинхронная загрузка через downloadFile API
- Обработка состояний (pending/downloading/ready)
- [ ] Кэширование путей к загруженным файлам
### Этап 3: UI для воспроизведения [TODO]
- [ ] Индикатор в сообщении
- Иконка 🎤 и длительность голосового
- Progress bar во время воспроизведения
- Статус: ▶ (playing), ⏸ (paused), ⏹ (stopped), ⏳ (loading)
- Текущее время / общая длительность (0:08 / 0:15)
- [ ] Footer с управлением
- "[Space] Play/Pause [s] Stop [←/→] Seek [↑/↓] Volume"
- [ ] Waveform визуализация (опционально)
- Символы ▁▂▃▄▅▆▇█ для визуализации
### Этап 4: Хоткеи для управления [TODO]
- [ ] Новые команды
- Space - play/pause, s/ы - stop
- ←/→ - seek ±5 сек, ↑/↓ - volume ±10%
- [ ] Контекстная обработка (управление только во время воспроизведения)
- [ ] Поддержка русской раскладки
### Этап 5: Конфигурация и UX [TODO]
- [ ] AudioConfig в config.toml
- enabled, default_volume, seek_step_seconds, autoplay, cache_size_mb, show_waveform
- system_player_fallback, system_player (mpv, ffplay)
- [ ] Асинхронная загрузка (не блокирует UI)
- [ ] Ticker для обновления progress bar (каждые 100ms)
### Этап 6: Обработка ошибок [TODO]
- [ ] Graceful fallback на системный плеер (mpv/ffplay)
- [ ] Таймаут загрузки (30 сек), повторная попытка
- [ ] Ограничения: максимальный размер файла, автоочистка кэша
### Этап 7: Дополнительные улучшения [TODO]
- [ ] Автоматическая остановка при закрытии чата
- [ ] Сохранение позиции при паузе
- [ ] Префетчинг следующего голосового (опционально)
### Технические детали
- **Аудио библиотека:** rodio 0.17 (Pure Rust, кроссплатформенная, OGG Opus)
- **Платформы:** Linux (ALSA/PulseAudio), macOS (CoreAudio), Windows (WASAPI)
- **Fallback:** mpv --no-video, ffplay -nodisp
- **Новые хоткеи:** Space - play/pause, s/ы - stop, ←/→ - seek, ↑/↓ - volume