Transcoder Plugins

Transcoder Plugins can be used to transcode item shapes using external third party transcoders. A transcoder plugin nees only a single method that accepts a single argument; an instance of portal.transcode_framework.utils.TranscodeJobHelper

This is a skeleton for a transcoder plugin:

from portal.pluginbase.core import TranscoderPlugin, implements


class ExampleTranscoderPlugin(TranscoderPlugin):
    plugin_guid = "b51ba6b3-d9f9-40f9-9d5b-e7a1ac6bd03b"

def __init__(self):
    # Name of the plugin. Must be unique.
    self.name = "External transcoder plugin"

    # The name of a Django view as defined in urls.py used to create a new instance of the plugin.
    # Optional if the plugin does not have any settings that can be altered.
    self.create_view = "external_transcoder_plugin_new"

    # The name of a Django view used to update the settings of an instance of the plugin.
    # The view takes one argument, shapetagname, which is the name of the shape tag
    # associated with the plugin instance.
    # Optional if the plugin does not have any settings that can be altered.
    self.update_view = "external_transcoder_plugin"
    # This is the role Portal will validate against when transcoding
    # They can be custom roles created for the transcode plugin or reused already existing Portal roles
    self.role = 'custom_transcode_role'

def __call__(self, helper):
    """
    This method performs the actual transcoding.
    The helper argument is an instance of TranscodeJobHelper
    """

    # get the source VSShape to transcode from
    source_shape = helper.getSourceShape()

    # if this plugin instance has any settings that can be altered,
    # the values can be retrieved through the helper
    value = helper.get("name_of_setting")

    # do some transcoding...
    # update transcode progress
    helper.setJobProgress(61)

    # import the result
    helper.importTargetShape(file_path=path_to_transcoded_file, storage_id=id_of_storage)

transcoderplugin = ExampleTranscoderPlugin()

If the plugin requires settings this is how such a settings view might look. The PluginSettings class is a dictionary-like class that saves all of its properties to the shape-tag identified by shapetagname, and an instance of PluginSettings can be found in the PluginHelper object that is provided to the plugin:

from django.shortcuts import redirect
from django import forms
from portal.generic.baseviews import ClassView
from portal.transcode_framework.utils import PluginSettings

class WatchfolderTranscoderView(ClassView):
   def __call__(self):
       shapetagname = self.kwargs.get("shapetagname", None)

       if self.request.method == "GET":
           # edit existing configuration
           if shapetagname:
               # the first argument of PluginSettings must match the name of the plugin
               settings = PluginSettings("External transcoder plugin", shapetagname, self.request.user)
               form = ConfigurationForm(settings)
               return self.main(self.request,
                                template_name="ext_transcoder_plugin/configuration.html",
                                extra_context={"shapetagname": shapetagname,
                                               "pluginname": "External transcoder plugin",
                                               "form": form})

           # new plugin instance
           form = ConfigurationForm()
           return self.main(self.request,
                            template_name="ext_transcoder_plugin/configuration.html",
                            extra_context={"pluginname": "External transcoder plugin",
                                           "form": form})

       if self.request.method == "POST":
           form = ConfigurationForm(self.request.POST)
           if not form.is_valid():
               return self.main(self.request,
                                template_name="ext_transcoder_plugin/configuration.html",
                                extra_context={"shapetagname": shapetagname,
                                               "pluginname": "External transcoder plugin",
                                               "form": form})

           if not shapetagname:
               shapetagname = form.cleaned_data["profile_name"]

           settings = PluginSettings(PLUGIN_NAME, shapetagname, self.request.user, form.cleaned_data)
           if not settings.save():
               raise Exception()
           return redirect("watchfolder_transcoder_plugin", shapetagname)


class ConfigurationForm(forms.Form):

   # form fields
   profile_name = forms.CharField(help_text="Profile name", required=True)
   some_setting = forms.CharField(help_text="Value", required=True)

Error handling

If an exception occurs in the plugin, the corresponding Vidispine job will fail, and the stacktrace will be saved to the metadata field _portalException in the job.

Additionally, an error message can be set in the plugin using:

helper.setErrorMessage("Transcoding failed because of reason.")

This error will be displayed to the user on the Portal job page, and the error message will also be included in the _portalError metadata field.

ITranscoderPlugin

class portal.generic.plugin_interfaces.ITranscoderPlugin

A plugin interface for dispatching transcode jobs to an external transcoder.

Requires: * __call__(helper)

Args: * helper - an instance of portal.transcode_framework.utils.TranscodeJobHelper

Returns * None

TranscodeJobHelper

class portal.transcode_framework.utils.TranscodeJobHelper(transcode_job, transcode_preset)

Helper object containing useful methods and properties.

PluginSettings

class portal.transcode_framework.utils.PluginSettings(plugin_name, shape_tag_name, user, settings=None)

Note

Remember to include roles for your plugin