feat(premiere): wip wrapper

This commit is contained in:
Jakub Jezek 2020-04-01 22:25:49 +02:00
parent 70ef1d8ebc
commit 124e61a847
No known key found for this signature in database
GPG key ID: C4B96E101D2A47F3
3 changed files with 183 additions and 234 deletions

View file

@ -1,11 +1,8 @@
import logging
import os
import traceback
from pype.lib import PypeHook
from pypeapp import Logger
log = logging.getLogger(__name__)
class PremierePrelaunch(PypeHook):
"""
@ -26,11 +23,16 @@ class PremierePrelaunch(PypeHook):
def execute(self, *args, env: dict = None) -> bool:
if not env:
env = os.environ
EXTENSIONS_CACHE_PATH = env.get("EXTENSIONS_CACHE_PATH", None)
self.log.debug(
"_ EXTENSIONS_CACHE_PATH: `{}`".format(EXTENSIONS_CACHE_PATH))
asset = env["AVALON_ASSET"]
task = env["AVALON_TASK"]
workdir = env["AVALON_WORKDIR"]
project_name = f"{asset}_{task}"
import importlib
import avalon.api
import pype.premiere
avalon.api.install(pype.premiere)
@ -40,13 +42,14 @@ class PremierePrelaunch(PypeHook):
__import__("pyblish")
except ImportError as e:
print traceback.format_exc()
print(traceback.format_exc())
print("pyblish: Could not load integration: %s " % e)
else:
# Setup integration
import pype.premiere.lib
pype.premiere.lib.setup()
from pype.premiere import lib as prlib
importlib.reload(prlib)
prlib.setup(env)
self.log.debug("_ self.signature: `{}`".format(self.signature))
self.log.debug("_ asset: `{}`".format(asset))

View file

@ -1,167 +1,73 @@
import os
import sys
import shutil
from pysync import walktree
from avalon import api as avalon
from pyblish import api as pyblish
from app import api as app
from .. import api
import requests
from pypeapp import Logger
from .pipeline import (
install,
uninstall,
from .lib import (
setup,
reload_pipeline,
ls
ls,
LOAD_PATH,
INVENTORY_PATH,
CREATE_PATH,
PUBLISH_PATH,
PLUGINS_DIR
)
__all__ = [
"install",
"uninstall",
"setup",
"reload_pipeline",
"ls"
]
log = api.Logger.getLogger(__name__, "premiere")
AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype")
EXTENSIONS_PATH_LOCAL = os.getenv("EXTENSIONS_PATH", None)
EXTENSIONS_CACHE_PATH = os.getenv("EXTENSIONS_CACHE_PATH", None)
EXTENSIONS_PATH_REMOTE = os.path.join(os.path.dirname(__file__), "extensions")
PARENT_DIR = os.path.dirname(__file__)
PACKAGE_DIR = os.path.dirname(PARENT_DIR)
PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins")
_clearing_cache = ["com.pype.rename", "com.pype.avalon"]
PUBLISH_PATH = os.path.join(
PLUGINS_DIR, "premiere", "publish"
).replace("\\", "/")
if os.getenv("PUBLISH_PATH", None):
os.environ["PUBLISH_PATH"] = os.pathsep.join(
os.environ["PUBLISH_PATH"].split(os.pathsep) +
[PUBLISH_PATH]
)
else:
os.environ["PUBLISH_PATH"] = PUBLISH_PATH
LOAD_PATH = os.path.join(PLUGINS_DIR, "premiere", "load")
CREATE_PATH = os.path.join(PLUGINS_DIR, "premiere", "create")
INVENTORY_PATH = os.path.join(PLUGINS_DIR, "premiere", "inventory")
log.debug("_clearing_cache: {}".format(_clearing_cache))
def clearing_caches_ui():
'''Before every start of premiere it will make sure there is not
outdated stuff in cep_cache dir'''
for d in os.listdir(EXTENSIONS_CACHE_PATH):
match = [p for p in _clearing_cache
if str(p) in d]
if match:
try:
path = os.path.normpath(os.path.join(EXTENSIONS_CACHE_PATH, d))
log.info("Removing dir: {}".format(path))
shutil.rmtree(path, ignore_errors=True)
except Exception as e:
log.debug("problem: {}".format(e))
def request_aport(url_path, data={}):
try:
api.add_tool_to_environment(["aport_0.1"])
ip = os.getenv("PICO_IP", None)
if ip and ip.startswith('http'):
ip = ip.replace("http://", "")
port = int(os.getenv("PICO_PORT", None))
url = "http://{0}:{1}{2}".format(ip, port, url_path)
req = requests.post(url, data=data).text
return req
except Exception as e:
api.message(title="Premiere Aport Server",
message="Before you can run Premiere, start Aport Server. \n Error: {}".format(
e),
level="critical")
def extensions_sync():
# import time
process_pairs = list()
# get extensions dir in pype.premiere.extensions
# build dir path to premiere cep extensions
for name in os.listdir(EXTENSIONS_PATH_REMOTE):
print(name)
src = os.path.join(EXTENSIONS_PATH_REMOTE, name)
dst = os.path.join(EXTENSIONS_PATH_LOCAL, name)
process_pairs.append((name, src, dst))
# synchronize all extensions
for name, src, dst in process_pairs:
if not os.path.exists(dst):
os.makedirs(dst, mode=0o777)
walktree(source=src, target=dst, options_input=["y", ">"])
log.info("Extension {0} from `{1}` coppied to `{2}`".format(
name, src, dst
))
# time.sleep(10)
return
log = Logger().get_logger(__name__, "premiere")
def install():
"""Install Premiere-specific functionality of avalon-core.
log.info("Registering Premiera plug-ins..")
reg_paths = request_aport("/api/register_plugin_path",
{"publish_path": PUBLISH_PATH})
This is where you install menus and register families, data
and loaders into Premiere.
It is called automatically when installing via `api.install(premiere)`.
See the Maya equivalent for inspiration on how to implement this.
"""
# Disable all families except for the ones we explicitly want to see
family_states = [
"imagesequence",
"mov"
]
avalon.data["familiesStateDefault"] = False
avalon.data["familiesStateToggled"] = family_states
# load data from templates
api.load_data_from_templates()
log.info("pype.premiere installed")
# remove cep_cache from user temp dir
clearing_caches_ui()
pyblish.register_host("premiere")
pyblish.register_plugin_path(PUBLISH_PATH)
log.info("Registering Premiera plug-ins..")
# synchronize extensions
extensions_sync()
message = "The Pype extension has been installed. " \
"\nThe following publishing paths has been registered: " \
"\n\n{}".format(
reg_paths)
api.message(title="pyblish_paths", message=message, level="info")
# launching premiere
exe = r"C:\Program Files\Adobe\Adobe Premiere Pro CC 2019\Adobe Premiere Pro.exe".replace(
"\\", "/")
log.info("____path exists: {}".format(os.path.exists(exe)))
app.forward(args=[exe],
silent=False,
cwd=os.getcwd(),
env=dict(os.environ),
shell=None)
avalon.register_plugin_path(avalon.Loader, LOAD_PATH)
avalon.register_plugin_path(avalon.Creator, CREATE_PATH)
def uninstall():
log.info("Deregistering Premiera plug-ins..")
"""Uninstall all tha was installed
This is where you undo everything that was done in `install()`.
That means, removing menus, deregistering families and data
and everything. It should be as though `install()` was never run,
because odds are calling this function means the user is interested
in re-installing shortly afterwards. If, for example, he has been
modifying the menu or registered families.
"""
pyblish.deregister_host("premiere")
pyblish.deregister_plugin_path(PUBLISH_PATH)
log.info("Deregistering Premiera plug-ins..")
avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH)
avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH)
# reset data from templates
api.reset_data_from_templates()

View file

@ -1,14 +1,49 @@
import os
import importlib
from pyblish import api as pyblish
import sys
import shutil
import json
from pysync import walktree
import requests
from avalon import api
import logging
from pype.widgets.message_window import message
from pypeapp import Logger
log = logging.getLogger(__name__)
log = Logger().get_logger(__name__, "premiere")
self = sys.modules[__name__]
self._has_been_setup = False
self._registered_gui = None
AVALON_CONFIG = os.environ["AVALON_CONFIG"]
PARENT_DIR = os.path.dirname(__file__)
PACKAGE_DIR = os.path.dirname(PARENT_DIR)
PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins")
self.EXTENSIONS_PATH_REMOTE = os.path.join(PARENT_DIR, "extensions")
self.EXTENSIONS_PATH_LOCAL = None
self.EXTENSIONS_CACHE_PATH = None
self.LOAD_PATH = os.path.join(PLUGINS_DIR, "premiere", "load")
self.CREATE_PATH = os.path.join(PLUGINS_DIR, "premiere", "create")
self.INVENTORY_PATH = os.path.join(PLUGINS_DIR, "premiere", "inventory")
self.PUBLISH_PATH = os.path.join(
PLUGINS_DIR, "premiere", "publish"
).replace("\\", "/")
if os.getenv("PUBLISH_PATH", None):
os.environ["PUBLISH_PATH"] = os.pathsep.join(
os.environ["PUBLISH_PATH"].split(os.pathsep) +
[self.PUBLISH_PATH]
)
else:
os.environ["PUBLISH_PATH"] = self.PUBLISH_PATH
_clearing_cache = ["com.pype.rename", "com.pype.avalon"]
def ls():
pass
@ -31,107 +66,112 @@ def reload_pipeline():
"avalon.api",
"avalon.tools",
"avalon.tools.loader.app",
"avalon.tools.creator.app",
"avalon.tools.manager.app",
"avalon.premiere",
"avalon.premiere.pipeline",
"{}".format(AVALON_CONFIG)
"{}".format(AVALON_CONFIG),
"{}.premiere".format(AVALON_CONFIG),
"{}.premiere.lib".format(AVALON_CONFIG)
):
log.info("Reloading module: {}...".format(module))
module = importlib.import_module(module)
reload(module)
try:
module = importlib.import_module(module)
reload(module)
except Exception as e:
log.warning("Cannot reload module: {}".format(e))
importlib.reload(module)
import avalon.premiere
api.install(avalon.premiere)
def install(config):
"""Install Premiere-specific functionality of avalon-core.
This is where you install menus and register families, data
and loaders into Premiere.
It is called automatically when installing via `api.install(premiere)`.
See the Maya equivalent for inspiration on how to implement this.
def setup(env=None):
""" Running wrapper
"""
if not env:
env = os.environ
pyblish.register_host("premiere")
# Trigger install on the config's "premiere" package
config = find_host_config(config)
self.EXTENSIONS_PATH_LOCAL = env["EXTENSIONS_PATH"]
self.EXTENSIONS_CACHE_PATH = env["EXTENSIONS_CACHE_PATH"]
if hasattr(config, "install"):
config.install()
log.info("Registering Premiera plug-ins..")
if not test_rest_api_server():
return
log.info("config.premiere installed")
# remove cep_cache from user temp dir
clearing_caches_ui()
# synchronize extensions
extensions_sync()
log.info("Premiere Pype wrapper has been installed")
def find_host_config(config):
def extensions_sync():
# import time
process_pairs = list()
# get extensions dir in pype.premiere.extensions
# build dir path to premiere cep extensions
for name in os.listdir(self.EXTENSIONS_PATH_REMOTE):
log.debug("> name: {}".format(name))
src = os.path.join(self.EXTENSIONS_PATH_REMOTE, name)
dst = os.path.join(self.EXTENSIONS_PATH_LOCAL, name)
process_pairs.append((name, src, dst))
# synchronize all extensions
for name, src, dst in process_pairs:
if not os.path.exists(dst):
os.makedirs(dst, mode=0o777)
walktree(source=src, target=dst, options_input=["y", ">"])
log.info("Extension {0} from `{1}` coppied to `{2}`".format(
name, src, dst
))
# time.sleep(10)
return
def clearing_caches_ui():
'''Before every start of premiere it will make sure there is not
outdated stuff in cep_cache dir'''
if not os.path.isdir(self.EXTENSIONS_CACHE_PATH):
os.makedirs(self.EXTENSIONS_CACHE_PATH, mode=0o777)
log.info("Created dir: {}".format(self.EXTENSIONS_CACHE_PATH))
for d in os.listdir(self.EXTENSIONS_CACHE_PATH):
match = [p for p in _clearing_cache
if str(p) in d]
if match:
try:
path = os.path.normpath(
os.path.join(self.EXTENSIONS_CACHE_PATH, d))
log.info("Removing dir: {}".format(path))
shutil.rmtree(path, ignore_errors=True)
except Exception as e:
log.debug("problem: {}".format(e))
def test_rest_api_server():
from pprint import pformat
rest_url = os.getenv("PYPE_REST_API_URL")
project_name = "{AVALON_PROJECT}".format(**dict(os.environ))
URL = "/".join((rest_url,
"avalon/projects",
project_name))
log.debug("__ URL: {}".format(URL))
try:
config = importlib.import_module(config.__name__ + ".premiere")
except ImportError as exc:
if str(exc) != "No module name {}".format(
config.__name__ + ".premiere"):
raise
config = None
req = requests.get(URL, data={}).text
req_json = json.loads(req)
# log.debug("_ req_json: {}".format(pformat(req_json)))
log.debug("__ projectName: {}".format(req_json["data"]["name"]))
assert req_json["data"]["name"] == project_name, (
"Project data from Rest API server not correct")
return True
return config
def uninstall(config):
"""Uninstall all tha was installed
This is where you undo everything that was done in `install()`.
That means, removing menus, deregistering families and data
and everything. It should be as though `install()` was never run,
because odds are calling this function means the user is interested
in re-installing shortly afterwards. If, for example, he has been
modifying the menu or registered families.
"""
config = find_host_config(config)
if hasattr(config, "uninstall"):
config.uninstall()
pyblish.deregister_host("premiere")
def get_anatomy(**kwarg):
return pype.Anatomy
def get_dataflow(**kwarg):
log.info(kwarg)
host = kwarg.get("host", "premiere")
cls = kwarg.get("class", None)
preset = kwarg.get("preset", None)
assert any([host, cls]), log.error("premiera.lib.get_dataflow():"
"Missing mandatory kwargs `host`, `cls`")
pr_dataflow = getattr(pype.Dataflow, str(host), None)
pr_dataflow_node = getattr(pr_dataflow.nodes, str(cls), None)
if preset:
pr_dataflow_node = getattr(pr_dataflow_node, str(preset), None)
log.info("Dataflow: {}".format(pr_dataflow_node))
return pr_dataflow_node
def get_colorspace(**kwarg):
log.info(kwarg)
host = kwarg.get("host", "premiere")
cls = kwarg.get("class", None)
preset = kwarg.get("preset", None)
assert any([host, cls]), log.error("premiera.templates.get_colorspace():"
"Missing mandatory kwargs `host`, `cls`")
pr_colorspace = getattr(pype.Colorspace, str(host), None)
pr_colorspace_node = getattr(pr_colorspace, str(cls), None)
if preset:
pr_colorspace_node = getattr(pr_colorspace_node, str(preset), None)
log.info("Colorspace: {}".format(pr_colorspace_node))
return pr_colorspace_node
except Exception as e:
message(title="Pype Rest API static server is not running ",
message=("Before you can run Premiere, make sure "
"the system Tray Pype icon is running and "
"submenu `service` with name `Rest API` is "
"with green icon."
"\n Error: {}".format(e)),
level="critical")