@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 +15 -0
- package/CHANGELOG.md +63 -1
- package/CHANGELOG.ru.md +67 -1
- package/README.md +96 -15
- package/README.ru.md +97 -15
- package/package.json +2 -1
- package/src/cli/videoSetup.js +187 -0
- package/src/config.js +6 -0
- package/src/index.js +8 -0
- package/src/state.js +31 -8
- package/src/telegram/dialogs.js +6 -2
- package/src/telegram/formatter.js +1 -1
- package/src/telegram/messages.js +182 -19
- package/src/ui/app.js +293 -73
- package/src/ui/components/chatList.js +159 -101
- package/src/ui/components/chatView.js +454 -109
- package/src/ui/components/header.js +2 -1
- package/src/ui/components/inputBox.js +14 -5
- package/src/ui/components/modals/actionModal.js +11 -14
- package/src/ui/components/modals/chatInfoModal.js +3 -13
- package/src/ui/components/modals/confirmModal.js +3 -13
- package/src/ui/components/modals/fileModal.js +6 -13
- package/src/ui/components/modals/filePickerModal.js +3 -13
- package/src/ui/components/modals/helpModal.js +14 -18
- package/src/ui/components/modals/imageViewerModal.js +172 -0
- package/src/ui/components/modals/videoPlayerModal.js +274 -0
- package/src/ui/components/statusBar.js +2 -1
- package/src/ui/modalMouse.js +43 -0
- package/src/ui/screen.js +168 -20
- package/src/ui/theme.js +1 -0
- package/src/utils/image.js +318 -14
- package/src/utils/mouse.js +62 -75
- package/src/utils/video.js +495 -0
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.
|
|
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.
|
|
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 (
|
|
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
|
|
442
|
-
| `Ctrl+E` | Chat / Input | Edit your
|
|
443
|
-
| `Ctrl+A` |
|
|
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
|
-
|
|
|
463
|
-
|
|
|
464
|
-
|
|
|
465
|
-
|
|
|
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
|
-
|
|
|
468
|
-
|
|
|
469
|
-
|
|
|
470
|
-
|
|
|
471
|
-
|
|
|
472
|
-
|
|
|
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
|
-
|
|
|
457
|
-
|
|
|
461
|
+
| Левый клик | Левая / Центральная / Нижняя панель | Переключение фокуса на выбранную панель |
|
|
462
|
+
| Левый клик | Диалог в списке чатов | Мгновенный выбор и открытие чата |
|
|
463
|
+
| Левый клик | Вкладки `1:Все` .. `6:Непроч` | Переключение фильтра категории чатов |
|
|
464
|
+
| Левый клик | Поле поиска `[/]` | Фокус в поиск с очисткой подсказки |
|
|
458
465
|
| Колесо мыши | Список чатов / Лента сообщений | Плавная прокрутка (прокрутка вверх в ленте подгружает историю) |
|
|
459
|
-
|
|
|
460
|
-
|
|
|
461
|
-
|
|
|
462
|
-
|
|
|
463
|
-
|
|
|
464
|
-
|
|
|
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
|
+
"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",
|