ua-parser-js 2.0.0-rc.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  ///////////////////////////////////////////////
2
- /* Extensions for UAParser.js v2.0.0-rc.3
2
+ /* Extensions for UAParser.js v2.0.1
3
3
  https://github.com/faisalman/ua-parser-js
4
4
  Author: Faisal Salman <f@faisalman.com>
5
5
  AGPLv3 License */
@@ -28,8 +28,8 @@ const LIBRARY = 'library';
28
28
 
29
29
  const CLIs = Object.freeze({
30
30
  browser : [
31
- // wget / curl / lynx
32
- [/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
31
+ // wget / curl / Lynx / ELinks / HTTPie
32
+ [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
33
33
  ]
34
34
  });
35
35
 
@@ -42,7 +42,6 @@ const Crawlers = Object.freeze({
42
42
  [
43
43
  // AhrefsBot - https://ahrefs.com/robot
44
44
  // Amazonbot - https://developer.amazon.com/amazonbot
45
- // Applebot - http://apple.com/go/applebot
46
45
  // Bingbot - http://www.bing.com/bingbot.htm
47
46
  // CCBot - https://commoncrawl.org/faq
48
47
  // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
@@ -54,13 +53,17 @@ const Crawlers = Object.freeze({
54
53
  // OpenAI's SearchGPT - https://platform.openai.com/docs/bots
55
54
  // PerplexityBot - https://perplexity.ai/perplexitybot
56
55
  // SemrushBot - http://www.semrush.com/bot.html
57
- /((?:ahrefs|amazon|apple|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush)bot)\/([\w\.]+)/i,
56
+ // SeznamBot - http://napoveda.seznam.cz/seznambot-intro
57
+ /((?:ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
58
+
59
+ // Applebot - http://apple.com/go/applebot
60
+ /(applebot(?:-extended)?)\/([\w\.]+)/i,
58
61
 
59
62
  // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
60
63
  /(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
61
64
 
62
65
  // ClaudeBot (Anthropic)
63
- /(claude(?:bot|-web))\/([\w\.]+)/i,
66
+ /(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i,
64
67
 
65
68
  // Coc Coc Bot - https://help.coccoc.com/en/search-engine
66
69
  /(coccocbot-(?:image|web))\/([\w\.]+)/i,
@@ -87,8 +90,8 @@ const Crawlers = Object.freeze({
87
90
  // Yeti (Naver)
88
91
  /(yeti)\/([\w\.]+)/i,
89
92
 
90
- // YisouSpider
91
- /(yisouspider)\/?([\w\.]*)/i
93
+ // aiHitBot / Diffbot / Magpie-Crawler / Omgilibot / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
94
+ /((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |yisou)spider)\/?([\w\.]*)/i
92
95
  ],
93
96
 
94
97
  [NAME, VERSION, [TYPE, CRAWLER]],
@@ -97,13 +100,15 @@ const Crawlers = Object.freeze({
97
100
  // Google Bots
98
101
  /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
99
102
 
103
+ // AI2Bot - https://allenai.org/crawler
100
104
  // Bytespider
101
105
  // DataForSeoBot - https://dataforseo.com/dataforseo-bot
102
106
  // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
107
+ // ImagesiftBot - https://imagesift.com/about
103
108
  // Qihoo 360Spider
104
109
  // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
105
110
  // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
106
- /(360spider-?(?:image|video)?|bytespider|(?:aspiegel|dataforseo|petal|turnitin)bot|(?=yahoo! )slurp)/i
111
+ /\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|(?=yahoo! )slurp)/i
107
112
  ],
108
113
  [NAME, [TYPE, CRAWLER]]
109
114
  ]
@@ -156,7 +161,7 @@ const ExtraDevices = Object.freeze({
156
161
  /\b(zur\d{3}) b/i // Swiss ZUR Tablet
157
162
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
158
163
 
159
- /\b((zeki)?tb.*\b) b/i // Zeki Tablets
164
+ /^((zeki)?tb.*\b) b/i // Zeki Tablets
160
165
  ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
161
166
 
162
167
  /\b([yr]\d{2}) b/i,
@@ -195,8 +200,10 @@ const ExtraDevices = Object.freeze({
195
200
 
196
201
  const Emails = Object.freeze({
197
202
  browser : [
203
+ [
198
204
  // Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
199
- [/(evolution|kmail2?|kontact|(?:microsoft |mac)outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, EMAIL]]
205
+ /(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
206
+ ], [NAME, VERSION, [TYPE, EMAIL]]
200
207
  ]
201
208
  });
202
209
 
@@ -211,31 +218,25 @@ const Fetchers = Object.freeze({
211
218
  // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
212
219
  // DuckAssistBot - https://duckduckgo.com/duckassistbot/
213
220
  // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
214
- /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
215
-
216
- // Google Site Verifier
217
- /(google-site-verification)\/([\w\.]+)/i,
221
+ // Google Site Verifier / Meta / Yahoo! Japan
222
+ // Yandex Bots - https://yandex.com/bots
223
+ /(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,
218
224
 
219
- // Meta
220
- /(meta-externalfetcher)\/([\w\.]+)/i,
225
+ // Bluesky
226
+ /(bluesky) cardyb\/([\w\.]+)/i,
221
227
 
222
228
  // Slackbot - https://api.slack.com/robots
223
229
  /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
224
230
 
225
231
  // WhatsApp
226
- /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
227
-
228
- // Yahoo! Japan
229
- /(y!?j-dlc)\/([\w\.]+)/i,
230
-
231
- // Yandex Bots - https://yandex.com/bots
232
- /(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
233
- /(yandex(?:sitelinks|userproxy))/i
232
+ /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i
234
233
  ],
235
234
  [NAME, VERSION, [TYPE, FETCHER]],
236
235
 
237
- // Google Bots / Snapchat
238
- [/(feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
236
+ [
237
+ // Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots
238
+ /(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat|yandex(?:sitelinks|userproxy))/i
239
+ ],
239
240
  [NAME, [TYPE, FETCHER]],
240
241
  ]
241
242
  });
@@ -260,106 +261,48 @@ const InApps = Object.freeze({
260
261
 
261
262
  const MediaPlayers = Object.freeze({
262
263
  browser : [[
263
-
264
- /(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
265
- /(coremedia) v([\w\._]+)/i
266
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
267
-
268
- /(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
269
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
270
-
271
- /(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
272
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
273
-
274
- /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
275
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
264
+ /(apple(?:coremedia|tv))\/([\w\._]+)/i, // Generic Apple CoreMedia
265
+ /(coremedia) v([\w\._]+)/i,
266
+ // Ares/Nexplayer/OSSProxy
267
+ /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
268
+ // Aqualung/Lyssna/BSPlayer/Clementine/MPD
269
+ // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
276
270
  // NSPlayer/PSP-InternetRadioPlayer/Videos
277
- /(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
278
- /(lg player|nexplayer)\s([\d\.]+)/i,
279
- /player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
280
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
281
- /(nexplayer)\s([\w\.-]+)/i // Nexplayer
271
+ // Nero Home/Nero Scout/Nokia
272
+ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
273
+ // SoundTap/Totem/Stagefright/Streamium
274
+ // XBMC/gvfs/Xine/XMMS/irapp
275
+ /^(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,
276
+ /(lg player|nexplayer) ([\d\.]+)/i,
277
+ /player\/(nexplayer|lg player) ([\w\.-]+)/i, // NexPlayer/LG Player
278
+ /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i, // Gstreamer
279
+ /(htc streaming player) [\w_]+ \/ ([\d\.]+)/i, // HTC Streaming Player
280
+ /(lavf)([\d\.]+)/i, // Lavf (FFMPEG)
281
+ // MPlayer SVN
282
+ /(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
283
+ / (songbird)\/([\w\.-]+)/i, // Songbird/Philips-Songbird
284
+ /(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i, // Winamp
285
+ /(vlc)(?:\/| media player - version )([\w\.-]+)/i, // VLC Videolan
286
+ /^(foobar2000|itunes|smp)\/([\d\.]+)/i, // Foobar2000/iTunes/SMP
287
+ /com\.(riseupradioalarm)\/([\d\.]*)/i, // RiseUP Radio Alarm
288
+ /(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i, // MPlayer
289
+ // Windows Media Server
290
+ /(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
282
291
  ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
283
292
 
284
293
  /(flrp)\/([\w\.-]+)/i // Flip Player
285
294
  ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
286
-
287
- /(fstream|nativehost|queryseekspider)/i
288
295
  // FStream/NativeHost/QuerySeekSpider
296
+ // MPlayer (no other info)/Media Player Classic/Nero ShowTime
297
+ // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
298
+ // inlight radio / YourMuze
299
+ /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
289
300
  ], [NAME, [TYPE, MEDIAPLAYER]], [
290
301
 
291
- /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
292
- // Gstreamer
293
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
302
+ /(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i, // HTC One S / Windows Media Player
303
+ ], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
294
304
 
295
- /(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
296
- /(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
297
- // Java/urllib/requests/wget/cURL
298
- /(lavf)([\d\.]+)/i // Lavf (FFMPEG)
299
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
300
-
301
- /(htc_one_s)\/([\d\.]+)/i, // HTC One S
302
- ], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
303
-
304
- /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
305
- // MPlayer SVN
306
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
307
-
308
- /(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
309
- /(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
310
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
311
-
312
- /(mplayer)/i, // MPlayer (no other info)
313
- /(yourmuze)/i, // YourMuze
314
- /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
315
- ], [NAME, [TYPE, MEDIAPLAYER]], [
316
-
317
- /(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
318
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
319
-
320
- /(nokia\d+)\/([\w\.-]+)/i // Nokia
321
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
322
-
323
- /\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
324
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
325
-
326
- /(winamp)3 version ([\w\.-]+)/i, // Winamp
327
- /(winamp)\s([\w\.-]+)/i,
328
- /(winamp)mpeg\/([\w\.-]+)/i
329
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
330
-
331
- /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
332
- // inlight radio
333
- ], [NAME, [TYPE, MEDIAPLAYER]], [
334
-
335
- /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
336
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
337
- // SoundTap/Totem/Stagefright/Streamium
338
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
339
-
340
- /(smp)([\d\.]+)/i // SMP
341
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
342
-
343
- /(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
344
- /(vlc)\/([\w\.-]+)/i,
345
- /(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
346
- /(foobar2000)\/([\d\.]+)/i, // Foobar2000
347
- /(itunes)\/([\d\.]+)/i // iTunes
348
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
349
-
350
- /(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
351
- /(windows-media-player)\/([\w\.-]+)/i
352
- ], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
353
-
354
- /windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
355
- // Windows Media Server
356
- ], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
357
-
358
- /(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
359
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
360
-
361
- /(rad.io)\s([\d\.]+)/i, // Rad.io
362
- /(radio.(?:de|at|fr))\s([\d\.]+)/i
305
+ /(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i // Rad.io
363
306
  ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
364
307
  ]
365
308
  });
@@ -370,8 +313,29 @@ const MediaPlayers = Object.freeze({
370
313
 
371
314
  const Libraries = Object.freeze({
372
315
  browser : [
373
- // Axios/jsdom/Scrapy
374
- [/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
316
+ // 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
317
+ [
318
+ /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:urllib|requests)|scrapy)\/([\w\.]+)/i,
319
+ /(jsdom|(?<=\()java)\/([\w\.]+)/i
320
+ ], [NAME, VERSION, [TYPE, LIBRARY]]
321
+ ]
322
+ });
323
+
324
+ /////////////
325
+ // VEHICLES
326
+ ////////////
327
+
328
+ const Vehicles = Object.freeze({
329
+ device : [
330
+ [
331
+ /dilink.+(byd) auto/i, // BYD
332
+ ], [VENDOR], [
333
+
334
+ /(rivian) (r1t)/i, // Rivian
335
+ ], [VENDOR, MODEL], [
336
+
337
+ /vcc.+netfront/i, // Volvo
338
+ ], [[VENDOR, 'Volvo']]
375
339
  ]
376
340
  });
377
341
 
@@ -397,5 +361,6 @@ module.exports = {
397
361
  Fetchers,
398
362
  InApps,
399
363
  Libraries,
400
- MediaPlayers
364
+ MediaPlayers,
365
+ Vehicles
401
366
  };
@@ -3,7 +3,7 @@
3
3
  // Source: /src/extensions/ua-parser-extensions.js
4
4
 
5
5
  ///////////////////////////////////////////////
6
- /* Extensions for UAParser.js v2.0.0-rc.3
6
+ /* Extensions for UAParser.js v2.0.1
7
7
  https://github.com/faisalman/ua-parser-js
8
8
  Author: Faisal Salman <f@faisalman.com>
9
9
  AGPLv3 License */
@@ -32,8 +32,8 @@ const LIBRARY = 'library';
32
32
 
33
33
  const CLIs = Object.freeze({
34
34
  browser : [
35
- // wget / curl / lynx
36
- [/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
35
+ // wget / curl / Lynx / ELinks / HTTPie
36
+ [/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
37
37
  ]
38
38
  });
39
39
 
@@ -46,7 +46,6 @@ const Crawlers = Object.freeze({
46
46
  [
47
47
  // AhrefsBot - https://ahrefs.com/robot
48
48
  // Amazonbot - https://developer.amazon.com/amazonbot
49
- // Applebot - http://apple.com/go/applebot
50
49
  // Bingbot - http://www.bing.com/bingbot.htm
51
50
  // CCBot - https://commoncrawl.org/faq
52
51
  // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
@@ -58,13 +57,17 @@ const Crawlers = Object.freeze({
58
57
  // OpenAI's SearchGPT - https://platform.openai.com/docs/bots
59
58
  // PerplexityBot - https://perplexity.ai/perplexitybot
60
59
  // SemrushBot - http://www.semrush.com/bot.html
61
- /((?:ahrefs|amazon|apple|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush)bot)\/([\w\.]+)/i,
60
+ // SeznamBot - http://napoveda.seznam.cz/seznambot-intro
61
+ /((?:ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
62
+
63
+ // Applebot - http://apple.com/go/applebot
64
+ /(applebot(?:-extended)?)\/([\w\.]+)/i,
62
65
 
63
66
  // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
64
67
  /(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
65
68
 
66
69
  // ClaudeBot (Anthropic)
67
- /(claude(?:bot|-web))\/([\w\.]+)/i,
70
+ /(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i,
68
71
 
69
72
  // Coc Coc Bot - https://help.coccoc.com/en/search-engine
70
73
  /(coccocbot-(?:image|web))\/([\w\.]+)/i,
@@ -91,8 +94,8 @@ const Crawlers = Object.freeze({
91
94
  // Yeti (Naver)
92
95
  /(yeti)\/([\w\.]+)/i,
93
96
 
94
- // YisouSpider
95
- /(yisouspider)\/?([\w\.]*)/i
97
+ // aiHitBot / Diffbot / Magpie-Crawler / Omgilibot / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
98
+ /((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |yisou)spider)\/?([\w\.]*)/i
96
99
  ],
97
100
 
98
101
  [NAME, VERSION, [TYPE, CRAWLER]],
@@ -101,13 +104,15 @@ const Crawlers = Object.freeze({
101
104
  // Google Bots
102
105
  /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
103
106
 
107
+ // AI2Bot - https://allenai.org/crawler
104
108
  // Bytespider
105
109
  // DataForSeoBot - https://dataforseo.com/dataforseo-bot
106
110
  // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
111
+ // ImagesiftBot - https://imagesift.com/about
107
112
  // Qihoo 360Spider
108
113
  // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
109
114
  // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
110
- /(360spider-?(?:image|video)?|bytespider|(?:aspiegel|dataforseo|petal|turnitin)bot|(?=yahoo! )slurp)/i
115
+ /\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|(?=yahoo! )slurp)/i
111
116
  ],
112
117
  [NAME, [TYPE, CRAWLER]]
113
118
  ]
@@ -160,7 +165,7 @@ const ExtraDevices = Object.freeze({
160
165
  /\b(zur\d{3}) b/i // Swiss ZUR Tablet
161
166
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
162
167
 
163
- /\b((zeki)?tb.*\b) b/i // Zeki Tablets
168
+ /^((zeki)?tb.*\b) b/i // Zeki Tablets
164
169
  ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
165
170
 
166
171
  /\b([yr]\d{2}) b/i,
@@ -199,8 +204,10 @@ const ExtraDevices = Object.freeze({
199
204
 
200
205
  const Emails = Object.freeze({
201
206
  browser : [
207
+ [
202
208
  // Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
203
- [/(evolution|kmail2?|kontact|(?:microsoft |mac)outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, EMAIL]]
209
+ /(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
210
+ ], [NAME, VERSION, [TYPE, EMAIL]]
204
211
  ]
205
212
  });
206
213
 
@@ -215,31 +222,25 @@ const Fetchers = Object.freeze({
215
222
  // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
216
223
  // DuckAssistBot - https://duckduckgo.com/duckassistbot/
217
224
  // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
218
- /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
219
-
220
- // Google Site Verifier
221
- /(google-site-verification)\/([\w\.]+)/i,
225
+ // Google Site Verifier / Meta / Yahoo! Japan
226
+ // Yandex Bots - https://yandex.com/bots
227
+ /(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,
222
228
 
223
- // Meta
224
- /(meta-externalfetcher)\/([\w\.]+)/i,
229
+ // Bluesky
230
+ /(bluesky) cardyb\/([\w\.]+)/i,
225
231
 
226
232
  // Slackbot - https://api.slack.com/robots
227
233
  /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
228
234
 
229
235
  // WhatsApp
230
- /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
231
-
232
- // Yahoo! Japan
233
- /(y!?j-dlc)\/([\w\.]+)/i,
234
-
235
- // Yandex Bots - https://yandex.com/bots
236
- /(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
237
- /(yandex(?:sitelinks|userproxy))/i
236
+ /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i
238
237
  ],
239
238
  [NAME, VERSION, [TYPE, FETCHER]],
240
239
 
241
- // Google Bots / Snapchat
242
- [/(feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
240
+ [
241
+ // Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots
242
+ /(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat|yandex(?:sitelinks|userproxy))/i
243
+ ],
243
244
  [NAME, [TYPE, FETCHER]],
244
245
  ]
245
246
  });
@@ -264,106 +265,48 @@ const InApps = Object.freeze({
264
265
 
265
266
  const MediaPlayers = Object.freeze({
266
267
  browser : [[
267
-
268
- /(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
269
- /(coremedia) v([\w\._]+)/i
270
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
271
-
272
- /(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
273
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
274
-
275
- /(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
276
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
277
-
278
- /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
279
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
268
+ /(apple(?:coremedia|tv))\/([\w\._]+)/i, // Generic Apple CoreMedia
269
+ /(coremedia) v([\w\._]+)/i,
270
+ // Ares/Nexplayer/OSSProxy
271
+ /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
272
+ // Aqualung/Lyssna/BSPlayer/Clementine/MPD
273
+ // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
280
274
  // NSPlayer/PSP-InternetRadioPlayer/Videos
281
- /(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
282
- /(lg player|nexplayer)\s([\d\.]+)/i,
283
- /player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
284
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
285
- /(nexplayer)\s([\w\.-]+)/i // Nexplayer
275
+ // Nero Home/Nero Scout/Nokia
276
+ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
277
+ // SoundTap/Totem/Stagefright/Streamium
278
+ // XBMC/gvfs/Xine/XMMS/irapp
279
+ /^(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,
280
+ /(lg player|nexplayer) ([\d\.]+)/i,
281
+ /player\/(nexplayer|lg player) ([\w\.-]+)/i, // NexPlayer/LG Player
282
+ /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i, // Gstreamer
283
+ /(htc streaming player) [\w_]+ \/ ([\d\.]+)/i, // HTC Streaming Player
284
+ /(lavf)([\d\.]+)/i, // Lavf (FFMPEG)
285
+ // MPlayer SVN
286
+ /(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
287
+ / (songbird)\/([\w\.-]+)/i, // Songbird/Philips-Songbird
288
+ /(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i, // Winamp
289
+ /(vlc)(?:\/| media player - version )([\w\.-]+)/i, // VLC Videolan
290
+ /^(foobar2000|itunes|smp)\/([\d\.]+)/i, // Foobar2000/iTunes/SMP
291
+ /com\.(riseupradioalarm)\/([\d\.]*)/i, // RiseUP Radio Alarm
292
+ /(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i, // MPlayer
293
+ // Windows Media Server
294
+ /(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
286
295
  ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
287
296
 
288
297
  /(flrp)\/([\w\.-]+)/i // Flip Player
289
298
  ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
290
-
291
- /(fstream|nativehost|queryseekspider)/i
292
299
  // FStream/NativeHost/QuerySeekSpider
300
+ // MPlayer (no other info)/Media Player Classic/Nero ShowTime
301
+ // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
302
+ // inlight radio / YourMuze
303
+ /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
293
304
  ], [NAME, [TYPE, MEDIAPLAYER]], [
294
305
 
295
- /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
296
- // Gstreamer
297
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
306
+ /(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i, // HTC One S / Windows Media Player
307
+ ], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
298
308
 
299
- /(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
300
- /(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
301
- // Java/urllib/requests/wget/cURL
302
- /(lavf)([\d\.]+)/i // Lavf (FFMPEG)
303
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
304
-
305
- /(htc_one_s)\/([\d\.]+)/i, // HTC One S
306
- ], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
307
-
308
- /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
309
- // MPlayer SVN
310
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
311
-
312
- /(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
313
- /(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
314
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
315
-
316
- /(mplayer)/i, // MPlayer (no other info)
317
- /(yourmuze)/i, // YourMuze
318
- /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
319
- ], [NAME, [TYPE, MEDIAPLAYER]], [
320
-
321
- /(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
322
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
323
-
324
- /(nokia\d+)\/([\w\.-]+)/i // Nokia
325
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
326
-
327
- /\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
328
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
329
-
330
- /(winamp)3 version ([\w\.-]+)/i, // Winamp
331
- /(winamp)\s([\w\.-]+)/i,
332
- /(winamp)mpeg\/([\w\.-]+)/i
333
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
334
-
335
- /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
336
- // inlight radio
337
- ], [NAME, [TYPE, MEDIAPLAYER]], [
338
-
339
- /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
340
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
341
- // SoundTap/Totem/Stagefright/Streamium
342
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
343
-
344
- /(smp)([\d\.]+)/i // SMP
345
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
346
-
347
- /(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
348
- /(vlc)\/([\w\.-]+)/i,
349
- /(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
350
- /(foobar2000)\/([\d\.]+)/i, // Foobar2000
351
- /(itunes)\/([\d\.]+)/i // iTunes
352
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
353
-
354
- /(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
355
- /(windows-media-player)\/([\w\.-]+)/i
356
- ], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
357
-
358
- /windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
359
- // Windows Media Server
360
- ], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
361
-
362
- /(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
363
- ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
364
-
365
- /(rad.io)\s([\d\.]+)/i, // Rad.io
366
- /(radio.(?:de|at|fr))\s([\d\.]+)/i
309
+ /(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i // Rad.io
367
310
  ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
368
311
  ]
369
312
  });
@@ -374,8 +317,29 @@ const MediaPlayers = Object.freeze({
374
317
 
375
318
  const Libraries = Object.freeze({
376
319
  browser : [
377
- // Axios/jsdom/Scrapy
378
- [/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
320
+ // 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
321
+ [
322
+ /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:urllib|requests)|scrapy)\/([\w\.]+)/i,
323
+ /(jsdom|(?<=\()java)\/([\w\.]+)/i
324
+ ], [NAME, VERSION, [TYPE, LIBRARY]]
325
+ ]
326
+ });
327
+
328
+ /////////////
329
+ // VEHICLES
330
+ ////////////
331
+
332
+ const Vehicles = Object.freeze({
333
+ device : [
334
+ [
335
+ /dilink.+(byd) auto/i, // BYD
336
+ ], [VENDOR], [
337
+
338
+ /(rivian) (r1t)/i, // Rivian
339
+ ], [VENDOR, MODEL], [
340
+
341
+ /vcc.+netfront/i, // Volvo
342
+ ], [[VENDOR, 'Volvo']]
379
343
  ]
380
344
  });
381
345
 
@@ -401,5 +365,6 @@ export {
401
365
  Fetchers,
402
366
  InApps,
403
367
  Libraries,
404
- MediaPlayers
368
+ MediaPlayers,
369
+ Vehicles
405
370
  };