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>
7.7 KiB
7.7 KiB
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
downloadFileAPI - Состояния загрузки: 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