From d72ad71c29bdcc607707d045a632349ed7ccdc68 Mon Sep 17 00:00:00 2001 From: Calin Crisan Date: Sat, 2 Jul 2016 14:37:31 +0300 Subject: [PATCH] google drive upload service: folder id is now renewed every 5 minutes --- motioneye/handlers.py | 2 +- motioneye/tasks.py | 2 +- motioneye/uploadservices.py | 35 ++++++++++++++++------------------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/motioneye/handlers.py b/motioneye/handlers.py index ac1644e..aff2a63 100644 --- a/motioneye/handlers.py +++ b/motioneye/handlers.py @@ -1617,7 +1617,7 @@ class RelayEventHandler(BaseHandler): def upload_media_file(self, filename, camera_id, camera_config): service_name = camera_config['@upload_service'] - + tasks.add(5, uploadservices.upload_media_file, tag='upload_media_file(%s)' % filename, async=True, camera_id=camera_id, service_name=service_name, target_dir=camera_config['@upload_subfolders'] and camera_config['target_dir'], diff --git a/motioneye/tasks.py b/motioneye/tasks.py index 85ca7b1..e29c636 100644 --- a/motioneye/tasks.py +++ b/motioneye/tasks.py @@ -31,7 +31,7 @@ import settings _INTERVAL = 10 _STATE_FILE_NAME = 'tasks.pickle' _MAX_TASKS = 100 -_POOL_SIZE = 2 +_POOL_SIZE = 1 # we just need one extra process to handle async tasks _tasks = [] _pool = None diff --git a/motioneye/uploadservices.py b/motioneye/uploadservices.py index 27834a9..36b0c26 100644 --- a/motioneye/uploadservices.py +++ b/motioneye/uploadservices.py @@ -19,6 +19,7 @@ import json import logging import mimetypes import os.path +import time import urllib import urllib2 @@ -26,6 +27,7 @@ import settings _STATE_FILE_NAME = 'uploadservices.json' +_services = None class UploadService(object): @@ -51,7 +53,7 @@ class UploadService(object): while rel_filename.startswith('/'): rel_filename = rel_filename[1:] - self.debug('uploading file "[%s]/%s" to %s' % (target_dir, rel_filename, self)) + self.debug('uploading file "%s/%s" to %s' % (target_dir, rel_filename, self)) else: rel_filename = os.path.basename(filename) @@ -80,7 +82,7 @@ class UploadService(object): raise Exception(msg) data = f.read() - self.debug('size of "%s" is %.1fMB' % (filename, len(data) / 1024.0 / 1024)) + self.debug('size of "%s" is %.3fMB' % (filename, len(data) / 1024.0 / 1024)) mime_type = mimetypes.guess_type(filename)[0] or 'image/jpeg' self.debug('mime type of "%s" is "%s"' % (filename, mime_type)) @@ -138,12 +140,15 @@ class GoogleDrive(UploadService): BOUNDARY = 'motioneye_multipart_boundary' MAX_FILE_SIZE = 128 * 1024 * 1024 # 128 MB + + FOLDER_ID_LIFE_TIME = 300 # 5 minutes 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 + self._folder_id_time = 0 UploadService.__init__(self, camera_id) @@ -201,7 +206,6 @@ class GoogleDrive(UploadService): 'location': self._location, 'credentials': self._credentials, 'authorization_key': self._authorization_key, - 'folder_id': self._folder_id } def load(self, data): @@ -212,14 +216,13 @@ class GoogleDrive(UploadService): self._credentials = data['credentials'] if 'authorization_key' in data: self._authorization_key = data['authorization_key'] - if 'folder_id' in data: - self._folder_id = data['folder_id'] def _get_folder_id(self): - if not self._folder_id: + now = time.time() + if not self._folder_id or (now - self._folder_id_time > self.FOLDER_ID_LIFE_TIME): self.debug('finding folder id for location "%s"' % self._location) self._folder_id = self._get_folder_id_by_path(self._location) - self.save() + self._folder_id_time = now return self._folder_id @@ -558,19 +561,13 @@ class Dropbox(UploadService): } -def get(camera_id, service_name, create=True): - services = _load() +def get(camera_id, service_name): + global _services - camera_id = str(camera_id) - service = services.get(camera_id, {}).get(service_name) - if not service and create: - classes = UploadService.get_service_classes() - cls = classes.get(service_name) - if cls: - logging.debug('creating upload service %s for camera with id %s' % (service_name, camera_id)) - service = cls(camera_id=camera_id) + if _services is None: + _services = _load() - return service + return _services.get(str(camera_id), {}).get(service_name) def _load(): @@ -642,7 +639,7 @@ def _save(services): def upload_media_file(camera_id, target_dir, service_name, filename): - service = get(camera_id, service_name, create=False) + service = get(camera_id, service_name) if not service: return logging.error('service "%s" not initialized for camera with id %s' % (service_name, camera_id)) -- 2.39.5