]> www.vanbest.org Git - motioneye-debian/commitdiff
more work towards support for simple mjpeg cameras
authorCalin Crisan <ccrisan@gmail.com>
Sun, 3 May 2015 15:59:07 +0000 (18:59 +0300)
committerCalin Crisan <ccrisan@gmail.com>
Sun, 3 May 2015 15:59:07 +0000 (18:59 +0300)
src/config.py
src/handlers.py
static/js/main.js

index 0e36ffb8e72e5efc7ad2089cd86bf4282b5edaab..39634bf560d24df1c3d2b6bd68fdd78c4f015170 100644 (file)
@@ -314,6 +314,9 @@ def get_camera(camera_id, as_lines=False):
     elif utils.remote_camera(camera_config):
         pass
     
+    elif utils.simple_mjpeg_camera(camera_config):
+        pass
+    
     else: # incomplete configuration
         logging.warn('camera config file at %s is incomplete, ignoring' % camera_config_path)
         
@@ -489,7 +492,7 @@ def add_camera(device_details):
     
     camera_config = get_camera(camera_id)
     
-    return camera_id, camera_config
+    return camera_config
 
 
 def rem_camera(camera_id):
index 162cee2b7ffefc411d085e2ebb6d16bd0cde3054..0a7aee129d9dc9561135f26c97cf821b1d9ba1d5 100644 (file)
@@ -220,7 +220,7 @@ class ConfigHandler(BaseHandler):
                     
                 self.finish_json(ui_config)
             
-            else: # remote camera
+            elif utils.remote_camera(local_config):
                 def on_response(remote_ui_config=None, error=None):
                     if error:
                         return self.finish_json({'error': 'Failed to get remote camera configuration for %(url)s: %(msg)s.' % {
@@ -234,6 +234,9 @@ class ConfigHandler(BaseHandler):
                     self.finish_json(remote_ui_config)
                 
                 remote.get_config(local_config, on_response)
+                
+            else: # assuming simple mjpeg camera
+                pass # TODO implement me
             
         else:
             logging.debug('getting main config')
@@ -267,7 +270,7 @@ class ConfigHandler(BaseHandler):
             
                 on_finish(None, True) # (no error, motion needs restart)
 
-            else: # remote camera
+            elif utils.remote_camera(local_config):
                 # update the camera locally
                 local_config['@enabled'] = ui_config['enabled']
                 config.set_camera(camera_id, local_config)
@@ -284,6 +287,9 @@ class ConfigHandler(BaseHandler):
                     # and no useful fields (such as "name"),
                     # the camera was probably disabled due to errors
                     on_finish(None, False)
+                    
+            else: # assuming simple mjpeg camera
+                pass # TODO implement me
 
         def set_main_config(ui_config):
             logging.debug('setting main config...')
@@ -562,12 +568,15 @@ class ConfigHandler(BaseHandler):
                     cameras.append(ui_config)
                     check_finished()
 
-                else:  # remote camera
+                elif utils.remote_camera(local_config):
                     if local_config.get('@enabled') or self.get_argument('force', None) == 'true':
                         remote.get_config(local_config, on_response_builder(camera_id, local_config))
                     
                     else: # don't try to reach the remote of the camera is disabled
                         on_response_builder(camera_id, local_config)(error=True)
+                        
+                else: # assuming simple mjpeg camera
+                    pass # TODO implement me
             
             if length[0] == 0:        
                 self.finish_json({'cameras': []})
@@ -599,8 +608,7 @@ class ConfigHandler(BaseHandler):
             
             raise
 
-        camera_id, camera_config = config.add_camera(device_details)
-        camera_config['@id'] = camera_id
+        camera_config = config.add_camera(device_details)
 
         if utils.local_motion_camera(camera_config):
             motionctl.stop()
@@ -618,7 +626,7 @@ class ConfigHandler(BaseHandler):
             
             self.finish_json(ui_config)
         
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(remote_ui_config=None, error=None):
                 if error:
                     return self.finish_json({'error': error})
@@ -629,6 +637,11 @@ class ConfigHandler(BaseHandler):
                 self.finish_json(remote_ui_config)
                 
             remote.get_config(camera_config, on_response)
+        
+        else: # assuming simple mjpeg camera
+            #ui_config = config.camera_dict_to_ui(camera_config)
+            # TODO use a special mjpeg function to generate ui_config
+            self.finish_json(ui_config)
     
     @BaseHandler.auth(admin=True)
     def rem_camera(self, camera_id):
@@ -681,7 +694,7 @@ class ConfigHandler(BaseHandler):
             return self.finish_json()
 
         if not utils.local_motion_camera(camera_config):
-            logging.warn('ignoring event for remote camera with id %s' % camera_id)
+            logging.warn('ignoring event for non-local camera with id %s' % camera_id)
             return self.finish_json()
         
         if event == 'start':
@@ -776,7 +789,7 @@ class PictureHandler(BaseHandler):
             self.set_cookie('motion_detected_' + str(camera_id), str(motionctl.is_motion_detected(camera_id)).lower())
             self.try_finish(picture)
                 
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(motion_detected=False, picture=None, error=None):
                 if sequence and picture:
                     mediafiles.set_picture_cache(camera_id, sequence, width, picture)
@@ -785,6 +798,10 @@ class PictureHandler(BaseHandler):
                 self.try_finish(picture)
             
             remote.get_current_picture(camera_config, width=width, height=height, callback=on_response)
+            
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+            
 
     @BaseHandler.auth()
     def list(self, camera_id):
@@ -804,7 +821,7 @@ class PictureHandler(BaseHandler):
             mediafiles.list_media(camera_config, media_type='picture',
                     callback=on_media_list, prefix=self.get_argument('prefix', None))
 
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(remote_list=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to get picture list for %(url)s: %(msg)s.' % {
@@ -814,6 +831,9 @@ class PictureHandler(BaseHandler):
             
             remote.list_media(camera_config, media_type='picture', prefix=self.get_argument('prefix', None), callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     def frame(self, camera_id):
         camera_config = config.get_camera(camera_id)
         
@@ -825,7 +845,7 @@ class PictureHandler(BaseHandler):
                     title=self.get_argument('title', camera_config.get('@name', '')),
                     admin_username=config.get_main().get('@admin_username'))
 
-        else: # remote camera, we need to fetch remote config
+        elif utils.remote_camera(camera_config):
             def on_response(remote_ui_config=None, error=None):
                 if error:
                     return self.render('main.html',
@@ -846,7 +866,9 @@ class PictureHandler(BaseHandler):
                         admin_username=config.get_main().get('@admin_username'))
 
             remote.get_config(camera_config, on_response)
-
+        
+        else: # assuming simple mjpeg camera
+            pass # TODO implement me
 
     @BaseHandler.auth()
     def download(self, camera_id, filename):
@@ -863,7 +885,7 @@ class PictureHandler(BaseHandler):
             
             self.finish(content)
         
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(response=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to download picture from %(url)s: %(msg)s.' % {
@@ -877,6 +899,9 @@ class PictureHandler(BaseHandler):
 
             remote.get_media_content(camera_config, filename=filename, media_type='picture', callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     @BaseHandler.auth()
     def preview(self, camera_id, filename):
         logging.debug('previewing picture %(filename)s of camera %(id)s' % {
@@ -897,7 +922,7 @@ class PictureHandler(BaseHandler):
                 
             self.finish(content)
         
-        else:
+        elif utils.remote_camera(camera_config):
             def on_response(content=None, error=None):
                 if content:
                     self.set_header('Content-Type', 'image/jpeg')
@@ -912,6 +937,9 @@ class PictureHandler(BaseHandler):
                     width=self.get_argument('width', None),
                     height=self.get_argument('height', None),
                     callback=on_response)
+
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
     
     @BaseHandler.auth(admin=True)
     def delete(self, camera_id, filename):
@@ -927,7 +955,7 @@ class PictureHandler(BaseHandler):
             except Exception as e:
                 self.finish_json({'error': unicode(e)})
 
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(response=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to delete picture from %(url)s: %(msg)s.' % {
@@ -937,6 +965,9 @@ class PictureHandler(BaseHandler):
 
             remote.del_media_content(camera_config, filename=filename, media_type='picture', callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     @BaseHandler.auth()
     def zipped(self, camera_id, group):
         key = self.get_argument('key', None)
@@ -952,20 +983,15 @@ class PictureHandler(BaseHandler):
                     logging.error('prepared cache data for key "%s" does not exist' % key)
                     
                     raise HTTPError(404, 'no such key')
-    
-                camera_config = config.get_camera(camera_id)
-                if utils.local_motion_camera(camera_config):
-                    pretty_filename = camera_config['@name'] + '_' + group
-                    pretty_filename = re.sub('[^a-zA-Z0-9]', '_', pretty_filename)
+
+                pretty_filename = camera_config['@name'] + '_' + group
+                pretty_filename = re.sub('[^a-zA-Z0-9]', '_', pretty_filename)
          
-                else: # remote camera
-                    pretty_filename = re.sub('[^a-zA-Z0-9]', '_', group)
-    
                 self.set_header('Content-Type', 'application/zip')
                 self.set_header('Content-Disposition', 'attachment; filename=' + pretty_filename + '.zip;')
                 self.finish(data)
                 
-            else: # remote camera
+            elif utils.remote_camera(camera_config):
                 def on_response(response=None, error=None):
                     if error:
                         return self.finish_json({'error': 'Failed to download zip file from %(url)s: %(msg)s.' % {
@@ -977,6 +1003,9 @@ class PictureHandler(BaseHandler):
 
                 remote.get_zipped_content(camera_config, media_type='picture', key=key, group=group, callback=on_response)
 
+            else: # assuming simple mjpeg camera
+                raise HTTPError(400, 'unknown operation')
+
         else: # prepare
             logging.debug('preparing zip file for group %(group)s of camera %(id)s' % {
                     'group': group, 'id': camera_id})
@@ -993,7 +1022,7 @@ class PictureHandler(BaseHandler):
     
                 mediafiles.get_zipped_content(camera_config, media_type='picture', group=group, callback=on_zip)
     
-            else: # remote camera
+            elif utils.remote_camera(camera_config):
                 def on_response(response=None, error=None):
                     if error:
                         return self.finish_json({'error': 'Failed to make zip file at %(url)s: %(msg)s.' % {
@@ -1003,6 +1032,9 @@ class PictureHandler(BaseHandler):
 
                 remote.make_zipped_content(camera_config, media_type='picture', group=group, callback=on_response)
 
+            else: # assuming simple mjpeg camera
+                raise HTTPError(400, 'unknown operation')
+
     @BaseHandler.auth()
     def timelapse(self, camera_id, group):
         key = self.get_argument('key', None)
@@ -1020,19 +1052,14 @@ class PictureHandler(BaseHandler):
 
                     raise HTTPError(404, 'no such key')
 
-                camera_config = config.get_camera(camera_id)
-                if utils.local_motion_camera(camera_config):
-                    pretty_filename = camera_config['@name'] + '_' + group
-                    pretty_filename = re.sub('[^a-zA-Z0-9]', '_', pretty_filename)
+                pretty_filename = camera_config['@name'] + '_' + group
+                pretty_filename = re.sub('[^a-zA-Z0-9]', '_', pretty_filename)
     
-                else: # remote camera
-                    pretty_filename = re.sub('[^a-zA-Z0-9]', '_', group)
-
                 self.set_header('Content-Type', 'video/x-msvideo')
                 self.set_header('Content-Disposition', 'attachment; filename=' + pretty_filename + '.avi;')
                 self.finish(data)
 
-            else: # remote camera
+            elif utils.remote_camera(camera_config):
                 def on_response(response=None, error=None):
                     if error:
                         return self.finish_json({'error': 'Failed to download timelapse movie from %(url)s: %(msg)s.' % {
@@ -1044,6 +1071,9 @@ class PictureHandler(BaseHandler):
 
                 remote.get_timelapse_movie(camera_config, key, group=group, callback=on_response)
 
+            else: # assuming simple mjpeg camera
+                raise HTTPError(400, 'unknown operation')
+
         elif check:
             logging.debug('checking timelapse movie status for group %(group)s of camera %(id)s' % {
                     'group': group, 'id': camera_id})
@@ -1059,7 +1089,7 @@ class PictureHandler(BaseHandler):
                 else:
                     self.finish_json(status)
 
-            else: # remote camera
+            elif utils.remote_camera(camera_config):
                 def on_response(response=None, error=None):
                     if error:
                         return self.finish_json({'error': 'Failed to check timelapse movie progress at %(url)s: %(msg)s.' % {
@@ -1073,6 +1103,9 @@ class PictureHandler(BaseHandler):
 
                 remote.check_timelapse_movie(camera_config, group=group, callback=on_response)
 
+            else: # assuming simple mjpeg camera
+                raise HTTPError(400, 'unknown operation')
+
         else: # start timelapse
             interval = int(self.get_argument('interval'))
             framerate = int(self.get_argument('framerate'))
@@ -1089,7 +1122,7 @@ class PictureHandler(BaseHandler):
                     mediafiles.make_timelapse_movie(camera_config, framerate, interval, group=group)
                     self.finish_json({'progress': -1})
 
-            else: # remote camera
+            elif utils.remote_camera(camera_config):
                 def on_status(response=None, error=None):
                     if error:
                         return self.finish_json({'error': 'Failed to make timelapse movie at %(url)s: %(msg)s.' % {
@@ -1109,6 +1142,8 @@ class PictureHandler(BaseHandler):
 
                 remote.check_timelapse_movie(camera_config, group=group, callback=on_status)
 
+            else: # assuming simple mjpeg camera
+                raise HTTPError(400, 'unknown operation')
 
     @BaseHandler.auth(admin=True)
     def delete_all(self, camera_id, group):
@@ -1124,7 +1159,7 @@ class PictureHandler(BaseHandler):
             except Exception as e:
                 self.finish_json({'error': unicode(e)})
 
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(response=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to delete picture group from %(url)s: %(msg)s.' % {
@@ -1134,6 +1169,9 @@ class PictureHandler(BaseHandler):
 
             remote.del_media_group(camera_config, group=group, media_type='picture', callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     def try_finish(self, content):
         try:
             self.finish(content)
@@ -1196,7 +1234,7 @@ class MovieHandler(BaseHandler):
             mediafiles.list_media(camera_config, media_type='movie',
                     callback=on_media_list, prefix=self.get_argument('prefix', None))
         
-        else:
+        elif utils.remote_camera(camera_config):
             def on_response(remote_list=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to get movie list for %(url)s: %(msg)s.' % {
@@ -1205,7 +1243,10 @@ class MovieHandler(BaseHandler):
                 self.finish_json(remote_list)
             
             remote.list_media(camera_config, media_type='movie', prefix=self.get_argument('prefix', None), callback=on_response)
-    
+
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     @BaseHandler.auth()
     def download(self, camera_id, filename):
         logging.debug('downloading movie %(filename)s of camera %(id)s' % {
@@ -1221,7 +1262,7 @@ class MovieHandler(BaseHandler):
             
             self.finish(content)
         
-        else:
+        elif utils.remote_camera(camera_config):
             def on_response(response=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to download movie from %(url)s: %(msg)s.' % {
@@ -1235,6 +1276,9 @@ class MovieHandler(BaseHandler):
 
             remote.get_media_content(camera_config, filename=filename, media_type='movie', callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     @BaseHandler.auth()
     def preview(self, camera_id, filename):
         logging.debug('previewing movie %(filename)s of camera %(id)s' % {
@@ -1255,7 +1299,7 @@ class MovieHandler(BaseHandler):
             
             self.finish(content)
         
-        else:
+        elif utils.remote_camera(camera_config):
             def on_response(content=None, error=None):
                 if content:
                     self.set_header('Content-Type', 'image/jpeg')
@@ -1271,6 +1315,9 @@ class MovieHandler(BaseHandler):
                     height=self.get_argument('height', None),
                     callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     @BaseHandler.auth(admin=True)
     def delete(self, camera_id, filename):
         logging.debug('deleting movie %(filename)s of camera %(id)s' % {
@@ -1285,7 +1332,7 @@ class MovieHandler(BaseHandler):
             except Exception as e:
                 self.finish_json({'error': unicode(e)})
 
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(response=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to delete movie from %(url)s: %(msg)s.' % {
@@ -1295,6 +1342,9 @@ class MovieHandler(BaseHandler):
 
             remote.del_media_content(camera_config, filename=filename, media_type='movie', callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
     @BaseHandler.auth(admin=True)
     def delete_all(self, camera_id, group):
         logging.debug('deleting movie group %(group)s of camera %(id)s' % {
@@ -1309,7 +1359,7 @@ class MovieHandler(BaseHandler):
             except Exception as e:
                 self.finish_json({'error': unicode(e)})
 
-        else: # remote camera
+        elif utils.remote_camera(camera_config):
             def on_response(response=None, error=None):
                 if error:
                     return self.finish_json({'error': 'Failed to delete movie group from %(url)s: %(msg)s.' % {
@@ -1319,6 +1369,9 @@ class MovieHandler(BaseHandler):
 
             remote.del_media_group(camera_config, group=group, media_type='movie', callback=on_response)
 
+        else: # assuming simple mjpeg camera
+            raise HTTPError(400, 'unknown operation')
+
 
 class LogHandler(BaseHandler):
     LOGS = {
index 40d05aacc8de3ac2a1033e665fbfd5749a1056ff..7bf611653a5662b0f2d196594d15c41cffc1fd21 100644 (file)
@@ -2575,7 +2575,7 @@ function runAddCameraDialog() {
                     '<td colspan="100"><div class="dialog-item-separator"></div></td>' +
                 '</tr>' +
                 '<tr class="motioneye netcam mjpeg">' +
-                    '<td class="dialog-item-value" colspan="100"><div id="addCameraInfo">blah blah sdfsdf ana are mere multe verzi si vesele si mari</div></td>' +
+                    '<td class="dialog-item-value" colspan="100"><div id="addCameraInfo"></div></td>' +
                 '</tr>' +
             '</table>');
     
@@ -2639,7 +2639,7 @@ function runAddCameraDialog() {
             addCameraSelect.hide();
             addCameraInfo.html(
                     'Adding your device as a simple MJPEG camera instead of as a network camera will improve the framerate, ' +
-                    'but no motion detection or other advanced features will be available for it. ' +
+                    'but no motion detection, picture capturing or movie recording will be available for it. ' +
                     'The camera must be accessible to both your server and your browser. ' +
                     'This type of camera is not compatible with Internet Explorer.');
         }
@@ -2773,7 +2773,7 @@ function runAddCameraDialog() {
         
         deviceSelect.append('<option value="netcam">Network camera...</option>');
         deviceSelect.append('<option value="motioneye">Remote motionEye camera...</option>');
-        //deviceSelect.append('<option value="mjpeg">Simple MJPEG camera...</option>');
+        deviceSelect.append('<option value="mjpeg">Simple MJPEG camera...</option>');
         
         updateUi();