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

7.7 KiB
Raw Blame History

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