Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
try:
# Shell the blender command to create the image sequence
command_get_version = [self.blender_exec_path, '-v']
command_render = [self.blender_exec_path, '-b', self.blend_file_path, '-P', self.target_script]
# debug info
# NOTE: If the length of the command_render list changes, update to match!
log.info("Blender command: {} {} '{}' {} '{}'".format(*command_render))
self.process = subprocess.Popen(command_get_version, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo)
# Check the version of Blender
self.version = self.blender_version.findall(str(self.process.stdout.readline()))
if self.version:
if self.version[0] < info.BLENDER_MIN_VERSION:
# change cursor to "default" and stop running blender command
self.is_running = False
# Wrong version of Blender.
self.blender_version_error.emit(self.version[0])
return
# Run real command to render Blender project
self.process = subprocess.Popen(command_render, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo)
except:
# Error running command. Most likely the blender executable path in
# the settings is incorrect, or is not a supported Blender version
self.is_running = False
self.blender_error_nodata.emit()
return
You should have received a copy of the GNU General Public License
along with OpenShot Library. If not, see .
"""
import os
from PyQt5.QtWidgets import *
from classes import info, ui_util
class ProgressBarExport(QDialog):
""" Progress Bar Export Dialog """
# Path to ui file
ui_path = os.path.join(info.PATH, 'windows', 'ui', 'progress-bar-export.ui')
def __init__(self):
# Create dialog class
QDialog.__init__(self)
# Load UI from designer
ui_util.load_ui(self, self.ui_path)
# Init UI
ui_util.init_ui(self)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import *
from classes import info
from classes.logger import log
from classes.app import get_app
import json
class CreditsStandardItemModel(QStandardItemModel):
def __init__(self, parent=None):
QStandardItemModel.__init__(self)
class CreditsModel():
star_icon = QIcon(os.path.join(info.IMAGES_PATH, "star-icon.png"))
paypal_icon = QIcon(os.path.join(info.IMAGES_PATH, "paypal-icon.png"))
kickstarter_icon = QIcon(os.path.join(info.IMAGES_PATH, "kickstarter-icon.png"))
bitcoin_icon = QIcon(os.path.join(info.IMAGES_PATH, "bitcoin-icon.png"))
patreon_icon = QIcon(os.path.join(info.IMAGES_PATH, "patreon-icon.png"))
developer_icon = QIcon(os.path.join(info.IMAGES_PATH, "python-icon.png"))
def update_model(self, filter=None, clear=True):
log.info("updating credits model.")
app = get_app()
_ = app._tr
# Get window to check filters
win = app.window
# Clear all items
if clear:
def Render(self, frame=None):
""" Render an images sequence of the current template using Blender 2.62+ and the
Blender Python API. """
# Enable the Render button again
self.disable_interface()
# Init blender paths
blend_file_path = os.path.join(info.PATH, "blender", "blend", self.selected_template)
source_script = os.path.join(info.PATH, "blender", "scripts", self.selected_template.replace(".blend", ".py"))
target_script = os.path.join(info.BLENDER_PATH, self.unique_folder_name,
self.selected_template.replace(".blend", ".py"))
# Copy the .py script associated with this template to the temp folder. This will allow
# OpenShot to inject the user-entered params into the Python script.
# XXX: Note that copyfile() is used instead of copy(), as the original
# file may be readonly, and we don't want to duplicate those permissions
shutil.copyfile(source_script, target_script)
# Open new temp .py file, and inject the user parameters
self.inject_params(target_script, frame)
# Create new thread to launch the Blender executable (and read the output)
if frame:
# preview mode
QMetaObject.invokeMethod(self.worker, 'Render', Qt.QueuedConnection,
for track in sorted(all_tracks, key=itemgetter('number')):
existing_track = Track.get(number=track.get("number"))
if not existing_track:
# Log error and fail silently, and continue
log.error('No track object found with number: %s' % track.get("number"))
continue
# Track name
track_name = track.get("label") or "TRACK %s" % track_count
track_locked = track.get("lock", False)
clips_on_track = Clip.filter(layer=track.get("number"))
if not clips_on_track:
continue
# Create video track node
trackTemplateDoc = minidom.parse(os.path.join(info.RESOURCES_PATH, 'export-track-video-template.xml'))
videoTrackNode = trackTemplateDoc.getElementsByTagName('track')[0]
xmldoc.getElementsByTagName("video")[0].appendChild(videoTrackNode)
# Create audio track nodes (1 for each channel)
trackTemplateDoc = minidom.parse(os.path.join(info.RESOURCES_PATH, 'export-track-audio-template.xml'))
audioTrackNode = trackTemplateDoc.getElementsByTagName('track')[0]
parentAudioNode.appendChild(audioTrackNode)
audioTrackNode.getElementsByTagName("outputchannelindex")[0].childNodes[0].nodeValue = track_count
# Is Track Locked?
if track_locked:
videoTrackNode.getElementsByTagName("locked")[0].childNodes[0].nodeValue = "TRUE"
audioTrackNode.getElementsByTagName("locked")[0].childNodes[0].nodeValue = "TRUE"
# Loop through clips on this track
for clip in clips_on_track:
def load(self):
""" Load user settings file from disk, merging with allowed settings in default settings file.
Creates user settings if missing. """
# Default and user settings objects
default_settings, user_settings = {}, {}
# try to load default settings, on failure will raise exception to caller
default_settings = self.read_from_file(self.default_settings_filename)
# Try to find user settings file
file_path = os.path.join(info.USER_PATH, self.settings_filename)
# Load user settings (if found)
if os.path.exists(os.fsencode(file_path)):
# Will raise exception to caller on failure to read
try:
user_settings = self.read_from_file(file_path)
except Exception as ex:
log.error("Error loading settings file: %s" % ex)
_ = QCoreApplication.instance()._tr
QMessageBox.warning(None, _("Settings Error"),
_("Error loading settings file: %(file_path)s. Settings will be reset.") % { "file_path": file_path})
user_settings = {}
# Merge default and user settings, excluding settings not in default, Save settings
MENU_COPY_KEYFRAMES_BRIGHTNESS = 11
MENU_COPY_KEYFRAMES_CONTRAST = 12
MENU_SLICE_KEEP_BOTH = 0
MENU_SLICE_KEEP_LEFT = 1
MENU_SLICE_KEEP_RIGHT = 2
MENU_SPLIT_AUDIO_SINGLE = 0
MENU_SPLIT_AUDIO_MULTIPLE = 1
class TimelineWebView(QWebView, updates.UpdateInterface):
""" A WebView QWidget used to load the Timeline """
# Path to html file
html_path = os.path.join(info.PATH, 'timeline', 'index.html')
def eval_js(self, code):
return self.page().mainFrame().evaluateJavaScript(code)
# This method is invoked by the UpdateManager each time a change happens (i.e UpdateInterface)
def changed(self, action):
# Send a JSON version of the UpdateAction to the timeline webview method: ApplyJsonDiff()
if action.type == "load":
# Initialize translated track name
_ = get_app()._tr
self.eval_js(JS_SCOPE_SELECTOR + ".SetTrackLabel('" + _("Track %s") + "');")
# Load entire project data
code = JS_SCOPE_SELECTOR + ".LoadJson(" + action.json() + ");"
else:
# Apply diff to part of project data
""" Find the current locale, and install the correct translators """
# Get app instance
app = QCoreApplication.instance()
# Setup of our list of translators and paths
translator_types = (
{"type": 'QT',
"pattern": 'qt_%s', # Older versions of Qt use this file (built-in translations)
"path": QLibraryInfo.location(QLibraryInfo.TranslationsPath)},
{"type": 'QT',
"pattern": 'qtbase_%s', # Newer versions of Qt use this file (built-in translations)
"path": QLibraryInfo.location(QLibraryInfo.TranslationsPath)},
{"type": 'QT',
"pattern": 'qt_%s',
"path": os.path.join(info.PATH, 'locale', 'QT')}, # Optional path where we package QT translations
{"type": 'QT',
"pattern": 'qtbase_%s',
"path": os.path.join(info.PATH, 'locale', 'QT')}, # Optional path where we package QT translations
{"type": 'OpenShot',
"pattern": os.path.join('%s', 'LC_MESSAGES', 'OpenShot'), # Our custom translations
"path": os.path.join(info.PATH, 'locale')},
)
# Determine the environment locale, or default to system locale name
locale_names = [os.environ.get('LANG', QLocale().system().name()),
os.environ.get('LOCALE', QLocale().system().name())
]
# Determine if the user has overwritten the language (in the preferences)
preference_lang = settings.get_settings().get('default-language')
if preference_lang != "Default":
log.info("-----------------------------------------------------")
log.info(" Creating the custom XML POT files")
log.info("-----------------------------------------------------")
# header of POT file
header_text = ""
header_text = header_text + '# OpenShot Video Editor POT Template File.\n'
header_text = header_text + '# Copyright (C) 2008-2018 OpenShot Studios, LLC\n'
header_text = header_text + '# This file is distributed under the same license as OpenShot.\n'
header_text = header_text + '# Jonathan Thomas , 2018.\n'
header_text = header_text + '#\n'
header_text = header_text + '#, fuzzy\n'
header_text = header_text + 'msgid ""\n'
header_text = header_text + 'msgstr ""\n'
header_text = header_text + '"Project-Id-Version: OpenShot Video Editor (version: %s)\\n"\n' % info.VERSION
header_text = header_text + '"Report-Msgid-Bugs-To: Jonathan Thomas \\n"\n'
header_text = header_text + '"POT-Creation-Date: %s\\n"\n' % datetime.datetime.now()
header_text = header_text + '"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"\n'
header_text = header_text + '"Last-Translator: Jonathan Thomas \\n"\n'
header_text = header_text + '"Language-Team: https://translations.launchpad.net/+groups/launchpad-translators\\n"\n'
header_text = header_text + '"MIME-Version: 1.0\\n"\n'
header_text = header_text + '"Content-Type: text/plain; charset=UTF-8\\n"\n'
header_text = header_text + '"Content-Transfer-Encoding: 8bit\\n"\n'
# Create POT files for the custom text (from our XML files)
temp_files = [['OpenShot_effects.pot', effects_text], ['OpenShot_export.pot', export_text],
['OpenShot_transitions.pot', transitions_text]]
for temp_file, text_dict in temp_files:
f = open(temp_file, "w")
# write header
def testHardwareDecode(self, decoder, decoder_card="0"):
"""Test specific settings for hardware decode, so the UI can remove unsupported options."""
is_supported = False
example_media = os.path.join(info.RESOURCES_PATH, "hardware-example.mp4")
# Persist decoder card results
if decoder_card not in self.hardware_tests_cards:
# Init new decoder card list
self.hardware_tests_cards[decoder_card] = []
if int(decoder) in self.hardware_tests_cards.get(decoder_card):
# Test already run and succeeded
return True
# Keep track of previous settings
current_decoder = openshot.Settings.Instance().HARDWARE_DECODER
current_decoder_card = openshot.Settings.Instance().HW_DE_DEVICE_SET
try:
# Temp override hardware settings (to test them)
openshot.Settings.Instance().HARDWARE_DECODER = int(decoder)