def run(self): proxy_w, proxy_h = _get_proxy_dimensions( self.proxy_profile, editorstate.PROJECT().proxy_data.size) enc_index = editorstate.PROJECT().proxy_data.encoding proxy_render_items = [] for media_file in self.files_to_render: if media_file.type != appconsts.IMAGE_SEQUENCE: proxy_encoding = renderconsumer.proxy_encodings[enc_index] proxy_file_path = media_file.create_proxy_path( proxy_w, proxy_h, proxy_encoding.extension) # Bit rates for proxy files are counted using 2500kbs for # PAL size image as starting point. pal_pix_count = 720.0 * 576.0 pal_proxy_rate = 2500.0 proxy_pix_count = float(proxy_w * proxy_h) proxy_rate = pal_proxy_rate * (proxy_pix_count / pal_pix_count) proxy_rate = int( proxy_rate / 100) * 100 # Make proxy rate even hundred # There are no practical reasons to have bitrates lower than 500kbs. if proxy_rate < 500: proxy_rate = 500 item_data = ProxyRenderItemData( media_file.id, proxy_w, proxy_h, enc_index, proxy_file_path, proxy_rate, media_file.path, self.proxy_profile.description(), None) else: asset_folder, asset_file_name = os.path.split(media_file.path) lookup_filename = utils.get_img_seq_glob_lookup_name( asset_file_name) lookup_path = asset_folder + "/" + lookup_filename proxy_file_path = media_file.create_proxy_path( proxy_w, proxy_h, None) # media_file.path, proxy_file_path, proxy_w, proxy_h, lookup_path item_data = ProxyRenderItemData( media_file.id, proxy_w, proxy_h, -1, proxy_file_path, -1, media_file.path, self.proxy_profile.description(), lookup_path) proxy_render_items.append(item_data) Gdk.threads_enter() for proxy_render_data_item in proxy_render_items: session_id = hashlib.md5(str( os.urandom(32)).encode('utf-8')).hexdigest() job_queue_object = jobs.ProxyRenderJobQueueObject( session_id, proxy_render_data_item) job_queue_object.add_to_queue() Gdk.threads_leave()
def _check_img_seq_existance(self, orig_path): asset_folder, asset_file_name = os.path.split(orig_path) lookup_filename = utils.get_img_seq_glob_lookup_name(asset_file_name) lookup_path = asset_folder + "/" + lookup_filename listing = glob.glob(lookup_path) if len(listing) > 0: self.orig_file_exists = True else: self.orig_file_exists = False
def get_img_seq_relative_path(project_file_path, asset_path): name = os.path.basename(asset_path) _show_msg(_("Relative file search for ") + name + "...", delay=0.0) matches = [] asset_folder, asset_file_name = os.path.split(asset_path) look_up_file_name = utils.get_img_seq_glob_lookup_name(asset_file_name) project_folder, project_file_name = os.path.split(project_file_path) for root, dirnames, filenames in os.walk(project_folder): look_up_path = root + "/" + look_up_file_name listing = glob.glob(look_up_path) if len(listing) > 0: return root + "/" + asset_file_name return NOT_FOUND # no relative path found
def _create_img_seq_proxy(self, media_file, proxy_w, proxy_h, items, start): now = time.time() elapsed = now - start Gdk.threads_enter() progress_window.update_render_progress(0.0, media_file.name, items, len(self.files_to_render), elapsed) Gdk.threads_leave() asset_folder, asset_file_name = os.path.split(media_file.path) lookup_filename = utils.get_img_seq_glob_lookup_name(asset_file_name) lookup_path = asset_folder + "/" + lookup_filename proxy_file_path = media_file.create_proxy_path(proxy_w, proxy_h, None) copyfolder, copyfilename = os.path.split(proxy_file_path) if not os.path.isdir(copyfolder): os.makedirs(copyfolder) listing = glob.glob(lookup_path) size = proxy_w, proxy_h done = 0 for orig_path in listing: orig_folder, orig_file_name = os.path.split(orig_path) try: im = Image.open(orig_path) im.thumbnail(size, Image.ANTIALIAS) im.save(copyfolder + "/" + orig_file_name, "PNG") except IOError: print "proxy img seq frame failed for '%s'" % orig_path done = done + 1 frac = float(done) / float(len(listing)) now = time.time() elapsed = now - start if done % 5 == 0: Gdk.threads_enter() progress_window.update_render_progress( frac, media_file.name, items, len(self.files_to_render), elapsed) Gdk.threads_leave() media_file.add_proxy_file(proxy_file_path)
def get_img_seq_relative_path(project_file_path, asset_path): name = os.path.basename(asset_path) _show_msg("Relative file search for " + name + "...", delay=0.0) matches = [] asset_folder, asset_file_name = os.path.split(asset_path) look_up_file_name = utils.get_img_seq_glob_lookup_name(asset_file_name) project_folder, project_file_name = os.path.split(project_file_path) for root, dirnames, filenames in os.walk(project_folder): look_up_path = root + "/" + look_up_file_name listing = glob.glob(look_up_path) if len(listing) > 0: #print "relative path for: ", asset_file_name return root + "/" + asset_file_name return NOT_FOUND # no relative path found
def get_img_seq_media_path(path, load_file_path): asset_folder, asset_file_name = os.path.split(path) look_up_file = asset_folder + "/" + utils.get_img_seq_glob_lookup_name(asset_file_name) listing = glob.glob(look_up_file) if editorpersistance.prefs.media_load_order == appconsts.LOAD_ABSOLUTE_FIRST: if len(listing) > 0: # Absolute path file present return path # Look for relative path path = get_img_seq_relative_path(load_file_path, path) # Load order relative, absolute elif editorpersistance.prefs.media_load_order == appconsts.LOAD_RELATIVE_FIRST: abspath = path path = get_img_seq_relative_path(load_file_path, path) if path == NOT_FOUND: path = abspath return path return path
def _create_img_seq_proxy(self, media_file, proxy_w, proxy_h, items, start): now = time.time() elapsed = now - start gtk.gdk.threads_enter() progress_window.update_render_progress(0.0, media_file.name, items, len(self.files_to_render), elapsed) gtk.gdk.threads_leave() asset_folder, asset_file_name = os.path.split(media_file.path) lookup_filename = utils.get_img_seq_glob_lookup_name(asset_file_name) lookup_path = asset_folder + "/" + lookup_filename proxy_file_path = media_file.create_proxy_path(proxy_w, proxy_h, None) copyfolder, copyfilename = os.path.split(proxy_file_path) if not os.path.isdir(copyfolder): os.makedirs(copyfolder) listing = glob.glob(lookup_path) size = proxy_w, proxy_h done = 0 for orig_path in listing: orig_folder, orig_file_name = os.path.split(orig_path) try: im = Image.open(orig_path) im.thumbnail(size, Image.ANTIALIAS) im.save(copyfolder + "/" + orig_file_name, "PNG") except IOError: print "proxy img seq frame failed for '%s'" % orig_path done = done + 1 frac = float(done) / float(len(listing)) now = time.time() elapsed = now - start if done % 5 == 0: gtk.gdk.threads_enter() progress_window.update_render_progress(frac, media_file.name, items, len(self.files_to_render), elapsed) gtk.gdk.threads_leave() media_file.add_proxy_file(proxy_file_path)
def run(self): copy_txt = _("Copying project media assets") project_txt = _("Saving project file") Gdk.threads_enter() dialog = dialogs.save_snaphot_progess(copy_txt, project_txt) Gdk.threads_leave() media_folder = self.root_folder_path + "media/" d = os.path.dirname(media_folder) os.mkdir(d) asset_paths = {} # Copy media files for idkey, media_file in PROJECT().media_files.items(): if media_file.type == appconsts.PATTERN_PRODUCER: continue # Copy asset file and fix path directory, file_name = os.path.split(media_file.path) # Message Gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) Gdk.threads_leave() # Other media types than image sequences if media_file.type != appconsts.IMAGE_SEQUENCE: media_file_copy = media_folder + file_name if media_file_copy in asset_paths: # Create different filename for files # that have same filename but different path file_name = get_snapshot_unique_name(media_file.path, file_name) media_file_copy = media_folder + file_name shutil.copyfile(media_file.path, media_file_copy) asset_paths[media_file.path] = media_file_copy else: # Image Sequences asset_folder, asset_file_name = os.path.split(media_file.path) lookup_filename = utils.get_img_seq_glob_lookup_name(asset_file_name) lookup_path = asset_folder + "/" + lookup_filename copyfolder = media_folder.rstrip("/") + asset_folder + "/" os.makedirs(copyfolder) listing = glob.glob(lookup_path) for orig_path in listing: orig_folder, orig_file_name = os.path.split(orig_path) shutil.copyfile(orig_path, copyfolder + orig_file_name) # Copy clip producers paths. This is needed just for rendered files as clips # from media file objects should be covered as media files can't be destroyed # if a clip made from them exists...I think for seq in PROJECT().sequences: for track in seq.tracks: for i in range(0, len(track.clips)): clip = track.clips[i] # Image sequence files can't be rendered files if clip.is_blanck_clip == False and clip.media_type == appconsts.IMAGE_SEQUENCE: continue # Only producer clips are affected if (clip.is_blanck_clip == False and (clip.media_type != appconsts.PATTERN_PRODUCER)): directory, file_name = os.path.split(clip.path) clip_file_copy = media_folder + file_name if not os.path.isfile(clip_file_copy): directory, file_name = os.path.split(clip.path) Gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) Gdk.threads_leave() shutil.copyfile(clip.path, clip_file_copy) # only rendered files are copied here asset_paths[clip.path] = clip_file_copy # This stuff is already md5 hashed, so no duplicate problems here for compositor in seq.compositors: if compositor.type_id == "##wipe": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "resource", media_folder) if compositor.type_id == "##region": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "composite.luma", media_folder) Gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + " " + u"\u2713") Gdk.threads_leave() save_path = self.root_folder_path + self.project_name persistance.snapshot_paths = asset_paths persistance.save_project(PROJECT(), save_path) persistance.snapshot_paths = None Gdk.threads_enter() dialog.saving_project_info.set_text(project_txt + " " + u"\u2713") Gdk.threads_leave() time.sleep(2) Gdk.threads_enter() dialog.destroy() Gdk.threads_leave() project_event = projectdata.ProjectEvent(projectdata.EVENT_SAVED_SNAPSHOT, self.root_folder_path) PROJECT().events.append(project_event) Gdk.threads_enter() projectinfogui.update_project_info() Gdk.threads_leave()