diff options
Diffstat (limited to 'kinoraw_tools/recursive_loader.py')
-rw-r--r-- | kinoraw_tools/recursive_loader.py | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/kinoraw_tools/recursive_loader.py b/kinoraw_tools/recursive_loader.py new file mode 100644 index 00000000..82e4820e --- /dev/null +++ b/kinoraw_tools/recursive_loader.py @@ -0,0 +1,261 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +import bpy + +import random +import math +import os, sys + +from bpy.props import IntProperty +from bpy.props import FloatProperty +from bpy.props import EnumProperty +from bpy.props import BoolProperty +from bpy.props import StringProperty + +from . import functions +from . import exiftool + + +class Sequencer_Extra_RecursiveLoader(bpy.types.Operator): + bl_idname = "sequencerextra.recursiveload" + bl_label = "recursive load" + bl_options = {'REGISTER', 'UNDO'} + + recursive = BoolProperty( + name='recursive', + description='Load in recursive folders', + default=False) + + recursive_select_by_extension = BoolProperty( + name='select by extension', + description='Load only clips with selected extension', + default=False) + + ext = EnumProperty( + items=functions.movieextdict, + name="extension", + default="3") + + + @classmethod + def poll(self, context): + scn = context.scene + if scn and scn.sequence_editor: + return (scn.sequence_editor) + else: + return False + + def invoke(self, context, event): + scn = context.scene + try: + self.recursive = scn.kr_recursive + self.recursive_select_by_extension = scn.kr_recursive_select_by_extension + self.ext = scn.kr_default_ext + except AttributeError: + functions.initSceneProperties(context) + self.recursive = scn.kr_recursive + self.recursive_select_by_extension = scn.kr_recursive_select_by_extension + self.ext = scn.kr_default_ext + + return context.window_manager.invoke_props_dialog(self) + + def loader(self, context, filelist): + scn = context.scene + if filelist: + for i in filelist: + functions.setpathinbrowser(context, i[0], i[1]) + try: + bpy.ops.sequencerextra.placefromfilebrowser() + except: + print("Error loading file (recursive loader error): ", i[1]) + functions.add_marker(context, i[1], scn.frame_current) + self.report({'ERROR_INVALID_INPUT'}, 'Error loading file ') + pass + + + def execute(self, context): + scn = context.scene + if self.recursive == True: + #recursive + self.loader(context, functions.sortlist(\ + functions.recursive(context, self.recursive_select_by_extension,\ + self.ext))) + else: + #non recursive + self.loader(context, functions.sortlist(functions.onefolder(\ + context, self.recursive_select_by_extension, self.ext))) + try: + scn.kr_recursive = self.recursive + scn.kr_recursive_select_by_extension = self.recursive_select_by_extension + scn.kr_default_ext = self.ext + except AttributeError: + functions.initSceneProperties(context) + self.recursive = scn.kr_recursive + self.recursive_select_by_extension = scn.kr_recursive_select_by_extension + self.ext = scn.kr_default_ext + + return {'FINISHED'} + + +# READ EXIF DATA +class Sequencer_Extra_ReadExifData(bpy.types.Operator): + # load exifdata from strip to scene['metadata'] property + bl_label = 'Read EXIF Data' + bl_idname = 'sequencerextra.read_exif' + bl_description = 'Load exifdata from strip to metadata property in scene' + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(self, context): + scn=context.scene + if scn and scn.sequence_editor and scn.sequence_editor.active_strip: + return scn.sequence_editor.active_strip.type in ('IMAGE', 'MOVIE') + else: + return False + + + def execute(self, context): + try: + exiftool.ExifTool().start() + except: + self.report({'ERROR_INVALID_INPUT'}, + 'exiftool not found in PATH') + return {'CANCELLED'} + + def getexifdata(strip): + + def getexifvalues_image(lista): + metadata = [] + with exiftool.ExifTool() as et: + try: + metadata = et.get_metadata_batch(lista) + except UnicodeDecodeError as Err: + print(Err) + #print(metadata[0]) + print(len(metadata)) + return metadata + + def getexifvalues_movie(path): + metadata = [] + with exiftool.ExifTool() as et: + try: + metadata = et.get_metadata_batch([path]) + except UnicodeDecodeError as Err: + print(Err) + print(metadata[0]) + print(len(metadata)) + return metadata + + def getlist(lista): + for root, dirs, files in os.walk(path): + for f in files: + if "." + f.rpartition(".")[2].lower() \ + in functions.imb_ext_image: + lista.append(f) + #if "."+f.rpartition(".")[2] in imb_ext_movie: + # lista.append(f) + strip.elements + lista.sort() + return lista + + if strip.type == "IMAGE": + path = bpy.path.abspath(strip.directory) + os.chdir(path) + #get a list of files + lista = [] + for i in strip.elements: + lista.append(i.filename) + print(lista) + return getexifvalues_image(lista) + + if strip.type == "MOVIE": + path = bpy.path.abspath(strip.filepath) + print([path]) + return getexifvalues_movie(path) + + + + sce = bpy.context.scene + frame = sce.frame_current + text = bpy.context.active_object + strip = context.scene.sequence_editor.active_strip + sce['metadata'] = getexifdata(strip) + return {'FINISHED'} + + +class ExifInfoPanel(bpy.types.Panel): + """Creates a Panel in the Object properties window""" + """ TODO: fix poll to hide when unuseful""" + bl_label = "EXIF Info Panel" + bl_space_type = 'SEQUENCE_EDITOR' + bl_region_type = 'UI' + + @classmethod + def poll(self, context): + if context.space_data.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}: + strip = functions.act_strip(context) + scn = context.scene + preferences = context.user_preferences + prefs = preferences.addons[__package__].preferences + + if scn and scn.sequence_editor and scn.sequence_editor.active_strip: + if prefs.use_exif_panel: + return strip.type in ('MOVIE', 'IMAGE') + else: + return False + + def draw_header(self, context): + layout = self.layout + layout.label(text="", icon="RADIO") + + def draw(self, context): + layout = self.layout + sce = context.scene + row = layout.row() + row.operator("sequencerextra.read_exif") + row = layout.row() + row.label(text="Exif Data", icon='RENDER_REGION') + row = layout.row() + + try: + strip = context.scene.sequence_editor.active_strip + + f = strip.frame_start + frame = sce.frame_current + try: + if len(sce['metadata']) == 1: + for d in sce['metadata'][0]: + split = layout.split(percentage=0.5) + col = split.column() + row = col.row() + col.label(text=d) + col = split.column() + col.label(str(sce['metadata'][0][d])) + else: + for d in sce['metadata'][frame - f]: + split = layout.split(percentage=0.5) + col = split.column() + row = col.row() + col.label(text=d) + col = split.column() + col.label(str(sce['metadata'][frame - f][d])) + except (IndexError, KeyError): + pass + except AttributeError: + pass
\ No newline at end of file |