[Bf-extensions-cvs] [cf9fde25] master: power_sequencer: update to the latest master

Nathan Lovato noreply at git.blender.org
Thu Feb 13 16:19:41 CET 2020


Commit: cf9fde2568aa81197d0f36019ee429880430906d
Author: Nathan Lovato
Date:   Sat Feb 8 19:59:08 2020 -0600
Branches: master
https://developer.blender.org/rBAcf9fde2568aa81197d0f36019ee429880430906d

power_sequencer: update to the latest master

This commit brings Power Sequencer to the current rolling version, that is
commit 9562eb58d164e234f61225250d6ac5ca858ada7b on
https://github.com/GDQuest/blender-power-sequencer/.

I had already made an intermediate commit that added new features and fixed some
bugs. This commit brings bug fixes and many quality of life improvements.

- Human-readable changelog:
  https://github.com/GDQuest/blender-power-sequencer/blob/master/CHANGELOG.md
- 1.4.0 release post:
  https://github.com/GDQuest/blender-power-sequencer/releases/tag/1.4.0
- All the commits since v1.3.0 (previous update + this one in this repository):
  https://github.com/GDQuest/blender-power-sequencer/compare/1.3.0...master

===================================================================

M	power_sequencer/__init__.py
M	power_sequencer/addon_preferences.py
M	power_sequencer/operators/__init__.py
M	power_sequencer/operators/audiosync/convert_and_trim.py
M	power_sequencer/operators/audiosync/find_offset.py
M	power_sequencer/operators/audiosync/mfcc/mfcc.py
M	power_sequencer/operators/concatenate_strips.py
M	power_sequencer/operators/crossfade_add.py
M	power_sequencer/operators/crossfade_edit.py
M	power_sequencer/operators/expand_to_surrounding_cuts.py
M	power_sequencer/operators/fade_add.py
M	power_sequencer/operators/fade_clear.py
M	power_sequencer/operators/gap_remove.py
M	power_sequencer/operators/grab.py
M	power_sequencer/operators/import_local_footage.py
D	power_sequencer/operators/marker_go_to_next.py
M	power_sequencer/operators/markers_as_timecodes.py
M	power_sequencer/operators/mouse_trim_instantly.py
M	power_sequencer/operators/mouse_trim_modal.py
M	power_sequencer/operators/playback_speed_set.py
M	power_sequencer/operators/preview_to_selection.py
M	power_sequencer/operators/render_presets/youtube_1080.py
M	power_sequencer/operators/ripple_delete.py
M	power_sequencer/operators/scene_merge_from.py
M	power_sequencer/operators/scene_open_from_strip.py
M	power_sequencer/operators/scene_rename_with_strip.py
M	power_sequencer/operators/snap_selection.py
M	power_sequencer/operators/space_sequences.py
M	power_sequencer/operators/speed_up_movie_strip.py
D	power_sequencer/operators/synchronize_titles.py
M	power_sequencer/operators/transitions_remove.py
M	power_sequencer/operators/trim_to_surrounding_cuts.py
M	power_sequencer/operators/utils/doc.py
M	power_sequencer/operators/utils/functions.py
M	power_sequencer/operators/utils/global_settings.py
M	power_sequencer/operators/utils/info_progress_bar.py
M	power_sequencer/scripts/BPSProxy/bpsproxy/commands.py
M	power_sequencer/scripts/BPSProxy/bpsproxy/config.py
M	power_sequencer/scripts/BPSProxy/bpsproxy/utils.py
M	power_sequencer/scripts/BPSProxy/setup.py
M	power_sequencer/scripts/BPSRender/bpsrender/commands.py
M	power_sequencer/scripts/BPSRender/bpsrender/helpers.py
M	power_sequencer/scripts/BPSRender/bpsrender/setup.py
M	power_sequencer/scripts/BPSRender/setup.py
A	power_sequencer/tools/__init__.py
A	power_sequencer/tools/trim.py
M	power_sequencer/ui/menu_contextual.py
M	power_sequencer/ui/menu_toolbar.py
M	power_sequencer/utils/register_shortcuts.py

===================================================================

diff --git a/power_sequencer/__init__.py b/power_sequencer/__init__.py
old mode 100644
new mode 100755
index a51f7342..670bcf41
--- a/power_sequencer/__init__.py
+++ b/power_sequencer/__init__.py
@@ -14,21 +14,23 @@
 # You should have received a copy of the GNU General Public License along with Power Sequencer. If
 # not, see <https://www.gnu.org/licenses/>.
 #
+from typing import List, Tuple, Type
+
 import bpy
 
 from .addon_preferences import register_preferences, unregister_preferences
 from .addon_properties import register_properties, unregister_properties
-from .operators import classes
-from .utils.register_shortcuts import register_shortcuts
 from .handlers import register_handlers, unregister_handlers
-from .utils import addon_auto_imports
+from .operators import get_operator_classes
+from .tools import get_tool_classes
 from .ui import register_ui, unregister_ui
-
+from .utils import addon_auto_imports
+from .utils.register_shortcuts import register_shortcuts
 
 # load and reload submodules
 ##################################
 modules = addon_auto_imports.setup_addon_modules(
-    __path__, __name__, ignore_packages=[".utils", ".audiosync"], ignore_modules=[]
+    __path__, __name__, ignore_packages=[".utils", ".audiosync"]
 )
 
 
@@ -38,43 +40,68 @@ bl_info = {
     "author": "Nathan Lovato",
     "version": (1, 4, 0),
     "blender": (2, 80, 0),
-    "location": "Video Tools",
+    "location": "Sequencer",
     "tracker_url": "https://github.com/GDquest/Blender-power-sequencer/issues",
-    "wiki_url": "https://www.youtube.com/playlist?list=PLhqJJNjsQ7KFjp88Cu57Zb9_wFt7nlkEI",
+    "wiki_url": "https://www.gdquest.com/docs/documentation/power-sequencer/",
     "support": "COMMUNITY",
     "category": "Sequencer",
 }
 
 
-addon_keymaps = []
+# We use globals to cache loaded keymaps, operators, and tools
+addon_keymaps: List[Type] = []
+classes_operator: List[Type] = []
+classes_tool: List[Type] = []
 
 
 def register():
     global addon_keymaps
+    global classes_operator
+    global classes_tool
 
     register_preferences()
     register_properties()
     register_handlers()
     register_ui()
 
-    for c in classes:
-        bpy.utils.register_class(c)
-
-    keymaps = register_shortcuts()
+    # Register operators
+    classes_operator = get_operator_classes()
+    for cls in classes_operator:
+        bpy.utils.register_class(cls)
+
+    # Register tools
+    version_min_toolbar = (2, 83, 0)
+    if is_blender_version_compatible(version_min_toolbar):
+        classes_tool = get_tool_classes()
+        last_tool = {"builtin.cut"}
+        for index, cls in enumerate(classes_tool):
+            bpy.utils.register_tool(cls, after=last_tool, separator=index == 0)
+            last_tool = {cls.bl_idname}
+
+    # Register keymaps
+    keymaps = register_shortcuts(classes_operator)
     addon_keymaps += keymaps
 
     print("Registered {} with {} modules".format(bl_info["name"], len(modules)))
 
 
 def unregister():
+    """Unregister"""
     global addon_keymaps
+    global classes_operator
+    global classes_tool
 
     for km, kmi in addon_keymaps:
         km.keymap_items.remove(kmi)
     addon_keymaps.clear()
 
-    for c in classes:
-        bpy.utils.unregister_class(c)
+    for cls in classes_operator:
+        bpy.utils.unregister_class(cls)
+
+    version_min_toolbar = (2, 82, 0)
+    if is_blender_version_compatible(version_min_toolbar):
+        for cls in classes_tool:
+            bpy.utils.unregister_tool(cls)
 
     unregister_ui()
     unregister_preferences()
@@ -82,3 +109,11 @@ def unregister():
     unregister_handlers()
 
     print("Unregistered {}".format(bl_info["name"]))
+
+
+def is_blender_version_compatible(version: Tuple[int, int, int]) -> bool:
+    """Returns True if the `version` is greater or equal to the current Blender version.
+    Converts the versions to integers to compare them."""
+    version_int = version[0] * 1000 + version[1] * 10 + version[2]
+    blender_version_int = bpy.app.version[0] * 1000 + bpy.app.version[1] * 10 + bpy.app.version[2]
+    return blender_version_int >= version_int
diff --git a/power_sequencer/addon_preferences.py b/power_sequencer/addon_preferences.py
index 0e8e7d71..fcc67e9c 100644
--- a/power_sequencer/addon_preferences.py
+++ b/power_sequencer/addon_preferences.py
@@ -17,12 +17,16 @@
 """
 Add-on preferences and interface in the Blender preferences window.
 """
+import subprocess
+
 import bpy
+from bpy.props import BoolProperty, StringProperty
 
 
 def get_preferences(context):
     return context.preferences.addons[__package__].preferences
 
+
 class PowerSequencerPreferences(bpy.types.AddonPreferences):
     bl_idname = __package__
 
@@ -31,6 +35,32 @@ class PowerSequencerPreferences(bpy.types.AddonPreferences):
     proxy_75: bpy.props.BoolProperty(name="75%", default=False)
     proxy_100: bpy.props.BoolProperty(name="100%", default=False)
 
+    # Code adapted from Krzysztof Trzciński's work
+    ffmpeg_executable: StringProperty(
+        name="Path to ffmpeg executable",
+        default="",
+        update=lambda self, context: self.update_ffmpeg_executable(context),
+        subtype="FILE_PATH",
+    )
+    ffmpeg_status: StringProperty(default="")
+    ffmpeg_is_executable_valid: BoolProperty(default=False)
+
+    def update_ffmpeg_executable(self, context):
+        error_message, info = self._try_run_ffmpeg(self.ffmpeg_executable)
+        self.ffmpeg_is_executable_valid = error_message == ""
+        self.ffmpeg_status = error_message if error_message != "" else info
+
+    def _try_run_ffmpeg(self, path):
+        """Runs ffmpeg -version, and returns an error message if it failed"""
+        error_message, info = "", ""
+        try:
+            info: str = subprocess.check_output([path, "-version"]).decode("utf-8")
+            info = info[:info.find("Copyright")]
+            print(info)
+        except (OSError, subprocess.CalledProcessError):
+            error_message = "Path `{}` is not a valid ffmpeg executable".format(path)
+        return error_message, info
+
     def draw(self, context):
         layout = self.layout
 
@@ -42,6 +72,16 @@ class PowerSequencerPreferences(bpy.types.AddonPreferences):
         row.prop(self, "proxy_75")
         row.prop(self, "proxy_100")
 
+        text = [
+            "(Optional) FFMpeg executable to use for multithread renders and proxy generation. "
+            "Use this to render with a version of ffmpeg that's not on your system's PATH variable."
+        ]
+        for line in text:
+            layout.label(text=line)
+        layout.prop(self, "ffmpeg_executable")
+        icon = "INFO" if self.ffmpeg_is_executable_valid else "ERROR"
+        layout.label(text=self.ffmpeg_status, icon=icon)
+
 
 register_preferences, unregister_preferences = bpy.utils.register_classes_factory(
     [PowerSequencerPreferences]
diff --git a/power_sequencer/operators/__init__.py b/power_sequencer/operators/__init__.py
old mode 100644
new mode 100755
index 93519426..535b29cd
--- a/power_sequencer/operators/__init__.py
+++ b/power_sequencer/operators/__init__.py
@@ -14,143 +14,25 @@
 # You should have received a copy of the GNU General Public License along with Power Sequencer. If
 # not, see <https://www.gnu.org/licenses/>.
 #
-from .speed_up_movie_strip import POWER_SEQUENCER_OT_speed_up_movie_strip
-from .align_audios import POWER_SEQUENCER_OT_align_audios
-from .playback_speed_set import POWER_SEQUENCER_OT_playback_speed_set
-from .channel_offset import POWER_SEQUENCER_OT_channel_offset
-from .concatenate_strips import POWER_SEQUENCER_OT_concatenate_strips
-from .copy_selected_sequences import POWER_SEQUENCER_OT_copy_selected_sequences
-from .crossfade_add import POWER_SEQUENCER_OT_crossfade_add
-from .crossfade_edit import POWER_SEQUENCER_OT_crossfade_edit
-from .transitions_remove import POWER_SEQUENCER_OT_transitions_remove
-from .cut_strips_under_cursor import POWER_SEQUENCER_OT_split_strips_under_cursor
-from .playback_speed_decrease import POWER_SEQUENCER_OT_playback_speed_decrease
-from .delete_direct import POWER_SEQUENCER_OT_delete_direct
-from .deselect_all_left_or_right import POWER_SEQUENCER_OT_deselect_all_strips_left_or_right
-from .deselect_handles_and_grab import POWER_SEQUENCER_OT_deselect_handles_and_grab
-from .duplicate_move import POWER_SEQUENCER_OT_duplicate_move
-from .expand_to_surrounding_cuts import POWER_SEQUENCER_OT_expand_to_surrounding_cuts
-from .fade_add import POWER_SEQUENCER_OT_fade_add
-from .fade_clear import POWER_SEQUENCER_OT_fade_clear
-from .grab_closest_handle_or_cut import POWER_SEQUENCER_OT_grab_closest_cut
-from .grab import POWER_SEQUENCER_OT_grab
-from .grab_sequence_handles import POWER_SEQUENCER_OT_grab_sequence_handles
-from .import_local_footage import POWER_SEQUENCER_OT_import_local_footage
-from .playback_speed_increase import POWER_SEQUENCER_OT_playback_speed_increase
-from .jump_time_offset import POWER_SEQUENCER_OT_jump_time_offset
-from .jump_to_cut import POWER_SEQUENCER_OT_jump_to_cut
-from .make_still_image import POWER_SEQUENCER_OT_make_still_image
-from .marker_delete_closest import POWER_SEQUENCER_OT_marker_delete_closest
-from .marker_delete_direct import POWER_SEQUENCER_OT_marker_delete_direct
-from .marker_go_to_next import POWER_SEQUENCER_OT_marker_go_to_next
-from .markers_as_timecodes import POWER_SEQUENCER_OT_copy_markers_as_timecodes
-from .markers_create_from_selected import POWER_SEQUENCER_OT_markers_create_from_selected_strips
-from .marker_snap_to_cursor import POWER_SEQUENCER_OT_marker_snap_to_cursor
-from .markers_snap_matching_strips import POWER_SEQUENCER_OT_markers_snap_matching_strips
-from .meta_resize_to_content import POWER_SEQUENCER_OT_meta_resize_to_content
-from .meta_ungroup_and_trim import POWER_SEQUENCER_OT_meta_ungroup_and_trim
-from .meta_trim_content_to_bounds import POWER_SEQUENCER_OT_meta_trim_content_to_bounds
-from .mouse_trim_modal import POWER_SEQUENCER_OT_mouse_trim
-from .space_sequences import POWER_SEQUENCER_OT_space_sequences
-from .mouse_toggle_mute import POWER_SEQUENCER_OT_mouse_toggle_mute
-from .mouse_trim_instantly import POWER_SEQUENCER_OT_mouse_trim_instantly
-from .open_project_directory import POWER

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list