rabbitmq/transcode_check.py (58 lines of code) (raw):

import requests from django.conf import settings from xml.etree.cElementTree import fromstring import logging logger = logging.getLogger(__name__) xmlns = "{http://xml.vidispine.com/schema/vidispine}" def list_shape_ids(vsid): url = "{0}/API/item/{1}/shape".format(settings.VIDISPINE_URL,vsid) result = requests.get(url, auth=(settings.VIDISPINE_USERNAME,settings.VIDISPINE_PASSWORD), headers={"Accept":"application/xml"}) if result.status_code == 200: doc = fromstring(result.text.encode("utf-8")) for node in doc.findall("{0}uri".format(xmlns)): yield node.text else: raise Exception("could not list shape ids on {0}, server returned {1}".format(vsid, result.status_code)) def check_shape_tag(vsid, shapeid, tagtofind): """ check if the given shape on the given item is of the given shape tag if it is, then return the parsed document tree :param vsid: vidispine item ID :param shapeid: shape ID on the item ID :param tagtofind: shape tagname :return: either None or the parsed xml data """ url = "{0}/API/item/{1}/shape/{2}".format(settings.VIDISPINE_URL,vsid, shapeid) result = requests.get(url, auth=(settings.VIDISPINE_USERNAME,settings.VIDISPINE_PASSWORD), headers={"Accept":"application/xml"}) if result.status_code == 200: doc = fromstring(result.text.encode("utf-8")) shape_tag_node = doc.find("{0}tag".format(xmlns)) if shape_tag_node is None: logger.warning("shape {0} on item {1} has no shape tag node".format(shapeid, vsid)) return None if shape_tag_node.text == tagtofind: return doc else: return None else: raise Exception("could not list shape ids on {0}, server returned {1}".format(vsid, result.status_code)) def check_for_broken_proxy(vsid): """ check whether the given item id has a "broken" proxy, i.e. a lowres shape on it with no data. a valid shape should have a "containerComponent" on it. if there is no lowres shape present, then True is also returned :param vsid: :return: a boolean indicating whether the proxy should be regenrated and the shape ID of the proxy or None """ for shape_id in list_shape_ids(vsid): shapeinfo = check_shape_tag(vsid, shape_id, "lowres") if shapeinfo is not None: #we have the lowres shape container_component_node = shapeinfo.find("{0}containerComponent".format(xmlns)) if container_component_node is None: logger.warning("{0}: item has an invalid proxy".format(vsid)) return True, shape_id else: logger.info("{0}: item has a valid proxy".format(vsid)) return False, shape_id logger.error("{0}: item has no proxy at all!".format(vsid)) return True, None def delete_existing_proxy(vsid, shape_id): """ sends a DELETE request to vidispine for the given shape on the given item :param vsid: :param shape_id: :return: """ url = "{0}/API/item/{1}/shape/{2}".format(settings.VIDISPINE_URL, vsid, shape_id) response = requests.delete(url, auth=(settings.VIDISPINE_USERNAME, settings.VIDISPINE_PASSWORD)) if 299 > response.status_code >= 200: return True else: raise Exception("could not delete shape {0} on {1}, server returned {2}".format(shape_id, vsid, response.status_code)) def transcode_proxy(vsid, shape_tag): """ requests that vidispine create a new proxy of the given tag :param vsid: item to proxy :param shape_tag: type of proxy to create :return: """ url = "{0}/API/item/{1}/transcode?priority=HIGH&tag={2}".format(settings.VIDISPINE_URL, vsid, shape_tag) response = requests.post(url, auth=(settings.VIDISPINE_USERNAME, settings.VIDISPINE_PASSWORD)) if 299 > response.status_code >= 200: logger.info("{0}: transcode started successfully: {1}".format(vsid, response.text)) return True else: raise Exception("could not transcode shape {0} on {1}, server returned {2}".format(shape_tag, vsid, response.status_code))