mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Merged in draft/ffmpeg_with_multiple_paths (pull request #481)
draft/ffmpeg_with-multiple_paths Approved-by: Ondřej Samohel <annatar@annatar.net> Approved-by: Milan Kolar <milan@orbi.tools>
This commit is contained in:
commit
0066c50b59
9 changed files with 83 additions and 39 deletions
56
pype/lib.py
56
pype/lib.py
|
|
@ -13,6 +13,62 @@ import avalon
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def get_paths_from_environ(env_key, return_first=False):
|
||||||
|
"""Return existing paths from specific envirnment variable.
|
||||||
|
|
||||||
|
:param env_key: Environment key where should look for paths.
|
||||||
|
:type env_key: str
|
||||||
|
:param return_first: Return first path on `True`, list of all on `False`.
|
||||||
|
:type return_first: boolean
|
||||||
|
|
||||||
|
Difference when none of paths exists:
|
||||||
|
- when `return_first` is set to `False` then function returns empty list.
|
||||||
|
- when `return_first` is set to `True` then function returns `None`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
existing_paths = []
|
||||||
|
paths = os.environ.get(env_key) or ""
|
||||||
|
path_items = paths.split(os.pathsep)
|
||||||
|
for path in path_items:
|
||||||
|
# Skip empty string
|
||||||
|
if not path:
|
||||||
|
continue
|
||||||
|
# Normalize path
|
||||||
|
path = os.path.normpath(path)
|
||||||
|
# Check if path exists
|
||||||
|
if os.path.exists(path):
|
||||||
|
# Return path if `return_first` is set to True
|
||||||
|
if return_first:
|
||||||
|
return path
|
||||||
|
# Store path
|
||||||
|
existing_paths.append(path)
|
||||||
|
|
||||||
|
# Return None if none of paths exists
|
||||||
|
if return_first:
|
||||||
|
return None
|
||||||
|
# Return all existing paths from environment variable
|
||||||
|
return existing_paths
|
||||||
|
|
||||||
|
|
||||||
|
def get_ffmpeg_tool_path(tool="ffmpeg"):
|
||||||
|
"""Find path to ffmpeg tool in FFMPEG_PATH paths.
|
||||||
|
|
||||||
|
Function looks for tool in paths set in FFMPEG_PATH environment. If tool
|
||||||
|
exists then returns it's full path.
|
||||||
|
|
||||||
|
Returns tool name itself when tool path was not found. (FFmpeg path may be
|
||||||
|
set in PATH environment variable)
|
||||||
|
"""
|
||||||
|
|
||||||
|
dir_paths = get_paths_from_environ("FFMPEG_PATH")
|
||||||
|
for dir_path in dir_paths:
|
||||||
|
for file_name in os.listdir(dir_path):
|
||||||
|
base, ext = os.path.splitext(file_name)
|
||||||
|
if base.lower() == tool.lower():
|
||||||
|
return os.path.join(dir_path, tool)
|
||||||
|
return tool
|
||||||
|
|
||||||
|
|
||||||
# Special naming case for subprocess since its a built-in method.
|
# Special naming case for subprocess since its a built-in method.
|
||||||
def _subprocess(*args, **kwargs):
|
def _subprocess(*args, **kwargs):
|
||||||
"""Convenience method for getting output errors for subprocess."""
|
"""Convenience method for getting output errors for subprocess."""
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import os
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
import clique
|
import clique
|
||||||
import pype.api
|
import pype.api
|
||||||
|
import pype.lib
|
||||||
|
|
||||||
|
|
||||||
class ExtractJpegEXR(pyblish.api.InstancePlugin):
|
class ExtractJpegEXR(pyblish.api.InstancePlugin):
|
||||||
|
|
@ -69,9 +70,10 @@ class ExtractJpegEXR(pyblish.api.InstancePlugin):
|
||||||
proj_name = os.environ.get('AVALON_PROJECT', '__default__')
|
proj_name = os.environ.get('AVALON_PROJECT', '__default__')
|
||||||
profile = config_data.get(proj_name, config_data['__default__'])
|
profile = config_data.get(proj_name, config_data['__default__'])
|
||||||
|
|
||||||
|
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
|
||||||
|
|
||||||
jpeg_items = []
|
jpeg_items = []
|
||||||
jpeg_items.append(
|
jpeg_items.append(ffmpeg_path)
|
||||||
os.path.join(os.environ.get("FFMPEG_PATH"), "ffmpeg"))
|
|
||||||
# override file if already exists
|
# override file if already exists
|
||||||
jpeg_items.append("-y")
|
jpeg_items.append("-y")
|
||||||
# use same input args like with mov
|
# use same input args like with mov
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import os
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
import clique
|
import clique
|
||||||
import pype.api
|
import pype.api
|
||||||
|
import pype.lib
|
||||||
|
|
||||||
|
|
||||||
class ExtractReview(pyblish.api.InstancePlugin):
|
class ExtractReview(pyblish.api.InstancePlugin):
|
||||||
|
|
@ -40,6 +41,8 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
||||||
# get representation and loop them
|
# get representation and loop them
|
||||||
representations = inst_data["representations"]
|
representations = inst_data["representations"]
|
||||||
|
|
||||||
|
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
|
||||||
|
|
||||||
# filter out mov and img sequences
|
# filter out mov and img sequences
|
||||||
representations_new = representations[:]
|
representations_new = representations[:]
|
||||||
for repre in representations:
|
for repre in representations:
|
||||||
|
|
@ -327,10 +330,7 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
||||||
os.mkdir(stg_dir)
|
os.mkdir(stg_dir)
|
||||||
|
|
||||||
mov_args = [
|
mov_args = [
|
||||||
os.path.join(
|
ffmpeg_path,
|
||||||
os.environ.get(
|
|
||||||
"FFMPEG_PATH",
|
|
||||||
""), "ffmpeg"),
|
|
||||||
" ".join(input_args),
|
" ".join(input_args),
|
||||||
" ".join(output_args)
|
" ".join(output_args)
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import pype.api
|
import pype.api
|
||||||
|
import pype.lib
|
||||||
import pyblish
|
import pyblish
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -21,7 +22,7 @@ class ExtractReviewSlate(pype.api.Extractor):
|
||||||
|
|
||||||
suffix = "_slate"
|
suffix = "_slate"
|
||||||
slate_path = inst_data.get("slateFrame")
|
slate_path = inst_data.get("slateFrame")
|
||||||
ffmpeg_path = os.path.join(os.environ.get("FFMPEG_PATH", ""), "ffmpeg")
|
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
|
||||||
|
|
||||||
to_width = 1920
|
to_width = 1920
|
||||||
to_height = 1080
|
to_height = 1080
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import pype.lib
|
||||||
try:
|
try:
|
||||||
import os.errno as errno
|
import os.errno as errno
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import errno
|
import errno
|
||||||
|
|
||||||
|
|
||||||
class ValidateFfmpegInstallef(pyblish.api.Validator):
|
class ValidateFFmpegInstalled(pyblish.api.Validator):
|
||||||
"""Validate availability of ffmpeg tool in PATH"""
|
"""Validate availability of ffmpeg tool in PATH"""
|
||||||
|
|
||||||
order = pyblish.api.ValidatorOrder
|
order = pyblish.api.ValidatorOrder
|
||||||
|
|
@ -27,10 +28,8 @@ class ValidateFfmpegInstallef(pyblish.api.Validator):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def process(self, instance):
|
def process(self, instance):
|
||||||
self.log.info("ffmpeg path: `{}`".format(
|
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
|
||||||
os.environ.get("FFMPEG_PATH", "")))
|
self.log.info("ffmpeg path: `{}`".format(ffmpeg_path))
|
||||||
if self.is_tool(
|
if self.is_tool(ffmpeg_path) is False:
|
||||||
os.path.join(
|
|
||||||
os.environ.get("FFMPEG_PATH", ""), "ffmpeg")) is False:
|
|
||||||
self.log.error("ffmpeg not found in PATH")
|
self.log.error("ffmpeg not found in PATH")
|
||||||
raise RuntimeError('ffmpeg not installed.')
|
raise RuntimeError('ffmpeg not installed.')
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import tempfile
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
import clique
|
import clique
|
||||||
import pype.api
|
import pype.api
|
||||||
|
import pype.lib
|
||||||
|
|
||||||
|
|
||||||
class ExtractReviewSP(pyblish.api.InstancePlugin):
|
class ExtractReviewSP(pyblish.api.InstancePlugin):
|
||||||
|
|
@ -148,12 +149,7 @@ class ExtractReviewSP(pyblish.api.InstancePlugin):
|
||||||
# output filename
|
# output filename
|
||||||
output_args.append(full_output_path)
|
output_args.append(full_output_path)
|
||||||
|
|
||||||
ffmpeg_path = os.getenv("FFMPEG_PATH", "")
|
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
|
||||||
if ffmpeg_path:
|
|
||||||
ffmpeg_path += "/ffmpeg"
|
|
||||||
else:
|
|
||||||
ffmpeg_path = "ffmpeg"
|
|
||||||
|
|
||||||
mov_args = [
|
mov_args = [
|
||||||
ffmpeg_path,
|
ffmpeg_path,
|
||||||
" ".join(input_args),
|
" ".join(input_args),
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import tempfile
|
||||||
import subprocess
|
import subprocess
|
||||||
import pyblish.api
|
import pyblish.api
|
||||||
import pype.api
|
import pype.api
|
||||||
|
import pype.lib
|
||||||
|
|
||||||
|
|
||||||
class ExtractThumbnailSP(pyblish.api.InstancePlugin):
|
class ExtractThumbnailSP(pyblish.api.InstancePlugin):
|
||||||
|
|
@ -73,11 +74,7 @@ class ExtractThumbnailSP(pyblish.api.InstancePlugin):
|
||||||
config_data.get("__default__", {})
|
config_data.get("__default__", {})
|
||||||
)
|
)
|
||||||
|
|
||||||
ffmpeg_path = os.getenv("FFMPEG_PATH", "")
|
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
|
||||||
if ffmpeg_path:
|
|
||||||
ffmpeg_path += "/ffmpeg"
|
|
||||||
else:
|
|
||||||
ffmpeg_path = "ffmpeg"
|
|
||||||
|
|
||||||
jpeg_items = []
|
jpeg_items = []
|
||||||
jpeg_items.append(ffmpeg_path)
|
jpeg_items.append(ffmpeg_path)
|
||||||
|
|
|
||||||
|
|
@ -6,25 +6,22 @@ import json
|
||||||
import opentimelineio_contrib.adapters.ffmpeg_burnins as ffmpeg_burnins
|
import opentimelineio_contrib.adapters.ffmpeg_burnins as ffmpeg_burnins
|
||||||
from pypeapp.lib import config
|
from pypeapp.lib import config
|
||||||
from pypeapp import Logger
|
from pypeapp import Logger
|
||||||
|
import pype.lib
|
||||||
|
|
||||||
log = Logger().get_logger("BurninWrapper", "burninwrap")
|
log = Logger().get_logger("BurninWrapper", "burninwrap")
|
||||||
|
|
||||||
|
|
||||||
ffmpeg_path = os.environ.get("FFMPEG_PATH")
|
ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg")
|
||||||
if ffmpeg_path and os.path.exists(ffmpeg_path):
|
ffprobe_path = pype.lib.get_ffmpeg_tool_path("ffprobe")
|
||||||
# add separator "/" or "\" to be prepared for next part
|
|
||||||
ffmpeg_path += os.path.sep
|
|
||||||
else:
|
|
||||||
ffmpeg_path = ""
|
|
||||||
|
|
||||||
FFMPEG = (
|
FFMPEG = (
|
||||||
'{} -loglevel panic -i %(input)s %(filters)s %(args)s%(output)s'
|
'{} -loglevel panic -i %(input)s %(filters)s %(args)s%(output)s'
|
||||||
).format(os.path.normpath(ffmpeg_path + "ffmpeg"))
|
).format(ffmpeg_path)
|
||||||
|
|
||||||
FFPROBE = (
|
FFPROBE = (
|
||||||
'{} -v quiet -print_format json -show_format -show_streams %(source)s'
|
'{} -v quiet -print_format json -show_format -show_streams %(source)s'
|
||||||
).format(os.path.normpath(ffmpeg_path + "ffprobe"))
|
).format(ffprobe_path)
|
||||||
|
|
||||||
DRAWTEXT = (
|
DRAWTEXT = (
|
||||||
"drawtext=text=\\'%(text)s\\':x=%(x)s:y=%(y)s:fontcolor="
|
"drawtext=text=\\'%(text)s\\':x=%(x)s:y=%(y)s:fontcolor="
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import json
|
||||||
import clique
|
import clique
|
||||||
import subprocess
|
import subprocess
|
||||||
from pypeapp import config
|
from pypeapp import config
|
||||||
|
import pype.lib
|
||||||
from . import QtWidgets, QtCore
|
from . import QtWidgets, QtCore
|
||||||
from . import DropEmpty, ComponentsList, ComponentItem
|
from . import DropEmpty, ComponentsList, ComponentItem
|
||||||
|
|
||||||
|
|
@ -224,12 +225,7 @@ class DropDataFrame(QtWidgets.QFrame):
|
||||||
self._process_data(data)
|
self._process_data(data)
|
||||||
|
|
||||||
def load_data_with_probe(self, filepath):
|
def load_data_with_probe(self, filepath):
|
||||||
ffprobe_path = os.getenv("FFMPEG_PATH", "")
|
ffprobe_path = pype.lib.get_ffmpeg_tool_path("ffprobe")
|
||||||
if ffprobe_path:
|
|
||||||
ffprobe_path += '/ffprobe'
|
|
||||||
else:
|
|
||||||
ffprobe_path = 'ffprobe'
|
|
||||||
|
|
||||||
args = [
|
args = [
|
||||||
ffprobe_path,
|
ffprobe_path,
|
||||||
'-v', 'quiet',
|
'-v', 'quiet',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue