#!/usr/bin/env python3 # -*- coding: utf-8 -*- import logging import os import requests logger = logging.getLogger('pod_client.resource') API_URLS = { '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)] try: 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: logger.error(e) response['success'] = False response['status_code'] = 0 response['error'] = e return response 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)