@emaxe/tuigram 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.env.example CHANGED
@@ -35,6 +35,21 @@ SHOW_IMAGES=true
35
35
  IMAGE_MAX_WIDTH=36
36
36
  IMAGE_MAX_HEIGHT=14
37
37
 
38
+ # ── Video Playback Preferences ────────────────────────────────────────────────
39
+ # Включение воспроизведения видео в терминале в псевдографике (true/false)
40
+ # Для работы требуется ffmpeg (автоустановка: tuigram install-video)
41
+ ENABLE_VIDEO=false
42
+
43
+ # Частота кадров при воспроизведении видео (FPS, 1..30, по умолчанию 15)
44
+ VIDEO_FPS=15
45
+
46
+ # Воспроизведение звуковой дорожки видеофайла (true/false)
47
+ VIDEO_AUDIO=true
48
+
49
+ # Путь к ffmpeg/ffplay (если они не в PATH и не в папке данных tuigram)
50
+ # FFMPEG_PATH=/usr/local/bin/ffmpeg
51
+ # FFPLAY_PATH=/usr/local/bin/ffplay
52
+
38
53
  # ── Proxy Settings ────────────────────────────────────────────────────────────
39
54
  # Поддерживаются HTTP и SOCKS5 (как с авторизацией, так и без).
40
55
  # Формат единого URL:
package/CHANGELOG.md CHANGED
@@ -13,6 +13,66 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
13
13
 
14
14
  - English localization of the TUI and CLI interface strings.
15
15
 
16
+ ## [1.5.0] — 2026-09-02
17
+
18
+ ### Added
19
+
20
+ - Video playback support in ANSI pseudographics (Unicode Half-Block) with synchronized audio track.
21
+ - New CLI command `tuigram install-video` to check and automatically install static `ffmpeg` binaries and enable video in `.env`.
22
+ - New configuration settings in `.env`: `ENABLE_VIDEO`, `VIDEO_FPS`, `VIDEO_AUDIO`, `FFMPEG_PATH`, `FFPLAY_PATH`.
23
+ - Video player modal with playback controls (`[Space]` for pause/resume, `[r]` to replay, `[Esc]` / `[q]` to exit).
24
+ - Interactive video playback via message action menu and by clicking on video message preview in chat view.
25
+
26
+ ### Changed
27
+
28
+ - Enhanced unread message badge in dialog list: counters above 99 are shown as `[99+]`, and the right block (time and unread badge) is always right-aligned, truncating long chat titles with an ellipsis when space is constrained.
29
+
30
+ ### Fixed
31
+
32
+ - Opening a chat with unread messages now scrolls and positions directly at the first unread message with an unread separator divider instead of always jumping to the last message.
33
+ - Unread message badge and counter in the dialog list now dynamically decrease in real-time as messages are scrolled and read in the active chat.
34
+
35
+ ## [1.4.0] — 2026-09-01
36
+
37
+ ### Added
38
+
39
+ - Message selection in the chat feed: a left click marks a message with a colored `▌` bar
40
+ along all of its lines. `↑` / `↓` (and `k` / `j`) move the selection between messages and
41
+ scroll it into view; reaching the topmost message loads the previous page of history.
42
+ - The message action menu now opens with the right mouse button, and with `[Enter]` on the
43
+ selected message. Previously any click opened it, so a message could not simply be picked.
44
+ - The selected message became the target for actions: `[Ctrl+R]` replies to it, `[Ctrl+E]`
45
+ edits it (when it is yours), `[Ctrl+A]` and the status bar `[Ctrl+A]` button open the menu
46
+ for it. With nothing selected the previous behaviour applies — the last message in the chat.
47
+ - Full-screen image viewer opened by clicking an image preview: the thumbnail that arrived
48
+ with the message is shown instantly, then replaced by the full-size version. For videos and
49
+ documents the largest thumbnail is used and the file itself is never downloaded. Close with
50
+ `[Esc]`, `[Q]`, `[Enter]` or a click; the image is re-rendered when the terminal is resized.
51
+ - The `[Ctrl+A]` shortcut (action menu) now works from every panel, including the input box.
52
+ - `[F12]` temporarily hands the mouse back to the terminal so text can be selected and
53
+ copied, and restores the capture when pressed again.
54
+
55
+ ### Fixed
56
+
57
+ - A modal window was closed by the very click that opened it: blessed delivers a click to the
58
+ element first and to the screen immediately after. As a result the status bar buttons
59
+ `[F1]`, `[Ctrl+A]`, `[Ctrl+P]`, `[Ctrl+Q]`, the header logo and the chat title did not work
60
+ with the mouse at all, and the action menu only stayed open when the click happened to land
61
+ inside the future modal rectangle.
62
+ - Clicking a message hit the wrong message in a scrolled feed: the position was read from
63
+ `getScroll()`, which adds a blessed-internal offset to the actual content shift.
64
+ - The mouse wheel scrolled the feed twice per notch (a custom handler on top of the built-in
65
+ blessed one), and scrolling up from the bottom of the feed did nothing for the first notches.
66
+ - `PageUp` / `PageDown` scrolled the feed twice as far while it had focus.
67
+ - Clicks on the input hints were off by about 10 cells: clicking `[Ctrl+E] Правка` triggered
68
+ commands, and clicking the "Введите сообщение…" text switched to reply mode.
69
+ - A right click behaved like a left one: it opened chats in the list and pressed status bar
70
+ buttons and filter tabs.
71
+ - The feed layout map drifted by one line per message, so click coordinates diverged from the
72
+ actual text the longer the history grew.
73
+ - A full-screen image render could evict and replace the same image's thumbnail in the feed:
74
+ the render size is now part of the pseudo-graphics cache key.
75
+
16
76
  ## [1.3.0] — 2026-09-01
17
77
 
18
78
  ### Added
@@ -135,7 +195,9 @@ First public release.
135
195
  - A WCAG contrast test (3:1 threshold) applied to every theme **after** conversion
136
196
  to xterm-256 — the colors are checked exactly as the user sees them.
137
197
 
138
- [Unreleased]: https://github.com/emaxe/tuigram/compare/v1.3.0...HEAD
198
+ [Unreleased]: https://github.com/emaxe/tuigram/compare/v1.5.0...HEAD
199
+ [1.5.0]: https://github.com/emaxe/tuigram/compare/v1.4.0...v1.5.0
200
+ [1.4.0]: https://github.com/emaxe/tuigram/compare/v1.3.0...v1.4.0
139
201
  [1.3.0]: https://github.com/emaxe/tuigram/compare/v1.2.0...v1.3.0
140
202
  [1.2.0]: https://github.com/emaxe/tuigram/compare/v1.1.0...v1.2.0
141
203
  [1.1.0]: https://github.com/emaxe/tuigram/compare/v1.0.1...v1.1.0
package/CHANGELOG.ru.md CHANGED
@@ -13,6 +13,70 @@
13
13
 
14
14
  - Английская локализация строк интерфейса TUI и CLI.
15
15
 
16
+ ## [1.5.0] — 2026-09-02
17
+
18
+ ### Добавлено
19
+
20
+ - Поддержка воспроизведения видео в терминале в псевдографике (Unicode Half-Block) с синхронной звуковой дорожкой.
21
+ - Консольная команда `tuigram install-video` для проверки, автоматической загрузки статической сборки `ffmpeg` и активации настройки в `.env`.
22
+ - Новые параметры конфигурации в `.env`: `ENABLE_VIDEO`, `VIDEO_FPS`, `VIDEO_AUDIO`, `FFMPEG_PATH`, `FFPLAY_PATH`.
23
+ - Модальный видеоплеер с управлением воспроизведением (`[Пробел]` — пауза/воспроизведение, `[r]` — перезапуск с начала, `[Esc]` / `[q]` — закрыть).
24
+ - Запуск воспроизведения через меню действий над сообщением («▶️ Воспроизвести видео») и по прямому клику мыши по превью видео в ленте.
25
+
26
+ ### Изменено
27
+
28
+ - Доработан показ количества непрочитанных сообщений в списке диалогов: если непрочитанных более 99, отображается `[99+]`, а блок времени и непрочитанных всегда прижат к правому краю с сокращением названия диалога с троеточием при нехватке места.
29
+
30
+ ### Исправлено
31
+
32
+ - При переходе в диалог с непрочитанными сообщениями лента теперь позиционируется на первом непрочитанном сообщении с визуальным разделителем «Непрочитанные сообщения», как в официальном клиенте Telegram (ранее всегда открывалось последнее сообщение).
33
+ - Бейдж и счётчик непрочитанных сообщений в списке диалогов теперь динамически уменьшаются в реальном времени по мере пролистывания и прочтения сообщений в активном чате.
34
+
35
+ ## [1.4.0] — 2026-09-01
36
+
37
+ ### Добавлено
38
+
39
+ - Выделение сообщений в ленте чата: левый клик мышью помечает сообщение цветной полосой `▌`
40
+ слева от всех его строк. Стрелки `↑` / `↓` (и `k` / `j`) перемещают выделение между
41
+ сообщениями с автоподкруткой ленты; на самом верхнем сообщении подгружается предыдущая
42
+ страница истории.
43
+ - Меню действий над сообщением открывается правой кнопкой мыши, а также `[Enter]` над
44
+ выделенным сообщением. Прежде меню открывалось любым кликом, из-за чего сообщение нельзя
45
+ было просто выбрать.
46
+ - Выделенное сообщение стало целью действий: `[Ctrl+R]` отвечает именно на него, `[Ctrl+E]`
47
+ правит его (если оно ваше), `[Ctrl+A]` и кнопка `[Ctrl+A]` строки состояния открывают меню
48
+ для него. Без выделения действует прежнее поведение — последнее сообщение чата.
49
+ - Полноэкранный просмотр изображений по клику на превью в сообщении: сначала мгновенно
50
+ показывается пришедшая с сообщением миниатюра, затем она заменяется полноразмерной
51
+ версией. У видео и документов берётся самая крупная миниатюра, сам файл не качается.
52
+ Закрытие — `[Esc]`, `[Q]`, `[Enter]` или клик; при изменении размера терминала
53
+ изображение перерисовывается.
54
+ - Глобальное сочетание `[Ctrl+A]` (меню действий) теперь работает из любой панели, включая
55
+ поле ввода.
56
+ - Клавиша `[F12]` временно отдаёт мышь терминалу, чтобы можно было выделить и скопировать
57
+ текст, и возвращает захват повторным нажатием.
58
+
59
+ ### Исправлено
60
+
61
+ - Модальное окно закрывалось тем же кликом, которым его открыли: blessed рассылает клик
62
+ сначала элементу, а сразу за ним — экрану. Из-за этого мышью вовсе не работали кнопки
63
+ строки состояния `[F1]`, `[Ctrl+A]`, `[Ctrl+P]`, `[Ctrl+Q]`, логотип и заголовок чата в
64
+ шапке, а меню действий открывалось лишь при попадании клика в будущий прямоугольник окна.
65
+ - Клик по сообщению попадал не в то сообщение при прокрученной ленте: позиция бралась из
66
+ `getScroll()`, которая складывает сдвиг содержимого со служебным смещением blessed.
67
+ - Колесо мыши прокручивало ленту дважды за щелчок (собственный обработчик поверх
68
+ встроенного в blessed), а прокрутка вверх от нижнего края ленты первые несколько щелчков
69
+ не работала вовсе.
70
+ - `PageUp` / `PageDown` прокручивали ленту на удвоенное расстояние, когда она была в фокусе.
71
+ - Клики по подсказкам поля ввода были смещены примерно на 10 ячеек: клик по `[Ctrl+E] Правка`
72
+ вызывал команды, а клик по тексту «Введите сообщение…» включал режим ответа.
73
+ - Правый клик срабатывал как левый: открывал чат в списке, нажимал кнопки строки состояния
74
+ и вкладки фильтров.
75
+ - Разметка ленты «съезжала» на одну строку с каждым сообщением, из-за чего карта координат
76
+ расходилась с реальным текстом тем сильнее, чем длиннее история.
77
+ - Полноэкранный рендер картинки мог вытеснить и подменить её же миниатюру в ленте: размер
78
+ теперь входит в ключ кэша псевдографики.
79
+
16
80
  ## [1.3.0] — 2026-09-01
17
81
 
18
82
  ### Добавлено
@@ -137,7 +201,9 @@
137
201
  - Тест контраста по WCAG (порог 3:1) для каждой темы — **после** конверсии в xterm-256,
138
202
  то есть ровно в том виде, в каком цвет увидит пользователь.
139
203
 
140
- [Unreleased]: https://github.com/emaxe/tuigram/compare/v1.3.0...HEAD
204
+ [Unreleased]: https://github.com/emaxe/tuigram/compare/v1.5.0...HEAD
205
+ [1.5.0]: https://github.com/emaxe/tuigram/compare/v1.4.0...v1.5.0
206
+ [1.4.0]: https://github.com/emaxe/tuigram/compare/v1.3.0...v1.4.0
141
207
  [1.3.0]: https://github.com/emaxe/tuigram/compare/v1.2.0...v1.3.0
142
208
  [1.2.0]: https://github.com/emaxe/tuigram/compare/v1.1.0...v1.2.0
143
209
  [1.1.0]: https://github.com/emaxe/tuigram/compare/v1.0.1...v1.1.0
package/README.md CHANGED
@@ -57,6 +57,7 @@ TuiGram lets you use Telegram entirely from the terminal: browse your dialog lis
57
57
  - [Sending files and images](#-sending-files-and-images)
58
58
  - [Themes](#-themes)
59
59
  - [Inline image previews](#️-inline-image-previews)
60
+ - [Video playback in pseudographics](#-video-playback-in-pseudographics)
60
61
  - [Proxy configuration](#-proxy-configuration)
61
62
  - [Command line usage (CLI)](#️-command-line-usage-cli)
62
63
  - [Project structure](#-project-structure)
@@ -71,17 +72,19 @@ TuiGram lets you use Telegram entirely from the terminal: browse your dialog lis
71
72
 
72
73
  - **A complete interactive TUI**:
73
74
  - Two-pane adaptive layout (dialog list on the left, history and input box on the right);
74
- - Keyboard and mouse control (clicks, wheel scrolling);
75
+ - Keyboard and mouse control (left click selects a message, right click opens the action
76
+ menu, clicking an image opens it full screen, clicking a video plays it, wheel scrolling);
75
77
  - Chat categories: All, Direct messages, Groups, Channels, Bots, Unread;
76
78
  - Instant search and filtering of chats by title and `@username` (`/`);
77
79
  - Live typing indicator ("… is typing");
78
80
  - Colored rendering of Telegram entities (bold, italic, monospace code, URLs, mentions, spoilers);
79
81
  - High-resolution inline image previews (Unicode Half-Block `▀` pixel art);
82
+ - Terminal video and video note playback (Unicode Half-Block + synchronized audio);
80
83
  - Media attachment indicators (photo, video, document, voice, sticker, poll);
81
84
  - Message reactions (👍, 🔥, ❤️);
82
85
  - Infinite upward pagination of message history (`PageUp` / `Ctrl+U`);
83
86
  - Contextual quick-reply (`Ctrl+R`) and edit (`Ctrl+E`) modes;
84
- - Modal windows: Help (`F1` / `?`), Chat info (`Ctrl+P`), Action menu (`Ctrl+A`), Send file (`Ctrl+O`).
87
+ - Modal windows: Help (`F1` / `?`), Chat info (`Ctrl+P`), Action menu (`Ctrl+A`), Send file (`Ctrl+O`), Full-screen image viewer, Video player.
85
88
  - **Standalone CLI mode**:
86
89
  - Send messages and files straight from the command line;
87
90
  - List dialogs and print chat history in the terminal;
@@ -433,22 +436,26 @@ node scripts/check-package.js # verifies that .env and the session do not leak
433
436
  |---|---|---|
434
437
  | `Tab` / `Shift+Tab` | Global | Cycle focus: dialog list → message feed → input box |
435
438
  | `↑` / `↓` | Dialog list | Select a chat |
439
+ | `↑` / `↓`, `k` / `j` | Message feed | Move the selection between messages |
436
440
  | `Enter` | Dialog list | Open the selected chat and load its history |
441
+ | `Enter` | Message feed | Action menu for the selected message |
437
442
  | `1` .. `6` | Dialog list | Switch category: `1:All`, `2:DM`, `3:Groups`, `4:Channels`, `5:Bots`, `6:Unread` |
438
443
  | `/` | Dialog list | Search / filter chats |
439
444
  | `Enter` | Input box | Send the typed message |
440
445
  | `Ctrl+J` | Input box | Insert a line break without sending |
441
- | `Ctrl+R` | Chat / Input | Reply to the last message |
442
- | `Ctrl+E` | Chat / Input | Edit your own last message |
443
- | `Ctrl+A` | Messages | Context action menu (reactions, delete, download, reply) |
446
+ | `Ctrl+R` | Chat / Input | Reply to the selected message, or the last one |
447
+ | `Ctrl+E` | Chat / Input | Edit the selected message of yours, or your last one |
448
+ | `Ctrl+A` | Global | Context action menu (reactions, delete, download, reply) |
444
449
  | `Ctrl+O` | Global | Send a file / photo / document |
445
450
  | `Ctrl+F` | Send dialog | File browser (navigate folders) |
446
451
  | `Ctrl+D` | Send dialog | Send uncompressed, as a document |
447
452
  | `Ctrl+P` | Global | Info about the current chat (ID, members, links) |
448
453
  | `PageUp` / `Ctrl+U` | History | Scroll up / load older history |
449
454
  | `PageDown` / `Ctrl+D` | History | Scroll down |
455
+ | `Home` / `End` | History | Jump to the top (loads history) / to the last message |
450
456
  | `Esc` | Modals | Close the modal / cancel reply or edit |
451
457
  | `F1` or `?` | Global | Help window with every shortcut |
458
+ | `F12` | Global | Hand the mouse to the terminal for text selection (press again to return) |
452
459
  | `Ctrl+Q` / `Ctrl+C` | Global | Safely exit the client |
453
460
 
454
461
  ---
@@ -459,20 +466,52 @@ TuiGram fully supports mouse interaction in terminals that support mouse reporti
459
466
 
460
467
  | Action | Target | Result |
461
468
  |---|---|---|
462
- | Click | Left / Middle / Bottom panel | Focus the clicked panel |
463
- | Click | Chat item in dialog list | Immediately select and open the chat |
464
- | Click | Filter tabs `1:Все` .. `6:Непроч` | Switch chat category filter |
465
- | Click | Search bar `[/]` | Focus search box and clear placeholder |
469
+ | Left click | Left / Middle / Bottom panel | Focus the clicked panel |
470
+ | Left click | Chat item in dialog list | Immediately select and open the chat |
471
+ | Left click | Filter tabs `1:Все` .. `6:Непроч` | Switch chat category filter |
472
+ | Left click | Search bar `[/]` | Focus search box and clear placeholder |
466
473
  | Wheel scroll | Dialog list / Message feed | Smooth scroll (scrolling up to the top loads older messages) |
467
- | Click | Any message line | Open message action menu (reactions, reply, edit, download, delete) |
468
- | Click | Header logo 🚀 | Open Help window |
469
- | Click | Header active chat title | Open Chat Info window |
470
- | Click | Header connection badge | Show active network status |
471
- | Click | Input context bar | Cancel reply/edit mode or insert `/` |
472
- | Click | Status bar items | Trigger corresponding action (`[Tab]`, `[F1]`, `[Ctrl+A]`, `[Ctrl+Q]`, etc.) |
474
+ | **Left click** | **Message in the feed** | **Select the message a `▌` bar marks it on the left** |
475
+ | **Right click** | **Message in the feed** | **Open the action menu (reactions, reply, edit, download, delete)** |
476
+ | **Left click** | **Image preview inside a message** | **Open the image full screen** |
477
+ | **Left click** | **Video preview inside a message** | **Play video in modal player** |
478
+ | Left click | Empty area of the feed | Focus the message feed |
479
+ | Left click | Header logo 🚀 | Open Help window |
480
+ | Left click | Header active chat title | Open Chat Info window |
481
+ | Left click | Header connection badge | Show active network status |
482
+ | Left click | Input context bar | Cancel reply/edit mode, trigger `[Ctrl+R]` / `[Ctrl+E]` or insert `/` |
483
+ | Left click | Status bar items | Trigger corresponding action (`[Tab]`, `[F1]`, `[Ctrl+A]`, `[Ctrl+Q]`, etc.) |
473
484
  | Click | Outside any modal window | Dismiss / close modal |
474
485
  | Click | Buttons in modals | Click buttons (`[ Отправить ]`, `[ Отмена ]`, `[ Закрыть ]`, toggle checkboxes) |
475
486
 
487
+ ### Message selection
488
+
489
+ A left click selects a message: a colored `▌` bar appears to the left of all its lines.
490
+ `↑` / `↓` (and `k` / `j`) move the selection between messages and scroll it into view;
491
+ reaching the topmost message loads the previous page of history. Plain scrolling stays on
492
+ `PageUp` / `PageDown`, the wheel and `Home` / `End`.
493
+
494
+ The selected message becomes the target for actions: `[Enter]` and right click open the
495
+ action menu, `[Ctrl+R]` replies to it, `[Ctrl+E]` edits it (when it is yours). With nothing
496
+ selected these actions apply to the last message in the chat, as before.
497
+
498
+ ### Full-screen image viewer
499
+
500
+ A left click on a preview opens the image across the whole terminal. The thumbnail that
501
+ already arrived with the message is shown instantly, then it is replaced by the full-size
502
+ version as soon as it downloads. For videos and documents the largest available thumbnail
503
+ is shown — the file itself is never downloaded. Close with `[Esc]`, `[Q]`, `[Enter]` or a
504
+ click anywhere.
505
+
506
+ ### Right click and terminal text selection
507
+
508
+ > **macOS Terminal.app** captures the right click for its own context menu and never passes
509
+ > it to the application. Use `[Enter]` or `[Ctrl+A]` on the selected message there. Right
510
+ > click works in iTerm2, Ghostty, Alacritty, Kitty and Windows Terminal.
511
+
512
+ While the app captures the mouse, the terminal cannot select text for copying. Press `[F12]`
513
+ to hand the mouse back to the terminal, and `[F12]` again to return control to the interface.
514
+
476
515
  ---
477
516
 
478
517
  ## 💬 Slash commands in the input box
@@ -554,6 +593,41 @@ IMAGE_MAX_HEIGHT=14
554
593
 
555
594
  ---
556
595
 
596
+ ## 🎬 Video playback in pseudographics
597
+
598
+ TuiGram supports video playback directly in the terminal using Unicode Half-Block characters (`▀`) and 24-bit RGB truecolor, with synchronized audio playback via system audio or `ffplay`.
599
+
600
+ ### Setup
601
+ Video playback requires `ffmpeg`. You can install it and enable video playback automatically with a single command:
602
+ ```bash
603
+ tuigram install-video
604
+ ```
605
+ This command checks for existing `ffmpeg`, downloads a static binary if needed, and sets `ENABLE_VIDEO=true` in your `.env`.
606
+
607
+ ### Configuration in `.env`:
608
+ ```env
609
+ # Enable video playback in terminal (true/false)
610
+ ENABLE_VIDEO=true
611
+
612
+ # Playback frame rate (FPS, 1..30, default: 15)
613
+ VIDEO_FPS=15
614
+
615
+ # Play audio track (true/false)
616
+ VIDEO_AUDIO=true
617
+
618
+ # Optional custom binary paths
619
+ # FFMPEG_PATH=/usr/local/bin/ffmpeg
620
+ # FFPLAY_PATH=/usr/local/bin/ffplay
621
+ ```
622
+
623
+ ### Controls:
624
+ - Click on any video message preview or choose **▶️ Play video** from the action menu (`[Enter]` / right click).
625
+ - `[Space]` — Pause / Resume
626
+ - `[r]` — Replay from beginning
627
+ - `[Esc]` or `[q]` — Close video player
628
+
629
+ ---
630
+
557
631
  ## 🌐 Proxy configuration
558
632
 
559
633
  TuiGram supports routing MTProto connections through HTTP (including HTTPS CONNECT) and SOCKS5/SOCKS4 proxies — both with and without username/password authentication.
@@ -592,6 +666,9 @@ clone, substitute `node bin/tuigram.js` for `tuigram`):
592
666
  # Authorization
593
667
  tuigram login
594
668
 
669
+ # Install video playback dependencies & enable video in .env
670
+ tuigram install-video
671
+
595
672
  # List dialogs
596
673
  tuigram dialogs --limit 30
597
674
 
@@ -648,13 +725,17 @@ TuiGram/
648
725
  │ │ ├── chatInfoModal.js # Chat info window
649
726
  │ │ ├── actionModal.js # Message action menu
650
727
  │ │ ├── fileModal.js # Send-file dialog
728
+ │ │ ├── imageViewerModal.js # Full-screen image viewer
729
+ │ │ ├── videoPlayerModal.js # Video player modal
651
730
  │ │ └── confirmModal.js # Confirmation dialog
652
731
  │ ├── cli/
653
732
  │ │ ├── cliCommands.js # Standalone CLI commands
654
733
  │ │ ├── init.js # tuigram init / paths — setup and diagnostics
734
+ │ │ ├── videoSetup.js # tuigram install-video — ffmpeg setup & config
655
735
  │ │ └── formatters.js # Console table and log formatters
656
736
  │ └── utils/
657
737
  │ ├── image.js # Image decoding, resizing and Half-Block ANSI rendering
738
+ │ ├── video.js # Video playback utilities, ffmpeg detection & decoding
658
739
  │ ├── storage.js # File operations and session persistence
659
740
  │ └── time.js # Time and date formatting
660
741
  ├── scripts/
package/README.ru.md CHANGED
@@ -53,6 +53,7 @@
53
53
  - [Отправка файлов и картинок](#-отправка-файлов-и-картинок)
54
54
  - [Темы оформления](#-темы-оформления)
55
55
  - [Превью изображений в сообщениях](#️-превью-изображений-в-сообщениях)
56
+ - [Воспроизведение видео в псевдографике](#-воспроизведение-видео-в-псевдографике)
56
57
  - [Прокси-сервер](#-прокси-сервер)
57
58
  - [Использование через консоль (CLI)](#️-использование-через-консоль-cli)
58
59
  - [Структура проекта](#-структура-проекта)
@@ -67,17 +68,19 @@
67
68
 
68
69
  - **Полноценный интерактивный TUI**:
69
70
  - Двухпанельный адаптивный интерфейс (список чатов слева + история и поле ввода справа);
70
- - Поддержка управления клавиатурой и мышью (клики, прокрутка колесом);
71
+ - Поддержка управления клавиатурой и мышью (левый клик — выделение сообщения,
72
+ правый — меню действий, клик по картинке — просмотр на весь экран, клик по видео — воспроизведение, колесо — прокрутка);
71
73
  - Категории чатов: Все, Личные (ЛС), Группы, Каналы, Боты, Непрочитанные;
72
74
  - Мгновенный поиск и фильтрация чатов по названию и `@username` (`/`);
73
75
  - Отображение статуса набора текста («Собеседник печатает...») в реальном времени;
74
76
  - Цветовое форматирование Telegram Entities (Bold, Italic, Monospace Code, URLs, Mentions, Spoilers);
75
77
  - Цветные превью изображений высокого разрешения прямо в чате (Unicode Half-Block `▀` pixel art);
78
+ - Воспроизведение видео и видеозаметок в псевдографике (Unicode Half-Block + синхронный звук);
76
79
  - Индикаторы медиа-вложений (фото, видео, документы, голосовые, стикеры, опросы);
77
80
  - Реакции на сообщения (👍, 🔥, ❤️);
78
81
  - Бесконечная пагинация истории сообщений вверх (`PageUp` / `Ctrl+U`);
79
82
  - Контекстные режимы быстрого ответа (Reply `Ctrl+R`) и редактирования (Edit `Ctrl+E`);
80
- - Модальные окна: Справка (`F1` / `?`), Сведения о чате (`Ctrl+P`), Меню действий (`Ctrl+A`), Отправка файла (`Ctrl+O`).
83
+ - Модальные окна: Справка (`F1` / `?`), Сведения о чате (`Ctrl+P`), Меню действий (`Ctrl+A`), Отправка файла (`Ctrl+O`), Просмотрщик картинок, Видеоплеер.
81
84
  - **Автономный CLI-режим**:
82
85
  - Быстрая отправка сообщений и файлов из командной строки;
83
86
  - Просмотр списка диалогов и истории в терминале;
@@ -425,22 +428,26 @@ node scripts/check-package.js # проверка, что в пакет не у
425
428
  |---|---|---|
426
429
  | `Tab` / `Shift+Tab` | Глобально | Фокус по кругу: Список диалогов → Лента сообщений → Поле ввода |
427
430
  | `↑` / `↓` | Список диалогов | Выбор чата |
431
+ | `↑` / `↓`, `k` / `j` | Лента сообщений | Перемещение выделения между сообщениями |
428
432
  | `Enter` | Список диалогов | Открыть выбранный чат и загрузить историю |
433
+ | `Enter` | Лента сообщений | Меню действий над выделенным сообщением |
429
434
  | `1` .. `6` | Список диалогов | Переключение категорий: `1:Все`, `2:ЛС`, `3:Группы`, `4:Каналы`, `5:Боты`, `6:Непроч` |
430
435
  | `/` | Список диалогов | Поиск / фильтрация чатов |
431
436
  | `Enter` | Поле ввода | Отправить набранное сообщение |
432
437
  | `Ctrl+J` | Поле ввода | Перенос строки без отправки |
433
- | `Ctrl+R` | Чат / Ввод | Ответить (Reply) на последнее сообщение |
434
- | `Ctrl+E` | Чат / Ввод | Редактировать своё последнее сообщение |
435
- | `Ctrl+A` | Сообщения | Контекстное меню действий (Реакции, Удаление, Скачивание, Ответ) |
438
+ | `Ctrl+R` | Чат / Ввод | Ответить (Reply) на выделенное сообщение, иначе — на последнее |
439
+ | `Ctrl+E` | Чат / Ввод | Редактировать выделенное своё сообщение, иначе — последнее своё |
440
+ | `Ctrl+A` | Глобально | Контекстное меню действий (Реакции, Удаление, Скачивание, Ответ) |
436
441
  | `Ctrl+O` | Глобально | Отправить файл / фото / документ |
437
442
  | `Ctrl+F` | Окно отправки | Обзор файлов (навигация по папкам) |
438
443
  | `Ctrl+D` | Окно отправки | Отправить без сжатия, документом |
439
444
  | `Ctrl+P` | Глобально | Информация о текущем чате (ID, участники, ссылки) |
440
445
  | `PageUp` / `Ctrl+U`| История | Прокрутка вверх / подгрузка старой истории |
441
446
  | `PageDown` / `Ctrl+D`| История | Прокрутка вниз |
447
+ | `Home` / `End` | История | В начало ленты (подгрузка истории) / к последнему сообщению |
442
448
  | `Esc` | Модальные окна | Закрыть модальное окно / отменить Reply/Edit |
443
449
  | `F1` или `?` | Глобально | Окно справки со всеми горячими клавишами |
450
+ | `F12` | Глобально | Отдать мышь терминалу для выделения текста (повторно — вернуть) |
444
451
  | `Ctrl+Q` / `Ctrl+C` | Глобально | Безопасный выход из клиента |
445
452
 
446
453
  ---
@@ -451,20 +458,53 @@ TuiGram полноценно поддерживает управление мы
451
458
 
452
459
  | Действие | Где | Результат |
453
460
  |---|---|---|
454
- | Клик | Левая / Центральная / Нижняя панель | Переключение фокуса на выбранную панель |
455
- | Клик | Диалог в списке чатов | Мгновенный выбор и открытие чата |
456
- | Клик | Вкладки `1:Все` .. `6:Непроч` | Переключение фильтра категории чатов |
457
- | Клик | Поле поиска `[/]` | Фокус в поиск с очисткой подсказки |
461
+ | Левый клик | Левая / Центральная / Нижняя панель | Переключение фокуса на выбранную панель |
462
+ | Левый клик | Диалог в списке чатов | Мгновенный выбор и открытие чата |
463
+ | Левый клик | Вкладки `1:Все` .. `6:Непроч` | Переключение фильтра категории чатов |
464
+ | Левый клик | Поле поиска `[/]` | Фокус в поиск с очисткой подсказки |
458
465
  | Колесо мыши | Список чатов / Лента сообщений | Плавная прокрутка (прокрутка вверх в ленте подгружает историю) |
459
- | Клик | Любое сообщение | Открытие меню действий (реакции, ответ, редактирование, удаление) |
460
- | Клик | Логотип 🚀 в шапке | Открытие окна справки |
461
- | Клик | Название активного чата в шапке | Открытие информации о текущем чате |
462
- | Клик | Индикатор статуса в шапке | Просмотр статуса MTProto подключения |
463
- | Клик | Контекстная плашка ввода | Сброс режима ответа/редактирования или вставка `/` |
464
- | Клик | Кнопки строки состояния | Быстрый вызов действий (`[Tab]`, `[F1]`, `[Ctrl+A]`, `[Ctrl+Q]` и др.) |
466
+ | **Левый клик** | **Сообщение в ленте** | **Выделение сообщения оно помечается полосой `▌` слева** |
467
+ | **Правый клик** | **Сообщение в ленте** | **Меню действий (реакции, ответ, редактирование, скачивание, удаление)** |
468
+ | **Левый клик** | **Превью изображения в сообщении** | **Открытие картинки на весь экран** |
469
+ | **Левый клик** | **Превью видео в сообщении** | **Воспроизведение видео в модальном плеере** |
470
+ | Левый клик | Пустое место в ленте | Переключение фокуса на ленту сообщений |
471
+ | Левый клик | Логотип 🚀 в шапке | Открытие окна справки |
472
+ | Левый клик | Название активного чата в шапке | Открытие информации о текущем чате |
473
+ | Левый клик | Индикатор статуса в шапке | Просмотр статуса MTProto подключения |
474
+ | Левый клик | Контекстная плашка ввода | Сброс режима ответа/редактирования, `[Ctrl+R]`, `[Ctrl+E]` или вставка `/` |
475
+ | Левый клик | Кнопки строки состояния | Быстрый вызов действий (`[Tab]`, `[F1]`, `[Ctrl+A]`, `[Ctrl+Q]` и др.) |
465
476
  | Клик | Мимо любого модального окна | Закрытие модального окна |
466
477
  | Клик | Кнопки в модалках | Нажатие кнопки (`[ Отправить ]`, `[ Отмена ]`, `[ Закрыть ]`, чекбоксы) |
467
478
 
479
+ ### Выделение сообщений
480
+
481
+ Левый клик выделяет сообщение: слева от всех его строк появляется цветная полоса `▌`.
482
+ Стрелки `↑` / `↓` (и `k` / `j`) в ленте двигают выделение между сообщениями и подкручивают
483
+ ленту к выбранному; дойдя до самого верхнего сообщения, клиент подгружает предыдущую
484
+ страницу истории. Прокрутка при этом остаётся на `PageUp` / `PageDown`, колесе и `Home` / `End`.
485
+
486
+ Выделенное сообщение становится целью действий: `[Enter]` и правый клик открывают меню
487
+ действий, `[Ctrl+R]` отвечает именно на него, `[Ctrl+E]` правит его (если оно ваше).
488
+ Без выделения все эти действия, как и раньше, применяются к последнему сообщению чата.
489
+
490
+ ### Просмотр изображений на весь экран
491
+
492
+ Левый клик по превью открывает изображение во весь терминал. Сначала мгновенно
493
+ показывается миниатюра, уже пришедшая вместе с сообщением, затем она заменяется
494
+ полноразмерной версией, как только та скачается. У видео и документов показывается
495
+ самая крупная миниатюра — сам файл не качается. Закрыть: `[Esc]`, `[Q]`, `[Enter]`
496
+ или клик в любом месте.
497
+
498
+ ### Правая кнопка и выделение текста терминалом
499
+
500
+ > **macOS Terminal.app** перехватывает правый клик под собственное контекстное меню и не
501
+ > передаёт его приложению. Там пользуйтесь `[Enter]` или `[Ctrl+A]` над выделенным
502
+ > сообщением. В iTerm2, Ghostty, Alacritty, Kitty и Windows Terminal правый клик работает.
503
+
504
+ Пока мышь захвачена приложением, терминал не даёт выделять текст для копирования.
505
+ Нажмите `[F12]`, чтобы временно отдать мышь терминалу, и `[F12]` ещё раз, чтобы вернуть
506
+ управление интерфейсу.
507
+
468
508
  ---
469
509
 
470
510
  ## 💬 Слэш-команды в поле ввода
@@ -548,6 +588,41 @@ IMAGE_MAX_HEIGHT=14
548
588
 
549
589
  ---
550
590
 
591
+ ## 🎬 Воспроизведение видео в псевдографике
592
+
593
+ TuiGram поддерживает воспроизведение видео и видеозаметок («кружочков») прямо в терминале с помощью символов Unicode Half-Block (`▀`) и 24-битного цвета Truecolor, с синхронным воспроизведением звуковой дорожки.
594
+
595
+ ### Установка зависимостей
596
+ Для декодирования видеопотока требуется `ffmpeg`. Установить его и активировать воспроизведение можно одной командой:
597
+ ```bash
598
+ tuigram install-video
599
+ ```
600
+ Команда проверит наличие `ffmpeg` в системе, при необходимости скачает статическую сборку в директорию данных TuiGram и выставит `ENABLE_VIDEO=true` в вашем `.env`.
601
+
602
+ ### Настройки в `.env`:
603
+ ```env
604
+ # Включение воспроизведения видео в терминале (true/false)
605
+ ENABLE_VIDEO=true
606
+
607
+ # Частота кадров при воспроизведении (FPS, 1..30, по умолчанию 15)
608
+ VIDEO_FPS=15
609
+
610
+ # Воспроизведение звуковой дорожки (true/false)
611
+ VIDEO_AUDIO=true
612
+
613
+ # Опциональные пути к бинарникам (если они не в PATH)
614
+ # FFMPEG_PATH=/usr/local/bin/ffmpeg
615
+ # FFPLAY_PATH=/usr/local/bin/ffplay
616
+ ```
617
+
618
+ ### Управление в плеере:
619
+ - Кликните по превью видео в ленте или выберите **▶️ Воспроизвести видео** в меню действий (`[Enter]` / правый клик).
620
+ - `[Пробел]` — пауза / возобновление
621
+ - `[r]` — перезапуск видео с начала
622
+ - `[Esc]` или `[q]` — закрыть плеер
623
+
624
+ ---
625
+
551
626
  ## 🌐 Прокси-сервер
552
627
 
553
628
  TuiGram поддерживает маршрутизацию MTProto-соединений через HTTP (включая HTTPS CONNECT) и SOCKS5/SOCKS4 прокси — как с авторизацией по логину и паролю, так и без неё.
@@ -586,6 +661,9 @@ TuiGram можно запускать в режиме консольных ут
586
661
  # Авторизация
587
662
  tuigram login
588
663
 
664
+ # Установка зависимостей для видео и активация в .env
665
+ tuigram install-video
666
+
589
667
  # Список диалогов
590
668
  tuigram dialogs --limit 30
591
669
 
@@ -642,13 +720,17 @@ TuiGram/
642
720
  │ │ ├── chatInfoModal.js # Окно информации о чате
643
721
  │ │ ├── actionModal.js # Меню действий с сообщением
644
722
  │ │ ├── fileModal.js # Диалог отправки файла
723
+ │ │ ├── imageViewerModal.js # Полноэкранный просмотрщик изображений
724
+ │ │ ├── videoPlayerModal.js # Модальный терминальный видеоплеер
645
725
  │ │ └── confirmModal.js # Диалог подтверждения
646
726
  │ ├── cli/
647
727
  │ │ ├── cliCommands.js # Автономные CLI команды
648
728
  │ │ ├── init.js # tuigram init / paths — настройка и диагностика
729
+ │ │ ├── videoSetup.js # tuigram install-video — установка ffmpeg и настройка
649
730
  │ │ └── formatters.js # Консольные форматтеры таблиц и логов
650
731
  │ └── utils/
651
732
  │ ├── image.js # Декодирование, масштабирование и Half-Block ANSI рендеринг изображений
733
+ │ ├── video.js # Утилиты видеоплеера, обнаружение ffmpeg и декодирование
652
734
  │ ├── storage.js # Файловые операции и сохранение сессий
653
735
  │ └── time.js # Форматирование времени и дат
654
736
  ├── scripts/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emaxe/tuigram",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "Полнофункциональный TUI & CLI клиент Telegram на Node.js на базе MTProto (teleproto)",
5
5
  "type": "module",
6
6
  "exports": {
@@ -57,6 +57,7 @@
57
57
  "menu": "./run.sh",
58
58
  "tui": "node src/index.js tui",
59
59
  "init": "node src/index.js init",
60
+ "install-video": "node src/index.js install-video",
60
61
  "login": "node src/index.js login",
61
62
  "dialogs": "node src/index.js dialogs",
62
63
  "history": "node src/index.js history",