Meshroom/meshroom/nodes/aliceVision/Publish.py
Candice Bentéjac 41280dc22a [nodes] M-P: Harmonize and improve labels and descriptions
Use CamelCase for all labels, always end descriptions with periods, and
replace the mixed use of single and double quotes with double quotes
only.
2023-06-16 10:31:42 +02:00

92 lines
3 KiB
Python

from __future__ import print_function
__version__ = "1.3"
from meshroom.core import desc
import distutils.dir_util as du
import shutil
import glob
import os
class Publish(desc.Node):
size = desc.DynamicNodeSize('inputFiles')
category = 'Export'
documentation = '''
This node allows to copy files into a specific folder.
'''
inputs = [
desc.ListAttribute(
elementDesc=desc.File(
name="input",
label="Input",
description="",
value="",
uid=[0],
),
name="inputFiles",
label="Input Files",
description="Input files or folders' content to publish.",
group="",
),
desc.File(
name="output",
label="Output Folder",
description="Folder to publish to.",
value="",
uid=[0],
),
desc.ChoiceParam(
name="verboseLevel",
label="Verbose Level",
description="Verbosity level (fatal, error, warning, info, debug, trace).",
value="info",
values=["fatal", "error", "warning", "info", "debug", "trace"],
exclusive=True,
uid=[],
),
]
def resolvedPaths(self, inputFiles, outDir):
paths = {}
for inputFile in inputFiles:
for f in glob.glob(inputFile.value):
if os.path.isdir(f):
paths[f] = outDir # Do not concatenate the input folder's name with the output's
else:
paths[f] = os.path.join(outDir, os.path.basename(f))
return paths
def processChunk(self, chunk):
try:
chunk.logManager.start(chunk.node.verboseLevel.value)
if not chunk.node.inputFiles:
chunk.logger.warning('Nothing to publish')
return
if not chunk.node.output.value:
return
outFiles = self.resolvedPaths(chunk.node.inputFiles.value, chunk.node.output.value)
if not outFiles:
error = 'Publish: input files listed, but nothing to publish'
chunk.logger.error(error)
chunk.logger.info('Listed input files: {}'.format([i.value for i in chunk.node.inputFiles.value]))
raise RuntimeError(error)
if not os.path.exists(chunk.node.output.value):
os.mkdir(chunk.node.output.value)
for iFile, oFile in outFiles.items():
if os.path.isdir(iFile): # If the input is a directory, copy the directory's content
chunk.logger.info('Publish directory {} into {}'.format(iFile, oFile))
du.copy_tree(iFile, oFile)
else:
chunk.logger.info('Publish file {} into {}'.format(iFile, oFile))
shutil.copyfile(iFile, oFile)
chunk.logger.info('Publish end')
finally:
chunk.logManager.end()