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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #5
0
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
Beispiel #7
0
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"]
Beispiel #8
0
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)
Beispiel #10
0
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')
Beispiel #11
0
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"
Beispiel #12
0
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)
Beispiel #13
0
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()
Beispiel #15
0
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
Beispiel #17
0
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
Beispiel #18
0
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)