import mediafiles
import motionctl
import remote
+import settings
import template
import update
import v4l2ctl
camera_config = config.get_camera(camera_id)
if camera_config['@proto'] != 'v4l2':
- def on_response(response):
- camera_url = remote.make_remote_camera_url(
- camera_config.get('@host'),
- camera_config.get('@port'),
- camera_config.get('@remote_camera_id'))
-
- camera_full_url = camera_config['@proto'] + '://' + camera_url
+ def on_response(content):
+ if content:
+ self.set_header('Content-Type', 'image/jpeg')
+
+ else:
+ self.set_header('Content-Type', 'image/svg+xml')
+ content = open(os.path.join(settings.STATIC_PATH, 'img', 'no-preview.svg')).read()
- if response is None:
- return self.finish_json({'error': 'Failed to get picture preview for %(url)s.' % {
- 'url': camera_full_url}})
-
- self.set_header('Content-Type', 'image/jpeg')
- self.finish(response)
+ self.finish(content)
remote.get_media_preview(
camera_config.get('@host'),
width=self.get_argument('width', None),
height=self.get_argument('height', None))
- self.set_header('Content-Type', 'image/jpeg')
+ if content:
+ self.set_header('Content-Type', 'image/jpeg')
+
+ else:
+ self.set_header('Content-Type', 'image/svg+xml')
+ content = open(os.path.join(settings.STATIC_PATH, 'img', 'no-preview.svg')).read()
+
self.finish(content)
camera_config = config.get_camera(camera_id)
if camera_config['@proto'] != 'v4l2':
- def on_response(response):
- camera_url = remote.make_remote_camera_url(
- camera_config.get('@host'),
- camera_config.get('@port'),
- camera_config.get('@remote_camera_id'))
-
- camera_full_url = camera_config['@proto'] + '://' + camera_url
-
- if response is None:
- return self.finish_json({'error': 'Failed to get movie preview for %(url)s.' % {
- 'url': camera_full_url}})
+ def on_response(content):
+ if content:
+ self.set_header('Content-Type', 'image/jpeg')
+
+ else:
+ self.set_header('Content-Type', 'image/svg+xml')
+ content = open(os.path.join(settings.STATIC_PATH, 'img', 'no-preview.svg')).read()
- self.set_header('Content-Type', 'image/jpeg')
- self.finish(response)
+ self.finish(content)
remote.get_media_preview(
camera_config.get('@host'),
width=self.get_argument('width', None),
height=self.get_argument('height', None))
- self.set_header('Content-Type', 'image/jpeg')
+ if content:
+ self.set_header('Content-Type', 'image/jpeg')
+
+ else:
+ self.set_header('Content-Type', 'image/svg+xml')
+ content = open(os.path.join(settings.STATIC_PATH, 'img', 'no-preview.svg')).read()
+
self.finish(content)
return None
- if os.path.getsize(full_path + '.thumb') == 0:
- logging.debug('movie was too short, grabbing first frame from %(path)s...' % {'path': full_path})
+ try:
+ st = os.stat(full_path + '.thumb')
+
+ except os.error:
+ logging.error('failed to create movie preview for %(path)s: ffmpeg error' % {
+ 'path': full_path})
+
+ return None
+
+ if st.st_size == 0:
+ logging.debug('movie is too short, grabbing first frame from %(path)s...' % {'path': full_path})
# try again, this time grabbing the very first frame
try:
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ width="64"
+ height="64"
+ xml:space="preserve"
+ sodipodi:docname="no-preview.svg"
+ inkscape:export-filename="/home/ccrisan/projects/motioneye/static/img/motioneye-logo.png"
+ inkscape:export-xdpi="960"
+ inkscape:export-ydpi="960"><metadata
+ id="metadata8"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs6" /><sodipodi:namedview
+ pagecolor="#969696"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1030"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="5.0625"
+ inkscape:cx="53.237951"
+ inkscape:cy="28.106834"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g10"
+ showguides="true"
+ inkscape:guide-bbox="true" /><g
+ id="g10"
+ inkscape:groupmode="layer"
+ inkscape:label="ink_ext_XXXXXX"
+ transform="matrix(1.25,0,0,-1.25,0,64)"><g
+ id="g3757"
+ style="opacity:0.7"><rect
+ transform="scale(1,-1)"
+ y="-42.400002"
+ x="4"
+ height="34.400002"
+ width="43.200001"
+ id="rect3751"
+ style="fill:none;stroke:#ffffff;stroke-width:1.60000001999999997;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /><path
+ sodipodi:nodetypes="cccccc"
+ transform="matrix(0.8,0,0,-0.8,0,51.2)"
+ inkscape:connector-curvature="0"
+ id="path3753"
+ d="m 11.5,46.5 11,-14 6,6 11,-14 13,22 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><path
+ transform="matrix(1.0251562,0,0,-1.0251562,-4.199999,56.75)"
+ d="m 20.484682,24.142662 a 2.3411067,2.3411067 0 1 1 -4.682213,0 2.3411067,2.3411067 0 1 1 4.682213,0 z"
+ sodipodi:ry="2.3411067"
+ sodipodi:rx="2.3411067"
+ sodipodi:cy="24.142662"
+ sodipodi:cx="18.143576"
+ id="path3755"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.56073773000000005;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" /></g></g></svg>
\ No newline at end of file