diff --git a/frigate/http.py b/frigate/http.py index 1df1d5fcd..99b981b2f 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -565,6 +565,7 @@ def events(): has_clip = request.args.get("has_clip", type=int) has_snapshot = request.args.get("has_snapshot", type=int) include_thumbnails = request.args.get("include_thumbnails", default=1, type=int) + favorites = request.args.get("favorites", type=int) clauses = [] excluded_fields = [] @@ -635,6 +636,9 @@ def events(): else: selected_columns.append(Event.thumbnail) + if favorites: + clauses.append((Event.retain_indefinitely == favorites)) + if len(clauses) == 0: clauses.append((True)) diff --git a/web/src/routes/Events.jsx b/web/src/routes/Events.jsx index e8807411e..c37a1b2f5 100644 --- a/web/src/routes/Events.jsx +++ b/web/src/routes/Events.jsx @@ -58,6 +58,7 @@ export default function Events({ path, ...props }) { labels: props.labels ?? 'all', zones: props.zones ?? 'all', sub_labels: props.sub_labels ?? 'all', + favorites: props.favorites ?? 0, }); const [state, setState] = useState({ showDownloadMenu: false, @@ -334,7 +335,14 @@ export default function Events({ path, ...props }) { onSelectSingle={(item) => onFilter("sub_labels", item)} /> )} -
+ + onFilter("favorites", searchParams.favorites ? 0 : 1)} + fill={searchParams.favorites == 1 ? 'currentColor' : 'none'} + /> + +
setState({ ...state, showDatePicker: true })}