Giter Club home page Giter Club logo

avt's Introduction

asciinema

Build Status license

asciinema (aka asciinema CLI or asciinema recorder) is a command-line tool for recording terminal sessions.

Unlike typical screen recording software, which records visual output of a screen into a heavyweight video files (.mp4, .mov), asciinema recorder runs inside a terminal, capturing terminal session output into a lightweight recording files in the asciicast format (.cast).

The recordings can be replayed in a terminal, embedded on a web page with the asciinema player, or published to an asciinema server, such as asciinema.org, for further sharing.

asciinema CLI demo

Notable features:

To record a session run this command in your shell:

asciinema rec demo.cast

To stream a session via built-in HTTP server run:

asciinema stream --serve

To stream a session via a relay (asciinema server) run:

asciinema stream --relay

Check out the Getting started guide for installation and usage overview.

Building

Building asciinema from source requires the Rust compiler (1.70 or later), and the Cargo package manager. If they are not available via your system package manager then use rustup.

To download the source code, build the asciinema binary, and install it in $HOME/.cargo/bin run:

cargo install --locked --git https://github.com/asciinema/asciinema

Then, ensure $HOME/.cargo/bin is in your shell's $PATH.

Alternatively, you can manually download the source code and build the asciinema binary with:

git clone https://github.com/asciinema/asciinema
cd asciinema
cargo build --release

This produces the binary in release mode (--release) at target/release/asciinema. You can just copy the binary to a directory in your $PATH.

To generate man pages and shell completion files, set ASCIINEMA_GEN_DIR to the path where these artifacts should be stored. For example:

ASCIINEMA_GEN_DIR=/foo cargo build --release

The above command will build the binary and place the man pages in /foo/man/, and the shell completion files in the /foo/completion/ directory.

Note

Windows is currently not supported. (See #467)

Development

This branch contains the next generation of the asciinema CLI, written in Rust (about the rewrite). It is still in a work-in-progress stage, so if you wish to propose any code changes, please first reach out to the team via forum, Matrix or IRC.

The previous generation of the asciinema CLI, written in Python, can be found in the main branch.

Donations

Sustainability of asciinema development relies on donations and sponsorships.

Please help the software project you use and love. Become a supporter or a corporate sponsor.

asciinema is sponsored by:

Consulting

If you're interested in integration or customization of asciinema to suit your needs, check asciinema consulting services.

License

© 2011 Marcin Kulik.

All code is licensed under the GPL, v3 or later. See LICENSE file for details.

avt's People

Contributors

ku1ik avatar viktomas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

avt's Issues

support for OSC 4

hi!

i've been messing around with OSC 4 sequences lately to change the terminal's color palette on the fly. i noticed asciinema doesn't support it

it's kinda difficult to find good documentation for these sequences, but the best i've seen so far is https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands

i created a short demo:

{"version":2,"width":50,"height":28,"timestamp":1709462310,"env":{"TERM":"tmux-256color","SHELL":"/usr/bin/zsh"}}
[0.107432, "o", "\u001b]2;applesauce\u001b\\"]
[0.140703, "o", "\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[38;5;242msarah\u001b[39m\u001b[38;5;242m@applesauce\u001b[39m \u001b[34m~\u001b[39m\r\n\r\u001b[35m❯\u001b[39m \u001b[K"]
[0.140784, "o", "\u001b[?1h\u001b="]
[0.141187, "o", "\u001b[?2004h"]
[0.92006, "o", "\u001b[32mc\u001b[39m"]
[0.924449, "o", "\b\u001b[32mc\u001b[39m\u001b[90mlear\u001b[39m\b\b\b\b"]
[1.010068, "o", "\b\u001b[1m\u001b[31mc\u001b[1m\u001b[31mu\u001b[0m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \b\b\b"]
[1.013263, "o", "\u001b[90mrl -LN party.hotdogstand.lol\u001b[39m\u001b[28D"]
[1.13193, "o", "\b\b\u001b[1m\u001b[31mc\u001b[1m\u001b[31mu\u001b[1m\u001b[31mr\u001b[0m\u001b[39m"]
[1.243904, "o", "\b\b\b\u001b[0m\u001b[32mc\u001b[0m\u001b[32mu\u001b[0m\u001b[32mr\u001b[32ml\u001b[39m"]
[1.589589, "o", "\u001b[39m \u001b[39m-\u001b[39mL\u001b[39mN\u001b[39m \u001b[39mp\u001b[39ma\u001b[39mr\u001b[39mt\u001b[39my\u001b[39m.\u001b[39mh\u001b[39mo\u001b[39mt\u001b[39md\u001b[39mo\u001b[39mg\u001b[39ms\u001b[39mt\u001b[39ma\u001b[39mn\u001b[39md\u001b[39m.\u001b[39ml\u001b[39mo\u001b[39ml"]
[1.984949, "o", "\u001b[?1l\u001b>"]
[1.990999, "o", "\u001b[?2004l"]
[1.991892, "o", "\r\r\n"]
[2.050787, "o", "\u001b]4;0;#ff0000\u001b\\\u001b]4;1;#ffff00\u001b\\\u001b]4;2;#ffff00\u001b\\\u001b]4;3;#ffff00\u001b\\\u001b]4;4;#ffff00\u001b\\\u001b]4;5;#ffff00\u001b\\\u001b]4;6;#ffff00\u001b\\\u001b]4;7;#ffff00\u001b\\\u001b]4;8;#ffff00\u001b\\\u001b]4;9;#ffff00\u001b\\\u001b]4;10;#ffff00\u001b\\\u001b]4;11;#ffff00\u001b\\\u001b]4;12;#ffff00\u001b\\\u001b]4;13;#ffff00\u001b\\\u001b]4;14;#ffff00\u001b\\\u001b]4;15;#ffff00\u001b\\\u001b]10;#ffff00\u001b\\\u001b]11;#ff0000\u001b\\\u001b]12;#ffff00\u001b\\\u001b]13;#ffff00\u001b\\\u001b]17;#ffff00\u001b\\\u001b]19;#ff0000\u001b\\\u001b]4;232;#ff0000\u001b\\\u001b]4;256;#ffff00\u001b\\\u001b]708;#ff0000\u001b\\"]
[3.051149, "o", "\u001b]4;0;#ffff00\u001b\\\u001b]4;1;#ff0000\u001b\\\u001b]4;2;#ff0000\u001b\\\u001b]4;3;#ff0000\u001b\\\u001b]4;4;#ff0000\u001b\\\u001b]4;5;#ff0000\u001b\\\u001b]4;6;#ff0000\u001b\\\u001b]4;7;#ff0000\u001b\\\u001b]4;8;#ff0000\u001b\\\u001b]4;9;#ff0000\u001b\\\u001b]4;10;#ff0000\u001b\\\u001b]4;11;#ff0000\u001b\\\u001b]4;12;#ff0000\u001b\\\u001b]4;13;#ff0000\u001b\\\u001b]4;14;#ff0000\u001b\\\u001b]4;15;#ff0000\u001b\\\u001b]10;#ff0000\u001b\\\u001b]11;#ffff00\u001b\\\u001b]12;#ff0000\u001b\\\u001b]13;#ff0000\u001b\\\u001b]17;#ff0000\u001b\\\u001b]19;#ffff00\u001b\\\u001b]4;232;#ffff00\u001b\\\u001b]4;256;#ff0000\u001b\\\u001b]708;#ffff00\u001b\\"]
[4.05504, "o", "\u001b]4;0;#ff0000\u001b\\\u001b]4;1;#ffff00\u001b\\\u001b]4;2;#ffff00\u001b\\\u001b]4;3;#ffff00\u001b\\\u001b]4;4;#ffff00\u001b\\\u001b]4;5;#ffff00\u001b\\\u001b]4;6;#ffff00\u001b\\\u001b]4;7;#ffff00\u001b\\\u001b]4;8;#ffff00\u001b\\\u001b]4;9;#ffff00\u001b\\\u001b]4;10;#ffff00\u001b\\\u001b]4;11;#ffff00\u001b\\\u001b]4;12;#ffff00\u001b\\\u001b]4;13;#ffff00\u001b\\\u001b]4;14;#ffff00\u001b\\\u001b]4;15;#ffff00\u001b\\\u001b]10;#ffff00\u001b\\\u001b]11;#ff0000\u001b\\\u001b]12;#ffff00\u001b\\\u001b]13;#ffff00\u001b\\\u001b]17;#ffff00\u001b\\\u001b]19;#ff0000\u001b\\\u001b]4;232;#ff0000\u001b\\\u001b]4;256;#ffff00\u001b\\\u001b]708;#ff0000\u001b\\"]
[5.052719, "o", "\u001b]4;0;#ffff00\u001b\\\u001b]4;1;#ff0000\u001b\\\u001b]4;2;#ff0000\u001b\\\u001b]4;3;#ff0000\u001b\\\u001b]4;4;#ff0000\u001b\\\u001b]4;5;#ff0000\u001b\\\u001b]4;6;#ff0000\u001b\\\u001b]4;7;#ff0000\u001b\\\u001b]4;8;#ff0000\u001b\\\u001b]4;9;#ff0000\u001b\\\u001b]4;10;#ff0000\u001b\\\u001b]4;11;#ff0000\u001b\\\u001b]4;12;#ff0000\u001b\\\u001b]4;13;#ff0000\u001b\\\u001b]4;14;#ff0000\u001b\\\u001b]4;15;#ff0000\u001b\\\u001b]10;#ff0000\u001b\\\u001b]11;#ffff00\u001b\\\u001b]12;#ff0000\u001b\\\u001b]13;#ff0000\u001b\\\u001b]17;#ff0000\u001b\\\u001b]19;#ffff00\u001b\\\u001b]4;232;#ffff00\u001b\\\u001b]4;256;#ff0000\u001b\\\u001b]708;#ffff00\u001b\\"]
[6.053719, "o", "\u001b]4;0;#ff0000\u001b\\\u001b]4;1;#ffff00\u001b\\\u001b]4;2;#ffff00\u001b\\\u001b]4;3;#ffff00\u001b\\\u001b]4;4;#ffff00\u001b\\\u001b]4;5;#ffff00\u001b\\\u001b]4;6;#ffff00\u001b\\\u001b]4;7;#ffff00\u001b\\\u001b]4;8;#ffff00\u001b\\\u001b]4;9;#ffff00\u001b\\\u001b]4;10;#ffff00\u001b\\\u001b]4;11;#ffff00\u001b\\\u001b]4;12;#ffff00\u001b\\\u001b]4;13;#ffff00\u001b\\\u001b]4;14;#ffff00\u001b\\\u001b]4;15;#ffff00\u001b\\\u001b]10;#ffff00\u001b\\\u001b]11;#ff0000\u001b\\\u001b]12;#ffff00\u001b\\\u001b]13;#ffff00\u001b\\\u001b]17;#ffff00\u001b\\\u001b]19;#ff0000\u001b\\\u001b]4;232;#ff0000\u001b\\\u001b]4;256;#ffff00\u001b\\\u001b]708;#ff0000\u001b\\"]
[6.286387, "o", "^C"]
[6.289531, "o", "\r\n"]
[6.322799, "o", "\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[38;5;242msarah\u001b[39m\u001b[38;5;242m@applesauce\u001b[39m \u001b[34m~\u001b[39m\r\n\r\u001b[31m❯\u001b[39m \u001b[K"]
[6.322841, "o", "\u001b[?1h\u001b="]
[6.323225, "o", "\u001b[?2004h"]
[6.638575, "o", "\u001b[?2004l\r\r\n"]

the expected behavior is this (i rendered this gif from the demo using gifcast, which uses xterm.js for rendering)

Spoiler because it's quite obnoxious lol

download

since this is likely a very low priority feature (understandably), i did some digging on my own to see if i could make it work. i was able to hack together some code to parse the sequences, but i got stumped when it came to actually updating the colors in the palette. i messed around with updating the pen's colors, but i couldn't find a way to refresh the entire screen.

i mostly just wanted to document my exploration here. if you can nudge me in the right direction, i might be able to put up a pull request in the future. cheers!

Cursor save/restore support

Missing support of ^[[s and ^[[u

Esc[s | Save Cursor Position:Saves the current cursor position. You can move the cursor to the
saved cursor position by using the Restore Cursor Position sequence.

Esc[u | Restore Cursor Position:Returns the cursor to the position stored by the Save Cursor
Position sequence.

source: http://ascii-table.com/ansi-escape-sequences.php

Expected:
saverestore
(sorry for the flicking the compositor doesn't play well with ffmpeg)

Result:
https://asciinema.org/a/RNErRy31cukXPdOTt9dkagbic

Colons in SGR sequences are not recognized

From https://wezfurlong.org/wezterm/escape-sequences.html#graphic-rendition-sgr (WezTerm):

There are a handful of additional SGR codes that allow setting extended colors; unlike the codes above, which are activated by a single numeric parameter out of SGR sequence, these the extended color codes require multiple parameters. The canonical representation of these sequences is to have the multiple parameters be separated by colons (:), but for compatibility reasons WezTerm also accepts an ambiguous semicolon (;) separated variation. The colon form is unambiguous and should be preferred; the semicolon form should not be used by new applications and is not documented here in the interest of avoiding accidental new implementations.

Programs running in Kitty terminal also tend to use : instead of ; for RGB color encoding.

Related issue in player exposing this problem: asciinema/asciinema-player#231

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.