mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-02 17:25:22 +03:00
Merge branch 'release-0.11.0' of https://github.com/blakeblackshear/frigate into reorder-hide-cameras
This commit is contained in:
commit
cccbee1f85
@ -5,9 +5,9 @@ services:
|
|||||||
user: vscode
|
user: vscode
|
||||||
# add groups from host for render, plugdev, video
|
# add groups from host for render, plugdev, video
|
||||||
group_add:
|
group_add:
|
||||||
- 109 # render
|
- "109" # render
|
||||||
- 44 # video
|
- "44" # video
|
||||||
- 46 # plugdev
|
- "46" # plugdev
|
||||||
shm_size: "256mb"
|
shm_size: "256mb"
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
|
|||||||
@ -38,27 +38,11 @@ RUN apt-get -qq update \
|
|||||||
RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \
|
RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \
|
||||||
&& python3 get-pip.py "pip"
|
&& python3 get-pip.py "pip"
|
||||||
|
|
||||||
RUN pip3 install scikit-build
|
COPY requirements.txt /requirements.txt
|
||||||
|
RUN pip3 install -r requirements.txt
|
||||||
|
|
||||||
# TODO: lock with requirements.txt
|
COPY requirements-wheels.txt /requirements-wheels.txt
|
||||||
RUN pip3 wheel --wheel-dir=/wheels \
|
RUN pip3 wheel --wheel-dir=/wheels -r requirements-wheels.txt
|
||||||
opencv-python-headless \
|
|
||||||
numpy \
|
|
||||||
imutils \
|
|
||||||
scipy \
|
|
||||||
psutil \
|
|
||||||
Flask \
|
|
||||||
paho-mqtt \
|
|
||||||
PyYAML \
|
|
||||||
matplotlib \
|
|
||||||
click \
|
|
||||||
setproctitle \
|
|
||||||
peewee \
|
|
||||||
peewee_migrate \
|
|
||||||
pydantic \
|
|
||||||
zeroconf \
|
|
||||||
ws4py \
|
|
||||||
requests
|
|
||||||
|
|
||||||
# Frigate Container
|
# Frigate Container
|
||||||
FROM debian:11-slim
|
FROM debian:11-slim
|
||||||
|
|||||||
@ -17,7 +17,8 @@ RUN groupadd --gid $USER_GID $USERNAME \
|
|||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y git curl vim htop
|
&& apt-get install -y git curl vim htop
|
||||||
|
|
||||||
RUN pip3 install pylint black
|
COPY requirements-dev.txt /opt/frigate/requirements-dev.txt
|
||||||
|
RUN pip3 install -r requirements-dev.txt
|
||||||
|
|
||||||
# Install Node 16
|
# Install Node 16
|
||||||
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \
|
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \
|
||||||
|
|||||||
@ -110,7 +110,8 @@ Sample response:
|
|||||||
"service": {
|
"service": {
|
||||||
/* Uptime in seconds */
|
/* Uptime in seconds */
|
||||||
"uptime": 10,
|
"uptime": 10,
|
||||||
"version": "0.8.0-8883709",
|
"version": "0.10.1-8883709",
|
||||||
|
"latest_version": "0.10.1",
|
||||||
/* Storage data in MB for important locations */
|
/* Storage data in MB for important locations */
|
||||||
"storage": {
|
"storage": {
|
||||||
"/media/frigate/clips": {
|
"/media/frigate/clips": {
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import time
|
|||||||
import psutil
|
import psutil
|
||||||
import shutil
|
import shutil
|
||||||
import os
|
import os
|
||||||
|
import requests
|
||||||
|
|
||||||
from frigate.config import FrigateConfig
|
from frigate.config import FrigateConfig
|
||||||
from frigate.const import RECORD_DIR, CLIPS_DIR, CACHE_DIR
|
from frigate.const import RECORD_DIR, CLIPS_DIR, CACHE_DIR
|
||||||
@ -13,11 +14,22 @@ from frigate.version import VERSION
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def get_latest_version() -> str:
|
||||||
|
request = requests.get('https://api.github.com/repos/blakeblackshear/frigate/releases/latest')
|
||||||
|
response = request.json()
|
||||||
|
|
||||||
|
if request.ok and response:
|
||||||
|
return response.get("tag_name", "unknown").replace("v", "")
|
||||||
|
else:
|
||||||
|
return "unknown"
|
||||||
|
|
||||||
|
|
||||||
def stats_init(camera_metrics, detectors):
|
def stats_init(camera_metrics, detectors):
|
||||||
stats_tracking = {
|
stats_tracking = {
|
||||||
"camera_metrics": camera_metrics,
|
"camera_metrics": camera_metrics,
|
||||||
"detectors": detectors,
|
"detectors": detectors,
|
||||||
"started": int(time.time()),
|
"started": int(time.time()),
|
||||||
|
"latest_frigate_version": get_latest_version(),
|
||||||
}
|
}
|
||||||
return stats_tracking
|
return stats_tracking
|
||||||
|
|
||||||
@ -83,6 +95,7 @@ def stats_snapshot(stats_tracking):
|
|||||||
stats["service"] = {
|
stats["service"] = {
|
||||||
"uptime": (int(time.time()) - stats_tracking["started"]),
|
"uptime": (int(time.time()) - stats_tracking["started"]),
|
||||||
"version": VERSION,
|
"version": VERSION,
|
||||||
|
"latest_version": stats_tracking["latest_frigate_version"],
|
||||||
"storage": {},
|
"storage": {},
|
||||||
"temperatures": get_temperatures(),
|
"temperatures": get_temperatures(),
|
||||||
}
|
}
|
||||||
|
|||||||
2
requirements-dev.txt
Normal file
2
requirements-dev.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pylint == 2.13.*
|
||||||
|
black == 22.3.*
|
||||||
17
requirements-wheels.txt
Normal file
17
requirements-wheels.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
click == 8.1.*
|
||||||
|
Flask == 2.1.*
|
||||||
|
imutils == 0.5.*
|
||||||
|
matplotlib == 3.5.*
|
||||||
|
numpy == 1.22.*
|
||||||
|
opencv-python-headless == 4.5.5.*
|
||||||
|
paho-mqtt == 1.6.*
|
||||||
|
peewee == 3.14.*
|
||||||
|
peewee_migrate == 1.4.*
|
||||||
|
psutil == 5.9.*
|
||||||
|
pydantic == 1.9.*
|
||||||
|
PyYAML == 6.0.*
|
||||||
|
requests == 2.27.*
|
||||||
|
scipy == 1.8.*
|
||||||
|
setproctitle == 1.2.*
|
||||||
|
ws4py == 0.5.*
|
||||||
|
zeroconf == 0.38.4
|
||||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
scikit-build == 0.14.1
|
||||||
@ -53,7 +53,12 @@ export default function Events({ path, ...props }) {
|
|||||||
});
|
});
|
||||||
const [uploading, setUploading] = useState([]);
|
const [uploading, setUploading] = useState([]);
|
||||||
const [viewEvent, setViewEvent] = useState();
|
const [viewEvent, setViewEvent] = useState();
|
||||||
const [downloadEvent, setDownloadEvent] = useState({ id: null, has_clip: false, has_snapshot: false });
|
const [downloadEvent, setDownloadEvent] = useState({
|
||||||
|
id: null,
|
||||||
|
has_clip: false,
|
||||||
|
has_snapshot: false,
|
||||||
|
plus_id: undefined,
|
||||||
|
});
|
||||||
|
|
||||||
const eventsFetcher = useCallback((path, params) => {
|
const eventsFetcher = useCallback((path, params) => {
|
||||||
params = { ...params, include_thumbnails: 0, limit: API_LIMIT };
|
params = { ...params, include_thumbnails: 0, limit: API_LIMIT };
|
||||||
@ -123,7 +128,12 @@ export default function Events({ path, ...props }) {
|
|||||||
|
|
||||||
const onDownloadClick = (e, event) => {
|
const onDownloadClick = (e, event) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
setDownloadEvent((_prev) => ({ id: event.id, has_clip: event.has_clip, has_snapshot: event.has_snapshot }));
|
setDownloadEvent((_prev) => ({
|
||||||
|
id: event.id,
|
||||||
|
has_clip: event.has_clip,
|
||||||
|
has_snapshot: event.has_snapshot,
|
||||||
|
plus_id: event.plus_id,
|
||||||
|
}));
|
||||||
downloadButton.current = e.target;
|
downloadButton.current = e.target;
|
||||||
setState({ ...state, showDownloadMenu: true });
|
setState({ ...state, showDownloadMenu: true });
|
||||||
};
|
};
|
||||||
@ -177,6 +187,10 @@ export default function Events({ path, ...props }) {
|
|||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (uploading.includes(id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!config.plus.enabled) {
|
if (!config.plus.enabled) {
|
||||||
setState({ ...state, showDownloadMenu: false, showPlusConfig: true });
|
setState({ ...state, showDownloadMenu: false, showPlusConfig: true });
|
||||||
return;
|
return;
|
||||||
@ -202,6 +216,10 @@ export default function Events({ path, ...props }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setUploading((prev) => prev.filter((i) => i !== id));
|
setUploading((prev) => prev.filter((i) => i !== id));
|
||||||
|
|
||||||
|
if (state.showDownloadMenu && downloadEvent.id === id) {
|
||||||
|
setState({ ...state, showDownloadMenu: false });
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!config) {
|
if (!config) {
|
||||||
@ -278,11 +296,19 @@ export default function Events({ path, ...props }) {
|
|||||||
{downloadEvent.has_snapshot && !downloadEvent.plus_id && (
|
{downloadEvent.has_snapshot && !downloadEvent.plus_id && (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
icon={UploadPlus}
|
icon={UploadPlus}
|
||||||
label="Send to Frigate+"
|
label={uploading.includes(downloadEvent.id) ? 'Uploading...' : 'Send to Frigate+'}
|
||||||
value="plus"
|
value="plus"
|
||||||
onSelect={() => onSendToPlus(downloadEvent.id)}
|
onSelect={() => onSendToPlus(downloadEvent.id)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{downloadEvent.plus_id && (
|
||||||
|
<MenuItem
|
||||||
|
icon={UploadPlus}
|
||||||
|
label={'Sent to Frigate+'}
|
||||||
|
value="plus"
|
||||||
|
onSelect={() => setState({ ...state, showDownloadMenu: false })}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</Menu>
|
</Menu>
|
||||||
)}
|
)}
|
||||||
{state.showDatePicker && (
|
{state.showDatePicker && (
|
||||||
@ -398,16 +424,20 @@ export default function Events({ path, ...props }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="hidden sm:flex flex-col justify-end mr-2">
|
<div class="hidden sm:flex flex-col justify-end mr-2">
|
||||||
{event.plus_id ? (
|
{event.has_snapshot && (
|
||||||
<div className="uppercase text-xs">Sent to Frigate+</div>
|
<Fragment>
|
||||||
) : (
|
{event.plus_id ? (
|
||||||
<Button
|
<div className="uppercase text-xs">Sent to Frigate+</div>
|
||||||
color="gray"
|
) : (
|
||||||
disabled={uploading.includes(event.id)}
|
<Button
|
||||||
onClick={(e) => onSendToPlus(event.id, e)}
|
color="gray"
|
||||||
>
|
disabled={uploading.includes(event.id)}
|
||||||
{uploading.includes(event.id) ? 'Uploading...' : 'Send to Frigate+'}
|
onClick={(e) => onSendToPlus(event.id, e)}
|
||||||
</Button>
|
>
|
||||||
|
{uploading.includes(event.id) ? 'Uploading...' : 'Send to Frigate+'}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</Fragment>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user