12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- 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
|