# ssdp_discover.py - hoi "ai la thiet bi UPnP o day?" bang goi UDP multicast. TV, router, may in thuong tra loi.
# Chi chay tren mang cua ban. Mat khoang 4 giay.
import socket
import time

MESSAGE = ("M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\n"
           'MAN: "ssdp:discover"\r\nMX: 2\r\nST: ssdp:all\r\n\r\n').encode()

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
    s.settimeout(1)
    s.sendto(MESSAGE, ("239.255.255.250", 1900))
    seen = {}
    deadline = time.time() + 4
    while time.time() < deadline:
        try:
            data, addr = s.recvfrom(4096)
        except socket.timeout:
            continue
        headers = {}
        for line in data.decode("utf-8", errors="replace").splitlines()[1:]:
            key, _, value = line.partition(":")
            headers[key.strip().upper()] = value.strip()
        seen.setdefault(addr[0], headers)

for ip, h in sorted(seen.items()):
    print(f"{ip:<16} SERVER={h.get('SERVER', '?')}")
    print(f"{'':<16} LOCATION={h.get('LOCATION', '?')}")
print(f"\nCo {len(seen)} thiet bi tra loi SSDP (thiet bi khong ho tro UPnP se im lang).")
