from os import makedirs from os.path import exists, join from tempfile import TemporaryFile from time import strftime from pygame.image import tostring, frombuffer, save from pygame.time import get_ticks from GameChild import GameChild class VideoRecorder(GameChild): def __init__(self, parent): GameChild.__init__(self, parent) self.display_surface = self.get_display_surface() self.delegate = self.get_delegate() self.load_configuration() self.reset() self.subscribe(self.respond) def load_configuration(self): config = self.get_configuration("video-recordings") self.root = config["path"] self.directory_name_format = config["directory-name-format"] self.file_extension = config["file-extension"] self.frame_format = config["frame-format"] self.framerate = config["framerate"] def reset(self): self.recording = False self.frame_length = None self.frames = None self.last_frame = 0 def respond(self, event): compare = self.delegate.compare if compare(event, "record-video"): self.toggle_record() elif compare(event, "reset-game"): self.reset() def toggle_record(self): recording = not self.recording if recording: self.frame_length = len(self.get_string()) self.frames = TemporaryFile() else: self.write_frames() self.recording = recording def get_string(self): return tostring(self.display_surface, self.frame_format) def write_frames(self): root = join(self.root, strftime(self.directory_name_format)) if not exists(root): makedirs(root) size = self.display_surface.get_size() frames = self.frames frames.seek(0) for ii, frame in enumerate(iter(lambda: frames.read(self.frame_length), "")): path = join(root, "%04i.png" % ii) save(frombuffer(frame, size, self.frame_format), path) print "wrote video frames to " + root def update(self): ticks = get_ticks() if self.recording and ticks - self.last_frame >= self.framerate: self.frames.write(self.get_string()) self.last_frame = ticks