ua-parser-js 2.0.0-beta.3 → 2.0.0-rc.2

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.
Files changed (197) hide show
  1. package/README.md +22 -17
  2. package/dist/icons/color/LICENSE.md +3 -0
  3. package/dist/icons/color/browser/android-browser.svg +1 -0
  4. package/dist/icons/color/browser/avant.png +0 -0
  5. package/dist/icons/color/browser/basilisk.png +0 -0
  6. package/dist/icons/color/browser/basilisk.svg +1 -0
  7. package/dist/icons/color/browser/brave.png +0 -0
  8. package/dist/icons/color/browser/brave.svg +1 -0
  9. package/dist/icons/color/browser/chrome.png +0 -0
  10. package/dist/icons/color/browser/chrome.svg +1 -0
  11. package/dist/icons/color/browser/chromium.png +0 -0
  12. package/dist/icons/color/browser/chromium.svg +1 -0
  13. package/dist/icons/color/browser/coc-coc.png +0 -0
  14. package/dist/icons/color/browser/default.png +0 -0
  15. package/dist/icons/color/browser/default.svg +1 -0
  16. package/dist/icons/color/browser/dolphin.png +0 -0
  17. package/dist/icons/color/browser/edge.png +0 -0
  18. package/dist/icons/color/browser/edge.svg +1 -0
  19. package/dist/icons/color/browser/electron.png +0 -0
  20. package/dist/icons/color/browser/electron.svg +1 -0
  21. package/dist/icons/color/browser/falkon.png +0 -0
  22. package/dist/icons/color/browser/falkon.svg +1 -0
  23. package/dist/icons/color/browser/firefox-reality.png +0 -0
  24. package/dist/icons/color/browser/firefox-reality.svg +1 -0
  25. package/dist/icons/color/browser/firefox.png +0 -0
  26. package/dist/icons/color/browser/firefox.svg +1 -0
  27. package/dist/icons/color/browser/gsa.svg +9 -0
  28. package/dist/icons/color/browser/icecat.png +0 -0
  29. package/dist/icons/color/browser/ie.svg +6 -0
  30. package/dist/icons/color/browser/konqueror.png +0 -0
  31. package/dist/icons/color/browser/konqueror.svg +1 -0
  32. package/dist/icons/color/browser/maxthon.png +0 -0
  33. package/dist/icons/color/browser/midori.png +0 -0
  34. package/dist/icons/color/browser/midori.svg +1 -0
  35. package/dist/icons/color/browser/netsurf.png +0 -0
  36. package/dist/icons/color/browser/netsurf.svg +1 -0
  37. package/dist/icons/color/browser/opera-gx.png +0 -0
  38. package/dist/icons/color/browser/opera-gx.svg +1 -0
  39. package/dist/icons/color/browser/opera-mini.png +0 -0
  40. package/dist/icons/color/browser/opera-touch.png +0 -0
  41. package/dist/icons/color/browser/opera.png +0 -0
  42. package/dist/icons/color/browser/opera.svg +1 -0
  43. package/dist/icons/color/browser/palemoon.png +0 -0
  44. package/dist/icons/color/browser/puffin.png +0 -0
  45. package/dist/icons/color/browser/safari.png +0 -0
  46. package/dist/icons/color/browser/safari.svg +1 -0
  47. package/dist/icons/color/browser/samsung-internet.png +0 -0
  48. package/dist/icons/color/browser/samsung-internet.svg +1 -0
  49. package/dist/icons/color/browser/seamonkey.png +0 -0
  50. package/dist/icons/color/browser/silk.png +0 -0
  51. package/dist/icons/color/browser/sogou-mobile.png +0 -0
  52. package/dist/icons/color/browser/ucbrowser.png +0 -0
  53. package/dist/icons/color/browser/ucbrowser.svg +1 -0
  54. package/dist/icons/color/browser/vivaldi.png +0 -0
  55. package/dist/icons/color/browser/vivaldi.svg +1 -0
  56. package/dist/icons/color/browser/webkit.png +0 -0
  57. package/dist/icons/color/browser/webkit.svg +1 -0
  58. package/dist/icons/color/browser/yandex.png +0 -0
  59. package/dist/icons/color/os/centos.svg +1 -0
  60. package/dist/icons/mono/LICENSE.md +3 -0
  61. package/dist/icons/mono/browser/alipay.svg +1 -0
  62. package/dist/icons/mono/browser/android-browser.svg +1 -0
  63. package/dist/icons/mono/browser/avast-secure-browser.svg +1 -0
  64. package/dist/icons/mono/browser/baidu-browser.svg +1 -0
  65. package/dist/icons/mono/browser/brave.svg +1 -0
  66. package/dist/icons/mono/browser/chrome-headless.svg +1 -0
  67. package/dist/icons/mono/browser/chrome-webview.svg +1 -0
  68. package/dist/icons/mono/browser/chrome.svg +1 -0
  69. package/dist/icons/mono/browser/chromium.svg +1 -0
  70. package/dist/icons/mono/browser/duckduckgo.svg +1 -0
  71. package/dist/icons/mono/browser/edge.svg +1 -0
  72. package/dist/icons/mono/browser/electron.svg +1 -0
  73. package/dist/icons/mono/browser/facebook.svg +1 -0
  74. package/dist/icons/mono/browser/firefox-focus.svg +1 -0
  75. package/dist/icons/mono/browser/firefox-reality.svg +1 -0
  76. package/dist/icons/mono/browser/firefox.svg +1 -0
  77. package/dist/icons/mono/browser/gsa.svg +1 -0
  78. package/dist/icons/mono/browser/huawei-browser.svg +1 -0
  79. package/dist/icons/mono/browser/icecat.svg +1 -0
  80. package/dist/icons/mono/browser/ie.svg +1 -0
  81. package/dist/icons/mono/browser/instagram.svg +1 -0
  82. package/dist/icons/mono/browser/jasmine.svg +1 -0
  83. package/dist/icons/mono/browser/kakaotalk.svg +1 -0
  84. package/dist/icons/mono/browser/klarna.svg +1 -0
  85. package/dist/icons/mono/browser/line.svg +1 -0
  86. package/dist/icons/mono/browser/linkedin.svg +1 -0
  87. package/dist/icons/mono/browser/miui-browser.svg +1 -0
  88. package/dist/icons/mono/browser/mobile-chrome.svg +1 -0
  89. package/dist/icons/mono/browser/mobile-firefox.svg +1 -0
  90. package/dist/icons/mono/browser/mobile-safari.svg +1 -0
  91. package/dist/icons/mono/browser/mozilla.svg +1 -0
  92. package/dist/icons/mono/browser/naver.svg +1 -0
  93. package/dist/icons/mono/browser/nokia-browser.svg +1 -0
  94. package/dist/icons/mono/browser/oculus-browser.svg +1 -0
  95. package/dist/icons/mono/browser/opera-coast.svg +1 -0
  96. package/dist/icons/mono/browser/opera-gx.svg +1 -0
  97. package/dist/icons/mono/browser/opera-mini.svg +1 -0
  98. package/dist/icons/mono/browser/opera-mobi.svg +1 -0
  99. package/dist/icons/mono/browser/opera-tablet.svg +1 -0
  100. package/dist/icons/mono/browser/opera-touch.svg +1 -0
  101. package/dist/icons/mono/browser/opera.svg +1 -0
  102. package/dist/icons/mono/browser/qqbrowser.svg +1 -0
  103. package/dist/icons/mono/browser/qqbrowserlite.svg +1 -0
  104. package/dist/icons/mono/browser/safari.svg +1 -0
  105. package/dist/icons/mono/browser/sailfish-browser.svg +1 -0
  106. package/dist/icons/mono/browser/samsung-internet.svg +1 -0
  107. package/dist/icons/mono/browser/smart-lenovo-browser.svg +1 -0
  108. package/dist/icons/mono/browser/snapchat.svg +1 -0
  109. package/dist/icons/mono/browser/sogou-explorer.svg +1 -0
  110. package/dist/icons/mono/browser/sogou-mobile.svg +1 -0
  111. package/dist/icons/mono/browser/tesla.svg +1 -0
  112. package/dist/icons/mono/browser/tiktok.svg +1 -0
  113. package/dist/icons/mono/browser/twitter.svg +1 -0
  114. package/dist/icons/mono/browser/vivaldi.svg +1 -0
  115. package/dist/icons/mono/browser/vivo-browser.svg +1 -0
  116. package/dist/icons/mono/browser/wechat.svg +1 -0
  117. package/dist/icons/mono/browser/weibo.svg +1 -0
  118. package/dist/icons/mono/browser/yandex.svg +1 -0
  119. package/dist/icons/mono/device/acer.svg +1 -0
  120. package/dist/icons/mono/device/amazon.svg +1 -0
  121. package/dist/icons/mono/device/apple.svg +1 -0
  122. package/dist/icons/mono/device/asus.svg +1 -0
  123. package/dist/icons/mono/device/att.svg +1 -0
  124. package/dist/icons/mono/device/blackberry.svg +1 -0
  125. package/dist/icons/mono/device/dell.svg +1 -0
  126. package/dist/icons/mono/device/facebook.svg +1 -0
  127. package/dist/icons/mono/device/fairphone.svg +1 -0
  128. package/dist/icons/mono/device/google.svg +1 -0
  129. package/dist/icons/mono/device/hp.svg +1 -0
  130. package/dist/icons/mono/device/huawei.svg +1 -0
  131. package/dist/icons/mono/device/lenovo.svg +1 -0
  132. package/dist/icons/mono/device/lg.svg +1 -0
  133. package/dist/icons/mono/device/meizu.svg +1 -0
  134. package/dist/icons/mono/device/microsoft.svg +1 -0
  135. package/dist/icons/mono/device/motorola.svg +1 -0
  136. package/dist/icons/mono/device/nintendo.svg +1 -0
  137. package/dist/icons/mono/device/nokia.svg +1 -0
  138. package/dist/icons/mono/device/nvidia.svg +1 -0
  139. package/dist/icons/mono/device/oneplus.svg +1 -0
  140. package/dist/icons/mono/device/oppo.svg +1 -0
  141. package/dist/icons/mono/device/panasonic.svg +1 -0
  142. package/dist/icons/mono/device/roku.svg +1 -0
  143. package/dist/icons/mono/device/samsung.svg +1 -0
  144. package/dist/icons/mono/device/siemens.svg +1 -0
  145. package/dist/icons/mono/device/sony.svg +1 -0
  146. package/dist/icons/mono/device/tesla.svg +1 -0
  147. package/dist/icons/mono/device/vivo.svg +1 -0
  148. package/dist/icons/mono/device/vodafone.svg +1 -0
  149. package/dist/icons/mono/device/xiaomi.svg +1 -0
  150. package/dist/icons/mono/device/zebra.svg +1 -0
  151. package/dist/icons/mono/os/android.svg +1 -0
  152. package/dist/icons/mono/os/arch.svg +1 -0
  153. package/dist/icons/mono/os/blackberry.svg +1 -0
  154. package/dist/icons/mono/os/centos.svg +1 -0
  155. package/dist/icons/mono/os/chrome-os.svg +1 -0
  156. package/dist/icons/mono/os/chromecast.svg +1 -0
  157. package/dist/icons/mono/os/debian.svg +1 -0
  158. package/dist/icons/mono/os/deepin.svg +1 -0
  159. package/dist/icons/mono/os/elementary-os.svg +1 -0
  160. package/dist/icons/mono/os/fedora.svg +1 -0
  161. package/dist/icons/mono/os/firefox.svg +1 -0
  162. package/dist/icons/mono/os/freebsd.svg +1 -0
  163. package/dist/icons/mono/os/gentoo.svg +1 -0
  164. package/dist/icons/mono/os/gnu.svg +1 -0
  165. package/dist/icons/mono/os/harmonyos.svg +1 -0
  166. package/dist/icons/mono/os/ios.svg +1 -0
  167. package/dist/icons/mono/os/kaios.svg +1 -0
  168. package/dist/icons/mono/os/linux.svg +1 -0
  169. package/dist/icons/mono/os/macos.svg +1 -0
  170. package/dist/icons/mono/os/manjaro.svg +1 -0
  171. package/dist/icons/mono/os/mint.svg +1 -0
  172. package/dist/icons/mono/os/netbsd.svg +1 -0
  173. package/dist/icons/mono/os/nintendo.svg +1 -0
  174. package/dist/icons/mono/os/openbsd.svg +1 -0
  175. package/dist/icons/mono/os/playstation.svg +1 -0
  176. package/dist/icons/mono/os/raspbian.svg +1 -0
  177. package/dist/icons/mono/os/redhat.svg +1 -0
  178. package/dist/icons/mono/os/sailfish.svg +1 -0
  179. package/dist/icons/mono/os/slackware.svg +1 -0
  180. package/dist/icons/mono/os/suse.svg +1 -0
  181. package/dist/icons/mono/os/ubuntu.svg +1 -0
  182. package/dist/icons/mono/os/windows.svg +1 -0
  183. package/dist/icons/mono/os/xbox.svg +1 -0
  184. package/dist/ua-parser.min.js +2 -2
  185. package/dist/ua-parser.pack.js +2 -2
  186. package/package.json +9 -4
  187. package/src/enums/ua-parser-enums.js +22 -6
  188. package/src/enums/ua-parser-enums.mjs +22 -6
  189. package/src/extensions/ua-parser-extensions.d.ts +2 -1
  190. package/src/extensions/ua-parser-extensions.js +100 -75
  191. package/src/extensions/ua-parser-extensions.mjs +100 -75
  192. package/src/helpers/ua-parser-helpers.d.ts +14 -4
  193. package/src/helpers/ua-parser-helpers.js +38 -6
  194. package/src/helpers/ua-parser-helpers.mjs +39 -7
  195. package/src/main/ua-parser.d.ts +3 -3
  196. package/src/main/ua-parser.js +83 -33
  197. package/src/main/ua-parser.mjs +83 -33
@@ -1,9 +1,10 @@
1
- // Type definitions for Helpers submodule of UAParser.js v2.0.0-beta.3
1
+ // Type definitions for Helpers submodule of UAParser.js v2.0.0-rc.2
2
2
  // Project: https://github.com/faisalman/ua-parser-js
3
3
  // Definitions by: Faisal Salman <https://github.com/faisalman>
4
4
 
5
5
  import type { UAParserExt } from "../main/ua-parser";
6
6
 
7
+ export const Bots: UAParserExt;
7
8
  export const CLIs: UAParserExt;
8
9
  export const Crawlers: UAParserExt;
9
10
  export const ExtraDevices: UAParserExt;
@@ -1,5 +1,5 @@
1
1
  ///////////////////////////////////////////////
2
- /* Extensions for UAParser.js v2.0.0-beta.3
2
+ /* Extensions for UAParser.js v2.0.0-rc.2
3
3
  https://github.com/faisalman/ua-parser-js
4
4
  Author: Faisal Salman <f@faisalman.com>
5
5
  AGPLv3 License */
@@ -19,6 +19,7 @@ const CLI = 'cli';
19
19
  const EMAIL = 'email';
20
20
  const FETCHER = 'fetcher';
21
21
  const INAPP = 'inapp';
22
+ const MEDIAPLAYER = 'mediaplayer';
22
23
  const MODULE = 'module';
23
24
 
24
25
  //////////////////////
@@ -38,43 +39,48 @@ const CLIs = Object.freeze({
38
39
 
39
40
  const Crawlers = Object.freeze({
40
41
  browser : [
41
- // Amazonbot - https://developer.amazon.com/amazonbot
42
- // Applebot - http://apple.com/go/applebot
43
- // Bingbot - http://www.bing.com/bingbot.htm
44
- // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
45
- // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
46
- // GPTBot - https://platform.openai.com/docs/gptbot
47
- [/((?:amazon|apple|bing|duckduck|facebook|gpt)bot)\/([\w\.]+)/i],
48
- [NAME, VERSION, [TYPE, CRAWLER]],
42
+ [
43
+ // AhrefsBot - https://ahrefs.com/robot
44
+ // Amazonbot - https://developer.amazon.com/amazonbot
45
+ // Applebot - http://apple.com/go/applebot
46
+ // Bingbot - http://www.bing.com/bingbot.htm
47
+ // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
48
+ // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
49
+ // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
50
+ // GPTBot - https://platform.openai.com/docs/gptbot
51
+ // MJ12bot - https://mj12bot.com/
52
+ // OpenAI Search - https://platform.openai.com/docs/bots
53
+ // SemrushBot - http://www.semrush.com/bot.html
54
+ /((?:ahrefs|amazon|apple|bing|dot|duckduck|facebook|gpt|mj12|oai-search|semrush)bot)\/([\w\.]+)/i,
49
55
 
50
- // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
51
- [/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i],
52
- [NAME, VERSION, [TYPE, CRAWLER]],
56
+ // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
57
+ /(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
53
58
 
54
- // Bytespider
55
- // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
56
- [/((?:bytespider|(?=yahoo! )slurp))/i],
57
- [NAME, [TYPE, CRAWLER]],
59
+ // ClaudeBot
60
+ /(claude(?:bot|-web))\/([\w\.]+)/i,
58
61
 
59
- // ClaudeBot
60
- [/(claude(?:bot|-web))\/([\w\.]+)/i],
61
- [NAME, VERSION, [TYPE, CRAWLER]],
62
+ // Coc Coc Bot - https://help.coccoc.com/en/search-engine
63
+ /(coccocbot-(?:image|web))\/([\w\.]+)/i,
64
+
65
+ // Googlebot - http://www.google.com/bot.html
66
+ /(google(?:bot|other)(?:-image|-video|-news|-extended)?|(?:storebot-)?google(?:-inspectiontool)?)\/?([\w\.]*)/i,
67
+
68
+ // Sogou Spider
69
+ /(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
70
+
71
+ // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
72
+ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
73
+
74
+ // Yandex Bots - https://yandex.com/bots
75
+ /(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
76
+ ],
62
77
 
63
- // Googlebot - http://www.google.com/bot.html
64
- [
65
- /(google(?:bot|other)(?:-image|-video|-news|-extended)?|(?:storebot-)?google(?:-inspectiontool)?)\/?([\w\.]*)/i
66
- ],
67
- [NAME, VERSION, [TYPE, CRAWLER]],
68
-
69
- // Sogou Spider
70
- [/(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i],
71
78
  [NAME, VERSION, [TYPE, CRAWLER]],
72
79
 
73
- // Yandex Bots - https://yandex.com/bots
74
- [
75
- /(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
76
- ],
77
- [NAME, VERSION, [TYPE, CRAWLER]]
80
+ // Bytespider
81
+ // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
82
+ [/((?:bytespider|(?=yahoo! )slurp))/i],
83
+ [NAME, [TYPE, CRAWLER]]
78
84
  ]
79
85
  });
80
86
 
@@ -175,29 +181,30 @@ const Emails = Object.freeze({
175
181
 
176
182
  const Fetchers = Object.freeze({
177
183
  browser : [
178
- // BingPreview / Mastodon / Pinterestbot / Redditbot / Telegrambot / Twitterbot
179
- [/(bingpreview|mastodon|(?:discord|linkedin|pinterest|reddit|telegram|twitter)bot)\/([\w\.]+)/i],
180
- [NAME, VERSION, [TYPE, FETCHER]],
181
-
182
- // Google Bots / Snapchat
183
- [/(feedfetcher-google|google-read-aloud|(?=bot; )snapchat)/i],
184
- [NAME, [TYPE, FETCHER]],
185
-
184
+ [
185
+ // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
186
+ // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
187
+ // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
188
+ /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
186
189
 
187
- // Slackbot - https://api.slack.com/robots
188
- [/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i],
189
- [NAME, VERSION, [TYPE, FETCHER]],
190
+ // Slackbot - https://api.slack.com/robots
191
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
192
+
193
+ // WhatsApp
194
+ /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
190
195
 
191
- // WhatsApp
192
- [/(whatsapp)\/([\w\.]+)[\/ ][ianw]/i],
193
- [NAME, VERSION, [TYPE, FETCHER]],
196
+ // Yahoo! Japan
197
+ /(y!?j-dlc)\/([\w\.]+)/i,
194
198
 
195
- // Yandex Bots - https://yandex.com/bots
196
- [
199
+ // Yandex Bots - https://yandex.com/bots
197
200
  /(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
198
201
  /(yandex(?:sitelinks|userproxy))/i
199
202
  ],
200
- [NAME, VERSION, [TYPE, FETCHER]]
203
+ [NAME, VERSION, [TYPE, FETCHER]],
204
+
205
+ // Google Bots / Snapchat
206
+ [/(feedfetcher-google|google-read-aloud|(?=bot; )snapchat)/i],
207
+ [NAME, [TYPE, FETCHER]],
201
208
  ]
202
209
  });
203
210
 
@@ -207,7 +214,11 @@ const Fetchers = Object.freeze({
207
214
 
208
215
  const InApps = Object.freeze({
209
216
  browser : [
210
- [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]]
217
+ // Slack
218
+ [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
219
+
220
+ // Yahoo! Japan
221
+ [/jp\.co\.yahoo\.android\.yjtop\/([\d\.]+)/i], [VERSION, 'Yahoo! Japan', [TYPE, INAPP]]
211
222
  ]
212
223
  });
213
224
 
@@ -220,13 +231,13 @@ const MediaPlayers = Object.freeze({
220
231
 
221
232
  /(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
222
233
  /(coremedia) v([\w\._]+)/i
223
- ], [NAME, VERSION], [
234
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
224
235
 
225
236
  /(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
226
- ], [NAME, VERSION], [
237
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
227
238
 
228
239
  /(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
229
- ], [NAME, VERSION], [
240
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
230
241
 
231
242
  /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
232
243
  // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
@@ -234,90 +245,90 @@ const MediaPlayers = Object.freeze({
234
245
  /(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
235
246
  /(lg player|nexplayer)\s([\d\.]+)/i,
236
247
  /player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
237
- ], [NAME, VERSION], [
248
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
238
249
  /(nexplayer)\s([\w\.-]+)/i // Nexplayer
239
- ], [NAME, VERSION], [
250
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
240
251
 
241
252
  /(flrp)\/([\w\.-]+)/i // Flip Player
242
- ], [[NAME, 'Flip Player'], VERSION], [
253
+ ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
243
254
 
244
255
  /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
245
256
  // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
246
- ], [NAME], [
257
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
247
258
 
248
259
  /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
249
260
  // Gstreamer
250
- ], [NAME, VERSION], [
261
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
251
262
 
252
263
  /(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
253
264
  /(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
254
265
  // Java/urllib/requests/wget/cURL
255
266
  /(lavf)([\d\.]+)/i // Lavf (FFMPEG)
256
- ], [NAME, VERSION], [
267
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
257
268
 
258
269
  /(htc_one_s)\/([\d\.]+)/i, // HTC One S
259
- ], [[NAME, /_/g, ' '], VERSION], [
270
+ ], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
260
271
 
261
272
  /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
262
273
  // MPlayer SVN
263
- ], [NAME, VERSION], [
274
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
264
275
 
265
276
  /(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
266
277
  /(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
267
- ], [NAME, VERSION], [
278
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
268
279
 
269
280
  /(mplayer)/i, // MPlayer (no other info)
270
281
  /(yourmuze)/i, // YourMuze
271
282
  /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
272
- ], [NAME], [
283
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
273
284
 
274
285
  /(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
275
- ], [NAME, VERSION], [
286
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
276
287
 
277
288
  /(nokia\d+)\/([\w\.-]+)/i // Nokia
278
- ], [NAME, VERSION], [
289
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
279
290
 
280
291
  /\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
281
- ], [NAME, VERSION], [
292
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
282
293
 
283
294
  /(winamp)3 version ([\w\.-]+)/i, // Winamp
284
295
  /(winamp)\s([\w\.-]+)/i,
285
296
  /(winamp)mpeg\/([\w\.-]+)/i
286
- ], [NAME, VERSION], [
297
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
287
298
 
288
299
  /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
289
300
  // inlight radio
290
- ], [NAME], [
301
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
291
302
 
292
303
  /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
293
304
  // QuickTime/RealMedia/RadioApp/RadioClientApplication/
294
305
  // SoundTap/Totem/Stagefright/Streamium
295
- ], [NAME, VERSION], [
306
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
296
307
 
297
308
  /(smp)([\d\.]+)/i // SMP
298
- ], [NAME, VERSION], [
309
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
299
310
 
300
311
  /(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
301
312
  /(vlc)\/([\w\.-]+)/i,
302
313
  /(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
303
314
  /(foobar2000)\/([\d\.]+)/i, // Foobar2000
304
315
  /(itunes)\/([\d\.]+)/i // iTunes
305
- ], [NAME, VERSION], [
316
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
306
317
 
307
318
  /(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
308
319
  /(windows-media-player)\/([\w\.-]+)/i
309
- ], [[NAME, /-/g, ' '], VERSION], [
320
+ ], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
310
321
 
311
322
  /windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
312
323
  // Windows Media Server
313
- ], [VERSION, [NAME, 'Windows']], [
324
+ ], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
314
325
 
315
326
  /(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
316
- ], [NAME, VERSION], [
327
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
317
328
 
318
329
  /(rad.io)\s([\d\.]+)/i, // Rad.io
319
330
  /(radio.(?:de|at|fr))\s([\d\.]+)/i
320
- ], [[NAME, 'rad.io'], VERSION]
331
+ ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
321
332
  ]
322
333
  });
323
334
 
@@ -332,7 +343,21 @@ const Modules = Object.freeze({
332
343
  ]
333
344
  });
334
345
 
346
+ //////////
347
+ // BOTS
348
+ /////////
349
+
350
+ const Bots = Object.freeze({
351
+ browser : [
352
+ ...CLIs.browser,
353
+ ...Crawlers.browser,
354
+ ...Fetchers.browser,
355
+ ...Modules.browser
356
+ ]
357
+ });
358
+
335
359
  module.exports = {
360
+ Bots,
336
361
  CLIs,
337
362
  Crawlers,
338
363
  ExtraDevices,
@@ -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-beta.3
6
+ /* Extensions for UAParser.js v2.0.0-rc.2
7
7
  https://github.com/faisalman/ua-parser-js
8
8
  Author: Faisal Salman <f@faisalman.com>
9
9
  AGPLv3 License */
@@ -23,6 +23,7 @@ const CLI = 'cli';
23
23
  const EMAIL = 'email';
24
24
  const FETCHER = 'fetcher';
25
25
  const INAPP = 'inapp';
26
+ const MEDIAPLAYER = 'mediaplayer';
26
27
  const MODULE = 'module';
27
28
 
28
29
  //////////////////////
@@ -42,43 +43,48 @@ const CLIs = Object.freeze({
42
43
 
43
44
  const Crawlers = Object.freeze({
44
45
  browser : [
45
- // Amazonbot - https://developer.amazon.com/amazonbot
46
- // Applebot - http://apple.com/go/applebot
47
- // Bingbot - http://www.bing.com/bingbot.htm
48
- // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
49
- // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
50
- // GPTBot - https://platform.openai.com/docs/gptbot
51
- [/((?:amazon|apple|bing|duckduck|facebook|gpt)bot)\/([\w\.]+)/i],
52
- [NAME, VERSION, [TYPE, CRAWLER]],
46
+ [
47
+ // AhrefsBot - https://ahrefs.com/robot
48
+ // Amazonbot - https://developer.amazon.com/amazonbot
49
+ // Applebot - http://apple.com/go/applebot
50
+ // Bingbot - http://www.bing.com/bingbot.htm
51
+ // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
52
+ // DuckDuckBot - http://duckduckgo.com/duckduckbot.html
53
+ // FacebookBot - https://developers.facebook.com/docs/sharing/bot/
54
+ // GPTBot - https://platform.openai.com/docs/gptbot
55
+ // MJ12bot - https://mj12bot.com/
56
+ // OpenAI Search - https://platform.openai.com/docs/bots
57
+ // SemrushBot - http://www.semrush.com/bot.html
58
+ /((?:ahrefs|amazon|apple|bing|dot|duckduck|facebook|gpt|mj12|oai-search|semrush)bot)\/([\w\.]+)/i,
53
59
 
54
- // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
55
- [/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i],
56
- [NAME, VERSION, [TYPE, CRAWLER]],
60
+ // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
61
+ /(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
57
62
 
58
- // Bytespider
59
- // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
60
- [/((?:bytespider|(?=yahoo! )slurp))/i],
61
- [NAME, [TYPE, CRAWLER]],
63
+ // ClaudeBot
64
+ /(claude(?:bot|-web))\/([\w\.]+)/i,
62
65
 
63
- // ClaudeBot
64
- [/(claude(?:bot|-web))\/([\w\.]+)/i],
65
- [NAME, VERSION, [TYPE, CRAWLER]],
66
+ // Coc Coc Bot - https://help.coccoc.com/en/search-engine
67
+ /(coccocbot-(?:image|web))\/([\w\.]+)/i,
68
+
69
+ // Googlebot - http://www.google.com/bot.html
70
+ /(google(?:bot|other)(?:-image|-video|-news|-extended)?|(?:storebot-)?google(?:-inspectiontool)?)\/?([\w\.]*)/i,
71
+
72
+ // Sogou Spider
73
+ /(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
74
+
75
+ // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
76
+ /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
77
+
78
+ // Yandex Bots - https://yandex.com/bots
79
+ /(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
80
+ ],
66
81
 
67
- // Googlebot - http://www.google.com/bot.html
68
- [
69
- /(google(?:bot|other)(?:-image|-video|-news|-extended)?|(?:storebot-)?google(?:-inspectiontool)?)\/?([\w\.]*)/i
70
- ],
71
- [NAME, VERSION, [TYPE, CRAWLER]],
72
-
73
- // Sogou Spider
74
- [/(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i],
75
82
  [NAME, VERSION, [TYPE, CRAWLER]],
76
83
 
77
- // Yandex Bots - https://yandex.com/bots
78
- [
79
- /(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
80
- ],
81
- [NAME, VERSION, [TYPE, CRAWLER]]
84
+ // Bytespider
85
+ // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
86
+ [/((?:bytespider|(?=yahoo! )slurp))/i],
87
+ [NAME, [TYPE, CRAWLER]]
82
88
  ]
83
89
  });
84
90
 
@@ -179,29 +185,30 @@ const Emails = Object.freeze({
179
185
 
180
186
  const Fetchers = Object.freeze({
181
187
  browser : [
182
- // BingPreview / Mastodon / Pinterestbot / Redditbot / Telegrambot / Twitterbot
183
- [/(bingpreview|mastodon|(?:discord|linkedin|pinterest|reddit|telegram|twitter)bot)\/([\w\.]+)/i],
184
- [NAME, VERSION, [TYPE, FETCHER]],
185
-
186
- // Google Bots / Snapchat
187
- [/(feedfetcher-google|google-read-aloud|(?=bot; )snapchat)/i],
188
- [NAME, [TYPE, FETCHER]],
189
-
188
+ [
189
+ // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
190
+ // ChatGPT-User - https://platform.openai.com/docs/plugins/bot
191
+ // BingPreview / Mastodon / Pinterestbot / Redditbot / Rogerbot / Telegrambot / Twitterbot / UptimeRobot
192
+ /(ahrefssiteaudit|bingpreview|chatgpt-user|mastodon|(?:discord|linkedin|pinterest|reddit|roger|telegram|twitter|uptimero)bot)\/([\w\.]+)/i,
190
193
 
191
- // Slackbot - https://api.slack.com/robots
192
- [/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i],
193
- [NAME, VERSION, [TYPE, FETCHER]],
194
+ // Slackbot - https://api.slack.com/robots
195
+ /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
196
+
197
+ // WhatsApp
198
+ /(whatsapp)\/([\w\.]+)[\/ ][ianw]/i,
194
199
 
195
- // WhatsApp
196
- [/(whatsapp)\/([\w\.]+)[\/ ][ianw]/i],
197
- [NAME, VERSION, [TYPE, FETCHER]],
200
+ // Yahoo! Japan
201
+ /(y!?j-dlc)\/([\w\.]+)/i,
198
202
 
199
- // Yandex Bots - https://yandex.com/bots
200
- [
203
+ // Yandex Bots - https://yandex.com/bots
201
204
  /(yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
202
205
  /(yandex(?:sitelinks|userproxy))/i
203
206
  ],
204
- [NAME, VERSION, [TYPE, FETCHER]]
207
+ [NAME, VERSION, [TYPE, FETCHER]],
208
+
209
+ // Google Bots / Snapchat
210
+ [/(feedfetcher-google|google-read-aloud|(?=bot; )snapchat)/i],
211
+ [NAME, [TYPE, FETCHER]],
205
212
  ]
206
213
  });
207
214
 
@@ -211,7 +218,11 @@ const Fetchers = Object.freeze({
211
218
 
212
219
  const InApps = Object.freeze({
213
220
  browser : [
214
- [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]]
221
+ // Slack
222
+ [/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, INAPP]],
223
+
224
+ // Yahoo! Japan
225
+ [/jp\.co\.yahoo\.android\.yjtop\/([\d\.]+)/i], [VERSION, 'Yahoo! Japan', [TYPE, INAPP]]
215
226
  ]
216
227
  });
217
228
 
@@ -224,13 +235,13 @@ const MediaPlayers = Object.freeze({
224
235
 
225
236
  /(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
226
237
  /(coremedia) v([\w\._]+)/i
227
- ], [NAME, VERSION], [
238
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
228
239
 
229
240
  /(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
230
- ], [NAME, VERSION], [
241
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
231
242
 
232
243
  /(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
233
- ], [NAME, VERSION], [
244
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
234
245
 
235
246
  /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
236
247
  // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
@@ -238,90 +249,90 @@ const MediaPlayers = Object.freeze({
238
249
  /(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
239
250
  /(lg player|nexplayer)\s([\d\.]+)/i,
240
251
  /player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
241
- ], [NAME, VERSION], [
252
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
242
253
  /(nexplayer)\s([\w\.-]+)/i // Nexplayer
243
- ], [NAME, VERSION], [
254
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
244
255
 
245
256
  /(flrp)\/([\w\.-]+)/i // Flip Player
246
- ], [[NAME, 'Flip Player'], VERSION], [
257
+ ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [
247
258
 
248
259
  /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
249
260
  // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
250
- ], [NAME], [
261
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
251
262
 
252
263
  /(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
253
264
  // Gstreamer
254
- ], [NAME, VERSION], [
265
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
255
266
 
256
267
  /(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
257
268
  /(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
258
269
  // Java/urllib/requests/wget/cURL
259
270
  /(lavf)([\d\.]+)/i // Lavf (FFMPEG)
260
- ], [NAME, VERSION], [
271
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
261
272
 
262
273
  /(htc_one_s)\/([\d\.]+)/i, // HTC One S
263
- ], [[NAME, /_/g, ' '], VERSION], [
274
+ ], [[NAME, /_/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
264
275
 
265
276
  /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
266
277
  // MPlayer SVN
267
- ], [NAME, VERSION], [
278
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
268
279
 
269
280
  /(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
270
281
  /(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
271
- ], [NAME, VERSION], [
282
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
272
283
 
273
284
  /(mplayer)/i, // MPlayer (no other info)
274
285
  /(yourmuze)/i, // YourMuze
275
286
  /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
276
- ], [NAME], [
287
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
277
288
 
278
289
  /(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
279
- ], [NAME, VERSION], [
290
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
280
291
 
281
292
  /(nokia\d+)\/([\w\.-]+)/i // Nokia
282
- ], [NAME, VERSION], [
293
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
283
294
 
284
295
  /\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
285
- ], [NAME, VERSION], [
296
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
286
297
 
287
298
  /(winamp)3 version ([\w\.-]+)/i, // Winamp
288
299
  /(winamp)\s([\w\.-]+)/i,
289
300
  /(winamp)mpeg\/([\w\.-]+)/i
290
- ], [NAME, VERSION], [
301
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
291
302
 
292
303
  /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
293
304
  // inlight radio
294
- ], [NAME], [
305
+ ], [NAME, [TYPE, MEDIAPLAYER]], [
295
306
 
296
307
  /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
297
308
  // QuickTime/RealMedia/RadioApp/RadioClientApplication/
298
309
  // SoundTap/Totem/Stagefright/Streamium
299
- ], [NAME, VERSION], [
310
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
300
311
 
301
312
  /(smp)([\d\.]+)/i // SMP
302
- ], [NAME, VERSION], [
313
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
303
314
 
304
315
  /(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
305
316
  /(vlc)\/([\w\.-]+)/i,
306
317
  /(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
307
318
  /(foobar2000)\/([\d\.]+)/i, // Foobar2000
308
319
  /(itunes)\/([\d\.]+)/i // iTunes
309
- ], [NAME, VERSION], [
320
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
310
321
 
311
322
  /(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
312
323
  /(windows-media-player)\/([\w\.-]+)/i
313
- ], [[NAME, /-/g, ' '], VERSION], [
324
+ ], [[NAME, /-/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [
314
325
 
315
326
  /windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
316
327
  // Windows Media Server
317
- ], [VERSION, [NAME, 'Windows']], [
328
+ ], [VERSION, [NAME, 'Windows'], [TYPE, MEDIAPLAYER]], [
318
329
 
319
330
  /(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
320
- ], [NAME, VERSION], [
331
+ ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
321
332
 
322
333
  /(rad.io)\s([\d\.]+)/i, // Rad.io
323
334
  /(radio.(?:de|at|fr))\s([\d\.]+)/i
324
- ], [[NAME, 'rad.io'], VERSION]
335
+ ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]
325
336
  ]
326
337
  });
327
338
 
@@ -336,7 +347,21 @@ const Modules = Object.freeze({
336
347
  ]
337
348
  });
338
349
 
350
+ //////////
351
+ // BOTS
352
+ /////////
353
+
354
+ const Bots = Object.freeze({
355
+ browser : [
356
+ ...CLIs.browser,
357
+ ...Crawlers.browser,
358
+ ...Fetchers.browser,
359
+ ...Modules.browser
360
+ ]
361
+ });
362
+
339
363
  export {
364
+ Bots,
340
365
  CLIs,
341
366
  Crawlers,
342
367
  ExtraDevices,