mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Preview apis."""
 | |
| 
 | |
| import logging
 | |
| import os
 | |
| from datetime import datetime, timedelta, timezone
 | |
| 
 | |
| import pytz
 | |
| from fastapi import APIRouter
 | |
| from fastapi.responses import JSONResponse
 | |
| 
 | |
| from frigate.api.defs.tags import Tags
 | |
| from frigate.const import BASE_DIR, CACHE_DIR, PREVIEW_FRAME_TYPE
 | |
| from frigate.models import Previews
 | |
| 
 | |
| logger = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| router = APIRouter(tags=[Tags.preview])
 | |
| 
 | |
| 
 | |
| @router.get("/preview/{camera_name}/start/{start_ts}/end/{end_ts}")
 | |
| def preview_ts(camera_name: str, start_ts: float, end_ts: float):
 | |
|     """Get all mp4 previews relevant for time period."""
 | |
|     if camera_name != "all":
 | |
|         camera_clause = Previews.camera == camera_name
 | |
|     else:
 | |
|         camera_clause = True
 | |
| 
 | |
|     previews = (
 | |
|         Previews.select(
 | |
|             Previews.camera,
 | |
|             Previews.path,
 | |
|             Previews.duration,
 | |
|             Previews.start_time,
 | |
|             Previews.end_time,
 | |
|         )
 | |
|         .where(
 | |
|             Previews.start_time.between(start_ts, end_ts)
 | |
|             | Previews.end_time.between(start_ts, end_ts)
 | |
|             | ((start_ts > Previews.start_time) & (end_ts < Previews.end_time))
 | |
|         )
 | |
|         .where(camera_clause)
 | |
|         .order_by(Previews.start_time.asc())
 | |
|         .dicts()
 | |
|         .iterator()
 | |
|     )
 | |
| 
 | |
|     clips = []
 | |
| 
 | |
|     preview: Previews
 | |
|     for preview in previews:
 | |
|         clips.append(
 | |
|             {
 | |
|                 "camera": preview["camera"],
 | |
|                 "src": preview["path"].replace(BASE_DIR, ""),
 | |
|                 "type": "video/mp4",
 | |
|                 "start": preview["start_time"],
 | |
|                 "end": preview["end_time"],
 | |
|             }
 | |
|         )
 | |
| 
 | |
|     if not clips:
 | |
|         return JSONResponse(
 | |
|             content={
 | |
|                 "success": False,
 | |
|                 "message": "No previews found.",
 | |
|             },
 | |
|             status_code=404,
 | |
|         )
 | |
| 
 | |
|     return JSONResponse(content=clips, status_code=200)
 | |
| 
 | |
| 
 | |
| @router.get("/preview/{year_month}/{day}/{hour}/{camera_name}/{tz_name}")
 | |
| def preview_hour(year_month: str, day: int, hour: int, camera_name: str, tz_name: str):
 | |
|     """Get all mp4 previews relevant for time period given the timezone"""
 | |
|     parts = year_month.split("-")
 | |
|     start_date = (
 | |
|         datetime(int(parts[0]), int(parts[1]), int(day), int(hour), tzinfo=timezone.utc)
 | |
|         - datetime.now(pytz.timezone(tz_name.replace(",", "/"))).utcoffset()
 | |
|     )
 | |
|     end_date = start_date + timedelta(hours=1) - timedelta(milliseconds=1)
 | |
|     start_ts = start_date.timestamp()
 | |
|     end_ts = end_date.timestamp()
 | |
| 
 | |
|     return preview_ts(camera_name, start_ts, end_ts)
 | |
| 
 | |
| 
 | |
| @router.get("/preview/{camera_name}/start/{start_ts}/end/{end_ts}/frames")
 | |
| def get_preview_frames_from_cache(camera_name: str, start_ts: float, end_ts: float):
 | |
|     """Get list of cached preview frames"""
 | |
|     preview_dir = os.path.join(CACHE_DIR, "preview_frames")
 | |
|     file_start = f"preview_{camera_name}"
 | |
|     start_file = f"{file_start}-{start_ts}.{PREVIEW_FRAME_TYPE}"
 | |
|     end_file = f"{file_start}-{end_ts}.{PREVIEW_FRAME_TYPE}"
 | |
|     selected_previews = []
 | |
| 
 | |
|     for file in sorted(os.listdir(preview_dir)):
 | |
|         if not file.startswith(file_start):
 | |
|             continue
 | |
| 
 | |
|         if file < start_file:
 | |
|             continue
 | |
| 
 | |
|         if file > end_file:
 | |
|             break
 | |
| 
 | |
|         selected_previews.append(file)
 | |
| 
 | |
|     return JSONResponse(
 | |
|         content=selected_previews,
 | |
|         status_code=200,
 | |
|     )
 |