mirror of
https://github.com/asciinema/asciinema.git
synced 2025-12-16 11:48:13 +01:00
Refactor frames module into events module
This commit is contained in:
28
asciinema/asciicast/events.py
Normal file
28
asciinema/asciicast/events.py
Normal file
@@ -0,0 +1,28 @@
|
||||
def to_relative_time(events):
|
||||
prev_time = 0
|
||||
|
||||
for frame in events:
|
||||
time, type, data = frame
|
||||
delay = time - prev_time
|
||||
prev_time = time
|
||||
yield [delay, type, data]
|
||||
|
||||
|
||||
def to_absolute_time(events):
|
||||
time = 0
|
||||
|
||||
for frame in events:
|
||||
delay, type, data = frame
|
||||
time = time + delay
|
||||
yield [time, type, data]
|
||||
|
||||
|
||||
def cap_relative_time(events, time_limit):
|
||||
if time_limit:
|
||||
return ([min(delay, time_limit), type, data] for delay, type, data in events)
|
||||
else:
|
||||
return events
|
||||
|
||||
|
||||
def adjust_speed(events, speed):
|
||||
return ([delay / speed, type, data] for delay, type, data in events)
|
||||
@@ -1,28 +0,0 @@
|
||||
def to_relative_time(frames):
|
||||
prev_time = 0
|
||||
|
||||
for frame in frames:
|
||||
time, data = frame
|
||||
delay = time - prev_time
|
||||
prev_time = time
|
||||
yield [delay, data]
|
||||
|
||||
|
||||
def to_absolute_time(frames):
|
||||
time = 0
|
||||
|
||||
for frame in frames:
|
||||
delay, data = frame
|
||||
time = time + delay
|
||||
yield [time, data]
|
||||
|
||||
|
||||
def cap_relative_time(frames, time_limit):
|
||||
if time_limit:
|
||||
return ([min(delay, time_limit), text] for delay, text in frames)
|
||||
else:
|
||||
return frames
|
||||
|
||||
|
||||
def adjust_speed(frames, speed):
|
||||
return ([delay / speed, text] for delay, text in frames)
|
||||
@@ -1,7 +1,7 @@
|
||||
import json
|
||||
import json.decoder
|
||||
|
||||
from asciinema.asciicast.frames import to_absolute_time
|
||||
from asciinema.asciicast.events import to_absolute_time
|
||||
|
||||
|
||||
try:
|
||||
@@ -27,12 +27,15 @@ class Asciicast:
|
||||
header = {k: v for k, v in self.__attrs.items() if k in keys and v is not None}
|
||||
return header
|
||||
|
||||
def events(self):
|
||||
for time, data in self.stdout():
|
||||
def __stdout_events(self):
|
||||
for time, data in self.__attrs['stdout']:
|
||||
yield [time, 'o', data]
|
||||
|
||||
def stdout(self):
|
||||
return to_absolute_time(self.__attrs['stdout'])
|
||||
def events(self):
|
||||
return self.stdout_events()
|
||||
|
||||
def stdout_events(self):
|
||||
return to_absolute_time(self.__stdout_events())
|
||||
|
||||
|
||||
class open_from_file():
|
||||
|
||||
@@ -31,10 +31,10 @@ class Asciicast:
|
||||
for line in self.__file:
|
||||
yield json.loads(line)
|
||||
|
||||
def stdout(self):
|
||||
def stdout_events(self):
|
||||
for time, type, data in self.events():
|
||||
if type == 'o':
|
||||
yield [time, data]
|
||||
yield [time, type, data]
|
||||
|
||||
|
||||
def build_from_header_and_file(header, f):
|
||||
@@ -66,7 +66,7 @@ def get_duration(path):
|
||||
with open(path, mode='rt', encoding='utf-8') as f:
|
||||
first_line = f.readline()
|
||||
with open_from_file(first_line, f) as a:
|
||||
for last_frame in a.stdout():
|
||||
for last_frame in a.stdout_events():
|
||||
pass
|
||||
return last_frame[0]
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ class CatCommand(Command):
|
||||
def execute(self):
|
||||
try:
|
||||
with asciicast.open_from_url(self.filename) as a:
|
||||
for t, text in a.stdout():
|
||||
for t, _type, text in a.stdout_events():
|
||||
sys.stdout.write(text)
|
||||
sys.stdout.flush()
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
import asciinema.asciicast.frames as frames
|
||||
import asciinema.asciicast.events as ev
|
||||
from asciinema.term import raw, read_blocking
|
||||
|
||||
|
||||
@@ -19,18 +19,18 @@ class Player:
|
||||
def _play(self, asciicast, idle_time_limit, speed, stdin):
|
||||
idle_time_limit = idle_time_limit or asciicast.idle_time_limit
|
||||
|
||||
stdout = asciicast.stdout()
|
||||
stdout = frames.to_relative_time(stdout)
|
||||
stdout = frames.cap_relative_time(stdout, idle_time_limit)
|
||||
stdout = frames.to_absolute_time(stdout)
|
||||
stdout = frames.adjust_speed(stdout, speed)
|
||||
stdout = asciicast.stdout_events()
|
||||
stdout = ev.to_relative_time(stdout)
|
||||
stdout = ev.cap_relative_time(stdout, idle_time_limit)
|
||||
stdout = ev.to_absolute_time(stdout)
|
||||
stdout = ev.adjust_speed(stdout, speed)
|
||||
|
||||
base_time = time.time()
|
||||
ctrl_c = False
|
||||
paused = False
|
||||
pause_time = None
|
||||
|
||||
for t, text in stdout:
|
||||
for t, _type, text in stdout:
|
||||
delay = t - (time.time() - base_time)
|
||||
|
||||
while stdin and not ctrl_c and delay > 0:
|
||||
|
||||
Reference in New Issue
Block a user