def preprocess(self, data): """ Processes popcorn JSON and builds a sane data model out of it @param data : The popcorn editor project json blob """ print 'Beginning pre-process...' for url, video in data['media'][0]['clipData'].iteritems(): print 'Downloading {0}.'.format(url) video['title'] = video['title'].replace(' ', '-') + '.webm' urllib.urlretrieve(url, video['title']) print 'Finished download!' print 'All videos downloaded.' events = [event for track in data['media'][0]['tracks'] for event in track['trackEvents']] for event in events: if event['type'] == 'skip' or event['type'] == 'loop': edit = TrackEdit(event['type'], event['popcornOptions']) self.track_edits.append(edit) if event['type'] == 'text' or event['type'] == 'image': item = TrackItem(event['type'], event['popcornOptions']) item.options['start_stamp'] = \ item.options['start'] item.options['end_stamp'] = \ item.options['end'] item.options['x_px'] = percent_to_px( item.options['left'], self.size[0] ) item.options['y_px'] = percent_to_px( item.options['top'], self.size[1] ) self.track_items.append(item) if event['type'] == 'sequencer': video = TrackVideo( event['type'], event['popcornOptions']['source'][0], event['popcornOptions'] ) self.track_videos.append(video) self.parse_duration() cfilter = r'color=c={0}:s={1}x{2}:d={3};aevalsrc=0:d={4}'.format( self.background_color, self.size[0], self.size[1], self.duration, self.duration, ) call(['ffmpeg', '-filter_complex', cfilter, '-y', self.current_video.name])
def draw_videos(self): i = 0 for video in reversed(self.track_videos): overlay = NamedTemporaryFile( suffix='.avi', delete=self.delete ) # Removes all white spaces and non alphanumeric chars from title video.options['title'] = re.sub( '[^\w\.]', '', video.options['title'] ) + '.webm' # Trim the video if it needs to be if (video.options['from'] != 0 or video.options['end'] - video.options['from'] < video.options['duration']): self.editor.trim( video.options['title'], overlay.name, seconds_to_timecode(video.options['from']), seconds_to_timecode(video.options['duration']) ) else: overlay.name = video.options['title'] # Also scale the video down to size scaled_overlay = NamedTemporaryFile( suffix='.avi', delete=self.delete ) self.editor.scale_video( overlay.name, scaled_overlay.name, percent_to_px(video.options['width'], self.size[0]), percent_to_px(video.options['height'], self.size[1]), ) overlay.close() out = NamedTemporaryFile(suffix='.avi', delete=self.delete) self.overlay_videos(self.current_video.name, scaled_overlay.name, video.options, out.name) scaled_overlay.close() self.current_video = out i += 1
def overlay_videos(self, underlay_video, overlay_video, options, out): overlay1 = NamedTemporaryFile(suffix='.avi', delete=self.delete) overlay2 = NamedTemporaryFile(suffix='.avi', delete=self.delete) overlay3 = NamedTemporaryFile(suffix='.avi', delete=self.delete) overlay4 = NamedTemporaryFile(suffix='.avi', delete=self.delete) self.editor.trim( underlay_video, overlay1.name, '00:00:00', str(options['start']) ) self.editor.trim( underlay_video, overlay2.name, str(options['start']), str(options['end'] - options['start']), ) self.editor.trim( underlay_video, overlay3.name, str(options['end'] - options['start']), str(options['end']) ) # Now draw it onto the screen self.editor.draw_video( overlay2.name, overlay_video, overlay4.name, percent_to_px(options['left'], self.size[0]), percent_to_px(options['top'], self.size[1]) ) loop_file = NamedTemporaryFile(suffix='.txt') with open(loop_file.name, 'w') as f: if not options['start'] == 0: f.write('file {0}\n'.format(overlay1.name)) f.write('file {0}\n'.format(overlay4.name)) if not options['start'] == 0: f.write('file {0}\n'.format(overlay3.name)) command = ['ffmpeg', '-f', 'concat', '-i', loop_file.name, '-y', '-c', 'copy', out] call(command) loop_file.close()
def draw_videos(self): i = 0 for video in reversed(self.track_videos): # Trim the video if it needs to be if (video.options['from'] == 0 or video.options['end'] - video.options['from'] < video.options['duration']): overlay = NamedTemporaryFile( suffix='.avi', delete=self.DELETE_VIDEOS ) self.editor.trim( video.options['title'].replace(' ', '-') + '.webm', overlay.name, seconds_to_timecode(video.options['from']), seconds_to_timecode(video.options['duration']) ) # Also scale the video down to size if not video.options['height'] == 100 or True: scaled_overlay = NamedTemporaryFile( suffix='.avi', delete=self.DELETE_VIDEOS ) self.editor.scale_video( overlay.name, scaled_overlay.name, percent_to_px(video.options['width'], self.size[0]), percent_to_px(video.options['height'], self.size[1]), ) overlay.close() else: scaled_overlay = overlay out = NamedTemporaryFile(suffix='.avi', delete=self.DELETE_VIDEOS) self.overlay_videos(self.current_video.name, scaled_overlay.name, video.options, out.name) scaled_overlay.close() self.current_video = out i += 1
def overlay_videos(self, underlay_video, overlay_video, options, out): self.editor.trim( underlay_video, 'overlay_1.avi', '00:00:00', str(options['start']) ) self.editor.trim( underlay_video, 'overlay_2.avi', str(options['start']), str(options['end'] - options['start']), ) self.editor.trim( underlay_video, 'overlay_3.avi', str(options['end'] - options['start']), str(options['end']) ) # Now draw it onto the screen self.editor.draw_video( 'overlay_2.avi', overlay_video, 'overlay_4.avi', percent_to_px(options['left'], self.size[0]), percent_to_px(options['top'], self.size[1]) ) with open('loop.txt', 'w') as f: if not options['start'] == 0: f.write('file overlay_1.avi\n') f.write('file overlay_4.avi\n') if not options['start'] == 0: f.write('file overlay_3.avi\n') call(['ffmpeg', '-f', 'concat', '-i', 'loop.txt', '-c', 'copy', out])
def draw_videos(self): i = 0 for video in reversed(self.track_videos): overlay = NamedTemporaryFile(suffix='.avi', delete=self.delete) # Removes all white spaces and non alphanumeric chars from title video.options['title'] = re.sub('[^\w\.]', '', video.options['title']) + '.webm' # Trim the video if it needs to be if (video.options['from'] != 0 or video.options['end'] - video.options['from'] < video.options['duration']): self.editor.trim( video.options['title'], overlay.name, seconds_to_timecode(video.options['from']), seconds_to_timecode(video.options['duration'])) else: overlay.name = video.options['title'] # Also scale the video down to size scaled_overlay = NamedTemporaryFile(suffix='.avi', delete=self.delete) self.editor.scale_video( overlay.name, scaled_overlay.name, percent_to_px(video.options['width'], self.size[0]), percent_to_px(video.options['height'], self.size[1]), ) overlay.close() out = NamedTemporaryFile(suffix='.avi', delete=self.delete) self.overlay_videos(self.current_video.name, scaled_overlay.name, video.options, out.name) scaled_overlay.close() self.current_video = out i += 1
def overlay_videos(self, underlay_video, overlay_video, options, out): overlay1 = NamedTemporaryFile(suffix='.avi', delete=self.delete) overlay2 = NamedTemporaryFile(suffix='.avi', delete=self.delete) overlay3 = NamedTemporaryFile(suffix='.avi', delete=self.delete) overlay4 = NamedTemporaryFile(suffix='.avi', delete=self.delete) self.editor.trim(underlay_video, overlay1.name, '00:00:00', str(options['start'])) self.editor.trim( underlay_video, overlay2.name, str(options['start']), str(options['end'] - options['start']), ) self.editor.trim(underlay_video, overlay3.name, str(options['end'] - options['start']), str(options['end'])) # Now draw it onto the screen self.editor.draw_video(overlay2.name, overlay_video, overlay4.name, percent_to_px(options['left'], self.size[0]), percent_to_px(options['top'], self.size[1])) loop_file = NamedTemporaryFile(suffix='.txt') with open(loop_file.name, 'w') as f: if not options['start'] == 0: f.write('file {0}\n'.format(overlay1.name)) f.write('file {0}\n'.format(overlay4.name)) if not options['start'] == 0: f.write('file {0}\n'.format(overlay3.name)) command = [ 'ffmpeg', '-f', 'concat', '-i', loop_file.name, '-y', '-c', 'copy', out ] call(command) loop_file.close()
def draw_videos(self): i = 0 for video in self.track_videos: # Trim the video if it needs to be if (video.options['from'] == 0 or video.options['end'] - video.options['from'] < video.options['duration']): overlay = 'trimmed_' + str(i) + '.avi' self.editor.trim( video.options['title'], overlay, seconds_to_timecode(video.options['from']), seconds_to_timecode(video.options['duration']) ) # Also scale the video down to size if not video.options['height'] == 100 or True: scaled_overlay = 'scaled_' + str(i) + '.avi' self.editor.scale_video( overlay, scaled_overlay, percent_to_px(video.options['width'], self.size[0]), percent_to_px(video.options['height'], self.size[1]), ) else: scaled_overlay = overlay out = 'video_' + str(i) + '.avi' self.overlay_videos(self.video_name, scaled_overlay, video.options, out) self.video_name = out i += 1
def draw_items(self): for item in self.track_items: item_file = NamedTemporaryFile(suffix='.avi', delete=self.delete) if item.edit_type == 'text': self.editor.draw_text( self.current_video.name, item_file.name, item.options['start_stamp'], item.options['end_stamp'], item.options['x_px'], item.options['y_px'], item.options['text'], item.options['fontColor'].replace('#', '0x'), size=percent_to_px(item.options['fontSize'], self.size[1])) elif item.edit_type == 'image': # TODO pass self.current_video = item_file
def draw_items(self): for item in self.track_items: item_file = NamedTemporaryFile(suffix='.avi', delete=self.DELETE_VIDEOS) if item.edit_type == 'text': self.editor.draw_text( self.current_video.name, item_file.name, item.options['start_stamp'], item.options['end_stamp'], item.options['x_px'], item.options['y_px'], item.options['text'], item.options['fontColor'].replace('#', '0x'), size=percent_to_px(item.options['fontSize'], self.size[1]) ) elif item.edit_type == 'image': # TODO pass self.current_video = item_file
def preprocess(self, data): """ Processes popcorn JSON and builds a sane data model out of it @param data : The popcorn editor project json blob """ print 'Beginning pre-process...' for url, video in data['media'][0]['clipData'].iteritems(): print 'Downloading {0} from {1}.'.format(video['title'], url) # Removes all white spaces and non alphanumeric chars from title video['title'] = re.sub('[^\w\.]', '', video['title']) + '.webm' urllib.urlretrieve(url, video['title']) self.base_videos.append(video['title']) print 'video downloaded as %s!' % video['title'] print 'All videos downloaded.' events = [ event for track in data['media'][0]['tracks'] for event in track['trackEvents'] ] for event in events: if event['type'] == 'skip' or event['type'] == 'loopPlugin': edit = TrackEdit(event['type'], event['popcornOptions']) self.track_edits.append(edit) if event['type'] == 'text' or event['type'] == 'image': item = TrackItem(event['type'], event['popcornOptions']) item.options['start_stamp'] = \ item.options['start'] item.options['end_stamp'] = \ item.options['end'] item.options['x_px'] = percent_to_px(item.options['left'], self.size[0]) item.options['y_px'] = percent_to_px(item.options['top'], self.size[1]) self.track_items.append(item) if event['type'] == 'sequencer': video = TrackVideo(event['type'], event['popcornOptions']['source'][0], event['popcornOptions']) self.track_videos.append(video) self.parse_duration() cfilter = r'color=c={0}:s={1}x{2}:d={3};aevalsrc=0:d={4}'.format( self.background_color, self.size[0], self.size[1], self.duration, self.duration, ) call([ 'ffmpeg', '-filter_complex', cfilter, '-y', self.current_video.name ])