def delete(self, obj, fieldNames=[], force=False):
        '''Pass an xmlrpc call to the daemon when a video is deleted'''
        UID = IUUID(obj)
        log = logging.getLogger('collective.transcode.star')
        tt = getUtility(ITranscodeTool)
        fields = self._getFields(obj, fieldNames)
        if not self._hasFiles(obj, fields):
            return
        address = self._getDaemonAddress()
        if address is None:
            return
        (transcodeServer, daemonProfiles) = self._getDaemon(address)
        if transcodeServer is None or daemonProfiles is None:
            return
        secret = self.secret()

        for field in fields:
            info = self._getFieldInfo(obj, field)
            if info is None:
                continue
            fieldName = info['fieldName']
            md5sum = info['md5sum']
            fileType = info['fileType']
            fileName = info['fileName']
            filePath = obj.absolute_url()
            portal_url = getToolByName(obj, 'portal_url')()
            fileUrl = portal_url + '/@@serve_daemon'
            norm = queryUtility(IIDNormalizer)
            fileName = norm.normalize(fileName.decode('utf-8'))

            options = dict()
            payload = {
                'path': filePath,
                'url': fileUrl,
                'type': fileType,
                # don't send fieldName if it's the primary field
                'fieldName': fieldNames and fieldName or '',
                'fileName': fileName,
                'uid': UID,
            }
            # Encrypt and send the transcode request
            payload = {'key': b64encode(encrypt(str(payload), secret))}
            transcodeServer.delete(payload, options, portal_url)
            tt.__delitem__(UID)
        return
    def delete(self, obj, fieldNames = [], force = False):
        '''Pass an xmlrpc call to the daemon when a video is deleted'''
        UID = IUUID(obj)
        log = logging.getLogger('collective.transcode.star')
        tt = getUtility(ITranscodeTool)
        fields = self._getFields(obj, fieldNames)
        if not self._hasFiles(obj, fields):
            return
        address = self._getDaemonAddress()
        if address is None:
            return
        (transcodeServer, daemonProfiles) = self._getDaemon(address)
        if transcodeServer is None or daemonProfiles is None:
            return
        secret = self.secret()

        for field in fields:
            info = self._getFieldInfo(obj, field)
            if info is None:
                continue
            fieldName = info['fieldName']
            md5sum = info['md5sum']
            fileType = info['fileType']
            fileName = info['fileName']
            filePath = obj.absolute_url()
            portal_url = getToolByName(obj,'portal_url')()
            fileUrl = portal_url + '/@@serve_daemon'
            norm = queryUtility(IIDNormalizer)
            fileName = norm.normalize(fileName.decode('utf-8'))

            options = dict()
            payload = {
                'path' : filePath,
                'url' : fileUrl,
                'type' : fileType,
                # don't send fieldName if it's the primary field
                'fieldName' : fieldNames and fieldName or '',
                'fileName' : fileName,
                'uid' : UID,
                }
            # Encrypt and send the transcode request
            payload = {'key':b64encode(encrypt(str(payload), secret))}
            transcodeServer.delete(payload, options, portal_url)
            tt.__delitem__(UID)
        return
from zope.component import queryUtility, getUtility
from plone.i18n.normalizer.interfaces import IIDNormalizer
from zope.app.container.btree import BTreeContainer
from plone.app.async.interfaces import IAsyncService

from collective.transcode.star.interfaces import ITranscodeTool, ITranscoded, ITranscodedEvent
log = logging.getLogger('collective.transcode')

def transcode_request(obj, fieldName, UID, payload, secret, address, profile, options, portal_url): 
    "Encrypt and send the transcode request"
    try:
        transcodeServer = xmlrpclib.ServerProxy(address, allow_none=True)
    except Exception, e:
        log.error(u"Could not connect to transcode daemon %s: %s" % (address, e))
        return
    payload = {'key':b64encode(encrypt(str(payload), secret))}
    jobId = transcodeServer.transcode(payload, profile, options, portal_url)
    tt = getUtility(ITranscodeTool)
    if not jobId or jobId.startswith('ERROR'):
        log.warn(u'Could not get jobId from daemon %s for profile %s and input %s. Result %s' % (address, profile, payload, jobId))
        tt[UID][fieldName][profile]['status'] = jobId or 'failed'
    tt[UID][fieldName][profile]['jobId'] = jobId
    log.info(u"added profile %s for field %s and content type %s in transcode queue" % ( profile, fieldName, obj.absolute_url()))


class TranscodeTool(BTreeContainer):
    
    implements(ITranscodeTool)

    def add(self, obj, fieldNames = [], force = False, profiles = []):
        """
SETTING_DAEMON_ADDRESS = 'collective.transcode.star.interfaces.ITranscodeSettings.daemon_address'
SETTING_PROFILES = 'collective.transcode.star.interfaces.ITranscodeSettings.transcode_profiles'
SETTING_SECRET = 'collective.transcode.star.interfaces.ITranscodeSettings.secret'
SETTING_MIME_TYPES = 'collective.transcode.star.interfaces.ITranscodeSettings.mime_types'


def transcode_request(obj, fieldName, UID, payload, secret, address, profile,
                      options, portal_url):
    "Encrypt and send the transcode request"
    try:
        transcodeServer = xmlrpclib.ServerProxy(address, allow_none=True)
    except Exception, e:
        log.error(u"Could not connect to transcode daemon %s: %s" %
                  (address, e))
        return
    payload = {'key': b64encode(encrypt(str(payload), secret))}
    jobId = transcodeServer.transcode(payload, profile, options, portal_url)
    tt = getUtility(ITranscodeTool)
    if not jobId or jobId.startswith('ERROR'):
        log.warn(u'Could not get jobId from daemon %s for profile %s'
                 u'and input %s. Result %s' %
                 (address, profile, payload, jobId))
        tt[UID][fieldName][profile]['status'] = jobId or 'failed'
    tt[UID][fieldName][profile]['jobId'] = jobId
    log.info(u"added profile %s for field %s and"
             u"content type %s in transcode queue" %
             (profile, fieldName, obj.absolute_url()))


class TranscodeTool(BTreeContainer):
    def add(self, obj, fieldNames=[], force=False, profiles=[]):