import aem, mactypes
from CarbonX import kAE
class FcpAe(aem.Application):
"""Communicates with Apple's Final Cut Pro using Apple Events.
Gets and sends XML.
"""
kFCPEventClass ='KeyG'
kAEFCPOpenProjectFile ='ofcP'
kAEFCPSaveAndCloseProjectFile = 'cfcP'
kKGAEGetDocumentXML = 'eXML'
kAEImportXMLToDocument = 'iXML'
kFCPOpenItemInProject = 'fcOI'
kFCPSelectItemInBrowser = 'fcSI'
kXMLDataKey = 'xmlD'
kXMLDataFileKey = 'xmlF'
kXMLDataVersion = 'xmlV'
kFCPProjectFileKey = 'fcpP'
kFCPItemUUID = 'fcIU'
kProjectFileCloseFlagsKey= 'fcCF'
kFCPSaveAndCloseProject = 0
kFCPDiscardAndCloseProject = 1
kFindParameters = 'fndP'
kFindSearchString = 'fndS'
kFindMatchMode = 'fndM'
kFindOmitCriteria = 'fndO'
kFindColumnName = 'fndC'
kFindLogicMode = 'fndL'
kFCPFindMatchStartsWith = (1 << 0)
kFCPFindMatchContains = (1 << 1)
kFCPFindMatchEquals = (1 << 2)
kFCPFindMatchEndsWith = (1 << 3)
kFCPFindMatchLessThan = (1 << 4)
kFCPFindMatchGreaterThan = (1 << 5)
kFCPLogicAnd = 0
kFCPLogicOr = 1
def __init__(self):
fcpID = 'com.apple.finalcutpro'
fcpPath = aem.findapp.byid(fcpID)
aem.Application.__init__(self,path=fcpPath)
if not self.isrunning(fcpPath):
self.launch(fcpPath)
def commandEvent(self, fcpEvent):
return ''.join([self.kFCPEventClass, fcpEvent])
def openProject(self,unixFileStr):
proj = mactypes.File(unixFileStr)
eventkey = self.commandEvent(self.kAEFCPOpenProjectFile)
res = self.event(eventkey,{self.kFCPProjectFileKey : proj}).send()
def closeProject(self, unixFileStr, actionOnClose=0):
proj = mactypes.File(unixFileStr)
eventkey = self.commandEvent(self.kAEFCPSaveAndCloseProjectFile)
res = self.event(eventkey,{
self.kFCPProjectFileKey : proj,
self.kProjectFileCloseFlagsKey : actionOnClose}).send()
def exportXML(self, projPathStr, fcpVersionXML=1.0):
"""Returns XML form of given FCP project"""
proj = mactypes.File(projPathStr)
eventkey = self.commandEvent(self.kKGAEGetDocumentXML)
event = self.event(eventkey, {
self.kFCPProjectFileKey : proj,
self.kXMLDataVersion : fcpVersionXML})
eventdesc = event.AEM_event
replyeventdesc = eventdesc.AESendMessage(kAE.kAEWaitReply,
kAE.kAEDefaultTimeout)
paramdict = aem.Codecs().unpack(replyeventdesc)
return paramdict.get(aem.AEType('xmlD'), '')
def importXML(self, xmlStr, projPathStr=None):
"""Modifies or creates FCP project based on XML supplied"""
if projPathStr:
proj = mactypes.File(projPathStr)
aedict = {self.kFCPProjectFileKey : proj,
self.kXMLDataKey : xmlStr}
else:
aedict = {self.kXMLDataKey : xmlStr}
eventkey = self.commandEvent(self.kAEImportXMLToDocument)
res = self.event(eventkey, aedict).send()
def openItem(self, projPathStr, uuid):
proj = mactypes.File(projPathStr)
eventkey = self.commandEvent(self.kFCPOpenItemInProject)
return self.event(eventkey, {
self.kFCPProjectFileKey : proj,
self.kFCPItemUUID : uuid}).send()
def selectItem(self, projPathStr, uuid):
proj = mactypes.File(projPathStr)
eventkey = self.commandEvent(self.kFCPSelectItemInBrowser)
return self.event(eventkey, {
self.kFCPProjectFileKey : proj,
self.kFCPItemUUID : uuid}).send()
testxml = 'Example.xml'
testproj = 'test.fcp'
f = open(testxml,'r')
xmllist = f.readlines()
xml = ''.join(xmllist)
xmlout= ''
fcp = FcpAe()
fcp.openProject(testproj)
print fcp.exportXML(testproj, 3.0)
fcp.importXML(xml)
fcp.closeProject(testproj)