mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-03-24 17:18:23 +03:00
Various Fixes (#22594)
* Fix handling of preview * Fix schema cleaning * Cleanup
This commit is contained in:
parent
a89c7d8819
commit
a8b6ea5005
@ -1337,9 +1337,9 @@ def preview_gif(
|
|||||||
status_code=404,
|
status_code=404,
|
||||||
)
|
)
|
||||||
|
|
||||||
file_start = f"preview_{camera_name}"
|
file_start = f"preview_{camera_name}-"
|
||||||
start_file = f"{file_start}-{start_ts}.{PREVIEW_FRAME_TYPE}"
|
start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}"
|
||||||
end_file = f"{file_start}-{end_ts}.{PREVIEW_FRAME_TYPE}"
|
end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}"
|
||||||
selected_previews = []
|
selected_previews = []
|
||||||
|
|
||||||
for file in sorted(os.listdir(preview_dir)):
|
for file in sorted(os.listdir(preview_dir)):
|
||||||
@ -1519,9 +1519,9 @@ def preview_mp4(
|
|||||||
status_code=404,
|
status_code=404,
|
||||||
)
|
)
|
||||||
|
|
||||||
file_start = f"preview_{camera_name}"
|
file_start = f"preview_{camera_name}-"
|
||||||
start_file = f"{file_start}-{start_ts}.{PREVIEW_FRAME_TYPE}"
|
start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}"
|
||||||
end_file = f"{file_start}-{end_ts}.{PREVIEW_FRAME_TYPE}"
|
end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}"
|
||||||
selected_previews = []
|
selected_previews = []
|
||||||
|
|
||||||
for file in sorted(os.listdir(preview_dir)):
|
for file in sorted(os.listdir(preview_dir)):
|
||||||
|
|||||||
@ -145,9 +145,9 @@ def preview_hour(
|
|||||||
def get_preview_frames_from_cache(camera_name: str, start_ts: float, end_ts: float):
|
def get_preview_frames_from_cache(camera_name: str, start_ts: float, end_ts: float):
|
||||||
"""Get list of cached preview frames"""
|
"""Get list of cached preview frames"""
|
||||||
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
||||||
file_start = f"preview_{camera_name}"
|
file_start = f"preview_{camera_name}-"
|
||||||
start_file = f"{file_start}-{start_ts}.{PREVIEW_FRAME_TYPE}"
|
start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}"
|
||||||
end_file = f"{file_start}-{end_ts}.{PREVIEW_FRAME_TYPE}"
|
end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}"
|
||||||
selected_previews = []
|
selected_previews = []
|
||||||
|
|
||||||
for file in sorted(os.listdir(preview_dir)):
|
for file in sorted(os.listdir(preview_dir)):
|
||||||
|
|||||||
@ -324,9 +324,9 @@ class ReviewDescriptionProcessor(PostProcessorApi):
|
|||||||
end_time: float,
|
end_time: float,
|
||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
||||||
file_start = f"preview_{camera}"
|
file_start = f"preview_{camera}-"
|
||||||
start_file = f"{file_start}-{start_time}.webp"
|
start_file = f"{file_start}{start_time}.webp"
|
||||||
end_file = f"{file_start}-{end_time}.webp"
|
end_file = f"{file_start}{end_time}.webp"
|
||||||
all_frames = []
|
all_frames = []
|
||||||
|
|
||||||
for file in sorted(os.listdir(preview_dir)):
|
for file in sorted(os.listdir(preview_dir)):
|
||||||
|
|||||||
@ -54,12 +54,16 @@ class OllamaClient(GenAIClient):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _clean_schema_for_ollama(schema: dict) -> dict:
|
def _clean_schema_for_ollama(schema: dict, *, _is_properties: bool = False) -> dict:
|
||||||
"""Strip Pydantic metadata from a JSON schema for Ollama compatibility.
|
"""Strip Pydantic metadata from a JSON schema for Ollama compatibility.
|
||||||
|
|
||||||
Ollama's grammar-based constrained generation works best with minimal
|
Ollama's grammar-based constrained generation works best with minimal
|
||||||
schemas. Pydantic adds title/description/constraint fields that can
|
schemas. Pydantic adds title/description/constraint fields that can
|
||||||
cause the grammar generator to silently skip required fields.
|
cause the grammar generator to silently skip required fields.
|
||||||
|
|
||||||
|
Keys inside a ``properties`` dict are actual field names and must never
|
||||||
|
be stripped, even if they collide with a metadata key name (e.g. a
|
||||||
|
model field called ``title``).
|
||||||
"""
|
"""
|
||||||
STRIP_KEYS = {
|
STRIP_KEYS = {
|
||||||
"title",
|
"title",
|
||||||
@ -71,10 +75,12 @@ class OllamaClient(GenAIClient):
|
|||||||
}
|
}
|
||||||
result = {}
|
result = {}
|
||||||
for key, value in schema.items():
|
for key, value in schema.items():
|
||||||
if key in STRIP_KEYS:
|
if not _is_properties and key in STRIP_KEYS:
|
||||||
continue
|
continue
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
result[key] = OllamaClient._clean_schema_for_ollama(value)
|
result[key] = OllamaClient._clean_schema_for_ollama(
|
||||||
|
value, _is_properties=(key == "properties")
|
||||||
|
)
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list):
|
||||||
result[key] = [
|
result[key] = [
|
||||||
OllamaClient._clean_schema_for_ollama(item)
|
OllamaClient._clean_schema_for_ollama(item)
|
||||||
|
|||||||
@ -266,8 +266,8 @@ class PreviewRecorder:
|
|||||||
.timestamp()
|
.timestamp()
|
||||||
)
|
)
|
||||||
|
|
||||||
file_start = f"preview_{config.name}"
|
file_start = f"preview_{config.name}-"
|
||||||
start_file = f"{file_start}-{start_ts}.webp"
|
start_file = f"{file_start}{start_ts}.webp"
|
||||||
|
|
||||||
for file in sorted(os.listdir(os.path.join(CACHE_DIR, FOLDER_PREVIEW_FRAMES))):
|
for file in sorted(os.listdir(os.path.join(CACHE_DIR, FOLDER_PREVIEW_FRAMES))):
|
||||||
if not file.startswith(file_start):
|
if not file.startswith(file_start):
|
||||||
|
|||||||
@ -156,9 +156,9 @@ class RecordingExporter(threading.Thread):
|
|||||||
else:
|
else:
|
||||||
# need to generate from existing images
|
# need to generate from existing images
|
||||||
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
||||||
file_start = f"preview_{self.camera}"
|
file_start = f"preview_{self.camera}-"
|
||||||
start_file = f"{file_start}-{self.start_time}.{PREVIEW_FRAME_TYPE}"
|
start_file = f"{file_start}{self.start_time}.{PREVIEW_FRAME_TYPE}"
|
||||||
end_file = f"{file_start}-{self.end_time}.{PREVIEW_FRAME_TYPE}"
|
end_file = f"{file_start}{self.end_time}.{PREVIEW_FRAME_TYPE}"
|
||||||
selected_preview = None
|
selected_preview = None
|
||||||
|
|
||||||
for file in sorted(os.listdir(preview_dir)):
|
for file in sorted(os.listdir(preview_dir)):
|
||||||
@ -264,9 +264,9 @@ class RecordingExporter(threading.Thread):
|
|||||||
if is_current_hour(self.start_time):
|
if is_current_hour(self.start_time):
|
||||||
# get list of current preview frames
|
# get list of current preview frames
|
||||||
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
||||||
file_start = f"preview_{self.camera}"
|
file_start = f"preview_{self.camera}-"
|
||||||
start_file = f"{file_start}-{self.start_time}.{PREVIEW_FRAME_TYPE}"
|
start_file = f"{file_start}{self.start_time}.{PREVIEW_FRAME_TYPE}"
|
||||||
end_file = f"{file_start}-{self.end_time}.{PREVIEW_FRAME_TYPE}"
|
end_file = f"{file_start}{self.end_time}.{PREVIEW_FRAME_TYPE}"
|
||||||
|
|
||||||
for file in sorted(os.listdir(preview_dir)):
|
for file in sorted(os.listdir(preview_dir)):
|
||||||
if not file.startswith(file_start):
|
if not file.startswith(file_start):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user