Bump version 2.0.3

This commit is contained in:
Faisal Salman 2025-03-15 00:37:56 +07:00
parent 6a41513df4
commit af8acf9078
19 changed files with 132 additions and 1648 deletions

View File

@ -65,6 +65,24 @@
---
## 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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1588
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
{
"title": "UAParser.js",
"name": "ua-parser-js",
"version": "2.0.2",
"version": "2.0.3",
"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": [

View File

@ -1,4 +1,4 @@
// Type definitions for Enums submodule of UAParser.js v2.0.2
// Type definitions for Enums submodule of UAParser.js v2.0.3
// Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.2
/* Enums for UAParser.js v2.0.3
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */

View File

@ -3,7 +3,7 @@
// Source: /src/enums/ua-parser-enums.js
///////////////////////////////////////////////
/* Enums for UAParser.js v2.0.2
/* Enums for UAParser.js v2.0.3
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@ -25,6 +25,7 @@ const Browser = Object.freeze({
BAIDU: 'Baidu Browser',
BASILISK: 'Basilisk',
BLAZER: 'Blazer',
BLU: 'BLU',
BOLT: 'Bolt',
BOWSER: 'Bowser',
BRAVE: 'Brave',
@ -41,9 +42,11 @@ const Browser = Object.freeze({
DAUM: 'Daum',
DILLO: 'Dillo',
DOLPHIN: 'Dolphin',
DOOBLE: 'Dooble',
DORIS: 'Doris',
DRAGON: 'Dragon',
DUCKDUCKGO: 'DuckDuckGo',
ECOSIA: 'Ecosia',
EDGE: 'Edge',
EPIPHANY: 'Epiphany',
FACEBOOK: 'Facebook',
@ -82,6 +85,7 @@ const Browser = Object.freeze({
KINDLE: 'Kindle',
LENOVO: 'Smart Lenovo Browser',
LADYBIRD: 'Ladybird',
LG: 'LG Browser',
LIBREWOLF: 'LibreWolf',
LIEBAO: 'LBBROWSER',
LINE: 'Line',
@ -106,10 +110,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',
@ -121,6 +127,7 @@ const Browser = Object.freeze({
QQ_LITE: 'QQBrowserLite',
QUARK: 'Quark',
QUPZILLA: 'QupZilla',
QUTEBROWSER: 'qutebrowser',
REKONQ: 'rekonq',
ROCKMELT: 'Rockmelt',
SAFARI: 'Safari',
@ -137,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',

View File

@ -1,4 +1,4 @@
// Type definitions for Helpers submodule of UAParser.js v2.0.2
// Type definitions for Helpers submodule of UAParser.js v2.0.3
// Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.2
/* Extensions for UAParser.js v2.0.3
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */

View File

@ -3,7 +3,7 @@
// Source: /src/extensions/ua-parser-extensions.js
///////////////////////////////////////////////
/* Extensions for UAParser.js v2.0.2
/* Extensions for UAParser.js v2.0.3
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@ -46,25 +46,25 @@ const Crawlers = Object.freeze({
[
// AhrefsBot - https://ahrefs.com/robot
// Amazonbot - https://developer.amazon.com/amazonbot
// Bingbot - http://www.bing.com/bingbot.htm
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
// CCBot - https://commoncrawl.org/faq
// 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
// LinkedInBot - http://www.linkedin.com
// MJ12bot - https://mj12bot.com/
// MojeekBot - https://www.mojeek.com/bot.html
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
// PerplexityBot - https://perplexity.ai/perplexitybot
// SemrushBot - http://www.semrush.com/bot.html
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
/((?:ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
/((?:adidx|ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|linkedin|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
// Applebot - http://apple.com/go/applebot
/(applebot(?:-extended)?)\/([\w\.]+)/i,
/(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)|anthropic-ai)\/?([\w\.]*)/i,
@ -82,6 +82,9 @@ const Crawlers = Object.freeze({
// Internet Archive (archive.org)
/(ia_archiver|archive\.org_bot)\/?([\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,
@ -94,8 +97,8 @@ const Crawlers = Object.freeze({
// Yeti (Naver)
/(yeti)\/([\w\.]+)/i,
// aiHitBot / Diffbot / Magpie-Crawler / Omgilibot / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
/((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |yisou)spider)\/?([\w\.]*)/i
// aiHitBot / Diffbot / Linespider / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
/((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|openai image downloader|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |line|yisou)spider)\/?([\w\.]*)/i
],
[NAME, VERSION, [TYPE, CRAWLER]],
@ -112,7 +115,7 @@ const Crawlers = Object.freeze({
// Qihoo 360Spider
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
/\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|(?=yahoo! )slurp)/i
/\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|yahoo! slurp)/i
],
[NAME, [TYPE, CRAWLER]]
]
@ -221,27 +224,35 @@ const Fetchers = Object.freeze({
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
// BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
// Better Uptime / BingPreview / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
// Google Site Verifier / Meta / Yahoo! Japan
// Yandex Bots - https://yandex.com/bots
/(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot|google-site-verification|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
/(ahrefssiteaudit|(?:bing|microsoft)preview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero)bot|google-site-verification|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
// Bluesky
/(bluesky) cardyb\/([\w\.]+)/i,
// Skype
/(skypeuripreview) preview\/([\w\.]+)/i,
// Slackbot - https://api.slack.com/robots
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
// WhatsApp
/(whatsapp)\/([\w\.]+)[\/ ][ianw]/i
/(whatsapp)\/([\w\.]+)/i
],
[NAME, VERSION, [TYPE, FETCHER]],
[
// Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots
/(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat|yandex(?:sitelinks|userproxy))/i
/((?:better uptime |telegram|vercel)bot|cohere-ai|feedfetcher-google|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|yandex(?:sitelinks|userproxy))/i
],
[NAME, [TYPE, FETCHER]],
],
os : [
[/whatsapp\/[\d\.]+ (a|i)/i],
[[NAME, os => os == 'A' ? 'Android' : 'iOS' ]]
]
});
@ -252,10 +263,12 @@ const Fetchers = Object.freeze({
const InApps = Object.freeze({
browser : [
// Slack
[/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
[/(?:slack(?=.+electron|.+ios)|chatlyio)\/([\d\.]+)/i],
[VERSION, [NAME, 'Slack'], [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]]
]
});
@ -331,15 +344,20 @@ const Libraries = Object.freeze({
const Vehicles = Object.freeze({
device : [
[
/dilink.+(byd) auto/i, // BYD
], [VENDOR], [
[/aftlbt962e2/i], // BMW
[[VENDOR, 'BMW']],
/(rivian) (r1t)/i, // Rivian
], [VENDOR, MODEL], [
[/dilink.+(byd) auto/i], // BYD
[VENDOR],
/vcc.+netfront/i, // Volvo
], [[VENDOR, 'Volvo']]
[/aftlft962x3/i], // Jeep
[[VENDOR, 'Jeep'], [MODEL, 'Wagooner']],
[/(rivian) (r1t)/i], // Rivian
[VENDOR, MODEL],
[/vcc.+netfront/i], // Volvo
[[VENDOR, 'Volvo']]
]
});
@ -353,6 +371,9 @@ const Bots = Object.freeze({
...Crawlers.browser,
...Fetchers.browser,
...Libraries.browser
],
os : [
...Fetchers.os
]
});

View File

@ -1,4 +1,4 @@
// Type definitions for Helpers submodule of UAParser.js v2.0.2
// Type definitions for Helpers submodule of UAParser.js v2.0.3
// Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.2
/* Helpers for UAParser.js v2.0.3
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */

View File

@ -3,7 +3,7 @@
// Source: /src/helpers/ua-parser-helpers.js
///////////////////////////////////////////////
/* Helpers for UAParser.js v2.0.2
/* Helpers for UAParser.js v2.0.3
https://github.com/faisalman/ua-parser-js
Author: Faisal Salman <f@faisalman.com>
AGPLv3 License */
@ -97,6 +97,9 @@ const isAIBot = (resultOrUA) => [
// Perplexity
'perplexitybot',
// Semrush
'semrushbot-ocob',
// Timpi
'timpibot',

View File

@ -1,4 +1,4 @@
// Type definitions for UAParser.js v2.0.2
// Type definitions for UAParser.js v2.0.3
// Project: https://github.com/faisalman/ua-parser-js
// Definitions by: Faisal Salman <https://github.com/faisalman>

View File

@ -1,6 +1,6 @@
/////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.2
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
/* UAParser.js v2.0.3
Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
Supports browser & node.js environment.
@ -19,7 +19,7 @@
// Constants
/////////////
var LIBVERSION = '2.0.2',
var LIBVERSION = '2.0.3',
UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent',
EMPTY = '',

View File

@ -3,8 +3,8 @@
// Source: /src/main/ua-parser.js
/////////////////////////////////////////////////////////////////////////////////
/* UAParser.js v2.0.2
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
/* UAParser.js v2.0.3
Copyright © 2012-2025 Faisal Salman <f@faisalman.com>
AGPLv3 License *//*
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
Supports browser & node.js environment.
@ -21,7 +21,7 @@
// Constants
/////////////
var LIBVERSION = '2.0.2',
var LIBVERSION = '2.0.3',
UA_MAX_LENGTH = 500,
USER_AGENT = 'user-agent',
EMPTY = '',
@ -355,11 +355,11 @@
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon)\/([-\w\.]+)/i,
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser)\/([-\w\.]+)/i,
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
/(heytap|ovi|115)browser\/([\d\.]+)/i, // HeyTap/Ovi/115
/(weibo)__([\d\.]+)/i // Weibo
/(heytap|ovi|115|surf)browser\/([\d\.]+)/i, // HeyTap/Ovi/115/Surf
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i // Ecosia/Weibo
], [NAME, VERSION], [
/quark(?:pc)?\/([-\w\.]+)/i // Quark
], [VERSION, [NAME, 'Quark']], [
@ -587,8 +587,11 @@
/\b(opd2(\d{3}a?))(?: bui|\))/i
], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['304', '403', '203'], '*' : OPPO }], [TYPE, TABLET]], [
// BLU Vivo Series
/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i
], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [
// Vivo
/vivo (\w+)(?: bui|\))/i,
/; vivo (\w+)(?: bui|\))/i,
/\b(v[12]\d{3}\w?[at])(?: bui|;)/i
], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
@ -608,7 +611,7 @@
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
/\blg[-e;\/ ]+((?!browser|netcast|android tv|watch)\w+)/i,
/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch))(\w+)/i,
/\blg-?([\d\w]+) bui/i
], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
@ -715,6 +718,14 @@
/droid.+; (a(?:015|06[35]|142p?))/i
], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
// Archos
/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [
/archos ([\w ]+)( b|\))/i,
/; (ac[3-6]\d\w{2,8})( b|\))/i
], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [
// MIXED
/(imo) (tab \w+)/i, // IMO
/(infinix) (x1101b?)/i // Infinix XPad
@ -722,7 +733,7 @@
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Infinix/Tecno/Micromax/Advan
/; (hmd|imo) ([\w ]+?)(?: bui|\))/i, // HMD/IMO
/; (blu|hmd|imo|tcl)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i, // BLU/HMD/IMO/TCL
/(hp) ([\w ]+\w)/i, // HP iPAQ
/(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
/(lenovo)[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i, // Lenovo
@ -730,7 +741,6 @@
], [VENDOR, MODEL, [TYPE, MOBILE]], [
/(kobo)\s(ereader|touch)/i, // Kobo
/(archos) (gamepad2?)/i, // Archos
/(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
/(kindle)\/([\w\.]+)/i // Kindle
], [VENDOR, MODEL, [TYPE, TABLET]], [
@ -758,7 +768,9 @@
], [VENDOR, [TYPE, SMARTTV]], [
/hbbtv.+maple;(\d+)/i
], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i // LG SmartTV
/tcast.+(lg)e?. ([-\w]+)/i // LG SmartTV
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
], [[VENDOR, LG], [TYPE, SMARTTV]], [
/(apple) ?tv/i // Apple TV
], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
@ -770,6 +782,8 @@
], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
/crkey/i // Google Chromecast, Linux-based or unknown
], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
/(portaltv)/i // Facebook Portal TV
], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [
/droid.+aft(\w+)( bui|\))/i // Fire TV
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
/(shield \w+ tv)/i // Nvidia Shield TV
@ -838,7 +852,7 @@
], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [
/(pico) (4|neo3(?: link|pro)?)/i // Pico
], [VENDOR, MODEL, [TYPE, XR]], [
/; (quest( \d| pro)?)/i // Oculus Quest
/(quest( \d| pro)?s?).+vr/i // Meta Quest
], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [
///////////////////
@ -933,7 +947,7 @@
/(ubuntu) ([\w\.]+) like android/i // Ubuntu Touch
], [[NAME, /(.+)/, '$1 Touch'], VERSION], [
// Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen|webos)\w*[-\/; ]?([\d\.]*)/i
/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen|webos)\w*[-\/\.; ]?([\d\.]*)/i
], [NAME, VERSION], [
/\(bb(10);/i // BlackBerry 10
], [VERSION, [NAME, BLACKBERRY]], [
@ -1215,7 +1229,11 @@
'Chrome' : 'Google Chrome',
'Edge' : 'Microsoft Edge',
'Chrome WebView' : 'Android WebView',
'Chrome Headless' : 'HeadlessChrome'
'Chrome Headless' : 'HeadlessChrome',
'Huawei Browser' : 'HuaweiBrowser',
'MIUI Browser' : 'Miui Browser',
'Opera Mobi' : 'OperaMobile',
'Yandex' : 'YaBrowser'
});
this.set(NAME, brandName)
.set(VERSION, brandVersion)