Skip to content

Instantly share code, notes, and snippets.

@tokejepsen
Last active March 15, 2020 22:38
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tokejepsen/77d02d8f2f09e27de08b to your computer and use it in GitHub Desktop.
Save tokejepsen/77d02d8f2f09e27de08b to your computer and use it in GitHub Desktop.
DJV Viewer action
import sys
import argparse
import logging
import os
import getpass
import pprint
import subprocess
import ftrack
class DJVViewer(ftrack.Action):
'''Custom action.'''
#: Action identifier.
identifier = 'djvviewer'
#: Action label.
label = 'DJV Viewer'
def __init__(self):
'''Initialise action handler.'''
self.log = logging.getLogger(
__name__ + '.' + self.__class__.__name__
)
def register(self):
'''Register action.'''
ftrack.EVENT_HUB.subscribe(
'topic=ftrack.action.discover and source.user.username={0}'.format(
getpass.getuser()
),
self.discover
)
ftrack.EVENT_HUB.subscribe(
'topic=ftrack.action.launch and source.user.username={0} '
'and data.actionIdentifier={1}'.format(
getpass.getuser(), self.identifier
),
self.launch
)
def discover(self, event):
return {
'items': [{
'label': self.label,
'actionIdentifier': self.identifier,
}]
}
def launch(self, event):
data = event['data']
selection = data.get('selection', [])
if 'values' in event['data']:
# Do something with the values or return a new form.
values = event['data']['values']
for item in selection:
version = None
try:
task = ftrack.Task(item['entityId'])
asset = task.getAssets(assetTypes=['img'])[0]
version = asset.getVersions()[-1]
except:
version = ftrack.AssetVersion(item['entityId'])
if version.getAsset().getType().getShort() == 'img':
component = None
try:
component = version.getComponent(values['component'])
except:
pass
if component:
path = component.getFilesystemPath()
extension = os.path.splitext(path)
random_file = None
for f in os.listdir(os.path.dirname(path)):
if f.endswith(extension):
dir_path = os.path.dirname(path)
random_file = os.path.join(dir_path, f)
djv_path = r'INTALL PATH\bin\djv_view.exe'
args = [djv_path, random_file]
subprocess.Popen(args)
return {
'success': True,
'message': 'DJV Viewer launched.'
}
# finding components on version
components = []
for item in selection:
version = None
try:
task = ftrack.Task(item['entityId'])
asset = task.getAssets(assetTypes=['img'])[0]
version = asset.getVersions()[-1]
except:
version = ftrack.AssetVersion(item['entityId'])
if not version.get('ispublished'):
version.publish()
if version.getAsset().getType().getShort() == 'img':
for c in version.getComponents():
components.append(c.getName())
data = []
for c in set(components):
data.append({'label': c, 'value': c})
return {
'items': [
{
'label': 'Component to view',
'type': 'enumerator',
'name': 'component',
'data': data
}
]
}
def register(registry, **kw):
'''Register action. Called when used as an event plugin.'''
logging.basicConfig(level=logging.INFO)
action = DJVViewer()
action.register()
def main(arguments=None):
'''Set up logging and register action.'''
if arguments is None:
arguments = []
parser = argparse.ArgumentParser()
# Allow setting of logging level from arguments.
loggingLevels = {}
for level in (
logging.NOTSET, logging.DEBUG, logging.INFO, logging.WARNING,
logging.ERROR, logging.CRITICAL
):
loggingLevels[logging.getLevelName(level).lower()] = level
parser.add_argument(
'-v', '--verbosity',
help='Set the logging output verbosity.',
choices=loggingLevels.keys(),
default='info'
)
namespace = parser.parse_args(arguments)
'''Register action and listen for events.'''
logging.basicConfig(level=loggingLevels[namespace.verbosity])
ftrack.setup()
action = DJVViewer()
action.register()
ftrack.EVENT_HUB.wait()
if __name__ == '__main__':
raise SystemExit(main(sys.argv[1:]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment