Completed phases condensed to summary tables, detailed history removed (available in git log). Detailed plans kept only for upcoming phases 11 (images) and 12 (voice messages). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
176 lines
10 KiB
Markdown
176 lines
10 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: кастомные звуки |
|
||
| 13 | Глубокий рефакторинг | 5 файлов (4582→модули), 5 traits, shared components, docs |
|
||
|
||
---
|
||
|
||
## Фаза 11: Показ изображений в чате [PLANNED]
|
||
|
||
### Этап 1: Инфраструктура [TODO]
|
||
- [ ] Модуль src/media/
|
||
- image_cache.rs - LRU кэш для загруженных изображений
|
||
- image_loader.rs - Асинхронная загрузка через TDLib
|
||
- image_renderer.rs - Рендеринг в ratatui
|
||
- [ ] Зависимости
|
||
- ratatui-image 1.0 - поддержка изображений в TUI
|
||
- Определение протокола терминала (Sixel/Kitty/iTerm2/Halfblocks)
|
||
- [ ] ImageCache с лимитами
|
||
- LRU кэш с максимальным размером в МБ
|
||
- Автоматическая очистка старых изображений
|
||
- MAX_IMAGE_CACHE_SIZE = 100 MB (по умолчанию)
|
||
|
||
### Этап 2: Интеграция с TDLib [TODO]
|
||
- [ ] Обработка MessageContentPhoto
|
||
- Добавить PhotoInfo в MessageInfo
|
||
- Извлечение file_id, width, height из Photo
|
||
- Выбор оптимального размера изображения (до 800px)
|
||
- [ ] Загрузка файлов
|
||
- Метод TdClient::download_photo(file_id)
|
||
- Асинхронная загрузка через downloadFile API
|
||
- Обработка состояний загрузки (pending/downloading/ready)
|
||
- [ ] Кэширование
|
||
- Сохранение путей к загруженным файлам
|
||
- Повторное использование уже загруженных изображений
|
||
|
||
### Этап 3: Рендеринг в UI [TODO]
|
||
- [ ] Модификация render_messages()
|
||
- Определение возможностей терминала при старте
|
||
- Рендеринг изображений через ratatui-image
|
||
- Автоматическое масштабирование под размер области
|
||
- Сохранение aspect ratio
|
||
- [ ] Превью в списке сообщений
|
||
- Миниатюры размером 20x10 символов
|
||
- Lazy loading (загрузка только видимых)
|
||
- Placeholder пока изображение грузится
|
||
- [ ] Индикатор загрузки
|
||
- Текстовая заглушка "[Загрузка фото...]"
|
||
- Progress bar для больших файлов
|
||
- Процент загрузки
|
||
|
||
### Этап 4: Полноэкранный просмотр [TODO]
|
||
- [ ] Новый режим: ViewImage
|
||
- `v` / `м` в режиме выбора - открыть изображение
|
||
- Показ на весь экран терминала
|
||
- `Esc` для закрытия
|
||
- [ ] Информация об изображении
|
||
- Размер файла
|
||
- Разрешение (width x height)
|
||
- Формат (JPEG/PNG/GIF)
|
||
- [ ] Навигация
|
||
- `←` / `→` - предыдущее/следующее изображение в чате
|
||
- Автоматическая загрузка соседних изображений
|
||
|
||
### Этап 5: Конфигурация и UX [TODO]
|
||
- [ ] MediaConfig в config.toml
|
||
- show_images: bool - включить/отключить показ изображений
|
||
- image_cache_mb: usize - размер кэша в МБ
|
||
- preview_quality: "low" | "medium" | "high"
|
||
- render_protocol: "auto" | "sixel" | "kitty" | "iterm2" | "halfblocks"
|
||
- [ ] Поддержка различных терминалов
|
||
- Auto-detection протокола при старте
|
||
- Fallback на Unicode halfblocks для любого терминала
|
||
- Опция отключения изображений если терминал не поддерживает
|
||
- [ ] Оптимизация производительности
|
||
- Асинхронная загрузка (не блокирует UI)
|
||
- Приоритизация видимых изображений
|
||
- Fast resize для превью
|
||
- Кэширование отмасштабированных версий
|
||
|
||
### Этап 6: Обработка ошибок [TODO]
|
||
- [ ] Graceful fallback
|
||
- Текстовая заглушка "[Фото]" если загрузка не удалась
|
||
- Повторная попытка по запросу пользователя
|
||
- Логирование проблем через tracing
|
||
- [ ] Ограничения
|
||
- Таймаут загрузки (30 сек)
|
||
- Максимальный размер файла для автозагрузки (10 MB)
|
||
- Предупреждение для больших файлов
|
||
|
||
### Технические детали
|
||
- **Поддерживаемые протоколы:** Sixel, Kitty Graphics, iTerm2 Inline Images, Unicode Halfblocks (fallback)
|
||
- **Поддерживаемые форматы:** JPEG, PNG, GIF, WebP, BMP
|
||
- **Новые хоткеи:** `v`/`м` - полноэкранный просмотр, `←`/`→` - навигация, `Esc` - закрыть
|
||
|
||
---
|
||
|
||
## Фаза 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
|