Beispiel #1
0
    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])
Beispiel #2
0
    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
Beispiel #3
0
    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()
Beispiel #4
0
    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
Beispiel #5
0
    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])
Beispiel #6
0
    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
Beispiel #7
0
    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()
Beispiel #8
0
    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
Beispiel #9
0
 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
Beispiel #10
0
 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
Beispiel #11
0
    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
        ])