> termcourse: чтение и публикация на экземплярах Discourse из терминала

Это Terminal App (TUI), немного для развлечения… и на данном этапе немного экспериментальный!

:information_source: Краткое описание Терминальный интерфейс для просмотра и публикации на форумах Discourse со списками тем, полным просмотром тем, ответами, лайками, поиском и встроенным редактором.
:hammer_and_wrench: Ссылка на репозиторий GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: Руководство по установке README.md в репозитории (раздел Quickstart)
:heart: Спонсорство Пожалуйста, рассмотрите возможность стать постоянным спонсором моей работы с открытым исходным кодом (Sponsor @merefield on GitHub Sponsors · GitHub) на уровне, соответствующем вашим возможностям и потребностям вашей организации, чтобы этот проект получил должное обслуживание и продолжал работать на вашем сайте в будущем.

Нравится termcourse? Пожалуйста, поставьте ему :star: на GitHub

Обзор

> termcourse — это клиент для Discourse, работающий в терминале. Он ведет себя как легковесная браузерная сессия с входом по куки (имя пользователя/электронная почта + пароль) и поддерживает TOTP/резервные коды для MFA. Также предусмотрен запасной вариант с использованием API-ключа для сайтов с ограниченным доступом или только с SSO.

Возможности

  • Просмотр списков тем: Последние / Популярные / Новые / Непрочитанные / Топ с циклическим переключением периода для Топ.
  • Открытие тем стрелками + Enter или цифровыми горячими клавишами (1-0) для первых 10 видимых тем.
  • Просмотр полных тем с прокручиваемыми постами, закрепленными заголовком/подвалом и индикатором позиции/прогресса поста.
  • Развертывание выбранных постов на полный контент; не выбранные посты показывают компактные выдержки.
  • Ответы на целые темы или конкретные посты.
  • Создание новых тем с заголовком, выбором категории и встроенным редактором тела.
  • Лайк/дизлайк постов с визуальным состоянием сердца для каждого поста.
  • Поиск по постам и прямой переход к соответствующему контексту темы/поста.
  • Встроенный редактор поддерживает перемещение курсора, вставку, новые строки, удаление символа и живой счетчик минимальной длины.
  • Рендеринг с учетом Markdown, включая обернутые ссылки и предварительный просмотр встроенных изображений (chafa / viu).
  • Замена эмодзи для распространенных токенов :emoji: и улыбок в стиле :).
  • Поддержка учетных данных для нескольких сайтов через переменные окружения и per-host credentials.yml (с запросом недостающих полей входа).
  • Вход по имени пользователя/паролю через куки-сессию с поддержкой MFA (TOTP + резервный код), плюс запасной вариант с API-ключом.
  • Темизация на основе YAML с встроенными темами (default, slate, fairground) и локальными переопределениями через theme.yml.
  • Реактивная перерисовка при изменении размера с настраиваемым интервалом опроса (TERMCOURSE_TICK_MS).
  • Опциональное логирование отладки для HTTP/авторизации и диагностики рендеринга UI.

Быстрый старт

См. актуальный README для получения дополнительной информации

git clone https://github.com/merefield/termcourse
cd termcourse
bundle install

Имя пользователя/пароль (рекомендуется)

bundle exec bin/termcourse ваш.discourse.host

Запасной вариант с API-ключом

DISCOURSE_API_KEY="ваш_key" DISCOURSE_API_USERNAME="ваш_username" 
bundle exec bin/termcourse ваш.discourse.host

Примечания по авторизации

  • Вход по имени пользователя/паролю использует обычную сессию в стиле браузера.
  • Поддерживается MFA для TOTP и резервных кодов.
  • Поддерживаются API-ключи как запасной вариант.

Безопасность

  • Учетные данные не сохраняются; куки хранятся только в памяти.
  • Использование переменных окружения или ответ на предоставленный запрос позволяет избежать записи паролей в истории оболочки.
  • Логирование включается по желанию и отключено по умолчанию.

Ограничения

  • Некоторые сайты несовместимы с входом по имени пользователя/паролю, так как запрещают сценарные удаленные потоки входа.
  • Работает в терминале

Благодарности

Частично вдохновлено Dumbcourse – Old-browser friendly UI at /dumb (D-pad + small screens) :clap:

23 лайка

Теперь вы можете быстро входить в систему на нескольких сайтах (очевидно, по одной сессии за вкладку). Я внес следующие улучшения:

Улучшения аутентификации и конфигурации termcourse

  • Вход по имени пользователя и паролю теперь является путем по умолчанию.
  • Вам больше не нужно указывать https:// — это опционально.
  • Отсутствующие поля для входа запрашиваются интерактивно (например: имя пользователя известно, пароль отсутствует).
  • Справка CLI включает основные переменные окружения и расположение файлов отладочных логов.

Учетные данные и поведение ENV

  • Поддерживается файл учетных данных с сопоставлением по хосту с порядком поиска:
    1. TERMCOURSE_CREDENTIALS_FILE (если задан)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • Приоритет аутентификации:
    1. Флаги CLI
    2. Учетные данные хоста из YAML
    3. Общие переменные окружения DISCOURSE_*
    4. Интерактивный запрос
  • Для аутентификации: при входе отсутствующие значения имени пользователя или пароля запрашиваются.
  • Для аутентификации по API как имя пользователя API, так и ключ должны иметь непустые значения.

Отладка

  • Отладка HTTP/аутентификации: TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • Отладка рендеринга UI: TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

Чистота репозитория

  • Добавлены файлы credentials.example.yml и .env.example с согласованными примерами.
  • Добавлены записи в .gitignore для локальных файлов с секретами:
    • .env
    • credentials.yml
3 лайка

Это довольно низкоуровневое решение, но оно работает.

Вам нужно установить viu или chafa — а это уже может стать отдельным проектом :slight_smile:

В режиме высокого качества с chafa или с viu, Windows Terminal превосходит терминал macOS, так как поддерживает гораздо больше цветов (спасибо Microsoft!)

Примечания к выпуску: Рендеринг изображений (в терминале!)

Рендеринг изображений

  • Добавлены встроенные превью изображений в постах с выбором бэкенда:
    • Автоматически сначала пробует chafa, затем viu.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: консервативный вывод для стабильности терминала.
    • quality: рендеринг символов с более высокой детализацией и цветопередачей.
  • Добавлен контроль высоты превью:
    • TERMCOURSE_IMAGE_LINES (по умолчанию: 14)
    • Применяется к высоте строки превью; полезно для настройки визуальной плотности.
  • Улучшено поведение соотношения сторон в viu:
    • Переход к рендерингу, ориентированному на строки (-h), для лучшего сохранения соотношения сторон.
  • Добавлены элементы управления фильтрами качества превью:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 фильтрует шумные превью, состоящие только из блоков.
    • Установите значение 0, чтобы всегда показывать вывод рендерера.
  • Добавлен предел безопасности для загрузки изображений:
    • TERMCOURSE_IMAGE_MAX_BYTES (по умолчанию: 5242880)
    • Предотвращает влияние загрузок изображений чрезмерного размера на производительность.
  • Добавлена поддержка ссылок на изображения Discourse вида upload://…:
    • Автоматическое преобразование в /uploads/short-url/…
  • Улучшена очистка и стабильность терминала:
    • Сохраняет необходимые валидные SGR-коды цветов.
    • Удаляет дестабилизирующие управляющие и графические последовательности.
    • Предотвращает отображение фрагментов ANSI-escape-последовательностей как обычного текста.

Примечание: Я обнаружил один сайт, который блокирует удаленное использование имени пользователя и пароля, поэтому этот клиент не будет работать в такой ситуации (если только вы не являетесь владельцем сайта и не можете настроить API-ключ!). Предложения приветствуются, но на данный момент поддержка в таких случаях отсутствует.

Я не уверен, что буду использовать это в реальной жизни, я не вижу для себя пользы, но я попробовал, и это восхитительно. Мне нравится возможность взаимодействовать с форумной платформой нового поколения через примитивный, «голый» интерфейс.

В каком-то смысле это очень эстетично.

1 лайк

Спасибо!

Да, я думаю, что это может оказаться полезным в следующих случаях:

  • вы работаете на платформе с низким разрешением
  • возитесь с Raspberry Pi (пока не протестировано, к сведению)
  • с сервера проверяете, что всё работает…
  • … или если фронтенд-код падает! :smiley:
  • для сайта на Discourse, который в основном текстовый…
  • … и просто из технического любопытства :nerd_face:

Я собирался протестировать это на телефоне с Terminus…

3 лайка

OK, вероятно, последнее обновление на сегодня:

  • интерфейс теперь адаптируется к изменению размера окна :tada:
  • улучшены инструкции в верхней панели
  • клавиши 1–9 и 0 теперь открывают соответствующие темы в списке

Не забудьте выполнить git pull, чтобы получить обновления.

3 лайка

Черт, теперь мне надо заняться своим ASCII-артом!!
¯(ツ)

3 лайка

Я добавил полностью настраиваемую систему темизации, вот тема «fairground»:

… а вот тема «slate»:

… и вот тема «rust»:

Детали в README :graduation_cap:

5 лайков

Вот и поехали, ребята, несколько сочных :tangerine: обновлений:

  • добавлена поддержка личных сообщений — дважды нажмите F :tada: (на данном этапе только список, просмотр и ответ, создание нового ЛС пока не доступно)
  • добавлены дополнительные столбцы для категории, пользователей и просмотров, которые появляются по мере расширения ширины
  • улучшена тема для вертикальных разделителей
  • обновлён README

2 лайка

Я объединил это вчера:

  • Если вы приложите усилия для установки chafa или viu, вы теперь будете вознаграждены новой функцией: переключатель «полноэкранное окно» для изображений в постах. В Windows это особенно полезно благодаря широкой поддержке глубины цвета в приложении Windows Terminal.

Теперь в строке состояния списка тем в termcourse отображается всплывающее уведомление о непрочитанных личных сообщениях, и, как и в браузере, уведомления о прочтении отправляются по каждому сообщению по мере перемещения курсора.

2 лайка

Я объединил исправления для тем в macOS

2 лайка

Неплохо… Работает ли это на Пип-бое?

3 лайка

Не стесняйтесь сделать PR или поделиться кодами цветов, и я добавлю их в пример themes.yml :slight_smile:

2 лайка

Отлично! Объединено, спасибо!

2 лайка

Рендеринг был не очень хорошим… поэтому я его исправил… теперь интерфейс использует «рендеринг различий», что делает его намного быстрее и плавнее… он больше не перерисовывает весь экран при каждом движении курсора. :sweat_smile:

Пока я тестировал это только в Windows, поэтому, пожалуйста, сообщайте о любых проблемах — но это должно значительно помочь более медленным системам.

Я также добавил несколько тестов и GitHub CI! (и это супер быстро, потому что используется minitest)

Теперь реализована система уведомлений в реальном времени на базе MessageBus, которая сообщает о новых обновлениях в списке тем в строке состояния (так что вы можете нажать g для обновления):

Скорее всего, следующим шагом будет работа над значками прочтения тем…

Это здорово!

Почему бы не использовать те же сочетания клавиш, что и в Discourse? Так опыт будет более бесшовным :slight_smile:

1 лайк

Неплохая идея… Определённо стоит попробовать на каком-то этапе, чтобы посмотреть, можно ли разумно сблизить подходы :+1:… но, конечно, есть существенные различия в форматах, поэтому некоторые вещи могут остаться разными.

1 лайк