Add voice message playback infrastructure: - AudioPlayer using ffplay subprocess with SIGSTOP/SIGCONT for pause/resume - VoiceCache with LRU eviction (100 MB limit) - TDLib integration: VoiceInfo, VoiceDownloadState, PlaybackState types - download_voice_note() in TdClientTrait - Keybindings: Space (play/pause), ←/→ (seek ±5s) - Auto-stop playback on message navigation - Remove debug_log module
92 lines
5.1 KiB
Markdown
92 lines
5.1 KiB
Markdown
# 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: кастомные звуки |
|
||
| 11 | Inline просмотр фото | Dual renderer (Halfblocks + iTerm2/Sixel), throttling 15 FPS, modal viewer, lazy loading |
|
||
| 12 | Голосовые сообщения (WIP) | ffplay player, SIGSTOP/SIGCONT pause, VoiceCache, TDLib интеграция |
|
||
| 13 | Глубокий рефакторинг | 5 файлов (4582→модули), 5 traits, shared components, docs |
|
||
|
||
---
|
||
|
||
## Фаза 11: Inline просмотр фото в чате [DONE ✅]
|
||
|
||
**UX**: Always-show inline preview (50 chars, Halfblocks) → `v`/`м` открывает fullscreen modal (iTerm2/Sixel) → `←`/`→` навигация между фото.
|
||
|
||
### Реализовано:
|
||
- [x] **Dual renderer архитектура**:
|
||
- `inline_image_renderer`: Halfblocks (быстро, Unicode блоки) для навигации
|
||
- `modal_image_renderer`: iTerm2/Sixel (медленно, высокое качество) для просмотра
|
||
- [x] **Performance optimizations**:
|
||
- Frame throttling: inline 15 FPS, текст 60 FPS
|
||
- Lazy loading: только видимые изображения
|
||
- LRU cache: max 100 протоколов
|
||
- Skip partial rendering (no flickering)
|
||
- [x] **UX улучшения**:
|
||
- Always-show inline preview (фикс. ширина 50 chars)
|
||
- Fullscreen modal на `v`/`м` с aspect ratio
|
||
- Loading indicator "⏳ Загрузка..." в модалке
|
||
- Navigation hotkeys: `←`/`→` между фото, `Esc`/`q` закрыть
|
||
- [x] **Типы и API**:
|
||
- `MediaInfo`, `PhotoInfo`, `PhotoDownloadState`, `ImageModalState`
|
||
- `ImagesConfig` в config.toml
|
||
- Feature flag `images` для зависимостей
|
||
- [x] **Media модуль**:
|
||
- `cache.rs`: ImageCache (LRU)
|
||
- `image_renderer.rs`: new() + new_fast()
|
||
- [x] **UI модули**:
|
||
- `modals/image_viewer.rs`: fullscreen modal
|
||
- `messages.rs`: throttled second-pass rendering
|
||
|
||
### Результат:
|
||
- ✅ 10x faster navigation (lazy loading)
|
||
- ✅ Smooth 60 FPS text, 15 FPS images
|
||
- ✅ Quality modal viewing (iTerm2/Sixel)
|
||
- ✅ No flickering/shrinking
|
||
|
||
---
|
||
|
||
## Фаза 12: Прослушивание голосовых сообщений [IN PROGRESS]
|
||
|
||
### Этап 1: Инфраструктура аудио [DONE ✅]
|
||
- [x] Модуль `src/audio/`
|
||
- `player.rs` — AudioPlayer на ffplay (subprocess)
|
||
- `cache.rs` — VoiceCache (LRU, max 100 MB, `~/.cache/tele-tui/voice/`)
|
||
- [x] AudioPlayer API: play(), pause() (SIGSTOP), resume() (SIGCONT), stop()
|
||
|
||
### Этап 2: Интеграция с TDLib [DONE ✅]
|
||
- [x] Типы: `VoiceInfo`, `VoiceDownloadState`, `PlaybackState`, `PlaybackStatus`
|
||
- [x] Конвертация `MessageVoiceNote` в `message_conversion.rs`
|
||
- [x] `download_voice_note()` в TdClientTrait + client_impl + fake
|
||
- [x] Методы `has_voice()`, `voice_info()`, `voice_info_mut()` на `MessageInfo`
|
||
|
||
### Этап 3: UI для воспроизведения [TODO]
|
||
- [ ] Индикатор в сообщении (🎤, duration, progress bar)
|
||
- [ ] Waveform визуализация (символы ▁▂▃▄▅▆▇█)
|
||
|
||
### Этап 4: Хоткеи [DONE ✅]
|
||
- [x] Space — play/pause toggle (запуск + пауза/возобновление)
|
||
- [x] ←/→ — seek ±5 сек
|
||
- [x] Автоматическая остановка при навигации на другое сообщение
|
||
|
||
### Этап 5: TODO
|
||
- [ ] AudioConfig в config.toml
|
||
- [ ] Ticker для progress bar (каждые 100ms)
|
||
- [ ] Интеграция VoiceCache в handlers
|
||
|
||
### Технические детали
|
||
- **Аудио:** ffplay (subprocess), pause/resume через SIGSTOP/SIGCONT
|
||
- **Платформы:** macOS, Linux (везде где есть ffmpeg)
|
||
- **Хоткеи:** Space (play/pause), ←/→ (seek)
|