camera_config = _conf_to_dict(lines,
no_convert=['@name', '@network_share_name', '@network_server',
'@network_username', '@network_password', '@storage_device',
- '@upload_server', '@upload_username', '@upload_password', '@upload_authorization_key'])
+ '@upload_server', '@upload_username', '@upload_password'])
if utils.local_motion_camera(camera_config):
# determine the enabled status
'@upload_subfolders': ui['upload_subfolders'],
'@upload_username': ui['upload_username'],
'@upload_password': ui['upload_password'],
- '@upload_authorization_key': ui['upload_authorization_key'],
# text overlay
'text_left': '',
upload_settings = {k[7:]: ui[k] for k in ui.iterkeys() if k.startswith('upload_')}
service = uploadservices.get(old_config['@id'], ui['upload_service'])
service.load(upload_settings)
- uploadservices.save()
+ service.save()
if ui['text_overlay']:
left_text = ui['left_text']
'upload_subfolders': data['@upload_subfolders'],
'upload_username': data['@upload_username'],
'upload_password': data['@upload_password'],
- 'upload_authorization_key': data['@upload_authorization_key'],
+ 'upload_authorization_key': '', # needed, otherwise the field is hidden
# text overlay
'text_overlay': False,
data.setdefault('@upload_subfolders', True)
data.setdefault('@upload_username', '')
data.setdefault('@upload_password', '')
- data.setdefault('@upload_authorization_key', '')
data.setdefault('stream_localhost', False)
data.setdefault('stream_port', int('808' + str(camera_id)))
_STATE_FILE_NAME = 'uploadservices.json'
-_services = None
-
class UploadService(object):
NAME = 'base'
- def __init__(self, **kwargs):
- pass
+ def __init__(self, camera_id, **kwargs):
+ self.camera_id = camera_id
def __str__(self):
return self.NAME
def load(self, data):
pass
+
+ def save(self):
+ services = _load()
+ camera_services = services.get(self.camera_id, {})
+ camera_services[self.NAME] = self
+
+ _save(services)
def log(self, level, *args, **kwargs):
logging.log(level, *args, **kwargs)
BOUNDARY = 'motioneye_multipart_boundary'
MAX_FILE_SIZE = 128 * 1024 * 1024 # 128 MB
- def __init__(self, location=None, authorization_key=None, credentials=None, **kwargs):
+ def __init__(self, camera_id, location=None, authorization_key=None, credentials=None, **kwargs):
self._location = location
self._authorization_key = authorization_key
self._credentials = credentials
self._folder_id = None
+
+ UploadService.__init__(self, camera_id)
def get_authorize_url(self):
query = {
if not self._folder_id:
self.debug('finding folder id for location "%s"' % self._location)
self._folder_id = self._get_folder_id_by_path(self._location)
- save()
+ self.save()
return self._folder_id
return items[0]['id']
def _request(self, url, body=None, headers=None, retry_auth=True):
- if not self._authorization_key:
- msg = 'missing authorization key'
- self.error(msg)
- raise Exception(msg)
-
if not self._credentials:
+ if not self._authorization_key:
+ msg = 'missing authorization key'
+ self.error(msg)
+ raise Exception(msg)
+
self.debug('requesting credentials')
try:
self._credentials = self._request_credentials(self._authorization_key)
- save()
+ self.save()
except Exception as e:
self.error('failed to obtain credentials: %s' % e)
try:
self.debug('credentials have probably expired, refreshing them')
self._credentials = self._refresh_credentials(self._credentials['refresh_token'])
- save()
+ self.save()
# retry the request with refreshed credentials
return self._request(url, body, headers, retry_auth=False)
MAX_FILE_SIZE = 128 * 1024 * 1024 # 128 MB
- def __init__(self, location=None, subfolders=True, authorization_key=None, credentials=None, **kwargs):
+ def __init__(self, camera_id, location=None, subfolders=True, authorization_key=None, credentials=None, **kwargs):
self._location = location
self._subfolders = subfolders
self._authorization_key = authorization_key
self._credentials = credentials
+
+ UploadService.__init__(self, camera_id)
def get_authorize_url(self):
query = {
return location
def _request(self, url, body=None, headers=None, retry_auth=True):
- if not self._authorization_key:
- msg = 'missing authorization key'
- self.error(msg)
- raise Exception(msg)
-
if not self._credentials:
+ if not self._authorization_key:
+ msg = 'missing authorization key'
+ self.error(msg)
+ raise Exception(msg)
+
self.debug('requesting credentials')
try:
self._credentials = self._request_credentials(self._authorization_key)
- save()
+ self.save()
except Exception as e:
self.error('failed to obtain credentials: %s' % e)
try:
self.debug('credentials have probably expired, refreshing them')
self._credentials = self._refresh_credentials(self._credentials['refresh_token'])
- save()
+ self.save()
# retry the request with refreshed credentials
self._request(url, body, headers, retry_auth=False)
}
-def get(camera_id, name, create=True):
- if _services is None:
- load()
+def get(camera_id, service_name, create=True):
+ services = _load()
camera_id = str(camera_id)
- service = _services.get(camera_id, {}).get(name)
+ service = services.get(camera_id, {}).get(service_name)
if not service and create:
classes = UploadService.get_service_classes()
- cls = classes.get(name)
+ cls = classes.get(service_name)
if cls:
- logging.debug('creating upload service %s for camera with id %s' % (name, camera_id))
- service = cls()
- _services.setdefault(camera_id, {})[name] = service
+ logging.debug('creating upload service %s for camera with id %s' % (service_name, camera_id))
+ service = cls(camera_id=camera_id)
return service
-def load():
- global _services
-
- _services = {}
+def _load():
+ services = {}
file_path = os.path.join(settings.CONF_PATH, _STATE_FILE_NAME)
for camera_id, d in data.iteritems():
for name, state in d.iteritems():
- camera_services = _services.setdefault(camera_id, {})
+ camera_services = services.setdefault(camera_id, {})
cls = UploadService.get_service_classes().get(name)
if cls:
- service = cls()
+ service = cls(camera_id=camera_id)
service.load(state)
camera_services[name] = service
logging.debug('loaded upload service "%s" for camera with id "%s"' % (name, camera_id))
+
+ return services
-def save():
- if _services is None:
- return
-
+def _save(services):
file_path = os.path.join(settings.CONF_PATH, _STATE_FILE_NAME)
logging.debug('saving upload services state to "%s"...' % file_path)
return
data = {}
- for camera_id, camera_services in _services.iteritems():
+ for camera_id, camera_services in services.iteritems():
for name, service in camera_services.iteritems():
data.setdefault(camera_id, {})[name] = service.dump()
def upload_media_file(camera_id, target_dir, service_name, filename):
- # force a load from file with every upload,
- # as settings might have changed
- load()
-
service = get(camera_id, service_name, create=False)
if not service:
return logging.error('service "%s" not initialized for camera with id %s' % (service_name, camera_id))