76 lines
2 KiB
Python
76 lines
2 KiB
Python
__all__ = ["Resolver"]
|
|
|
|
from operator import attrgetter
|
|
|
|
import ua_parser_rs # type: ignore
|
|
|
|
from .core import (
|
|
Device,
|
|
Domain,
|
|
Matchers,
|
|
OS,
|
|
PartialResult,
|
|
UserAgent,
|
|
)
|
|
|
|
|
|
class Resolver:
|
|
ua: ua_parser_rs.UserAgentExtractor
|
|
os: ua_parser_rs.OSExtractor
|
|
de: ua_parser_rs.DeviceExtractor
|
|
|
|
def __init__(self, matchers: Matchers) -> None:
|
|
ua, os, de = matchers
|
|
self.ua = ua_parser_rs.UserAgentExtractor(
|
|
map(
|
|
attrgetter("regex", "family", "major", "minor", "patch", "patch_minor"),
|
|
ua,
|
|
)
|
|
)
|
|
self.os = ua_parser_rs.OSExtractor(
|
|
map(
|
|
attrgetter("regex", "family", "major", "minor", "patch", "patch_minor"),
|
|
os,
|
|
)
|
|
)
|
|
self.de = ua_parser_rs.DeviceExtractor(
|
|
map(
|
|
attrgetter("regex", "regex_flag", "family", "brand", "model"),
|
|
de,
|
|
)
|
|
)
|
|
|
|
def __call__(self, ua: str, domains: Domain, /) -> PartialResult:
|
|
user_agent = os = device = None
|
|
if Domain.USER_AGENT in domains:
|
|
if uam := self.ua.extract(ua):
|
|
user_agent = UserAgent(
|
|
uam.family,
|
|
uam.major,
|
|
uam.minor,
|
|
uam.patch,
|
|
uam.patch_minor,
|
|
)
|
|
if Domain.OS in domains:
|
|
if osm := self.os.extract(ua):
|
|
os = OS(
|
|
osm.family,
|
|
osm.major,
|
|
osm.minor,
|
|
osm.patch,
|
|
osm.patch_minor,
|
|
)
|
|
if Domain.DEVICE in domains:
|
|
if dem := self.de.extract(ua):
|
|
device = Device(
|
|
dem.family,
|
|
dem.brand,
|
|
dem.model,
|
|
)
|
|
return PartialResult(
|
|
domains=domains,
|
|
string=ua,
|
|
user_agent=user_agent,
|
|
os=os,
|
|
device=device,
|
|
)
|