Was broken after switching to new file name sanitizing with the new file management layer, still stripped everything but ascii from the filename although timelapse file names may actually contain more than that character set since the gcode file names they are based off may too. Closes #724
100 lines
2.7 KiB
Python
100 lines
2.7 KiB
Python
# coding=utf-8
|
|
from __future__ import absolute_import
|
|
|
|
__author__ = "Gina Häußge <osd@foosel.net>"
|
|
__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
|
|
__copyright__ = "Copyright (C) 2014 The OctoPrint Project - Released under terms of the AGPLv3 License"
|
|
|
|
import os
|
|
|
|
from flask import request, jsonify, url_for
|
|
from werkzeug.utils import secure_filename
|
|
|
|
import octoprint.timelapse
|
|
import octoprint.util as util
|
|
from octoprint.settings import settings, valid_boolean_trues
|
|
|
|
from octoprint.server import admin_permission
|
|
from octoprint.server.util.flask import redirect_to_tornado, restricted_access
|
|
from octoprint.server.api import api
|
|
|
|
|
|
#~~ timelapse handling
|
|
|
|
|
|
@api.route("/timelapse", methods=["GET"])
|
|
def getTimelapseData():
|
|
timelapse = octoprint.timelapse.current
|
|
|
|
config = {"type": "off"}
|
|
if timelapse is not None and isinstance(timelapse, octoprint.timelapse.ZTimelapse):
|
|
config["type"] = "zchange"
|
|
config["postRoll"] = timelapse.postRoll()
|
|
elif timelapse is not None and isinstance(timelapse, octoprint.timelapse.TimedTimelapse):
|
|
config["type"] = "timed"
|
|
config["postRoll"] = timelapse.postRoll()
|
|
config.update({
|
|
"interval": timelapse.interval()
|
|
})
|
|
|
|
files = octoprint.timelapse.getFinishedTimelapses()
|
|
for file in files:
|
|
file["url"] = url_for("index") + "downloads/timelapse/" + file["name"]
|
|
|
|
return jsonify({
|
|
"config": config,
|
|
"files": files
|
|
})
|
|
|
|
|
|
@api.route("/timelapse/<filename>", methods=["GET"])
|
|
def downloadTimelapse(filename):
|
|
return redirect_to_tornado(request, url_for("index") + "downloads/timelapse/" + filename)
|
|
|
|
|
|
@api.route("/timelapse/<filename>", methods=["DELETE"])
|
|
@restricted_access
|
|
def deleteTimelapse(filename):
|
|
if util.isAllowedFile(filename, {"mpg"}):
|
|
timelapse_folder = settings().getBaseFolder("timelapse")
|
|
full_path = os.path.realpath(os.path.join(timelapse_folder, filename))
|
|
if full_path.startswith(timelapse_folder) and os.path.exists(full_path):
|
|
os.remove(full_path)
|
|
return getTimelapseData()
|
|
|
|
|
|
@api.route("/timelapse", methods=["POST"])
|
|
@restricted_access
|
|
def setTimelapseConfig():
|
|
if "type" in request.values:
|
|
config = {
|
|
"type": request.values["type"],
|
|
"postRoll": 0,
|
|
"options": {}
|
|
}
|
|
|
|
|
|
if "postRoll" in request.values:
|
|
try:
|
|
config["postRoll"] = int(request.values["postRoll"])
|
|
except ValueError:
|
|
pass
|
|
|
|
if "interval" in request.values:
|
|
interval = 10
|
|
try:
|
|
interval = int(request.values["interval"])
|
|
except ValueError:
|
|
pass
|
|
|
|
config["options"] = {
|
|
"interval": interval
|
|
}
|
|
|
|
if admin_permission.can() and "save" in request.values and request.values["save"] in valid_boolean_trues:
|
|
octoprint.timelapse.configureTimelapse(config, True)
|
|
else:
|
|
octoprint.timelapse.configureTimelapse(config)
|
|
|
|
return getTimelapseData()
|
|
|