"""
Custom file resolver derived from MPxFileResolver that handles
the URI 'htpp' scheme.
When this resolver is active, URI file paths using the 'http://<domain>/'
scheme will be processed using methods on this class.
Refer to MPxFileResolver for more information about custom file resolvers.
To use, make sure that adskHttpSchemeResolver.py is in
your MAYA_PLUG_IN_PATH then do the following:
# Load the plug-in
import maya.cmds
maya.cmds.loadPlugin("adskHttpSchemeResolver.py")
# Once loaded, Maya will call the resolver methods in this plug-in when
# a URI file path is encountered during file resolution processing
# (file open, setAttr, etc.)
# Unload the plug-in
maya.cmds.unloadPlugin("adskHttpSchemeResolver")
# Maya will no longer have access to this file
# resolver to handle URI file paths using the 'http:///' scheme
"""
import sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
import maya.cmds as cmds
import urllib
import os.path
kTempDir = cmds.internalVar(userTmpDir=True)
kWantStatusOutput = True;
def downloadProgress(data, dataSize, fileSize):
""" Display download progress - callback invoked by urllib.urlretrieve """
percent = 100.0*data*dataSize/fileSize
if percent > 100:
percent = 100
printStatus('Download progress: %.2f%%' % (percent))
def printStatus(msg):
""" Print status output for diagnostic purposes (when enabled) """
if (kWantStatusOutput):
sys.stderr.write('%s: %s\n' % (adskHttpSchemeResolver.className(), msg) )
def printWarning(msg):
""" Print warning messages """
sys.stderr.write('Warning %s: %s\n' % (adskHttpSchemeResolver.className(), msg) )
class adskHttpSchemeResolver(OpenMayaMPx.MPxFileResolver):
"""
This custom plug-in resolver handles the 'http' uri scheme.
This resolver will copy the file from its 'http' location
using standard url library to a temporary location. This temporary location
of the file is the fully qualified resolved path.
It also implements a crude caching system.
"""
kPluginURIScheme = "http"
kPluginResolverName = "adskHttpSchemeResolver"
def __init__(self):
OpenMayaMPx.MPxFileResolver.__init__(self)
def uriScheme(self):
return(self.kPluginURIScheme)
def resolveURI(self,URI,mode):
uri = URI.asString()
tempFile = kTempDir + URI.getFileName()
result = u''
if mode & OpenMayaMPx.MPxFileResolver.kNone:
result = tempFile;
elif mode & OpenMayaMPx.MPxFileResolver.kInput:
if not os.path.exists(tempFile):
printStatus('Downloading URI: %s to location: %s' % (uri, tempFile))
data = urllib.urlretrieve(uri, tempFile, downloadProgress)
if os.path.exists(tempFile):
printStatus('Download complete')
else:
printWarning('Download failed for URI: %s to location: %s'
% (uri, tempFile))
result = tempFile
else:
printStatus('Download skipped, using cached version of URI: %s at location: %s'
% (uri, tempFile))
result = tempFile
else:
printWarning('Unexpected resolve mode encountered: %s' % str(mode))
result = tempFile
return result
def performAfterSaveURI(self,URI,resolvedFullPath):
uri = URI.asString()
printStatus('Uploading local file %s to URI location %s'
% (resolvedFullPath, uri))
@staticmethod
def theCreator():
return OpenMayaMPx.asMPxPtr( adskHttpSchemeResolver() )
@staticmethod
def className():
return 'adskHttpSchemeResolver'
def initializePlugin(plugin):
pluginFn = OpenMayaMPx.MFnPlugin(plugin)
try:
pluginFn.registerURIFileResolver( adskHttpSchemeResolver.kPluginResolverName,
adskHttpSchemeResolver.kPluginURIScheme,
adskHttpSchemeResolver.theCreator )
except:
sys.stderr.write( "Failed to register custom resolver: %s for scheme: %s\n" %
(adskHttpSchemeResolver.kPluginResolverName,
adskHttpSchemeResolver.kPluginURIScheme ))
raise
def uninitializePlugin(plugin):
pluginFn = OpenMayaMPx.MFnPlugin(plugin)
try:
pluginFn.deregisterURIFileResolver(adskHttpSchemeResolver.kPluginResolverName)
except:
sys.stderr.write(
"Failed to deregister custom file resolver: %s\n" %
adskHttpSchemeResolver.kPluginResolverName)
raise