| 605 | |
| 606 | |
| 607 | def extract_device_name(service_info, vendor="", extra_info=None): |
| 608 | extra_info = extra_info or {} |
| 609 | search_text = service_info or "" |
| 610 | patterns = [ |
| 611 | r"http-title:\s*([^|]+)", |
| 612 | r"Server:\s*([^|]+)", |
| 613 | r"ssl-cert:\s*subject=.*?commonName=([^/|]+)", |
| 614 | ] |
| 615 | for pattern in patterns: |
| 616 | match = re.search(pattern, search_text, re.IGNORECASE) |
| 617 | if match: |
| 618 | return match.group(1).strip() |
| 619 | |
| 620 | for key in ("hostname", "mdns_name"): |
| 621 | if extra_info.get(key): |
| 622 | return extra_info[key] |
| 623 | |
| 624 | upnp = extra_info.get("upnp", {}) |
| 625 | if upnp.get("server"): |
| 626 | return upnp["server"][:80] |
| 627 | |
| 628 | snmp = extra_info.get("snmp", {}) |
| 629 | if snmp.get("sysname"): |
| 630 | return snmp["sysname"] |
| 631 | |
| 632 | if vendor: |
| 633 | return vendor |
| 634 | return "" |
| 635 | |
| 636 | |
| 637 | |