Unlaw 3.12.2: игры и студия записи в ul desk, новый ul capture

Что я сделал в Unlaw с 3.11.0 по 3.12.2. Игры в браузере с общими рекордами, переписанная с нуля запись экрана, камеры и звука, студия в духе OBS и большой разбор ошибок.

Вышел Unlaw 3.12.2. Ниже всё, что я сделал в релизах 3.11.0–3.12.2. Обновиться можно командой ul update.

3.11.0: игры в ul desk

  • Во вкладке Games в ul desk теперь можно играть во все игры из ul game: Tetris, Snake, Minesweeper, Space Invaders и Chomp. Работают клавиатура и мышь.
  • Отдельную копию игр для браузера я писать не стал. Desk запускает те же терминальные игры через ul game --stream, а страница только рисует картинку.
  • Поэтому и рекорды общие: терминал и браузер пишут в один файл, рекорд из браузера виден в терминале и наоборот.
  • Если уйти со вкладки или свернуть страницу, игра встаёт на паузу.
  • Заодно переделал дизайн desk: вкладки Board / Today / Stats / Games / Studio (клавиши 1–5), поиск, справка по клавише ?.

3.12.0: новый ul capture

Команды для скриншотов и записи экрана я переписал с нуля. Хотел, чтобы в них разобрался любой пользователь.

  • ul capture без аргументов открывает меню, где действие выбирается номером.
  • Скриншоты: весь экран, область или окно. Можно выбрать дисплей, задержку или сразу скопировать в буфер обмена.
  • Запись: экран со звуком Mac и микрофоном, экран с камерой в углу, только камера, только аудио (m4a, mp3, wav).
  • Звук Mac пишется без BlackHole и других виртуальных драйверов.
  • Пауза и продолжение: куски записи склеиваются в один файл без перекодирования.
  • --duration 30 пишет ровно 30 секунд с таймером в терминале и сразу сохраняет.
  • Библиотека: список записей, открыть, показать в Finder, скопировать, удалить в Корзину, обрезать, конвертировать (MP4, GIF, MP3 и другие).
  • ul capture devices показывает дисплеи, камеры и микрофоны и предупреждает, если вместо микрофона выбрано виртуальное устройство.
  • Камеру и микрофон можно выбрать по имени. default берёт то, что выбрано в системе, так что номера устройств помнить не нужно.
  • Старые команды (ul capture screenshot, area, screen, audio) я оставил, они работают как раньше.
  • Файлы никогда не перезаписываются.

3.12.0: Studio в ul desk

Поверх ul capture я собрал вкладку Studio, маленькую студию записи в духе OBS.

  • Четыре режима: экран, экран с камерой, камера, аудио. Выбор дисплея, камеры, микрофона и формата.
  • Большая кнопка записи (r), пауза (p) и таймер.
  • Скриншоты экрана, области или окна прямо со страницы.
  • Превью экрана, камеры и уровня микрофона.
  • Библиотека с миниатюрами: видео и аудио играют прямо на странице, с перемоткой, обрезкой, конвертацией и удалением.
  • Индикатор REC виден на любой вкладке.
  • Запись, начатая в терминале, видна в браузере, и наоборот. Если закрыть страницу, запись продолжается.

3.12.1: быстрее и с волной звука

  • Запись теперь стартует почти вдвое быстрее: 0,8 с вместо 1,3–1,8 с (замерял на своём MacBook Pro M3 Pro).
  • Кнопка реагирует мгновенно, таймер больше не убегает вперёд.
  • Пока идёт запись, превью экрана ставится на паузу, чтобы не тормозить запись.
  • Волна звука, как в Voice Memos. Во время записи она бежит в реальном времени, записываемая часть красная. В просмотре файла видна волна всей записи: по ней можно кликнуть для перемотки и отметить кусок для обрезки.
  • ul capture wave рисует ту же волну символами прямо в терминале.
  • Если сохранение не удалось, куски записи больше не теряются, а ul capture stop пробует ещё раз.

3.12.2: разбор ошибок

После стольких новых функций я устроил полный аудит проекта и нашёл 28 проблем. Все исправил, вот самые важные.

  • Безопасность. Чужой сайт больше не может отправить задачу локальному серверу моделей ul lm через служебный адрес.
  • Агент. Добавление задач и напоминаний теперь требует подтверждения, как и любое другое изменение. Файл из Telegram с хитрым именем больше не может сохраниться за пределами папки загрузок.
  • Команды с таймаутом (core.command_timeout) завершают и свои дочерние процессы, а команды, которые ждут ввода с клавиатуры, больше не зависают.
  • Игры. Рекорд сохраняется сразу после конца игры, а не после экрана «GAME OVER», так что закрытая вкладка его больше не теряет.
  • Запись. Если рекордер упал (отключили дисплей или устройство), записанное сохраняется сразу. Ctrl+C во время сохранения больше не оставляет запись в состоянии «сохраняется». Сломанные миниатюры не застревают в кэше.
  • Редактор ule не портит файлы в неизвестной кодировке и не перезаписывает молча чужие изменения файла.
  • ul zip правильно распаковывает .tar.zst и не путает с опциями файлы, имя которых начинается с -.
  • ul tg download не скачивает файл повторно, если он уже лежит как name 2.ext.

На все исправления я написал тесты: 487 тестов на Python и около 270 на Rust. Тесты не трогают настоящие устройства, сеть и личные настройки.

Что не изменилось

Я ничего не удалял, старые команды и конфиги работают. Команды, которые вы отредактировали вручную, обновление не трогает, а нетронутые обновляются сами.

Дальше

Студию буду развивать, пока пользуюсь ей сам. Следующие крупные планы: локальная модель ul lm laya и память агента.

← Все посты