def run(self): copy_txt = _("Copying project media assets") project_txt = _("Saving project file") gtk.gdk.threads_enter() dialog = dialogs.save_snaphot_progess(copy_txt, project_txt) gtk.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) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.gdk.threads_leave() 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 # Copy clip producers paths for seq in PROJECT().sequences: for track in seq.tracks: for i in range(0, len(track.clips)): clip = track.clips[i] # 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) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.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) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + " " + u"\u2713") gtk.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 gtk.gdk.threads_enter() dialog.saving_project_info.set_text(project_txt + " " + u"\u2713") gtk.gdk.threads_leave() time.sleep(2) gtk.gdk.threads_enter() dialog.destroy() gtk.gdk.threads_leave() project_event = projectdata.ProjectEvent( projectdata.EVENT_SAVED_SNAPSHOT, self.root_folder_path) PROJECT().events.append(project_event) gtk.gdk.threads_enter() projectinfogui.update_project_info() gtk.gdk.threads_leave()
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()
def run(self): copy_txt = _("Copying project media assets") project_txt = _("Saving project file") gtk.gdk.threads_enter() dialog = dialogs.save_snaphot_progess(copy_txt, project_txt) gtk.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) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.gdk.threads_leave() 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 # Copy clip producers paths for seq in PROJECT().sequences: for track in seq.tracks: for i in range(0, len(track.clips)): clip = track.clips[i] # 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) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.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) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + " " + u"\u2713") gtk.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 gtk.gdk.threads_enter() dialog.saving_project_info.set_text(project_txt + " " + u"\u2713") gtk.gdk.threads_leave() time.sleep(2) gtk.gdk.threads_enter() dialog.destroy() gtk.gdk.threads_leave() project_event = projectdata.ProjectEvent(projectdata.EVENT_SAVED_SNAPSHOT, self.root_folder_path) PROJECT().events.append(project_event) gtk.gdk.threads_enter() projectinfogui.update_project_info() gtk.gdk.threads_leave()