]> www.vanbest.org Git - motioneye-debian/commitdiff
google drive upload service: folder id is now renewed every 5 minutes
authorCalin Crisan <ccrisan@gmail.com>
Sat, 2 Jul 2016 11:37:31 +0000 (14:37 +0300)
committerCalin Crisan <ccrisan@gmail.com>
Sat, 2 Jul 2016 11:37:31 +0000 (14:37 +0300)
motioneye/handlers.py
motioneye/tasks.py
motioneye/uploadservices.py

index ac1644ec3df7ef7706c5eaee4548230f4658556e..aff2a633057b81701d415d9557213530dd895eb9 100644 (file)
@@ -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'],
index 85ca7b1a3e7ae61fa98e9a06b063a2df93122cd0..e29c6367f503b9ed96d70d09c45d28741ca81411 100644 (file)
@@ -31,7 +31,7 @@ import settings
 _INTERVAL = 10
 _STATE_FILE_NAME = 'tasks.pickle'
 _MAX_TASKS = 100
-_POOL_SIZE = 
+_POOL_SIZE = 1 # we just need one extra process to handle async tasks
 
 _tasks = []
 _pool = None
index 27834a9cbe56a4a16429af4eba64c257bf64ba60..36b0c266f53a2c21ee7685df71eb24d3b43e7f89 100644 (file)
@@ -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))