Exemple #1
0
def create_custom_shortcuts_xml(name):
    shortcuts = etree.parse(
        _get_shortcut_file_fullpath(editorpersistance.prefs.shortcuts))

    # Get numbered custom shortuts file path
    lowest_ver_number = 0
    custom_files = os.listdir(userfolders.get_data_dir() + "/" +
                              appconsts.USER_SHORTCUTS_DIR)
    for f in custom_files:
        dot_pos = f.find(".")
        num_str = f[len(CUSTOM_SHORTCUTS_FILE_NAME_START):dot_pos]
        if int(num_str) > lowest_ver_number:
            lowest_ver_number = int(num_str)

    new_custom_file_name = CUSTOM_SHORTCUTS_FILE_NAME_START + str(
        lowest_ver_number + 1) + ".xml"
    new_shortcuts_file_path = userfolders.get_data_dir(
    ) + "/" + appconsts.USER_SHORTCUTS_DIR + new_custom_file_name

    # Verify if the file has the right format
    root = shortcuts.getroot()
    root.set('name', name)
    root.set('editable', 'True')
    shortcuts.write(new_shortcuts_file_path)

    return new_custom_file_name
def _get_disk_dir_panels():
    panels = []
    panels.append(
        DiskFolderManagementPanel(userfolders.get_cache_dir(),
                                  appconsts.AUDIO_LEVELS_DIR,
                                  _("Audio Levels Data"), RECREATE_WARNING))
    panels.append(
        DiskFolderManagementPanel(userfolders.get_cache_dir(),
                                  appconsts.GMIC_DIR,
                                  _("G'Mic Tool Session Data"), NO_WARNING))
    panels.append(
        DiskFolderManagementPanel(userfolders.get_data_dir(),
                                  appconsts.RENDERED_CLIPS_DIR,
                                  _("Rendered Files"), PROJECT_DATA_WARNING))
    panels.append(
        DiskFolderManagementPanel(userfolders.get_cache_dir(),
                                  appconsts.THUMBNAILS_DIR, _("Thumbnails"),
                                  RECREATE_WARNING))
    panels.append(
        DiskFolderManagementPanel(userfolders.get_data_dir(),
                                  appconsts.USER_PROFILES_DIR_NO_SLASH,
                                  _("User Created Custom Profiles"),
                                  PROJECT_DATA_WARNING))

    return panels
Exemple #3
0
def _fluxity_unredered_media_creation_complete(created_unrendered_clip_path,
                                               container_clip_data):

    # This called from inside Gdk.threads_enter(), entering second time here crashes.
    # Now that unrendered media has been created we have full container data info.
    data_object = container_clip_data.data_slots["fluxity_plugin_edit_data"]
    container_clip_data.editable = True
    container_clip_data.unrendered_length = data_object["length"]
    container_clip_data.unrendered_media = created_unrendered_clip_path
    container_clip_data.unrendered_type = appconsts.VIDEO

    # Copy created unred
    rand_id_str = str(os.urandom(16))
    clip_id_str = hashlib.md5(rand_id_str.encode('utf-8')).hexdigest()
    unrendered_clip_path = userfolders.get_data_dir(
    ) + appconsts.CONTAINER_CLIPS_UNRENDERED + "/" + clip_id_str + ".mp4"
    os.replace(created_unrendered_clip_path, unrendered_clip_path)
    container_clip_data.unrendered_media = unrendered_clip_path
    container_clip_data.unrendered_type = appconsts.VIDEO

    container_clip = ContainerClipMediaItem(PROJECT().next_media_file_id,
                                            data_object["name"],
                                            container_clip_data)
    PROJECT().add_container_clip_media_object(container_clip)
    _update_gui_for_media_object_add()
Exemple #4
0
    def run(self):
        # Launch render process and wait for it to end
        FLOG = open(userfolders.get_data_dir() + "log_audio_levels_render",
                    'w')
        # Sep-2018 - SvdB - Added self. to be able to access the thread through 'process'
        self.process = subprocess.Popen([sys.executable, respaths.LAUNCH_DIR + "flowbladeaudiorender", \
                  self.rendered_media, self.profile_desc, respaths.ROOT_PATH], \
                  stdin=FLOG, stdout=FLOG, stderr=FLOG)
        self.process.wait()

        Gdk.threads_enter()
        updater.repaint_tline()
        Gdk.threads_leave()
Exemple #5
0
def load_profile_list():
    """ 
    Creates a list of MLT profile objects.
    Called at app start.
    """
    global _profile_list,_factory_profiles, _hidden_factory_profiles, \
    _user_profiles, _proxy_profiles, _categorized_profiles

    user_profiles_dir = userfolders.get_data_dir() + USER_PROFILES_DIR
    _user_profiles = _load_profiles_list(user_profiles_dir)
    _load_factory_profiles()

    _profile_list = _factory_profiles + _user_profiles

    _profile_list.sort(key=_sort_profiles)
    _factory_profiles.sort(key=_sort_profiles)
    _hidden_factory_profiles.sort(key=_sort_profiles)
    _user_profiles.sort(key=_sort_profiles)

    # Build categorized representation of available profiles.
    HD_profiles = []
    HD720_profiles = []
    UHD_profiles = []
    SD_profiles = []
    OTHER_profiles = []
    for prof in _profile_list:
        desc, mlt_profile = prof
        if desc.startswith("HD") and not desc.startswith(
                "HDV") and not desc.startswith("HD 720p"):
            HD_profiles.append(desc)
        elif desc.startswith("HD 720p"):
            HD720_profiles.append(desc)
        elif desc.startswith("4K UHD"):
            UHD_profiles.append(desc)
        elif desc.startswith("DV/DVD"):
            SD_profiles.append(desc)
        else:
            OTHER_profiles.append(desc)

    if len(HD_profiles) > 0:
        _categorized_profiles.append(("HD", HD_profiles))
    if len(HD720_profiles) > 0:
        _categorized_profiles.append(("HD 720p", HD720_profiles))
    if len(UHD_profiles) > 0:
        _categorized_profiles.append(("4K UHD", UHD_profiles))
    if len(SD_profiles) > 0:
        _categorized_profiles.append(("SD", SD_profiles))
    if len(OTHER_profiles) > 0:
        _categorized_profiles.append(("Other", OTHER_profiles))
    if len(_user_profiles) > 0:
        _categorized_profiles.append(("User Custom", _user_profiles))
Exemple #6
0
def _blender_unredered_media_creation_complete(created_unrendered_clip_path, container_clip_data):
    rand_id_str = str(os.urandom(16))
    clip_id_str = hashlib.md5(rand_id_str.encode('utf-8')).hexdigest() 
    unrendered_clip_path = userfolders.get_data_dir() + appconsts.CONTAINER_CLIPS_UNRENDERED +"/"+ clip_id_str + ".mp4"

    os.replace(created_unrendered_clip_path, unrendered_clip_path)

    # Now that unrendere media has been created we have full container data info.
    container_clip_data.unrendered_media = unrendered_clip_path
    container_clip_data.unrendered_type = appconsts.VIDEO

    container_clip = ContainerClipMediaItem(PROJECT().next_media_file_id, container_clip_data.get_program_name(), container_clip_data)
    PROJECT().add_container_clip_media_object(container_clip)
    _update_gui_for_media_object_add()
Exemple #7
0
def load_shortcut_files():
    global shortcut_files, shortcut_files_display_names
    default_shortcuts_file_found = False
    loadable_shortcuts_files = os.listdir(
        respaths.SHORTCUTS_PATH) + os.listdir(userfolders.get_data_dir() +
                                              "/" +
                                              appconsts.USER_SHORTCUTS_DIR)

    for f in loadable_shortcuts_files:
        format_error = True

        if f[-4:] == '.xml':
            # Get full path for either presets file on user custom shortcuts file.
            full_path = _get_shortcut_file_fullpath(f)

            # We have a valid file name. Now inspect the file for a valid format before loading it
            shortcuts = etree.parse(full_path)
            # Verify if the file has the right format
            root = shortcuts.getroot()
            # Check the 'tag' is flowblade
            if root.tag == appconsts.SHORTCUTS_ROOT_TAG:
                # Check if this is a shortcuts file
                if root.get('file') == appconsts.SHORTCUTS_TAG:
                    # Get name and comments
                    file_len = len(f) - 4
                    # Default file is added last to always be at index 0
                    if f != DEFAULT_SHORTCUTS_FILE:
                        shortcut_files.append(f)
                        shortcut_files_display_names.append(root.get('name'))
                        format_error = False
                    else:
                        # This is added below to index 0
                        default_shortcuts_file_found = True
                        format_error = False

        else:
            format_error = False
            print("Shortcuts file " + f + " found, but ignored.")

        if format_error:
            print("Shortcuts file " + f + " found, but has incorrect format.")

    # Default shortcuts file always goes to index 0
    if default_shortcuts_file_found == True:  # this is a bit unnecessery, it is there unless someone destroys it manually
        shortcut_files.insert(0, DEFAULT_SHORTCUTS_FILE)
        shortcut_files_display_names.insert(0, "Flowblade Default")

    print("Valid shortcut files found: " + str(shortcut_files))
Exemple #8
0
def load_profile_list():
    """ 
    Creates a list of MLT profile objects.
    Called at app start.
    """
    global _profile_list, _factory_profiles, _hidden_factory_profiles, _user_profiles, _proxy_profiles

    user_profiles_dir = userfolders.get_data_dir() + USER_PROFILES_DIR
    _user_profiles = _load_profiles_list(user_profiles_dir)
    _load_factory_profiles()

    _profile_list = _factory_profiles + _user_profiles

    _profile_list.sort(key=_sort_profiles)
    _factory_profiles.sort(key=_sort_profiles)
    _hidden_factory_profiles.sort(key=_sort_profiles)
    _user_profiles.sort(key=_sort_profiles)
Exemple #9
0
def _add_fluxity_rendered_help_media_complete(created_unrendered_clip_path,
                                              container_data):
    rand_id_str = str(os.urandom(16))
    clip_id_str = hashlib.md5(rand_id_str.encode('utf-8')).hexdigest()
    unrendered_clip_path = userfolders.get_data_dir(
    ) + appconsts.CONTAINER_CLIPS_UNRENDERED + "/" + clip_id_str + ".mp4"
    os.replace(created_unrendered_clip_path, unrendered_clip_path)

    container_data.unrendered_media = unrendered_clip_path
    container_data.unrendered_type = appconsts.VIDEO

    throw_away_clip = current_sequence().create_file_producer_clip(
        unrendered_clip_path, "dummy", False, None)
    throw_away_clip.container_data = container_data
    throw_away_clip.container_data.generate_clip_id()

    action_object = containeractions.get_action_object(container_data)
    action_object.plugin_create_render_complete_callback = _plugin_create_render_complete_callback
    action_object.render_full_media(throw_away_clip)
Exemple #10
0
def _profiles_delete_confirm_callback(dialog, response_id, data):
    if response_id != Gtk.ResponseType.ACCEPT:
        dialog.destroy()
        return

    user_profiles_view, delete_indexes = data
    for i in delete_indexes:
        pname, profile = mltprofiles.get_user_profiles()[i]
        profile_file_name = pname.lower().replace(os.sep, "_").replace(" ","_")
        profile_path = userfolders.get_data_dir() + mltprofiles.USER_PROFILES_DIR + profile_file_name
        print profile_path
        try:
            os.remove(profile_path)
        except:
            # This really should not happen
            print "removed user profile already gone ???"

    mltprofiles.load_profile_list()
    user_profiles_view.fill_data_model(mltprofiles.get_user_profiles())
    dialog.destroy()
Exemple #11
0
def _profiles_delete_confirm_callback(dialog, response_id, data):
    if response_id != Gtk.ResponseType.ACCEPT:
        dialog.destroy()
        return

    user_profiles_view, delete_indexes = data
    for i in delete_indexes:
        pname, profile = mltprofiles.get_user_profiles()[i]
        profile_file_name = pname.lower().replace(os.sep, "_").replace(" ","_")
        profile_path = userfolders.get_data_dir() + mltprofiles.USER_PROFILES_DIR + profile_file_name

        try:
            os.remove(profile_path)
        except:
            # This really should not happen
            print("removed user profile already gone ???")

    mltprofiles.load_profile_list()
    user_profiles_view.fill_data_model(mltprofiles.get_user_profiles())
    dialog.destroy()
Exemple #12
0
def _save_profile_clicked(widgets, user_profiles_view):
    load_profile_combo, description, f_rate_num, f_rate_dem, width, height, \
    s_rate_num, s_rate_dem, d_rate_num, d_rate_dem, progressive = widgets

    profile_file_name = description.get_text().lower().replace(os.sep,
                                                               "_").replace(
                                                                   " ", "_")

    file_contents = "description=" + description.get_text() + "\n"
    file_contents += "frame_rate_num=" + f_rate_num.get_text() + "\n"
    file_contents += "frame_rate_den=" + f_rate_dem.get_text() + "\n"
    file_contents += "width=" + width.get_text() + "\n"
    file_contents += "height=" + height.get_text() + "\n"
    if progressive.get_active() == True:
        prog_val = "1"
    else:
        prog_val = "0"
    file_contents += "progressive=" + prog_val + "\n"
    file_contents += "sample_aspect_num=" + s_rate_num.get_text() + "\n"
    file_contents += "sample_aspect_den=" + s_rate_dem.get_text() + "\n"
    file_contents += "display_aspect_num=" + d_rate_num.get_text() + "\n"
    file_contents += "display_aspect_den=" + d_rate_dem.get_text() + "\n"

    profile_path = userfolders.get_data_dir(
    ) + mltprofiles.USER_PROFILES_DIR + profile_file_name

    if os.path.exists(profile_path):
        dialogutils.warning_message(_("Profile '") +  description.get_text() + _("' already exists!"), \
                                _("Delete profile and save again."),  gui.editor_window.window)
        return

    profile_file = open(profile_path, "w")
    profile_file.write(file_contents)
    profile_file.close()

    dialogutils.info_message(_("Profile '") +  description.get_text() + _("' saved."), \
                 _("You can now create a new project using the new profile."), gui.editor_window.window)

    mltprofiles.load_profile_list()
    render.reload_profiles()
    user_profiles_view.fill_data_model(mltprofiles.get_user_profiles())
Exemple #13
0
def update_custom_shortcuts(xml_file):
    # If new shortcuts have been added and user is using custom shortcuts when updating, we need to update customn shortcuts.
    custom_files = os.listdir(userfolders.get_data_dir() + "/" +
                              appconsts.USER_SHORTCUTS_DIR)
    if not (xml_file in custom_files):
        return

    test_root = get_shortcuts_xml_root_node(xml_file)
    def_root = get_shortcuts_xml_root_node(DEFAULT_SHORTCUTS_FILE)

    for code, action_name in _keyboard_action_names.items():
        key_name_test, action_name = get_shortcut_info(test_root, code)
        key_name_def, action_name = get_shortcut_info(def_root, code)
        if key_name_test != key_name_def:
            events = def_root.iter('event')
            for event in events:
                if event.get('code') == code:
                    key_val_name = event.text
                    mods_list = event.get('modifiers')
                    change_custom_shortcut(code, key_val_name, [mods_list],
                                           True)
Exemple #14
0
def _save_profile_clicked(widgets, user_profiles_view):
    load_profile_combo, description, f_rate_num, f_rate_dem, width, height, \
    s_rate_num, s_rate_dem, d_rate_num, d_rate_dem, progressive = widgets

    profile_file_name = description.get_text().lower().replace(os.sep, "_").replace(" ","_")
    
    file_contents = "description=" + description.get_text() + "\n"
    file_contents += "frame_rate_num=" + f_rate_num.get_text() + "\n"
    file_contents += "frame_rate_den=" + f_rate_dem.get_text() + "\n"
    file_contents += "width=" + width.get_text() + "\n"
    file_contents += "height=" + height.get_text() + "\n"
    if progressive.get_active() == True:
        prog_val = "1"
    else:
        prog_val = "0"
    file_contents += "progressive=" + prog_val + "\n"
    file_contents += "sample_aspect_num=" + s_rate_num.get_text() + "\n"
    file_contents += "sample_aspect_den=" + s_rate_dem.get_text() + "\n"
    file_contents += "display_aspect_num=" + d_rate_num.get_text() + "\n"
    file_contents += "display_aspect_den=" + d_rate_dem.get_text() + "\n"

    profile_path = userfolders.get_data_dir() + mltprofiles.USER_PROFILES_DIR + profile_file_name

    if os.path.exists(profile_path):
        dialogutils.warning_message(_("Profile '") +  description.get_text() + _("' already exists!"), \
                                _("Delete profile and save again."),  gui.editor_window.window)
        return

    profile_file = open(profile_path, "w")
    profile_file.write(file_contents)
    profile_file.close()

    dialogutils.info_message(_("Profile '") +  description.get_text() + _("' saved."), \
                 _("You can now create a new project using the new profile."), gui.editor_window.window)
    
    mltprofiles.load_profile_list()
    render.reload_profiles()
    user_profiles_view.fill_data_model(mltprofiles.get_user_profiles())
 def get_container_clips_dir(self):
     return userfolders.get_data_dir() + appconsts.CONTAINER_CLIPS_DIR
Exemple #16
0
def main(root_path, session_id, script, clip_path, range_in, range_out,
         profile_desc):

    os.nice(10)

    prints_to_log_file("/home/janne/gmicheadless")
    print(session_id, script, clip_path, range_in, range_out, profile_desc)

    try:
        editorstate.mlt_version = mlt.LIBMLT_VERSION
    except:
        editorstate.mlt_version = "0.0.99"  # magic string for "not found"

    # Set paths.
    respaths.set_paths(root_path)

    # Check G'MIC version
    global _gmic_version
    _gmic_version = get_gmic_version()
    if _gmic_version == 2:
        respaths.set_gmic2(root_path)

    userfolders.init()
    editorpersistance.load()

    global _session_folder, _clip_frames_folder
    _session_folder = userfolders.get_data_dir(
    ) + appconsts.CONTAINER_CLIPS_DIR + "/" + session_id
    _clip_frames_folder = _session_folder + "/clip_frames"

    # Init gmic session dirs
    if not os.path.exists(_session_folder):
        os.mkdir(_session_folder)
    if not os.path.exists(_clip_frames_folder):
        os.mkdir(_clip_frames_folder)

    # Init translations module with translations data
    translations.init_languages()
    translations.load_filters_translations()
    mlttransitions.init_module()

    repo = mlt.Factory().init()
    processutils.prepare_mlt_repo(repo)

    # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs
    locale.setlocale(locale.LC_NUMERIC, 'C')

    # Check for codecs and formats on the system
    mltenv.check_available_features(repo)
    renderconsumer.load_render_profiles()

    # Load filter and compositor descriptions from xml files.
    mltfilters.load_filters_xml(mltenv.services)
    mlttransitions.load_compositors_xml(mltenv.transitions)

    # Create list of available mlt profiles
    mltprofiles.load_profile_list()

    # Launch server
    DBusGMainLoop(set_as_default=True)
    loop = GLib.MainLoop()
    global _dbus_service
    _dbus_service = GMicHeadlessDBUSService(loop, session_id, script,
                                            clip_path, range_in, range_out,
                                            profile_desc)
    print("tline render service running")
    loop.run()
Exemple #17
0
def _get_shortcut_file_fullpath(f):
    full_path = respaths.SHORTCUTS_PATH + f
    if os.path.isfile(full_path) == False:
        full_path = userfolders.get_data_dir(
        ) + "/" + appconsts.USER_SHORTCUTS_DIR + f
    return full_path
Exemple #18
0
def _get_tline_render_dir():
    return userfolders.get_data_dir() + appconsts.TLINE_RENDERS_DIR
Exemple #19
0
def _get_session_folder(session_id):
    return userfolders.get_data_dir() + appconsts.CONTAINER_CLIPS_DIR +  "/" + session_id