ayla
Version:
Ayla at your service.
126 lines (98 loc) • 4.14 kB
text/coffeescript
# CAMERA API
# -----------------------------------------------------------------------------
class Camera extends (require "./baseApi.coffee")
expresser = require "expresser"
downloader = expresser.downloader
logger = expresser.logger
settings = expresser.settings
fs = require "fs"
lodash = require "lodash"
moment = require "moment"
networkApi = require "./network.coffee"
path = require "path"
# PROPERTIES
# -------------------------------------------------------------------------
# Path where camera snaps are saved.
snapsPath: null
# INIT
# -------------------------------------------------------------------------
# Init the Camera module and set snaps path.
init: =>
@snapsPath = settings.path.cameraSnaps
@baseInit()
# Start the camera API jobs.
start: =>
@baseStart()
# Stop the camera API jobs.
stop: =>
@baseStop()
# SNAPS
# -------------------------------------------------------------------------
# Save a snapshop for the specified camera.
takeSnap: (id, callback) =>
if not settings.camera?.devices?
logger.warn "Camera.takeSnap", "No camera settings were found. Abort!"
return
# Camera ID is mandatory!
if not id?
throw new Error "The camera id must be specified."
# Find camera.
id = id.id if id.id?
cam = lodash.find settings.camera.devices, {id: id}
# Wrong cam?
if not cam?
errorMsg = "Camera #{id} does not exist."
@logError "Camera.saveSnap", errorMsg
callback errorMsg
return false
# Set save options.
now = moment().format settings.camera.dateFormat
saveTo = @snapsPath + "#{id}.#{now}.jpg"
# URL remote or local?
downloadUrl = if networkApi.isHome then cam.localUrl else cam.remoteUrl
# Save (download) a snap from the camera.
downloader.download downloadUrl, saveTo, (err, result) =>
if err?
@logError "Camera.saveSnap", id, err
else
logger.info "Camera.saveSnap", id, now
callback err, result if callback?
# Remove old snaps depending on the `snapsMaxAgeDays` setting.
cleanSnaps: =>
logger.info "Camera.cleanSnaps"
fs.readdir @snapsPath, (err, files) =>
if err?
@logError "Camera.cleanSnaps", err
return false
# Iterate all camera snap files.
for f in files
do (f) =>
datePart = f.split "."
datePart = datePart[datePart.length - 2]
# Define comparions dates.
minDate = moment().subtract "d", settings.camera.snapsMaxAgeDays
fileDate = moment datePart, settings.camera.dateFormat
# If older than the target date, delete the file.
if fileDate.isBefore minDate
fs.unlink @snapsPath + f, (err) =>
@logError "Camera.cleanSnaps", f, err if err?
# JOBS
# -------------------------------------------------------------------------
# Take camera snaps every `snapsIntervalSeconds` seconds.
jobTakeSnaps: =>
if not settings.camera?.devices?
logger.warn "Camera.jobTakeSnaps", "No camera settings were found. Abort!"
return
logger.info "Camera.jobTakeSnaps"
for c in settings.camera.devices
@takeSnap c.id if c.enabled
# Clean old snaps twice a day.
jobCleanSnaps: =>
logger.info "Camera.jobCleanSnaps"
@cleanSnaps()
# Singleton implementation.
# -----------------------------------------------------------------------------
Camera.getInstance = ->
@instance = new Camera() if not @instance?
return @instance
module.exports = exports = Camera.getInstance()