Пример #1
0
def list_app_tokens(args):
    """ list appTokens """
    client = kaltura_session()

    if args.apptoken:
        filter = KalturaAppTokenFilter()
        if args.created_at:
            createdAtFilter = datetime(
                args.created_at[0], args.created_at[1], args.created_at[2], 0, 0
            ).timestamp()
            filter.createdAtGreaterThanOrEqual = createdAtFilter
        result = client.appToken.list(filter)
        count = result.totalCount
        print("totalcount returned: " + str(count) + "\n")

        nid = 0
        while nid < count:
            for i in result.objects:
                print("id: " + i.id)
                print("token: " + i.token)
                print(i.description)
                print(
                    "created at: "
                    + datetime.fromtimestamp(i.createdAt).strftime("%c")
                    + "\n"
                )
                nid = nid + 1
    elif args.kmcroles:
        filter = KalturaUserRoleFilter()
        pager = KalturaFilterPager()
        pager.pageIndex = 1
        pager.pageSize = 500
        listroles = client.userRole.list(filter, pager)
        for i in listroles.objects:
            print(i.name + " " + str(i.id))
Пример #2
0
def get_total_count(client, type):
    """ get totalcount int """

    pager = KalturaFilterPager()
    pager.pageSize = 1
    if type.lower() == "users":
        filter = KalturaUserFilter()
        result = client.user.list(filter, pager)
        total_count = result.totalCount
    if type.lower() == "media":
        filter = KalturaMediaEntryFilter()
        result = client.media.list(filter, pager)
        total_count = result.totalCount
    return total_count
Пример #3
0
 def ping(self):
     filter_ = KalturaMediaEntryFilter()
     filter_.nameLike = "Love is the drug I'm thinking of"
     result = self.kaltura_client.baseEntry.list(
         filter=filter_,
         pager=KalturaFilterPager(pageSize=1),
     )
     return result.totalCount is not None
Пример #4
0
 def get_category_object(self, name):
     response = self.client.category.list(
         filter=KalturaCategoryFilter(fullNameEqual=name),
         pager=KalturaFilterPager(pageIndex=1, pageSize=1),
     )
     category_objects = [
         _category_object_to_json(o) for o in response.objects
     ]
     return category_objects[0] if category_objects else None
Пример #5
0
 def get_canvas_category_object(self, canvas_course_site_id):
     response = self.kaltura_client.category.list(
         filter=KalturaCategoryFilter(
             fullNameEqual=f'Canvas>site>channels>{canvas_course_site_id}'),
         pager=KalturaFilterPager(pageIndex=1, pageSize=1),
     )
     canvas_category_objects = [
         _category_object_to_json(o) for o in response.objects
     ]
     return canvas_category_objects[0] if canvas_category_objects else None
Пример #6
0
    def download_entry_id(self):
        """ Download videofiles from entryId """
        files_to_download = {}
        parent_entry_id, ok = QInputDialog.getText(self, "Input entryid",
                                                   "Input entryid:")
        self.statusbar.showMessage("Download files for parent entryId " +
                                   parent_entry_id)
        self.top_label.setText("Downloading files for parent entryId " +
                               parent_entry_id)

        files_to_download.update({
            parent_entry_id:
            self.kaltura_session.media.get(parent_entry_id).downloadUrl
        })

        filter = KalturaMediaEntryFilter()
        filter.parentEntryIdEqual = parent_entry_id
        pager = KalturaFilterPager()
        child_entries = self.kaltura_session.media.list(filter, pager)

        for child in child_entries.objects:
            files_to_download.update({child.id: child.downloadUrl})

        self.thread_download(parent_entry_id, files_to_download)
Пример #7
0
def export_users(client, total_count):
    """
    export users and returns python dictionary
    kmc users are stored as a dictionary in kmc key
    kms users are stored as a dictionary in kms key
    """

    filter = KalturaUserFilter()
    pager = KalturaFilterPager()
    pager.pageSize = 300
    page_count = 1
    user_return_dict = {"kmc": {}, "kms": {}}
    domain_list = []
    user_type_count_kms = 0
    user_type_count_kmc = 0
    print_overview(total_count)

    # Iterate on KalturaUserListResponse objects
    while page_count <= ceil(total_count / 300):
        pager.pageIndex = page_count
        result = client.user.list(filter, pager)
        for user_entry in track(result.objects,
                                description="Exporting page " +
                                str(page_count)):
            domain = user_entry.id
            domain = domain.split("@", 1)
            if len(domain) < 2:
                # We disregard KalturaUser objects without domain in userId
                continue
            domain_list.append(domain[1])

            if user_entry.isAdmin is True:
                user_type = "kmc"
                user_type_count_kmc += 1

            else:
                user_type = "kms"
                user_type_count_kms += 1

            user_return_dict[user_type][user_entry.id] = [user_entry.email]

        # output summary to console
        domain_list_tmp = Counter(domain_list)
        console = Console()
        table = Table(show_header=True, header_style="bold magenta")
        table.add_column("Domain", style="dim", width=12)
        table.add_column("count")
        for domain, count in domain_list_tmp.items():
            table.add_row(domain, str(count))
        console.print(table)

        console = Console()
        table = Table(show_header=True, header_style="bold magenta")
        table.add_column("Users", style="dim", width=12)
        table.add_column("Count")
        table.add_row("Total", str(user_type_count_kms + user_type_count_kmc))
        table.add_row("KMS", str(user_type_count_kms))
        table.add_row("KMC", str(user_type_count_kmc))
        console.print(table)

        page_count += 1

    return user_return_dict
Пример #8
0
def export_media(client, total_count):
    """
    export and returns python dictionary
    key = media owners
    value = list of entryId
    """

    filter = KalturaMediaEntryFilter()
    pager = KalturaFilterPager()
    pager.pageSize = 300
    page_count = 1
    media_return_dict = {}
    domain_list = []
    print_overview(total_count)

    # Iterate on KalturaMediaListResponse objects
    while page_count <= ceil(total_count / 300):
        pager.pageIndex = page_count
        result = client.media.list(filter, pager)
        for media_entry in track(result.objects,
                                 description="Exporting page " +
                                 str(page_count)):
            domain = media_entry.userId
            domain = domain.split("@", 1)
            if len(domain) < 2:
                # We disregard KalturaMediaEntry objects owned by userId without domain
                continue
            domain_list.append(domain[1])
            if media_entry.userId not in media_return_dict:
                media_return_dict[media_entry.userId] = [media_entry.id]
            else:
                media_return_dict[media_entry.userId].append(media_entry.id)

            # Look for Kaltura Capture entryId if mediaType = VIDEO
            media_type_check = media_entry.mediaType
            if media_type_check.value not in [2, 5, 201, 202, 203, 204]:
                logging.debug(media_entry.id +
                              ": mediaType is VIDEO. Check if multi_video")
                multi_video_filter = KalturaMediaEntryFilter()
                multi_video_filter.parentEntryIdEqual = media_entry.id
                multi_video_pager = KalturaFilterPager()
                multi_video_search = client.media.list(multi_video_filter,
                                                       multi_video_pager)
                if len(multi_video_search.objects) > 0:
                    for multi_video_entry in multi_video_search.objects:
                        media_return_dict[media_entry.userId].append(
                            multi_video_entry.id)
            else:
                logging.debug(
                    media_entry.id +
                    ": mediaType is not VIDEO. Don't check if multi_video")

        # Output summary to console
        domain_list_tmp = Counter(domain_list)
        console = Console()
        table = Table(show_header=True, header_style="bold magenta")
        table.add_column("Domain", style="dim", width=12)
        table.add_column("count")
        for domain, count in domain_list_tmp.items():
            table.add_row(domain, str(count))
        console.print(table)
        page_count += 1

    return media_return_dict
    def test_SampleMetadataOperations(self):

        from KalturaClient.Plugins.Metadata import KalturaMetadataProfile
        from KalturaClient.Plugins.Metadata import KalturaMetadataObjectType
        from KalturaClient.Plugins.Metadata import KalturaMetadataProfileFilter
        from KalturaClient.Plugins.Metadata import KalturaMetadataFilter

        # 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"

        # 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 = self.client.media.list(search, pager).objects

        # make sure we have a metadata profile
        profile = KalturaMetadataProfile()
        profile.setName('TestProfile %s' % (testString, ))
        MetadataObjectType = KalturaMetadataObjectType.ENTRY

        profile.setMetadataObjectType(MetadataObjectType)
        viewsData = ""

        xsdFh = getTestFile(xsdFile)
        newProfile = self.client.metadata.metadataProfile.add(
            profile, xsdFh.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 = self.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 %s' % (testString, ))
        profile.setMetadataObjectType(KalturaMetadataObjectType.ENTRY)
        viewsData = ""

        metadataResult = self.client.metadata.metadataProfile.update(
            newProfile.id, profile, xsdFh.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 = self.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 = self.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 = self.client.metadata.metadata.update(metadataList[0].id, xml)
        print "5. Updated metadata for video: " + name + ", entryid: " + id
        xmlquoted = rc.xml
        print "XML: " + xmlquoted
Пример #10
0
 def _fetch(page_index):
     return self.kaltura_client.categoryEntry.list(
         filter=kaltura_category_entry_filter,
         pager=KalturaFilterPager(pageIndex=page_index,
                                  pageSize=DEFAULT_KALTURA_PAGE_SIZE),
     )
Пример #11
0
 def _fetch(page_index):
     return self.kaltura_client.schedule.scheduleEvent.list(
         filter=kaltura_event_filter,
         pager=KalturaFilterPager(pageIndex=page_index,
                                  pageSize=DEFAULT_KALTURA_PAGE_SIZE),
     )
Пример #12
0
 def ping(self):
     filter_ = KalturaMediaEntryFilter()
     filter_.nameLike = 'Love is the drug I\'m thinking of'
     result = self.kaltura_client.media.list(filter_,
                                             KalturaFilterPager(pageSize=1))
     return result.totalCount is not None
Пример #13
0
 def _fetch(page_index):
     return self.kaltura_client.schedule.scheduleResource.list(
         filter=KalturaScheduleResourceFilter(),
         pager=KalturaFilterPager(pageIndex=page_index,
                                  pageSize=DEFAULT_KALTURA_PAGE_SIZE),
     )
Пример #14
0
    def test_list(self):

        entriesTotalCount = 4
        entriesPageSize = 3
        metadataPageSize = 2

        entries, metadataProfiles = self.createEntriesWithMetadataObjects(
            entriesTotalCount, metadataPageSize)

        entriesFilter = KalturaMediaEntryFilter()
        entriesFilter.tagsLike = self.uniqueTag
        entriesFilter.statusIn = KalturaEntryStatus.PENDING + ',' + KalturaEntryStatus.NO_CONTENT

        entriesPager = KalturaFilterPager()
        entriesPager.pageSize = entriesPageSize

        metadataFilter = KalturaMetadataFilter()
        metadataFilter.metadataObjectTypeEqual = KalturaMetadataObjectType.ENTRY

        metadataMapping = KalturaResponseProfileMapping()
        metadataMapping.filterProperty = 'objectIdEqual'
        metadataMapping.parentProperty = 'id'

        metadataPager = KalturaFilterPager()
        metadataPager.pageSize = metadataPageSize

        metadataResponseProfile = KalturaDetachedResponseProfile()
        metadataResponseProfile.name = self.uniqid('test_')
        metadataResponseProfile.type = KalturaResponseProfileType.INCLUDE_FIELDS
        metadataResponseProfile.fields = 'id,objectId,createdAt, xml'
        metadataResponseProfile.filter = metadataFilter
        metadataResponseProfile.pager = metadataPager
        metadataResponseProfile.mappings = [metadataMapping]

        responseProfile = KalturaResponseProfile()
        responseProfile.name = self.uniqid('test_')
        responseProfile.systemName = self.uniqid('test_')
        responseProfile.type = KalturaResponseProfileType.INCLUDE_FIELDS
        responseProfile.fields = 'id,name,createdAt'
        responseProfile.relatedProfiles = [metadataResponseProfile]

        responseProfile = self.client.responseProfile.add(responseProfile)

        nestedResponseProfile = KalturaResponseProfileHolder()
        nestedResponseProfile.id = responseProfile.id

        self.client.setResponseProfile(nestedResponseProfile)
        list = self.client.baseEntry.list(entriesFilter, entriesPager)

        self.assertIsInstance(list, KalturaBaseEntryListResponse)
        self.assertEqual(entriesTotalCount, list.totalCount)
        self.assertEqual(entriesPageSize, len(list.objects))
        [
            self.assertIsInstance(entry, KalturaMediaEntry)
            for entry in list.objects
        ]

        for entry in list.objects:
            self.assertNotEqual(entry.relatedObjects, NotImplemented)
            self.assertTrue(
                entry.relatedObjects.has_key(metadataResponseProfile.name))
            metadataList = entry.relatedObjects[metadataResponseProfile.name]
            self.assertIsInstance(metadataList, KalturaMetadataListResponse)
            self.assertEqual(len(metadataProfiles), len(metadataList.objects))
            [
                self.assertIsInstance(metadata, KalturaMetadata)
                for metadata in metadataList.objects
            ]

            for metadata in metadataList.objects:
                self.assertEqual(entry.id, metadata.objectId)
Пример #15
0
 def get_resource_list(self):
     response = self.kaltura_client.schedule.scheduleResource.list(
         KalturaScheduleResourceFilter(),
         KalturaFilterPager(),
     )
     return [{'id': o.id, 'name': o.name} for o in response.objects]
Пример #16
0
 def test_SampleMetadataOperations(self):
     
     from KalturaClient.Plugins.Metadata import KalturaMetadataProfile
     from KalturaClient.Plugins.Metadata import KalturaMetadataObjectType
     from KalturaClient.Plugins.Metadata import KalturaMetadataProfileFilter
     from KalturaClient.Plugins.Metadata import KalturaMetadataFilter        
     
     # 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"
 
     # 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 = self.client.media.list(search, pager).objects
 
     # make sure we have a metadata profile
     profile = KalturaMetadataProfile() 
     profile.setName('TestProfile %s' % (testString,))
     MetadataObjectType = KalturaMetadataObjectType.ENTRY
     
     profile.setMetadataObjectType(MetadataObjectType)
     viewsData = ""
 
     xsdFh = getTestFile(xsdFile)
     newProfile = self.client.metadata.metadataProfile.add(profile, xsdFh.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 = self.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 %s' % (testString,))
     profile.setMetadataObjectType(KalturaMetadataObjectType.ENTRY)
     viewsData = ""
 
     metadataResult = self.client.metadata.metadataProfile.update(newProfile.id, profile, xsdFh.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 = self.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 = self.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 = self.client.metadata.metadata.update(metadataList[0].id, xml)
     print "5. Updated metadata for video: " + name + ", entryid: " + id
     xmlquoted = rc.xml
     print "XML: " + xmlquoted
Пример #17
0
    def test_list(self):

        entriesTotalCount = 4
        entriesPageSize = 3
        metadataPageSize = 2

        entries, metadataProfiles = self.createEntriesWithMetadataObjects(entriesTotalCount, metadataPageSize)

        entriesFilter = KalturaMediaEntryFilter()
        entriesFilter.tagsLike = self.uniqueTag
        entriesFilter.statusIn = KalturaEntryStatus.PENDING + ',' + KalturaEntryStatus.NO_CONTENT

        entriesPager = KalturaFilterPager()
        entriesPager.pageSize = entriesPageSize

        metadataFilter = KalturaMetadataFilter()
        metadataFilter.metadataObjectTypeEqual = KalturaMetadataObjectType.ENTRY

        metadataMapping = KalturaResponseProfileMapping()
        metadataMapping.filterProperty = 'objectIdEqual'
        metadataMapping.parentProperty = 'id'

        metadataPager = KalturaFilterPager()
        metadataPager.pageSize = metadataPageSize

        metadataResponseProfile = KalturaDetachedResponseProfile()
        metadataResponseProfile.name = self.uniqid('test_')
        metadataResponseProfile.type = KalturaResponseProfileType.INCLUDE_FIELDS
        metadataResponseProfile.fields = 'id,objectId,createdAt, xml'
        metadataResponseProfile.filter = metadataFilter
        metadataResponseProfile.pager = metadataPager
        metadataResponseProfile.mappings = [metadataMapping]

        responseProfile = KalturaResponseProfile()
        responseProfile.name = self.uniqid('test_')
        responseProfile.systemName = self.uniqid('test_')
        responseProfile.type = KalturaResponseProfileType.INCLUDE_FIELDS
        responseProfile.fields = 'id,name,createdAt'
        responseProfile.relatedProfiles = [metadataResponseProfile]

        responseProfile = self.client.responseProfile.add(responseProfile)

        nestedResponseProfile = KalturaResponseProfileHolder()
        nestedResponseProfile.id = responseProfile.id

        self.client.setResponseProfile(nestedResponseProfile)
        list = self.client.baseEntry.list(entriesFilter, entriesPager)

        self.assertIsInstance(list, KalturaBaseEntryListResponse)
        self.assertEqual(entriesTotalCount, list.totalCount)
        self.assertEqual(entriesPageSize, len(list.objects))
        [self.assertIsInstance(entry, KalturaMediaEntry) for entry in list.objects]
        
        for entry in list.objects:
            self.assertNotEqual(entry.relatedObjects, NotImplemented)
            self.assertTrue(entry.relatedObjects.has_key(metadataResponseProfile.name))
            metadataList = entry.relatedObjects[metadataResponseProfile.name]
            self.assertIsInstance(metadataList, KalturaMetadataListResponse)
            self.assertEqual(len(metadataProfiles), len(metadataList.objects))
            [self.assertIsInstance(metadata, KalturaMetadata) for metadata in metadataList.objects]
            
            for metadata in metadataList.objects:
                self.assertEqual(entry.id, metadata.objectId)
    def mediaCreation(self) -> DataSourceStatus:
        """
        Update data with Kaltura media metadata from Kaltura API.

        :return: DataSourceStatus
        """

        self._kalturaInit()

        KALTURA_MAX_MATCHES_ERROR: str = 'QUERY_EXCEEDED_MAX_MATCHES_ALLOWED'
        tableName: str = 'mivideo_media_created'

        logger.info('Starting procedure...')

        kClient: KalturaRequestConfiguration = KalturaClient(KalturaConfiguration())
        kClient.setKs(  # pylint: disable=no-member
            KalturaSessionService(kClient).start(
                self.kUserSecret, type=KalturaSessionType.ADMIN, partnerId=self.kPartnerId))
        kMedia = KalturaMediaService(kClient)

        lastTime: datetime = self._readTableLastTime(
            tableName, 'created_at', self.defaultLastTimestamp)

        createdAtTimestamp: float = lastTime.timestamp()

        kFilter = KalturaMediaEntryFilter()
        kFilter.createdAtGreaterThanOrEqual = createdAtTimestamp
        kFilter.categoriesFullNameIn = self.categoriesFullNameIn
        kFilter.orderBy = KalturaMediaEntryOrderBy.CREATED_AT_ASC

        kPager = KalturaFilterPager()
        kPager.pageSize = 500  # 500 is maximum
        kPager.pageIndex = 1

        results: Sequence[KalturaMediaEntry] = None
        lastCreatedAtTimestamp: Union[float, int] = createdAtTimestamp
        lastId: Union[str, None] = None
        numberResults: int = 0
        queryPageNumber: int = kPager.pageIndex  # for logging purposes
        totalNumberResults: int = numberResults  # for logging purposes
        endOfResults = False

        while not endOfResults:
            try:
                results = kMedia.list(kFilter, kPager).objects
            except KalturaException as kException:
                if (KALTURA_MAX_MATCHES_ERROR in kException.args):
                    # set new filter timestamp, reset pager to page 1, then continue
                    kFilter.createdAtGreaterThanOrEqual = lastCreatedAtTimestamp
                    logger.debug(
                        f'New filter timestamp: ({kFilter.createdAtGreaterThanOrEqual})')

                    # to avoid dupes, also filter out the last ID returned by previous query
                    # because Kaltura compares createdAt greater than *or equal* to timestamp
                    kFilter.idNotIn = lastId
                    kPager.pageIndex = 1
                    continue

                logger.info(f'Other Kaltura API error: "{kException}"')
                break

            numberResults = len(results)
            logger.debug(
                f'Query page ({queryPageNumber}); number of results: ({numberResults})')

            if (numberResults > 0):
                resultDictionaries: Sequence[Dict] = tuple(r.__dict__ for r in results)

                creationData: pd.DataFrame = self._makeCreationData(resultDictionaries)

                creationData.to_sql(
                    tableName, self.appDb.engine, if_exists='append', index=False)

                courseData: pd.DataFrame = self._makeCourseData(resultDictionaries)

                courseData.to_sql('mivideo_media_courses', self.appDb.engine, if_exists='append',
                                  index=False, method=self._queryRunner)

                lastCreatedAtTimestamp = results[-1].createdAt
                lastId = results[-1].id
                totalNumberResults += numberResults

            endOfResults = (numberResults < kPager.pageSize)

            kPager.pageIndex += 1
            queryPageNumber += 1

        logger.info(f'Total number of results: ({totalNumberResults})')

        logger.info('Procedure complete.')

        return DataSourceStatus(ValidDataSourceName.KALTURA_API)