Add asciinema cat command

This commit is contained in:
Marcin Kulik
2017-11-18 16:57:13 +01:00
parent 45cdf41691
commit d8fab1e74d
4 changed files with 54 additions and 0 deletions

View File

@@ -178,6 +178,14 @@ NOTE: it is recommended to run `asciinema play` in a terminal of dimensions not
smaller than the one used for recording as there's no "transcoding" of control smaller than the one used for recording as there's no "transcoding" of control
sequences for new terminal size. sequences for new terminal size.
### `cat <filename>`
__Print full output of recorded asciicast to a terminl.__
While `asciinema play <filename>` replays the recorded session using timing
information saved in the asciicast, `asciinema cat <filename>` dumps the full
output (including all escape sequences) to a terminal immediately.
### `upload <filename>` ### `upload <filename>`
__Upload recorded asciicast to asciinema.org site.__ __Upload recorded asciicast to asciinema.org site.__

View File

@@ -8,6 +8,7 @@ import asciinema.config as config
from asciinema.commands.auth import AuthCommand from asciinema.commands.auth import AuthCommand
from asciinema.commands.record import RecordCommand from asciinema.commands.record import RecordCommand
from asciinema.commands.play import PlayCommand from asciinema.commands.play import PlayCommand
from asciinema.commands.cat import CatCommand
from asciinema.commands.upload import UploadCommand from asciinema.commands.upload import UploadCommand
from asciinema.api import Api from asciinema.api import Api
@@ -29,6 +30,10 @@ def play_command(args, config):
return PlayCommand(args.filename, args.idle_time_limit, args.speed) return PlayCommand(args.filename, args.idle_time_limit, args.speed)
def cat_command(args, config):
return CatCommand(args.filename)
def upload_command(args, config): def upload_command(args, config):
api = Api(config.api_url, os.environ.get("USER"), config.api_token) api = Api(config.api_url, os.environ.get("USER"), config.api_token)
return UploadCommand(api, args.filename) return UploadCommand(api, args.filename)
@@ -67,6 +72,8 @@ def main():
\x1b[1masciinema play demo.cast\x1b[0m \x1b[1masciinema play demo.cast\x1b[0m
Replay terminal recording hosted on asciinema.org: Replay terminal recording hosted on asciinema.org:
\x1b[1masciinema play https://asciinema.org/a/difqlgx86ym6emrmd8u62yqu8\x1b[0m \x1b[1masciinema play https://asciinema.org/a/difqlgx86ym6emrmd8u62yqu8\x1b[0m
Print full output of recorded session:
\x1b[1masciinema cat demo.cast\x1b[0m
For help on a specific command run: For help on a specific command run:
\x1b[1masciinema <command> -h\x1b[0m""", \x1b[1masciinema <command> -h\x1b[0m""",
@@ -97,6 +104,11 @@ For help on a specific command run:
parser_play.add_argument('filename', help='local path, http/ipfs URL or "-" (read from stdin)') parser_play.add_argument('filename', help='local path, http/ipfs URL or "-" (read from stdin)')
parser_play.set_defaults(func=play_command) parser_play.set_defaults(func=play_command)
# create the parser for the "cat" command
parser_cat = subparsers.add_parser('cat', help='Print full output of terminal session')
parser_cat.add_argument('filename', help='local path, http/ipfs URL or "-" (read from stdin)')
parser_cat.set_defaults(func=cat_command)
# create the parser for the "upload" command # create the parser for the "upload" command
parser_upload = subparsers.add_parser('upload', help='Upload locally saved terminal session to asciinema.org') parser_upload = subparsers.add_parser('upload', help='Upload locally saved terminal session to asciinema.org')
parser_upload.add_argument('filename', help='filename or path of local recording') parser_upload.add_argument('filename', help='filename or path of local recording')

24
asciinema/commands/cat.py Normal file
View File

@@ -0,0 +1,24 @@
import sys
from asciinema.commands.command import Command
import asciinema.asciicast as asciicast
class CatCommand(Command):
def __init__(self, filename):
Command.__init__(self)
self.filename = filename
def execute(self):
try:
with asciicast.open_from_url(self.filename) as a:
for t, text in a.stdout():
sys.stdout.write(text)
sys.stdout.flush()
except asciicast.LoadError as e:
self.print_error("Printing failed: %s" % str(e))
return 1
return 0

View File

@@ -35,6 +35,16 @@ asciinema play -s 5 tests/demo.cast
asciinema play -s 5 -i 0.2 tests/demo.cast asciinema play -s 5 -i 0.2 tests/demo.cast
cat tests/demo.cast | asciinema play -s 5 - cat tests/demo.cast | asciinema play -s 5 -
# test cat command
# asciicast v1
asciinema cat tests/demo.json
cat tests/demo.json | asciinema cat -
# asciicast v2
asciinema cat tests/demo.cast
cat tests/demo.cast | asciinema cat -
# test rec command # test rec command
asciinema rec -c who "$TMP_DATA_DIR/1.cast" asciinema rec -c who "$TMP_DATA_DIR/1.cast"