Skip to content
Snippets Groups Projects
resource.py 4.13 KiB
Newer Older
#!/usr/bin/env python3
# -*- coding: utf-8 -*-


logger = logging.getLogger('pod_client.resource')

    'users': '/rest/users/',
    'groups': '/rest/groups/',
    'owners': '/rest/owners/',
    'channels': '/rest/channels/',
    'themes': '/rest/themes/',
    'types': '/rest/types/',
    'discipline': '/rest/discipline/',
    'videos': '/rest/videos/',
    'renditions': '/rest/renditions/',
    'launch_encode_view': '/rest/launch_encode_view/',
    'encodings_video': '/rest/encodings_video/',
    'encodings_audio': '/rest/encodings_audio/',
    'playlist_videos': '/rest/playlist_videos/',
    'contributors': '/rest/contributors/',
    'documents': '/rest/documents/',
    'tracks': '/rest/tracks/',
    'overlays': '/rest/overlays/',
    'chapters': '/rest/chapters/',
    'recording': '/rest/recording/',
    'recordingfile': '/rest/recordingfile/',
    'sites': '/rest/sites/',
    #'enrichments': '/rest/enrichments/', seems not available in rest api
    #'buildings': '/rest/buildings/',
    #'broadcasters': '/rest/broadcasters/'
if os.environ.get('POD_CLIENT_USE_POD_FILE'):
    # specific rest urls only available if USE_PODFILE is set in pod settings file
    API_URLS['folders'] = '/rest/folders/'
    API_URLS['files'] = '/rest/files/'
    API_URLS['images'] = '/rest/images/'


class Resource:
    host_url = ''
    name = ''
    api_key = ''
    def __init__(self, host_url, api_key, resource_name, site_id=1):
        self.host_url = host_url
        if not self.host_url:
            raise Exception('Pod host url required')
        self.api_key = api_key
        if not self.api_key:
            raise Exception('Pod api key missing')
        self.name = resource_name
        if not API_URLS.get(self.name):
            raise Exception('Resource url not supported')
        self.site_id = site_id
    def _request(self, method='GET', resource_id=None, headers={}, params={}, data={}, **request_params):
        response = dict(success=True)
        url = self.url(resource_id)
        headers['Authorization'] = 'Token %s' % self.api_key
        if self.name != 'sites':
            if method != 'get':
                data['sites'] = [Resource(self.host_url, self.api_key, 'sites').url(self.site_id)]
            else:
                params['sites'] = [Resource(self.host_url, self.api_key, 'sites').url(self.site_id)]
            res = requests.request(method, url, headers=headers, params=params, data=data, **request_params)
            response['status_code'] = res.status_code
            if res.status_code in [200, 201, 204]:
                try:
                    response['data'] = res.json()
                except Exception:
                    response['data'] = {}
            else:
                response['success'] = False
                response['error'] = '%s: %s' % (res.status_code, res.text)
        except (requests.RequestException,
                requests.ConnectionError,
                requests.HTTPError,
                requests.URLRequired) as e:
            response['success'] = False
            response['status_code'] = 0
            response['error'] = e
    def url(self, resource_id=None):
        url = '%s%s' % (self.host_url, API_URLS[self.name])
        if resource_id:
            url = '%s%s/' % (url, resource_id)
        return url

    def get(self, resource_id=None, data={}, **request_params):
        return self._request('GET', resource_id=resource_id, params=data, **request_params)
    def post(self, resource_id=None, data={}, **request_params):
        return self._request('POST', resource_id=resource_id, data=data, **request_params)
    def put(self, resource_id=None, data={}, **request_params):
        return self._request('PUT', resource_id=resource_id, data=data, **request_params)
    def patch(self, resource_id=None, data={}, **request_params):
        return self._request('PATCH', resource_id=resource_id, data=data, **request_params)
    def delete(self, resource_id=None, data={}, **request_params):
        return self._request('DELETE', resource_id=resource_id, data=data, **request_params)