예제 #1
0
    def device_info(self) -> DeviceInfo:
        """Return general device information."""
        properties = self._all_properties()

        if Protocol.MRP in self._services:
            os_type = OperatingSystem.TvOS
        elif Protocol.DMAP in self._services:
            os_type = OperatingSystem.Legacy
        else:
            os_type = OperatingSystem.Unknown

        build = properties.get("SystemBuildVersion")
        version = properties.get("osvers", lookup_version(build))

        model_name: Optional[str] = properties.get("model", None)
        if model_name:
            model = lookup_model(model_name)
        else:
            model = self._model

        mac = properties.get("macAddress", properties.get("deviceid"))
        if mac:
            mac = mac.upper()

        return DeviceInfo(os_type, version, build, model, mac)
예제 #2
0
파일: interface.py 프로젝트: postlund/pyatv
    def version(self) -> Optional[str]:
        """Operating system version."""
        if self._version:
            return self._version

        version = lookup_version(self.build_number)
        if version:
            return version

        return self._version
예제 #3
0
    def device_info(self) -> DeviceInfo:
        """Return general device information."""
        properties = self._all_properties()

        build: Optional[str] = properties.get("systembuildversion")
        version = properties.get("ov")
        if not version:
            version = properties.get("osvers", lookup_version(build))

        model_name: Optional[str] = properties.get("model",
                                                   properties.get("am"))
        if model_name:
            model = lookup_model(model_name)
        else:
            model = self._model

        # MRP devices run tvOS (as far as we know now) as well as HomePods for
        # some reason
        if Protocol.MRP in self._services or model in [
                DeviceModel.HomePod,
                DeviceModel.HomePodMini,
        ]:
            os_type = OperatingSystem.TvOS
        elif Protocol.DMAP in self._services:
            os_type = OperatingSystem.Legacy
        elif model in [
                DeviceModel.AirPortExpress, DeviceModel.AirPortExpressGen2
        ]:
            os_type = OperatingSystem.AirPortOS
        else:
            os_type = OperatingSystem.Unknown

        mac = properties.get("macaddress", properties.get("deviceid"))
        if mac:
            mac = mac.upper()

        # The waMA property comes from the _airport._tcp.local service, announced by
        # AirPort Expresses (used by the admin tool). It contains various information,
        # for instance MAC address and software version.
        wama = properties.get("wama")
        if wama:
            props: Mapping[str, str] = dict(
                cast(Tuple[str, str], prop.split("=", maxsplit=1))
                for prop in ("macaddress=" + wama).split(","))
            if not mac:
                mac = props["macaddress"].replace("-", ":").upper()
            version = props.get("syVs")

        return DeviceInfo(os_type, version, build, model, mac)
예제 #4
0
def device_info(service_type: str, properties: Mapping[str,
                                                       Any]) -> Dict[str, Any]:
    """Return device information from zeroconf properties."""
    devinfo: Dict[str, Any] = {}
    if "systembuildversion" in properties:
        devinfo[DeviceInfo.BUILD_NUMBER] = properties["systembuildversion"]

        version = lookup_version(properties["systembuildversion"])
        if version:
            devinfo[DeviceInfo.VERSION] = version
    if "macaddress" in properties:
        devinfo[DeviceInfo.MAC] = properties["macaddress"]

    # MRP has only been seen on Apple TV and HomePod, which both run tvOS,
    # so an educated guess is made here. It is border line OK, but will
    # do for now.
    devinfo[DeviceInfo.OPERATING_SYSTEM] = OperatingSystem.TvOS

    return devinfo
예제 #5
0
def test_lookup_existing_version(version, expected_version):
    assert lookup_version(version) == expected_version
예제 #6
0
def test_lookup_guess_major_version():
    assert lookup_version("16F123") == "12.x"
    assert lookup_version("17F123") == "13.x"
예제 #7
0
def test_lookup_bad_version():
    assert not lookup_version(None)
    assert not lookup_version("bad_version")
예제 #8
0
def test_lookup_existing_version():
    assert lookup_version("17J586") == "13.0"
예제 #9
0
 def test_lookup_guess_major_version(self):
     self.assertEqual(lookup_version("16F123"), "12.x")
     self.assertEqual(lookup_version("17F123"), "13.x")
예제 #10
0
 def test_lookup_bad_version(self):
     self.assertIsNone(lookup_version(None))
     self.assertIsNone(lookup_version("bad_version"))
예제 #11
0
 def test_lookup_existing_version(self):
     self.assertEqual(lookup_version("17J586"), "13.0")