initial commit
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
from apscheduler.schedulers.background import BackgroundScheduler
|
||||
from apscheduler.triggers.interval import IntervalTrigger
|
||||
import requests
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
import re
|
||||
|
||||
scheduler = BackgroundScheduler()
|
||||
jobs = {}
|
||||
|
||||
def capture_image(project_id, ip_address, port, username, password, capture_folder):
|
||||
"""Capture an image from the camera"""
|
||||
try:
|
||||
# Build URL with optional auth
|
||||
if username and password:
|
||||
url = f"http://{username}:{password}@{ip_address}:{port}/axis-cgi/jpg/image.cgi"
|
||||
else:
|
||||
url = f"http://{ip_address}:{port}/axis-cgi/jpg/image.cgi"
|
||||
|
||||
# Create timestamped filename
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
|
||||
safe_name = re.sub(r'[^a-zA-Z0-9_-]', '_', capture_folder)
|
||||
folder_path = Path(f"captures/{safe_name}")
|
||||
folder_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
output_path = folder_path / f"{timestamp}.jpg"
|
||||
|
||||
# Fetch image
|
||||
response = requests.get(url, timeout=10)
|
||||
response.raise_for_status()
|
||||
|
||||
# Save image
|
||||
with open(output_path, 'wb') as f:
|
||||
f.write(response.content)
|
||||
|
||||
print(f"Captured image for project {project_id}: {output_path}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"Failed to capture image for project {project_id}: {e}")
|
||||
return False
|
||||
|
||||
def start_job(project_id, ip_address, port, period_minutes, username, password, capture_folder):
|
||||
"""Start a scheduled capture job"""
|
||||
# Remove existing job if any
|
||||
stop_job(project_id)
|
||||
|
||||
# Add new job
|
||||
job = scheduler.add_job(
|
||||
capture_image,
|
||||
trigger=IntervalTrigger(minutes=period_minutes),
|
||||
id=f"project_{project_id}",
|
||||
args=[project_id, ip_address, port, username, password, capture_folder],
|
||||
replace_existing=True
|
||||
)
|
||||
jobs[project_id] = job
|
||||
print(f"Started job for project {project_id} (every {period_minutes} minutes)")
|
||||
|
||||
def stop_job(project_id):
|
||||
"""Stop a scheduled capture job"""
|
||||
job_id = f"project_{project_id}"
|
||||
if scheduler.get_job(job_id):
|
||||
scheduler.remove_job(job_id)
|
||||
print(f"Stopped job for project {project_id}")
|
||||
if project_id in jobs:
|
||||
del jobs[project_id]
|
||||
|
||||
def start_all_jobs(projects):
|
||||
"""Start jobs for all active projects"""
|
||||
for p in projects:
|
||||
project_id, name, ip, port, period, username, password, created, last_capture, active = p
|
||||
start_job(project_id, ip, port, period, username, password, name)
|
||||
Reference in New Issue
Block a user