def series_exists(base_url, digest_login, series_id): """ Check if series of media package to be recovered still exists. :param base_url: Base URL for request. :type base_url: str :param digest_login: User and password for digest authentication. :type digest_login: DigestLogin :param series_id: ID of the series to be checked :type series_id: str :return: True if the series still exists, False otherwise :rtype: bool :raise RequestError: If an error other than 404 occurs """ url = '{}/series/{}.json'.format(base_url, series_id) try: get_request(url, digest_login, "/series/{id}.json") except RequestError as e: if e.has_status_code() and e.get_status_code() == NOT_FOUND: return False raise e return True
def __get_acls_of_event(event, base_url, digest_login): """ Get two lists for episode and series ACLs for a given event. :param event: The event :type event: dict :param base_url: The base URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :return: The episode and series acls :rtype: list, list :raise RequestError: """ url = '{}/admin-ng/event/{}/asset/attachment/attachments.json'.format(base_url, get_id(event)) response = get_request(url, digest_login, ElementDescription.EVENT.unknown(), AssetTypeDescription.BOTH.plural(), AssetDescription.ACL.plural()) json_content = get_json_content(response) episode_acls = [__get_asset_content(acl, digest_login, ElementDescription.EVENT.unknown(), AssetTypeDescription.EPISODE.singular(), AssetDescription.ACL.singular()) for acl in json_content if "security-policy-episode" in acl["id"]] series_acls = [__get_asset_content(acl, digest_login, ElementDescription.EVENT.unknown(), AssetTypeDescription.SERIES.singular(), AssetDescription.ACL.singular()) for acl in json_content if "security-policy-series" in acl["id"]] return episode_acls, series_acls
def __get_dc_of_series(series, base_url, digest_login): """ Get the series Dublin Core catalog for a given series. :param series: The series :type series: dict :param base_url: The base URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :return: The series Dublin Core catalog :rtype: ElementTree.Element :raise RequestError: """ url = '{}/series/{}.xml'.format(base_url, get_id(series)) es = ElementDescription.SERIES es = es.unknown() response = get_request(url, digest_login, es, AssetTypeDescription.SERIES.singular(), AssetDescription.DC.singular()) series_dc = get_xml_content(response) return series_dc
def get_tenants(base_url, digest_login): """ Return a sorted list of unique tenant IDs :param base_url: The URL to an opencast instance :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :return: tenant ids :raise RequestError: """ url = '{}/org/all.json'.format(base_url) response = get_request(url, digest_login, "tenants") json_content = get_json_content(response) if isinstance(json_content["organizations"]["organization"], list): tenants = [ org["id"] for org in (json_content["organizations"])["organization"] ] tenants = sorted(set(tenants)) else: tenants = [json_content["organizations"]["organization"]["id"]] return tenants
def __get_dcs_of_event(event, base_url, digest_login): """ Get two lists for episode and series Dublin Core catalogs for a given event. :param event: The event :type event: dict :param base_url: The base URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :return: The episode and series Dublin Core catalogs :rtype: list, list :raise RequestError: """ url = '{}/admin-ng/event/{}/asset/catalog/catalogs.json'.format(base_url, get_id(event)) response = get_request(url, digest_login, ElementDescription.EVENT.unknown(), AssetTypeDescription.BOTH.plural(), AssetDescription.DC.plural()) json_content = get_json_content(response) episode_dcs = [__get_asset_content(catalog, digest_login, ElementDescription.EVENT.unknown(), AssetTypeDescription.EPISODE.singular(), AssetDescription.DC.singular()) for catalog in json_content if "dublincore/episode" in catalog["type"]] series_dcs = [__get_asset_content(catalog, digest_login, ElementDescription.EVENT.unknown(), AssetTypeDescription.SERIES.singular(), AssetDescription.DC.singular()) for catalog in json_content if "dublincore/series" in catalog["type"]] return episode_dcs, series_dcs
def get_oaipmh_record(event, repository_url, repository, digest_login, base_url): """ Get the oaipmh record for a given event at base_url with the given digest login. :param event: The event :type event: dict :param repository_url: The URL to the OAIPMH repository :type repository_url: str :param repository: The OAIPMH repository ID :type repository: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :param base_url: The URL of the opencast instance :type base_url: str :return: The OAIPMH record in XML format :rtype: ElementTree.Element :raise RequestError: """ # absolute url if repository_url.startswith("http"): url = '{}?verb=GetRecord&metadataPrefix=matterhorn-inlined&identifier={}'.format(repository_url.split('?')[0], get_id(event)) # relative url else: url = '{}{}?verb=GetRecord&metadataPrefix=matterhorn-inlined&identifier={}'.format(base_url, repository_url.split('?')[0], get_id(event)) response = get_request(url, digest_login, ElementDescription.OAIPMH.format(repository).singular()) record = get_xml_content(response) return record
def get_workflow_instances(base_url, digest_login, params): """ Get workflow instances. :param base_url: The URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :param params: Additional parameters :type params: dict :return: list of workflow instances :rtype: dict """ url = '{}/workflow/instances.json'.format(base_url) for i, param in enumerate(params): if i == 0: url += "?" else: url += "&" url += param + "=" + params.get(param) response = get_request(url, digest_login, "workflow instances") return get_json_content(response)["workflows"]
def __get_acl_of_series(series, base_url, digest_login): """ Get the series ACL for a given series. :param series: The series :type series: dict :param base_url: The base URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :return: The series ACL :rtype: dict :raise RequestError: """ url = "{}/series/{}/acl.json".format(base_url, get_id(series)) response = get_request(url, digest_login, ElementDescription.SERIES.unknown(), AssetTypeDescription.SERIES.singular(), AssetDescription.ACL.singular()) json_content = get_json_content(response) series_acl = json_content["acl"] return series_acl
def get_file_as_string(digest_login, url): """ Get the file content as a string :param url: The url to the file :type url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :return: The file content :rtype: str :raise RequestError: """ response = get_request(url, digest_login, "file") return get_string_content(response)
def create_media_package(base_url, digest_login): """ Create a new media package represented by an XML string. :param base_url: Base URL for request. :type base_url: str :param digest_login: User and password for digest authentication. :type digest_login: DigestLogin :return: New media package. :rtype: str """ url = '{}/ingest/createMediaPackage'.format(base_url) response = get_request(url, digest_login, "/ingest/createMediaPackage") return response.content.decode('utf8')
def accepts_url(digest_login, server_url, url_to_sign): """ Checks if a URL can be signed. :param digest_login: The login credentials for digest auth :type digest_login: DigestLogin :param server_url: The server URL :type server_url: str :param url_to_sign: The url to check :type url_to_sign: str :return: If the URL can be signed. :rtype: bool :raise RequestError: """ url = '{}/signing/accepts?baseUrl={}'.format(server_url, url_to_sign) response = get_request(url, digest_login, "URL signing check") return get_string_content(response) == "true"
def get_events_of_series(base_url, digest_login, series_id): """ Get the events for a series from the API :param base_url: The base URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :param series_id: The series id :type series_id: str :return: list of events :rtype: list :raise RequestError: """ url = '{}/api/events/?filter=is_part_of:{}'.format(base_url, series_id) response = get_request(url, digest_login, "events") return get_json_content(response)
def get_events(base_url, digest_login): """ Return all events of one tenant. :param base_url: The URL to an opencast instance including the tenant :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :return: events """ url = '{}/admin-ng/event/events.json?limit={}'.format( base_url, JAVA_MAX_INT) response = get_request(url, digest_login, "events") json_content = get_json_content(response) return json_content["results"]
def export_video_file(digest_login, url, target_file): """ Request a video and write it into a file. :param url: The url to the file :type url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :param target_file: The file to write into :type target_file: Path :raise RequestError: """ response = get_request(url, digest_login, "video", stream=True) with open(target_file, 'wb') as f: for chunk in response.iter_content(chunk_size=1024): if chunk: f.write(chunk) f.flush()
def get_media_package(base_url, digest_login, mp_id): """ Get a media package from the asset manager. :param base_url: The URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :param mp_id: The ID of the media package :type mp_id: str :return: A media package definition in XML format :rtype str: """ url = '{}/assets/episode/{}'.format(base_url, mp_id) response = get_request(url, digest_login, "media package") media_package = get_string_content(response) return media_package
def get_episode_from_search(base_url, digest_login, event_id): """ Get episode from search as json. :param base_url: The base URL for the request :type base_url: str :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :param event_id: The event id :type event_id: str :return: episode as json or None :rtype: episode as json or None :raise RequestError: """ url = '{}/search/episode.json?id={}'.format(base_url, event_id) response = get_request(url, digest_login, "search episode") search_results = get_json_content(response)["search-results"] if "result" in search_results: return search_results["result"] return None
def __get_asset_content(asset, digest_login, element_description, asset_type_description, asset_description): """ Use URL of server response to get the actual content of the asset. :param asset: The asset information :type asset: dict :param digest_login: The login credentials for digest authentication :type digest_login: DigestLogin :param asset_description: ACL or Dublin Core catalog :type asset_description: str :return: The actual asset content in xml format :rtype: ElementTree.Element :raise RequestError: """ url = asset["url"] response = get_request(url, digest_login, element_description, asset_type_description, asset_description) dc = get_xml_content(response) return dc
def sign_url(digest_login, server_url, url_to_sign): """ Get a URL signed for 2 hours. :param digest_login: The login credentials for digest auth :type digest_login: DigestLogin :param server_url: The server URL :type server_url: str :param url_to_sign: The url to be signed :type url_to_sign: str :return: The signed URL :rtype: str :raise RequestError: """ now = datetime.now() two_hours = timedelta(hours=2) two_hours_from_now = now + two_hours two_hours_from_now_timestamp = int(two_hours_from_now.timestamp()) url = '{}/signing/sign?baseUrl={}&validUntil={}'.format(server_url, url_to_sign, two_hours_from_now_timestamp) response = get_request(url, digest_login, "signed URL") return get_string_content(response)