예제 #1
0
 def impersonate_client(self, partner_id):
     global ks
     self.get_kaltura_session()  # generate KS in case that not existed or expired
     clone_client = KalturaClient(self.config)
     clone_client.setPartnerId(partner_id)
     clone_client.setKs(self.ks)
     return clone_client
예제 #2
0
def kconnect(partner_id=None):
    
    creds = getCredentials()
    if partner_id is not None:
        creds['PARTNER_ID'] = partner_id
    
    privacyString = ''    

    #may want to add 'disableentitlements' to the privacyString eventuall for users who want to
    # disable all entitlement checking
    if creds.get('PRIVACY_CONTEXT', '') not in ('', None):
        privacyString = 'privacycontext:' + creds['PRIVACY_CONTEXT']
        
    
    config = KalturaConfiguration(creds['PARTNER_ID'])
    config.serviceUrl = creds['SERVICE_URL']
    config.setLogger(KalturaLoggerInstance)
        
    client = KalturaClient(config)
    
    # start new session
    ks = client.generateSession(creds['ADMIN_SECRET'], 
                                creds['USER_NAME'],
                                KalturaSessionType.ADMIN, 
                                creds['PARTNER_ID'],
                                86400,
                                privacyString)
    client.setKs(ks)    
    
    return (client, ks)
예제 #3
0
파일: kaltura.py 프로젝트: rbhttchr/WebAPI
    def getClient(self, partnerId, tokenId, appToken):
        config = KalturaConfiguration(partnerId)
        config.serviceUrl = "https://www.kaltura.com/"
        client = KalturaClient(config)
        # generate a widget session in order to use the app token
        widgetId = "_" + str(partnerId)
        expiry = 864000
        # 864000 = If this is seconds that's about 10 days.
        # It is not in milliseconds (=14.4 minutes); a manual test continued to work after an hour of construction
        # 864000 is the value used in these demos-
        # https://developer.kaltura.com/api-docs/VPaaS-API-Getting-Started/introduction-kaltura-client-libraries.html
        # This suggests it is probably seconds, because 1 second is the min and 10 years is the max
        # https://developer.kaltura.com/api-docs/VPaaS-API-Getting-Started/Kaltura_API_Authentication_and_Security.html

        result = client.session.startWidgetSession(widgetId, expiry)
        client.setKs(result.ks)

        # generate token hash from ks + appToken
        tokenHash = hashlib.sha256(
            result.ks.encode('ascii') + appToken.encode('ascii')).hexdigest()
        # start an app token session
        result = client.appToken.startSession(tokenId, tokenHash, '', '',
                                              expiry)
        client.setKs(result.ks)
        return client
예제 #4
0
 def impersonate_client(self, partner_id):
     global ks
     self.get_kaltura_session(
     )  # generate KS in case that not existed or expired
     clone_client = KalturaClient(self.config)
     clone_client.setPartnerId(partner_id)
     clone_client.setKs(self.ks)
     return clone_client
예제 #5
0
def client_for_user(username, privileges):
    kaltura_config = KalturaConfiguration(config.partner_id)
    kaltura_config.serviceUrl = "https://www.kaltura.com/"
    client = KalturaClient(kaltura_config)
    ks = client.session.start(config.admin_secret, username,
                              KalturaSessionType.USER, config.partner_id,
                              86400, privileges)
    client.setKs(ks)

    return client
예제 #6
0
def init_kaltura(conf):
    config = KalturaConfiguration(conf[KALTURA][PARTNER_ID])
    config.serviceUrl = SERVICE_URL
    retclient = KalturaClient(config)
    ks = retclient.session.start(conf[KALTURA][ADMIN_SECRET],
                                 conf[KALTURA][USER_ID],
                                 KalturaSessionType.ADMIN,
                                 conf[KALTURA][PARTNER_ID])
    retclient.setKs(ks)
    return retclient
예제 #7
0
def reencode_profile(media_id, conversion_id, clientObj=None):
    #Todo Separate this out into a decorator
    if clientObj:
        client = clientObj
    else:
        client = KalturaClient(GetConfig())
        ks = client.session.start(SETTINGS['ADMIN_SECRET'], SETTINGS['USER_NAME'], KalturaSessionType.ADMIN, SETTINGS['PARTNER_ID'], 86400, "")
        client.setKs(ks)
    entry = client.media.get(media_id)
    client.media.convert(media_id, conversion_id)
예제 #8
0
class MultiRequestTests(KalturaBaseTest):
    
    def setUp(self):
        """These tests require that client.session.start be used
           Instead of self.client.generateSession
           TODO: Document Why
        """
        
        self.config = GetConfig()
        self.client = KalturaClient(self.config)
        self.ks = None
                  
    
    def test_MultiRequest(self):
        """From lines 221- 241 of origional PythonTester.py"""
        
        self.client.startMultiRequest()
        ks = self.client.session.start(ADMIN_SECRET, USER_NAME, 
                                       KalturaSessionType.ADMIN, 
                                       PARTNER_ID, 86400, "") 
        self.client.setKs(ks)
        
        listResult = self.client.baseEntry.list()

        multiResult = self.client.doMultiRequest()
        print multiResult[1].totalCount
        self.client.setKs(multiResult[0])
        
        # error
        try:
            mediaEntry = self.client.media.get('invalid entry id')
            assert(False)
        except KalturaException, e:
            assert(e.code == 'ENTRY_ID_NOT_FOUND')                    
           
        # multi request error
        self.client = KalturaClient(GetConfig())

        #start a NEW multirequest (could move to separate unit test?)
        self.client.startMultiRequest()

        ks = self.client.session.start(ADMIN_SECRET, USER_NAME, 
                                            KalturaSessionType.ADMIN, 
                                            PARTNER_ID, 86400, "")
        self.client.setKs(ks)

        mediaEntry = self.client.media.get('invalid entry id')
    
        multiResult = self.client.doMultiRequest()
        self.client.setKs(multiResult[0])
        assert(isinstance(multiResult[1], KalturaException))
        assert(multiResult[1].code == 'ENTRY_ID_NOT_FOUND')    

        #must be called with existing client multirequest session
        self._AdvancedMultiRequestExample()
class MultiRequestTests(KalturaBaseTest):
    def setUp(self):
        """These tests require that client.session.start be used
           Instead of self.client.generateSession
           TODO: Document Why
        """

        self.config = GetConfig()
        self.client = KalturaClient(self.config)
        self.ks = None

    def test_MultiRequest(self):
        """From lines 221- 241 of origional PythonTester.py"""

        self.client.startMultiRequest()
        ks = self.client.session.start(ADMIN_SECRET, USER_NAME,
                                       KalturaSessionType.ADMIN, PARTNER_ID,
                                       86400, "")
        self.client.setKs(ks)

        listResult = self.client.baseEntry.list()

        multiResult = self.client.doMultiRequest()
        print multiResult[1].totalCount
        self.client.setKs(multiResult[0])

        # error
        try:
            mediaEntry = self.client.media.get('invalid entry id')
            assert (False)
        except KalturaException, e:
            assert (e.code == 'ENTRY_ID_NOT_FOUND')

        # multi request error
        self.client = KalturaClient(GetConfig())

        #start a NEW multirequest (could move to separate unit test?)
        self.client.startMultiRequest()

        ks = self.client.session.start(ADMIN_SECRET, USER_NAME,
                                       KalturaSessionType.ADMIN, PARTNER_ID,
                                       86400, "")
        self.client.setKs(ks)

        mediaEntry = self.client.media.get('invalid entry id')

        multiResult = self.client.doMultiRequest()
        self.client.setKs(multiResult[0])
        assert (isinstance(multiResult[1], KalturaException))
        assert (multiResult[1].code == 'ENTRY_ID_NOT_FOUND')

        #must be called with existing client multirequest session
        self._AdvancedMultiRequestExample()
예제 #10
0
def create_session(kaltura_id, ks=None):
    settings = properties.load_kaltura_settings().get(kaltura_id)
    if not settings:
        raise Exception("Kaltura ID %s Settings %s" % (kaltura_id, settings))
    client = KalturaClient(GetConfig(settings))
    if not settings:
        raise Exception("Kaltura ID %s not in session %s" % (
            kaltura_id, repr(settings)))
    if not ks:
        ks = get_new_session_key(settings)
    client.setKs(ks)
    return client
예제 #11
0
def create_session(kaltura_id, ks=None):
    settings = properties.load_kaltura_settings().get(kaltura_id)
    if not settings:
        raise Exception("Kaltura ID %s Settings %s" % (kaltura_id, settings))
    client = KalturaClient(GetConfig(settings))
    if not settings:
        raise Exception("Kaltura ID %s not in session %s" %
                        (kaltura_id, repr(settings)))
    if not ks:
        ks = get_new_session_key(settings)
    client.setKs(ks)
    return client
예제 #12
0
def delete(idx):
    config = KalturaConfiguration(3082203)
    config.serviceUrl = "https://www.kaltura.com/"
    client = KalturaClient(config)
    ks = client.session.start(os.environ.get('KALTURA_SECRET'),
                              "*****@*****.**", KalturaSessionType.ADMIN,
                              "3082203")
    client.setKs(ks)

    entry_id = idx

    result = client.media.delete(entry_id)
    print(result)
예제 #13
0
def get_entry(entry_id):
    config = KalturaConfiguration(3082203)
    config.serviceUrl = "https://www.kaltura.com/"
    client = KalturaClient(config)
    ks = client.session.start(os.environ.get('KALTURA_SECRET'),
                              "*****@*****.**", KalturaSessionType.ADMIN,
                              "3082203")
    client.setKs(ks)

    version = -1

    result = client.media.get(entry_id, version)
    return result.json()
    def _AdvancedMultiRequestExample(self):
        #this is a separate, local client - not 'self.client'
        client = KalturaClient(
            self.config)  #matches line 154 in PythonTester.py
        client.startMultiRequest()

        from KalturaClient.Plugins.Core import KalturaMixEntry
        from KalturaClient.Plugins.Core import KalturaEditorType

        # Request 1
        ks = client.session.start(ADMIN_SECRET, USER_NAME,
                                  KalturaSessionType.ADMIN, PARTNER_ID, 86400,
                                  "")
        client.setKs(
            ks
        )  # for the current multi request, the result of the first call will be used as the ks for next calls

        mixEntry = KalturaMixEntry()
        mixEntry.setName(".Net Mix %s" % (testString, ))
        mixEntry.setEditorType(KalturaEditorType.SIMPLE)

        # Request 2
        mixEntry = client.mixing.add(mixEntry)

        # Request 3
        ulFile = getTestFile('DemoVideo.flv')
        uploadTokenId = client.media.upload(ulFile)

        mediaEntry = KalturaMediaEntry()
        mediaEntry.setName("Media Entry For Mix %s" % (testString, ))
        mediaEntry.setMediaType(KalturaMediaType.VIDEO)

        # Request 4
        mediaEntry = client.media.addFromUploadedFile(mediaEntry,
                                                      uploadTokenId)

        # Request 5
        client.mixing.appendMediaEntry(mixEntry.id, mediaEntry.id)

        response = client.doMultiRequest()

        for subResponse in response:
            if isinstance(subResponse, KalturaException):
                self.fail("Error occurred: " + subResponse.message)

        # when accessing the response object we will use an index and not the response number (response number - 1)
        assert (isinstance(response[1], KalturaMixEntry))
        mixEntry = response[1]

        print "The new mix entry id is: " + mixEntry.id
예제 #15
0
def add_media():
    config = KalturaConfiguration(3082203)
    config.serviceUrl = "https://www.kaltura.com/"
    client = KalturaClient(config)
    ks = client.session.start(os.environ.get('KALTURA_SECRET'),
                              "*****@*****.**", KalturaSessionType.ADMIN,
                              "3082203")
    client.setKs(ks)

    entry = KalturaMediaEntry()
    entry.sourceType = KalturaSourceType.URL
    entry.searchProviderType = KalturaSearchProviderType.YOUTUBE
    entry.mediaType = KalturaMediaType.VIDEO

    result = client.media.add(entry)
    print(result)
예제 #16
0
   def _AdvancedMultiRequestExample(self):
       #this is a separate, local client - not 'self.client'
       client = KalturaClient(self.config) #matches line 154 in PythonTester.py
       client.startMultiRequest()
       
       from KalturaClient.Plugins.Core import KalturaMixEntry
       from KalturaClient.Plugins.Core import KalturaEditorType
       
       # Request 1
       ks = client.session.start(ADMIN_SECRET, USER_NAME, 
                                 KalturaSessionType.ADMIN, 
                                 PARTNER_ID, 86400, "")
       client.setKs(ks) # for the current multi request, the result of the first call will be used as the ks for next calls
 
       mixEntry = KalturaMixEntry()
       mixEntry.setName(".Net Mix %s" % (testString,))
       mixEntry.setEditorType(KalturaEditorType.SIMPLE)
   
       # Request 2
       mixEntry = client.mixing.add(mixEntry)
   
       # Request 3
       ulFile = getTestFile('DemoVideo.flv')
       uploadTokenId = client.media.upload(ulFile)
   
       mediaEntry = KalturaMediaEntry()
       mediaEntry.setName("Media Entry For Mix %s" % (testString,))
       mediaEntry.setMediaType(KalturaMediaType.VIDEO)
   
       # Request 4
       mediaEntry = client.media.addFromUploadedFile(mediaEntry, uploadTokenId)
   
       # Request 5
       client.mixing.appendMediaEntry(mixEntry.id, mediaEntry.id)
   
       response = client.doMultiRequest()
   
       for subResponse in response:
           if isinstance(subResponse, KalturaException):
               self.fail("Error occurred: " + subResponse.message)
   
       # when accessing the response object we will use an index and not the response number (response number - 1)
       assert(isinstance(response[1], KalturaMixEntry))
       mixEntry = response[1]
       
       print "The new mix entry id is: " + mixEntry.id
def AdvancedMultiRequestExample():
    client = KalturaClient(GetConfig())

    client.startMultiRequest()

    # Request 1
    ks = client.session.start(ADMIN_SECRET, USER_NAME,
                              KalturaSessionType.ADMIN, PARTNER_ID, 86400, "")
    client.setKs(
        ks
    )  # for the current multi request, the result of the first call will be used as the ks for next calls

    mixEntry = KalturaMixEntry()
    mixEntry.setName(".Net Mix")
    mixEntry.setEditorType(KalturaEditorType.SIMPLE)

    # Request 2
    mixEntry = client.mixing.add(mixEntry)

    # Request 3
    uploadTokenId = client.media.upload(file('DemoVideo.flv', 'rb'))

    mediaEntry = KalturaMediaEntry()
    mediaEntry.setName("Media Entry For Mix")
    mediaEntry.setMediaType(KalturaMediaType.VIDEO)

    # Request 4
    mediaEntry = client.media.addFromUploadedFile(mediaEntry, uploadTokenId)

    # Request 5
    client.mixing.appendMediaEntry(mixEntry.id, mediaEntry.id)

    response = client.doMultiRequest()

    for subResponse in response:
        if isinstance(subResponse, KalturaException):
            print "Error occurred: " + subResponse.message

    # when accessing the response object we will use an index and not the response number (response number - 1)
    assert (isinstance(response[1], KalturaMixEntry))
    mixEntry = response[1]

    print "The new mix entry id is: " + mixEntry.id
예제 #18
0
def AdvancedMultiRequestExample():
    client = KalturaClient(GetConfig())

    client.startMultiRequest()

    # Request 1
    ks = client.session.start(ADMIN_SECRET, USER_NAME, KalturaSessionType.ADMIN, PARTNER_ID, 86400, "")
    client.setKs(ks) # for the current multi request, the result of the first call will be used as the ks for next calls

    mixEntry = KalturaMixEntry()
    mixEntry.setName(".Net Mix")
    mixEntry.setEditorType(KalturaEditorType.SIMPLE)

    # Request 2
    mixEntry = client.mixing.add(mixEntry)

    # Request 3
    uploadTokenId = client.media.upload(file('DemoVideo.flv', 'rb'))

    mediaEntry = KalturaMediaEntry()
    mediaEntry.setName("Media Entry For Mix")
    mediaEntry.setMediaType(KalturaMediaType.VIDEO)

    # Request 4
    mediaEntry = client.media.addFromUploadedFile(mediaEntry, uploadTokenId)

    # Request 5
    client.mixing.appendMediaEntry(mixEntry.id, mediaEntry.id)

    response = client.doMultiRequest()

    for subResponse in response:
        if isinstance(subResponse, KalturaException):
            print "Error occurred: " + subResponse.message

    # when accessing the response object we will use an index and not the response number (response number - 1)
    assert(isinstance(response[1], KalturaMixEntry))
    mixEntry = response[1]
    
    print "The new mix entry id is: " + mixEntry.id
예제 #19
0
    with open(filename, 'a', newline='') as csvfile:
        print("printing categories!")
        write_categories = writer(csvfile, delimiter=',',
                                quotechar=',', quoting=QUOTE_MINIMAL)
        write_categories.writerow(['id'] + ['player_name'] + ['html5Url'])


    with open(filename, 'a', newline='') as csvfile:
        write = writer(csvfile, delimiter=',')
        write.writerows(write_body)

# SESSION CONFIG APPTOKEN
config = KalturaConfiguration(apptoken.partner_id)
config.serviceUrl = "https://api.kaltura.nordu.net/"
client = KalturaClient(config)

# GENERATE SESSION
widgetId = "_"+str(apptoken.partner_id)
expiry = 86400
result = client.session.startWidgetSession(widgetId, expiry)
client.setKs(result.ks)

ATHash = hashlib.sha256(result.ks.encode('ascii')+apptoken.tokenHash.encode('ascii')).hexdigest()
type = KalturaSessionType.ADMIN 

result = client.appToken.startSession(apptoken.tokenid, ATHash, apptoken.user_id, type, expiry)
client.setKs(result.ks)


result=get_uiconf("1,8")
write_csv_file(result,"players.csv")
예제 #20
0
def auth():
    client = KalturaClient(GetConfig())
    ks = client.session.start(SETTINGS['ADMIN_SECRET'], SETTINGS['USER_NAME'], KalturaSessionType.ADMIN, SETTINGS['PARTNER_ID'], 86400, "")
    client.setKs(ks)
    return client
예제 #21
0
def SampleMetadataOperations():
    # The metadata field we'll add/update
    metaDataFieldName = "SubtitleFormat"
    fieldValue = "VobSub"

    # The Schema file for the field
    # Currently, you must build the xsd yourself. There is no utility provided.
    xsdFile = "MetadataSchema.xsd"

    client = KalturaClient(GetConfig())

    # start new session (client session is enough when we do operations in a users scope)
    ks = client.generateSession(ADMIN_SECRET, USER_NAME, KalturaSessionType.ADMIN, PARTNER_ID, 86400, "")
    client.setKs(ks)

    # Setup a pager and search to use
    pager = KalturaFilterPager()
    search = KalturaMediaEntryFilter()
    search.setOrderBy(KalturaMediaEntryOrderBy.CREATED_AT_ASC)
    search.setMediaTypeEqual(KalturaMediaType.VIDEO)  # Video only
    pager.setPageSize(10)
    pager.setPageIndex(1)

    print "List videos, get the first one..."

    # Get 10 video entries, but we'll just use the first one returned
    entries = client.media.list(search, pager).objects

    # make sure we have a metadata profile
    profile = KalturaMetadataProfile()
    profile.setName('TestProfile')
    profile.setMetadataObjectType(KalturaMetadataObjectType.ENTRY)
    viewsData = ""

    newProfile = client.metadata.metadataProfile.add(profile, file(xsdFile, 'rb').read(), viewsData)

    # Check if there are any custom fields defined in the KMC (Settings -> Custom Data)
    # for the first item returned by the previous listaction
    filter = KalturaMetadataProfileFilter()
    metadata = client.metadata.metadataProfile.list(filter, pager).objects

    name = entries[0].getName()
    id = entries[0].getId()
    if metadata[0].getXsd() != None:
        print "1. There are custom fields for video: " + name + ", entryid: " + id
    else:
        print "1. There are no custom fields for video: " + name + ", entryid: " + id

    # Add a custom data entry in the KMC  (Settings -> Custom Data)
    profile = KalturaMetadataProfile()
    profile.setName('TestProfile')
    profile.setMetadataObjectType(KalturaMetadataObjectType.ENTRY)
    viewsData = ""

    metadataResult = client.metadata.metadataProfile.update(newProfile.id, profile, file(xsdFile, 'rb').read(), viewsData)

    assert(metadataResult.xsd != None)

    # Add the custom metadata value to the first video
    filter2 = KalturaMetadataFilter()
    filter2.setObjectIdEqual(entries[0].id)
    xmlData = "<metadata><SubtitleFormat>" + fieldValue + "</SubtitleFormat></metadata>"
    metadata2 = client.metadata.metadata.add(newProfile.id, profile.metadataObjectType, entries[0].id, xmlData)

    assert(metadata2.xml != None)
    
    print "3. Successfully added the custom data field for video: " + name + ", entryid: " + id
    xmlStr = metadata2.xml
    print "XML used: " + xmlStr

    # Now lets change the value (update) of the custom field
    # Get the metadata for the video
    filter3 = KalturaMetadataFilter()
    filter3.setObjectIdEqual(entries[0].id)
    filter3.setMetadataProfileIdEqual(newProfile.id)
    metadataList = client.metadata.metadata.list(filter3).objects
    assert(metadataList[0].xml != None)

    print "4. Current metadata for video: " + name + ", entryid: " + id
    xmlquoted = metadataList[0].xml
    print "XML: " + xmlquoted
    xml = metadataList[0].xml
    # Make sure we find the old value in the current metadata
    pos = xml.find("<" + metaDataFieldName + ">" + fieldValue + "</" + metaDataFieldName + ">")
    assert(pos >= 0)

    pattern = re.compile("<" + metaDataFieldName + ">([^<]+)</" + metaDataFieldName + ">")
    xml = pattern.sub("<" + metaDataFieldName + ">Ogg Writ</" + metaDataFieldName + ">", xml)
    rc = client.metadata.metadata.update(metadataList[0].id, xml)
    print "5. Updated metadata for video: " + name + ", entryid: " + id
    xmlquoted = rc.xml
    print "XML: " + xmlquoted
예제 #22
0
    for subResponse in response:
        if isinstance(subResponse, KalturaException):
            print "Error occurred: " + subResponse.message

    # when accessing the response object we will use an index and not the response number (response number - 1)
    assert(isinstance(response[1], KalturaMixEntry))
    mixEntry = response[1]
    
    print "The new mix entry id is: " + mixEntry.id

# create session
client = KalturaClient(GetConfig())

ks = client.generateSession(ADMIN_SECRET, USER_NAME, KalturaSessionType.ADMIN, PARTNER_ID, 86400, "")
client.setKs(ks)

# add media
uploadTokenId = client.media.upload(file('DemoVideo.flv', 'rb'))

mediaEntry = KalturaMediaEntry()
mediaEntry.setName("Media Entry Using Python Client")
mediaEntry.setMediaType(KalturaMediaType(KalturaMediaType.VIDEO))
mediaEntry = client.media.addFromUploadedFile(mediaEntry, uploadTokenId)

# serve
DATA_ENTRY_CONTENT = 'bla bla bla'
dataEntry = KalturaDataEntry()
dataEntry.setName('test data entry')
dataEntry.setDataContent(DATA_ENTRY_CONTENT)
addedDataEntry = client.data.add(dataEntry)
class MultiRequestTests(KalturaBaseTest):
    def setUp(self):
        """These tests require that client.session.start be used
           Instead of self.client.generateSession
           TODO: Document Why
        """

        self.config = GetConfig()
        self.client = KalturaClient(self.config)
        self.ks = None

    def test_MultiRequest(self):
        """From lines 221- 241 of origional PythonTester.py"""

        self.client.startMultiRequest()
        ks = self.client.session.start(ADMIN_SECRET, USER_NAME,
                                       KalturaSessionType.ADMIN, PARTNER_ID,
                                       86400, "")
        self.client.setKs(ks)

        listResult = self.client.baseEntry.list()

        multiResult = self.client.doMultiRequest()
        print(multiResult[1].totalCount)
        self.client.setKs(multiResult[0])

        # error
        try:
            mediaEntry = self.client.media.get('invalid entry id')
            assert (False)
        except KalturaException as e:
            assert (e.code == 'ENTRY_ID_NOT_FOUND')

        # multi request error
        self.client = KalturaClient(GetConfig())

        #start a NEW multirequest (could move to separate unit test?)
        self.client.startMultiRequest()

        ks = self.client.session.start(ADMIN_SECRET, USER_NAME,
                                       KalturaSessionType.ADMIN, PARTNER_ID,
                                       86400, "")
        self.client.setKs(ks)

        mediaEntry = self.client.media.get('invalid entry id')

        multiResult = self.client.doMultiRequest()
        self.client.setKs(multiResult[0])
        assert (isinstance(multiResult[1], KalturaException))
        assert (multiResult[1].code == 'ENTRY_ID_NOT_FOUND')

        #must be called with existing client multirequest session
        self._AdvancedMultiRequestExample()

    # copied from C# tester
    def _AdvancedMultiRequestExample(self):
        #this is a separate, local client - not 'self.client'
        client = KalturaClient(
            self.config)  #matches line 154 in PythonTester.py
        client.startMultiRequest()

        from KalturaClient.Plugins.Core import KalturaMixEntry
        from KalturaClient.Plugins.Core import KalturaEditorType

        # Request 1
        ks = client.session.start(ADMIN_SECRET, USER_NAME,
                                  KalturaSessionType.ADMIN, PARTNER_ID, 86400,
                                  "")
        client.setKs(
            ks
        )  # for the current multi request, the result of the first call will be used as the ks for next calls

        mixEntry = KalturaMixEntry()
        mixEntry.setName(".Net Mix %s" % (testString, ))
        mixEntry.setEditorType(KalturaEditorType.SIMPLE)

        # Request 2
        mixEntry = client.mixing.add(mixEntry)

        # Request 3
        ulFile = getTestFile('DemoVideo.flv')
        uploadTokenId = client.media.upload(ulFile)

        mediaEntry = KalturaMediaEntry()
        mediaEntry.setName("Media Entry For Mix %s" % (testString, ))
        mediaEntry.setMediaType(KalturaMediaType.VIDEO)

        # Request 4
        mediaEntry = client.media.addFromUploadedFile(mediaEntry,
                                                      uploadTokenId)

        # Request 5
        client.mixing.appendMediaEntry(mixEntry.id, mediaEntry.id)

        response = client.doMultiRequest()

        for subResponse in response:
            if isinstance(subResponse, KalturaException):
                self.fail("Error occurred: " + subResponse.message)

        # when accessing the response object we will use an index and not the response number (response number - 1)
        assert (isinstance(response[1], KalturaMixEntry))
        mixEntry = response[1]

        print("The new mix entry id is: " + mixEntry.id)
    return StringReader(inputData[:atomPos] + struct.pack('>L', atomHeaderSize + newSize) + inputData[(atomPos + 4):newAtomEndPos] +
        struct.pack('>L', atomEndPos - newAtomEndPos) + 'padd' + inputData[(newAtomEndPos + 8):])

# download and read the input file
if not os.path.exists(TEMP_DOWNLOAD_PATH):
    retrieveUrl(TEST_FLAVOR_URL, TEMP_DOWNLOAD_PATH)

inputData = file(TEMP_DOWNLOAD_PATH, 'rb').read()

inputAtoms = parseAtoms(inputData, 0, len(inputData), '')

# initialize the api client
client = KalturaClient(GetConfig())

ks = client.generateSession(ADMIN_SECRET, USER_NAME, KalturaSessionType.ADMIN, PARTNER_ID, 86400, "")
client.setKs(ks)

# get source only conversion profile
sourceOnlyConvProfileId = None
for conversionProfile in client.conversionProfile.list().objects:
    if conversionProfile.name.lower() == 'source only':
        sourceOnlyConvProfileId = conversionProfile.id

if sourceOnlyConvProfileId == None:
    print 'Failed to find a source only conversion profile'
    sys.exit(1)

def getTimeScaleOffset():
    return getAtomDataPos('moov.trak.mdia.mdhd') + 12

# test definitions
    return StringReader(inputData[:atomPos] + struct.pack('>L', atomHeaderSize + newSize) + inputData[(atomPos + 4):newAtomEndPos] +
        struct.pack('>L', atomEndPos - newAtomEndPos) + 'padd' + inputData[(newAtomEndPos + 8):])

# download and read the input file
if not os.path.exists(TEMP_DOWNLOAD_PATH):
    http_utils.downloadUrl(TEST_FLAVOR_URL, TEMP_DOWNLOAD_PATH)

inputData = file(TEMP_DOWNLOAD_PATH, 'rb').read()

inputAtoms = parseAtoms(inputData, 0, len(inputData), '')

# initialize the api client
client = KalturaClient(GetConfig())

ks = client.generateSession(ADMIN_SECRET, USER_NAME, KalturaSessionType.ADMIN, PARTNER_ID, 86400, "")
client.setKs(ks)

# get source only conversion profile
sourceOnlyConvProfileId = None
for conversionProfile in client.conversionProfile.list().objects:
    if conversionProfile.name.lower() == 'source only':
        sourceOnlyConvProfileId = conversionProfile.id

if sourceOnlyConvProfileId == None:
    print('Failed to find a source only conversion profile')
    sys.exit(1)

def getTimeScaleOffset():
    return getAtomDataPos('moov.trak.mdia.mdhd') + 12

# test definitions
def SampleMetadataOperations():
    # The metadata field we'll add/update
    metaDataFieldName = "SubtitleFormat"
    fieldValue = "VobSub"

    # The Schema file for the field
    # Currently, you must build the xsd yourself. There is no utility provided.
    xsdFile = "MetadataSchema.xsd"

    client = KalturaClient(GetConfig())

    # start new session (client session is enough when we do operations in a users scope)
    ks = client.generateSession(ADMIN_SECRET, USER_NAME,
                                KalturaSessionType.ADMIN, PARTNER_ID, 86400,
                                "")
    client.setKs(ks)

    # Setup a pager and search to use
    pager = KalturaFilterPager()
    search = KalturaMediaEntryFilter()
    search.setOrderBy(KalturaMediaEntryOrderBy.CREATED_AT_ASC)
    search.setMediaTypeEqual(KalturaMediaType.VIDEO)  # Video only
    pager.setPageSize(10)
    pager.setPageIndex(1)

    print "List videos, get the first one..."

    # Get 10 video entries, but we'll just use the first one returned
    entries = client.media.list(search, pager).objects

    # make sure we have a metadata profile
    profile = KalturaMetadataProfile()
    profile.setName('TestProfile')
    profile.setMetadataObjectType(KalturaMetadataObjectType.ENTRY)
    viewsData = ""

    newProfile = client.metadata.metadataProfile.add(
        profile,
        file(xsdFile, 'rb').read(), viewsData)

    # Check if there are any custom fields defined in the KMC (Settings -> Custom Data)
    # for the first item returned by the previous listaction
    filter = KalturaMetadataProfileFilter()
    metadata = client.metadata.metadataProfile.list(filter, pager).objects

    name = entries[0].getName()
    id = entries[0].getId()
    if metadata[0].getXsd() != None:
        print "1. There are custom fields for video: " + name + ", entryid: " + id
    else:
        print "1. There are no custom fields for video: " + name + ", entryid: " + id

    # Add a custom data entry in the KMC  (Settings -> Custom Data)
    profile = KalturaMetadataProfile()
    profile.setName('TestProfile')
    profile.setMetadataObjectType(KalturaMetadataObjectType.ENTRY)
    viewsData = ""

    metadataResult = client.metadata.metadataProfile.update(
        newProfile.id, profile,
        file(xsdFile, 'rb').read(), viewsData)

    assert (metadataResult.xsd != None)

    # Add the custom metadata value to the first video
    filter2 = KalturaMetadataFilter()
    filter2.setObjectIdEqual(entries[0].id)
    xmlData = "<metadata><SubtitleFormat>" + fieldValue + "</SubtitleFormat></metadata>"
    metadata2 = client.metadata.metadata.add(newProfile.id,
                                             profile.metadataObjectType,
                                             entries[0].id, xmlData)

    assert (metadata2.xml != None)

    print "3. Successfully added the custom data field for video: " + name + ", entryid: " + id
    xmlStr = metadata2.xml
    print "XML used: " + xmlStr

    # Now lets change the value (update) of the custom field
    # Get the metadata for the video
    filter3 = KalturaMetadataFilter()
    filter3.setObjectIdEqual(entries[0].id)
    filter3.setMetadataProfileIdEqual(newProfile.id)
    metadataList = client.metadata.metadata.list(filter3).objects
    assert (metadataList[0].xml != None)

    print "4. Current metadata for video: " + name + ", entryid: " + id
    xmlquoted = metadataList[0].xml
    print "XML: " + xmlquoted
    xml = metadataList[0].xml
    # Make sure we find the old value in the current metadata
    pos = xml.find("<" + metaDataFieldName + ">" + fieldValue + "</" +
                   metaDataFieldName + ">")
    assert (pos >= 0)

    pattern = re.compile("<" + metaDataFieldName + ">([^<]+)</" +
                         metaDataFieldName + ">")
    xml = pattern.sub(
        "<" + metaDataFieldName + ">Ogg Writ</" + metaDataFieldName + ">", xml)
    rc = client.metadata.metadata.update(metadataList[0].id, xml)
    print "5. Updated metadata for video: " + name + ", entryid: " + id
    xmlquoted = rc.xml
    print "XML: " + xmlquoted
        if isinstance(subResponse, KalturaException):
            print "Error occurred: " + subResponse.message

    # when accessing the response object we will use an index and not the response number (response number - 1)
    assert (isinstance(response[1], KalturaMixEntry))
    mixEntry = response[1]

    print "The new mix entry id is: " + mixEntry.id


# create session
client = KalturaClient(GetConfig())

ks = client.generateSession(ADMIN_SECRET, USER_NAME, KalturaSessionType.ADMIN,
                            PARTNER_ID, 86400, "")
client.setKs(ks)

# add media
uploadTokenId = client.media.upload(file('DemoVideo.flv', 'rb'))

mediaEntry = KalturaMediaEntry()
mediaEntry.setName("Media Entry Using Python Client")
mediaEntry.setMediaType(KalturaMediaType(KalturaMediaType.VIDEO))
mediaEntry = client.media.addFromUploadedFile(mediaEntry, uploadTokenId)

# serve
DATA_ENTRY_CONTENT = 'bla bla bla'
dataEntry = KalturaDataEntry()
dataEntry.setName('test data entry')
dataEntry.setDataContent(DATA_ENTRY_CONTENT)
addedDataEntry = client.data.add(dataEntry)