mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-15 14:42:16 +03:00
Compare commits
172 Commits
2.0.0-rc.3
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a5b321347 | ||
|
|
e9f78ceb80 | ||
|
|
38301f8803 | ||
|
|
e5648826b9 | ||
|
|
a558cc1a5b | ||
|
|
cb9b50a81a | ||
|
|
042c57cc10 | ||
|
|
232fb321f1 | ||
|
|
a3a7a5e377 | ||
|
|
2d8c8fa142 | ||
|
|
d84ba1888b | ||
|
|
061cf0e90f | ||
|
|
2882014f0e | ||
|
|
3eea0643c5 | ||
|
|
5f1ed83225 | ||
|
|
5349bb52ed | ||
|
|
9ba4d2b207 | ||
|
|
4c935c0139 | ||
|
|
ae7b5e15e5 | ||
|
|
44165a6e01 | ||
|
|
fc5125042c | ||
|
|
4e6259ad7f | ||
|
|
b3bc89c463 | ||
|
|
5749302c47 | ||
|
|
6565d24567 | ||
|
|
b3281b7c12 | ||
|
|
bd6bb216bd | ||
|
|
e7e7aaad4c | ||
|
|
95d2b151a3 | ||
|
|
737cdd4d40 | ||
|
|
74064b0cac | ||
|
|
3ea5721e86 | ||
|
|
a4342b01d4 | ||
|
|
31bf36c36d | ||
|
|
9bef871e41 | ||
|
|
b1d9dcafcd | ||
|
|
146f182533 | ||
|
|
ce242a362f | ||
|
|
2078b1ec92 | ||
|
|
7dcbb8def3 | ||
|
|
f810a6d1d9 | ||
|
|
0e05332609 | ||
|
|
48a1f34c28 | ||
|
|
fb1ed5cf6b | ||
|
|
3e65196b57 | ||
|
|
4e421e72fe | ||
|
|
98cf19c8c5 | ||
|
|
c9badeb345 | ||
|
|
9003fe5724 | ||
|
|
975c4860f4 | ||
|
|
647b6232bd | ||
|
|
95485f7b5d | ||
|
|
74ef71cf63 | ||
|
|
9e6dff6dc3 | ||
|
|
bf5155ec8a | ||
|
|
ecbc0336b6 | ||
|
|
ab299a23b7 | ||
|
|
3fe137e533 | ||
|
|
0bb6e24837 | ||
|
|
a19977ce4c | ||
|
|
088383b9bd | ||
|
|
c9d008e97a | ||
|
|
86b3cd37e2 | ||
|
|
a9378427ed | ||
|
|
f9836f1981 | ||
|
|
f300478bdc | ||
|
|
ee88f16620 | ||
|
|
d28d74fea7 | ||
|
|
1282175bac | ||
|
|
e312298283 | ||
|
|
5e7d0b25a3 | ||
|
|
5f1e498bec | ||
|
|
72d0c2acb3 | ||
|
|
a3549efc22 | ||
|
|
29677bcd3d | ||
|
|
64a933bae8 | ||
|
|
f51ed79118 | ||
|
|
72c59b5351 | ||
|
|
466a8b26be | ||
|
|
3d6e326f49 | ||
|
|
be16c04a33 | ||
|
|
6a2a3a61b6 | ||
|
|
14a51039aa | ||
|
|
944c1fb260 | ||
|
|
b9a710978e | ||
|
|
e069133f51 | ||
|
|
848cd1d1e4 | ||
|
|
e1216ff36b | ||
|
|
598c51c69c | ||
|
|
8ae88b6aa5 | ||
|
|
cd3bef7405 | ||
|
|
af8acf9078 | ||
|
|
6a41513df4 | ||
|
|
f93cb043f5 | ||
|
|
c6f8ba3788 | ||
|
|
f7f64a31ea | ||
|
|
8f545f9e3f | ||
|
|
2d26eada9a | ||
|
|
30c0b20c20 | ||
|
|
0cf44773b1 | ||
|
|
367eae4c85 | ||
|
|
a9b31c0f7b | ||
|
|
8a05328ce0 | ||
|
|
baeac63ebe | ||
|
|
3d41647a55 | ||
|
|
d1105ce4b3 | ||
|
|
3fccce26d0 | ||
|
|
178e678b15 | ||
|
|
056e66f6a0 | ||
|
|
d8057bcd8a | ||
|
|
837d319630 | ||
|
|
6f0191c11b | ||
|
|
5413a9888d | ||
|
|
4ea03a587d | ||
|
|
98e0708f25 | ||
|
|
51dce55e65 | ||
|
|
3ca23193dd | ||
|
|
9e64f34e72 | ||
|
|
10ab810568 | ||
|
|
e8a301265a | ||
|
|
20e874085b | ||
|
|
852520fafe | ||
|
|
6c6ff97e0c | ||
|
|
93552e0172 | ||
|
|
13d069f1c4 | ||
|
|
9cdf560e60 | ||
|
|
de871b3d37 | ||
|
|
4601953326 | ||
|
|
594b6b1399 | ||
|
|
5d603dacd7 | ||
|
|
84b41f5be7 | ||
|
|
f854f26cd6 | ||
|
|
bb1daf4e13 | ||
|
|
592bfdd33c | ||
|
|
d024fe2006 | ||
|
|
d4986af7c0 | ||
|
|
fbadfd7ace | ||
|
|
259cd1422b | ||
|
|
aed89f0b41 | ||
|
|
48c221b50b | ||
|
|
dbd24a579f | ||
|
|
fc851b40c5 | ||
|
|
b2fc76fe99 | ||
|
|
e013038643 | ||
|
|
1a057b4be2 | ||
|
|
aa56b2f4f3 | ||
|
|
20e195de8b | ||
|
|
c37f3863c0 | ||
|
|
60cc84d58c | ||
|
|
f5ee90fcf8 | ||
|
|
bcf249da06 | ||
|
|
b4bc86ac6d | ||
|
|
a1d81c928c | ||
|
|
94d3d84cd5 | ||
|
|
c72198d470 | ||
|
|
c8ece08b1b | ||
|
|
4ddbeeaa06 | ||
|
|
536031d789 | ||
|
|
4c57a5a567 | ||
|
|
29b76368fd | ||
|
|
41de949809 | ||
|
|
5742ba68ae | ||
|
|
8174330d27 | ||
|
|
d1f691fbc7 | ||
|
|
38baf844fc | ||
|
|
70b3003344 | ||
|
|
5b375b90d5 | ||
|
|
b1c7dfcc3a | ||
|
|
2b125c8de4 | ||
|
|
2181559b01 | ||
|
|
14caf6d204 | ||
|
|
4a12562946 |
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,6 +1,6 @@
|
||||
# Prerequisites
|
||||
|
||||
- [ ] I have read and follow the contributing guidelines
|
||||
- [ ] I have read and follow the [contributing](https://github.com/faisalman/ua-parser-js/blob/master/CONTRIBUTING.md) guidelines
|
||||
- [ ] I have read and accept the [Contributor License Agreement (CLA)](https://gist.github.com/faisalman/2ed16621ebb544157eba85a7f7381417) Document and I hereby sign the CLA
|
||||
|
||||
# Type of Change
|
||||
|
||||
15
.github/workflows/test-ci.yml
vendored
15
.github/workflows/test-ci.yml
vendored
@@ -10,14 +10,19 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [amd64, ppc64le]
|
||||
arch: [amd64]
|
||||
node-version: ['22.13', 'lts/*']
|
||||
include:
|
||||
- arch: ppc64le
|
||||
node-version: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Run the test
|
||||
run: |
|
||||
echo "Running on ubuntu-latest-${{ matrix.arch }} with node version set as ${{ matrix.node-version }}"
|
||||
npm ci
|
||||
npx playwright install
|
||||
npx playwright install --with-deps
|
||||
npm test
|
||||
|
||||
168
CHANGELOG.md
168
CHANGELOG.md
@@ -23,8 +23,12 @@
|
||||
- **Support for Custom/Predefined Extensions:**
|
||||
- Pass custom regexes or predefined extensions as a list to `UAParser()`
|
||||
|
||||
- **Support for CLI Parsing:**
|
||||
- Parse a user-agent directly from the command line using `npx ua-parser-js "[User-Agent]"`
|
||||
- **Support for CLI Processing:**
|
||||
- Directly parse user-agent strings from the command line:
|
||||
`npx ua-parser-js "<User-Agent>"`
|
||||
- Process batch data from files:
|
||||
`npx ua-parser-js --input-file=log.txt >> result.json` or
|
||||
`npx ua-parser-js --input-file=log.txt --output-file=result.json`
|
||||
|
||||
- **Enhanced Detection with Client Hints:**
|
||||
- `withClientHints()`: Improves detection accuracy by leveraging client hints
|
||||
@@ -55,7 +59,8 @@
|
||||
- **`'ua-parser-js/helpers'`**: Provides utility methods to extend detection functionality:
|
||||
- `getDeviceVendor()`: Guesses the device vendor based on its model name
|
||||
- `isAppleSilicon()`: Detects Apple Silicon device properties
|
||||
- `isBot()`: Checks if the browser is a bot
|
||||
- `isAIBot()`: Checks if the user-agent is an AI bot
|
||||
- `isBot()`: Checks if the user-agent is a bot
|
||||
- `isChromeFamily()`: Checks if the browser is Chrome-based (uses Blink engine) — e.g., New Opera, New Edge, Vivaldi, Brave, Arc, etc.
|
||||
- `isElectron()`: Detects if current window is running within Electron
|
||||
- `isFromEU()`: Detects if current browser's timezone is from an EU country
|
||||
@@ -64,6 +69,134 @@
|
||||
|
||||
---
|
||||
|
||||
## Version 2.0.6
|
||||
- Add new CLI feature: processing batch user-agent data from file and output as JSON
|
||||
- Fix `setUA()`: trim leading space from user-agent string input
|
||||
- Replace `undici` dependency with node's internal `Headers`
|
||||
- Add new browser: Bing, Qwant
|
||||
- Add new device vendor: Hisense, Wiko
|
||||
- Improve browser detection: Mozilla, Pale Moon
|
||||
- Improve CPU detection: 68k
|
||||
- Improve device detection: Apple, BlackBerry, Huawei, Nokia, Xiaomi
|
||||
- Improve OS detection: iOS 26
|
||||
- `extensions` submodule:
|
||||
- Add new fetcher: Discordbot, KeybaseBot, Slackbot, Slackbot-LinkExpanding, Slack-ImgProxy, Twitterbot
|
||||
- Add new crawler: Qwantbot-news, SurdotlyBot, SwiftBot
|
||||
|
||||
## Version 2.0.5
|
||||
|
||||
- Add new browser: Zalo
|
||||
- Add new CPU arch: alpha
|
||||
- Add new device vendor: Philips
|
||||
- Improve device detection: Pico
|
||||
- Fix parsing error on pages with modified Array prototypes
|
||||
- Improve type declarations:
|
||||
- Replace `node-fetch` dependency with `undici`
|
||||
- Replace hardcoded string values with enum from `enum` submodule
|
||||
- `enums` submodule:
|
||||
- Add `Extension` enum for `extensions` submodule
|
||||
- Type declaration file now automatically generated using build script
|
||||
- Naming adjustments:
|
||||
- `Browser` => `BrowserName`
|
||||
- `CPU` => `CPUArch`
|
||||
- `Device` => `DeviceType`
|
||||
- `Vendor` => `DeviceVendor`
|
||||
- `Engine` => `EngineName`
|
||||
- `OS` => `OSName`
|
||||
- `extensions` submodule:
|
||||
- Add new crawlers:
|
||||
APIs-Google, Algolia Crawler, Algolia Crawler Renderscript, Baidu-ADS, BLEXBot, botify, Bravebot, Claude-Web, cohere-training-data-crawler, contxbot, Cotoyogi, Coveobot, CriteoBot, DeepSeekBot, DuckDuckGo-Favicons-Bot, Elastic, FirecrawlAgent, Freespoke, Google-CloudVertexBot, HuggingFace-Bot, Kagibot, Kangaroo Bot, marginalia, msnbot, OnCrawl, Replicate-Bot, RunPod-Bot, SBIntuitionsBot, SeekportBot, Siteimprove, Sogou Pic Spider, TikTokSpider, TwinAgent, v0bot, webzio, Webzio-Extended, xAI-Bot, YandexAccessibilityBot, YandexAdditionalBot, YandexAdNet, YandexBot MirrorDetector, YandexBlogs, YandexComBot, YandexFavicons, YandexImageResizer, YandexImages, YandexMarket, YandexMetrika, YandexMedia, YandexMobileBot, YandexMobileScreenShotBot, YandexNews, YandexOntoDB, YandexOntoDBAPI, YandexPartner, YandexRCA, YandexRenderResourcesBot, YandexScreenshotBot, YandexSpravBot, YandexTracker, YandexVertis, YandexVerticals, YandexVideo, YandexVideoParser, YandexWebmaster, YepBot, ZumBot
|
||||
- Add new fetchers:
|
||||
Asana, bitlybot, Blueno, BufferLinkPreviewBot, Chrome-Lighthouse, Gemini-Deep-Research, HubSpot Page Fetcher, kakaotalk-scrap, vercel-favicon-bot, vercel-screenshot-bot, vercelflags, verceltracing, YaDirectFetcher, YandexCalendar, YandexDirect, YandexDirectDyn, YandexForDomain, YandexPagechecker, YandexSearchShop, YandexSitelinks, YandexUserproxy
|
||||
- `helpers` submodule:
|
||||
- Add some crawler to `isAIBot()`:
|
||||
Bravebot, cohere-training-data-crawler, FirecrawlAgent, HuggingFace-Bot, Kangaroo Bot, PanguBot, Replicate-Bot, RunPod-Bot, TikTokSpider, Together-Bot, v0bot, xAI-Bot
|
||||
|
||||
## Version 2.0.4
|
||||
|
||||
- Add new browser: Edge WebView, Edge WebView2
|
||||
- Add new device vendor: Lava, Retroid, Vizio
|
||||
- Add new OS: ArcaOS, Knoppix, Xubuntu, Windows CE, Windows RT
|
||||
- Improve device detection: Google Pixel & Pixelbook Series, HMD, Infinix, LG WebOS TV, Motorola, Nothing, OnePlus, Sony, Tecno
|
||||
- Improve OS detection: AIX, Arch, Fuchsia, Haiku, HarmonyOS, Mint, MorphOS, Solaris, Windows
|
||||
- Improve `withClientHints()` browser naming adjustments: `Microsoft Edge WebView2` => `Edge WebView2`
|
||||
- Identify device that uses Firefox Reality / Wolvic as `xr`
|
||||
- Identify device with large screen as `smarttv`
|
||||
- Identify Windows CE & Windows RT as distinct OS variants
|
||||
- `extensions` submodule:
|
||||
- Remove lookbehind assertion to ensure regex compatibility
|
||||
- Add new crawlers: ChatGLM, Daum, iAskBot, Onespot, Qwantbot, Startpage
|
||||
- Add new emails: Apple's Mail, DaumMail, Polymail, ProtonMail, SparkDesktop, Zimbra, ZohoMail-Desktop
|
||||
- Add new fetchers: Iframely, MistralAI-User, Perplexity-User
|
||||
- Add new inApps: Discord, Evernote, Figma, Flipboard, Mattermost, Notion, Postman, Rambox, Rocket.Chat, Microsoft Teams, TikTok Lite, VS Code
|
||||
- Add new libraries: AdobeAIR, aiohttp, nutch, httpx, urllib3
|
||||
- `enum` submodule:
|
||||
- Fix mistakenly placed `BLU` categorized as browser name instead of device vendor
|
||||
|
||||
## Version 2.0.3
|
||||
|
||||
- Add new browser: Dooble, Ecosia, LG Browser, Otter, qutebrowser, Surf
|
||||
- Add new device: BLU, Facebook Portal TV
|
||||
- Improve device detection: Archos, LG, Meta Quest
|
||||
- Remove jazzer.js fuzz test
|
||||
- Improve `withClientHints()`:
|
||||
- Browser naming adjustments:
|
||||
- `HuaweiBrowser` => `Huawei Browser`
|
||||
- `Miui Browser` => `MIUI Browser`
|
||||
- `OperaMobile` => `Opera Mobi`
|
||||
- `YaBrowser` => `Yandex`
|
||||
- `extensions` submodule:
|
||||
- Add new Crawler: AdIdxBot, Linespider, LinkedInBot, OpenAI Image Downloader, SemrushBot, Yahoo! Slurp
|
||||
- Add new Fetcher: Better Uptime Bot, Google-PageRenderer, GoogleImageProxy, MicrosoftPreview, Snap URL Preview, SkypeUriPreview, TelegramBot
|
||||
- Add new Vehicles: BMW, Jeep
|
||||
- Add OS detection of WhatsApp user-agent
|
||||
|
||||
## Version 2.0.2
|
||||
|
||||
- Fix TypeScript dependency issue
|
||||
|
||||
## Version 2.0.1
|
||||
|
||||
- Add new browser: Ladybird, Daum
|
||||
- Add new device: Apple HomePod
|
||||
- Add new device vendor: HMD
|
||||
- Add new OS: Ubuntu Touch, Windows IoT
|
||||
- Improve CPU detection: ARM, x86
|
||||
- Improve device detection: Lenovo, Nokia, Nvidia, Xiaomi
|
||||
- Tablet: Google, Honor, Huawei, Infinix, Nokia, OnePlus, Xiaomi
|
||||
- Wearable: Asus, Google, LG, Motorola, OnePlus, Oppo, Samsung, Sony
|
||||
- Smart-TV: Xiaomi, unidentified vendors
|
||||
- Improve detection for unknown VR devices
|
||||
- Improve device model detection for Generic devices
|
||||
- Improve OS detection: Linux, Symbian
|
||||
- Improve TypeScript definitions for Headers
|
||||
- Improve `withClientHints()`:
|
||||
- `engine.version` also get updated
|
||||
- Infer `device.vendor` & `device.type` by guessing from `device.model`
|
||||
- Browser naming adjustments:
|
||||
- `Google Chrome` => `Chrome`
|
||||
- `Microsoft Edge` => `Edge`
|
||||
- `Android WebView` => `Chrome WebView`
|
||||
- `HeadlessChrome` => `Chrome Headless`
|
||||
- `enums` submodule:
|
||||
- Add TypeScript definitions
|
||||
- `extensions` submodule:
|
||||
- Add new list:
|
||||
- `Vehicles`: BYD, Rivian, Volvo
|
||||
- Add new Fetcher: Bluesky
|
||||
- Add new Library: Apache-HttpClient, go-http-client, got, GuzzleHttp, Java-http-client, libwww-perl, lua-resty-http, Needle, OkHttp, node-fetch, PHP-SOAP, PostmanRuntime, superagent
|
||||
|
||||
## Version 2.0.0
|
||||
|
||||
- `ua-parser-js/extensions` submodule:
|
||||
- Add new CLI: ELinks, HTTPie
|
||||
- Add new crawler: AI2Bot, aiHitBot, anthropic-ai, Diffbot, ImagesiftBot, magpie-crawler, Omgilibot, Screaming Frog SEO Spider, Seznambot, Teoma, Timpibot, VelenPublicWebCrawler, Webzio-Extended, YouBot
|
||||
- Add new email: Airmail, BlueMail, eMClient, NaverMailApp, Sparrow, Yahoo
|
||||
- Add new fetcher: cohere-ai, Vercelbot
|
||||
- Add new library: java, python-urllib, python-requests
|
||||
- `ua-parser-js/helpers` submodule:
|
||||
- Add new method `isAIBot()`: Checks if the user-agent is an AI bot
|
||||
|
||||
## Version 2.0.0-rc.3
|
||||
|
||||
- Add support for Headers object
|
||||
@@ -154,6 +287,33 @@
|
||||
|
||||
---
|
||||
|
||||
## Version 0.7.41 / 1.0.41
|
||||
- Add new browser: Daum, Ladybird
|
||||
- Add new device vendor: HMD
|
||||
- Add new engine: LibWeb
|
||||
- Add new os: Windows IoT, Ubuntu Touch
|
||||
- Improve cpu detection: ARM, x86
|
||||
- Improve device vendor detection: Apple, Archos, Generic, Google, Honor, Huawei, Infinix, Nvidia, Lenovo, Nokia, OnePlus, Xiaomi
|
||||
- Improve device type detection: smarttv, wearables
|
||||
- Improve os detection: Linux, Symbian
|
||||
|
||||
## Version 0.7.40 / 1.0.40
|
||||
- Add new browser: 115, LibreWolf, Slimboat, Slimjet
|
||||
- Add new device: Advan, Cat, Energizer, IMO, Micromax, Smartfren
|
||||
- Add new engine: ArkWeb, Servo
|
||||
- Add new os: OpenHarmony
|
||||
- Improve browser detection: 2345, 360, Dragon, Iron, Maxthon
|
||||
- Recognize Honor as a separate device vendor from Huawei
|
||||
- Fix Python Request mistakenly identified as Meta Quest
|
||||
|
||||
## Version 0.7.39 / 1.0.39
|
||||
- Add new feature: executable command using `npx ua-parser-js "[INSERT-UA-HERE]"`
|
||||
- Add new browser: Helio, Pico Browser, Wolvic
|
||||
- Add new device vendor: itel, Nothing, TCL
|
||||
- Improve browser detection: ICEBrowser, Klar, QQBrowser, Quark, Rekonq, Sleipnir
|
||||
- Improve device detection: Xiaomi Pro, Amazon Echo Show, Samsung Galaxy Watch
|
||||
- Removed from browser: Viera
|
||||
|
||||
## Version 0.7.38 / 1.0.38
|
||||
- Fix error on getOS() when userAgentData.platform is undefined
|
||||
- Add new browser: Opera GX, Twitter
|
||||
@@ -239,4 +399,4 @@ Version 1.0.x is basically the equivalent of version 0.7.x (mirror/duplicate). S
|
||||
|
||||
## Version 0.8
|
||||
|
||||
Version 0.8 was created by accident. This version is now deprecated and no longer maintained, please update to version 0.7 / 1.0.
|
||||
Version 0.8 was created by accident. This version is now deprecated and no longer maintained, please update to version 0.7 / 1.0.
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
* Make some changes as required
|
||||
* Write unit test to showcase its functionality under `/test`
|
||||
* Run the test suites to make sure it's not breaking anything `$ npm run build+test`
|
||||
* Submit a pull request under `develop` branch & check the CLA in the submission form
|
||||
* Submit a pull request & check the CLA in the submission form
|
||||
128
README.md
128
README.md
@@ -1,7 +1,14 @@
|
||||
<p align="center">
|
||||
<a href="https://uaparser.dev"><img src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/uap-header.png"></a>
|
||||
</p>
|
||||
#### Featured Sponsors
|
||||
|
||||
[](https://ref.wisprflow.ai/Rxj3n8H)
|
||||
|
||||
---
|
||||
|
||||
[](https://uaparser.dev)
|
||||
[](https://uaparser.dev)
|
||||
[](https://uaparser.dev)
|
||||
[](https://uaparser.dev)
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.npmjs.com/package/ua-parser-js"><img src="https://img.shields.io/npm/dw/ua-parser-js?color=red&logo=npm&label=NPM%20DOWNLOADS&style=for-the-badge"></a>
|
||||
<a href="https://www.jsdelivr.com/package/npm/ua-parser-js"><img src="https://img.shields.io/jsdelivr/gh/hw/faisalman/ua-parser-js?logo=jsdelivr&style=for-the-badge"></a>
|
||||
@@ -11,18 +18,18 @@
|
||||
<a href="https://www.npmjs.com/package/ua-parser-js"><img src="https://img.shields.io/npm/v/ua-parser-js.svg?logo=npm&color=red&style=for-the-badge"></a>
|
||||
<a href="https://cdnjs.com/libraries/UAParser.js"><img src="https://img.shields.io/cdnjs/v/UAParser.js.svg?color=orange&style=for-the-badge"></a>
|
||||
<img src="https://img.shields.io/ossf-scorecard/github.com/faisalman/ua-parser-js?label=openssf%20scorecard&style=for-the-badge">
|
||||
<a target="_blank" href="https://discord.com/channels/1406959509087453236/1406959509930381375"><img alt="Discord invite" src="https://dcbadge.limes.pink/api/server/https://discord.com/channels/1406959509087453236/1406959509930381375"></a>
|
||||
</p>
|
||||
|
||||
# UAParser.js
|
||||
|
||||
The most comprehensive, compact, & up-to-date isomorphic JavaScript library to detect
|
||||
user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
|
||||
(client-side) or node.js (server-side).
|
||||
The most comprehensive, compact, and up-to-date JavaScript library to detect user's browser, OS, CPU, and device type/model. Also detect bots, apps, and more. Runs seamlessly in the browser (client-side) or Node.js (server-side).
|
||||
|
||||
# Demo
|
||||
|
||||
* Live demo: https://uaparser.dev
|
||||
|
||||
|
||||
# Documentation
|
||||
|
||||
* `version 1.x` : https://github.com/faisalman/ua-parser-js/tree/1.0.x#documentation
|
||||
@@ -31,7 +38,7 @@ user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
|
||||
Before upgrading from `v0.7` / `v1.0`, please read [CHANGELOG](CHANGELOG.md) to
|
||||
see what's new & breaking.
|
||||
|
||||
# License Options
|
||||
# Package & Pricing
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
@@ -44,14 +51,14 @@ see what's new & breaking.
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>License options</td>
|
||||
<td>MIT (v0.7~v1.0)</td>
|
||||
<td>AGPL (>=v2.0)</td>
|
||||
<td>MIT (v1.x)</td>
|
||||
<td>AGPL (v2.x)</td>
|
||||
<td>PRO Personal</td>
|
||||
<td>PRO Business</td>
|
||||
<td>PRO Enterprise</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Browser detection</td>
|
||||
<td>Browser Detection</td>
|
||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -59,7 +66,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>CPU detection</td>
|
||||
<td>CPU Detection</td>
|
||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -67,7 +74,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Device detection</td>
|
||||
<td>Device Detection</td>
|
||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -75,7 +82,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Engine detection</td>
|
||||
<td>Rendering Engine Detection</td>
|
||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -91,7 +98,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bot detection</td>
|
||||
<td>Enhanced+ Accuracy</td>
|
||||
<td>❌</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -99,7 +106,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Extras (Apps, Libs, Emails, Media Players, etc)</td>
|
||||
<td>Bot Detection</td>
|
||||
<td>❌</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -107,7 +114,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Enhanced detection result</td>
|
||||
<td>AI Detection</td>
|
||||
<td>❌</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -115,7 +122,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Client Hints support</td>
|
||||
<td>Extra Detections (Apps, Libs, Emails, Media Players, Crawlers, and more)</td>
|
||||
<td>❌</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -123,15 +130,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>CommonJS support</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>ES modules support</td>
|
||||
<td>Client Hints Support</td>
|
||||
<td>❌</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -139,7 +138,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>npm module</td>
|
||||
<td>CommonJS Support</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -147,15 +146,39 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TypeScript declarations</td>
|
||||
<td><a href="#demo" title="Community version">⚠️</a></td>
|
||||
<td>ESM Support</td>
|
||||
<td>❌</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Allows commercial use</td>
|
||||
<td>TypeScript Definitions</td>
|
||||
<td><a href="#demo" title="Community version">✅</a></td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>npm Module Available</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Direct Downloads Available</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Commercial Use Allowed</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>❌</td>
|
||||
@@ -163,7 +186,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Permissive (non-copyleft) license</td>
|
||||
<td>Permissive (non-Copyleft) License</td>
|
||||
<td>✅</td>
|
||||
<td><strong title="Copyleft license">❌</strong></td>
|
||||
<td>✅</td>
|
||||
@@ -171,15 +194,31 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Unlimited use per 1 license</td>
|
||||
<td>No Open-Source Obligations</td>
|
||||
<td>✅</td>
|
||||
<td><strong title="Copyleft license">❌</strong></td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td><strong title="1 project per 1 license">❌</strong></td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1-year product support</td>
|
||||
<td>Unlimited End-Products</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td><strong title="1 end-product per license">❌</strong></td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Unlimited Deployments</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td><strong title="1 TLD or deliverable per license">❌</strong></td>
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1-year Product Support</td>
|
||||
<td>❌</td>
|
||||
<td>❌</td>
|
||||
<td>✅</td>
|
||||
@@ -187,7 +226,7 @@ see what's new & breaking.
|
||||
<td>✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lifetime updates</td>
|
||||
<td>Lifetime Updates</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
<td>✅</td>
|
||||
@@ -196,8 +235,8 @@ see what's new & breaking.
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Price</td>
|
||||
<td><strong title="Pay as you want">FREE (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/1.0.x/license.md">License</a>)</strong></td>
|
||||
<td><strong title="Pay as you want">FREE (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/master/LICENSE.md">License</a>)</strong></td>
|
||||
<td><strong title="Pay as you want">FREE<sup>*</sup> (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/1.0.x/license.md">License</a>)</strong></td>
|
||||
<td><strong title="Pay as you want">FREE<sup>*</sup> (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/master/LICENSE.md">License</a>)</strong></td>
|
||||
<td><strong title="$14 (one-time fee)">$14 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-personal/LICENSE.md">License</a>)</strong></td>
|
||||
<td><strong title="$29 (one-time fee)">$29 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-business/LICENSE.md">License</a>)</strong></td>
|
||||
<td><strong title="$599 (one-time fee)">$599 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-enterprise/LICENSE.md">License</a>)</strong></td>
|
||||
@@ -226,7 +265,16 @@ Made with [contributors-img](https://contrib.rocks).
|
||||
|
||||
## Backers & Sponsors
|
||||
|
||||
Support the **open-source editions** of UAParser.js through one of the following options:
|
||||
|
||||
[](https://opencollective.com/ua-parser-js)
|
||||
[](https://github.com/sponsors/faisalman)
|
||||
[](https://paypal.me/faisalman)
|
||||
[](https://store.faisalman.com/buy/3d71f2f3-cf4d-473c-892a-9d4497c890be)
|
||||
|
||||
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/organizations.svg?avatarHeight=64"></a>
|
||||
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/individuals.svg?avatarHeight=64"></a>
|
||||
|
||||
Support the open-source editions of UAParser.js on [OpenCollective](https://opencollective.com/ua-parser-js) or [GitHub Sponsors](https://github.com/sponsors/faisalman).
|
||||
|
||||
6
dist/ua-parser.min.js
vendored
6
dist/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
4
dist/ua-parser.min.mjs
vendored
Normal file
4
dist/ua-parser.min.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
6
dist/ua-parser.pack.js
vendored
6
dist/ua-parser.pack.js
vendored
File diff suppressed because one or more lines are too long
4
dist/ua-parser.pack.mjs
vendored
Normal file
4
dist/ua-parser.pack.mjs
vendored
Normal file
File diff suppressed because one or more lines are too long
3263
package-lock.json
generated
3263
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
53
package.json
53
package.json
@@ -1,38 +1,41 @@
|
||||
{
|
||||
"title": "UAParser.js",
|
||||
"name": "ua-parser-js",
|
||||
"version": "2.0.0-rc.3",
|
||||
"version": "2.0.6",
|
||||
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
||||
"description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment",
|
||||
"keywords": [
|
||||
"user-agent",
|
||||
"client-hints",
|
||||
"parser",
|
||||
"browser",
|
||||
"engine",
|
||||
"os",
|
||||
"device",
|
||||
"cpu",
|
||||
"jquery-plugin",
|
||||
"ecosystem:jquery",
|
||||
"ua-parser-js",
|
||||
"browser-detection",
|
||||
"device-detection",
|
||||
"os-detection",
|
||||
"bot-detection"
|
||||
"bot-detection",
|
||||
"ai-detection",
|
||||
"app-detection",
|
||||
"crawler-detection"
|
||||
],
|
||||
"homepage": "https://uaparser.dev",
|
||||
"contributors": [
|
||||
"Aamir Poonawalla <aamir@urx.com>",
|
||||
"Admas <mollases@users.noreply.github.com>",
|
||||
"Aiyush <aiyushdhar85@gmail.com>",
|
||||
"algenon <m@antonz.ru>",
|
||||
"Alvin Portillo <alvin@8thwall.com>",
|
||||
"Amumu <yoyo837@hotmail.com>",
|
||||
"Andreas Kogler <andreas.kogler@bitmovin.com>",
|
||||
"Andrea Vaghi <andrea.vaghi@jobrapido.com>",
|
||||
"Anton Zhiyanov <m@antonz.ru>",
|
||||
"Arturo Mejia <amejia@blim.com>",
|
||||
"Arun Rama Reddy <arunramareddy@gmail.com>",
|
||||
"Austin Pray <austin@austinpray.com>",
|
||||
"Beat YT <66485277+Beat-YT@users.noreply.github.com>",
|
||||
"Bendeguz <symunona@gmail.com>",
|
||||
"Benjamin Bertrand <bertrand.design@gmail.com>",
|
||||
"Benjamin Urban <benjamin.urban@sueddeutsche.de>",
|
||||
@@ -44,6 +47,8 @@
|
||||
"chenyuan-new <53860479+chenyuan-new@users.noreply.github.com>",
|
||||
"Christopher De Cairos <chris.decairos@gmail.com>",
|
||||
"Cyrille David <cyrille@qonto.eu>",
|
||||
"Dai Jie <daijie@php.net>",
|
||||
"Danila Rodichkin <daniluk4000@outlook.com>",
|
||||
"Dante <duanjl.china@gmail.com>",
|
||||
"Dario Vladovic <d.vladimyr@gmail.com>",
|
||||
"David Annez <david.annez@gmail.com>",
|
||||
@@ -73,11 +78,15 @@
|
||||
"Grigory Dmitrenko <grigory@snsk.ru>",
|
||||
"gulpin <gulping.gulpin@gmail.com>",
|
||||
"Hans Ott <hansott@hotmail.be>",
|
||||
"Harald Reingruber <74898239+haraldreingruber-dedalus@users.noreply.github.com>",
|
||||
"Hendrik Helwich <h.helwich@iplabs.de>",
|
||||
"Hermann Ebert <ebbmo@HE.local>",
|
||||
"hr6r <hedian@gmail.com>",
|
||||
"Hyewon Kang <gpffps369@gmail.com>",
|
||||
"Hyunbin <47051820+hyunbinseo@users.noreply.github.com>",
|
||||
"Igor Topal <i.topal@smartweb.com.ua>",
|
||||
"Ildar Kamalov <i.kamalov@adguard.com>",
|
||||
"Ilya Daraseliya <idarase@gmail.com>",
|
||||
"insanehong <insane.hong@navercorp.com>",
|
||||
"jackpoll <jackpoll123456@gmail.com>",
|
||||
"Jacky Choo <jackychoo@adly-macbook.local>",
|
||||
@@ -98,6 +107,7 @@
|
||||
"Liam Quinn <lquinn@blackberry.com>",
|
||||
"Lithin <lithin@webklipper.com>",
|
||||
"liujunlve <liujunlve@henhaoji.com>",
|
||||
"lj0812 <xoyljlj@163.com>",
|
||||
"ll-syber <670159357@qq.com>",
|
||||
"Loris Guignard <loris.guignard@gmail.com>",
|
||||
"Lukas Drgon <lukas.drgon@gmail.com>",
|
||||
@@ -111,6 +121,7 @@
|
||||
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
||||
"Max Nordlund <max.nordlund@gmail.com>",
|
||||
"Michael Hess <mhess@connectify.me>",
|
||||
"Mike <mikehuebner@me.com>",
|
||||
"MimyyK <michele.marais@hakisa.com>",
|
||||
"Mok <mok@moekm.com>",
|
||||
"nabetama <mao.nabeta@gmail.com>",
|
||||
@@ -124,6 +135,7 @@
|
||||
"o.drapeza <o.drapeza@tinkoff.ru>",
|
||||
"Oscar Becerra <oscarbecerra@google.com>",
|
||||
"otakuSiD <otakusid@gmail.com>",
|
||||
"Pablo Osés <opablo@gmail.com>",
|
||||
"Paris Morgan <paris@8thwall.com>",
|
||||
"patrick-nurt <github@pereira.dk>",
|
||||
"Pavel Studeny <studeny@avast.com>",
|
||||
@@ -178,9 +190,25 @@
|
||||
"import": "./src/main/ua-parser.mjs",
|
||||
"types": "./src/main/ua-parser.d.ts"
|
||||
},
|
||||
"./bot-detection": {
|
||||
"require": "./src/bot-detection/bot-detection.js",
|
||||
"import": "./src/bot-detection/bot-detection.mjs",
|
||||
"types": "./src/bot-detection/bot-detection.d.ts"
|
||||
},
|
||||
"./browser-detection": {
|
||||
"require": "./src/browser-detection/browser-detection.js",
|
||||
"import": "./src/browser-detection/browser-detection.mjs",
|
||||
"types": "./src/browser-detection/browser-detection.d.ts"
|
||||
},
|
||||
"./device-detection": {
|
||||
"require": "./src/device-detection/device-detection.js",
|
||||
"import": "./src/device-detection/device-detection.mjs",
|
||||
"types": "./src/device-detection/device-detection.d.ts"
|
||||
},
|
||||
"./enums": {
|
||||
"require": "./src/enums/ua-parser-enums.js",
|
||||
"import": "./src/enums/ua-parser-enums.mjs"
|
||||
"import": "./src/enums/ua-parser-enums.mjs",
|
||||
"types": "./src/enums/ua-parser-enums.d.ts"
|
||||
},
|
||||
"./extensions": {
|
||||
"require": "./src/extensions/ua-parser-extensions.js",
|
||||
@@ -201,14 +229,14 @@
|
||||
"scripts": {
|
||||
"build": "./script/build-dist.sh && ./script/build-esm.js",
|
||||
"build+test": "npm run build && npm run test",
|
||||
"fuzz": "jazzer ./test/jazzer-fuzz-test.js --sync",
|
||||
"fuzz": "jazzer ./test/fuzz/redos.js --sync",
|
||||
"test": "./script/test-all.sh",
|
||||
"test:dts-lint": "tsd --typings src/main/ua-parser.d.ts --files test/dts-test.ts",
|
||||
"test:dts-lint": "tsd --typings src/main/ua-parser.d.ts --files test/static/dts-lint.ts",
|
||||
"test:eslint": "eslint src && eslint script",
|
||||
"test:jshint": "jshint src/main",
|
||||
"test:lockfile-lint": "npx lockfile-lint -p package-lock.json",
|
||||
"test:mocha": "mocha test/mocha*js",
|
||||
"test:playwright": "playwright test"
|
||||
"test:mocha": "mocha --recursive test/unit",
|
||||
"test:playwright": "npx playwright install && playwright test test/e2e --browser all"
|
||||
},
|
||||
"dependencies": {
|
||||
"detect-europe-js": "^0.1.2",
|
||||
@@ -218,14 +246,13 @@
|
||||
"devDependencies": {
|
||||
"@babel/parser": "7.15.8",
|
||||
"@babel/traverse": "7.23.2",
|
||||
"@jazzer.js/core": "^1.4.0",
|
||||
"@playwright/test": "~1.32.2",
|
||||
"@playwright/test": "^1.49.0",
|
||||
"jshint": "~2.13.6",
|
||||
"mocha": "~8.2.0",
|
||||
"requirejs": "2.3.2",
|
||||
"safe-regex": "^2.1.1",
|
||||
"tsd": "^0.29.0",
|
||||
"uglify-js": "~3.12.0"
|
||||
"uglify-js": "~3.19.3"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -4,10 +4,20 @@ SRC_PATH="src/main/ua-parser.js"
|
||||
MIN_PATH="dist/ua-parser.min.js"
|
||||
PACK_PATH="dist/ua-parser.pack.js"
|
||||
|
||||
SRC_PATH_MJS="src/main/ua-parser.mjs"
|
||||
MIN_PATH_MJS="dist/ua-parser.min.mjs"
|
||||
PACK_PATH_MJS="dist/ua-parser.pack.mjs"
|
||||
|
||||
# minified
|
||||
echo "Generate ${MIN_PATH}"
|
||||
uglifyjs $SRC_PATH -o $MIN_PATH --comments "/^ UA/"
|
||||
|
||||
echo "Generate ${MIN_PATH_MJS}"
|
||||
uglifyjs $SRC_PATH_MJS -o $MIN_PATH_MJS --comments "/^ UA/" --module
|
||||
|
||||
# packed
|
||||
echo "Generate ${PACK_PATH}"
|
||||
uglifyjs $SRC_PATH -o $PACK_PATH --comments "/^ UA/" --compress --mangle
|
||||
uglifyjs $SRC_PATH -o $PACK_PATH --comments "/^ UA/" --compress --mangle
|
||||
|
||||
echo "Generate ${PACK_PATH_MJS}"
|
||||
uglifyjs $SRC_PATH_MJS -o $PACK_PATH_MJS --comments "/^ UA/" --compress --mangle --module
|
||||
@@ -2,15 +2,18 @@
|
||||
/* jshint esversion: 6 */
|
||||
const fs = require('fs');
|
||||
|
||||
const generateMJS = (module) => {
|
||||
let { src, dest, title, replacements } = module;
|
||||
let text = fs.readFileSync(src, 'utf-8');
|
||||
|
||||
replacements.push(
|
||||
const defaultReplacements = {
|
||||
mjs: [
|
||||
[/const (.+?)\s*=\s*require\(\'\.(.+)\'\)/ig, 'import $1 from \'\.$2.mjs\''],
|
||||
[/const (.+?)\s*=\s*require\(\'(.+)\'\)/ig, 'import $1 from \'$2\''],
|
||||
[/module\.exports =/ig, 'export']
|
||||
);
|
||||
]
|
||||
}
|
||||
|
||||
const generateFile = (module) => {
|
||||
let { src, dest, title, replacements } = module;
|
||||
let text = fs.readFileSync(src, 'utf-8');
|
||||
|
||||
replacements.forEach(rep => {
|
||||
text = text.replace(rep[0], rep[1]);
|
||||
});
|
||||
@@ -18,42 +21,72 @@ const generateMJS = (module) => {
|
||||
console.log(`Generate ${dest}`);
|
||||
|
||||
fs.writeFileSync(dest,
|
||||
`// Generated ESM version of ${title}
|
||||
`// ${title}
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /${src}
|
||||
|
||||
${text}`, 'utf-8');
|
||||
|
||||
};
|
||||
|
||||
const modules = [
|
||||
const files = [
|
||||
{
|
||||
src : 'src/main/ua-parser.js',
|
||||
dest : 'src/main/ua-parser.mjs',
|
||||
title : 'ua-parser-js',
|
||||
title : 'Generated ESM version of ua-parser-js',
|
||||
replacements : [
|
||||
[/\(func[\s\S]+strict\';/ig, ''],
|
||||
[/esversion\: 3/ig, 'esversion: 6'],
|
||||
[/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};']
|
||||
[/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};'],
|
||||
...defaultReplacements.mjs
|
||||
]
|
||||
},{
|
||||
},
|
||||
{
|
||||
src : 'src/bot-detection/bot-detection.js',
|
||||
dest :'src/bot-detection/bot-detection.mjs',
|
||||
title : 'Generated ESM version of ua-parser-js/bot-detection',
|
||||
replacements : [...defaultReplacements.mjs]
|
||||
},
|
||||
{
|
||||
src : 'src/browser-detection/browser-detection.js',
|
||||
dest :'src/browser-detection/browser-detection.mjs',
|
||||
title : 'Generated ESM version of ua-parser-js/browser-detection',
|
||||
replacements : [...defaultReplacements.mjs]
|
||||
},
|
||||
{
|
||||
src : 'src/device-detection/device-detection.js',
|
||||
dest :'src/device-detection/device-detection.mjs',
|
||||
title : 'Generated ESM version of ua-parser-js/device-detection',
|
||||
replacements : [...defaultReplacements.mjs]
|
||||
},
|
||||
{
|
||||
src : 'src/enums/ua-parser-enums.js',
|
||||
dest :'src/enums/ua-parser-enums.mjs',
|
||||
title : 'ua-parser-js/enums',
|
||||
replacements : []
|
||||
title : 'Generated ESM version of ua-parser-js/enums',
|
||||
replacements : [...defaultReplacements.mjs]
|
||||
},
|
||||
{
|
||||
src : 'src/enums/ua-parser-enums.js',
|
||||
dest :'src/enums/ua-parser-enums.d.ts',
|
||||
title : 'Generated type declarations of ua-parser-js/enums',
|
||||
replacements : [
|
||||
[/(const .+) = object\.freeze\(/ig, 'export $1: Readonly<'],
|
||||
[/(const .+) =( .+;)/ig, 'export $1: typeof$2'],
|
||||
[/}\);/ig, '}>;'],
|
||||
[/module\.exports =.+/igs, '']
|
||||
]
|
||||
},
|
||||
{
|
||||
src : 'src/extensions/ua-parser-extensions.js',
|
||||
dest : 'src/extensions/ua-parser-extensions.mjs',
|
||||
title : 'ua-parser-js/extensions',
|
||||
replacements : []
|
||||
title : 'Generated ESM version of ua-parser-js/extensions',
|
||||
replacements : [...defaultReplacements.mjs]
|
||||
},
|
||||
{
|
||||
src : 'src/helpers/ua-parser-helpers.js',
|
||||
dest : 'src/helpers/ua-parser-helpers.mjs',
|
||||
title : 'ua-parser-js/helpers',
|
||||
replacements : []
|
||||
title : 'Generated ESM version of ua-parser-js/helpers',
|
||||
replacements : [...defaultReplacements.mjs]
|
||||
}
|
||||
];
|
||||
|
||||
modules.forEach(module => generateMJS(module));
|
||||
files.forEach(module => generateFile(module));
|
||||
@@ -1,4 +1,94 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const UAParser = require('ua-parser-js');
|
||||
console.log(JSON.stringify(process.argv.slice(2).map(ua => UAParser(ua)), null, 4));
|
||||
try {
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
const { performance } = require('node:perf_hooks');
|
||||
const readline = require('node:readline');
|
||||
const { parseArgs } = require('node:util');
|
||||
const UAParser = require('../src/main/ua-parser');
|
||||
const { Bots, Emails, ExtraDevices, InApps, Vehicles } = require('../src/extensions/ua-parser-extensions');
|
||||
|
||||
if (!process.argv[2].startsWith('-')) {
|
||||
|
||||
const results = process.argv.slice(2).map(ua => UAParser(ua, [Bots, Emails, ExtraDevices, InApps, Vehicles]));
|
||||
console.log(JSON.stringify(results, null, 4));
|
||||
process.exit(0);
|
||||
|
||||
} else if (['-h', '--help'].includes(process.argv[2])) {
|
||||
|
||||
console.log('Usage: npx ua-parser-js <string>');
|
||||
console.log(' or npx ua-parser-js --input-file <filepath> [--output-file <filepath>]');
|
||||
console.log('-i, --input-file');
|
||||
console.log('-o, --output-file');
|
||||
process.exit(0);
|
||||
|
||||
} else {
|
||||
|
||||
const startPerf = performance.now();
|
||||
const {
|
||||
values: {
|
||||
'input-file': inputFile,
|
||||
'output-file': outputFile
|
||||
},
|
||||
} = parseArgs({
|
||||
options: {
|
||||
'input-file': { type: 'string', short: 'i' },
|
||||
'output-file': { type: 'string', short: 'o' }
|
||||
}
|
||||
});
|
||||
|
||||
if (!inputFile) {
|
||||
console.error('Input file must be present');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const inputPath = path.resolve(__dirname, inputFile);
|
||||
const outputPath = outputFile ? path.resolve(__dirname, outputFile) : null;
|
||||
|
||||
if (!fs.existsSync(inputPath)) {
|
||||
console.error(`Input file not found: ${inputPath}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const inputStream = fs.createReadStream(inputPath, 'utf8');
|
||||
const rl = readline.createInterface({
|
||||
input: inputStream,
|
||||
crlfDelay: Infinity
|
||||
});
|
||||
|
||||
const outputStream = outputPath ? fs.createWriteStream(outputPath, { encoding : 'utf8' }) : process.stdout;
|
||||
|
||||
const uap = new UAParser([Bots, Emails, ExtraDevices, InApps, Vehicles]);
|
||||
let lineNumber = 0;
|
||||
|
||||
outputStream.write('[\n');
|
||||
|
||||
rl.on('line', line => {
|
||||
const result = uap.setUA(line).getResult();
|
||||
const json = JSON.stringify(result, null, 4);
|
||||
if (lineNumber > 0) outputStream.write(',\n');
|
||||
outputStream.write(json);
|
||||
lineNumber++;
|
||||
});
|
||||
|
||||
rl.on('close', () => {
|
||||
outputStream.write('\n]');
|
||||
if (outputPath) {
|
||||
outputStream.end(() => {
|
||||
const finishPerf = performance.now();
|
||||
console.log(`Done!`);
|
||||
console.log(`Number of lines found: ${lineNumber}`);
|
||||
console.log(`Task finished in: ${(finishPerf - startPerf).toFixed(3)}ms`);
|
||||
console.log(`Output written to: ${outputPath}`);
|
||||
process.exit(0);
|
||||
});
|
||||
} else {
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
}
|
||||
7
src/bot-detection/bot-detection.d.ts
vendored
Normal file
7
src/bot-detection/bot-detection.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// Type definitions for bot-detection submodule of UAParser.js v2.0.7
|
||||
// Project: https://github.com/faisalman/ua-parser-js
|
||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||
|
||||
export function isAIAssistant(ua: string): boolean;
|
||||
export function isAICrawler(ua: string): boolean;
|
||||
export function isBot(ua: string): boolean;
|
||||
188
src/bot-detection/bot-detection.js
Normal file
188
src/bot-detection/bot-detection.js
Normal file
@@ -0,0 +1,188 @@
|
||||
//////////////////////////////////////////////////
|
||||
/* bot-detection submodule of UAParser.js v2.0.7
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const { UAParser } = require('../main/ua-parser');
|
||||
const { Bots, Crawlers, Fetchers } = require('../extensions/ua-parser-extensions');
|
||||
const { BrowserType, Extension } = require('../enums/ua-parser-enums');
|
||||
const { Crawler, Fetcher } = Extension.BrowserName;
|
||||
|
||||
class BotList {
|
||||
constructor(ext, prop, list) {
|
||||
this.ext = ext;
|
||||
this.prop = prop;
|
||||
this.list = list.map(x => x.toLowerCase());
|
||||
}
|
||||
includes(ua) {
|
||||
return this.list.includes(
|
||||
(typeof ua === 'string' ?
|
||||
new UAParser(ua, this.ext).getBrowser() :
|
||||
ua.browser
|
||||
)[this.prop]?.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
const BotTypes = new BotList(Bots, 'type', [
|
||||
BrowserType.CLI,
|
||||
BrowserType.CRAWLER,
|
||||
BrowserType.FETCHER,
|
||||
BrowserType.LIBRARY
|
||||
]);
|
||||
|
||||
const AIAssistants = new BotList(Fetchers, 'name', [
|
||||
|
||||
// Amazon
|
||||
Fetcher.AMAZON_NOVA_ACT,
|
||||
|
||||
// Anthropic
|
||||
Fetcher.ANTHROPIC_CLAUDE_USER,
|
||||
|
||||
// Cohere
|
||||
Fetcher.COHERE_AI,
|
||||
|
||||
// DuckDuckGo
|
||||
Fetcher.DUCKDUCKGO_ASSISTBOT,
|
||||
|
||||
// Google
|
||||
Fetcher.GOOGLE_GEMINI_DEEP_RESEARCH,
|
||||
|
||||
// Mistral AI
|
||||
Fetcher.MISTRALAI_USER,
|
||||
|
||||
// OpenAI
|
||||
Fetcher.OPENAI_CHATGPT_USER,
|
||||
|
||||
// Perplexity
|
||||
Fetcher.PERPLEXITY_USER
|
||||
]);
|
||||
|
||||
const AICrawlers = new BotList(Crawlers, 'name', [
|
||||
|
||||
// AI2
|
||||
Crawler.AI2_BOT,
|
||||
|
||||
// Amazon
|
||||
Crawler.AMAZON_BOT,
|
||||
|
||||
// Anthropic
|
||||
Crawler.ANTHROPIC_AI,
|
||||
Crawler.ANTHROPIC_CLAUDE_BOT,
|
||||
Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
|
||||
Crawler.ANTHROPIC_CLAUDE_WEB,
|
||||
|
||||
// Apple
|
||||
Crawler.APPLE_BOT,
|
||||
Crawler.APPLE_BOT_EXTENDED,
|
||||
|
||||
// Brave
|
||||
Crawler.BRAVE_BOT,
|
||||
|
||||
// ByteDance
|
||||
Crawler.BYTEDANCE_BYTESPIDER,
|
||||
Crawler.BYTEDANCE_TIKTOKSPIDER,
|
||||
|
||||
// Cohere
|
||||
Crawler.COHERE_TRAINING_DATA_CRAWLER,
|
||||
|
||||
// Common Crawl
|
||||
Crawler.COMMON_CRAWL_CCBOT,
|
||||
|
||||
// Coveo
|
||||
Crawler.COVEO_BOT,
|
||||
|
||||
// DataForSeo
|
||||
Crawler.DATAFORSEO_BOT,
|
||||
|
||||
// DeepSeek
|
||||
Crawler.DEEPSEEK_BOT,
|
||||
|
||||
// Diffbot
|
||||
Crawler.DIFFBOT,
|
||||
|
||||
// Google
|
||||
Crawler.GOOGLE_EXTENDED,
|
||||
Crawler.GOOGLE_OTHER,
|
||||
Crawler.GOOGLE_OTHER_IMAGE,
|
||||
Crawler.GOOGLE_OTHER_VIDEO,
|
||||
Crawler.GOOGLE_CLOUDVERTEXBOT,
|
||||
|
||||
// Hive AI
|
||||
Crawler.HIVE_IMAGESIFTBOT,
|
||||
|
||||
// Huawei
|
||||
Crawler.HUAWEI_PETALBOT,
|
||||
Crawler.HUAWEI_PANGUBOT,
|
||||
|
||||
// Hugging Face
|
||||
Crawler.HUGGINGFACE_BOT,
|
||||
|
||||
// Kangaroo
|
||||
Crawler.KANGAROO_BOT,
|
||||
|
||||
// Mendable.ai
|
||||
Crawler.FIRECRAWL_AGENT,
|
||||
|
||||
// Meta
|
||||
Crawler.META_FACEBOOKBOT,
|
||||
Crawler.META_EXTERNALAGENT,
|
||||
|
||||
// OpenAI
|
||||
Crawler.OPENAI_GPTBOT,
|
||||
Crawler.OPENAI_SEARCH_BOT,
|
||||
|
||||
// Perplexity
|
||||
Crawler.PERPLEXITY_BOT,
|
||||
|
||||
// Replicate
|
||||
Crawler.REPLICATE_BOT,
|
||||
|
||||
// Runpod
|
||||
Crawler.RUNPOD_BOT,
|
||||
|
||||
// SB Intuitions
|
||||
Crawler.SB_INTUITIONS_BOT,
|
||||
|
||||
// Semrush
|
||||
Crawler.SEMRUSH_BOT_CONTENTSHAKE,
|
||||
|
||||
// Timpi
|
||||
Crawler.TIMPI_BOT,
|
||||
|
||||
// Together AI
|
||||
Crawler.TOGETHER_BOT,
|
||||
|
||||
// Velen.io
|
||||
Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
|
||||
|
||||
// Vercel
|
||||
Crawler.VERCEL_V0BOT,
|
||||
|
||||
// Webz.io
|
||||
Crawler.WEBZIO_OMGILI,
|
||||
Crawler.WEBZIO_OMGILI_BOT,
|
||||
Crawler.WEBZIO_EXTENDED,
|
||||
|
||||
// X
|
||||
Crawler.XAI_BOT,
|
||||
|
||||
// You.com
|
||||
Crawler.YOU_BOT,
|
||||
|
||||
// Zhipu AI
|
||||
Crawler.ZHIPU_CHATGLM_SPIDER
|
||||
]);
|
||||
|
||||
const isBot = ua => BotTypes.includes(ua);
|
||||
const isAIAssistant = ua => AIAssistants.includes(ua);
|
||||
const isAICrawler = ua => AICrawlers.includes(ua);
|
||||
|
||||
module.exports = {
|
||||
isAIAssistant,
|
||||
isAICrawler,
|
||||
isBot
|
||||
}
|
||||
189
src/bot-detection/bot-detection.mjs
Normal file
189
src/bot-detection/bot-detection.mjs
Normal file
@@ -0,0 +1,189 @@
|
||||
// Generated ESM version of ua-parser-js/bot-detection
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /src/bot-detection/bot-detection.js
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* bot-detection submodule of UAParser.js v2.0.7
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
import { UAParser } from '../main/ua-parser.mjs';
|
||||
import { Extension, BrowserType } from '../enums/ua-parser-enums.mjs';
|
||||
import { Bots, Crawlers, Fetchers } from '../extensions/ua-parser-extensions.mjs';
|
||||
const { Crawler, Fetcher } = Extension.BrowserName;
|
||||
|
||||
class BotList {
|
||||
constructor(ext, prop, list) {
|
||||
this.ext = ext;
|
||||
this.prop = prop;
|
||||
this.list = list.map(x => x.toLowerCase());
|
||||
}
|
||||
includes(ua) {
|
||||
return this.list.includes(
|
||||
(typeof ua === 'string' ?
|
||||
new UAParser(ua, this.ext).getBrowser() :
|
||||
ua.browser
|
||||
)[this.prop]?.toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
const BotTypes = new BotList(Bots, 'type', [
|
||||
BrowserType.CLI,
|
||||
BrowserType.CRAWLER,
|
||||
BrowserType.FETCHER,
|
||||
BrowserType.LIBRARY
|
||||
]);
|
||||
|
||||
const AIAssistants = new BotList(Fetchers, 'name', [
|
||||
|
||||
// Anthropic
|
||||
Fetcher.ANTHROPIC_CLAUDE_USER,
|
||||
|
||||
// Cohere
|
||||
Fetcher.COHERE_AI,
|
||||
|
||||
// DuckDuckGo
|
||||
Fetcher.DUCKDUCKGO_ASSISTBOT,
|
||||
|
||||
// Google
|
||||
Fetcher.GOOGLE_GEMINI_DEEP_RESEARCH,
|
||||
|
||||
// Mistral AI
|
||||
Fetcher.MISTRALAI_USER,
|
||||
|
||||
// OpenAI
|
||||
Fetcher.OPENAI_CHATGPT_USER,
|
||||
|
||||
// Perplexity
|
||||
Fetcher.PERPLEXITY_USER
|
||||
]);
|
||||
|
||||
const AICrawlers = new BotList(Crawlers, 'name', [
|
||||
|
||||
// AI2
|
||||
Crawler.AI2_BOT,
|
||||
|
||||
// Amazon
|
||||
Crawler.AMAZON_BOT,
|
||||
|
||||
// Anthropic
|
||||
Crawler.ANTHROPIC_AI,
|
||||
Crawler.ANTHROPIC_CLAUDE_BOT,
|
||||
Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
|
||||
Crawler.ANTHROPIC_CLAUDE_WEB,
|
||||
|
||||
// Apple
|
||||
Crawler.APPLE_BOT,
|
||||
Crawler.APPLE_BOT_EXTENDED,
|
||||
|
||||
// Brave
|
||||
Crawler.BRAVE_BOT,
|
||||
|
||||
// ByteDance
|
||||
Crawler.BYTEDANCE_BYTESPIDER,
|
||||
Crawler.BYTEDANCE_TIKTOKSPIDER,
|
||||
|
||||
// Cohere
|
||||
Crawler.COHERE_TRAINING_DATA_CRAWLER,
|
||||
|
||||
// Common Crawl
|
||||
Crawler.COMMON_CRAWL_CCBOT,
|
||||
|
||||
// Coveo
|
||||
Crawler.COVEO_BOT,
|
||||
|
||||
// DataForSeo
|
||||
Crawler.DATAFORSEO_BOT,
|
||||
|
||||
// DeepSeek
|
||||
Crawler.DEEPSEEK_BOT,
|
||||
|
||||
// Diffbot
|
||||
Crawler.DIFFBOT,
|
||||
|
||||
// Google
|
||||
Crawler.GOOGLE_EXTENDED,
|
||||
Crawler.GOOGLE_OTHER,
|
||||
Crawler.GOOGLE_OTHER_IMAGE,
|
||||
Crawler.GOOGLE_OTHER_VIDEO,
|
||||
Crawler.GOOGLE_CLOUDVERTEXBOT,
|
||||
|
||||
// Hive AI
|
||||
Crawler.HIVE_IMAGESIFTBOT,
|
||||
|
||||
// Huawei
|
||||
Crawler.HUAWEI_PETALBOT,
|
||||
Crawler.HUAWEI_PANGUBOT,
|
||||
|
||||
// Hugging Face
|
||||
Crawler.HUGGINGFACE_BOT,
|
||||
|
||||
// Kangaroo
|
||||
Crawler.KANGAROO_BOT,
|
||||
|
||||
// Mendable.ai
|
||||
Crawler.FIRECRAWL_AGENT,
|
||||
|
||||
// Meta
|
||||
Crawler.META_FACEBOOKBOT,
|
||||
Crawler.META_EXTERNALAGENT,
|
||||
|
||||
// OpenAI
|
||||
Crawler.OPENAI_GPTBOT,
|
||||
Crawler.OPENAI_SEARCH_BOT,
|
||||
|
||||
// Perplexity
|
||||
Crawler.PERPLEXITY_BOT,
|
||||
|
||||
// Replicate
|
||||
Crawler.REPLICATE_BOT,
|
||||
|
||||
// Runpod
|
||||
Crawler.RUNPOD_BOT,
|
||||
|
||||
// SB Intuitions
|
||||
Crawler.SB_INTUITIONS_BOT,
|
||||
|
||||
// Semrush
|
||||
Crawler.SEMRUSH_BOT_CONTENTSHAKE,
|
||||
|
||||
// Timpi
|
||||
Crawler.TIMPI_BOT,
|
||||
|
||||
// Together AI
|
||||
Crawler.TOGETHER_BOT,
|
||||
|
||||
// Velen.io
|
||||
Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
|
||||
|
||||
// Vercel
|
||||
Crawler.VERCEL_V0BOT,
|
||||
|
||||
// Webz.io
|
||||
Crawler.WEBZIO_OMGILI,
|
||||
Crawler.WEBZIO_OMGILI_BOT,
|
||||
Crawler.WEBZIO_EXTENDED,
|
||||
|
||||
// X
|
||||
Crawler.XAI_BOT,
|
||||
|
||||
// You.com
|
||||
Crawler.YOU_BOT,
|
||||
|
||||
// Zhipu AI
|
||||
Crawler.ZHIPU_CHATGLM_SPIDER
|
||||
]);
|
||||
|
||||
const isBot = ua => BotTypes.includes(ua);
|
||||
const isAIAssistant = ua => AIAssistants.includes(ua);
|
||||
const isAICrawler = ua => AICrawlers.includes(ua);
|
||||
|
||||
export {
|
||||
isAIAssistant,
|
||||
isAICrawler,
|
||||
isBot
|
||||
}
|
||||
10
src/browser-detection/browser-detection.d.ts
vendored
Normal file
10
src/browser-detection/browser-detection.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
// Type definitions for browser-detection submodule of UAParser.js v2.0.7
|
||||
// Project: https://github.com/faisalman/ua-parser-js
|
||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||
|
||||
import type { IResult } from "../main/ua-parser";
|
||||
|
||||
export function isChromeFamily(resultOrUA: IResult | string): boolean;
|
||||
export function isElectron(): boolean;
|
||||
export function isFromEU(): boolean;
|
||||
export function isStandalonePWA(): boolean;
|
||||
30
src/browser-detection/browser-detection.js
Normal file
30
src/browser-detection/browser-detection.js
Normal file
@@ -0,0 +1,30 @@
|
||||
//////////////////////////////////////////////////////
|
||||
/* browser-detection submodule of UAParser.js v2.0.7
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const { UAParser } = require('../main/ua-parser');
|
||||
const { EngineName } = require('../enums/ua-parser-enums');
|
||||
const { isStandalonePWA } = require('is-standalone-pwa');
|
||||
const { isFromEU } = require('detect-europe-js');
|
||||
|
||||
const isChromeFamily = val => !!(
|
||||
(typeof val === 'string' ?
|
||||
new UAParser(val).getEngine() :
|
||||
val.engine
|
||||
)?.is(EngineName.BLINK));
|
||||
|
||||
const isElectron = () => !!(
|
||||
process?.versions?.hasOwnProperty('electron') || // node.js
|
||||
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||
|
||||
module.exports = {
|
||||
isChromeFamily,
|
||||
isElectron,
|
||||
isFromEU,
|
||||
isStandalonePWA
|
||||
}
|
||||
30
src/browser-detection/browser-detection.mjs
Normal file
30
src/browser-detection/browser-detection.mjs
Normal file
@@ -0,0 +1,30 @@
|
||||
// Generated ESM version of ua-parser-js/browser-detection
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /src/browser-detection/browser-detection.js
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
/* browser-detection submodule of UAParser.js v2.0.7
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
import { UAParser } from '../main/ua-parser.mjs';
|
||||
import { isStandalonePWA } from 'is-standalone-pwa';
|
||||
|
||||
const isChromeFamily = val => !!(
|
||||
(typeof val === 'string' ?
|
||||
new UAParser(val).getEngine() :
|
||||
val.engine
|
||||
)?.is(EngineName.BLINK));
|
||||
|
||||
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
||||
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||
|
||||
export {
|
||||
isChromeFamily,
|
||||
isElectron,
|
||||
isStandalonePWA
|
||||
}
|
||||
8
src/device-detection/device-detection.d.ts
vendored
Normal file
8
src/device-detection/device-detection.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
// Type definitions for device-detection submodule of UAParser.js v2.0.7
|
||||
// Project: https://github.com/faisalman/ua-parser-js
|
||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||
|
||||
import type { IResult } from "../main/ua-parser";
|
||||
|
||||
export function getDeviceVendor(model: string): string | undefined;
|
||||
export function isAppleSilicon(resultOrUA: IResult | string): boolean;
|
||||
43
src/device-detection/device-detection.js
Normal file
43
src/device-detection/device-detection.js
Normal file
@@ -0,0 +1,43 @@
|
||||
/////////////////////////////////////////////////////
|
||||
/* device-detection submodule of UAParser.js v2.0.7
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const { UAParser } = require('../main/ua-parser');
|
||||
const { CPUArch, OSName } = require('../enums/ua-parser-enums');
|
||||
|
||||
const getDeviceVendor = (model) => new UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).getDevice().vendor;
|
||||
|
||||
const isAppleSilicon = (val) => {
|
||||
const { os, cpu } = typeof val !== 'string' ? val : {
|
||||
os: new UAParser(val).getOS(),
|
||||
cpu: new UAParser(val).getCPU()
|
||||
};
|
||||
if (os.is(OSName.MACOS)) {
|
||||
if (cpu.is(CPUArch.ARM)) {
|
||||
return true;
|
||||
} else if (typeof window !== 'undefined') {
|
||||
try {
|
||||
const canvas = document.createElement('canvas');
|
||||
const webgl = canvas.getContext('webgl2') ||
|
||||
canvas.getContext('webgl') ||
|
||||
canvas.getContext('experimental-webgl');
|
||||
return webgl
|
||||
.getParameter(webgl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL)
|
||||
.match(/apple m\d/i);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getDeviceVendor,
|
||||
isAppleSilicon
|
||||
}
|
||||
47
src/device-detection/device-detection.mjs
Normal file
47
src/device-detection/device-detection.mjs
Normal file
@@ -0,0 +1,47 @@
|
||||
// Generated ESM version of ua-parser-js/device-detection
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /src/device-detection/device-detection.js
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/* device-detection submodule of UAParser.js v2.0.7
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
////////////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
import { UAParser } from '../main/ua-parser.mjs';
|
||||
import { CPUArch, OSName } from '../enums/ua-parser-enums.mjs';
|
||||
|
||||
const getDeviceVendor = (model) => new UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).getDevice().vendor;
|
||||
|
||||
const isAppleSilicon = (val) => {
|
||||
const { os, cpu } = typeof val !== 'string' ? val : {
|
||||
os: new UAParser(val).getOS(),
|
||||
cpu: new UAParser(val).getCPU()
|
||||
};
|
||||
if (os.is(OSName.MACOS)) {
|
||||
if (cpu.is(CPUArch.ARM)) {
|
||||
return true;
|
||||
} else if (typeof window !== 'undefined') {
|
||||
try {
|
||||
const canvas = document.createElement('canvas');
|
||||
const webgl = canvas.getContext('webgl2') ||
|
||||
canvas.getContext('webgl') ||
|
||||
canvas.getContext('experimental-webgl');
|
||||
return webgl
|
||||
.getParameter(webgl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL)
|
||||
.match(/apple m\d/i);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export {
|
||||
getDeviceVendor,
|
||||
isAppleSilicon
|
||||
}
|
||||
744
src/enums/ua-parser-enums.d.ts
vendored
Normal file
744
src/enums/ua-parser-enums.d.ts
vendored
Normal file
@@ -0,0 +1,744 @@
|
||||
// Generated type declarations of ua-parser-js/enums
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /src/enums/ua-parser-enums.js
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/* Enums for UAParser.js v2.0.6
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
export const BrowserName: Readonly<{
|
||||
'115': '115',
|
||||
'2345': '2345',
|
||||
'360': '360',
|
||||
ALIPAY: 'Alipay',
|
||||
AMAYA: 'Amaya',
|
||||
ANDROID: 'Android Browser',
|
||||
ARORA: 'Arora',
|
||||
AVANT: 'Avant',
|
||||
AVAST: 'Avast Secure Browser',
|
||||
AVG: 'AVG Secure Browser',
|
||||
BAIDU: 'Baidu Browser',
|
||||
BASILISK: 'Basilisk',
|
||||
BING: 'Bing',
|
||||
BLAZER: 'Blazer',
|
||||
BOLT: 'Bolt',
|
||||
BOWSER: 'Bowser',
|
||||
BRAVE: 'Brave',
|
||||
CAMINO: 'Camino',
|
||||
CHIMERA: 'Chimera',
|
||||
CHROME: 'Chrome',
|
||||
CHROME_HEADLESS: 'Chrome Headless',
|
||||
CHROME_MOBILE: 'Mobile Chrome',
|
||||
CHROME_WEBVIEW: 'Chrome WebView',
|
||||
CHROMIUM: 'Chromium',
|
||||
COBALT: 'Cobalt',
|
||||
COC_COC: 'Coc Coc',
|
||||
CONKEROR: 'Conkeror',
|
||||
DAUM: 'Daum',
|
||||
DILLO: 'Dillo',
|
||||
DOLPHIN: 'Dolphin',
|
||||
DOOBLE: 'Dooble',
|
||||
DORIS: 'Doris',
|
||||
DRAGON: 'Dragon',
|
||||
DUCKDUCKGO: 'DuckDuckGo',
|
||||
ECOSIA: 'Ecosia',
|
||||
EDGE: 'Edge',
|
||||
EDGE_WEBVIEW: 'Edge WebView',
|
||||
EDGE_WEBVIEW2: 'Edge WebView2',
|
||||
EPIPHANY: 'Epiphany',
|
||||
FACEBOOK: 'Facebook',
|
||||
FALKON: 'Falkon',
|
||||
FIREBIRD: 'Firebird',
|
||||
FIREFOX: 'Firefox',
|
||||
FIREFOX_FOCUS: 'Firefox Focus',
|
||||
FIREFOX_MOBILE: 'Mobile Firefox',
|
||||
FIREFOX_REALITY: 'Firefox Reality',
|
||||
FENNEC: 'Fennec',
|
||||
FLOCK: 'Flock',
|
||||
FLOW: 'Flow',
|
||||
GO: 'GoBrowser',
|
||||
GOOGLE_SEARCH: 'GSA',
|
||||
HELIO: 'Helio',
|
||||
HEYTAP: 'HeyTap',
|
||||
HONOR: 'Honor',
|
||||
HUAWEI: 'Huawei Browser',
|
||||
ICAB: 'iCab',
|
||||
ICE: 'ICE Browser',
|
||||
ICEAPE: 'IceApe',
|
||||
ICECAT: 'IceCat',
|
||||
ICEDRAGON: 'IceDragon',
|
||||
ICEWEASEL: 'IceWeasel',
|
||||
IE: 'IE',
|
||||
INSTAGRAM: 'Instagram',
|
||||
IRIDIUM: 'Iridium',
|
||||
IRON: 'Iron',
|
||||
JASMINE: 'Jasmine',
|
||||
KONQUEROR: 'Konqueror',
|
||||
KAKAO: 'KakaoTalk',
|
||||
KHTML: 'KHTML',
|
||||
K_MELEON: 'K-Meleon',
|
||||
KLAR: 'Klar',
|
||||
KLARNA: 'Klarna',
|
||||
KINDLE: 'Kindle',
|
||||
LENOVO: 'Smart Lenovo Browser',
|
||||
LADYBIRD: 'Ladybird',
|
||||
LG: 'LG Browser',
|
||||
LIBREWOLF: 'LibreWolf',
|
||||
LIEBAO: 'LBBROWSER',
|
||||
LINE: 'Line',
|
||||
LINKEDIN: 'LinkedIn',
|
||||
LINKS: 'Links',
|
||||
LUNASCAPE: 'Lunascape',
|
||||
LYNX: 'Lynx',
|
||||
MAEMO: 'Maemo Browser',
|
||||
MAXTHON: 'Maxthon',
|
||||
MIDORI: 'Midori',
|
||||
MINIMO: 'Minimo',
|
||||
MIUI: 'MIUI Browser',
|
||||
MOZILLA: 'Mozilla',
|
||||
MOSAIC: 'Mosaic',
|
||||
NAVER: 'Naver',
|
||||
NETFRONT: 'NetFront',
|
||||
NETSCAPE: 'Netscape',
|
||||
NETSURF: 'Netsurf',
|
||||
NOKIA: 'Nokia Browser',
|
||||
OBIGO: 'Obigo',
|
||||
OCULUS: 'Oculus Browser',
|
||||
OMNIWEB: 'OmniWeb',
|
||||
OPERA: 'Opera',
|
||||
OPERA_COAST: 'Opera Coast',
|
||||
OPERA_GX: 'Opera GX',
|
||||
OPERA_MINI: 'Opera Mini',
|
||||
OPERA_MOBI: 'Opera Mobi',
|
||||
OPERA_TABLET: 'Opera Tablet',
|
||||
OPERA_TOUCH: 'Opera Touch',
|
||||
OTTER: 'Otter',
|
||||
OVI: 'OviBrowser',
|
||||
PALEMOON: 'PaleMoon',
|
||||
PHANTOMJS: 'PhantomJS',
|
||||
PHOENIX: 'Phoenix',
|
||||
PICOBROWSER: 'Pico Browser',
|
||||
POLARIS: 'Polaris',
|
||||
PUFFIN: 'Puffin',
|
||||
QQ: 'QQBrowser',
|
||||
QQ_LITE: 'QQBrowserLite',
|
||||
QUARK: 'Quark',
|
||||
QUPZILLA: 'QupZilla',
|
||||
QUTEBROWSER: 'qutebrowser',
|
||||
QWANT: 'Qwant',
|
||||
REKONQ: 'rekonq',
|
||||
ROCKMELT: 'Rockmelt',
|
||||
SAFARI: 'Safari',
|
||||
SAFARI_MOBILE: 'Mobile Safari',
|
||||
SAILFISH: 'Sailfish Browser',
|
||||
SAMSUNG: 'Samsung Internet',
|
||||
SEAMONKEY: 'SeaMonkey',
|
||||
SILK: 'Silk',
|
||||
SKYFIRE: 'Skyfire',
|
||||
SLEIPNIR: 'Sleipnir',
|
||||
SLIMBOAT: 'SlimBoat',
|
||||
SLIMBROWSER: 'SlimBrowser',
|
||||
SLIMJET: 'Slimjet',
|
||||
SNAPCHAT: 'Snapchat',
|
||||
SOGOU_EXPLORER: 'Sogou Explorer',
|
||||
SOGOU_MOBILE: 'Sogou Mobile',
|
||||
SURF: 'Surf',
|
||||
SWIFTFOX: 'Swiftfox',
|
||||
TESLA: 'Tesla',
|
||||
TIKTOK: 'TikTok',
|
||||
TIZEN: 'Tizen Browser',
|
||||
TWITTER: 'Twitter',
|
||||
UC: 'UCBrowser',
|
||||
UP: 'UP.Browser',
|
||||
VIVALDI: 'Vivaldi',
|
||||
VIVO: 'Vivo Browser',
|
||||
W3M: 'w3m',
|
||||
WATERFOX: 'Waterfox',
|
||||
WEBKIT: 'WebKit',
|
||||
WECHAT: 'WeChat',
|
||||
WEIBO: 'Weibo',
|
||||
WHALE: 'Whale',
|
||||
WOLVIC: 'Wolvic',
|
||||
YANDEX: 'Yandex',
|
||||
ZALO: 'Zalo'
|
||||
|
||||
// TODO : test!
|
||||
}>;
|
||||
/**
|
||||
* @deprecated Use `BrowserName` instead
|
||||
*/
|
||||
export const Browser: typeof BrowserName;
|
||||
|
||||
export const BrowserType: Readonly<{
|
||||
CRAWLER: 'crawler',
|
||||
CLI: 'cli',
|
||||
EMAIL: 'email',
|
||||
FETCHER: 'fetcher',
|
||||
INAPP: 'inapp',
|
||||
MEDIAPLAYER: 'mediaplayer',
|
||||
LIBRARY: 'library'
|
||||
}>;
|
||||
|
||||
export const CPUArch: Readonly<{
|
||||
'68K': '68k',
|
||||
ALPHA: 'alpha',
|
||||
ARM : 'arm',
|
||||
ARM_64: 'arm64',
|
||||
ARM_HF: 'armhf',
|
||||
AVR: 'avr',
|
||||
AVR_32: 'avr32',
|
||||
IA64: 'ia64',
|
||||
IRIX: 'irix',
|
||||
IRIX_64: 'irix64',
|
||||
MIPS: 'mips',
|
||||
MIPS_64: 'mips64',
|
||||
PA_RISC: 'pa-risc',
|
||||
PPC: 'ppc',
|
||||
SPARC: 'sparc',
|
||||
SPARC_64: 'sparc64',
|
||||
X86: 'ia32',
|
||||
X86_64: 'amd64'
|
||||
}>;
|
||||
/**
|
||||
* @deprecated Use `CPUArch` instead
|
||||
*/
|
||||
export const CPU: typeof CPUArch;
|
||||
|
||||
export const DeviceType: Readonly<{
|
||||
CONSOLE: 'console',
|
||||
DESKTOP: 'desktop',
|
||||
EMBEDDED: 'embedded',
|
||||
MOBILE: 'mobile',
|
||||
SMARTTV: 'smarttv',
|
||||
TABLET: 'tablet',
|
||||
WEARABLE: 'wearable',
|
||||
XR: 'xr'
|
||||
}>;
|
||||
/**
|
||||
* @deprecated Use `DeviceType` instead
|
||||
*/
|
||||
export const Device: typeof DeviceType;
|
||||
|
||||
export const DeviceVendor: Readonly<{
|
||||
ACER: 'Acer',
|
||||
ADVAN: 'Advan',
|
||||
ALCATEL: 'Alcatel',
|
||||
APPLE: 'Apple',
|
||||
AMAZON: 'Amazon',
|
||||
ARCHOS: 'Archos',
|
||||
ASUS: 'ASUS',
|
||||
ATT: 'AT&T',
|
||||
BENQ: 'BenQ',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
BLU: 'BLU',
|
||||
CAT: 'Cat',
|
||||
DELL: 'Dell',
|
||||
ENERGIZER: 'Energizer',
|
||||
ESSENTIAL: 'Essential',
|
||||
FACEBOOK: 'Facebook',
|
||||
FAIRPHONE: 'Fairphone',
|
||||
GEEKSPHONE: 'GeeksPhone',
|
||||
GENERIC: 'Generic',
|
||||
GOOGLE: 'Google',
|
||||
HISENSE: 'Hisense',
|
||||
HMD: 'HMD',
|
||||
HP: 'HP',
|
||||
HTC: 'HTC',
|
||||
HUAWEI: 'Huawei',
|
||||
IMO: 'IMO',
|
||||
INFINIX: 'Infinix',
|
||||
ITEL: 'itel',
|
||||
JOLLA: 'Jolla',
|
||||
KOBO: 'Kobo',
|
||||
LAVA: 'Lava',
|
||||
LENOVO: 'Lenovo',
|
||||
LG: 'LG',
|
||||
MEIZU: 'Meizu',
|
||||
MICROMAX: 'Micromax',
|
||||
MICROSOFT: 'Microsoft',
|
||||
MOTOROLA: 'Motorola',
|
||||
NEXIAN: 'Nexian',
|
||||
NINTENDO: 'Nintendo',
|
||||
NOKIA: 'Nokia',
|
||||
NOTHING: 'Nothing',
|
||||
NVIDIA: 'Nvidia',
|
||||
ONEPLUS: 'OnePlus',
|
||||
OPPO: 'OPPO',
|
||||
OUYA: 'Ouya',
|
||||
PALM: 'Palm',
|
||||
PANASONIC: 'Panasonic',
|
||||
PEBBLE: 'Pebble',
|
||||
PHILIPS: 'Philips',
|
||||
PICO: 'Pico',
|
||||
POLYTRON: 'Polytron',
|
||||
REALME: 'Realme',
|
||||
RETROID: 'Retroid',
|
||||
RIM: 'RIM',
|
||||
ROKU: 'Roku',
|
||||
SAMSUNG: 'Samsung',
|
||||
SHARP: 'Sharp',
|
||||
SIEMENS: 'Siemens',
|
||||
SMARTFREN: 'Smartfren',
|
||||
SONY: 'Sony',
|
||||
SPRINT: 'Sprint',
|
||||
TCL: 'TCL',
|
||||
TECHNISAT: 'TechniSAT',
|
||||
TECNO: 'TECNO',
|
||||
TESLA: 'Tesla',
|
||||
ULEFONE: 'Ulefone',
|
||||
VIVO: 'Vivo',
|
||||
VIZIO: 'Vizio',
|
||||
VODAFONE: 'Vodafone',
|
||||
WIKO: 'Wiko',
|
||||
XBOX: 'Xbox',
|
||||
XIAOMI: 'Xiaomi',
|
||||
ZEBRA: 'Zebra',
|
||||
ZTE: 'ZTE',
|
||||
|
||||
// TODO : test!
|
||||
}>;
|
||||
/**
|
||||
* @deprecated Use `DeviceVendor` instead
|
||||
*/
|
||||
export const Vendor: typeof DeviceVendor;
|
||||
|
||||
export const EngineName: Readonly<{
|
||||
AMAYA: 'Amaya',
|
||||
ARKWEB: 'ArkWeb',
|
||||
BLINK: 'Blink',
|
||||
EDGEHTML: 'EdgeHTML',
|
||||
FLOW: 'Flow',
|
||||
GECKO: 'Gecko',
|
||||
GOANNA: 'Goanna',
|
||||
ICAB: 'iCab',
|
||||
KHTML: 'KHTML',
|
||||
LIBWEB: 'LibWeb',
|
||||
LINKS: 'Links',
|
||||
LYNX: 'Lynx',
|
||||
NETFRONT: 'NetFront',
|
||||
NETSURF: 'NetSurf',
|
||||
PRESTO: 'Presto',
|
||||
SERVO: 'Servo',
|
||||
TASMAN: 'Tasman',
|
||||
TRIDENT: 'Trident',
|
||||
W3M: 'w3m',
|
||||
WEBKIT: 'WebKit'
|
||||
}>;
|
||||
/**
|
||||
* @deprecated Use `EngineName` instead
|
||||
*/
|
||||
export const Engine: typeof EngineName;
|
||||
|
||||
export const OSName: Readonly<{
|
||||
AIX: 'AIX',
|
||||
AMIGA_OS: 'Amiga OS',
|
||||
ANDROID: 'Android',
|
||||
ANDROID_X86: 'Android-x86',
|
||||
ARCAOS: 'ArcaOS',
|
||||
ARCH: 'Arch',
|
||||
BADA: 'Bada',
|
||||
BEOS: 'BeOS',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
CENTOS: 'CentOS',
|
||||
CHROME_OS: 'Chrome OS',
|
||||
CHROMECAST: 'Chromecast',
|
||||
CHROMECAST_ANDROID: 'Chromecast Android',
|
||||
CHROMECAST_FUCHSIA: 'Chromecast Fuchsia',
|
||||
CHROMECAST_LINUX: 'Chromecast Linux',
|
||||
CHROMECAST_SMARTSPEAKER: 'Chromecast SmartSpeaker',
|
||||
CONTIKI: 'Contiki',
|
||||
DEBIAN: 'Debian',
|
||||
DEEPIN: 'Deepin',
|
||||
DRAGONFLY: 'DragonFly',
|
||||
ELEMENTARY_OS: 'elementary OS',
|
||||
FEDORA: 'Fedora',
|
||||
FIREFOX_OS: 'Firefox OS',
|
||||
FREEBSD: 'FreeBSD',
|
||||
FUCHSIA: 'Fuchsia',
|
||||
GENTOO: 'Gentoo',
|
||||
GHOSTBSD: 'GhostBSD',
|
||||
GNU: 'GNU',
|
||||
HAIKU: 'Haiku',
|
||||
HARMONYOS: 'HarmonyOS',
|
||||
HP_UX: 'HP-UX',
|
||||
HURD: 'Hurd',
|
||||
IOS: 'iOS',
|
||||
JOLI: 'Joli',
|
||||
KAIOS: 'KaiOS',
|
||||
KNOPPIX: 'Knoppix',
|
||||
KUBUNTU: 'Kubuntu',
|
||||
LINPUS: 'Linpus',
|
||||
LINSPIRE: 'Linspire',
|
||||
LINUX: 'Linux',
|
||||
MACOS: 'macOS',
|
||||
MAEMO: 'Maemo',
|
||||
MAGEIA: 'Mageia',
|
||||
MANDRIVA: 'Mandriva',
|
||||
MANJARO: 'Manjaro',
|
||||
MEEGO: 'MeeGo',
|
||||
MINIX: 'Minix',
|
||||
MINT: 'Mint',
|
||||
MORPH_OS: 'Morph OS',
|
||||
NETBSD: 'NetBSD',
|
||||
NETRANGE: 'NetRange',
|
||||
NETTV: 'NetTV',
|
||||
NINTENDO: 'Nintendo',
|
||||
OPENHARMONY: 'OpenHarmony',
|
||||
OPENBSD: 'OpenBSD',
|
||||
OPENVMS: 'OpenVMS',
|
||||
OS2: 'OS/2',
|
||||
PALM: 'Palm',
|
||||
PC_BSD: 'PC-BSD',
|
||||
PCLINUXOS: 'PCLinuxOS',
|
||||
PICO: 'Pico',
|
||||
PLAN9: 'Plan9',
|
||||
PLAYSTATION: 'PlayStation',
|
||||
QNX: 'QNX',
|
||||
RASPBIAN: 'Raspbian',
|
||||
REDHAT: 'RedHat',
|
||||
RIM_TABLET_OS: 'RIM Tablet OS',
|
||||
RISC_OS: 'RISC OS',
|
||||
SABAYON: 'Sabayon',
|
||||
SAILFISH: 'Sailfish',
|
||||
SERENITYOS: 'SerenityOS',
|
||||
SERIES40: 'Series40',
|
||||
SLACKWARE: 'Slackware',
|
||||
SOLARIS: 'Solaris',
|
||||
SUSE: 'SUSE',
|
||||
SYMBIAN: 'Symbian',
|
||||
TIZEN: 'Tizen',
|
||||
UBUNTU: 'Ubuntu',
|
||||
UBUNTU_TOUCH: 'Ubuntu Touch',
|
||||
UNIX: 'Unix',
|
||||
VECTORLINUX: 'VectorLinux',
|
||||
WATCHOS: 'watchOS',
|
||||
WEBOS: 'WebOS',
|
||||
WINDOWS: 'Windows',
|
||||
WINDOWS_CE: 'Windows CE',
|
||||
WINDOWS_IOT: 'Windows IoT',
|
||||
WINDOWS_MOBILE: 'Windows Mobile',
|
||||
WINDOWS_PHONE: 'Windows Phone',
|
||||
WINDOWS_RT: 'Windows RT',
|
||||
XBOX: 'Xbox',
|
||||
XUBUNTU: 'Xubuntu',
|
||||
ZENWALK: 'Zenwalk'
|
||||
|
||||
// TODO : test!
|
||||
}>;
|
||||
/**
|
||||
* @deprecated Use `OSName` instead
|
||||
*/
|
||||
export const OS: typeof OSName;
|
||||
|
||||
/*////////////////////////////////
|
||||
* Enums for Extensions submodule
|
||||
*///////////////////////////////
|
||||
|
||||
export const Extension: Readonly<{
|
||||
BrowserName: {
|
||||
CLI: {
|
||||
CURL: 'curl',
|
||||
ELINKS: 'ELinks',
|
||||
HTTPIE: 'HTTPie',
|
||||
LYNX: 'Lynx',
|
||||
WGET: 'Wget'
|
||||
},
|
||||
Crawler: {
|
||||
AHREFS_BOT: 'AhrefsBot',
|
||||
AI2_BOT: 'AI2Bot',
|
||||
AIHIT_BOT: 'aiHitBot',
|
||||
ALGOLIA_CRAWLER: 'Algolia Crawler',
|
||||
APPLE_BOT: 'Applebot',
|
||||
APPLE_BOT_EXTENDED: 'Applebot-Extended',
|
||||
ASK_TEOMA: 'Teoma',
|
||||
AMAZON_BOT: 'Amazonbot',
|
||||
AMAZON_CONTXBOT: 'contxbot',
|
||||
ANTHROPIC_AI: 'anthropic-ai',
|
||||
ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',
|
||||
ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',
|
||||
ANTHROPIC_CLAUDE_WEB: 'Claude-Web',
|
||||
ARCHIVEORG_BOT: 'archive.org_bot',
|
||||
BAIDU_ADS: 'Baidu-ADS',
|
||||
BAIDU_SPIDER: 'Baiduspider',
|
||||
BAIDU_SPIDER_ADS: 'Baiduspider-ads',
|
||||
BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',
|
||||
BAIDU_SPIDER_FAVO: 'Baiduspider-favo',
|
||||
BAIDU_SPIDER_IMAGE: 'Baiduspider-image',
|
||||
BAIDU_SPIDER_NEWS: 'Baiduspider-news',
|
||||
BAIDU_SPIDER_RENDER: 'Baiduspider-render',
|
||||
BAIDU_SPIDER_VIDEO: 'Baiduspider-video',
|
||||
BLEX_BOT: 'BLEXBot',
|
||||
BOTIFY: 'botify',
|
||||
BRAVE_BOT: 'Bravebot',
|
||||
BYTEDANCE_BYTESPIDER: 'Bytespider',
|
||||
BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',
|
||||
COMMON_CRAWL_CCBOT: 'CCBot',
|
||||
COCCOC_BOT_WEB: 'coccocbot-web',
|
||||
COCCOC_BOT_IMAGE: 'coccocbot-image',
|
||||
COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',
|
||||
COTOYOGI: 'Cotoyogi',
|
||||
COVEO_BOT: 'Coveobot',
|
||||
CRITEO_BOT: 'CriteoBot',
|
||||
DATAFORSEO_BOT: 'DataForSeoBot',
|
||||
DAUM: 'Daum',
|
||||
DAUM_DAUMOA: 'Daumoa',
|
||||
DAUM_DAUMOA_IMAGE: 'Daumoa-image',
|
||||
DEEPSEEK_BOT: 'DeepSeekBot',
|
||||
DIFFBOT: 'Diffbot',
|
||||
DUCKDUCKGO_BOT: 'DuckDuckBot',
|
||||
DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',
|
||||
ELASTIC: 'Elastic',
|
||||
ELASTIC_SWIFTYPE_BOT: 'Swiftbot',
|
||||
EXALEAD_EXABOT: 'Exabot',
|
||||
FIRECRAWL_AGENT: 'FirecrawlAgent',
|
||||
FREESPOKE: 'Freespoke',
|
||||
GOOGLE_ADSBOT: 'AdsBot-Google',
|
||||
GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',
|
||||
GOOGLE_ADSENSE: 'AdSense',
|
||||
GOOGLE_APIS: 'APIs-Google',
|
||||
GOOGLE_BOT: 'Googlebot',
|
||||
GOOGLE_BOT_IMAGE: 'Googlebot-Image',
|
||||
GOOGLE_BOT_NEWS: 'Googlebot-News',
|
||||
GOOGLE_BOT_VIDEO: 'Googlebot-Video',
|
||||
GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',
|
||||
GOOGLE_EXTENDED: 'Google-Extended',
|
||||
GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',
|
||||
GOOGLE_OTHER: 'GoogleOther',
|
||||
GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',
|
||||
GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',
|
||||
GOOGLE_SAFETY: 'Google-Safety',
|
||||
GOOGLE_STOREBOT: 'Storebot-Google',
|
||||
HIVE_IMAGESIFTBOT: 'ImagesiftBot',
|
||||
HUAWEI_PANGUBOT: 'PanguBot',
|
||||
HUAWEI_PETALBOT: 'PetalBot',
|
||||
HUGGINGFACE_BOT: 'HuggingFace-Bot',
|
||||
HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',
|
||||
IA_ARCHIVER: 'ia_archiver',
|
||||
IASK_BOT: 'iAskBot',
|
||||
KAGI_BOT: 'Kagibot',
|
||||
KANGAROO_BOT: 'Kangaroo Bot',
|
||||
LINE_SPIDER: 'Linespider',
|
||||
LINKEDIN_BOT: 'LinkedInBot',
|
||||
MAGPIE_CRAWLER: 'magpie-crawler',
|
||||
MARGINALIA: 'marginalia',
|
||||
META_EXTERNALAGENT: 'meta-externalagent',
|
||||
META_FACEBOOKBOT: 'FacebookBot',
|
||||
META_FACEBOOKCATALOG: 'facebookcatalog',
|
||||
META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',
|
||||
MAJESTIC_MJ12BOT: 'MJ12bot',
|
||||
MICROSOFT_BINGBOT: 'Bingbot',
|
||||
MICROSOFT_MSNBOT: 'msnbot',
|
||||
MICROSOFT_ADIDXBOT: 'adidxbot',
|
||||
MOJEEK_BOT: 'MojeekBot',
|
||||
MOZ_DOTBOT: 'DotBot',
|
||||
ONCRAWL: 'OnCrawl',
|
||||
ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',
|
||||
OPENAI_GPTBOT: 'GPTBot',
|
||||
OPENAI_SEARCH_BOT: 'OAI-SearchBot',
|
||||
PERPLEXITY_BOT: 'PerplexityBot',
|
||||
QIHOO_360_SPIDER: '360Spider',
|
||||
QWANT_BOT: 'Qwantbot',
|
||||
QWANT_BOT_NEWS: 'Qwantbot-news',
|
||||
REPLICATE_BOT: 'Replicate-Bot',
|
||||
RUNPOD_BOT: 'RunPod-Bot',
|
||||
SB_INTUITIONS_BOT: 'SBIntuitionsBot',
|
||||
SEEKPORT_BOT: 'SeekportBot',
|
||||
SEMRUSH_BOT: 'SemrushBot',
|
||||
SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',
|
||||
SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',
|
||||
SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',
|
||||
SEZNAM_BOT: 'SeznamBot',
|
||||
SITEIMPROVE: 'Siteimprove',
|
||||
SOGOU_PIC_SPIDER: 'Sogou Pic Spider',
|
||||
SOGOU_WEB_SPIDER: 'Sogou web spider',
|
||||
STARTPAGE: 'Startpage',
|
||||
SURLY_BOT: 'SurdotlyBot',
|
||||
TIMPI_BOT: 'Timpibot',
|
||||
TOGETHER_BOT: 'Together-Bot',
|
||||
TURNITIN_BOT: 'TurnitinBot',
|
||||
TWIN_AGENT: 'TwinAgent',
|
||||
VERCEL_V0BOT: 'v0bot',
|
||||
WEBZIO: 'webzio',
|
||||
WEBZIO_EXTENDED: 'Webzio-Extended',
|
||||
WEBZIO_OMGILI: 'omgili',
|
||||
WEBZIO_OMGILI_BOT: 'omgilibot',
|
||||
XAI_BOT: 'xAI-Bot',
|
||||
YAHOO_JAPAN: 'Y!J-BRW',
|
||||
YAHOO_SLURP: 'Yahoo! Slurp',
|
||||
YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',
|
||||
YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',
|
||||
YANDEX_ADNET: 'YandexAdNet',
|
||||
YANDEX_BLOGS: 'YandexBlogs',
|
||||
YANDEX_BOT: 'YandexBot',
|
||||
YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',
|
||||
YANDEX_COMBOT: 'YandexComBot',
|
||||
YANDEX_FAVICONS: 'YandexFavicons',
|
||||
YANDEX_IMAGE_RESIZER: 'YandexImageResizer',
|
||||
YANDEX_IMAGES: 'YandexImages',
|
||||
YANDEX_MARKET: 'YandexMarket',
|
||||
YANDEX_MEDIA: 'YandexMedia',
|
||||
YANDEX_METRIKA: 'YandexMetrika',
|
||||
YANDEX_MOBILE_BOT: 'YandexMobileBot',
|
||||
YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',
|
||||
YANDEX_NEWS: 'YandexNews',
|
||||
YANDEX_ONTODB: 'YandexOntoDB',
|
||||
YANDEX_ONTODB_API: 'YandexOntoDBAPI',
|
||||
YANDEX_PARTNER: 'YandexPartner',
|
||||
YANDEX_RCA: 'YandexRCA',
|
||||
YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',
|
||||
YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',
|
||||
YANDEX_SPRAV_BOT: 'YandexSpravBot',
|
||||
YANDEX_TRACKER: 'YandexTracker',
|
||||
YANDEX_VERTICALS: 'YandexVerticals',
|
||||
YANDEX_VERTIS: 'YandexVertis',
|
||||
YANDEX_VIDEO: 'YandexVideo',
|
||||
YANDEX_VIDEO_PARSER: 'YandexVideoParser',
|
||||
YANDEX_WEBMASTER: 'YandexWebmaster',
|
||||
YEP_BOT: 'YepBot',
|
||||
YETI: 'Yeti',
|
||||
YISOU_SPIDER: 'YisouSpider',
|
||||
YOU_BOT: 'YouBot',
|
||||
ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',
|
||||
ZUM_BOT: 'ZumBot'
|
||||
},
|
||||
Email: {
|
||||
AIRMAIL: 'Airmail',
|
||||
APPLE_MAIL: 'Mail',
|
||||
BLUEMAIL: 'BlueMail',
|
||||
DAUM_MAIL: 'DaumMail',
|
||||
EVOLUTION: 'Evolution',
|
||||
EM_CLIENT: 'eM Client',
|
||||
FOXMAIL: 'Foxmail',
|
||||
KMAIL: 'KMail',
|
||||
KMAIL2: 'kmail2',
|
||||
KONTACT: 'Kontact',
|
||||
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
|
||||
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
|
||||
NAVER_MAILAPP: 'NaverMailApp',
|
||||
POLYMAIL: 'Polymail',
|
||||
PROTON_MAIL: 'ProtonMail',
|
||||
SPARK_MAIL: 'SparkDesktop',
|
||||
SPARROW: 'Sparrow',
|
||||
THUNDERBIRD: 'Thunderbird',
|
||||
YAHOO_MAIL: 'Yahoo',
|
||||
ZIMBRA: 'Zimbra',
|
||||
ZOHO_MAIL: 'ZohoMail-Desktop'
|
||||
},
|
||||
Fetcher: {
|
||||
AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
|
||||
ANTHROPIC_CLAUDE_USER: 'Claude-User',
|
||||
ASANA: 'Asana',
|
||||
BETTER_UPTIME_BOT: 'Better Uptime Bot',
|
||||
BITLY_BOT: 'bitlybot',
|
||||
BLUESKY: 'Bluesky',
|
||||
BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',
|
||||
COHERE_AI: 'Cohere-AI',
|
||||
DISCORD_BOT: 'Discordbot',
|
||||
DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',
|
||||
GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',
|
||||
GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',
|
||||
GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',
|
||||
GOOGLE_IMAGEPROXY: 'GoogleImageProxy',
|
||||
GOOGLE_PAGERENDERER: 'Google-PageRenderer',
|
||||
GOOGLE_READ_ALOUD: 'Google-Read-Aloud',
|
||||
GOOGLE_PRODUCER: 'GoogleProducer',
|
||||
GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',
|
||||
HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',
|
||||
IFRAMELY: 'Iframely',
|
||||
KAKAOTALK_SCRAP: 'kakaotalk-scrap',
|
||||
KEYBASE_BOT: 'KeybaseBot',
|
||||
META_EXTERNALFETCHER: 'meta-externalfetcher',
|
||||
META_WHATSAPP: 'WhatsApp',
|
||||
MICROSOFT_BINGPREVIEW: 'BingPreview',
|
||||
MICROSOFT_PREVIEW: 'MicrosoftPreview',
|
||||
MISTRALAI_USER: 'MistralAI-User',
|
||||
NAVER_BLUENO: 'Blueno',
|
||||
ONCRAWL_ROGERBOT: 'rogerbot',
|
||||
OPENAI_CHATGPT_USER: 'ChatGPT-User',
|
||||
PERPLEXITY_USER: 'Perplexity-User',
|
||||
PINTEREST_BOT: 'Pinterestbot',
|
||||
SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',
|
||||
SLACK_BOT: 'Slackbot',
|
||||
SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',
|
||||
SLACK_IMGPROXY: 'Slack-ImgProxy',
|
||||
SNAP_URL_PREVIEW: 'Snap URL Preview',
|
||||
SKYPE_URIPREVIEW: 'SkypeUriPreview',
|
||||
TELEGRAM_BOT: 'TelegramBot',
|
||||
UPTIMEROBOT: 'UptimeRobot',
|
||||
VERCEL_FAVICON_BOT: 'vercel-favicon-bot',
|
||||
VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',
|
||||
VERCEL_BOT: 'Vercelbot',
|
||||
VERCEL_FLAGS: 'vercelflags',
|
||||
VERCEL_TRACING: 'verceltracing',
|
||||
X_TWITTERBOT: 'Twitterbot',
|
||||
YANDEX_CALENDAR: 'YandexCalendar',
|
||||
YANDEX_DIRECT: 'YandexDirect',
|
||||
YANDEX_DIRECTDYN: 'YandexDirectDyn',
|
||||
YANDEX_DIRECTFETCHER: 'YaDirectFetcher',
|
||||
YANDEX_FORDOMAIN: 'YandexForDomain',
|
||||
YANDEX_PAGECHECKER: 'YandexPagechecker',
|
||||
YANDEX_SEARCHSHOP: 'YandexSearchShop',
|
||||
YANDEX_SITELINKS: 'YandexSitelinks',
|
||||
YANDEX_USERPROXY: 'YandexUserproxy',
|
||||
ZOOMINFO_BOT: 'Zoombot'
|
||||
},
|
||||
InApp: {
|
||||
DISCORD: 'Discord',
|
||||
EVERNOTE: 'Evernote',
|
||||
FIGMA: 'Figma',
|
||||
FLIPBOARD: 'Flipboard',
|
||||
MATTERMOST: 'Mattermost',
|
||||
TEAMS: 'Teams',
|
||||
NOTION: 'Notion',
|
||||
POSTMAN: 'Postman',
|
||||
RAMBOX: 'Rambox',
|
||||
ROCKETCHAT: 'Rocket.Chat',
|
||||
SLACK: 'Slack',
|
||||
TIKTOK_LITE: 'TikTok Lite',
|
||||
VSCODE: 'VS Code',
|
||||
YAHOO_JAPAN: 'Yahoo! Japan'
|
||||
},
|
||||
Library: {
|
||||
ADOBE_AIR: 'AdobeAIR',
|
||||
AIOHTTP: 'aiohttp',
|
||||
APACHE_HTTPCLIENT: 'Apache-HttpClient',
|
||||
AXIOS: 'axios',
|
||||
GO_HTTP_CLIENT: 'go-http-client',
|
||||
GOT: 'got',
|
||||
GUZZLEHTTP: 'GuzzleHttp',
|
||||
JAVA: 'Java',
|
||||
JAVA_HTTPCLIENT: 'Java-http-client',
|
||||
JSDOM: 'jsdom',
|
||||
LIBWWW_PERL: 'libwww-perl',
|
||||
LUA_RESTY_HTTP: 'lua-resty-http',
|
||||
NEEDLE: 'Needle',
|
||||
NUTCH: 'Nutch',
|
||||
OKHTTP: 'OkHttp',
|
||||
NODE_FETCH: 'node-fetch',
|
||||
NODE_SUPERAGENT: 'node-superagent',
|
||||
PHP_SOAP: 'PHP-SOAP',
|
||||
POSTMAN_RUNTIME: 'PostmanRuntime',
|
||||
PYTHON_HTTPX: 'python-httpx',
|
||||
PYTHON_URLLIB: 'python-urllib',
|
||||
PYTHON_URLLIB3: 'python-urllib3',
|
||||
PYTHON_REQUESTS: 'python-requests',
|
||||
SCRAPY: 'Scrapy'
|
||||
}
|
||||
},
|
||||
DeviceVendor: {
|
||||
Vehicle: {
|
||||
BMW: 'BMW',
|
||||
BYD: 'BYD',
|
||||
JEEP: 'Jeep',
|
||||
RIVIAN: 'Rivian',
|
||||
TESLA: 'Tesla',
|
||||
VOLVO: 'Volvo'
|
||||
}
|
||||
}
|
||||
}>;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
///////////////////////////////////////////////
|
||||
/* Enums for UAParser.js v2.0.0-rc.3
|
||||
/* Enums for UAParser.js v2.0.6
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const Browser = Object.freeze({
|
||||
const BrowserName = Object.freeze({
|
||||
'115': '115',
|
||||
'2345': '2345',
|
||||
'360': '360',
|
||||
@@ -15,11 +15,13 @@ const Browser = Object.freeze({
|
||||
AMAYA: 'Amaya',
|
||||
ANDROID: 'Android Browser',
|
||||
ARORA: 'Arora',
|
||||
ATLAS: 'Atlas',
|
||||
AVANT: 'Avant',
|
||||
AVAST: 'Avast Secure Browser',
|
||||
AVG: 'AVG Secure Browser',
|
||||
BAIDU: 'Baidu Browser',
|
||||
BASILISK: 'Basilisk',
|
||||
BING: 'Bing',
|
||||
BLAZER: 'Blazer',
|
||||
BOLT: 'Bolt',
|
||||
BOWSER: 'Bowser',
|
||||
@@ -34,12 +36,17 @@ const Browser = Object.freeze({
|
||||
COBALT: 'Cobalt',
|
||||
COC_COC: 'Coc Coc',
|
||||
CONKEROR: 'Conkeror',
|
||||
DAUM: 'Daum',
|
||||
DILLO: 'Dillo',
|
||||
DOLPHIN: 'Dolphin',
|
||||
DOOBLE: 'Dooble',
|
||||
DORIS: 'Doris',
|
||||
DRAGON: 'Dragon',
|
||||
DUCKDUCKGO: 'DuckDuckGo',
|
||||
ECOSIA: 'Ecosia',
|
||||
EDGE: 'Edge',
|
||||
EDGE_WEBVIEW: 'Edge WebView',
|
||||
EDGE_WEBVIEW2: 'Edge WebView2',
|
||||
EPIPHANY: 'Epiphany',
|
||||
FACEBOOK: 'Facebook',
|
||||
FALKON: 'Falkon',
|
||||
@@ -76,6 +83,8 @@ const Browser = Object.freeze({
|
||||
KLARNA: 'Klarna',
|
||||
KINDLE: 'Kindle',
|
||||
LENOVO: 'Smart Lenovo Browser',
|
||||
LADYBIRD: 'Ladybird',
|
||||
LG: 'LG Browser',
|
||||
LIBREWOLF: 'LibreWolf',
|
||||
LIEBAO: 'LBBROWSER',
|
||||
LINE: 'Line',
|
||||
@@ -100,10 +109,12 @@ const Browser = Object.freeze({
|
||||
OMNIWEB: 'OmniWeb',
|
||||
OPERA: 'Opera',
|
||||
OPERA_COAST: 'Opera Coast',
|
||||
OPERA_GX: 'Opera GX',
|
||||
OPERA_MINI: 'Opera Mini',
|
||||
OPERA_MOBI: 'Opera Mobi',
|
||||
OPERA_TABLET: 'Opera Tablet',
|
||||
OPERA_TOUCH: 'Opera Touch',
|
||||
OTTER: 'Otter',
|
||||
OVI: 'OviBrowser',
|
||||
PALEMOON: 'PaleMoon',
|
||||
PHANTOMJS: 'PhantomJS',
|
||||
@@ -115,6 +126,8 @@ const Browser = Object.freeze({
|
||||
QQ_LITE: 'QQBrowserLite',
|
||||
QUARK: 'Quark',
|
||||
QUPZILLA: 'QupZilla',
|
||||
QUTEBROWSER: 'qutebrowser',
|
||||
QWANT: 'Qwant',
|
||||
REKONQ: 'rekonq',
|
||||
ROCKMELT: 'Rockmelt',
|
||||
SAFARI: 'Safari',
|
||||
@@ -131,6 +144,7 @@ const Browser = Object.freeze({
|
||||
SNAPCHAT: 'Snapchat',
|
||||
SOGOU_EXPLORER: 'Sogou Explorer',
|
||||
SOGOU_MOBILE: 'Sogou Mobile',
|
||||
SURF: 'Surf',
|
||||
SWIFTFOX: 'Swiftfox',
|
||||
TESLA: 'Tesla',
|
||||
TIKTOK: 'TikTok',
|
||||
@@ -147,10 +161,15 @@ const Browser = Object.freeze({
|
||||
WEIBO: 'Weibo',
|
||||
WHALE: 'Whale',
|
||||
WOLVIC: 'Wolvic',
|
||||
YANDEX: 'Yandex'
|
||||
YANDEX: 'Yandex',
|
||||
ZALO: 'Zalo'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `BrowserName` instead
|
||||
*/
|
||||
const Browser = BrowserName;
|
||||
|
||||
const BrowserType = Object.freeze({
|
||||
CRAWLER: 'crawler',
|
||||
@@ -162,8 +181,9 @@ const BrowserType = Object.freeze({
|
||||
LIBRARY: 'library'
|
||||
});
|
||||
|
||||
const CPU = Object.freeze({
|
||||
const CPUArch = Object.freeze({
|
||||
'68K': '68k',
|
||||
ALPHA: 'alpha',
|
||||
ARM : 'arm',
|
||||
ARM_64: 'arm64',
|
||||
ARM_HF: 'armhf',
|
||||
@@ -181,8 +201,12 @@ const CPU = Object.freeze({
|
||||
X86: 'ia32',
|
||||
X86_64: 'amd64'
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `CPUArch` instead
|
||||
*/
|
||||
const CPU = CPUArch;
|
||||
|
||||
const Device = Object.freeze({
|
||||
const DeviceType = Object.freeze({
|
||||
CONSOLE: 'console',
|
||||
DESKTOP: 'desktop',
|
||||
EMBEDDED: 'embedded',
|
||||
@@ -192,18 +216,24 @@ const Device = Object.freeze({
|
||||
WEARABLE: 'wearable',
|
||||
XR: 'xr'
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `DeviceType` instead
|
||||
*/
|
||||
const Device = DeviceType;
|
||||
|
||||
const Vendor = Object.freeze({
|
||||
const DeviceVendor = Object.freeze({
|
||||
ACER: 'Acer',
|
||||
ADVAN: 'Advan',
|
||||
ALCATEL: 'Alcatel',
|
||||
APPLE: 'Apple',
|
||||
AMAZON: 'Amazon',
|
||||
ANBERNIC: 'Anbernic',
|
||||
APPLE: 'Apple',
|
||||
ARCHOS: 'Archos',
|
||||
ASUS: 'ASUS',
|
||||
ATT: 'AT&T',
|
||||
BENQ: 'BenQ',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
BLU: 'BLU',
|
||||
CAT: 'Cat',
|
||||
DELL: 'Dell',
|
||||
ENERGIZER: 'Energizer',
|
||||
@@ -213,6 +243,8 @@ const Vendor = Object.freeze({
|
||||
GEEKSPHONE: 'GeeksPhone',
|
||||
GENERIC: 'Generic',
|
||||
GOOGLE: 'Google',
|
||||
HISENSE: 'Hisense',
|
||||
HMD: 'HMD',
|
||||
HP: 'HP',
|
||||
HTC: 'HTC',
|
||||
HUAWEI: 'Huawei',
|
||||
@@ -221,8 +253,10 @@ const Vendor = Object.freeze({
|
||||
ITEL: 'itel',
|
||||
JOLLA: 'Jolla',
|
||||
KOBO: 'Kobo',
|
||||
LAVA: 'Lava',
|
||||
LENOVO: 'Lenovo',
|
||||
LG: 'LG',
|
||||
LOGITECH: 'Logitech',
|
||||
MEIZU: 'Meizu',
|
||||
MICROMAX: 'Micromax',
|
||||
MICROSOFT: 'Microsoft',
|
||||
@@ -238,9 +272,11 @@ const Vendor = Object.freeze({
|
||||
PALM: 'Palm',
|
||||
PANASONIC: 'Panasonic',
|
||||
PEBBLE: 'Pebble',
|
||||
PHILIPS: 'Philips',
|
||||
PICO: 'Pico',
|
||||
POLYTRON: 'Polytron',
|
||||
REALME: 'Realme',
|
||||
RETROID: 'Retroid',
|
||||
RIM: 'RIM',
|
||||
ROKU: 'Roku',
|
||||
SAMSUNG: 'Samsung',
|
||||
@@ -251,11 +287,13 @@ const Vendor = Object.freeze({
|
||||
SPRINT: 'Sprint',
|
||||
TCL: 'TCL',
|
||||
TECHNISAT: 'TechniSAT',
|
||||
TECNO: 'Tecno',
|
||||
TECNO: 'TECNO',
|
||||
TESLA: 'Tesla',
|
||||
ULEFONE: 'Ulefone',
|
||||
VIVO: 'Vivo',
|
||||
VIZIO: 'Vizio',
|
||||
VODAFONE: 'Vodafone',
|
||||
WIKO: 'Wiko',
|
||||
XBOX: 'Xbox',
|
||||
XIAOMI: 'Xiaomi',
|
||||
ZEBRA: 'Zebra',
|
||||
@@ -263,8 +301,12 @@ const Vendor = Object.freeze({
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `DeviceVendor` instead
|
||||
*/
|
||||
const Vendor = DeviceVendor;
|
||||
|
||||
const Engine = Object.freeze({
|
||||
const EngineName = Object.freeze({
|
||||
AMAYA: 'Amaya',
|
||||
ARKWEB: 'ArkWeb',
|
||||
BLINK: 'Blink',
|
||||
@@ -286,12 +328,17 @@ const Engine = Object.freeze({
|
||||
W3M: 'w3m',
|
||||
WEBKIT: 'WebKit'
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `EngineName` instead
|
||||
*/
|
||||
const Engine = EngineName;
|
||||
|
||||
const OS = Object.freeze({
|
||||
const OSName = Object.freeze({
|
||||
AIX: 'AIX',
|
||||
AMIGA_OS: 'Amiga OS',
|
||||
ANDROID: 'Android',
|
||||
ANDROID_X86: 'Android-x86',
|
||||
ARCAOS: 'ArcaOS',
|
||||
ARCH: 'Arch',
|
||||
BADA: 'Bada',
|
||||
BEOS: 'BeOS',
|
||||
@@ -322,6 +369,8 @@ const OS = Object.freeze({
|
||||
IOS: 'iOS',
|
||||
JOLI: 'Joli',
|
||||
KAIOS: 'KaiOS',
|
||||
KNOPPIX: 'Knoppix',
|
||||
KUBUNTU: 'Kubuntu',
|
||||
LINPUS: 'Linpus',
|
||||
LINSPIRE: 'Linspire',
|
||||
LINUX: 'Linux',
|
||||
@@ -363,25 +412,356 @@ const OS = Object.freeze({
|
||||
SYMBIAN: 'Symbian',
|
||||
TIZEN: 'Tizen',
|
||||
UBUNTU: 'Ubuntu',
|
||||
UBUNTU_TOUCH: 'Ubuntu Touch',
|
||||
UNIX: 'Unix',
|
||||
VECTORLINUX: 'VectorLinux',
|
||||
WATCHOS: 'watchOS',
|
||||
WEBOS: 'WebOS',
|
||||
WINDOWS: 'Windows',
|
||||
WINDOWS_CE: 'Windows CE',
|
||||
WINDOWS_IOT: 'Windows IoT',
|
||||
WINDOWS_MOBILE: 'Windows Mobile',
|
||||
WINDOWS_PHONE: 'Windows Phone',
|
||||
WINDOWS_RT: 'Windows RT',
|
||||
XBOX: 'Xbox',
|
||||
XUBUNTU: 'Xubuntu',
|
||||
ZENWALK: 'Zenwalk'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `OSName` instead
|
||||
*/
|
||||
const OS = OSName;
|
||||
|
||||
/*////////////////////////////////
|
||||
* Enums for Extensions submodule
|
||||
*///////////////////////////////
|
||||
|
||||
const Extension = Object.freeze({
|
||||
BrowserName: {
|
||||
CLI: {
|
||||
CURL: 'curl',
|
||||
ELINKS: 'ELinks',
|
||||
HTTPIE: 'HTTPie',
|
||||
LYNX: 'Lynx',
|
||||
WGET: 'Wget'
|
||||
},
|
||||
Crawler: {
|
||||
AHREFS_BOT: 'AhrefsBot',
|
||||
AI2_BOT: 'AI2Bot',
|
||||
AIHIT_BOT: 'aiHitBot',
|
||||
ALGOLIA_CRAWLER: 'Algolia Crawler',
|
||||
APPLE_BOT: 'Applebot',
|
||||
APPLE_BOT_EXTENDED: 'Applebot-Extended',
|
||||
ASK_TEOMA: 'Teoma',
|
||||
AMAZON_BOT: 'Amazonbot',
|
||||
AMAZON_CONTXBOT: 'contxbot',
|
||||
ANTHROPIC_AI: 'anthropic-ai',
|
||||
ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',
|
||||
ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',
|
||||
ANTHROPIC_CLAUDE_WEB: 'Claude-Web',
|
||||
ARCHIVEORG_BOT: 'archive.org_bot',
|
||||
BAIDU_ADS: 'Baidu-ADS',
|
||||
BAIDU_SPIDER: 'Baiduspider',
|
||||
BAIDU_SPIDER_ADS: 'Baiduspider-ads',
|
||||
BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',
|
||||
BAIDU_SPIDER_FAVO: 'Baiduspider-favo',
|
||||
BAIDU_SPIDER_IMAGE: 'Baiduspider-image',
|
||||
BAIDU_SPIDER_NEWS: 'Baiduspider-news',
|
||||
BAIDU_SPIDER_RENDER: 'Baiduspider-render',
|
||||
BAIDU_SPIDER_VIDEO: 'Baiduspider-video',
|
||||
BLEX_BOT: 'BLEXBot',
|
||||
BOTIFY: 'botify',
|
||||
BRAVE_BOT: 'Bravebot',
|
||||
BYTEDANCE_BYTESPIDER: 'Bytespider',
|
||||
BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',
|
||||
COMMON_CRAWL_CCBOT: 'CCBot',
|
||||
COCCOC_BOT_WEB: 'coccocbot-web',
|
||||
COCCOC_BOT_IMAGE: 'coccocbot-image',
|
||||
COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',
|
||||
COTOYOGI: 'Cotoyogi',
|
||||
COVEO_BOT: 'Coveobot',
|
||||
CRITEO_BOT: 'CriteoBot',
|
||||
DATAFORSEO_BOT: 'DataForSeoBot',
|
||||
DAUM: 'Daum',
|
||||
DAUM_DAUMOA: 'Daumoa',
|
||||
DAUM_DAUMOA_IMAGE: 'Daumoa-image',
|
||||
DEEPSEEK_BOT: 'DeepSeekBot',
|
||||
DIFFBOT: 'Diffbot',
|
||||
DUCKDUCKGO_BOT: 'DuckDuckBot',
|
||||
DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',
|
||||
ELASTIC: 'Elastic',
|
||||
ELASTIC_SWIFTYPE_BOT: 'Swiftbot',
|
||||
EXALEAD_EXABOT: 'Exabot',
|
||||
FIRECRAWL_AGENT: 'FirecrawlAgent',
|
||||
FREESPOKE: 'Freespoke',
|
||||
GOOGLE_ADSBOT: 'AdsBot-Google',
|
||||
GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',
|
||||
GOOGLE_ADSENSE: 'AdSense',
|
||||
GOOGLE_APIS: 'APIs-Google',
|
||||
GOOGLE_BOT: 'Googlebot',
|
||||
GOOGLE_BOT_IMAGE: 'Googlebot-Image',
|
||||
GOOGLE_BOT_NEWS: 'Googlebot-News',
|
||||
GOOGLE_BOT_VIDEO: 'Googlebot-Video',
|
||||
GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',
|
||||
GOOGLE_EXTENDED: 'Google-Extended',
|
||||
GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',
|
||||
GOOGLE_OTHER: 'GoogleOther',
|
||||
GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',
|
||||
GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',
|
||||
GOOGLE_SAFETY: 'Google-Safety',
|
||||
GOOGLE_STOREBOT: 'Storebot-Google',
|
||||
HIVE_IMAGESIFTBOT: 'ImagesiftBot',
|
||||
HUAWEI_PANGUBOT: 'PanguBot',
|
||||
HUAWEI_PETALBOT: 'PetalBot',
|
||||
HUGGINGFACE_BOT: 'HuggingFace-Bot',
|
||||
HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',
|
||||
IA_ARCHIVER: 'ia_archiver',
|
||||
IASK_BOT: 'iAskBot',
|
||||
KAGI_BOT: 'Kagibot',
|
||||
KANGAROO_BOT: 'Kangaroo Bot',
|
||||
LINE_SPIDER: 'Linespider',
|
||||
LINKEDIN_BOT: 'LinkedInBot',
|
||||
MAGPIE_CRAWLER: 'magpie-crawler',
|
||||
MARGINALIA: 'marginalia',
|
||||
META_EXTERNALAGENT: 'meta-externalagent',
|
||||
META_FACEBOOKBOT: 'FacebookBot',
|
||||
META_FACEBOOKCATALOG: 'facebookcatalog',
|
||||
META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',
|
||||
MAJESTIC_MJ12BOT: 'MJ12bot',
|
||||
MICROSOFT_BINGBOT: 'Bingbot',
|
||||
MICROSOFT_MSNBOT: 'msnbot',
|
||||
MICROSOFT_ADIDXBOT: 'adidxbot',
|
||||
MOJEEK_BOT: 'MojeekBot',
|
||||
MOZ_DOTBOT: 'DotBot',
|
||||
ONCRAWL: 'OnCrawl',
|
||||
ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',
|
||||
OPENAI_GPTBOT: 'GPTBot',
|
||||
OPENAI_SEARCH_BOT: 'OAI-SearchBot',
|
||||
PERPLEXITY_BOT: 'PerplexityBot',
|
||||
QIHOO_360_SPIDER: '360Spider',
|
||||
QWANT_BOT: 'Qwantbot',
|
||||
QWANT_BOT_NEWS: 'Qwantbot-news',
|
||||
REPLICATE_BOT: 'Replicate-Bot',
|
||||
RUNPOD_BOT: 'RunPod-Bot',
|
||||
SB_INTUITIONS_BOT: 'SBIntuitionsBot',
|
||||
SEEKPORT_BOT: 'SeekportBot',
|
||||
SEMRUSH_BOT: 'SemrushBot',
|
||||
SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',
|
||||
SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',
|
||||
SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',
|
||||
SEZNAM_BOT: 'SeznamBot',
|
||||
SITEIMPROVE: 'Siteimprove',
|
||||
SOGOU_PIC_SPIDER: 'Sogou Pic Spider',
|
||||
SOGOU_WEB_SPIDER: 'Sogou web spider',
|
||||
STARTPAGE: 'Startpage',
|
||||
SURLY_BOT: 'SurdotlyBot',
|
||||
TIMPI_BOT: 'Timpibot',
|
||||
TOGETHER_BOT: 'Together-Bot',
|
||||
TURNITIN_BOT: 'TurnitinBot',
|
||||
TWIN_AGENT: 'TwinAgent',
|
||||
VERCEL_V0BOT: 'v0bot',
|
||||
WEBZIO: 'webzio',
|
||||
WEBZIO_EXTENDED: 'Webzio-Extended',
|
||||
WEBZIO_OMGILI: 'omgili',
|
||||
WEBZIO_OMGILI_BOT: 'omgilibot',
|
||||
XAI_BOT: 'xAI-Bot',
|
||||
YAHOO_JAPAN: 'Y!J-BRW',
|
||||
YAHOO_SLURP: 'Yahoo! Slurp',
|
||||
YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',
|
||||
YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',
|
||||
YANDEX_ADNET: 'YandexAdNet',
|
||||
YANDEX_BLOGS: 'YandexBlogs',
|
||||
YANDEX_BOT: 'YandexBot',
|
||||
YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',
|
||||
YANDEX_COMBOT: 'YandexComBot',
|
||||
YANDEX_FAVICONS: 'YandexFavicons',
|
||||
YANDEX_IMAGE_RESIZER: 'YandexImageResizer',
|
||||
YANDEX_IMAGES: 'YandexImages',
|
||||
YANDEX_MARKET: 'YandexMarket',
|
||||
YANDEX_MEDIA: 'YandexMedia',
|
||||
YANDEX_METRIKA: 'YandexMetrika',
|
||||
YANDEX_MOBILE_BOT: 'YandexMobileBot',
|
||||
YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',
|
||||
YANDEX_NEWS: 'YandexNews',
|
||||
YANDEX_ONTODB: 'YandexOntoDB',
|
||||
YANDEX_ONTODB_API: 'YandexOntoDBAPI',
|
||||
YANDEX_PARTNER: 'YandexPartner',
|
||||
YANDEX_RCA: 'YandexRCA',
|
||||
YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',
|
||||
YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',
|
||||
YANDEX_SPRAV_BOT: 'YandexSpravBot',
|
||||
YANDEX_TRACKER: 'YandexTracker',
|
||||
YANDEX_VERTICALS: 'YandexVerticals',
|
||||
YANDEX_VERTIS: 'YandexVertis',
|
||||
YANDEX_VIDEO: 'YandexVideo',
|
||||
YANDEX_VIDEO_PARSER: 'YandexVideoParser',
|
||||
YANDEX_WEBMASTER: 'YandexWebmaster',
|
||||
YEP_BOT: 'YepBot',
|
||||
YETI: 'Yeti',
|
||||
YISOU_SPIDER: 'YisouSpider',
|
||||
YOU_BOT: 'YouBot',
|
||||
ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',
|
||||
ZUM_BOT: 'ZumBot'
|
||||
},
|
||||
Email: {
|
||||
AIRMAIL: 'Airmail',
|
||||
APPLE_MAIL: 'Mail',
|
||||
BLUEMAIL: 'BlueMail',
|
||||
DAUM_MAIL: 'DaumMail',
|
||||
EVOLUTION: 'Evolution',
|
||||
EM_CLIENT: 'eM Client',
|
||||
FOXMAIL: 'Foxmail',
|
||||
KMAIL: 'KMail',
|
||||
KMAIL2: 'kmail2',
|
||||
KONTACT: 'Kontact',
|
||||
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
|
||||
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
|
||||
NAVER_MAILAPP: 'NaverMailApp',
|
||||
POLYMAIL: 'Polymail',
|
||||
PROTON_MAIL: 'ProtonMail',
|
||||
SPARK_MAIL: 'SparkDesktop',
|
||||
SPARROW: 'Sparrow',
|
||||
THUNDERBIRD: 'Thunderbird',
|
||||
YAHOO_MAIL: 'Yahoo',
|
||||
ZIMBRA: 'Zimbra',
|
||||
ZOHO_MAIL: 'ZohoMail-Desktop'
|
||||
},
|
||||
Fetcher: {
|
||||
AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
|
||||
AMAZON_NOVA_ACT: 'NovaAct',
|
||||
ANTHROPIC_CLAUDE_USER: 'Claude-User',
|
||||
ASANA: 'Asana',
|
||||
BETTER_UPTIME_BOT: 'Better Uptime Bot',
|
||||
BITLY_BOT: 'bitlybot',
|
||||
BLUESKY: 'Bluesky',
|
||||
BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',
|
||||
COHERE_AI: 'Cohere-AI',
|
||||
DISCORD_BOT: 'Discordbot',
|
||||
DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',
|
||||
GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',
|
||||
GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',
|
||||
GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',
|
||||
GOOGLE_IMAGEPROXY: 'GoogleImageProxy',
|
||||
GOOGLE_PAGERENDERER: 'Google-PageRenderer',
|
||||
GOOGLE_READ_ALOUD: 'Google-Read-Aloud',
|
||||
GOOGLE_PRODUCER: 'GoogleProducer',
|
||||
GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',
|
||||
HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',
|
||||
IFRAMELY: 'Iframely',
|
||||
KAKAOTALK_SCRAP: 'kakaotalk-scrap',
|
||||
KEYBASE_BOT: 'KeybaseBot',
|
||||
META_EXTERNALFETCHER: 'meta-externalfetcher',
|
||||
META_WHATSAPP: 'WhatsApp',
|
||||
MICROSOFT_BINGPREVIEW: 'BingPreview',
|
||||
MICROSOFT_PREVIEW: 'MicrosoftPreview',
|
||||
MISTRALAI_USER: 'MistralAI-User',
|
||||
NAVER_BLUENO: 'Blueno',
|
||||
ONCRAWL_ROGERBOT: 'rogerbot',
|
||||
OPENAI_CHATGPT_USER: 'ChatGPT-User',
|
||||
PERPLEXITY_USER: 'Perplexity-User',
|
||||
PINTEREST_BOT: 'Pinterestbot',
|
||||
SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',
|
||||
SLACK_BOT: 'Slackbot',
|
||||
SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',
|
||||
SLACK_IMGPROXY: 'Slack-ImgProxy',
|
||||
SNAP_URL_PREVIEW: 'Snap URL Preview',
|
||||
SKYPE_URIPREVIEW: 'SkypeUriPreview',
|
||||
TELEGRAM_BOT: 'TelegramBot',
|
||||
UPTIMEROBOT: 'UptimeRobot',
|
||||
VERCEL_FAVICON_BOT: 'vercel-favicon-bot',
|
||||
VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',
|
||||
VERCEL_BOT: 'Vercelbot',
|
||||
VERCEL_FLAGS: 'vercelflags',
|
||||
VERCEL_TRACING: 'verceltracing',
|
||||
X_TWITTERBOT: 'Twitterbot',
|
||||
YANDEX_CALENDAR: 'YandexCalendar',
|
||||
YANDEX_DIRECT: 'YandexDirect',
|
||||
YANDEX_DIRECTDYN: 'YandexDirectDyn',
|
||||
YANDEX_DIRECTFETCHER: 'YaDirectFetcher',
|
||||
YANDEX_FORDOMAIN: 'YandexForDomain',
|
||||
YANDEX_PAGECHECKER: 'YandexPagechecker',
|
||||
YANDEX_SEARCHSHOP: 'YandexSearchShop',
|
||||
YANDEX_SITELINKS: 'YandexSitelinks',
|
||||
YANDEX_USERPROXY: 'YandexUserproxy',
|
||||
ZOOMINFO_BOT: 'Zoombot'
|
||||
},
|
||||
InApp: {
|
||||
DISCORD: 'Discord',
|
||||
EVERNOTE: 'Evernote',
|
||||
FIGMA: 'Figma',
|
||||
FLIPBOARD: 'Flipboard',
|
||||
MATTERMOST: 'Mattermost',
|
||||
TEAMS: 'Teams',
|
||||
NOTION: 'Notion',
|
||||
POSTMAN: 'Postman',
|
||||
RAMBOX: 'Rambox',
|
||||
ROCKETCHAT: 'Rocket.Chat',
|
||||
SLACK: 'Slack',
|
||||
TIKTOK_LITE: 'TikTok Lite',
|
||||
VSCODE: 'VS Code',
|
||||
YAHOO_JAPAN: 'Yahoo! Japan'
|
||||
},
|
||||
Library: {
|
||||
ADOBE_AIR: 'AdobeAIR',
|
||||
AIOHTTP: 'aiohttp',
|
||||
APACHE_HTTPCLIENT: 'Apache-HttpClient',
|
||||
AXIOS: 'axios',
|
||||
BUN: 'Bun',
|
||||
DART: 'Dart',
|
||||
DENO: 'Deno',
|
||||
GO_HTTP_CLIENT: 'go-http-client',
|
||||
GOT: 'got',
|
||||
GUZZLEHTTP: 'GuzzleHttp',
|
||||
HACKNEY: 'hackney',
|
||||
JAVA: 'Java',
|
||||
JAVA_HTTPCLIENT: 'Java-http-client',
|
||||
JSDOM: 'jsdom',
|
||||
LIBWWW_PERL: 'libwww-perl',
|
||||
LUA_RESTY_HTTP: 'lua-resty-http',
|
||||
NEEDLE: 'Needle',
|
||||
NUTCH: 'Nutch',
|
||||
NODE_FETCH: 'node-fetch',
|
||||
NODE_JS: 'Node.js',
|
||||
NODE_SUPERAGENT: 'node-superagent',
|
||||
OKHTTP: 'OkHttp',
|
||||
PHP_SOAP: 'PHP-SOAP',
|
||||
POSTMAN_RUNTIME: 'PostmanRuntime',
|
||||
PYTHON_HTTPX: 'python-httpx',
|
||||
PYTHON_URLLIB: 'python-urllib',
|
||||
PYTHON_URLLIB3: 'python-urllib3',
|
||||
PYTHON_REQUESTS: 'python-requests',
|
||||
REST_CLIENT: 'rest-client',
|
||||
SCRAPY: 'Scrapy',
|
||||
UNDICI: 'undici'
|
||||
}
|
||||
},
|
||||
DeviceVendor: {
|
||||
Vehicle: {
|
||||
BMW: 'BMW',
|
||||
BYD: 'BYD',
|
||||
JEEP: 'Jeep',
|
||||
RIVIAN: 'Rivian',
|
||||
TESLA: 'Tesla',
|
||||
VOLVO: 'Volvo'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
Browser,
|
||||
Browser,// deprecated
|
||||
CPU, // deprecated
|
||||
Device, // deprecated
|
||||
Vendor, // deprecated
|
||||
Engine, // deprecated
|
||||
OS, // deprecated
|
||||
BrowserName,
|
||||
BrowserType,
|
||||
CPU,
|
||||
Device,
|
||||
Vendor,
|
||||
Engine,
|
||||
OS
|
||||
CPUArch,
|
||||
DeviceType,
|
||||
DeviceVendor,
|
||||
EngineName,
|
||||
OSName,
|
||||
Extension
|
||||
};
|
||||
@@ -3,7 +3,7 @@
|
||||
// Source: /src/enums/ua-parser-enums.js
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/* Enums for UAParser.js v2.0.0-rc.3
|
||||
/* Enums for UAParser.js v2.0.6
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const Browser = Object.freeze({
|
||||
const BrowserName = Object.freeze({
|
||||
'115': '115',
|
||||
'2345': '2345',
|
||||
'360': '360',
|
||||
@@ -24,6 +24,7 @@ const Browser = Object.freeze({
|
||||
AVG: 'AVG Secure Browser',
|
||||
BAIDU: 'Baidu Browser',
|
||||
BASILISK: 'Basilisk',
|
||||
BING: 'Bing',
|
||||
BLAZER: 'Blazer',
|
||||
BOLT: 'Bolt',
|
||||
BOWSER: 'Bowser',
|
||||
@@ -38,12 +39,17 @@ const Browser = Object.freeze({
|
||||
COBALT: 'Cobalt',
|
||||
COC_COC: 'Coc Coc',
|
||||
CONKEROR: 'Conkeror',
|
||||
DAUM: 'Daum',
|
||||
DILLO: 'Dillo',
|
||||
DOLPHIN: 'Dolphin',
|
||||
DOOBLE: 'Dooble',
|
||||
DORIS: 'Doris',
|
||||
DRAGON: 'Dragon',
|
||||
DUCKDUCKGO: 'DuckDuckGo',
|
||||
ECOSIA: 'Ecosia',
|
||||
EDGE: 'Edge',
|
||||
EDGE_WEBVIEW: 'Edge WebView',
|
||||
EDGE_WEBVIEW2: 'Edge WebView2',
|
||||
EPIPHANY: 'Epiphany',
|
||||
FACEBOOK: 'Facebook',
|
||||
FALKON: 'Falkon',
|
||||
@@ -80,6 +86,8 @@ const Browser = Object.freeze({
|
||||
KLARNA: 'Klarna',
|
||||
KINDLE: 'Kindle',
|
||||
LENOVO: 'Smart Lenovo Browser',
|
||||
LADYBIRD: 'Ladybird',
|
||||
LG: 'LG Browser',
|
||||
LIBREWOLF: 'LibreWolf',
|
||||
LIEBAO: 'LBBROWSER',
|
||||
LINE: 'Line',
|
||||
@@ -104,10 +112,12 @@ const Browser = Object.freeze({
|
||||
OMNIWEB: 'OmniWeb',
|
||||
OPERA: 'Opera',
|
||||
OPERA_COAST: 'Opera Coast',
|
||||
OPERA_GX: 'Opera GX',
|
||||
OPERA_MINI: 'Opera Mini',
|
||||
OPERA_MOBI: 'Opera Mobi',
|
||||
OPERA_TABLET: 'Opera Tablet',
|
||||
OPERA_TOUCH: 'Opera Touch',
|
||||
OTTER: 'Otter',
|
||||
OVI: 'OviBrowser',
|
||||
PALEMOON: 'PaleMoon',
|
||||
PHANTOMJS: 'PhantomJS',
|
||||
@@ -119,6 +129,8 @@ const Browser = Object.freeze({
|
||||
QQ_LITE: 'QQBrowserLite',
|
||||
QUARK: 'Quark',
|
||||
QUPZILLA: 'QupZilla',
|
||||
QUTEBROWSER: 'qutebrowser',
|
||||
QWANT: 'Qwant',
|
||||
REKONQ: 'rekonq',
|
||||
ROCKMELT: 'Rockmelt',
|
||||
SAFARI: 'Safari',
|
||||
@@ -135,6 +147,7 @@ const Browser = Object.freeze({
|
||||
SNAPCHAT: 'Snapchat',
|
||||
SOGOU_EXPLORER: 'Sogou Explorer',
|
||||
SOGOU_MOBILE: 'Sogou Mobile',
|
||||
SURF: 'Surf',
|
||||
SWIFTFOX: 'Swiftfox',
|
||||
TESLA: 'Tesla',
|
||||
TIKTOK: 'TikTok',
|
||||
@@ -151,10 +164,15 @@ const Browser = Object.freeze({
|
||||
WEIBO: 'Weibo',
|
||||
WHALE: 'Whale',
|
||||
WOLVIC: 'Wolvic',
|
||||
YANDEX: 'Yandex'
|
||||
YANDEX: 'Yandex',
|
||||
ZALO: 'Zalo'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `BrowserName` instead
|
||||
*/
|
||||
const Browser = BrowserName;
|
||||
|
||||
const BrowserType = Object.freeze({
|
||||
CRAWLER: 'crawler',
|
||||
@@ -166,8 +184,9 @@ const BrowserType = Object.freeze({
|
||||
LIBRARY: 'library'
|
||||
});
|
||||
|
||||
const CPU = Object.freeze({
|
||||
const CPUArch = Object.freeze({
|
||||
'68K': '68k',
|
||||
ALPHA: 'alpha',
|
||||
ARM : 'arm',
|
||||
ARM_64: 'arm64',
|
||||
ARM_HF: 'armhf',
|
||||
@@ -185,8 +204,12 @@ const CPU = Object.freeze({
|
||||
X86: 'ia32',
|
||||
X86_64: 'amd64'
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `CPUArch` instead
|
||||
*/
|
||||
const CPU = CPUArch;
|
||||
|
||||
const Device = Object.freeze({
|
||||
const DeviceType = Object.freeze({
|
||||
CONSOLE: 'console',
|
||||
DESKTOP: 'desktop',
|
||||
EMBEDDED: 'embedded',
|
||||
@@ -196,8 +219,12 @@ const Device = Object.freeze({
|
||||
WEARABLE: 'wearable',
|
||||
XR: 'xr'
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `DeviceType` instead
|
||||
*/
|
||||
const Device = DeviceType;
|
||||
|
||||
const Vendor = Object.freeze({
|
||||
const DeviceVendor = Object.freeze({
|
||||
ACER: 'Acer',
|
||||
ADVAN: 'Advan',
|
||||
ALCATEL: 'Alcatel',
|
||||
@@ -208,6 +235,7 @@ const Vendor = Object.freeze({
|
||||
ATT: 'AT&T',
|
||||
BENQ: 'BenQ',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
BLU: 'BLU',
|
||||
CAT: 'Cat',
|
||||
DELL: 'Dell',
|
||||
ENERGIZER: 'Energizer',
|
||||
@@ -217,6 +245,8 @@ const Vendor = Object.freeze({
|
||||
GEEKSPHONE: 'GeeksPhone',
|
||||
GENERIC: 'Generic',
|
||||
GOOGLE: 'Google',
|
||||
HISENSE: 'Hisense',
|
||||
HMD: 'HMD',
|
||||
HP: 'HP',
|
||||
HTC: 'HTC',
|
||||
HUAWEI: 'Huawei',
|
||||
@@ -225,6 +255,7 @@ const Vendor = Object.freeze({
|
||||
ITEL: 'itel',
|
||||
JOLLA: 'Jolla',
|
||||
KOBO: 'Kobo',
|
||||
LAVA: 'Lava',
|
||||
LENOVO: 'Lenovo',
|
||||
LG: 'LG',
|
||||
MEIZU: 'Meizu',
|
||||
@@ -242,9 +273,11 @@ const Vendor = Object.freeze({
|
||||
PALM: 'Palm',
|
||||
PANASONIC: 'Panasonic',
|
||||
PEBBLE: 'Pebble',
|
||||
PHILIPS: 'Philips',
|
||||
PICO: 'Pico',
|
||||
POLYTRON: 'Polytron',
|
||||
REALME: 'Realme',
|
||||
RETROID: 'Retroid',
|
||||
RIM: 'RIM',
|
||||
ROKU: 'Roku',
|
||||
SAMSUNG: 'Samsung',
|
||||
@@ -255,11 +288,13 @@ const Vendor = Object.freeze({
|
||||
SPRINT: 'Sprint',
|
||||
TCL: 'TCL',
|
||||
TECHNISAT: 'TechniSAT',
|
||||
TECNO: 'Tecno',
|
||||
TECNO: 'TECNO',
|
||||
TESLA: 'Tesla',
|
||||
ULEFONE: 'Ulefone',
|
||||
VIVO: 'Vivo',
|
||||
VIZIO: 'Vizio',
|
||||
VODAFONE: 'Vodafone',
|
||||
WIKO: 'Wiko',
|
||||
XBOX: 'Xbox',
|
||||
XIAOMI: 'Xiaomi',
|
||||
ZEBRA: 'Zebra',
|
||||
@@ -267,8 +302,12 @@ const Vendor = Object.freeze({
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `DeviceVendor` instead
|
||||
*/
|
||||
const Vendor = DeviceVendor;
|
||||
|
||||
const Engine = Object.freeze({
|
||||
const EngineName = Object.freeze({
|
||||
AMAYA: 'Amaya',
|
||||
ARKWEB: 'ArkWeb',
|
||||
BLINK: 'Blink',
|
||||
@@ -290,12 +329,17 @@ const Engine = Object.freeze({
|
||||
W3M: 'w3m',
|
||||
WEBKIT: 'WebKit'
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `EngineName` instead
|
||||
*/
|
||||
const Engine = EngineName;
|
||||
|
||||
const OS = Object.freeze({
|
||||
const OSName = Object.freeze({
|
||||
AIX: 'AIX',
|
||||
AMIGA_OS: 'Amiga OS',
|
||||
ANDROID: 'Android',
|
||||
ANDROID_X86: 'Android-x86',
|
||||
ARCAOS: 'ArcaOS',
|
||||
ARCH: 'Arch',
|
||||
BADA: 'Bada',
|
||||
BEOS: 'BeOS',
|
||||
@@ -326,6 +370,8 @@ const OS = Object.freeze({
|
||||
IOS: 'iOS',
|
||||
JOLI: 'Joli',
|
||||
KAIOS: 'KaiOS',
|
||||
KNOPPIX: 'Knoppix',
|
||||
KUBUNTU: 'Kubuntu',
|
||||
LINPUS: 'Linpus',
|
||||
LINSPIRE: 'Linspire',
|
||||
LINUX: 'Linux',
|
||||
@@ -367,25 +413,348 @@ const OS = Object.freeze({
|
||||
SYMBIAN: 'Symbian',
|
||||
TIZEN: 'Tizen',
|
||||
UBUNTU: 'Ubuntu',
|
||||
UBUNTU_TOUCH: 'Ubuntu Touch',
|
||||
UNIX: 'Unix',
|
||||
VECTORLINUX: 'VectorLinux',
|
||||
WATCHOS: 'watchOS',
|
||||
WEBOS: 'WebOS',
|
||||
WINDOWS: 'Windows',
|
||||
WINDOWS_CE: 'Windows CE',
|
||||
WINDOWS_IOT: 'Windows IoT',
|
||||
WINDOWS_MOBILE: 'Windows Mobile',
|
||||
WINDOWS_PHONE: 'Windows Phone',
|
||||
WINDOWS_RT: 'Windows RT',
|
||||
XBOX: 'Xbox',
|
||||
XUBUNTU: 'Xubuntu',
|
||||
ZENWALK: 'Zenwalk'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
/**
|
||||
* @deprecated Use `OSName` instead
|
||||
*/
|
||||
const OS = OSName;
|
||||
|
||||
/*////////////////////////////////
|
||||
* Enums for Extensions submodule
|
||||
*///////////////////////////////
|
||||
|
||||
const Extension = Object.freeze({
|
||||
BrowserName: {
|
||||
CLI: {
|
||||
CURL: 'curl',
|
||||
ELINKS: 'ELinks',
|
||||
HTTPIE: 'HTTPie',
|
||||
LYNX: 'Lynx',
|
||||
WGET: 'Wget'
|
||||
},
|
||||
Crawler: {
|
||||
AHREFS_BOT: 'AhrefsBot',
|
||||
AI2_BOT: 'AI2Bot',
|
||||
AIHIT_BOT: 'aiHitBot',
|
||||
ALGOLIA_CRAWLER: 'Algolia Crawler',
|
||||
APPLE_BOT: 'Applebot',
|
||||
APPLE_BOT_EXTENDED: 'Applebot-Extended',
|
||||
ASK_TEOMA: 'Teoma',
|
||||
AMAZON_BOT: 'Amazonbot',
|
||||
AMAZON_CONTXBOT: 'contxbot',
|
||||
ANTHROPIC_AI: 'anthropic-ai',
|
||||
ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',
|
||||
ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',
|
||||
ANTHROPIC_CLAUDE_WEB: 'Claude-Web',
|
||||
ARCHIVEORG_BOT: 'archive.org_bot',
|
||||
BAIDU_ADS: 'Baidu-ADS',
|
||||
BAIDU_SPIDER: 'Baiduspider',
|
||||
BAIDU_SPIDER_ADS: 'Baiduspider-ads',
|
||||
BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',
|
||||
BAIDU_SPIDER_FAVO: 'Baiduspider-favo',
|
||||
BAIDU_SPIDER_IMAGE: 'Baiduspider-image',
|
||||
BAIDU_SPIDER_NEWS: 'Baiduspider-news',
|
||||
BAIDU_SPIDER_RENDER: 'Baiduspider-render',
|
||||
BAIDU_SPIDER_VIDEO: 'Baiduspider-video',
|
||||
BLEX_BOT: 'BLEXBot',
|
||||
BOTIFY: 'botify',
|
||||
BRAVE_BOT: 'Bravebot',
|
||||
BYTEDANCE_BYTESPIDER: 'Bytespider',
|
||||
BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',
|
||||
COMMON_CRAWL_CCBOT: 'CCBot',
|
||||
COCCOC_BOT_WEB: 'coccocbot-web',
|
||||
COCCOC_BOT_IMAGE: 'coccocbot-image',
|
||||
COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',
|
||||
COTOYOGI: 'Cotoyogi',
|
||||
COVEO_BOT: 'Coveobot',
|
||||
CRITEO_BOT: 'CriteoBot',
|
||||
DATAFORSEO_BOT: 'DataForSeoBot',
|
||||
DAUM: 'Daum',
|
||||
DAUM_DAUMOA: 'Daumoa',
|
||||
DAUM_DAUMOA_IMAGE: 'Daumoa-image',
|
||||
DEEPSEEK_BOT: 'DeepSeekBot',
|
||||
DIFFBOT: 'Diffbot',
|
||||
DUCKDUCKGO_BOT: 'DuckDuckBot',
|
||||
DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',
|
||||
ELASTIC: 'Elastic',
|
||||
ELASTIC_SWIFTYPE_BOT: 'Swiftbot',
|
||||
EXALEAD_EXABOT: 'Exabot',
|
||||
FIRECRAWL_AGENT: 'FirecrawlAgent',
|
||||
FREESPOKE: 'Freespoke',
|
||||
GOOGLE_ADSBOT: 'AdsBot-Google',
|
||||
GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',
|
||||
GOOGLE_ADSENSE: 'AdSense',
|
||||
GOOGLE_APIS: 'APIs-Google',
|
||||
GOOGLE_BOT: 'Googlebot',
|
||||
GOOGLE_BOT_IMAGE: 'Googlebot-Image',
|
||||
GOOGLE_BOT_NEWS: 'Googlebot-News',
|
||||
GOOGLE_BOT_VIDEO: 'Googlebot-Video',
|
||||
GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',
|
||||
GOOGLE_EXTENDED: 'Google-Extended',
|
||||
GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',
|
||||
GOOGLE_OTHER: 'GoogleOther',
|
||||
GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',
|
||||
GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',
|
||||
GOOGLE_SAFETY: 'Google-Safety',
|
||||
GOOGLE_STOREBOT: 'Storebot-Google',
|
||||
HIVE_IMAGESIFTBOT: 'ImagesiftBot',
|
||||
HUAWEI_PANGUBOT: 'PanguBot',
|
||||
HUAWEI_PETALBOT: 'PetalBot',
|
||||
HUGGINGFACE_BOT: 'HuggingFace-Bot',
|
||||
HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',
|
||||
IA_ARCHIVER: 'ia_archiver',
|
||||
IASK_BOT: 'iAskBot',
|
||||
KAGI_BOT: 'Kagibot',
|
||||
KANGAROO_BOT: 'Kangaroo Bot',
|
||||
LINE_SPIDER: 'Linespider',
|
||||
LINKEDIN_BOT: 'LinkedInBot',
|
||||
MAGPIE_CRAWLER: 'magpie-crawler',
|
||||
MARGINALIA: 'marginalia',
|
||||
META_EXTERNALAGENT: 'meta-externalagent',
|
||||
META_FACEBOOKBOT: 'FacebookBot',
|
||||
META_FACEBOOKCATALOG: 'facebookcatalog',
|
||||
META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',
|
||||
MAJESTIC_MJ12BOT: 'MJ12bot',
|
||||
MICROSOFT_BINGBOT: 'Bingbot',
|
||||
MICROSOFT_MSNBOT: 'msnbot',
|
||||
MICROSOFT_ADIDXBOT: 'adidxbot',
|
||||
MOJEEK_BOT: 'MojeekBot',
|
||||
MOZ_DOTBOT: 'DotBot',
|
||||
ONCRAWL: 'OnCrawl',
|
||||
ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',
|
||||
OPENAI_GPTBOT: 'GPTBot',
|
||||
OPENAI_SEARCH_BOT: 'OAI-SearchBot',
|
||||
PERPLEXITY_BOT: 'PerplexityBot',
|
||||
QIHOO_360_SPIDER: '360Spider',
|
||||
QWANT_BOT: 'Qwantbot',
|
||||
QWANT_BOT_NEWS: 'Qwantbot-news',
|
||||
REPLICATE_BOT: 'Replicate-Bot',
|
||||
RUNPOD_BOT: 'RunPod-Bot',
|
||||
SB_INTUITIONS_BOT: 'SBIntuitionsBot',
|
||||
SEEKPORT_BOT: 'SeekportBot',
|
||||
SEMRUSH_BOT: 'SemrushBot',
|
||||
SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',
|
||||
SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',
|
||||
SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',
|
||||
SEZNAM_BOT: 'SeznamBot',
|
||||
SITEIMPROVE: 'Siteimprove',
|
||||
SOGOU_PIC_SPIDER: 'Sogou Pic Spider',
|
||||
SOGOU_WEB_SPIDER: 'Sogou web spider',
|
||||
STARTPAGE: 'Startpage',
|
||||
SURLY_BOT: 'SurdotlyBot',
|
||||
TIMPI_BOT: 'Timpibot',
|
||||
TOGETHER_BOT: 'Together-Bot',
|
||||
TURNITIN_BOT: 'TurnitinBot',
|
||||
TWIN_AGENT: 'TwinAgent',
|
||||
VERCEL_V0BOT: 'v0bot',
|
||||
WEBZIO: 'webzio',
|
||||
WEBZIO_EXTENDED: 'Webzio-Extended',
|
||||
WEBZIO_OMGILI: 'omgili',
|
||||
WEBZIO_OMGILI_BOT: 'omgilibot',
|
||||
XAI_BOT: 'xAI-Bot',
|
||||
YAHOO_JAPAN: 'Y!J-BRW',
|
||||
YAHOO_SLURP: 'Yahoo! Slurp',
|
||||
YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',
|
||||
YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',
|
||||
YANDEX_ADNET: 'YandexAdNet',
|
||||
YANDEX_BLOGS: 'YandexBlogs',
|
||||
YANDEX_BOT: 'YandexBot',
|
||||
YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',
|
||||
YANDEX_COMBOT: 'YandexComBot',
|
||||
YANDEX_FAVICONS: 'YandexFavicons',
|
||||
YANDEX_IMAGE_RESIZER: 'YandexImageResizer',
|
||||
YANDEX_IMAGES: 'YandexImages',
|
||||
YANDEX_MARKET: 'YandexMarket',
|
||||
YANDEX_MEDIA: 'YandexMedia',
|
||||
YANDEX_METRIKA: 'YandexMetrika',
|
||||
YANDEX_MOBILE_BOT: 'YandexMobileBot',
|
||||
YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',
|
||||
YANDEX_NEWS: 'YandexNews',
|
||||
YANDEX_ONTODB: 'YandexOntoDB',
|
||||
YANDEX_ONTODB_API: 'YandexOntoDBAPI',
|
||||
YANDEX_PARTNER: 'YandexPartner',
|
||||
YANDEX_RCA: 'YandexRCA',
|
||||
YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',
|
||||
YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',
|
||||
YANDEX_SPRAV_BOT: 'YandexSpravBot',
|
||||
YANDEX_TRACKER: 'YandexTracker',
|
||||
YANDEX_VERTICALS: 'YandexVerticals',
|
||||
YANDEX_VERTIS: 'YandexVertis',
|
||||
YANDEX_VIDEO: 'YandexVideo',
|
||||
YANDEX_VIDEO_PARSER: 'YandexVideoParser',
|
||||
YANDEX_WEBMASTER: 'YandexWebmaster',
|
||||
YEP_BOT: 'YepBot',
|
||||
YETI: 'Yeti',
|
||||
YISOU_SPIDER: 'YisouSpider',
|
||||
YOU_BOT: 'YouBot',
|
||||
ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',
|
||||
ZUM_BOT: 'ZumBot'
|
||||
},
|
||||
Email: {
|
||||
AIRMAIL: 'Airmail',
|
||||
APPLE_MAIL: 'Mail',
|
||||
BLUEMAIL: 'BlueMail',
|
||||
DAUM_MAIL: 'DaumMail',
|
||||
EVOLUTION: 'Evolution',
|
||||
EM_CLIENT: 'eM Client',
|
||||
FOXMAIL: 'Foxmail',
|
||||
KMAIL: 'KMail',
|
||||
KMAIL2: 'kmail2',
|
||||
KONTACT: 'Kontact',
|
||||
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
|
||||
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
|
||||
NAVER_MAILAPP: 'NaverMailApp',
|
||||
POLYMAIL: 'Polymail',
|
||||
PROTON_MAIL: 'ProtonMail',
|
||||
SPARK_MAIL: 'SparkDesktop',
|
||||
SPARROW: 'Sparrow',
|
||||
THUNDERBIRD: 'Thunderbird',
|
||||
YAHOO_MAIL: 'Yahoo',
|
||||
ZIMBRA: 'Zimbra',
|
||||
ZOHO_MAIL: 'ZohoMail-Desktop'
|
||||
},
|
||||
Fetcher: {
|
||||
AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
|
||||
ANTHROPIC_CLAUDE_USER: 'Claude-User',
|
||||
ASANA: 'Asana',
|
||||
BETTER_UPTIME_BOT: 'Better Uptime Bot',
|
||||
BITLY_BOT: 'bitlybot',
|
||||
BLUESKY: 'Bluesky',
|
||||
BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',
|
||||
COHERE_AI: 'Cohere-AI',
|
||||
DISCORD_BOT: 'Discordbot',
|
||||
DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',
|
||||
GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',
|
||||
GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',
|
||||
GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',
|
||||
GOOGLE_IMAGEPROXY: 'GoogleImageProxy',
|
||||
GOOGLE_PAGERENDERER: 'Google-PageRenderer',
|
||||
GOOGLE_READ_ALOUD: 'Google-Read-Aloud',
|
||||
GOOGLE_PRODUCER: 'GoogleProducer',
|
||||
GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',
|
||||
HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',
|
||||
IFRAMELY: 'Iframely',
|
||||
KAKAOTALK_SCRAP: 'kakaotalk-scrap',
|
||||
KEYBASE_BOT: 'KeybaseBot',
|
||||
META_EXTERNALFETCHER: 'meta-externalfetcher',
|
||||
META_WHATSAPP: 'WhatsApp',
|
||||
MICROSOFT_BINGPREVIEW: 'BingPreview',
|
||||
MICROSOFT_PREVIEW: 'MicrosoftPreview',
|
||||
MISTRALAI_USER: 'MistralAI-User',
|
||||
NAVER_BLUENO: 'Blueno',
|
||||
ONCRAWL_ROGERBOT: 'rogerbot',
|
||||
OPENAI_CHATGPT_USER: 'ChatGPT-User',
|
||||
PERPLEXITY_USER: 'Perplexity-User',
|
||||
PINTEREST_BOT: 'Pinterestbot',
|
||||
SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',
|
||||
SLACK_BOT: 'Slackbot',
|
||||
SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',
|
||||
SLACK_IMGPROXY: 'Slack-ImgProxy',
|
||||
SNAP_URL_PREVIEW: 'Snap URL Preview',
|
||||
SKYPE_URIPREVIEW: 'SkypeUriPreview',
|
||||
TELEGRAM_BOT: 'TelegramBot',
|
||||
UPTIMEROBOT: 'UptimeRobot',
|
||||
VERCEL_FAVICON_BOT: 'vercel-favicon-bot',
|
||||
VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',
|
||||
VERCEL_BOT: 'Vercelbot',
|
||||
VERCEL_FLAGS: 'vercelflags',
|
||||
VERCEL_TRACING: 'verceltracing',
|
||||
X_TWITTERBOT: 'Twitterbot',
|
||||
YANDEX_CALENDAR: 'YandexCalendar',
|
||||
YANDEX_DIRECT: 'YandexDirect',
|
||||
YANDEX_DIRECTDYN: 'YandexDirectDyn',
|
||||
YANDEX_DIRECTFETCHER: 'YaDirectFetcher',
|
||||
YANDEX_FORDOMAIN: 'YandexForDomain',
|
||||
YANDEX_PAGECHECKER: 'YandexPagechecker',
|
||||
YANDEX_SEARCHSHOP: 'YandexSearchShop',
|
||||
YANDEX_SITELINKS: 'YandexSitelinks',
|
||||
YANDEX_USERPROXY: 'YandexUserproxy',
|
||||
ZOOMINFO_BOT: 'Zoombot'
|
||||
},
|
||||
InApp: {
|
||||
DISCORD: 'Discord',
|
||||
EVERNOTE: 'Evernote',
|
||||
FIGMA: 'Figma',
|
||||
FLIPBOARD: 'Flipboard',
|
||||
MATTERMOST: 'Mattermost',
|
||||
TEAMS: 'Teams',
|
||||
NOTION: 'Notion',
|
||||
POSTMAN: 'Postman',
|
||||
RAMBOX: 'Rambox',
|
||||
ROCKETCHAT: 'Rocket.Chat',
|
||||
SLACK: 'Slack',
|
||||
TIKTOK_LITE: 'TikTok Lite',
|
||||
VSCODE: 'VS Code',
|
||||
YAHOO_JAPAN: 'Yahoo! Japan'
|
||||
},
|
||||
Library: {
|
||||
ADOBE_AIR: 'AdobeAIR',
|
||||
AIOHTTP: 'aiohttp',
|
||||
APACHE_HTTPCLIENT: 'Apache-HttpClient',
|
||||
AXIOS: 'axios',
|
||||
GO_HTTP_CLIENT: 'go-http-client',
|
||||
GOT: 'got',
|
||||
GUZZLEHTTP: 'GuzzleHttp',
|
||||
JAVA: 'Java',
|
||||
JAVA_HTTPCLIENT: 'Java-http-client',
|
||||
JSDOM: 'jsdom',
|
||||
LIBWWW_PERL: 'libwww-perl',
|
||||
LUA_RESTY_HTTP: 'lua-resty-http',
|
||||
NEEDLE: 'Needle',
|
||||
NUTCH: 'Nutch',
|
||||
OKHTTP: 'OkHttp',
|
||||
NODE_FETCH: 'node-fetch',
|
||||
NODE_SUPERAGENT: 'node-superagent',
|
||||
PHP_SOAP: 'PHP-SOAP',
|
||||
POSTMAN_RUNTIME: 'PostmanRuntime',
|
||||
PYTHON_HTTPX: 'python-httpx',
|
||||
PYTHON_URLLIB: 'python-urllib',
|
||||
PYTHON_URLLIB3: 'python-urllib3',
|
||||
PYTHON_REQUESTS: 'python-requests',
|
||||
SCRAPY: 'Scrapy'
|
||||
}
|
||||
},
|
||||
DeviceVendor: {
|
||||
Vehicle: {
|
||||
BMW: 'BMW',
|
||||
BYD: 'BYD',
|
||||
JEEP: 'Jeep',
|
||||
RIVIAN: 'Rivian',
|
||||
TESLA: 'Tesla',
|
||||
VOLVO: 'Volvo'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export {
|
||||
Browser,
|
||||
Browser,// deprecated
|
||||
CPU, // deprecated
|
||||
Device, // deprecated
|
||||
Vendor, // deprecated
|
||||
Engine, // deprecated
|
||||
OS, // deprecated
|
||||
BrowserName,
|
||||
BrowserType,
|
||||
CPU,
|
||||
Device,
|
||||
Vendor,
|
||||
Engine,
|
||||
OS
|
||||
CPUArch,
|
||||
DeviceType,
|
||||
DeviceVendor,
|
||||
EngineName,
|
||||
OSName,
|
||||
Extension
|
||||
};
|
||||
5
src/extensions/ua-parser-extensions.d.ts
vendored
5
src/extensions/ua-parser-extensions.d.ts
vendored
@@ -1,4 +1,4 @@
|
||||
// Type definitions for Helpers submodule of UAParser.js v2.0.0-rc.3
|
||||
// Type definitions for Helpers submodule of UAParser.js v2.0.5
|
||||
// Project: https://github.com/faisalman/ua-parser-js
|
||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||
|
||||
@@ -12,4 +12,5 @@ export const Emails: UAParserExt;
|
||||
export const Fetchers: UAParserExt;
|
||||
export const InApps: UAParserExt;
|
||||
export const Libraries: UAParserExt;
|
||||
export const MediaPlayers: UAParserExt;
|
||||
export const MediaPlayers: UAParserExt;
|
||||
export const Vehicles: UAParserExt;
|
||||
@@ -1,5 +1,5 @@
|
||||
///////////////////////////////////////////////
|
||||
/* Extensions for UAParser.js v2.0.0-rc.3
|
||||
/* Extensions for UAParser.js v2.0.6
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
@@ -28,8 +28,8 @@ const LIBRARY = 'library';
|
||||
|
||||
const CLIs = Object.freeze({
|
||||
browser : [
|
||||
// wget / curl / lynx
|
||||
[/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
||||
// wget / curl / Lynx / ELinks / HTTPie
|
||||
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -42,29 +42,50 @@ const Crawlers = Object.freeze({
|
||||
[
|
||||
// AhrefsBot - https://ahrefs.com/robot
|
||||
// Amazonbot - https://developer.amazon.com/amazonbot
|
||||
// Applebot - http://apple.com/go/applebot
|
||||
// Bingbot - http://www.bing.com/bingbot.htm
|
||||
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
||||
// Bravebot - https://search.brave.com/help/brave-search-crawler
|
||||
// CCBot - https://commoncrawl.org/faq
|
||||
// contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
|
||||
// Coveobot - https://connect.coveo.com/s/article/19648
|
||||
// CriteoBot - https://www.criteo.com/criteo-crawler/
|
||||
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
||||
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
||||
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
||||
// GPTBot - https://platform.openai.com/docs/gptbot
|
||||
// iAskBot - https://iask.ai
|
||||
// Kagibot - https://kagi.com/bot
|
||||
// Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
|
||||
// LinkedInBot - http://www.linkedin.com
|
||||
// MJ12bot - https://mj12bot.com/
|
||||
// MojeekBot - https://www.mojeek.com/bot.html
|
||||
// Onespot - https://www.onespot.com/identifying-traffic.html
|
||||
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
||||
// PerplexityBot - https://perplexity.ai/perplexitybot
|
||||
// SemrushBot - http://www.semrush.com/bot.html
|
||||
/((?:ahrefs|amazon|apple|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush)bot)\/([\w\.]+)/i,
|
||||
// SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
|
||||
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
||||
// SurdotlyBot - http://sur.ly/bot.html
|
||||
// Swiftbot - https://swiftype.com/swiftbot
|
||||
// YepBot - https://yep.com/yepbot/
|
||||
/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,
|
||||
|
||||
// Algolia Crawler
|
||||
/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
|
||||
|
||||
// Applebot - http://apple.com/go/applebot
|
||||
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
||||
|
||||
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
||||
/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
|
||||
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
||||
|
||||
// ClaudeBot (Anthropic)
|
||||
/(claude(?:bot|-web))\/([\w\.]+)/i,
|
||||
/(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
||||
|
||||
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
||||
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
||||
|
||||
// Daum
|
||||
/(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
|
||||
|
||||
// Facebook / Meta
|
||||
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
||||
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
||||
@@ -75,6 +96,15 @@ const Crawlers = Object.freeze({
|
||||
// Internet Archive (archive.org)
|
||||
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
||||
|
||||
// OnCrawl
|
||||
/(oncrawl) mobile\/([\w\.]+)/i,
|
||||
|
||||
// Qwantbot - https://help.qwant.com/bot
|
||||
/(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
|
||||
|
||||
// SemrushBot - http://www.semrush.com/bot.html
|
||||
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
||||
|
||||
// Sogou Spider
|
||||
/(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
|
||||
|
||||
@@ -82,28 +112,38 @@ const Crawlers = Object.freeze({
|
||||
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
||||
|
||||
// Yandex Bots - https://yandex.com/bots
|
||||
/(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i,
|
||||
/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,
|
||||
|
||||
// Yeti (Naver)
|
||||
/(yeti)\/([\w\.]+)/i,
|
||||
|
||||
// YisouSpider
|
||||
/(yisouspider)\/?([\w\.]*)/i
|
||||
// aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
|
||||
// Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
|
||||
// Freespoke - https://docs.freespoke.com/search/bot/
|
||||
/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
|
||||
],
|
||||
|
||||
[NAME, VERSION, [TYPE, CRAWLER]],
|
||||
|
||||
[
|
||||
// YandexBot MirrorDetector
|
||||
/(yandexbot\/([\w\.]+); mirrordetector)/i
|
||||
],
|
||||
[[NAME, /\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],
|
||||
|
||||
[
|
||||
// Google Bots
|
||||
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
||||
|
||||
// Bytespider
|
||||
// AI2Bot - https://allenai.org/crawler
|
||||
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
||||
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
||||
// Qihoo 360Spider
|
||||
// ImagesiftBot - https://imagesift.com/about
|
||||
// Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
|
||||
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
||||
// v0bot - https://vercel.com/docs/bot-management
|
||||
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
||||
/(360spider-?(?:image|video)?|bytespider|(?:aspiegel|dataforseo|petal|turnitin)bot|(?=yahoo! )slurp)/i
|
||||
// Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
|
||||
/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
|
||||
],
|
||||
[NAME, [TYPE, CRAWLER]]
|
||||
]
|
||||
@@ -156,7 +196,7 @@ const ExtraDevices = Object.freeze({
|
||||
/\b(zur\d{3}) b/i // Swiss ZUR Tablet
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
||||
|
||||
/\b((zeki)?tb.*\b) b/i // Zeki Tablets
|
||||
/^((zeki)?tb.*\b) b/i // Zeki Tablets
|
||||
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
||||
|
||||
/\b([yr]\d{2}) b/i,
|
||||
@@ -195,8 +235,19 @@ const ExtraDevices = Object.freeze({
|
||||
|
||||
const Emails = Object.freeze({
|
||||
browser : [
|
||||
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
||||
[/(evolution|kmail2?|kontact|(?:microsoft |mac)outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, EMAIL]]
|
||||
[
|
||||
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
|
||||
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
|
||||
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
|
||||
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
|
||||
|
||||
// Apple's Mail
|
||||
/(mail)\/([\w\.]+) cf/i
|
||||
], [NAME, VERSION, [TYPE, EMAIL]], [
|
||||
|
||||
// Zimbra
|
||||
/zdesktop\/([\w\.]+)/i
|
||||
], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -207,36 +258,42 @@ const Emails = Object.freeze({
|
||||
const Fetchers = Object.freeze({
|
||||
browser : [
|
||||
[
|
||||
// Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot / WhatsApp
|
||||
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
||||
// Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
|
||||
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
||||
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
||||
// BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
|
||||
/(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
|
||||
// Google Site Verifier / Meta / Yahoo! Japan
|
||||
// Iframely - https://iframely.com/docs/about
|
||||
// Perplexity-User - https://docs.perplexity.ai/guides/bots
|
||||
// MistralAI-User - https://docs.mistral.ai/robots/
|
||||
// Yandex Bots - https://yandex.com/bots
|
||||
/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,
|
||||
|
||||
// Google Site Verifier
|
||||
/(google-site-verification)\/([\w\.]+)/i,
|
||||
// Bluesky
|
||||
/(bluesky) cardyb\/([\w\.]+)/i,
|
||||
|
||||
// Meta
|
||||
/(meta-externalfetcher)\/([\w\.]+)/i,
|
||||
// Nova Act - https://github.com/aws/nova-act
|
||||
/agent-(novaact)\/([\w\.]+)/i,
|
||||
|
||||
// Skype
|
||||
/(skypeuripreview) preview\/([\w\.]+)/i,
|
||||
|
||||
// Slackbot - https://api.slack.com/robots
|
||||
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
|
||||
|
||||
// WhatsApp
|
||||
/(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
|
||||
|
||||
// Yahoo! Japan
|
||||
/(y!?j-dlc)\/([\w\.]+)/i,
|
||||
|
||||
// Yandex Bots - https://yandex.com/bots
|
||||
/(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
||||
/(yandex(?:sitelinks|userproxy))/i
|
||||
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i
|
||||
],
|
||||
[NAME, VERSION, [TYPE, FETCHER]],
|
||||
|
||||
// Google Bots / Snapchat
|
||||
[/(feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
|
||||
[
|
||||
// Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
|
||||
/((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
|
||||
],
|
||||
[NAME, [TYPE, FETCHER]],
|
||||
],
|
||||
|
||||
os : [
|
||||
[/whatsapp\/[\d\.]+ (a|i)/i],
|
||||
[[NAME, os => os == 'A' ? 'Android' : 'iOS' ]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -245,12 +302,32 @@ const Fetchers = Object.freeze({
|
||||
///////////////////
|
||||
|
||||
const InApps = Object.freeze({
|
||||
browser : [
|
||||
browser : [[
|
||||
// Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
|
||||
/\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
|
||||
/(flipboard)\/([\w\.]+)/i
|
||||
], [NAME, VERSION, [TYPE, INAPP]], [
|
||||
|
||||
// Evernote/Teams on mobile
|
||||
/(evernote) win/i,
|
||||
/(teams)mobile-(ios|and)/i
|
||||
], [NAME, [TYPE, INAPP]], [
|
||||
|
||||
// Slack
|
||||
[/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
|
||||
/chatlyio\/([\d\.]+)/i],
|
||||
[VERSION, [NAME, 'Slack'], [TYPE, INAPP]], [
|
||||
|
||||
// TikTok Lite
|
||||
/ultralite app_version\/([\w\.]+)/i],
|
||||
[VERSION, [NAME, 'TikTok Lite'], [TYPE, INAPP]], [
|
||||
|
||||
// VS Code
|
||||
/\) code\/([\d\.]+).+electron\//i],
|
||||
[VERSION, [NAME, 'VS Code'], [TYPE, INAPP]], [
|
||||
|
||||
// Yahoo! Japan
|
||||
[/jp\.co\.yahoo\.android\.yjtop\/([\d\.]+)/i], [VERSION, 'Yahoo! Japan', [TYPE, INAPP]]
|
||||
/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i],
|
||||
[VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -260,106 +337,48 @@ const InApps = Object.freeze({
|
||||
|
||||
const MediaPlayers = Object.freeze({
|
||||
browser : [[
|
||||
|
||||
/(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
|
||||
/(coremedia) v([\w\._]+)/i
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
|
||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
|
||||
/(apple(?:coremedia|tv))\/([\w\._]+)/i, // Generic Apple CoreMedia
|
||||
/(coremedia) v([\w\._]+)/i,
|
||||
// Ares/Nexplayer/OSSProxy
|
||||
/(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
|
||||
// Aqualung/Lyssna/BSPlayer/Clementine/MPD
|
||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
|
||||
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
||||
/(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
|
||||
/(lg player|nexplayer)\s([\d\.]+)/i,
|
||||
/player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
/(nexplayer)\s([\w\.-]+)/i // Nexplayer
|
||||
// Nero Home/Nero Scout/Nokia
|
||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
||||
// SoundTap/Totem/Stagefright/Streamium
|
||||
// XBMC/gvfs/Xine/XMMS/irapp
|
||||
/^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i,
|
||||
/(lg player|nexplayer) ([\d\.]+)/i,
|
||||
/player\/(nexplayer|lg player) ([\w\.-]+)/i, // NexPlayer/LG Player
|
||||
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i, // Gstreamer
|
||||
/(htc streaming player) [\w_]+ \/ ([\d\.]+)/i, // HTC Streaming Player
|
||||
/(lavf)([\d\.]+)/i, // Lavf (FFMPEG)
|
||||
// MPlayer SVN
|
||||
/(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
|
||||
/ (songbird)\/([\w\.-]+)/i, // Songbird/Philips-Songbird
|
||||
/(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i, // Winamp
|
||||
/(vlc)(?:\/| media player - version )([\w\.-]+)/i, // VLC Videolan
|
||||
/^(foobar2000|itunes|smp)\/([\d\.]+)/i, // Foobar2000/iTunes/SMP
|
||||
/com\.(riseupradioalarm)\/([\d\.]*)/i, // RiseUP Radio Alarm
|
||||
/(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i, // MPlayer
|
||||
// Windows Media Server
|
||||
/(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(flrp)\/([\w\.-]+)/i // Flip Player
|
||||
], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(fstream|nativehost|queryseekspider)/i
|
||||
// FStream/NativeHost/QuerySeekSpider
|
||||
// MPlayer (no other info)/Media Player Classic/Nero ShowTime
|
||||
// OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
||||
// inlight radio / YourMuze
|
||||
/(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
|
||||
], [NAME, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
|
||||
// Gstreamer
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
/(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i, // HTC One S / Windows Media Player
|
||||
], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
||||
/(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
|
||||
// Java/urllib/requests/wget/cURL
|
||||
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(htc_one_s)\/([\d\.]+)/i, // HTC One S
|
||||
], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
|
||||
// MPlayer SVN
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
|
||||
/(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(mplayer)/i, // MPlayer (no other info)
|
||||
/(yourmuze)/i, // YourMuze
|
||||
/(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
|
||||
], [NAME, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(nokia\d+)\/([\w\.-]+)/i // Nokia
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(winamp)3 version ([\w\.-]+)/i, // Winamp
|
||||
/(winamp)\s([\w\.-]+)/i,
|
||||
/(winamp)mpeg\/([\w\.-]+)/i
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
||||
// inlight radio
|
||||
], [NAME, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
|
||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
||||
// SoundTap/Totem/Stagefright/Streamium
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(smp)([\d\.]+)/i // SMP
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
|
||||
/(vlc)\/([\w\.-]+)/i,
|
||||
/(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
|
||||
/(foobar2000)\/([\d\.]+)/i, // Foobar2000
|
||||
/(itunes)\/([\d\.]+)/i // iTunes
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
|
||||
/(windows-media-player)\/([\w\.-]+)/i
|
||||
], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
|
||||
// Windows Media Server
|
||||
], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(rad.io)\s([\d\.]+)/i, // Rad.io
|
||||
/(radio.(?:de|at|fr))\s([\d\.]+)/i
|
||||
/(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i // Rad.io
|
||||
], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
|
||||
]
|
||||
});
|
||||
@@ -370,8 +389,38 @@ const MediaPlayers = Object.freeze({
|
||||
|
||||
const Libraries = Object.freeze({
|
||||
browser : [
|
||||
// Axios/jsdom/Scrapy
|
||||
[/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
|
||||
[
|
||||
// Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent
|
||||
/^(apache-httpclient|axios|bun|dart|deno|(?:go|java)-http-client|got|guzzlehttp|hackney|java|libwww-perl|lua-resty-http|needle|node(?:\.js|-fetch|-superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\/([\w\.]+)/i,
|
||||
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
|
||||
/(nutch)-([\w\.-]+)(\(|$)/i,
|
||||
/\((java)\/([\w\.]+)/i
|
||||
], [NAME, VERSION, [TYPE, LIBRARY]], [
|
||||
/(node-fetch|undici)/i
|
||||
], [NAME, [TYPE, LIBRARY]]
|
||||
]
|
||||
});
|
||||
|
||||
/////////////
|
||||
// VEHICLES
|
||||
////////////
|
||||
|
||||
const Vehicles = Object.freeze({
|
||||
device : [
|
||||
[/aftlbt962e2/i], // BMW
|
||||
[[VENDOR, 'BMW']],
|
||||
|
||||
[/dilink.+(byd) auto/i], // BYD
|
||||
[VENDOR],
|
||||
|
||||
[/aftlft962x3/i], // Jeep
|
||||
[[VENDOR, 'Jeep'], [MODEL, 'Wagooner']],
|
||||
|
||||
[/(rivian) (r1t)/i], // Rivian
|
||||
[VENDOR, MODEL],
|
||||
|
||||
[/vcc.+netfront/i], // Volvo
|
||||
[[VENDOR, 'Volvo']]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -382,9 +431,12 @@ const Libraries = Object.freeze({
|
||||
const Bots = Object.freeze({
|
||||
browser : [
|
||||
...CLIs.browser,
|
||||
...Crawlers.browser,
|
||||
...Fetchers.browser,
|
||||
...Crawlers.browser,
|
||||
...Libraries.browser
|
||||
],
|
||||
os : [
|
||||
...Fetchers.os
|
||||
]
|
||||
});
|
||||
|
||||
@@ -397,5 +449,6 @@ module.exports = {
|
||||
Fetchers,
|
||||
InApps,
|
||||
Libraries,
|
||||
MediaPlayers
|
||||
MediaPlayers,
|
||||
Vehicles
|
||||
};
|
||||
@@ -3,7 +3,7 @@
|
||||
// Source: /src/extensions/ua-parser-extensions.js
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/* Extensions for UAParser.js v2.0.0-rc.3
|
||||
/* Extensions for UAParser.js v2.0.6
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
@@ -32,8 +32,8 @@ const LIBRARY = 'library';
|
||||
|
||||
const CLIs = Object.freeze({
|
||||
browser : [
|
||||
// wget / curl / lynx
|
||||
[/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
||||
// wget / curl / Lynx / ELinks / HTTPie
|
||||
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -46,29 +46,50 @@ const Crawlers = Object.freeze({
|
||||
[
|
||||
// AhrefsBot - https://ahrefs.com/robot
|
||||
// Amazonbot - https://developer.amazon.com/amazonbot
|
||||
// Applebot - http://apple.com/go/applebot
|
||||
// Bingbot - http://www.bing.com/bingbot.htm
|
||||
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
||||
// Bravebot - https://search.brave.com/help/brave-search-crawler
|
||||
// CCBot - https://commoncrawl.org/faq
|
||||
// contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
|
||||
// Coveobot - https://connect.coveo.com/s/article/19648
|
||||
// CriteoBot - https://www.criteo.com/criteo-crawler/
|
||||
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
||||
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
||||
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
||||
// GPTBot - https://platform.openai.com/docs/gptbot
|
||||
// iAskBot - https://iask.ai
|
||||
// Kagibot - https://kagi.com/bot
|
||||
// Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
|
||||
// LinkedInBot - http://www.linkedin.com
|
||||
// MJ12bot - https://mj12bot.com/
|
||||
// MojeekBot - https://www.mojeek.com/bot.html
|
||||
// Onespot - https://www.onespot.com/identifying-traffic.html
|
||||
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
||||
// PerplexityBot - https://perplexity.ai/perplexitybot
|
||||
// SemrushBot - http://www.semrush.com/bot.html
|
||||
/((?:ahrefs|amazon|apple|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush)bot)\/([\w\.]+)/i,
|
||||
// SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
|
||||
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
||||
// SurdotlyBot - http://sur.ly/bot.html
|
||||
// Swiftbot - https://swiftype.com/swiftbot
|
||||
// YepBot - https://yep.com/yepbot/
|
||||
/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,
|
||||
|
||||
// Algolia Crawler
|
||||
/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
|
||||
|
||||
// Applebot - http://apple.com/go/applebot
|
||||
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
||||
|
||||
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
||||
/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
|
||||
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
||||
|
||||
// ClaudeBot (Anthropic)
|
||||
/(claude(?:bot|-web))\/([\w\.]+)/i,
|
||||
/(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
||||
|
||||
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
||||
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
||||
|
||||
// Daum
|
||||
/(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
|
||||
|
||||
// Facebook / Meta
|
||||
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
||||
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
||||
@@ -79,6 +100,15 @@ const Crawlers = Object.freeze({
|
||||
// Internet Archive (archive.org)
|
||||
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
||||
|
||||
// OnCrawl
|
||||
/(oncrawl) mobile\/([\w\.]+)/i,
|
||||
|
||||
// Qwantbot - https://help.qwant.com/bot
|
||||
/(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
|
||||
|
||||
// SemrushBot - http://www.semrush.com/bot.html
|
||||
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
||||
|
||||
// Sogou Spider
|
||||
/(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
|
||||
|
||||
@@ -86,28 +116,38 @@ const Crawlers = Object.freeze({
|
||||
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
||||
|
||||
// Yandex Bots - https://yandex.com/bots
|
||||
/(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i,
|
||||
/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,
|
||||
|
||||
// Yeti (Naver)
|
||||
/(yeti)\/([\w\.]+)/i,
|
||||
|
||||
// YisouSpider
|
||||
/(yisouspider)\/?([\w\.]*)/i
|
||||
// aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
|
||||
// Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
|
||||
// Freespoke - https://docs.freespoke.com/search/bot/
|
||||
/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
|
||||
],
|
||||
|
||||
[NAME, VERSION, [TYPE, CRAWLER]],
|
||||
|
||||
[
|
||||
// YandexBot MirrorDetector
|
||||
/(yandexbot\/([\w\.]+); mirrordetector)/i
|
||||
],
|
||||
[[NAME, /\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],
|
||||
|
||||
[
|
||||
// Google Bots
|
||||
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
||||
|
||||
// Bytespider
|
||||
// AI2Bot - https://allenai.org/crawler
|
||||
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
||||
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
||||
// Qihoo 360Spider
|
||||
// ImagesiftBot - https://imagesift.com/about
|
||||
// Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
|
||||
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
||||
// v0bot - https://vercel.com/docs/bot-management
|
||||
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
||||
/(360spider-?(?:image|video)?|bytespider|(?:aspiegel|dataforseo|petal|turnitin)bot|(?=yahoo! )slurp)/i
|
||||
// Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
|
||||
/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
|
||||
],
|
||||
[NAME, [TYPE, CRAWLER]]
|
||||
]
|
||||
@@ -160,7 +200,7 @@ const ExtraDevices = Object.freeze({
|
||||
/\b(zur\d{3}) b/i // Swiss ZUR Tablet
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
||||
|
||||
/\b((zeki)?tb.*\b) b/i // Zeki Tablets
|
||||
/^((zeki)?tb.*\b) b/i // Zeki Tablets
|
||||
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
||||
|
||||
/\b([yr]\d{2}) b/i,
|
||||
@@ -199,8 +239,19 @@ const ExtraDevices = Object.freeze({
|
||||
|
||||
const Emails = Object.freeze({
|
||||
browser : [
|
||||
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
||||
[/(evolution|kmail2?|kontact|(?:microsoft |mac)outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, EMAIL]]
|
||||
[
|
||||
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
|
||||
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
|
||||
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
|
||||
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
|
||||
|
||||
// Apple's Mail
|
||||
/(mail)\/([\w\.]+) cf/i
|
||||
], [NAME, VERSION, [TYPE, EMAIL]], [
|
||||
|
||||
// Zimbra
|
||||
/zdesktop\/([\w\.]+)/i
|
||||
], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -211,36 +262,42 @@ const Emails = Object.freeze({
|
||||
const Fetchers = Object.freeze({
|
||||
browser : [
|
||||
[
|
||||
// Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
|
||||
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
||||
// Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
|
||||
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
||||
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
||||
// BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
|
||||
/(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
|
||||
// Google Site Verifier / Meta / Yahoo! Japan
|
||||
// Iframely - https://iframely.com/docs/about
|
||||
// Perplexity-User - https://docs.perplexity.ai/guides/bots
|
||||
// MistralAI-User - https://docs.mistral.ai/robots/
|
||||
// Yandex Bots - https://yandex.com/bots
|
||||
/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
||||
|
||||
// Google Site Verifier
|
||||
/(google-site-verification)\/([\w\.]+)/i,
|
||||
// Bluesky
|
||||
/(bluesky) cardyb\/([\w\.]+)/i,
|
||||
|
||||
// Meta
|
||||
/(meta-externalfetcher)\/([\w\.]+)/i,
|
||||
// Skype
|
||||
/(skypeuripreview) preview\/([\w\.]+)/i,
|
||||
|
||||
// Slackbot - https://api.slack.com/robots
|
||||
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
|
||||
|
||||
// WhatsApp
|
||||
/(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
|
||||
|
||||
// Yahoo! Japan
|
||||
/(y!?j-dlc)\/([\w\.]+)/i,
|
||||
|
||||
// Yandex Bots - https://yandex.com/bots
|
||||
/(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
||||
/(yandex(?:sitelinks|userproxy))/i
|
||||
/(whatsapp)\/([\w\.]+)/i
|
||||
],
|
||||
[NAME, VERSION, [TYPE, FETCHER]],
|
||||
|
||||
// Google Bots / Snapchat
|
||||
[/(feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
|
||||
[
|
||||
// Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
|
||||
/((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
|
||||
],
|
||||
[NAME, [TYPE, FETCHER]],
|
||||
],
|
||||
|
||||
os : [
|
||||
[/whatsapp\/[\d\.]+ (a|i)/i],
|
||||
[[NAME, os => os == 'A' ? 'Android' : 'iOS' ]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -249,12 +306,32 @@ const Fetchers = Object.freeze({
|
||||
///////////////////
|
||||
|
||||
const InApps = Object.freeze({
|
||||
browser : [
|
||||
browser : [[
|
||||
// Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
|
||||
/\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
|
||||
/(flipboard)\/([\w\.]+)/i
|
||||
], [NAME, VERSION, [TYPE, INAPP]], [
|
||||
|
||||
// Evernote/Teams on mobile
|
||||
/(evernote) win/i,
|
||||
/(teams)mobile-(ios|and)/i
|
||||
], [NAME, [TYPE, INAPP]], [
|
||||
|
||||
// Slack
|
||||
[/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
|
||||
/chatlyio\/([\d\.]+)/i],
|
||||
[VERSION, [NAME, 'Slack'], [TYPE, INAPP]], [
|
||||
|
||||
// TikTok Lite
|
||||
/ultralite app_version\/([\w\.]+)/i],
|
||||
[VERSION, [NAME, 'TikTok Lite'], [TYPE, INAPP]], [
|
||||
|
||||
// VS Code
|
||||
/\) code\/([\d\.]+).+electron\//i],
|
||||
[VERSION, [NAME, 'VS Code'], [TYPE, INAPP]], [
|
||||
|
||||
// Yahoo! Japan
|
||||
[/jp\.co\.yahoo\.android\.yjtop\/([\d\.]+)/i], [VERSION, 'Yahoo! Japan', [TYPE, INAPP]]
|
||||
/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i],
|
||||
[VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -264,106 +341,48 @@ const InApps = Object.freeze({
|
||||
|
||||
const MediaPlayers = Object.freeze({
|
||||
browser : [[
|
||||
|
||||
/(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
|
||||
/(coremedia) v([\w\._]+)/i
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
|
||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
|
||||
/(apple(?:coremedia|tv))\/([\w\._]+)/i, // Generic Apple CoreMedia
|
||||
/(coremedia) v([\w\._]+)/i,
|
||||
// Ares/Nexplayer/OSSProxy
|
||||
/(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
|
||||
// Aqualung/Lyssna/BSPlayer/Clementine/MPD
|
||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
|
||||
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
||||
/(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
|
||||
/(lg player|nexplayer)\s([\d\.]+)/i,
|
||||
/player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
/(nexplayer)\s([\w\.-]+)/i // Nexplayer
|
||||
// Nero Home/Nero Scout/Nokia
|
||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
||||
// SoundTap/Totem/Stagefright/Streamium
|
||||
// XBMC/gvfs/Xine/XMMS/irapp
|
||||
/^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i,
|
||||
/(lg player|nexplayer) ([\d\.]+)/i,
|
||||
/player\/(nexplayer|lg player) ([\w\.-]+)/i, // NexPlayer/LG Player
|
||||
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i, // Gstreamer
|
||||
/(htc streaming player) [\w_]+ \/ ([\d\.]+)/i, // HTC Streaming Player
|
||||
/(lavf)([\d\.]+)/i, // Lavf (FFMPEG)
|
||||
// MPlayer SVN
|
||||
/(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
|
||||
/ (songbird)\/([\w\.-]+)/i, // Songbird/Philips-Songbird
|
||||
/(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i, // Winamp
|
||||
/(vlc)(?:\/| media player - version )([\w\.-]+)/i, // VLC Videolan
|
||||
/^(foobar2000|itunes|smp)\/([\d\.]+)/i, // Foobar2000/iTunes/SMP
|
||||
/com\.(riseupradioalarm)\/([\d\.]*)/i, // RiseUP Radio Alarm
|
||||
/(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i, // MPlayer
|
||||
// Windows Media Server
|
||||
/(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(flrp)\/([\w\.-]+)/i // Flip Player
|
||||
], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(fstream|nativehost|queryseekspider)/i
|
||||
// FStream/NativeHost/QuerySeekSpider
|
||||
// MPlayer (no other info)/Media Player Classic/Nero ShowTime
|
||||
// OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
||||
// inlight radio / YourMuze
|
||||
/(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
|
||||
], [NAME, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
|
||||
// Gstreamer
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
/(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i, // HTC One S / Windows Media Player
|
||||
], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
||||
/(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
|
||||
// Java/urllib/requests/wget/cURL
|
||||
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(htc_one_s)\/([\d\.]+)/i, // HTC One S
|
||||
], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
|
||||
// MPlayer SVN
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
|
||||
/(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(mplayer)/i, // MPlayer (no other info)
|
||||
/(yourmuze)/i, // YourMuze
|
||||
/(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
|
||||
], [NAME, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(nokia\d+)\/([\w\.-]+)/i // Nokia
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(winamp)3 version ([\w\.-]+)/i, // Winamp
|
||||
/(winamp)\s([\w\.-]+)/i,
|
||||
/(winamp)mpeg\/([\w\.-]+)/i
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
||||
// inlight radio
|
||||
], [NAME, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
|
||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
||||
// SoundTap/Totem/Stagefright/Streamium
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(smp)([\d\.]+)/i // SMP
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
|
||||
/(vlc)\/([\w\.-]+)/i,
|
||||
/(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
|
||||
/(foobar2000)\/([\d\.]+)/i, // Foobar2000
|
||||
/(itunes)\/([\d\.]+)/i // iTunes
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
|
||||
/(windows-media-player)\/([\w\.-]+)/i
|
||||
], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
|
||||
// Windows Media Server
|
||||
], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
|
||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||
|
||||
/(rad.io)\s([\d\.]+)/i, // Rad.io
|
||||
/(radio.(?:de|at|fr))\s([\d\.]+)/i
|
||||
/(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i // Rad.io
|
||||
], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
|
||||
]
|
||||
});
|
||||
@@ -374,8 +393,36 @@ const MediaPlayers = Object.freeze({
|
||||
|
||||
const Libraries = Object.freeze({
|
||||
browser : [
|
||||
// Axios/jsdom/Scrapy
|
||||
[/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
|
||||
// Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
|
||||
[
|
||||
/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,
|
||||
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
|
||||
/(nutch)-([\w\.-]+)(\(|$)/i,
|
||||
/\((java)\/([\w\.]+)/i
|
||||
], [NAME, VERSION, [TYPE, LIBRARY]]
|
||||
]
|
||||
});
|
||||
|
||||
/////////////
|
||||
// VEHICLES
|
||||
////////////
|
||||
|
||||
const Vehicles = Object.freeze({
|
||||
device : [
|
||||
[/aftlbt962e2/i], // BMW
|
||||
[[VENDOR, 'BMW']],
|
||||
|
||||
[/dilink.+(byd) auto/i], // BYD
|
||||
[VENDOR],
|
||||
|
||||
[/aftlft962x3/i], // Jeep
|
||||
[[VENDOR, 'Jeep'], [MODEL, 'Wagooner']],
|
||||
|
||||
[/(rivian) (r1t)/i], // Rivian
|
||||
[VENDOR, MODEL],
|
||||
|
||||
[/vcc.+netfront/i], // Volvo
|
||||
[[VENDOR, 'Volvo']]
|
||||
]
|
||||
});
|
||||
|
||||
@@ -386,9 +433,12 @@ const Libraries = Object.freeze({
|
||||
const Bots = Object.freeze({
|
||||
browser : [
|
||||
...CLIs.browser,
|
||||
...Crawlers.browser,
|
||||
...Fetchers.browser,
|
||||
...Crawlers.browser,
|
||||
...Libraries.browser
|
||||
],
|
||||
os : [
|
||||
...Fetchers.os
|
||||
]
|
||||
});
|
||||
|
||||
@@ -401,5 +451,6 @@ export {
|
||||
Fetchers,
|
||||
InApps,
|
||||
Libraries,
|
||||
MediaPlayers
|
||||
MediaPlayers,
|
||||
Vehicles
|
||||
};
|
||||
55
src/helpers/ua-parser-helpers.d.ts
vendored
55
src/helpers/ua-parser-helpers.d.ts
vendored
@@ -1,25 +1,40 @@
|
||||
// Type definitions for Helpers submodule of UAParser.js v2.0.0-rc.3
|
||||
// Type definitions for Helpers submodule of UAParser.js v2.0.5
|
||||
// Project: https://github.com/faisalman/ua-parser-js
|
||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||
|
||||
import { IResult } from "../main/ua-parser";
|
||||
import type { IResult } from "../main/ua-parser";
|
||||
|
||||
declare function getDeviceVendor(model: string): string | undefined;
|
||||
declare function isAppleSilicon(res: IResult, useFeatureDetection?: boolean): boolean;
|
||||
declare function isBot(res: IResult): boolean;
|
||||
declare function isChromeFamily(res: IResult): boolean;
|
||||
declare function isElectron(): boolean;
|
||||
declare function isFromEU(): boolean;
|
||||
declare function isFrozenUA(ua: string): boolean;
|
||||
declare function isStandalonePWA(): boolean;
|
||||
export function isFrozenUA(ua: string): boolean;
|
||||
|
||||
export {
|
||||
getDeviceVendor,
|
||||
isAppleSilicon,
|
||||
isBot,
|
||||
isChromeFamily,
|
||||
isElectron,
|
||||
isFromEU,
|
||||
isFrozenUA,
|
||||
isStandalonePWA
|
||||
}
|
||||
/**
|
||||
* @deprecated Moved to `device-detection` submodule
|
||||
*/
|
||||
export function getDeviceVendor(model: string): string | undefined;
|
||||
/**
|
||||
* @deprecated Moved to `device-detection` submodule
|
||||
*/
|
||||
export function isAppleSilicon(resultOrUA: IResult | string): boolean;
|
||||
/**
|
||||
* @deprecated Moved to `bot-detection` submodule
|
||||
*/
|
||||
export function isAIBot(resultOrUA: IResult | string): boolean;
|
||||
/**
|
||||
* @deprecated Moved to `bot-detection` submodule
|
||||
*/
|
||||
export function isBot(resultOrUA: IResult | string): boolean;
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
export function isChromeFamily(resultOrUA: IResult | string): boolean;
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
export function isElectron(): boolean;
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
export function isFromEU(): boolean;
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
export function isStandalonePWA(): boolean;
|
||||
@@ -1,5 +1,5 @@
|
||||
///////////////////////////////////////////////
|
||||
/* Helpers for UAParser.js v2.0.0-rc.3
|
||||
/* Helpers for UAParser.js v2.0.6
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
@@ -8,45 +8,58 @@
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const { UAParser } = require('../main/ua-parser');
|
||||
const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
|
||||
const { isFromEU } = require('detect-europe-js');
|
||||
const { EngineName } = require('../enums/ua-parser-enums');
|
||||
const { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } = require('../device-detection/device-detection');
|
||||
const { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection');
|
||||
const { isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection');
|
||||
const { isFromEU: _isFromEU } = require('../browser-detection/browser-detection');
|
||||
const { isFrozenUA } = require('ua-is-frozen');
|
||||
const { isStandalonePWA } = require('is-standalone-pwa');
|
||||
|
||||
const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
|
||||
/**
|
||||
* @deprecated Moved to `device-detection` submodule
|
||||
*/
|
||||
const getDeviceVendor = _getDeviceVendor;
|
||||
|
||||
const isAppleSilicon = (res, useFeatureDetection) => {
|
||||
if (res.os.is(OS.MACOS)) {
|
||||
if (res.cpu.is(CPU.ARM)) {
|
||||
return true;
|
||||
}
|
||||
if (useFeatureDetection) {
|
||||
try {
|
||||
const canvas = document.createElement('canvas');
|
||||
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
||||
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
||||
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
||||
if (renderer.match(/apple m\d/i)) {
|
||||
return true;
|
||||
}
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* @deprecated Moved to `device-detection` submodule
|
||||
*/
|
||||
const isAppleSilicon = _isAppleSilicon;
|
||||
|
||||
const isBot = (res) => ['cli', 'crawler', 'fetcher', 'library'].includes(res.browser.type);
|
||||
/**
|
||||
* @deprecated Moved to `bot-detection` submodule
|
||||
*/
|
||||
const isAIBot = isAICrawler;
|
||||
|
||||
const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
|
||||
/**
|
||||
* @deprecated Moved to `bot-detection` submodule
|
||||
*/
|
||||
const isBot = _isBot;
|
||||
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
const isChromeFamily = val => !!((typeof val === 'string' ? new UAParser(val).getEngine() : val.engine)?.is(EngineName.BLINK));
|
||||
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
||||
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
const isFromEU = _isFromEU;
|
||||
|
||||
/**
|
||||
* @deprecated Moved to `browser-detection` submodule
|
||||
*/
|
||||
const isStandalonePWA = _isStandalonePWA;
|
||||
|
||||
module.exports = {
|
||||
getDeviceVendor,
|
||||
isAppleSilicon,
|
||||
isAIBot,
|
||||
isBot,
|
||||
isChromeFamily,
|
||||
isElectron,
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// Source: /src/helpers/ua-parser-helpers.js
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/* Helpers for UAParser.js v2.0.0-rc.3
|
||||
/* Helpers for UAParser.js v2.0.6
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
AGPLv3 License */
|
||||
@@ -12,38 +12,34 @@
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
import { UAParser } from '../main/ua-parser.mjs';
|
||||
import { CPU, OS, Engine } from '../enums/ua-parser-enums.mjs';
|
||||
import { EngineName } from '../enums/ua-parser-enums.mjs';
|
||||
import { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } from '../device-detection/device-detection.mjs';
|
||||
import { isBot: _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs';
|
||||
import { isFromEU } from 'detect-europe-js';
|
||||
import { isFrozenUA } from 'ua-is-frozen';
|
||||
import { isStandalonePWA } from 'is-standalone-pwa';
|
||||
|
||||
const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
|
||||
/**
|
||||
* @deprecated Moved to `device-detection` submodule
|
||||
*/
|
||||
const getDeviceVendor = _getDeviceVendor;
|
||||
|
||||
const isAppleSilicon = (res, useFeatureDetection) => {
|
||||
if (res.os.is(OS.MACOS)) {
|
||||
if (res.cpu.is(CPU.ARM)) {
|
||||
return true;
|
||||
}
|
||||
if (useFeatureDetection) {
|
||||
try {
|
||||
const canvas = document.createElement('canvas');
|
||||
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
||||
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
||||
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
||||
if (renderer.match(/apple m\d/i)) {
|
||||
return true;
|
||||
}
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* @deprecated Moved to `device-detection` submodule
|
||||
*/
|
||||
const isAppleSilicon = _isAppleSilicon;
|
||||
|
||||
const isBot = (res) => ['cli', 'crawler', 'fetcher', 'library'].includes(res.browser.type);
|
||||
/**
|
||||
* @deprecated Moved to `bot-detection` submodule
|
||||
*/
|
||||
const isAIBot = isAICrawler;
|
||||
|
||||
const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
|
||||
/**
|
||||
* @deprecated Moved to `bot-detection` submodule
|
||||
*/
|
||||
const isBot = _isBot;
|
||||
|
||||
const isChromeFamily = val => !!((typeof val === 'string' ? new UAParser(val).getEngine() : val.engine)?.is(EngineName.BLINK));
|
||||
|
||||
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
||||
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||
@@ -51,6 +47,7 @@ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') ||
|
||||
export {
|
||||
getDeviceVendor,
|
||||
isAppleSilicon,
|
||||
isAIBot,
|
||||
isBot,
|
||||
isChromeFamily,
|
||||
isElectron,
|
||||
|
||||
21
src/main/ua-parser.d.ts
vendored
21
src/main/ua-parser.d.ts
vendored
@@ -1,7 +1,9 @@
|
||||
// Type definitions for UAParser.js v2.0.0-rc.3
|
||||
// Type definitions for UAParser.js v2.0.6
|
||||
// Project: https://github.com/faisalman/ua-parser-js
|
||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||
|
||||
import { BrowserType, CPUArch, DeviceType, EngineName } from "../enums/ua-parser-enums";
|
||||
|
||||
declare namespace UAParser {
|
||||
|
||||
interface IData<T> {
|
||||
@@ -15,21 +17,21 @@ declare namespace UAParser {
|
||||
name?: string;
|
||||
version?: string;
|
||||
major?: string;
|
||||
type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'mediaplayer' | 'library';
|
||||
type?: typeof BrowserType[keyof typeof BrowserType];
|
||||
}
|
||||
|
||||
interface ICPU extends IData<ICPU> {
|
||||
architecture?: 'ia32' | 'ia64' | 'amd64' | 'arm' | 'arm64' | 'armhf' | 'avr' | 'avr32' | 'irix' | 'irix64' | 'mips' | 'mips64' | '68k' | 'pa-risc' | 'ppc' | 'sparc' | 'sparc64';
|
||||
architecture?: typeof CPUArch[keyof typeof CPUArch];
|
||||
}
|
||||
|
||||
interface IDevice extends IData<IDevice> {
|
||||
type?: 'mobile' | 'tablet' | 'console' | 'smarttv' | 'wearable' | 'xr' | 'embedded';
|
||||
type?: typeof DeviceType[keyof typeof DeviceType];
|
||||
vendor?: string;
|
||||
model?: string;
|
||||
}
|
||||
|
||||
interface IEngine extends IData<IEngine> {
|
||||
name?: 'Amaya' | 'ArkWeb' | 'Blink' | 'EdgeHTML' | 'Flow' | 'Gecko' | 'Goanna' | 'iCab' | 'KHTML' | 'LibWeb' | 'Links' | 'Lynx' | 'NetFront' | 'NetSurf' | 'Presto' | 'Servo' | 'Tasman' | 'Trident' | 'w3m' | 'WebKit';
|
||||
name?: typeof EngineName[keyof typeof EngineName];
|
||||
version?: string;
|
||||
}
|
||||
|
||||
@@ -50,11 +52,12 @@ declare namespace UAParser {
|
||||
type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[];
|
||||
type UAParserProps = 'browser' | 'cpu' | 'device' | 'engine' | 'os';
|
||||
type UAParserExt = Partial<Record<UAParserProps, RegexMap>> | Partial<Record<UAParserProps, RegexMap>>[];
|
||||
export type UAParserHeaders = Record<string, string | string[] | undefined> | Headers;
|
||||
|
||||
export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: Record<string, string>): IResult;
|
||||
export function UAParser(uastring?: string, headers?: Record<string, string>): IResult;
|
||||
export function UAParser(extensions?: UAParserExt, headers?: Record<string, string>): IResult;
|
||||
export function UAParser(headers?: Record<string, string>): IResult;
|
||||
export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: UAParserHeaders): IResult;
|
||||
export function UAParser(uastring?: string, headers?: UAParserHeaders): IResult;
|
||||
export function UAParser(extensions?: UAParserExt, headers?: UAParserHeaders): IResult;
|
||||
export function UAParser(headers?: UAParserHeaders): IResult;
|
||||
|
||||
export class UAParser {
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
242
test/data/ua-ch/headers.js
Normal file
242
test/data/ua-ch/headers.js
Normal file
@@ -0,0 +1,242 @@
|
||||
const UACHTests = [
|
||||
{
|
||||
desc: 'Avast Secure Browser',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Avast Secure Browser";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Avast Secure Browser',
|
||||
version : '131',
|
||||
major : '131',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Brave',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Brave";v="132"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Brave',
|
||||
version : '132',
|
||||
major : '132',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Chrome',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Chrome',
|
||||
version : '111',
|
||||
major : '111',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Chrome Headless',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Chromium";v="124", "HeadlessChrome";v="124", "Not-A.Brand";v="99"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Chrome Headless',
|
||||
version : '124',
|
||||
major : '124',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Chrome WebView',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Android WebView";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Chrome WebView',
|
||||
version : '123',
|
||||
major : '123',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'DuckDuckGo',
|
||||
headers : {
|
||||
'sec-ch-ua': '"DuckDuckGo";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
},
|
||||
expect : {
|
||||
browser : {
|
||||
name : 'DuckDuckGo',
|
||||
version : '131',
|
||||
major : '131',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Edge',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Edge',
|
||||
version : '120',
|
||||
major : '120',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Edge WebView2',
|
||||
headers : {
|
||||
'sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103", "Microsoft Edge WebView2";v="104"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Edge WebView2',
|
||||
version : '104',
|
||||
major : '104',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Huawei Browser',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "HuaweiBrowser";v="114"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Huawei Browser',
|
||||
version : '114',
|
||||
major : '114',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'MIUI Browser',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Miui Browser";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'MIUI Browser',
|
||||
version : '123',
|
||||
major : '123',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Oculus Browser',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Chromium";v="130", "Oculus Browser";v="36", "Not?A_Brand";v="99"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Oculus Browser',
|
||||
version : '36',
|
||||
major : '36',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Opera',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Opera";v="116", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Opera',
|
||||
version : '116',
|
||||
major : '116',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Opera GX',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Opera GX";v="114"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Opera GX',
|
||||
version : '114',
|
||||
major : '114',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Opera Mobi',
|
||||
headers : {
|
||||
'sec-ch-ua': '"OperaMobile";v="86", ";Not A Brand";v="99", "Opera";v="115", "Chromium";v="130"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Opera Mobi',
|
||||
version : '86',
|
||||
major : '86',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Opera Mobi',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Chromium";v="132", "OperaMobile";v="87", "Opera";v="117", " Not A;Brand";v="99"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Opera Mobi',
|
||||
version : '87',
|
||||
major : '87',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Samsung Internet',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Chromium";v="125", "Not.A/Brand";v="24", "Samsung Internet";v="27.0"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Samsung Internet',
|
||||
version : '27.0',
|
||||
major : '27',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: 'Yandex',
|
||||
headers : {
|
||||
'sec-ch-ua': '"Chromium";v="130", "YaBrowser";v="24.12", "Not?A_Brand";v="99", "Yowser";v="2.5"'
|
||||
},
|
||||
expect: {
|
||||
browser : {
|
||||
name : 'Yandex',
|
||||
version : '24.12',
|
||||
major : '24',
|
||||
type : undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
module.exports = UACHTests;
|
||||
@@ -171,6 +171,16 @@
|
||||
"major" : "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Atlas",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Atlas/1.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Atlas",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Avant",
|
||||
"ua" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB5; Avant Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
|
||||
@@ -271,6 +281,26 @@
|
||||
"major" : "11"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Bing",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/605.1.15 BingSapphire/31.8.430522001",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Bing",
|
||||
"version" : "31.8.430522001",
|
||||
"major" : "31"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Bing",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 9; MIX 2 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4893.0 Mobile Safari/537.36 BingWeb/6.9.12",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Bing",
|
||||
"version" : "6.9.12",
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Blazer",
|
||||
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/hspr-H102; Blazer/4.0) 16;320x320",
|
||||
@@ -511,6 +541,16 @@
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Dooble",
|
||||
"ua" : "Mozilla/5.0 (X11; Haiku BePC) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.15.17 Chrome/87.0.4280.144 Safari/537.36 Dooble/2023.12.25 Dooble/2023.12.25",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Dooble",
|
||||
"version" : "2023.12.25",
|
||||
"major" : "2023"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Doris",
|
||||
"ua" : "Doris/1.15 [en] (Symbian)",
|
||||
@@ -541,6 +581,26 @@
|
||||
"major" : "5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Ecosia on Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 10; SM-G975U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36 (Ecosia android@85.0.4183.127)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Ecosia",
|
||||
"version" : "85.0.4183.127",
|
||||
"major" : "85"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Ecosia on iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 (Ecosia ios@3.0.1.533)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Ecosia",
|
||||
"version" : "3.0.1.533",
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Epiphany",
|
||||
"ua" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20040628 Epiphany/1.2.6",
|
||||
@@ -581,6 +641,16 @@
|
||||
"major" : "55"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "PaleMoon",
|
||||
"ua" : "(Windows NT 6.2; WOW64) KHTML/4.11 Gecko/20130308 Firefox/23.0 (PaleMoon/20.3)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "PaleMoon",
|
||||
"version" : "20.3",
|
||||
"major" : "20"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "PaleMoon",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:52.9) Gecko/20100101 Goanna/3.4 Firefox/52.9 PaleMoon/27.6.1",
|
||||
@@ -1006,6 +1076,16 @@
|
||||
"major" : "5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Otter",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/602.1 (KHTML, like Gecko) Otter/1.0.81",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Otter",
|
||||
"version" : "1.0.81",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "PicoBrowser",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; Pico Neo3 Link OS5.8.4.0 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.22 Chrome/105.0.5195.68 VR Safari/537.36",
|
||||
@@ -1067,13 +1147,33 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "LibreWolf",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 LibreWolf/91.0",
|
||||
"desc" : "Surf Browser",
|
||||
"ua" : "Mozilla/5.0 (Android 6.0; HUAWEI ALE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 SurfBrowser/3.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "LibreWolf",
|
||||
"version" : "91.0",
|
||||
"major" : "91"
|
||||
"name" : "Surf",
|
||||
"version" : "3.0",
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "LG Browser",
|
||||
"ua" : "Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ LG Browser/6.00.00(+mouse+3D+SCREEN+TUNER; LGE; 47LA621V-ZD; 04.28.17; 0x00000001;); LG NetCast.TV-2013 /04.28.17 (LG, 47LA621V-ZD, wired)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "LG Browser",
|
||||
"version" : "6.00.00",
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Ladybird",
|
||||
"ua" : "Mozilla/5.0 (Linux; x86_64) Ladybird/1.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Ladybird",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1278,6 +1378,16 @@
|
||||
"major" : "5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mozilla",
|
||||
"ua" : "Mozilla/2.02 [fr] (WinNT; I)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mozilla",
|
||||
"version" : "2.02",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MSIE",
|
||||
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0b1; Mac_PowerPC)",
|
||||
@@ -1618,6 +1728,46 @@
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "qutebrowser",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) qutebrowser/2.4.0 QtWebEngine/5.15.6 Chrome/95.0.4628.2 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "qutebrowser",
|
||||
"version" : "2.4.0",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Qwant",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) QwantMobile/6.7.6 Mobile/15E148 Safari/605.1.15",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Qwant",
|
||||
"version" : "6.7.6",
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Qwant",
|
||||
"ua" : "QwantMobile/2.0 (Android 8.0.0; Mobile; rv:59.0) Gecko/59.0 Firefox/59.0 QwantBrowser/59.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Qwant",
|
||||
"version" : "59.0",
|
||||
"major" : "59"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Qwant",
|
||||
"ua" : "QwantMobile/2.0 (iPad; CPU OS 15_8_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) QwantiOS/2.7.0b1 Mobile/15E148 Safari/605.1.15",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Qwant",
|
||||
"version" : "2.0",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Rekonq 2",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) rekonq/2.2.1 Safari/537.21",
|
||||
@@ -2159,6 +2309,26 @@
|
||||
"major" : "74"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Microsoft Edge WebView",
|
||||
"ua" : "Mozilla/5.0 (Windows IoT 10.0; Android 6.0.1; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Edge WebView",
|
||||
"version" : "18.17763",
|
||||
"major" : "18"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Microsoft Edge WebView2",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 11; SM-G991B Build/RP1A.200720.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.120 Mobile Safari/537.36 EdgW/1.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Edge WebView2",
|
||||
"version" : "91.0.4472.120",
|
||||
"major" : "91"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Iridium",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Iridium/43.8 Safari/537.36 Chrome/43.0.2357.132",
|
||||
@@ -2493,6 +2663,26 @@
|
||||
"type" : "inapp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Daum App Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 11; SM-G970N Build/RP1A.200720.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 DaumApps/7.5.0 DaumDevice/mobile",
|
||||
"expect" : {
|
||||
"name" : "Daum",
|
||||
"version": "7.5.0",
|
||||
"major" : "7",
|
||||
"type" : "inapp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Daum App iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Safari/605.1.15 Mobile/15E148 DaumApps/7.5.1 DaumDevice/mobile",
|
||||
"expect" : {
|
||||
"name" : "Daum",
|
||||
"version": "7.5.1",
|
||||
"major" : "7",
|
||||
"type" : "inapp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "TikTok",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 11; 21061119AG Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 trill_2022109040 JsSdk/1.0 NetType/MOBILE Channel/googleplay AppName/musical_ly app_version/21.9.4 ByteLocale/ru-RU ByteFullLocale/ru-RU Region/KG BytedanceWebview/d8a21c6",
|
||||
@@ -2585,5 +2775,27 @@
|
||||
"major" : "10",
|
||||
"type" : "inapp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Zalo on iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Zalo/20.05.01 Mobile/15E148",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Zalo",
|
||||
"version" : "20.05.01",
|
||||
"major" : "20",
|
||||
"type" : "inapp"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Zalo on Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 10; Vsmart Live Build/QKQ1.190918.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 Zalo/20.04.02.r1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Zalo",
|
||||
"version" : "20.04.02.r1",
|
||||
"major" : "20",
|
||||
"type" : "inapp"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -7,6 +7,14 @@
|
||||
"architecture" : "ia32"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "i686",
|
||||
"ua" : "Mozilla/5.0 (X11; U; CrOS i686 9.10.0; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.253.0 Safari/532.5",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "ia32"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "i386",
|
||||
"ua" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20040628 Epiphany/1.2.6",
|
||||
@@ -79,6 +87,22 @@
|
||||
"architecture" : "amd64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Alpha",
|
||||
"ua" : "Mozilla/3.01 (WinNT; I) [AXP]",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "alpha"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Alpha",
|
||||
"ua" : "Mozilla/5.0 (X11; OpenBSD alpha; rv:78.0) Gecko/20100101 Firefox/78.0",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "alpha"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "ARM",
|
||||
"ua" : "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
|
||||
@@ -167,6 +191,14 @@
|
||||
"architecture" : "arm64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Google Search App",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 9; JAT-LX1 Build/HONORJAT-LX1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.96 Mobile Safari/537.36 GoogleApp/11.11.10.21.arm",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "arm"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Google Search App",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0; M5s Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.147 Mobile Safari/537.36 GSA/12.40.17.23.arm64",
|
||||
@@ -257,10 +289,26 @@
|
||||
},
|
||||
{
|
||||
"desc" : "68k",
|
||||
"ua" : "'Mozilla/1.1 (Macintosh; U; 68K)'",
|
||||
"ua" : "Mozilla/1.1 (Macintosh; U; 68K)",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "68k"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MC680x0",
|
||||
"ua" : "AmigaVoyager/3.2 (AmigaOS/MC680x0)",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "68k"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "x86",
|
||||
"ua" : "Mozilla/5.0 (Photon; U; QNX x86pc; en-US; rv:1.8.1.20) Gecko/20090127 BonEcho/2.0.0.20",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "ia32"
|
||||
}
|
||||
}
|
||||
]
|
||||
320
test/data/ua/device/_others.json
Normal file
320
test/data/ua/device/_others.json
Normal file
@@ -0,0 +1,320 @@
|
||||
[
|
||||
{
|
||||
"desc": "Generic Android Device",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 9; X96mini_RP Build/X96mini_RP)",
|
||||
"expect": {
|
||||
"vendor": "Generic",
|
||||
"model": "X96mini_RP"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Generic Android Device",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; i980 Build/MRA58K)",
|
||||
"expect": {
|
||||
"vendor": "Generic",
|
||||
"model": "i980"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "K",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "K",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown VR Device",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.2; Unknown Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile VR Safari/537.36",
|
||||
"expect": {
|
||||
"model": "Unknown",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Desktop (IE11 with Tablet string)",
|
||||
"ua": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; GWX:MANAGED; rv:11.0) like Gecko",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Mobile (DuckDuckGo mobile browser)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile DuckDuckGo/5 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ChangHong Android TV",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; ChangHong Android TV Build/LMY49J) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/10.8 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "ChangHong",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "MStar Android TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.3.1; MStar Android TV Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.95 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "MStar",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ONIDA Android TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; ONIDA Android TV Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2542.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "ONIDA",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "JVC LT-43V55LFA Smart TV",
|
||||
"ua": "Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 OPR/40.0.2207.0 OMI/4.9.0.237.DOM3-OPT.245 Model/Vestel-MB211 VSTVB MB200 HbbTV/1.2.1 (; JVC; MB211; 3.19.4.2; _TV_NT72563_2017 SmartTvA/3.0.0",
|
||||
"expect": {
|
||||
"vendor": "JVC",
|
||||
"model": "MB211",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "JVC LT-43V65LUA Smart TV",
|
||||
"ua": "Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 OPR/40.0.2207.0 OMI/4.9.0.237.DOM3-OPT.245 Model/Vestel-MB130 VSTVB MB100 HbbTV/1.2.1 (; JVC; MB130; 5.7.20.0; _TV_G10_2017;) SmartTvA/3.0.0",
|
||||
"expect": {
|
||||
"vendor": "JVC",
|
||||
"model": "MB130",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Loewe Smart TV",
|
||||
"ua": "Mozilla/5.0 (Linux; U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 OPR/46.0.2207.0 LOEWE-SL410/5.2.0.0 HbbTV/1.4.1 (; LOEWE; SL410; LOH/5.2.0.0;;) FVC/3.0 (LOEWE; SL410;) CE-HTML/1.0 Config (L:deu,CC:DEU) NETRANGEMMH",
|
||||
"expect": {
|
||||
"vendor": "LOEWE",
|
||||
"model": "SL410",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Issue #747",
|
||||
"ua": "python-requests/2.25.1",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Issue #454",
|
||||
"ua": "Mosamzilla/5.0 (Windows; U; Win98; en-US; rv:1.7.5) Gecko/20050603 Netscape/8.0.2",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SmartTV",
|
||||
"ua": "Mozilla/5.0 (SMART-TV; X11; Linux armv7l) AppleWebkit/537.42 (KHTML, like Gecko) Safari/537.42",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Android Phone Unidentified Vendor (docomo F-04K)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; F-04K Build/V15R060P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"model": "F-04K",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Android Tablet Unidentified Vendor (docomo F-02K)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; F-02K Build/V44R059G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Safari/537.36",
|
||||
"expect": {
|
||||
"model": "F-02K",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Android Tablet Unidentified Vendor (docomo d-02K)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; d-02K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Safari/537.36",
|
||||
"expect": {
|
||||
"model": "d-02K",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Android TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; 2020/2021 UHD Android TV Build/QTG3.201102.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown Mobile using Firefox",
|
||||
"ua": "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown Tablet using Firefox",
|
||||
"ua": "Mozilla/5.0 (Android 4.4; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown Mobile using Focus for Android",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Focus/1.0 Chrome/59.0.3029.83 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown Tablet using Focus for Android",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Focus/1.0 Chrome/59.0.3029.83 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown Device using Focus for Android with GeckoView",
|
||||
"ua": "Mozilla/5.0 (Android 7.0; Mobile; rv:62.0) Gecko/62.0 Firefox/62.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown Mobile using Firefox OS",
|
||||
"ua": "Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown Tablet using Firefox OS",
|
||||
"ua": "Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown TV using Firefox OS",
|
||||
"ua": "Mozilla/5.0 (TV; rv:44.0) Gecko/44.0 Firefox/44.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown TV",
|
||||
"ua": "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Large Screen Safari/533.4 GoogleTV/ 162671",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown TV",
|
||||
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown VR Device using Firefox Reality",
|
||||
"ua": "Mozilla/5.0 (Android 10; Mobile VR; rv:123.0) Gecko/123.0 Firefox/123.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Unknown VR Device using Wolvic",
|
||||
"ua": "Mozilla/5.0 (Android 14; Mobile VR; rv:128.0) Gecko/128.0 Firefox/128.0 Wolvic/1.8",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Smart TV",
|
||||
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 HbbTV/1.6.1 ( DRM; LGE/ATMACA/GRAETZ; GR32S1470; WEBOS22 04.41.53; W22_K8AP; DTV_C22L;) LaTivu_1.0.1_2022",
|
||||
"expect": {
|
||||
"vendor": "GRAETZ",
|
||||
"model": "GR32S1470",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Smart TV",
|
||||
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 HbbTV/1.5.1 (+DRM; LGE/DUALSHINE/SKYTECH; ST-5090; WEBOS5.0 04.50.63; W50_K6LP; DTV_C20P;)",
|
||||
"expect": {
|
||||
"vendor": "SKYTECH",
|
||||
"model": "ST-5090",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Smart TV",
|
||||
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 HbbTV/1.6.1 (+DRM; LGE/SILICONPLAYER/Hyundai; 50HYN3205; WEBOS22 04.42.26; W22_K8LP; DTV_C22P;)",
|
||||
"expect": {
|
||||
"vendor": "Hyundai",
|
||||
"model": "50HYN3205",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "PDA with Windows CE",
|
||||
"ua": "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows IoT",
|
||||
"ua" : "Mozilla/5.0 (Windows IoT 10.0; Android 6.0.1; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "embedded"
|
||||
}
|
||||
}
|
||||
]
|
||||
11
test/data/ua/device/acer.json
Normal file
11
test/data/ua/device/acer.json
Normal file
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"desc": "Acer Iconia A1-810",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; A1-810 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Acer",
|
||||
"model": "A1-810",
|
||||
"type": "tablet"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/advan.json
Normal file
29
test/data/ua/device/advan.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "Advan M4",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0; ADVAN M4 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.119 Mobile Safari/537.36 OPR/28.0.2254.119214",
|
||||
"expect": {
|
||||
"vendor": "ADVAN",
|
||||
"model": "M4",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Advan S40",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; ADVAN S40 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Mobile Safari/537.36 EdgA/79.0.309.58",
|
||||
"expect": {
|
||||
"vendor": "ADVAN",
|
||||
"model": "S40",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Advan Sketsa 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; ADVAN 1011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.101 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ADVAN",
|
||||
"model": "1011",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/alcatel.json
Normal file
29
test/data/ua/device/alcatel.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "Alcatel 4056W",
|
||||
"ua": "Mozilla/5.0 (Mobile; ALCATEL 4056W; rv:84.0) Gecko/84.0 Firefox/84.0 KAIOS/3.0",
|
||||
"expect": {
|
||||
"vendor": "ALCATEL",
|
||||
"model": "4056W",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Alcatel A564C",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; ALCATEL A564C Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ALCATEL",
|
||||
"model": "A564C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Alcatel Go Flip",
|
||||
"ua": "Mozilla/5.0 (Mobile; ALCATEL4044T; rv:37.0) Gecko/37.0 Firefox/37.0 KaiOS/1.0",
|
||||
"expect": {
|
||||
"vendor": "ALCATEL",
|
||||
"model": "4044T",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
137
test/data/ua/device/amazon.json
Normal file
137
test/data/ua/device/amazon.json
Normal file
@@ -0,0 +1,137 @@
|
||||
[
|
||||
{
|
||||
"desc": "Kindle Fire HD",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "KFTT",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Kindle Fire HD",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated=true",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "KFTT",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Echo Show 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; AEORK Build/LVY48F; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "AEORK",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Echo Show 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1; AEOCH) AppleWebKit/537.36 (KHTML, like Gecko) Silk/77.2.21 like Chrome/77.0.3865.92 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "AEOCH",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Echo Show 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.2; AEOCW) AppleWebKit/537.36 (KHTML, like Gecko) Silk/106.3.3 like Chrome/106.0.5249.170 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "AEOCW",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Echo Show 15",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; AEOHY) AppleWebKit/537.36 (KHTML, like Gecko) Silk/112.6.3 like Chrome/112.0.5615.213 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "AEOHY",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Echo Dot",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 5.1.1; AEOBC Build/LVY48F)",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "AEOBC",
|
||||
"type": "embedded"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Kindle Fire Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.4.3; en-us; KFSAWI Build/KTU84M) AppleWebKit/537.36 (KHTML, like Gecko) Silk/3.66 like Chrome/39.0.2171.93 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "KFSAWI",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Kindle Fire Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.4.3; en-us; KFSAWI) AppleWebKit/537.36 (KHTML, like Gecko) Silk/3.66 like Chrome/39.0.2171.93 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "KFSAWI",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Kindle Fire Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; KFMAWI Build/PS7312; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "KFMAWI",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Fire TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; AFTB Build/JDQ39) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.173 Mobile Safari/537.22",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "B",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Fire TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; AFTT) AppleWebKit/537.36 (KHTML, like Gecko) Silk/86.3.20 like Chrome/86.0.4240.198 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "T",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Fire TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; AFTKA Build/PS7633.3445N; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/108.0.5359.160 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "KA",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Fire 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; KFAUWI) AppleWebKit/537.36 (KHTML, like Gecko) Silk/80.5.3 like Chrome/80.0.3987.162 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "KFAUWI",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Amazon Alexa Echo Show",
|
||||
"ua": "AlexaWebMediaPlayer/1.0.200641.0 (Linux;Android 5.1.1)",
|
||||
"expect": {
|
||||
"vendor": "Amazon",
|
||||
"model": "Alexa",
|
||||
"type": "tablet"
|
||||
}
|
||||
}
|
||||
]
|
||||
11
test/data/ua/device/anbernic.json
Normal file
11
test/data/ua/device/anbernic.json
Normal file
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"desc": "Anbernic",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; RGCUBE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Anbernic",
|
||||
"model": "RGCUBE",
|
||||
"type": "console"
|
||||
}
|
||||
}
|
||||
]
|
||||
245
test/data/ua/device/apple.json
Normal file
245
test/data/ua/device/apple.json
Normal file
@@ -0,0 +1,245 @@
|
||||
[
|
||||
{
|
||||
"desc": "Apple Desktop",
|
||||
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "Macintosh",
|
||||
"type": "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Apple Watch",
|
||||
"ua": "atc/1.0 watchOS/7.3.3 model/Watch4,2 hwp/t8006 build/18S830 (6; dt:191)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "watch",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using UCBrowser",
|
||||
"ua": "Mozilla/5.0 (iPad; U; CPU OS 11_2 like Mac OS X; zh-CN; iPad5,3) AppleWebKit/534.46 (KHTML, like Gecko) UCBrowser/3.0.1.776 U3/ Mobile/10A403 Safari/7543.48.3",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad Air",
|
||||
"ua": "Mozilla/5.0 (iPad; CPU OS 12_4_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPad4,1;FBMD/iPad;FBSN/iOS;FBSV/12.4.5;FBSS/2;FBID/tablet;FBLC/en_US;FBOP/5;FBCR/]",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using Facebook Browser",
|
||||
"ua": "Mozilla/5.0 (iPad; CPU OS 14_4_2 like Mac OS X) WebKit/8610 (KHTML, like Gecko) Mobile/18D70 [FBAN/FBIOS;FBDV/iPad7,11;FBMD/iPad;FBSN/iOS;FBSV/14.4.2;FBSS/2;FBID/tablet;FBLC/en_US;FBOP/5]",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using Chrome",
|
||||
"ua": "Mozilla/5.0 (iPad13,10; CPU OS 16_6_2 like Mac OS X) AppleWebKit/602.3 (KHTML, like Gecko) CriOS/97.0.0.5927.72 Mobile/11S296 Safari/602.3",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using DuckDuckGo",
|
||||
"ua": "Mozilla/5.0 (iPad; iPad13,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) DuckDuckGo/130.0.0.0 Mobile/15E148 Safari/604.1",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using Discord",
|
||||
"ua": "Discord/52.0 (iPad; iOS 14.4; Scale/2.00)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using Firefox",
|
||||
"ua": "Mozilla/5.0 (iPad; iPad14,2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Firefox/120.0 Mobile/15E148 Safari/604.1",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using iTunes",
|
||||
"ua": "itunesstored/1.0 iOS/15.6.1 model/iPad13,8 hwp/t8103 build/19G82 (5; dt:238)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using MS OneNote",
|
||||
"ua": "Microsoft Office OneNote/16.81/240108 (iOS/16.5.1; Tablet; AppStore; Apple/iPad8,3)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using MS Word",
|
||||
"ua": "Microsoft Office Word/2.44.1211 (iOS/13.7; Tablet; es-MX; AppStore; Apple/iPad11,3)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using Quora",
|
||||
"ua": "Quora 8.4.30 rv:3230 env:prod (iPad11,3; iPadOS 17.7; en_GB) AppleWebKit",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using TuneIn Radio",
|
||||
"ua": "TuneIn Radio/27.1.0; iPad6,3; iPadOS/16.6",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using TuneIn Radio Pro",
|
||||
"ua": "TuneIn Radio Pro/21.4.1; iPad8,9; iOS/15.0",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPad using YouTube",
|
||||
"ua": "com.google.ios.youtube/20.31.6 (iPad13,5; U; CPU iPadOS 18_6 like Mac OS X; en_US)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPod",
|
||||
"ua": "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPod touch",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPhone",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPhone using Spotify",
|
||||
"ua": "Spotify/8.7.70 iOS/16.0 (iPhone15,3)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone15,3",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPhone SE",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone8,4;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/2;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPhone SE using Facebook App",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone8,4;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/2;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPhone 11 Pro Max",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone12,5;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/3;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPhone XS",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone11,2;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/3;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iPod touch",
|
||||
"ua": "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPod touch",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "FaceBook Mobile App",
|
||||
"ua": "[FBAN/FBIOS;FBAV/283.0.0.44.117;FBBV/238386386;FBDV/iPhone12,1;FBMD/iPhone;FBSN/iOS;FBSV/13.6.1;FBSS/2;FBID/phone;FBLC/en_US;FBOP/5;FBRV/240127608]",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone12,1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Apple HomePod",
|
||||
"ua": "AppleCoreMedia/1.0.0.15D61 (HomePod; U; CPU OS 11_2_5 like Mac OS X; en_us)",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "HomePod",
|
||||
"type": "embedded"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Issue #519",
|
||||
"ua": "ios/iPhone/14.2/SOME_CUSTOM_APP_VERSION",
|
||||
"expect": {
|
||||
"vendor": "Apple",
|
||||
"model": "iPhone",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
227
test/data/ua/device/archos.json
Normal file
227
test/data/ua/device/archos.json
Normal file
@@ -0,0 +1,227 @@
|
||||
[
|
||||
{
|
||||
"desc": "Archos 5",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 1.6; fr-fr; Archos5 Build/Donut) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "5",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 40b Titanium Surround",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; Archos 40b Titanium Surround Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "40b Titanium Surround",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 40c Titanium v2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; ARCHOS 40C TIv2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "40C TIv2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 45 Neon",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; Archos 45 Neon Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "45 Neon",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 45 Neon",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; AC45NE Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 YaBrowser/15.6.2311.6088.00 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "AC45NE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 45B Helium",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; AC45BHE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "AC45BHE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 45B Titanium",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; Archos 45B Titanium) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "45B Titanium",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 50 Cesium",
|
||||
"ua": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; ARCHOS; AC50CE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "AC50CE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 50B Helium 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; AC50BHE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "AC50BHE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 55 diamond Selfie",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; Archos 55 diamond Selfie Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.91 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "55 diamond Selfie",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 80 G9",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.0.4; zh-tw; ARCHOS 80G9 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "80G9",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 80 Xenon",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.1.2; Archos 80 Xenon Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.99 Safari/537.36 OPR/50.6.2426.201126",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "80 Xenon",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 97c Platinum",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; Archos 97c Platinum Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "97c Platinum",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 101 Access 3G V2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; Archos Access 101 3G V2 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.130 Safari/537.36[FBAN/EMA;FBLC/pt_PT;FBAV/360.0.0.7.53;]",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "Access 101 3G V2",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 101 Oxygen 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Archos 101 Oxygen 4G Build/O11019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.71 Safari/537.36 [FB_IAB/FB4A;FBAV/374.0.0.20.109;]",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "101 Oxygen 4G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 101 Platinum 3G V2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; AC101PL3GV2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "AC101PL3GV2",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 101B Helium 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; AC101BHE Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "AC101BHE",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos 101s Oxygen Ardoiz",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Archos Oxygen 101S ARDOIZ Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.102 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "Oxygen 101S ARDOIZ",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos GAMEPAD2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS GAMEPAD2 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "GAMEPAD2",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos Hello 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Archos Hello 7 Build/O11019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.53 Safari/537.36 GoogleApp/13.24.9.26.arm64",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "Hello 7",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos Sense 101 X",
|
||||
"ua": "Mozilla/5.0 (Linux; arm; Android 7.0; Archos Sense 101 X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 YaBrowser/20.2.0.215.01 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "Sense 101 X",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos T101 FHD WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; ARCHOS T101 FHD WiFi Build/T00624; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/124.0.6367.159 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "T101 FHD WiFi",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos Tikeasy 10d",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; Tikeasy 10d Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.260 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "Tikeasy 10d",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos T96 WIFI",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; ARCHOS T96 WIFI_EEA Build/RP1A.201005.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/102.0.5005.78 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "T96 WIFI_EEA",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Archos X67 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; X67 5G Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.58 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Archos",
|
||||
"model": "X67 5G",
|
||||
"type": "tablet"
|
||||
}
|
||||
}
|
||||
]
|
||||
164
test/data/ua/device/asus.json
Normal file
164
test/data/ua/device/asus.json
Normal file
@@ -0,0 +1,164 @@
|
||||
[
|
||||
{
|
||||
"desc": "ASUS Nexus 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "Nexus 7",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Padfone",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.1.1; PadFone 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "PadFone",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS ZenPad 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; P00C Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "P00C",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS ZenPad Z8s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; ASUS_P00J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.111 Safari/537.36\n",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "P00J",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS ROG",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; ZS600KL Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.126 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "ZS600KL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS ROG II",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; ASUS_I001DA Build/PKQ1.190414.001; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "I001DA",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0; ASUS ZenFone 2 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "ZenFone 2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone 3 Deluxe",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; ASUS_Z016D Build/MXB48T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "Z016D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0; ZE620KL Build/OPR1.170623.032) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.158 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "ZE620KL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; ASUS_I002D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "I002D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone 7 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; ZS671KS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "ZS671KS",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone Max Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; ZB602KL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "ZB602KL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone Max Pro (M1)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; ASUS_X00TD Build/OPM1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "X00TD",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone Max M2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; ASUS_X01AD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.99 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "X01AD",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone Max Pro M2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; ASUS_X01BDA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.99 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "X01BDA",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone Go",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; ASUS_X009DA Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "X009DA",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS Zenfone 2 Laser",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; ASUS_Z00ED) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "Z00ED",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ASUS ZenWatch",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.1; ASUS ZenWatch Build/LWX48S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/19.77.34.5 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ASUS",
|
||||
"model": "ZenWatch",
|
||||
"type": "wearable"
|
||||
}
|
||||
}
|
||||
]
|
||||
65
test/data/ua/device/blackberry.json
Normal file
65
test/data/ua/device/blackberry.json
Normal file
@@ -0,0 +1,65 @@
|
||||
[
|
||||
{
|
||||
"desc": "BlackBerry 9650",
|
||||
"ua": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9650; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.524 Mobile Safari/534.8+",
|
||||
"expect": {
|
||||
"vendor": "BlackBerry",
|
||||
"model": "9650",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BlackBerry 9780",
|
||||
"ua": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9780; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+",
|
||||
"expect": {
|
||||
"vendor": "BlackBerry",
|
||||
"model": "9780",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BlackBerry Priv",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; STV100-1 Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BlackBerry",
|
||||
"model": "STV100-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BlackBerry Keyone",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; BBB100-1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.111 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BlackBerry",
|
||||
"model": "BBB100-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BlackBerry Key2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; BBF100-1 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.91 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BlackBerry",
|
||||
"model": "BBF100-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BlackBerry Key2 LE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; BBE100-1 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BlackBerry",
|
||||
"model": "BBE100-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Blackview 4900Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; BV4900Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "BV4900Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
101
test/data/ua/device/blu.json
Normal file
101
test/data/ua/device/blu.json
Normal file
@@ -0,0 +1,101 @@
|
||||
[
|
||||
{
|
||||
"desc": "BLU Grand X LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; BLU Grand X LTE Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "Grand X LTE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU Neo Energy Mini",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; BLU_NEO_ENERGY_MINI Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.54 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "NEO_ENERGY_MINI",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU NEO X PLUS",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; BLU NEO X PLUS Build/N090U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "NEO X PLUS",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU STUDIO X MINI",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; BLU STUDIO X MINI Build/S0150UU) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "STUDIO X MINI",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU Tank Mega",
|
||||
"ua": "Mozilla/5.0 (Mobile; BLU_TankMega_3G; rv:48.0; CAEN) Gecko/48.0 Firefox/48.0 KAIOS/2.5.1.1",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "TankMega_3G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU TOUCHBOOK G7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0; BLU TOUCHBOOK G7 Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.107 Safari/537.36 OPR/29.0.1809.91837",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "TOUCHBOOK G7",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU Vivo 5 Mini",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; Vivo 5 Mini Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "Vivo 5 Mini",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU VIVO AIR LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.2; BLU VIVO AIR LTE Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.107 Mobile Safari/537.36 OPR/29.0.1809.91837",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "VIVO AIR LTE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU VIVO GO",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 9; VIVO GO Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/72.0.3626.121 Mobile Safari/537.36 OPR/50.0.2254.149182",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "VIVO GO",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU Vivo One Plus 2019",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Vivo One Plus 2019 Build/O11019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/277.0.0.41.126;]",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "Vivo One Plus 2019",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "BLU VIVO SELFIE",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 5.0; es-LA; BLU VIVO SELFIE Build/LRX21M) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.3.5.972 U3/0.8.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "BLU",
|
||||
"model": "VIVO SELFIE",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
38
test/data/ua/device/cat.json
Normal file
38
test/data/ua/device/cat.json
Normal file
@@ -0,0 +1,38 @@
|
||||
[
|
||||
{
|
||||
"desc": "Cat B15Q",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; B15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Cat",
|
||||
"model": "B15Q",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Cat B35",
|
||||
"ua": "Mozilla/5.0 (Mobile; CAT B35; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5.1",
|
||||
"expect": {
|
||||
"vendor": "Cat",
|
||||
"model": "B35",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Cat S22 Flip",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; S22 FLIP Build/RKQ1.210416.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.165 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Cat",
|
||||
"model": "S22 FLIP",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Cat S62 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; S62 Pro Build/RKQ1.210406.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/94.0.4606.85 Mobile Safari/537.36 GSA/12.34.17.23.arm64",
|
||||
"expect": {
|
||||
"vendor": "Cat",
|
||||
"model": "S62 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/energizer.json
Normal file
29
test/data/ua/device/energizer.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "Energizer Energy 400",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; Energy400 Build/MRA58K test-keys; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.158 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/172.0.0.66.93;]",
|
||||
"expect": {
|
||||
"vendor": "Energizer",
|
||||
"model": "Energy400",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Energizer Energy 400S",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; Energy 400S Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.85 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Energizer",
|
||||
"model": "Energy 400S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Energizer Ultimate 65G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Energizer Ultimate 65G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Energizer",
|
||||
"model": "Ultimate 65G",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
47
test/data/ua/device/facebook.json
Normal file
47
test/data/ua/device/facebook.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"desc": "Oculus Quest",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Quest) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/15.0.0.0.22.280317669 SamsungBrowser/4.0 Chrome/89.0.4389.90 VR Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Facebook",
|
||||
"model": "Quest",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Oculus Quest 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/15.0.0.0.22.280317669 SamsungBrowser/4.0 Chrome/89.0.4389.90 VR Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Facebook",
|
||||
"model": "Quest 2",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Oculus Quest 3",
|
||||
"ua": "Mozilla/5.0 (X11; Linux x86_64; Quest 3) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/31.4.0.6.51.566757996 Chrome/120.0.6099.283 VR Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Facebook",
|
||||
"model": "Quest 3",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Oculus Quest Pro",
|
||||
"ua": "Mozilla/5.0 (X11; Linux x86_64; Quest Pro) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/24.4.0.22.60.426469926 SamsungBrowser/4.0 Chrome/106.0.5249.181 VR Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Facebook",
|
||||
"model": "Quest Pro",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Portal TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; PortalTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.120 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Facebook",
|
||||
"model": "PortalTV",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/fairphone.json
Normal file
29
test/data/ua/device/fairphone.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "Fairphone 1U",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.2; FP1U Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Fairphone",
|
||||
"model": "FP1U",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Fairphone 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.2; FP2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Fairphone",
|
||||
"model": "FP2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Fairphone 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; FP3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.93 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Fairphone",
|
||||
"model": "FP3",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
614
test/data/ua/device/google.json
Normal file
614
test/data/ua/device/google.json
Normal file
@@ -0,0 +1,614 @@
|
||||
[
|
||||
{
|
||||
"desc": "Google Chromecast with Google TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12.0; Build/STTL.240206.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.0 Safari/537.36 CrKey/1.56.500000 DeviceType/AndroidTV",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Chromecast AndroidTV",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Chromecast Mini Smart Speaker",
|
||||
"ua": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/SmartSpeaker",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Chromecast SmartSpeaker",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Chromecast Third Generation",
|
||||
"ua": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.225 Safari/537.36 CrKey/1.56.500000 DeviceType/Chromecast",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Chromecast Third Generation",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Chromecast Nest Hub",
|
||||
"ua": "Mozilla/5.0 (Fuchsia) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 CrKey/1.56.500000",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Chromecast Nest Hub",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Chromecast",
|
||||
"ua": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.84 Safari/537.36 CrKey/1.22.79313",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Chromecast",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel C",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; Pixel C Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel C",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel C",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel C",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1; Pixel Build/NDE63V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 2) AppleWebKit/537.36 (KHTML, like Gecko) Edg/57.0.986.6",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.2; G011A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.88 Safari/537.36 OPR/68.3.3557.64528",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G011A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 2 XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 2 XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 2 XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 2 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 2 XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 3",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; G013A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G013A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 3a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; G020E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G020E",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 3 XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 3 XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 3 XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 3 XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 3a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 3a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 3a",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 3a XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 3a XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 3a XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 4",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; G020M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G020M",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 4a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.83 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 4a",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; G025J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G025J",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; GA02099) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GA02099",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; G025N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G025N",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4a (5G)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 4a (5G) Build/UP1A.231105.001.B2; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36 EdgA/124.0.2478.64",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 4a (5G)",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 4 XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 4 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 4 XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; G5NZ6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G5NZ6",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; GD1YQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GD1YQ",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; GTT9Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GTT9Q",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.120 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 5",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 5a 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; G4S1M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G4S1M",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 5a 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; G1F8F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G1F8F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Pixel 6 Build/QP1A.190711.020) AppleWebKit/545.31 (KHTML, like Gecko) Firefox/109.0.2318.118 Mobile Safari/545.22",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 6",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 6 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; Pixel 6 Pro Build/AP4A.241205.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.163 Mobile Safari/537.36 Line/15.0.0/IAB",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 6 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 6 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; G8VOU) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G8VOU",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 7",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 7 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; Pixel 7 Pro Build/AP4A.250205.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.121 Mobile Safari/537.36 musical_ly_2023808030 BytedanceWebview/d8a21c6",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 7 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 7 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; GP4BC) AppleWebKit/537.46 (KHTML, like Gecko) Chrome/118.0.5993.80 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GP4BC",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 7 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; GE2AE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.48 Mobile Safari/537.46",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GE2AE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 7a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 7a Build/AP2A.240905.003; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36 EdgA/124.0.2478.64",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 7a",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 8 Build/UPB2.230407.014) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.2.7822.95 Mobile Safari/537.36 Vivaldi/5.2.9076.131",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 8",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 8 Pro Build/UPB1.230309.017; Rooted) AppleWebKit/537.36 (KHTML, like Gecko) Puffin/10.9.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 8 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 8a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Google Pixel 8a) Chrome/121.0.6167 Mobile",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 8a",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 8a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; GKV4X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GKV4X",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 8a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; G8HHN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G8HHN",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 8a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; G576D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G576D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 14; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.119 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 9",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; G2YBB) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G2YBB",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; GUR25) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GUR25",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; GWVK6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GWVK6",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; G1B60) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "G1B60",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro Build/AD1A.240530.047; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.170 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/506.1.0.74.27;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 9 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; GR83Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GR83Y",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; GEC77) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GEC77",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9 Pro Fold",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro Fold) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 9 Pro Fold",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9 Pro Fold",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; GC15S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GC15S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9 Pro Fold",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; GGH2X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "GGH2X",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel 9 Pro XL",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 15; Pixel 9 Pro XL Build/AP4A.250105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.89 Mobile Safari/537.36 OPR/88.0.2254.75874",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel 9 Pro XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel Fold",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; Pixel Fold Build/AP4A.250105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.97 Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.40.36;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel Fold",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel Tablet Build/AP2A.240905.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel Tablet",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel Watch",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; Google Pixel Watch Build/TWD4.231005.002)",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel Watch",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel Watch 2",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; Google Pixel Watch 2 Build/TWD9.240605.001.A1)",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel Watch 2",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1; Pixel XL Build/NDE63X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixel XL",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixel XL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixelbook",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Google Pixelbook) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixelbook",
|
||||
"type": "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Google Pixelbook Go",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Google Pixelbook Go) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 OPR/62.3.3146.57763",
|
||||
"expect": {
|
||||
"vendor": "Google",
|
||||
"model": "Pixelbook Go",
|
||||
"type": "undefined"
|
||||
}
|
||||
}
|
||||
]
|
||||
20
test/data/ua/device/hisense.json
Normal file
20
test/data/ua/device/hisense.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"desc": "Hisense E50 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Hisense E50 Lite) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.126 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Hisense",
|
||||
"model": "E50 Lite",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Hisense V40s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Hisense V40s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.125 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Hisense",
|
||||
"model": "V40s",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
65
test/data/ua/device/hmd.json
Normal file
65
test/data/ua/device/hmd.json
Normal file
@@ -0,0 +1,65 @@
|
||||
[
|
||||
{
|
||||
"desc": "HMD Barbie Phone",
|
||||
"ua": "Mozilla/5.0 (Mobile; HMD Barbie Phone; rv:84.0) Gecko/84.0 Firefox/84.0 KAIOS/3.1",
|
||||
"expect": {
|
||||
"vendor": "HMD",
|
||||
"model": "Barbie Phone",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HMD Fusion",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; HMD Fusion) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "HMD",
|
||||
"model": "Fusion",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HMD Pulse",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; HMD Pulse) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "HMD",
|
||||
"model": "Pulse",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HMD Pulse Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; HMD Pulse Plus) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "HMD",
|
||||
"model": "Pulse Plus",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HMD Pulse Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; HMD Pulse Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "HMD",
|
||||
"model": "Pulse Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HMD Skyline",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 14; HMD Skyline) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.1804 YaApp_Android/24.120.1 YaSearchBrowser/24.120.1 BroPP/1.0 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "HMD",
|
||||
"model": "Skyline",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HMD Vibe",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; N159V Build/UKQ1.231025.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/135.0.7049.111 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.47.36;]",
|
||||
"expect": {
|
||||
"vendor": "HMD",
|
||||
"model": "N159V",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
164
test/data/ua/device/honor.json
Normal file
164
test/data/ua/device/honor.json
Normal file
@@ -0,0 +1,164 @@
|
||||
[
|
||||
{
|
||||
"desc": "Honor MagicPad 13 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; GDI-W09 Build/HONORGDI-W09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/16.3.9.1290 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "GDI-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad 2",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; en-nz; JDN-W09 Build/HuaweiMediaPad) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/6.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "JDN-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad 2",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 9; zh-Hans-CN; JDN2-W09HN Build/HUAWEIJDN2-W09HN) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Quark/4.6.6.164 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "JDN2-W09HN",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad 7 10.1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; AGM3-AL09HN Build/HONORAGM3-AL09HN; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.46 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/490.0.0.63.82;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "AGM3-AL09HN",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad 8 12.0",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; HEY-W09 Build/HONORHEY-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "HEY-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad 9 12.1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; HEY2-N09 Build/HONORHEY2-N09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36 [FB_IAB/FB4A;FBAV/465.0.0.63.83;]",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "HEY2-N09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad 9 12.1 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; HEY2-W09 Build/HONORHEY2-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/129.0.6668.102 Safari/537.36 [FB_IAB/FB4A;FBAV/489.0.0.66.81;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "HEY2-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad V7 Pro 11",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; BRT-AN09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 EdgA/109.0.1518.53",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "BRT-AN09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad V7 Pro 11 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; zh-Hans-CN; BRT-W09 Build/HONORBRT-W09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 Quark/6.5.0.336 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "BRT-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad X6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; AGR-W09HN Build/HUAWEIAGR-W09HN; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/12.9 SP-engine/2.28.0 baiduboxapp/12.9.0.11 (Baidu; P1 10) NABar/1.0",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "AGR-W09HN",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad X7 8 LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; KOB2-AL00HN; HMSCore 6.0.0.306) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.93 HuaweiBrowser/11.1.3.300 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "KOB2-AL00HN",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad X7 8 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; KOB2-W09HN; HMSCore 6.1.0.314) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 HuaweiBrowser/12.0.0.301 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "KOB2-W09HN",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad X8 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; AGM-W09HN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "AGM-W09HN",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad X9 11.5 LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; ELN-L09 Build/HONORELN-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.86 Mobile Safari/537.36[FBAN/EMA;FBLC/zh_CN;FBAV/432.0.0.9.110;FBCX/modulariab;]",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "ELN-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Honor Pad X9 11.5 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; ELN-W09 Build/HONORELN-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.86 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "ELN-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Honor 6A",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; DLI-L22 Build/HONORDLI-L22; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/252.0.0.22.355;]",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "DLI-L22",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Honor 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; PLK-L01 Build/HONORPLK-L01; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "PLK-L01",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei 10 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; HRY-LX1 Build/HONORHRY-LX1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.91 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Honor",
|
||||
"model": "HRY-LX1",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/htc.json
Normal file
29
test/data/ua/device/htc.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "HTC Desire 820",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; HTC Desire 820 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "HTC",
|
||||
"model": "Desire 820",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HTC Evo Shift 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0",
|
||||
"expect": {
|
||||
"vendor": "Sprint",
|
||||
"model": "APA7373KT",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HTC Nexus 9",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0; Nexus 9 Build/LRX21R) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Mobile Crosswalk/7.36.154.13 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "HTC",
|
||||
"model": "Nexus 9",
|
||||
"type": "tablet"
|
||||
}
|
||||
}
|
||||
]
|
||||
983
test/data/ua/device/huawei.json
Normal file
983
test/data/ua/device/huawei.json
Normal file
@@ -0,0 +1,983 @@
|
||||
[
|
||||
{
|
||||
"desc": "Huawei Honor",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; U8860 Build/HuaweiU8860) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "U8860",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Honor 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L41) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YAL-L41",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Honor 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YAL-AL10",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nexus 6P",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC19V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "Nexus 6P",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; VTR-L09 Build/HUAWEIVTR-L09; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "VTR-L09",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y3II",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 5.1; xx-xx; HUAWEI LUA-L03 Build/HUAWEILUA-L03) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LUA-L03",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad C5 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; MON-AL19B Build/HUAWEIMON-AL19; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.83 Mobile Safari/537.36 T7/11.7 baiduboxapp/11.7.0.10 (Baidu; P1 7.0)",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "MON-AL19B",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M2 10.1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; HUAWEI M2-A01L Build/HUAWEIM2-A01L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/95.0.4638.74 Safari/537.36[FBAN/EMA;FBLC/fr_FR;FBAV/421.0.0.14.100;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "M2-A01L",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M3",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0; en-US; BTV-DL09 Build/HUAWEIBEETHOVEN-DL09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.5.0.1015 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BTV-DL09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M3 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI BTV-W09 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.96 Mobile Safari/537.36 AlohaBrowser/3.1.1",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BTV-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M3 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; CPN-L09 Build/HUAWEICPN-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36[FBAN/EMA;FBLC/ru_RU;FBAV/233.0.0.12.118;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "CPN-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M3 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; CPN-W09 Build/HUAWEICPN-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.71 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/374.0.0.20.109;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "CPN-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M3 Lite 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; BAH-L09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BAH-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M5 10.8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; CMR-W09 Build/HUAWEICMR-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.102 Safari/537.36 Line/14.18.1/IAB",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "CMR-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M5 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; BAH2-W19 Build/HUAWEIBAH2-W19; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BAH2-W19",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M5 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; JDN2-W09 Build/HUAWEIJDN2-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.210 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/318.0.0.39.154;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "JDN2-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M5 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; JDN2-AL50 Build/HUAWEIJDN2-AL50; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/12.13.0 SP-engine/2.29.0 matrixstyle/0 lite baiduboxapp/5.8.0.10 (Baidu; P1 9) NABar/1.",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "JDN2-AL50",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M5 8.4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SHT-W09 Build/HUAWEISHT-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "SHT-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SHT-AL09 Build/HUAWEISHT-AL09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "SHT-AL09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M6 10.8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; SCM-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6612.143 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "SCM-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad M6 8.4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; VRD-W09; HMSCore 6.14.0.321; GMSCore 22.26.15) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "VRD-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; AGS2-L09 Build/HUAWEIAGS2-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/84.0.4147.125 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS2-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T10",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; en-US; AGR-L09 Build/HUAWEIAGR-L09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.3.8.1305 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGR-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; AGR-W09 Build/HUAWEIAGR-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGR-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T10s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; AGS3-W09 Build/HUAWEIAGS3-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS3-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T 8.0",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; KOB2-L09 Build/HUAWEIKOB2-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/396.0.0.21.104;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "KOB2-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T 8.0",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; KOB2-W09 Build/HUAWEIKOB2-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 Mobile Safari/537.36 HuaweiBrowser/15.0.4.312 HMSCore/6.14.0.301",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "KOB2-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T1 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; T1-A21w Build/HuaweiMediaPad) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36 SputnikBrowser/1.2.8.161",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "T1-A21w",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T1 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; T1-A23L Build/HuaweiMediaPad; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 BingWeb/6.9.10",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "T1-A23L",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T1 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; T1-A21L Build/HuaweiMediaPad) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "T1-A21L",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T1 7",
|
||||
"ua": "Mozilla/5.0 (Linux; 4.4.2; T1-701u) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "T1-701u",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T1 8",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 9.0; MediaPad T1 8.0 Build/HuaweiMediaPad) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 OPR/28.0.2254.119224",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "MediaPad T1 8.0",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T10 9.7",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; en-US; AGRK-L09 Build/HUAWEIAGRK-L09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.6.0.1315 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGRK-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T10 9.7 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; AGRK-W09; HMSCore 6.14.0.321) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGRK-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T10s 10.1 LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; AGS3K-L09 Build/HUAWEIAGS3K-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Safari/537.36 [FB_IAB/FB4A;FBAV/362.0.0.27.109;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS3K-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T10s 10.1 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; AGS3K-W09; HMSCore 6.14.0.321) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS3K-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T2 10.0 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; 605HW Build/HuaweiMediaPad; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/102.0.5005.78 Safari/537.36 [FB_IAB/FB4A;FBAV/436.0.0.35.101;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "605HW",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T2 7.0 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; BGO-DL09 Build/HuaweiBAGGIO; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/106.0.5249.126 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/407.0.0.30.97;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BGO-DL09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T3 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; AGS-W09 Build/HUAWEIAGS-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.90 Safari/537.36 GSA/10.83.10.21.arm64",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T3 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; BG2-U03 Build/HUAWEIBG2-U03; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/84.0.4147.111 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BG2-U03",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T3 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; KOB-W09 Build/HUAWEIKOB-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 Safari/537.36 [FB_IAB/Orca-Android;FBAV/354.0.0.10.113;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "KOB-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad T5 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; AGS2-W09 Build/HUAWEIAGS2-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36 Flipboard/4.3.31/5486,4.3.31.5486",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS2-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "HUAWEI MediaPad X2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0; GEM-703L Build/HUAWEIGEM-703L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/043906 Mobile Safari/537.36 MicroMessenger/6.6.3.1260(0x26060339) NetType/WIFI Language/zh_",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "GEM-703L",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 10.4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; HarmonyOS; BAH3-W09; HMSCore 6.14.0.322) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BAH3-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 10.4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; HarmonyOS; BAH3-L09; HMSCore 6.14.0.322) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BAH3-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 10.4 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; BAH3-W59 Build/HUAWEIBAH3-W59; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Safari/537.36HiSearch/22.0.6.315",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BAH3-W59",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 10.4 (2022)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; BAH4-L09 Build/HUAWEIBAH4-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BAH4-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 10.4 (2022) WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; HarmonyOS; BAH4-W09; HMSCore 6.14.0.322) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BAH4-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 10.4 SE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; AGS5-L09 Build/HUAWEIAGS5-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/99.0.4844.88 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS5-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 10.4 SE WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; AGS5-W09 Build/HUAWEIAGS5-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/99.0.4844.88 Safari/537.36 [FB_IAB/FB4A;FBAV/480.0.0.54.88;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS5-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 11 (2023) WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; zh-Hans-CN; DBR-W10 Build/HUAWEIDBR-W10) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 Quark/6.9.6.501 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "DBR-W10",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 11 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; zh-cn; DBY-W09 Build/HUAWEIDBY-W09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/109.0.5414.86 MQQBrowser/14.6 Mobile Safari/537.36 COVC/046801",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "DBY-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 11.5 Air WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; zh-Hans-CN; DBY2-W00 Build/HUAWEIDBY2-W00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 Quark/7.3.8.663 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "DBY2-W00",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 11.5 LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; HarmonyOS; BTK-AL09; HMSCore 6.14.0.322) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BTK-AL09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 11.5 S WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; HarmonyOS; TGR-W09; HMSCore 6.14.0.322; GMSCore 0.3.3.1.240913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.88 HuaweiBrowser/14.0.2.317 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "TGR-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad 11.5 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; HarmonyOS; BTK-W09; HMSCore 6.14.0.322; GMSCore 214816056) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BTK-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad C5 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; MON-W19 Build/HUAWEIMON-W19; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 [Pinterest/Android]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "MON-W19",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad Pro 11",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 12; GOT-AL09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 YaBrowser/23.5.5.60.01 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "GOT-AL09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad Pro 11 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; GOT-W09 Build/HUAWEIGOT-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Safari/537.36 T7/13.19 BDOS/1.0 (HarmonyOS 3.0.0) SP-engine/2.57.0 baiduboxapp/13.19.0.12 (Baidu; P1 12) NABar/1.0",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "GOT-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad Pro 12.6 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; WGR-W09 Build/HUAWEIWGR-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.105 Safari/537.36[FBAN/EMA;FBLC/en_US;FBAV/412.0.0.8.106;]",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "WGR-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad SE 11 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; HarmonyOS; AGS6-W09; HMSCore 6.12.2.309) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.93 HuaweiBrowser/11.1.5.315 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS6-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad Pro 13.2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; HarmonyOS; PCE-W29; HMSCore 6.14.0.322) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.196 HuaweiBrowser/15.0.4.312 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "PCE-W29",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad T 10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; AGR-L09; HMSCore 5.0.4.301) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 HuaweiBrowser/11.0.3.304 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGR-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad T10s",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; zh-cn; AGS3-AL00 Build/HUAWEIAGS3-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/11.4 Mobile Safari/537.36 COVC/045530",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS3-AL00",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad T10s WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; AGS3-W09 Build/HUAWEIAGS3-W09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/88.0.4324.93 Safari/537.36 OPR/60.0.2254.59405",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AGS3-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei MatePad T8 8 LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; KOB2K-L09 Build/HUAWEIKOB2K-L09; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Safari/537.36 OPR/83.0.2254.73002",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "KOB2K-L09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei M3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; BTV-W09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BTV-W09",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 10 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0; BLA-L29 Build/HUAWEIBLA-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3236.6 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BLA-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate X",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; TAH-AN00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.111 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "TAH-AN00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate X2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; TET-AN00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.96 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "TET-AN00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 X",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; EVR-L29 Build/HUAWEIEVR-L29; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "EVR-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LYA-L09) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LYA-L09",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LYA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LYA-AL00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LYA-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LYA-AL10",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LYA-L0C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LYA-L0C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LYA-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LYA-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LYA-TL00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LYA-TL00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 50 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; DCO-LX9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "DCO-LX9",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P10 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; WAS-L03T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5199.205 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "WAS-L03T",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P20 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; ANE-LX1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "ANE-LX1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P20",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; EML-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "EML-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P20 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; CLT-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "CLT-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; ELE-L04) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.109 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "ELE-L04",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; ELE-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "ELE-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P30 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; VOG-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "VOG-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P40",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; ANA-AN00 Build/HUAWEIANA-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/11.26 SP-engine/2.22.0 baiduboxapp/11.26.0.10 (Baidu; P1 10) NABar/1.0",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "ANA-AN00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P40 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; ELS-AN00 Build/HUAWEIELS-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 mailapp/6.0.0",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "ELS-AN00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei 30 Pro+",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; EBG-AN10 Build/HUAWEIEBG-AN10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.86 Mobile Safari/537.36 EdgA/42.0.0.2741",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "EBG-AN10",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei 30S",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; CDY-AN90 Build/HUAWEICDY-AN90; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 mailapp/5.8.0",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "CDY-AN90",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI CAN-L13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5113.212 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "CAN-L13",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova 5T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YAL-L21",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova 5T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L61) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YAL-L61",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova 5T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L71) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YAL-L71",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova 5T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L61D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YAL-L61D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova 5T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YALE-L61A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YALE-L61A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova 5T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YALE-L61D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YALE-L61D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Nova 5T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; YALE-L71A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "YALE-L71A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Enjoy10e",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 10; MED-AL00 Build/HUAWEIMED-AL00)",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "MED-AL00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y7 2018",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; LDN-L01) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.62 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "LDN-L01",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Honor 8X",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; JSN-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "JSN-L21",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y6 2019",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; MRD-LX1N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "MRD-LX1N",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y9 2019",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; JKM-LX2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "JKM-LX2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; AMN-LX3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "AMN-LX3",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y7p",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; ART-L28; HMSCore 6.8.0.311) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4476.0 HuaweiBrowser/12.1.2.312 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "ART-L28",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y7p",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; ART-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.92 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "ART-L29",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Mate 20 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; SNE-LX1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "SNE-LX1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei P10 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; WAS-LX1A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "WAS-LX1A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Y5 Lite 2018",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; DRA-LX5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "DRA-LX5",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Huawei Honor 8C",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; BKK-LX2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Huawei",
|
||||
"model": "BKK-LX2",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
38
test/data/ua/device/imo.json
Normal file
38
test/data/ua/device/imo.json
Normal file
@@ -0,0 +1,38 @@
|
||||
[
|
||||
{
|
||||
"desc": "IMO FEEL A2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; IMO FEEL A2 Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/49.0.2623.105 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "IMO",
|
||||
"model": "FEEL A2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "IMO Q2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; IMO Q2 Build/LMY47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/65.0.3325.109 Mobile Safari/537.36 GSA/7.22.24.21.arm",
|
||||
"expect": {
|
||||
"vendor": "IMO",
|
||||
"model": "Q2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "IMO S2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; IMO S2 Build/O11019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.162 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "IMO",
|
||||
"model": "S2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "IMO Tab X9",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.0.3; id-id; IMO TAB X9 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "IMO",
|
||||
"model": "TAB X9",
|
||||
"type": "tablet"
|
||||
}
|
||||
}
|
||||
]
|
||||
83
test/data/ua/device/infinix.json
Normal file
83
test/data/ua/device/infinix.json
Normal file
@@ -0,0 +1,83 @@
|
||||
[
|
||||
{
|
||||
"desc": "Infinix Hot 4",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 7.0; en-us; Infinix HOT 4 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36 PHX/17.9",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "HOT 4",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix Hot 4 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; Infinix_X556_LTE Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/390.0.0.27.105;]",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X556_LTE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix Hot 7 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Infinix X625C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X625C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix Hot 10T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Infinix X689C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X689C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix Hot 11s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Infinix X6812 Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X6812",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix Note 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; Infinix_X601_LTE Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.111 Mobile Safari/537.36 GSA/11.5.9.21.arm64",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X601_LTE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix Smart 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Infinix X657C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X657C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix XPad",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; Infinix X1101B Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.99 Safari/537.36 [FB_IAB/FB4A;FBAV/489.0.0.66.81;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X1101B",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Infinix Zero 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Infinix X6815B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Infinix",
|
||||
"model": "X6815B",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
56
test/data/ua/device/itel.json
Normal file
56
test/data/ua/device/itel.json
Normal file
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"desc": "itel A25",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; itel L5002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.130 Mobile Safari/537.36 OPR/63.3.3216.58675",
|
||||
"expect": {
|
||||
"vendor": "itel",
|
||||
"model": "L5002",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "itel A50",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 14; itel A667L Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/127.0.6533.103 Mobile Safari/537.36 OPR/83.1.2254.73239",
|
||||
"expect": {
|
||||
"vendor": "itel",
|
||||
"model": "A667L",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "itel KidPad 1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Itel W7001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.101 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "itel",
|
||||
"model": "W7001",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "itel Pad One",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; itel P10001L Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.172 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "itel",
|
||||
"model": "P10001L",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "itel RS4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; itel S666LN Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.165 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/468.1.0.56.78;]",
|
||||
"expect": {
|
||||
"vendor": "itel",
|
||||
"model": "S666LN",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "itel Vision 2S",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; itel P651L Build/RP1A.201005.001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.76 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "itel",
|
||||
"model": "P651L",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
11
test/data/ua/device/jolla.json
Normal file
11
test/data/ua/device/jolla.json
Normal file
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"desc": "Jolla",
|
||||
"ua": "Mozilla/5.0 (Maemo; Linux; U; Jolla; Sailfish; Mobile; rv:31.0) Gecko/31.0 Firefox/31.0 SailfishBrowser/1.0",
|
||||
"expect": {
|
||||
"vendor": "Jolla",
|
||||
"model": "undefined",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
20
test/data/ua/device/kobo.json
Normal file
20
test/data/ua/device/kobo.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"desc": "Kobo eReader",
|
||||
"ua": "Mozilla/5.0 (Unknown; Linux) AppleWebKit/538.1 (KHTML, like Gecko) Kobo eReader Safari/538.1",
|
||||
"expect": {
|
||||
"vendor": "Kobo",
|
||||
"model": "eReader",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Kobo Touch",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/538.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/538.1 (Kobo Touch 0377/4.20.14622)",
|
||||
"expect": {
|
||||
"vendor": "Kobo",
|
||||
"model": "Touch",
|
||||
"type": "tablet"
|
||||
}
|
||||
}
|
||||
]
|
||||
110
test/data/ua/device/lava.json
Normal file
110
test/data/ua/device/lava.json
Normal file
@@ -0,0 +1,110 @@
|
||||
[
|
||||
{
|
||||
"desc": "Lava Agni 2 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; LAVA LXX504 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.46 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/499.0.0.31.60;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LXX504",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Agni 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; LAVA LXX501 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.119 Mobile Safari/537.36[FBAN/EMA;FBLC/hi_IN;FBAV/396.0.0.9.115;]",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LXX501",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Blaze",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; en-US; LAVA Blaze Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.4.0.1306 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "Blaze",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Blaze 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; LAVA LZX409 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.97 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.47.36;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LZX409",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Blaze 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; LAVA LXX503) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LXX503",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Blaze Curve",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; LAVA LXX505 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.105 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/505.0.0.57.45;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LXX505",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Blaze Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; LAVA LZX404 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.50 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/503.0.0.69.76;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LZX404",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Iris 46",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LAVA LH9950) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/21.0 Chrome/110.0.5481.154 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LH9950",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Iris 54",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 9; LAVA LH9931 Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 OPR/39.1.2254.136708",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LH9931",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava Storm 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; LAVA LXX508 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/129.0.6668.100 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LXX508",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava V7 Prime",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LAVA LE9940) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LE9940",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Lava V7s Prime",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 9; LAVA LE9940_W Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 OPR/43.2.2254.140294",
|
||||
"expect": {
|
||||
"vendor": "LAVA",
|
||||
"model": "LE9940_W",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
1100
test/data/ua/device/lenovo.json
Normal file
1100
test/data/ua/device/lenovo.json
Normal file
File diff suppressed because it is too large
Load Diff
209
test/data/ua/device/lg.json
Normal file
209
test/data/ua/device/lg.json
Normal file
@@ -0,0 +1,209 @@
|
||||
[
|
||||
{
|
||||
"desc": "LG V40 ThinQ",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LM-V405) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LM-V405",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG K30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; LM-X410.F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LM-X410.F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG K30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LM-X410.FGN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.93 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LM-X410.FGN",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG K40",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; LM-X420) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.57 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LM-X420",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Stylo 4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; LM-Q710(FGN)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.57 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "LM-Q710(FGN)",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Stylo 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LM-Q720) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.96 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LM-Q720",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG G7 ThinQ",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; LM-G710VM Build/PKQ1.181105.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LM-G710VM",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG K20",
|
||||
"ua": "Mozilla/5.0 (Android 13; Mobile; LG-M255; rv:111.0) Gecko/111.0 Firefox/111.0",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "M255",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG K500",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; LG-K500 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "K500",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Nexus 4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.1; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "Nexus 4",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Nexus 4",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.3; en-us; Google Nexus 4 - 4.3 - API 18 - 768x1280 Build/JLS36G) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "Nexus 4",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Nexus 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "Nexus 5",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Wing",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; LM-F100N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.101 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LM-F100N",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Smart TV",
|
||||
"ua": "Mozilla/5.0 (DirectFB; U; Linux mips; en) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) LG Browser (; LG NetCast.TV-2011)",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Smart TV",
|
||||
"ua": "Mozilla/5.0 (Linux; NetCast; U) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/53.0.2785 34 Safari/537.31 SmartTV/8.5",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Smart TV",
|
||||
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen Safari/537.41 LG Browser/7.00.00(LGE; 42LB670V-ZA; 05.05.90; 1); webOS.TV-2014; LG NetCast.TV-2013 Compatible (LGE, 42LB670V-ZA, wireless)",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "42LB670V-ZA",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Smart TV",
|
||||
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chr0me/53.0.2785.34 Safari/537.36 LG Browser/8.00.00(LGE; 32LM627BPSB; 05.40.45; 1; DTV_W19R); webOS.TV-2019; LG NetCast.TV-2013 Compatible (LGE, 32LM627BPSB, wireless)",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "32LM627BPSB",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Smart TV",
|
||||
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 HbbTV/1.3.1 ( DRM; LGE; OLED55B7V_Z; WEBOS3.5 06.10.60; W3_M16P; ) FVC/2.0 (LGE; WEBOS3.5 ;)",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "OLED55B7V_Z",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Android TV",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; LG Android TV Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG VK Series Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.2; VK700 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.84 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "VK700",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG LK Series Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.1; LGLK430 Build/LRX21Y) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/38.0.2125.102 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "LK430",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG Watch Urbane",
|
||||
"ua": "Mozilla/5.0 Linux; Android 7.1.1; LG Watch Urbane Build/NWD1.180306.004 AppleWebKit/537.36 KHTML, like Gecko Chrome/19.77.34.5 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "Watch Urbane",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LG G Watch R",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; G Watch R Build/LCA44B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Crosswalk/15.44.384.12 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LG",
|
||||
"model": "G Watch R",
|
||||
"type": "wearable"
|
||||
}
|
||||
}
|
||||
]
|
||||
11
test/data/ua/device/logitech.json
Normal file
11
test/data/ua/device/logitech.json
Normal file
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"desc": "Logitech",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 11; GR0006 Build/SQ02K.00.0018)",
|
||||
"expect": {
|
||||
"vendor": "Logitech",
|
||||
"model": "GR0006",
|
||||
"type": "console"
|
||||
}
|
||||
}
|
||||
]
|
||||
20
test/data/ua/device/meizu.json
Normal file
20
test/data/ua/device/meizu.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"desc": "Meizu M5 Note",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; M5 Note Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043024 Safari/537.36 MicroMessenger/6.5.7.1040 NetType/WIFI Language/zh_CN",
|
||||
"expect": {
|
||||
"vendor": "Meizu",
|
||||
"model": "M5 Note",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Meizu M3S",
|
||||
"ua": "Mozilla/5.0 (X11; Linux; Android 5.1; MZ-M3s Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrom/45.0.2454.94 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Meizu",
|
||||
"model": "M3s",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
30
test/data/ua/device/micromax.json
Normal file
30
test/data/ua/device/micromax.json
Normal file
@@ -0,0 +1,30 @@
|
||||
[
|
||||
|
||||
{
|
||||
"desc": "Micromax Bharat 2 Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 7.0; en-US; Micromax Q402Plus Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.12.9.1226 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Micromax",
|
||||
"model": "Q402Plus",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Micromax Canvas Infinity",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 7.1.2; en-US; Micromax HS2 Build/N2G47H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/13.2.0.1296 (SpeedMode) U4/1.0 UCWEB/2.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Micromax",
|
||||
"model": "HS2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Micromax In 1b",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; Micromax E7533 Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.101 Mobile Safari/537.36 OPR/54.0.2254.56148",
|
||||
"expect": {
|
||||
"vendor": "Micromax",
|
||||
"model": "E7533",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
47
test/data/ua/device/microsoft.json
Normal file
47
test/data/ua/device/microsoft.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"desc": "Microsoft Lumia 950",
|
||||
"ua": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586",
|
||||
"expect": {
|
||||
"vendor": "Microsoft",
|
||||
"model": "Lumia 950",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Microsoft Surface Duo",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 10; Surface Duo Build/2020.1014.61)",
|
||||
"expect": {
|
||||
"vendor": "Microsoft",
|
||||
"model": "Surface Duo",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Microsoft Lumia 950",
|
||||
"ua": "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586",
|
||||
"expect": {
|
||||
"vendor": "Microsoft",
|
||||
"model": "Lumia 950",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xbox",
|
||||
"ua": "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)",
|
||||
"expect": {
|
||||
"vendor": "Microsoft",
|
||||
"model": "Xbox",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xbox One",
|
||||
"ua": "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; Xbox; Xbox One)",
|
||||
"expect": {
|
||||
"vendor": "Microsoft",
|
||||
"model": "Xbox One",
|
||||
"type": "console"
|
||||
}
|
||||
}
|
||||
]
|
||||
299
test/data/ua/device/motorola.json
Normal file
299
test/data/ua/device/motorola.json
Normal file
@@ -0,0 +1,299 @@
|
||||
[
|
||||
{
|
||||
"desc": "Motorola Defy XT",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; XT555C Build/V1.67D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT555C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Droid RAZR 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "DROID RAZR 4G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Edge 30 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; XT2201-1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2201-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Edge 30 Ultra",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; motorola edge 30 ultra Build/U1SQS34.52-21-1-13; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 M",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "edge 30 ultra",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Edge 40",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; motorola edge 40 Build/U1TL34.115-16-1-7; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.104 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "edge 40",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Edge X30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; XT2201-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.6668.59 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2201-2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola RAZR 2019",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; motorola razr) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "razr",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto 360",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4; Moto 360 Build/KNX01S) AppleWebKit/537.36 (KHTML, like Gecko) WIB/0.9.8 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "Moto 360",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto E",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; Moto E (4) Build/NDQS26.69-64-11-7; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "Moto E (4)",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto E6s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; MOTOROLA E6S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "E6S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto E7 Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; moto e(7) plus Build/QPZS30.30-Q3-38-69-12; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.14 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto e(7) plus",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto E7 Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; XT2081-1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.171 Mobile Safari/537.36 OPR/102.0.4864.0",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2081-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto G 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; moto g 5G - 2023 Build/U1TPNS34.26-48-2-7; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36 EdgA/124.0.2478.64",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto g 5G - 2023",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto G 5G (2022)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; moto g 5G (2022) Build/S1SAS32.47-77-9; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36 [FB_IAB/Orca-Android;FBAV/402.0.0.11.101;]",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto g 5G (2022)",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto g(6) Play",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; moto g(6) play) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto g(6) play",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto g(7) Supra",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; moto g(7) supra Build/PCOS29.114-134-2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3683.90 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto g(7) supra",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto G10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; XT2127-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2127-2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto G24 Power",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 14; moto g24 power Build/UTAS34.82-97-1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.138 Mobile Safari/537.36 OPR/89.0.2254.76420",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto g24 power",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto G30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; XT2129-3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2129-3",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto G54 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; moto g54 5G Build/U1TDS34.94-12-9-10-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.6834.122 Mobile Safari/537.36 OPX/2",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto g54 5G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto X",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; XT1097 Build/KXE21.187-38) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT1097",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto X",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; XT1058 Build/13.9.0Q2.X-70-GHOST-ATT_LE-2) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT1058",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto X Force",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 7.0; XT1580 Build/NPKS25.200-12-9; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/65.0.3325.109 Mobile Safari/537.36 OPR/32.0.2254.123747",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT1580",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto S30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; XT2243-2 Build/T1SJC33.51-19-7; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Mobile Safari/537.36 T7/13.30 SP-engine/2.53.0 matrixstyle/0 lite baiduboxapp/6.2.0.10 (Baidu; P1 13) NABar/1.0",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2243-2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto X30 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; XT2241-1 Build/T1SQ33.111-12-19) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/16.1.3.1264 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2241-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto Z3 Play",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Moto Z3 Play) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "Moto Z3 Play",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Moto Z4",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; moto z4 Build/QDF30.130-42-5-17; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/108.0.5359.128 Mobile Safari/537.36 OPR/2.3.0",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "moto z4",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Nexus 6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "Nexus 6",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola One 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; motorola one 5G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "one 5G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola P30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; XT1943-1 Build/OPM1.171019.019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Mobile Safari/537.36 T7/13.50 SP-engine/2.88.0 baiduboxapp/13.50.5.10 (Baidu; P1 8.1.0) NABar/1.0",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT1943-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Razr 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; motorola razr 5G Build/S2PS32.57-23-21; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.97 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.47.36;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "razr 5G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Razr 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; XT2071-4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "XT2071-4",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Motorola Razr 50 Ultra",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; motorola razr 50 ultra Build/U3UX34.56-29-2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.260 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Motorola",
|
||||
"model": "razr 50 ultra",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
47
test/data/ua/device/nintendo.json
Normal file
47
test/data/ua/device/nintendo.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"desc": "Nintendo Switch",
|
||||
"ua": "Mozilla/5.0 (Nintendo Switch; WifiWebAuthApplet) AppleWebKit/606.4 (KHTML, like Gecko) NF/6.0.1.15.4 NintendoBrowser/5.1.0.20393",
|
||||
"expect": {
|
||||
"vendor": "Nintendo",
|
||||
"model": "Switch",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nintendo WiiU",
|
||||
"ua": "Mozilla/5.0 (Nintendo WiiU) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.4.2.9 NintendoBrowser/4.2.0.11146.EU",
|
||||
"expect": {
|
||||
"vendor": "Nintendo",
|
||||
"model": "WiiU",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nintendo Wii",
|
||||
"ua": "Opera/9.10 (Nintendo Wii; U; ; 1621; en)",
|
||||
"expect": {
|
||||
"vendor": "Nintendo",
|
||||
"model": "Wii",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nintendo 3DS",
|
||||
"ua": "Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7610.EU",
|
||||
"expect": {
|
||||
"vendor": "Nintendo",
|
||||
"model": "3DS",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nintendo 3DS",
|
||||
"ua": "Mozilla/5.0 (New Nintendo 3DS like iPhone) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.0.5.15 Mobile NintendoBrowser/1.3.10126.EU",
|
||||
"expect": {
|
||||
"vendor": "Nintendo",
|
||||
"model": "3DS",
|
||||
"type": "console"
|
||||
}
|
||||
}
|
||||
]
|
||||
128
test/data/ua/device/nokia.json
Normal file
128
test/data/ua/device/nokia.json
Normal file
@@ -0,0 +1,128 @@
|
||||
[
|
||||
{
|
||||
"desc": "Nokia 1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Nokia 1 Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.15 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia3xx",
|
||||
"ua": "Nokia303/14.87 CLDC-1.1",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "303",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia 3.2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Nokia 3.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "3.2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia 5800 XpressMusic",
|
||||
"ua": "Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Nokia5800d-1/10.4.016; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "5800d-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Nokia 7.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "7.2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia 808 PureView",
|
||||
"ua": "Mozilla/5.0 (Symbian; U; Nokia808 PureView; en-GB) AppleWebKit/534.3 (KHTML, like Gecko) Version/3.0 Mobile/1A543a Mobile Safari/534.3",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "808 PureView",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia 808 PureView",
|
||||
"ua": "Mozilla/5.0 (Symbian/3; Series60/5.5 Nokia808PureView/113.010.1508; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.2.21 Mobile Safari/535.1 3gpp-gba",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "808PureView",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia Lumia 630",
|
||||
"ua": "UCWEB/2.0 (Windows; U; wds 8.10; en-IN; NOKIA; RM-978_1046) U2/1.0.0 UCBrowser/4.2.0.524 U2/1.0.0 Mobile",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "RM-978",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia N9",
|
||||
"ua": "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "N9",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia N900",
|
||||
"ua": "Mozilla/5.0 (Linux; Maemo 5.0; Nokia N900; Build/4.0.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "N900",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia T20",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Nokia T20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "T20",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia T20",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Nokia T20 Build/RP1A.201005.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/93.0.4577.62 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "T20",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia T21",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; Nokia T21 Build/TP1A.220624.014)",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "T21",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nokia 2720 Flip",
|
||||
"ua": "Mozilla/5.0 (Mobile; Nokia_2720_Flip; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5.2",
|
||||
"expect": {
|
||||
"vendor": "Nokia",
|
||||
"model": "2720 Flip",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
65
test/data/ua/device/nothing.json
Normal file
65
test/data/ua/device/nothing.json
Normal file
@@ -0,0 +1,65 @@
|
||||
[
|
||||
{
|
||||
"desc": "Nothing 1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; A063) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/22.0 Chrome/111.0.5563.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nothing",
|
||||
"model": "A063",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nothing 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; A065 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.53 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nothing",
|
||||
"model": "A065",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nothing 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; AIN065 Build/AQ3A.240929.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.90 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/496.0.0.45.65;IABMV/1;] FBNV/500",
|
||||
"expect": {
|
||||
"vendor": "Nothing",
|
||||
"model": "AIN065",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nothing 2a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; A142 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.71 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nothing",
|
||||
"model": "A142",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nothing 2a Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; A142P Build/UP1A.231005.007) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.107 Mobile Safari/537.36 OPX/2.6",
|
||||
"expect": {
|
||||
"vendor": "Nothing",
|
||||
"model": "A142P",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nothing 3a",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; A059 Build/AQ3A.241015.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/127.0.6533.103 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nothing",
|
||||
"model": "A059",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nothing 3a Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; A059P Build/AQ3A.241015.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/136.0.7103.57 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/511.0.0.73.36;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "Nothing",
|
||||
"model": "A059P",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
47
test/data/ua/device/nvidia.json
Normal file
47
test/data/ua/device/nvidia.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"desc": "Tegra Note 7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; TegraNote-P1640 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nvidia",
|
||||
"model": "TegraNote-P1640",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nvidia Shield",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; SHIELD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nvidia",
|
||||
"model": "SHIELD",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nvidia Shield Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; SHIELD Tablet Build/LVY48E; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/45.0.2454.19 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nvidia",
|
||||
"model": "SHIELD Tablet",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nvidia Shield Tablet K1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; SHIELD Tablet K1 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Nvidia",
|
||||
"model": "SHIELD Tablet K1",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Nvidia Shield TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; SHIELD Android TV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36 ",
|
||||
"expect": {
|
||||
"vendor": "Nvidia",
|
||||
"model": "SHIELD Android TV",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
344
test/data/ua/device/oneplus.json
Normal file
344
test/data/ua/device/oneplus.json
Normal file
@@ -0,0 +1,344 @@
|
||||
[
|
||||
{
|
||||
"desc": "OnePlus One",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; A0001 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "A0001",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus One",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; OnePlus One A0001 Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "A0001",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; ONE A2003) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.93 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "A2003",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; ONEPLUS A3000 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "A3000",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; ONEPLUS A6003) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.89 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "A6003",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 6T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; ONEPLUS A6010) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.96 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "A6010",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 7T Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.57 Mobile Safari/537.36 EdgA/110.0.1587.66",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "HD1913",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 8 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; OnePlus 8 Lite) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4741.47 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "8 Lite",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 8 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; IN2025) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.119 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "IN2025",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 8T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; KB2005) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "KB2005",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 9",
|
||||
"ua": "Mozilla/5.0 (Android 14; SDK 28; OnePlus 9) Gecko/128.0 Firefox/128.0",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "9",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 9",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; LE2113 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.162 Mobile Safari/537.36 Flipboard/4.3.14/5377,4.3.14.5377",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "LE2113",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 9 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; LE2123) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.128 Mobile Safari/537.36 OPR/73.0.3832.69371",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "LE2123",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 9R",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 11; LE2100) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.85 YaApp_Android/21.114.1 YaSearchBrowser/21.114.1 BroPP/1.0 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "LE2100",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 9RT 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 11; en-in; MT2111 Build/RKQ1.210614.002) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 GSA/13.14.15.23.arm64",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "MT2111",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 10 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 12; NE2213) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.148 YaBrowser/22.7.5.90.00 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "NE2213",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 10RT",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; CPH2413) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "CPH2413",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 11R",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; CPH2487) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "CPH2487",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus 13",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 15; CPH2653 Build/AP3A.240617.008; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.92 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/504.0.0.69.64;IABMV/1;] FBNV/5",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "CPH2653",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-cn; PGKM10 Build/AP3A.240617.008) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.168 Mobile Safari/537.36 HeyTapBrowser/40.9.6.2",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PGKM10",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace 2",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 14; zh-CN; PHK110 Build/UKQ1.231108.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/17.3.6.1367 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PHK110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace 2 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; arm; Android 13; PJA110) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 YaBrowser/23.1.0.284.00 (beta) SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PJA110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace 2V",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-cn; PHP110 Build/AP3A.240617.008) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/121.0.6167.71 MQQBrowser/16.3 Mobile Safari/537.36 COVC/047707",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PHP110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace 3",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-CN; PJE110 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/123.0.6312.80 Quark/7.9.7.782 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PJE110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace 3 Pro 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-CN; PJX110 Build/UKQ1.231108.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/123.0.6312.80 Quark/7.11.4.814 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PJX110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace 3V",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 14; zh-cn; PJF110 Build/UP1A.231005.007) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.61 Mobile Safari/537.36 HeyTapBrowser/40.8.33.1.2beta",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PJF110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace 5",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-cn; PKG110 Build/UKQ1.231108.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.168 Mobile Safari/537.36 HeyTapBrowser/40.9.9.2",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PKG110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 14; zh-CN; PGP110 Build/UKQ1.230924.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/17.2.9.1360 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PGP110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Ace Racing Edition",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; PGZ110 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/17.3.6.1367 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "PGZ110",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Nord CE 4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; CPH2613) AppleWebKit/537.36 (KHTML, like Gecko) JioSphere/5.0.4 Chrome/119.0.6045.193 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "CPH2613",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Nord N10 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; BE2029) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.185 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "BE2029",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Nord N30 SE 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; CPH2605 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/135.0.7049.92 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/509.0.0.67.28;IABMV/1;]",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "CPH2605",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Nord N100",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; BE2015 Build/QKQ1.200719.002; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "BE2015",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Open",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 15; CPH2551 Build/AP3A.240617.008)",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "CPH2551",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Pad Go 11.35",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 14; OPD2304) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.629 YaApp_Android/24.101/apad YaSearchBrowser/24.101/apad BroPP/1.0 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "OPD2304",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Pad 2 12.1 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; OPD2403 Build/UKQ1.231108.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "OPD2403",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Pad 11.61 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; OPD2203 Build/UKQ1.230924.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "OPD2203",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OnePlus Watch 2",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; OPWWE231 Build/TWR7.231113.001.OPWWE231_11_A.117.240703)",
|
||||
"expect": {
|
||||
"vendor": "OnePlus",
|
||||
"model": "OPWWE231",
|
||||
"type": "wearable"
|
||||
}
|
||||
}
|
||||
]
|
||||
164
test/data/ua/device/oppo.json
Normal file
164
test/data/ua/device/oppo.json
Normal file
@@ -0,0 +1,164 @@
|
||||
[
|
||||
{
|
||||
"desc": "OPPO Pad",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; OPD2101 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/16.3.9.1290 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "OPD2101",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Neo",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; R831T Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 OppoBrowser/3.3.2 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "R831T",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO R7s",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; OPPO R7s Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.1 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "R7s",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO A3s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; CPH1803 Build/OPM1.171019.026; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "CPH1803",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO A12",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; CPH2083) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "CPH2083",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Reno",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; PCAT00 Build/PKQ1.190101.001; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "PCAT00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Reno3 Pro 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; PCLM50) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.117 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "PCLM50",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Reno4 SE",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; xx-xx; PEAM00 Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.80 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "PEAM00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Reno4 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; PDPM00 Build/QKQ1.200216.002; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "PDPM00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Reno4 Pro 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; xx-xx; PDNT00 Build/QKQ1.200216.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.80 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "PDNT00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Reno5 A",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; A101OP) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "A101OP",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Find X",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; PAFM00 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "PAFM00",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Find 7a",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.3; xx-xx; X9007 Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "X9007",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO F5",
|
||||
"ua": "ozilla/5.0 (Linux; Android 7.1.1; CPH1723) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "CPH1723",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Watch 46mm",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; OW19W3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "OW19W3",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Watch 41mm",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; OW19W2 Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "OW19W2",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Watch 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; OW20W1 Build/OPM1.171019.026.11_A.37.210713172937; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "OW20W1",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "OPPO Watch X",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; OWWE231 Build/TWR7.231113.001.OWWE231_11_A.117.240703)",
|
||||
"expect": {
|
||||
"vendor": "OPPO",
|
||||
"model": "OWWE231",
|
||||
"type": "wearable"
|
||||
}
|
||||
}
|
||||
]
|
||||
11
test/data/ua/device/ouya.json
Normal file
11
test/data/ua/device/ouya.json
Normal file
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"desc": "Ouya",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.1.2; OUYA Console Build/JZO54L-OUYA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.84 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "OUYA",
|
||||
"model": "undefined",
|
||||
"type": "console"
|
||||
}
|
||||
}
|
||||
]
|
||||
47
test/data/ua/device/panasonic.json
Normal file
47
test/data/ua/device/panasonic.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"desc": "Panasonic T31",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; Panasonic T31 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.170 Mobile Safari/537.36 ",
|
||||
"expect": {
|
||||
"vendor": "Panasonic",
|
||||
"model": "T31",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Panasonic TX-32CSW514 SmartTV",
|
||||
"ua": "HbbTV/1.2.1 (;Panasonic;VIERA 2015;3.014;a001-003 4000-0000;)",
|
||||
"expect": {
|
||||
"vendor": "Panasonic",
|
||||
"model": "VIERA 2015",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Panasonic TX-40FXW724 SmartTV",
|
||||
"ua": "HbbTV/1.4.1 (+DRM;Panasonic;SmartTV2018mid;3.024;4301-0003 0002-0000;SmartTV2018;)",
|
||||
"expect": {
|
||||
"vendor": "Panasonic",
|
||||
"model": "SmartTV2018mid",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Panasonic TX-43HXW904 SmartTV",
|
||||
"ua": "HbbTV/1.5.1 (+DRM;Panasonic;SmartTV2020mid;3.326;4301-0003 0008-0000;com.panasonic.SmartTV2020mid;)",
|
||||
"expect": {
|
||||
"vendor": "Panasonic",
|
||||
"model": "SmartTV2020mid",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Panasonic DMR-HST130 SAT receiver",
|
||||
"ua": "HbbTV/1.1.1 (+PVR;Panasonic;DIGA WebKit M8658;3.420;;)",
|
||||
"expect": {
|
||||
"vendor": "Panasonic",
|
||||
"model": "DIGA WebKit M8658",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
83
test/data/ua/device/philips.json
Normal file
83
test/data/ua/device/philips.json
Normal file
@@ -0,0 +1,83 @@
|
||||
[
|
||||
{
|
||||
"desc": "Philips S616",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; Philips S616 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "S616",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips W8510",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; Philips W8510 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.68 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "W8510",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips SmartTV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; PHILIPS 4k TV Build/RTXC.231010.082.A1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.71 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "PHILIPS",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips SmartTV",
|
||||
"ua": "Opera/9.80 HbbTV/1.1.1 (; Philips; ; ; ; ) NETTV/4.0.2; en) Version/11.60",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips 32PFL6606K/02 SmartTV (2011)",
|
||||
"ua": "Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips 32PFL6606K/02 SmartTV (2013)",
|
||||
"ua": "Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips 32PHS5301/12 SmartTV (2016)",
|
||||
"ua": "Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36 OPR/29.0.1803.0 OMI/4.5.23.37.MOT2.13 HbbTV/1.2.1 (;Philips;32PHS5301/12;;_TV_MT5800;) Firmware/TPM161E_012.002.045.001 en",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "32PHS5301/12",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips PH0M_EA_T32",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Philips FHD Android TV Build/QTG3.201102.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.186 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Philips PH3M_AL_T32",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Philips Google TV TA7 Build/RTM5.220609.199; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.58 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Philips",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
47
test/data/ua/device/pico.json
Normal file
47
test/data/ua/device/pico.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"desc": "Pico 4",
|
||||
"ua": "Mozilla/5.0 (X11; Linux x86_64; PICO 4 OS5.8.2 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.38 Chrome/105.0.5195.68 VR Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "PICO",
|
||||
"model": "4",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Pico 4",
|
||||
"ua": "Mozilla/5.0 (X11; Linux x86_64; PICO 4 OS5.4.0 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.22 Chrome/105.0.5195.68 VR Safari/537.36 OculusBrowser/7.0",
|
||||
"expect": {
|
||||
"vendor": "PICO",
|
||||
"model": "4",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Pico Neo3 Link",
|
||||
"ua": "Mozilla/5.0 (X11; Linux x86_64; Pico Neo3 Link OS5.8.4.0 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.22 Chrome/105.0.5195.68 VR Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Pico",
|
||||
"model": "Neo3 Link",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Pico Neo 3",
|
||||
"ua": "Mozilla/5.0 (X11; Linux x86_64; Pico Neo 3 OS5.12.2 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.48 Chrome/105.0.5195.68 VR Safari/537.36 OculusBrowser/7.0",
|
||||
"expect": {
|
||||
"vendor": "Pico",
|
||||
"model": "Neo 3",
|
||||
"type": "xr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Pico Neo 3 Pro",
|
||||
"ua": "Mozilla/5.0 (X11; Linux x86_64; Pico Neo 3 Pro OS5.9.9.0 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.46 Chrome/105.0.5195.68 VR Safari/537.36 OculusBrowser/7.0",
|
||||
"expect": {
|
||||
"vendor": "Pico",
|
||||
"model": "Neo 3 Pro",
|
||||
"type": "xr"
|
||||
}
|
||||
}
|
||||
]
|
||||
38
test/data/ua/device/polytron.json
Normal file
38
test/data/ua/device/polytron.json
Normal file
@@ -0,0 +1,38 @@
|
||||
[
|
||||
{
|
||||
"desc": "Polytron Prime 7 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 7.0; POLYTRON_P552 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 OPR/50.0.2254.149182",
|
||||
"expect": {
|
||||
"vendor": "POLYTRON",
|
||||
"model": "P552",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Polytron Rocket T1",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 5.0; en-US; POLYTRON R2501 Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/13.1.2.1293 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "POLYTRON",
|
||||
"model": "R2501",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Polytron Rocket T6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; POLYTRON R2509) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.92 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "POLYTRON",
|
||||
"model": "R2509",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Polytron Zap 6 Posh",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 5.1; in-ID; POLYTRON_4G501 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.10.0.1163 UCTurbo/1.9.9.900 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "POLYTRON",
|
||||
"model": "4G501",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
74
test/data/ua/device/realme.json
Normal file
74
test/data/ua/device/realme.json
Normal file
@@ -0,0 +1,74 @@
|
||||
[
|
||||
{
|
||||
"desc": "Realme C1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; RMX1811 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.126 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX1811",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Realme C2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; RMX1941) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX1941",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Realme Narzo 20",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 10; xx-xx; RMX2193 Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.80 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX2193",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Realme 2 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; RMX1801) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX1801",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Realme 3 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; RMX1851) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX1851",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Realme 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; RMX3085) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX3085",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Realme 9 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; RMX3471) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX3471",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Realme GT Master",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; RMX3363) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Realme",
|
||||
"model": "RMX3363",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
11
test/data/ua/device/retroid.json
Normal file
11
test/data/ua/device/retroid.json
Normal file
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"desc": "Retroid Pocket 4 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 13; Retroid Pocket 4 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.96 YaBrowser/24.4.3.96.00 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Retroid",
|
||||
"model": "Pocket 4 Pro",
|
||||
"type": "console"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/roku.json
Normal file
29
test/data/ua/device/roku.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "Roku",
|
||||
"ua": "Mozilla/5.0 (Roku) AppleWebKit/537.36 (KHTML, like Gecko) Web/1.1 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Roku",
|
||||
"model": "",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Roku",
|
||||
"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 Roku/DVP-8.10 (468.10E04145A)",
|
||||
"expect": {
|
||||
"vendor": "Roku",
|
||||
"model": "DVP-8.10",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Roku",
|
||||
"ua": "Roku4640X/DVP-7.70 (297.70E04154A)",
|
||||
"expect": {
|
||||
"vendor": "Roku",
|
||||
"model": "DVP-7.70",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
398
test/data/ua/device/samsung.json
Normal file
398
test/data/ua/device/samsung.json
Normal file
@@ -0,0 +1,398 @@
|
||||
[
|
||||
{
|
||||
"desc": "Samsung Galaxy A21s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-A217F) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.0 Chrome/75.0.3770.143 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-A217F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy A31",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SM-A315G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-A315G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy A50",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SM-A505F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.105 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-A505F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy A50s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; SM-A507FN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-A507FN",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy A52s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; SM-A528B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-A528B",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy A80",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SM-A805F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.112 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-A805F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Fold",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SAMSUNG SM-F900U Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/9.2 Chrome/67.0.3396.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-F900U",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Z Flip",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SM-F700N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-F700N",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Z Fold2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SM-F916B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-F916B",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy S10E",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SM-G970F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-G970F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy S20 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SCG01) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SCG01",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Note 10+",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SM-N976V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.89 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-N976V",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SM-C5000",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; SM-C5000 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 wkbrowser 4.1.35 3065",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-C5000",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung C8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; SM-C7108) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-C7108",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Note 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; GT-N5100 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "GT-N5100",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SM-T231",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; SM-T231 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-T231",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Tab 6 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-P610) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/12.0 Chrome/79.0.3945.136 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-P610",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Tab A 9.7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; SM-P550 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.90 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-P550",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Tab A 10.1",
|
||||
"ua": " Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-T515) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/13.0 Chrome/83.0.4103.106 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-T515",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Tab S7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SM-T870) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-T870",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Tab S8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; SM-X706B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-X706B",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Tab S",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; SM-T700 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-T700",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Tab Pro 10.1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; SM-T520 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-T520",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Watch",
|
||||
"ua": "Mozilla/5.0 (Linux; Tizen 5.5; SAMSUNG SM-R805W) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.0 Chrome/69.0.3497.106 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-R805W",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Watch Active 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Tizen 5.5; SAMSUNG SM-R820) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.0 Chrome/69.0.3497.106 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-R820",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Watch4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; SAMSUNG SM-R875U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.2. Chrome/102.0.5005.125 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-R875U",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Watch5 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; SAMSUNG SM-R925U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2. Chrome/111.0.5563.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-R925U",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Watch7",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 14; SM-L300 Build/AW2E.240318.016)",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-L300",
|
||||
"type": "wearable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Note 10.1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; SM-P605) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-P605",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SmartTV2011",
|
||||
"ua": "HbbTV/1.1.1 (;;;;;) Maple;2011",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SmartTV2011",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SmartTV2012",
|
||||
"ua": "HbbTV/1.1.1 (;Samsung;SmartTV2012;;;) WebKit",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SmartTV2012",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SmartTV2014",
|
||||
"ua": "HbbTV/1.1.1 (;Samsung;SmartTV2014;T-NT14UDEUC-1060.4;;) WebKit",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SmartTV2014",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SmartTV",
|
||||
"ua": "Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SmartTV",
|
||||
"ua": "Mozilla/5.0 (SMART-TV; Linux; Tizen 8.0) AppleWebKit/537.36 (KHTML, like Gecko) Samsung Browser/7.0 Chrome/108.0.5359.1 TV Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung SmartTV HBBTV",
|
||||
"ua": "HbbTV/1.5.1 (+DRM;Samsung;SmartTV2021:UAU7000;T-KSU2EDEUC-1506.0;KantSU2e;urn:samsungtv:familyname:21_KANTSU2E_UHD_BASIC:2021;) Tizen/6.0 (+TVPLUS+SmartHubLink) Chrome/76 LaTivu_1.0.1_2021 RVID/17",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SmartTV2021:UAU7000",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Galaxy Nexus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "Galaxy Nexus",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy C9 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; SAMSUNG SM-C900F Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.2 Chrome/44.0.2403.133 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-C900F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy S5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0; SM-G900F Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-G900F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy J7 Prime",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; SM-G610F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-G610F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy S6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; SM-G920I Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-G920I",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy S6 Edge",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; SM-G925I Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-G925I",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Note 5 Chrome",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; SM-N920C Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-N920C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Note 5 Samsung Browser",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-N920C Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "SM-N920C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Samsung Galaxy Gear Live",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4; Gear Live Build/KMV78X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/19.77.34.5 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Samsung",
|
||||
"model": "Gear Live",
|
||||
"type": "wearable"
|
||||
}
|
||||
}
|
||||
]
|
||||
56
test/data/ua/device/sharp.json
Normal file
56
test/data/ua/device/sharp.json
Normal file
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"desc": "Sharp AQUOS-TVX19B",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; AQUOS-TVX19B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sharp",
|
||||
"model": "AQUOS-TVX19B",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sharp Aquos B10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; SH-A01) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sharp",
|
||||
"model": "SH-A01",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sharp Aquos L2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; SH-L02 Build/S4045) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sharp",
|
||||
"model": "SH-L02",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sharp Aquos L2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; SH-L02) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sharp",
|
||||
"model": "SH-L02",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sharp Aquos R2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0; SHV42) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.92 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sharp",
|
||||
"model": "SHV42",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Docomo SH-02M",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SH-02M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sharp",
|
||||
"model": "SH-02M",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/smartfren.json
Normal file
29
test/data/ua/device/smartfren.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "Smartfren Andromax L",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; Andromax B26D2H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Smartfren",
|
||||
"model": "Andromax B26D2H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Smartfren Andromax G2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; Smartfren Andromax AD9A1H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.83 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Smartfren",
|
||||
"model": "Andromax AD9A1H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Smartfren New Andromax I",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.1.2; id-id; New Andromax-i Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Smartfren",
|
||||
"model": "New Andromax-i",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
263
test/data/ua/device/sony.json
Normal file
263
test/data/ua/device/sony.json
Normal file
@@ -0,0 +1,263 @@
|
||||
[
|
||||
{
|
||||
"desc": "SONY Xperia 1 III",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; A101SO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "A101SO",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony G8141 (Xperia XZ1)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; SO-01K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "SO-01K",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony G8141 (Xperia XZ Premium)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; G8141) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "G8141",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony C5303 (Xperia SP)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.3; C5303 Build/12.1.A.1.205) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "C5303",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony SO-02F (Xperia Z1 F)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; SO-02F Build/14.1.H.2.119) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "SO-02F",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony D6653 (Xperia Z3)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4; D6653 Build/23.0.A.0.376) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "D6653",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia SOL25 (ZL2)",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.4; SOL25 Build/17.1.1.C.1.64) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "SOL25",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia SP",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.3; C5302 Build/12.1.A.1.201) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "C5302",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia L4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; XQ-AD51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.83 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-AD51",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia 1ii",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; XQ-AT51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-AT51",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia 1ii",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; SOG01) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "SOG01",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia 1 VI",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; XQ-EC44) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-EC44",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia 10ii",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; XQ-AU52) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-AU52",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia 10 III Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; XQ-BT44 Build/62.1.A.1.227; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.61 Mobile Safari/537.36 Sleipnir/3.6.0",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-BT44",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia 10 VI",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; XQ-ES72 Build/70.0.A.2.233; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/129.0.6668.71 Mobile Safari/537.36 Line/14.16.0/IAB",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-ES72",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; XQ-AQ52) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.185 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-AQ52",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Sony XQ-AQ52) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-AQ52",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia Pro I",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 11; XQ-BE72) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.148 YaBrowser/22.7.3.82.00 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "XQ-BE72",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony SGP521 (Xperia Z2 Tablet)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4; SGP521 Build/17.1.A.0.432) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "Xperia Tablet",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Xperia Z2 Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; SGP561) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.99 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "Xperia Tablet",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Tablet S",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 3.1; Sony Tablet S Build/THMAS10000) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "Xperia Tablet",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Tablet Z LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.1; SonySGP321 Build/10.2.C.0.143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "Xperia Tablet",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony BRAVIA 4K GB ATV3",
|
||||
"ua": "Mozilla/5.0 (Linux; Andr0id 9; BRAVIA 4K GB ATV3 Build/PTT1.190515.001.S38) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36 OPR/46.0.2207.0 OMI/4.13.0.180.DIA5.104 Model/Sony-BRAVIA-4K-GB-ATV3",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "BRAVIA 4K GB ATV3",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony BRAVIA 4K GB ATV3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; BRAVIA 4K GB ATV3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "BRAVIA 4K GB ATV3",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony Bravia 4k UR2",
|
||||
"ua": "Mozilla/5.0 (Linux: Andr0id 9: BRAVIA 4K UR2 Build/PTT1.190515.001.S104) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36 OPR/46.0.2207.0 OMI/4.13.5.431.DIA5HBBTV.250 Model/Sony-BRAVIA-4K-UR2",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "BRAVIA 4K UR2",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "PlayStation 4",
|
||||
"ua": "Mozilla/5.0 (PlayStation 4 3.00) AppleWebKit/537.73 (KHTML, like Gecko)",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "PlayStation 4",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "PlayStation 5",
|
||||
"ua": "Mozilla/5.0 (Playstation; Playstation 5/1.05) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "Playstation 5",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "PlayStation Vita",
|
||||
"ua": "Mozilla/5.0 (PlayStation Vita 3.52) AppleWebKit/537.73 (KHTML, like Gecko) Silk/3.2",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "PlayStation Vita",
|
||||
"type": "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Sony SmartWatch 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.2; SmartWatch 3 Build/LWX49K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/19.77.34.5 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Sony",
|
||||
"model": "SmartWatch 3",
|
||||
"type": "wearable"
|
||||
}
|
||||
}
|
||||
]
|
||||
488
test/data/ua/device/tcl.json
Normal file
488
test/data/ua/device/tcl.json
Normal file
@@ -0,0 +1,488 @@
|
||||
[
|
||||
{
|
||||
"desc": "TCL 10 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T790Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36 EdgA/114.0.1823.43",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T790Y",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10 5G UW",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; T790S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T790S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10 Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T782H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36 OPR/64.3.3282.60839",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T782H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; T799B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T799B",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10 SE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; T766H_RU) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.85 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T766H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10 TabMax",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 9296Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9296Q",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10 TabMax 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; 9295G_EEA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9295G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10 TabMax WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; 9296G_TR) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.101 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9296G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10L",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; T770B Build/QKQ1.200329.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36 GSA/11.41.10.23.arm64",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T770B",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 10L",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T770H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T770H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T781) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T781",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20 Pro 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T810S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Mobile Safari/537.36 EdgA/113.0.1774.63",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T810S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20 SE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T671H Build/RKQ1.201112.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/99.0.4844.73 Mobile Safari/537.36 GoogleApp/13.9.7.23.arm64",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T671H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20 XE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 5087Z) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "5087Z",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20B",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 6159K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "6159K",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 205",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 4187D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "4187D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20E",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 6125A) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/18.0 Chrome/99.0.4844.88 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "6125A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20L",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T774H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.59 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T774H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20L Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T775H Build/RKQ1.210107.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.61 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T775H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20R 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T767H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36 OPR/71.3.3718.67322",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T767H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20S",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T773O) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T773O",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 20Y",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 6156D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.134 Mobile Safari/537.36 OPR/70.3.3653.66287",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "6156D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30 V 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; T781S Build/RKQ1.210614.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.166 Mobile Safari/537.36[FBAN/EMA;FBLC/en_US;FBAV/369.0.0.5.110;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T781S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30 XE 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T767W Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.162 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/416.0.0.35.85;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T767W",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 305",
|
||||
"ua": "Mozilla/5.0 (Linux; arm; Android 11; 6102D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.167 YaBrowser/22.7.6.96.00 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "6102D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 306",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; 6102H Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/107.0.5304.141 Mobile Safari/537.36[FBAN/EMA;FBLC/it_IT;FBAV/332.0.0.22.108;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "6102H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T676H Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.162 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T676H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30+",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T676J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T676J",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T776H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T776H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30 LE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; 4188V Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/112.0.5615.136 Mobile Safari/537.36[FBAN/EMA;FBLC/en_US;FBAV/352.0.0.14.108;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "4188V",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30 SE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; 6165H Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/108.0.5359.128 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/396.1.0.28.104;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "6165H",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 30E",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; 6127I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "6127I",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 40 NxtPaper",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; T612B Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.53 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T612B",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 4056S",
|
||||
"ua": "Mozilla/5.0 (Mobile; TCL 4056S; rv:84.0) Gecko/84.0 Firefox/84.0 KAIOS/3.0",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "4056S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL A3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; A509DL Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.61 Mobile Safari/537.36 GSA/13.18.7.23.arm64",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "A509DL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL A30",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 5102L Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/112.0.5615.136 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/413.0.0.30.104;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "5102L",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 40 SE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; T610K Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.166 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T610K",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 40 XE 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; T609DL Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.136 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/466.1.0.57.85;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T609DL",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 403",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T431D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T431D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 405",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T506D Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.162 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/418.0.0.33.69;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T506D",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 408",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; T507U Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36 OPR/75.0.2254.68857",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T507U",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL 40R 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T771K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36 EdgA/114.0.1823.37",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T771K",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Ion X",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T430W Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.60 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T430W",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL NxtPaper 11",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; 9466X Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.179 Safari/537.36 [FB_IAB/FB4A;FBAV/473.0.0.41.81;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9466X",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Stylus 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; T779W Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/127.0.6533.2 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "T779W",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 8 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; 9048S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9048S",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 8 LE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; 9137W Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.61 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9137W",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 10 FHD 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 9060G Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.196 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9060G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 10 HD 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 9060X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9060X",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 10 LTE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; 8196G Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.162 Safari/537.36 [FB_IAB/FB4A;FBAV/471.0.0.35.80;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "8196G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 10 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; 8496G Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/127.0.6533.61 Safari/537.36 [FB_IAB/FB4A;FBAV/474.0.0.52.74;]",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "8496G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 10L",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 8491X_EEA Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/107.0.5304.105 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "8491X",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Tab 10s 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 9080G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "9080G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TCL Xess P17AA",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; TCL Xess P17AA Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TCL",
|
||||
"model": "Xess P17AA",
|
||||
"type": "tablet"
|
||||
}
|
||||
}
|
||||
]
|
||||
20
test/data/ua/device/technisat.json
Normal file
20
test/data/ua/device/technisat.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"desc": "TechniSAT Digit ISIO S SAT receiver",
|
||||
"ua": "Opera/9.80 (Linux sh4; U; HbbTV/1.1.1 (;;;;;); CE-HTML; TechniSat Digit ISIO S; de) Presto/2.9.167 Version/11.50",
|
||||
"expect": {
|
||||
"vendor": "TechniSat",
|
||||
"model": "Digit ISIO S",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "TechniSAT MultyVision SmartTV",
|
||||
"ua": "Opera/9.80 (Linux i686; U; HbbTV/1.1.1 (;;;;;); CE-HTML; TechniSat MultyVision ISIO; de) Presto/2.9.167 Version/11.50",
|
||||
"expect": {
|
||||
"vendor": "TechniSat",
|
||||
"model": "MultyVision ISIO",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
47
test/data/ua/device/tecno.json
Normal file
47
test/data/ua/device/tecno.json
Normal file
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"desc": "Tecno DroiPad 8D",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 5.1; TECNO DP8D Build/LMY47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36 OPR/42.0.2254.139280",
|
||||
"expect": {
|
||||
"vendor": "TECNO",
|
||||
"model": "DP8D",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Tecno DroiPad 10A Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; TECNO DP10A Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TECNO",
|
||||
"model": "DP10A Pro",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Tecno DroiPad 10D 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; TECNO P904) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36 OPR/77.0.4054.90",
|
||||
"expect": {
|
||||
"vendor": "TECNO",
|
||||
"model": "P904",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Tecno KC8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; TECNO KC8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TECNO",
|
||||
"model": "KC8",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Tecno Spark 8C",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; TECNO KG5n) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "TECNO",
|
||||
"model": "KG5n",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
20
test/data/ua/device/tesla.json
Normal file
20
test/data/ua/device/tesla.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"desc": "Tesla",
|
||||
"ua": "Mozilla/5.0 (X11; GNU/Linux) AppleWebKit/601.1 (KHTML, like Gecko) Tesla QtCarBrowser Safari/601.1",
|
||||
"expect": {
|
||||
"vendor": "Tesla",
|
||||
"model": "undefined",
|
||||
"type": "embedded"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Tesla",
|
||||
"ua": "Mozilla/5.0 (X11; GNU/Linux) AppleWebKit/537.36 (KHTML, like Gecko) Chromium/79.0.3945.130 Chrome/79.0.3945.130 Safari/537.36 Tesla/2020.16.2.1-e99c70fff409",
|
||||
"expect": {
|
||||
"vendor": "Tesla",
|
||||
"model": "undefined",
|
||||
"type": "embedded"
|
||||
}
|
||||
}
|
||||
]
|
||||
92
test/data/ua/device/ulefone.json
Normal file
92
test/data/ua/device/ulefone.json
Normal file
@@ -0,0 +1,92 @@
|
||||
[
|
||||
{
|
||||
"desc": "Ulefone Armor",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; Armor Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Armor",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Armor",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 6.0; Armor) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 YaBrowser/20.4.2.101.00 SA/1 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Armor",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Armor 8 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Armor 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.192 Mobile Safari/537.36 OPR/74.1.3922.71199",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Armor 8 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Armor 12 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Armor 12 5G Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.166 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Armor 12 5G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Armor 20WT",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Armor 20WT) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/22.0 Chrome/111.0.5563.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Armor 20WT",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Armor Pad",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Armor Pad Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/431.0.0.30.108;]",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Armor Pad",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Armor X5 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Armor X5 Pro Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/430.0.0.23.113;]",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Armor X5 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Power Armor 14 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Power Armor14 Pro Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.138 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Power Armor14 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Power Armor 18T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Power Armor 18T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Power Armor 18T",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Ulefone Power Armor 19T",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; Power Armor 19T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.192 Mobile Safari/537.36 OPR/74.3.3922.71982",
|
||||
"expect": {
|
||||
"vendor": "Ulefone",
|
||||
"model": "Power Armor 19T",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
74
test/data/ua/device/vivo.json
Normal file
74
test/data/ua/device/vivo.json
Normal file
@@ -0,0 +1,74 @@
|
||||
[
|
||||
{
|
||||
"desc": "Vivo S1 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; vivo 1920) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "1920",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vivo Y52s",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; V2057A Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/12.10 SP-engine/2.28.0 baiduboxapp/12.10.0.10 (Baidu; P1 10) NABar/1.0",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "V2057A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vivo X60",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; V2046A; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 VivoBrowser/8.8.71.0",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "V2046A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vivo Y79A",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.2; vivo Y79A Build/N2G47H; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 VivoBrowser/9.0.14.0",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "Y79A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vivo Y93",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; vivo 1814) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "1814",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vivo Y97",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; V1813T Build/O11019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 VivoBrowser/9.0.14.0",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "V1813T",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vivo iQOO Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; V1916A; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 VivoBrowser/9.1.10.6",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "V1916A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vivo 1906 (Y11)",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; vivo 1906) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Vivo",
|
||||
"model": "1906",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
20
test/data/ua/device/vizio.json
Normal file
20
test/data/ua/device/vizio.json
Normal file
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"desc": "VIZIO",
|
||||
"ua": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 CrKey/1.0.999999 VIZIO SmartCast(Conjure/SX7B-4.6.419.12 FW/7.0.23.2-4 Model/M557-G0)",
|
||||
"expect": {
|
||||
"vendor": "VIZIO",
|
||||
"model": "M557-G0",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "VIZIO",
|
||||
"ua": "VIZIO V506-J09 ViziOS/1.4.512.847.1 WatchFree/24.06.13.2 FancyPlayer/1.1.30-qa ",
|
||||
"expect": {
|
||||
"vendor": "VIZIO",
|
||||
"model": "V506-J09",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
29
test/data/ua/device/wiko.json
Normal file
29
test/data/ua/device/wiko.json
Normal file
@@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"desc": "Wiko Life 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Wiko U316AT) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5199.205 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Wiko",
|
||||
"model": "U316AT",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Wiko Ride 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; Wiko U614AS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.181 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Wiko",
|
||||
"model": "U614AS",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Wiko T10",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; WIKO T10 Build/RP1A.200720.011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.62 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "WIKO",
|
||||
"model": "T10",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
605
test/data/ua/device/xiaomi.json
Normal file
605
test/data/ua/device/xiaomi.json
Normal file
@@ -0,0 +1,605 @@
|
||||
[
|
||||
{
|
||||
"desc": "MIUI Xiaomi Mi MIX 3 5G",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 9; Mi MIX 3 5G MIUI/V10.3.2.0.PEMEUVF)",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi MIX 3 5G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "MIUI POCOPHONE F1",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 9; POCOPHONE F1 MIUI/9.6.27)",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "POCOPHONE F1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "MIUI Xiaomi M2006C3MT",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 10; M2006C3MT MIUI/V12.0.7.0.QCRMIXM)",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2006C3MT",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi 2201117TG",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; 2201117TG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.98 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "2201117TG",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi M2004J19C",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; M2004J19C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.77 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2004J19C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi M2006C3MNG",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; M2006C3MNG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.85 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2006C3MNG",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi 21061119DG",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 11; 21061119DG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 YaBrowser/23.3.7.24.00 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "21061119DG",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi 2013023",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.2; en-US; 2013023 Build/HM2013023) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/10.0.1.512 U3/0.8.0 Mobile Safari/533.1",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "2013023",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Hongmi Note 1W",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; HM NOTE 1W Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.9.439 U3/0.8.0 Mobile Safari/533.1",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "HM NOTE 1W",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 3C",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; MI 3C Build/JLS36C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.9.439 U3/0.8.0 Mobile Safari/533.1",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI 3C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0; MI 5 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.83 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI 5",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1; MI 6 Build/NMF26X; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI 6",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 10 Pro",
|
||||
"ua": "Linux; U; Android 13; Mi 10 Pro Build/TKQ1.221114.001",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi 10 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 11 Lite 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; zh-CN; Mi 11 Lite 5G Build/SKQ1.211006.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.136 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.17.0-gn",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi 11 Lite 5G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 5s Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; MI 5s Plus Build/MXB48T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/8.7.1",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI 5s Plus",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi A1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; Mi A1 Build/OPR1.170623.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi A1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Note",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; MI NOTE LTE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI NOTE LTE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi One Plus",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; MI-ONE Plus Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI-ONE Plus",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Max 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; MI MAX 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI MAX 3",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi A1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Mi A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.101 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi A1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi A2 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Mi A2 Lite) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.62 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi A2 Lite",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 9 SE",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Mi 9 SE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi 9 SE",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi 10T",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; fr-CA; Mi 10T Build/SKQ1.211006.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.79 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.16.1-gn",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi 10T",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi A2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; Mi A2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi A2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi CC9",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 11; zh-cn; MI CC 9 Build/RKQ1.200826.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.116 Mobile Safari/537.36 XiaoMi/MiuiBrowser/15.5.18",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI CC 9",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi MI PAD",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.4.4; en-us; MI PAD Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.3.2",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI PAD",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi MI PAD 2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; MI PAD 2 Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Safari/537.36 [FB_IAB/FB4A;FBAV/137.0.0.24.91;]",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI PAD 2",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi MI PAD 2",
|
||||
"ua": "Mozilla/5.0 (Linux; x86_64; Android 5.1; MI PAD 2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 YaBrowser/20.11.2.69.01 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI PAD 2",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi MI PAD 3",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 7.0; MI PAD 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.216 YaBrowser/21.5.6.56.01 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI PAD 3",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi MI PAD 4",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 8.1.0; MI PAD 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 YaBrowser/19.9.1.126.01 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI PAD 4",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi MI PAD 4 PLUS",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; MI PAD 4 PLUS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MI PAD 4 PLUS",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi MI PAD 4 WiFi",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 8.1; Mi Pad4 Wi-Fi) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Mobile Safari/537.36 EdgA/86.0.622.61",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi Pad4 Wi-Fi",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Pad 5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; 21051182G Build/TKQ1.221013.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36 Flipboard/4.3.31/5486,4.3.31.5486",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "21051182G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Pad 5 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; M2105K81AC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Safari/537.36 Line/13.15.1/IAB",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2105K81AC",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Pad 5 Pro 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; M2105K81C) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2105K81C",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Pad 6 Max 14",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 14; zh-tw; 2307BRPDCC Build/UKQ1.230804.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/109.0.5414.118 Mobile Safari/537.36 Device/yudi Model/2307BRPDCC XiaoMi/MiuiBrowser/14.10.6",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "2307BRPDCC",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Pad 6 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 13; en-US; 23046RP50C Build/TKQ1.221114.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.6.2.1316 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "23046RP50C",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Pad 5",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; ca-ES; Xiaomi Pad 5 Build/SKQ1.220303.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.86 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.6.0-gn",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "mi Pad 5",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Pad 6S Pro 12.4",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; 24018RPACC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "24018RPACC",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCO X2",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; POCO X2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "POCO X2",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCO X3 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 11; M2102J20SI) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2102J20SI",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCO X3 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; M2102J20SG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2102J20SG",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCO X3 NFC",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; M2007J20CG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2007J20CG",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCO M2 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 11; POCO M2 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 YaBrowser/22.11.7.42.00 SA/3 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "POCO M2 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCO M3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; M2010J19CI) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2010J19CI",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCOPHONE F1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; POCOPHONE F1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "POCOPHONE F1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Redmi 4A",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; Redmi 4A Build/MMB29M; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi 4A",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Redmi 10C",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; 220333QAG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "220333QAG",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Redmi K30 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Redmi K30 5G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.96 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi K30 5G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Redmi K30 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Redmi K30 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi K30 Pro",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Redmi Note 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; Redmi Note 3 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi Note 3",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Redmi Note 9 Pro Max",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Redmi Note 9 Pro Max) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.99 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi Note 9 Pro Max",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Note 9S",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Redmi Note 9S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi Note 9S",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Note 10 5G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; M2103K19C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.88 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2103K19C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Note 10 Lite",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; es-VE; Mi Note 10 Lite Build/SKQ1.210908.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.88 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.16.1-gn",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Mi Note 10 Lite",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Note 10 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; M2101K6P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2101K6P",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Note 10 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 12; M2101K6G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "M2101K6G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Note 8",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; Redmi Note 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi Note 8",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Note 12 Turbo",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 13; 23049RAD8C; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36 VivoBrowser/16.7.1.1",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "23049RAD8C",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Pad",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 12; id-id; Redmi Pad Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/112.0.5615.136 Mobile Safari/537.36 XiaoMi/MiuiBrowser/14.1.1-gn",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "Redmi Pad",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Pad",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; 22081283G Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36 Flipboard/4.3.31/5486,4.3.31.5486",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "22081283G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Pad Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; 2405CRPFDG Build/UKQ1.240116.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/127.0.6533.97 Safari/537.36 [FB_IAB/FB4A;FBAV/476.0.0.49.74;] FBNV/1",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "2405CRPFDG",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Pad SE",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 14; 23073RPBFG Build/UKQ1.231003.002)",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "23073RPBFG",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "XiaoMi Redmi Pad SE 8.7",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 14; 24076RP19G Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Mobile Safari/537.36 Line/14.18.1/IAB",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "24076RP19G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 10; MiTV-MOOQ0 Build/QTG3.200305.006; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/94.0.4606.61 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MiTV-MOOQ0",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi TV",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; MiTV4I Build/PI; en-in) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36 Puffin/7.8.3.40913AP",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MiTV4I",
|
||||
"type": "smarttv"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi Mi Box",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; MIBOX3 Build/PI; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/119.0.6045.193 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Xiaomi",
|
||||
"model": "MIBOX3",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}
|
||||
]
|
||||
11
test/data/ua/device/zte.json
Normal file
11
test/data/ua/device/zte.json
Normal file
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"desc": "ZTE Blade A6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; ZTE BLADE A0620 Build/NMF26F; ru-ru) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36 Puffin/9.2.0.50586AP",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "BLADE A0620",
|
||||
"type": "mobile"
|
||||
}
|
||||
}
|
||||
]
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user