From 2e29310724e00291e1138bebccb0965a676f626f Mon Sep 17 00:00:00 2001 From: Campbell Barton <ideasman42@gmail.com> Date: Sun, 6 Jan 2013 10:15:19 +0000 Subject: [PATCH] fixes to EDL import - allow editmode 'a1', 'a2', 'a3'... etc - allow editmode 'none' - accept black as 'bl', 'bw', 'blk', 'black' - black was being imported as grey - add global frame offset option for importing - fix error naming strips - if a reel has an extension, match with the extension stripped as well --- so foobar.mov will find foobar.avi file. --- io_sequencer_edl/__init__.py | 26 ++++++++++++++++++++------ io_sequencer_edl/import_edl.py | 22 +++++++++++++++------- io_sequencer_edl/parse_edl.py | 16 ++++++++++++++-- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/io_sequencer_edl/__init__.py b/io_sequencer_edl/__init__.py index 89b0132d9..09ee806d9 100644 --- a/io_sequencer_edl/__init__.py +++ b/io_sequencer_edl/__init__.py @@ -79,7 +79,7 @@ class ReloadEDL(Operator): for reel in edl_import_info.reels} reels = elist.reels_as_dict() - reels = [k for k in reels.keys() if k != "bw"] + reels = [k for k in reels.keys() if k not in parse_edl.BLACK_ID] # re-create reels collection, keeping old values bl_reels.clear() @@ -116,6 +116,7 @@ class FindReelsEDL(Operator): # walk over .avi, .mov, .wav etc. def media_file_walker(path): + ext_check = bpy.path.extensions_movie | bpy.path.extensions_audio for dirpath, dirnames, filenames in os.walk(path): # skip '.svn' if dirpath.startswith("."): @@ -123,9 +124,7 @@ class FindReelsEDL(Operator): for filename in filenames: fileonly, ext = os.path.splitext(filename) ext_lower = ext.lower() - if ext_lower in bpy.path.extensions_movie: - yield os.path.join(dirpath, filename), fileonly - elif ext_lower in bpy.path.extensions_audio: + if ext_lower in ext_check: yield os.path.join(dirpath, filename), fileonly scene = context.scene @@ -143,6 +142,11 @@ class FindReelsEDL(Operator): for reel_names, reel_files_found, reel in bl_reels_search: reel_names_list = [] reel_names_list.append(reel.name.lower()) + + # add non-extension version of the reel name + if "." in reel_names_list[-1]: + reel_names_list.append(os.path.splitext(reel_names_list[-1])[0]) + # use the filepath if set reel_filepath = reel.filepath if reel_filepath: @@ -156,6 +160,12 @@ class FindReelsEDL(Operator): if "_" in reel_filepath] reel_names.update(reel_names_list) + # debug info + print("Searching or %d reels" % len(bl_reels_search)) + for reel_names, reel_files_found, reel in bl_reels_search: + print("Reel: %r --> (%s)" % (reel.name, " ".join(sorted(reel_names)))) + print() + for filename, fileonly in media_file_walker(self.directory): for reel_names, reel_files_found, reel in bl_reels_search: if fileonly.lower() in reel_names: @@ -227,7 +237,8 @@ class ImportEDL(Operator): msg = import_edl.load_edl( scene, filepath, - reel_filepaths, reel_offsets) + reel_filepaths, reel_offsets, + edl_import_info.frame_offset) if msg: self.report({'WARNING'}, msg) @@ -258,7 +269,9 @@ class EDLImportInfo(bpy.types.PropertyGroup): reels = bpy.props.CollectionProperty( type=EDLReelInfo, ) - + frame_offset = IntProperty( + name="Global Frame Offset", + ) # ---------------------------------------------------------------------------- # Panel to show EDL Import UI @@ -278,6 +291,7 @@ class SEQUENCER_PT_import_edl(bpy.types.Panel): layout.operator(ImportEDL.bl_idname) col = layout.column(align=True) + col.prop(edl_import_info, "frame_offset") col.prop(edl_import_info, "filepath", text="") col.operator(ReloadEDL.bl_idname, icon='FILE_REFRESH') diff --git a/io_sequencer_edl/import_edl.py b/io_sequencer_edl/import_edl.py index 65e4db4a3..24faaef7e 100644 --- a/io_sequencer_edl/import_edl.py +++ b/io_sequencer_edl/import_edl.py @@ -89,7 +89,7 @@ def replace_ext(path, ext): return path[:path.rfind(".") + 1] + ext -def load_edl(scene, filename, reel_files, reel_offsets): +def load_edl(scene, filename, reel_files, reel_offsets, global_offset): """ reel_files - key:reel <--> reel:filename """ @@ -123,7 +123,10 @@ def load_edl(scene, filename, reel_files, reel_offsets): prev_edit = None for edit in edits: print(edit) - frame_offset = reel_offsets[edit.reel] + if edit.reel.lower() in parse_edl.BLACK_ID: + frame_offset = 0 + else: + frame_offset = reel_offsets[edit.reel] src_start = int(edit.srcIn) + frame_offset src_end = int(edit.srcOut) + frame_offset @@ -133,6 +136,10 @@ def load_edl(scene, filename, reel_files, reel_offsets): rec_end = int(edit.recOut) + 1 rec_length = rec_end - rec_start + # apply global offset + rec_start += global_offset + rec_end += global_offset + # print src_length, rec_length, src_start if edit.m2 is not None: @@ -148,16 +155,17 @@ def load_edl(scene, filename, reel_files, reel_offsets): strip = None final_strips = [] - if edit.reel.lower() == "bw": + if edit.reel.lower() in parse_edl.BLACK_ID: strip = sequence_editor.sequences.new_effect( - name="Wipe", + name="Color", type='COLOR', start_frame=rec_start, + end_frame=rec_start + max(1, rec_length), channel=track + 1) strip_list.append(strip) - - strip.frame_duration = rec_length # for color its simple final_strips.append(strip) + strip.color = 0.0, 0.0, 0.0 + else: path_full = reel_files[edit.reel] path_dironly, path_fileonly = os.path.split(path_full) @@ -272,7 +280,7 @@ def load_edl(scene, filename, reel_files, reel_offsets): if final_strips: for strip in final_strips: # strip.frame_duration = length - final_strip.name = edit.as_name() + strip.name = edit.as_name() edit.custom_data[:] = final_strips # track = not track prev_edit = edit diff --git a/io_sequencer_edl/parse_edl.py b/io_sequencer_edl/parse_edl.py index 909b1ecc4..683e67bc0 100644 --- a/io_sequencer_edl/parse_edl.py +++ b/io_sequencer_edl/parse_edl.py @@ -223,9 +223,9 @@ EDIT_VIDEO_AUDIO = 1 << enum enum += 1 EDIT_DICT = { + "none": 0, # TODO, investigate this more. "v": EDIT_VIDEO, "a": EDIT_AUDIO, - "a2": EDIT_AUDIO, # TODO, what is this really?, FCP uses. "aa": EDIT_AUDIO_STEREO, "va": EDIT_VIDEO_AUDIO, "b": EDIT_VIDEO_AUDIO, @@ -248,6 +248,13 @@ enum += 1 KEY_OUT = enum # K O enum += 1 +BLACK_ID = { + "bw", + "bl", + "blk", + "black", + } + """ Most sytems: @@ -290,6 +297,10 @@ class EditDecision: def edit_flags_to_text(flag): return "/".join([item for item, val in EDIT_DICT.items() if val & flag]) + @staticmethod + def strip_digits(text): + return "".join(filter(lambda x: not x.isdigit(), text)) + def __init__(self, text=None, fps=25): # print text self.number = -1 @@ -351,7 +362,8 @@ class EditDecision: # AA/V can be an edit type self.edit_type = 0 for edit_type in line[index].lower().split("/"): - self.edit_type |= EDIT_DICT[edit_type] + # stripping digits is done because we don't do 'a1, a2...' + self.edit_type |= EDIT_DICT[EditDecision.strip_digits(edit_type)] index += 1 tx_name = "".join([c for c in line[index].lower() if not c.isdigit()]) -- GitLab