mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-12-29 00:06:19 +01:00
58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
|
import logging
|
||
|
import socket
|
||
|
|
||
|
from zeroconf import (
|
||
|
ServiceInfo,
|
||
|
NonUniqueNameException,
|
||
|
InterfaceChoice,
|
||
|
IPVersion,
|
||
|
Zeroconf,
|
||
|
)
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
ZEROCONF_TYPE = "_frigate._tcp.local."
|
||
|
|
||
|
# Taken from: http://stackoverflow.com/a/11735897
|
||
|
def get_local_ip() -> str:
|
||
|
"""Try to determine the local IP address of the machine."""
|
||
|
try:
|
||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||
|
|
||
|
# Use Google Public DNS server to determine own IP
|
||
|
sock.connect(("8.8.8.8", 80))
|
||
|
|
||
|
return sock.getsockname()[0] # type: ignore
|
||
|
except OSError:
|
||
|
try:
|
||
|
return socket.gethostbyname(socket.gethostname())
|
||
|
except socket.gaierror:
|
||
|
return "127.0.0.1"
|
||
|
finally:
|
||
|
sock.close()
|
||
|
|
||
|
def broadcast_zeroconf(frigate_id):
|
||
|
zeroconf = Zeroconf(interfaces=InterfaceChoice.Default, ip_version=IPVersion.V4Only)
|
||
|
|
||
|
host_ip = get_local_ip()
|
||
|
|
||
|
try:
|
||
|
host_ip_pton = socket.inet_pton(socket.AF_INET, host_ip)
|
||
|
except OSError:
|
||
|
host_ip_pton = socket.inet_pton(socket.AF_INET6, host_ip)
|
||
|
|
||
|
info = ServiceInfo(
|
||
|
ZEROCONF_TYPE,
|
||
|
name=f"{frigate_id}.{ZEROCONF_TYPE}",
|
||
|
addresses=[host_ip_pton],
|
||
|
port=5000,
|
||
|
)
|
||
|
|
||
|
logger.info("Starting Zeroconf broadcast")
|
||
|
try:
|
||
|
zeroconf.register_service(info)
|
||
|
except NonUniqueNameException:
|
||
|
logger.error(
|
||
|
"Frigate instance with identical name present in the local network"
|
||
|
)
|
||
|
return zeroconf
|