device_detector 1.0.7 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +25 -4
- data/lib/device_detector/browser.rb +178 -5
- data/lib/device_detector/client_hint.rb +166 -0
- data/lib/device_detector/device.rb +291 -2
- data/lib/device_detector/os.rb +33 -3
- data/lib/device_detector/version.rb +1 -1
- data/lib/device_detector.rb +50 -15
- data/regexes/bots.yml +594 -16
- data/regexes/client/browsers.yml +334 -40
- data/regexes/client/hints/apps.yml +102 -0
- data/regexes/client/hints/browsers.yml +190 -0
- data/regexes/client/libraries.yml +199 -2
- data/regexes/client/mobile_apps.yml +320 -12
- data/regexes/client/pim.yml +15 -0
- data/regexes/device/car_browsers.yml +1 -1
- data/regexes/device/consoles.yml +6 -1
- data/regexes/device/mobiles.yml +8406 -1948
- data/regexes/device/portable_media_player.yml +18 -2
- data/regexes/device/shell_tv.yml +11 -0
- data/regexes/device/televisions.yml +26 -4
- data/regexes/oss.yml +329 -47
- metadata +10 -7
@@ -3,29 +3,65 @@
|
|
3
3
|
class DeviceDetector
|
4
4
|
class Browser
|
5
5
|
AVAILABLE_BROWSERS = {
|
6
|
+
'V1' => 'Via',
|
7
|
+
'1P' => 'Pure Mini Browser',
|
8
|
+
'4P' => 'Pure Lite Browser',
|
9
|
+
'1R' => 'Raise Fast Browser',
|
10
|
+
'R1' => 'Rabbit Private Browser',
|
11
|
+
'FQ' => 'Fast Browser UC Lite',
|
12
|
+
'FJ' => 'Fast Explorer',
|
13
|
+
'1L' => 'Lightning Browser',
|
14
|
+
'1C' => 'Cake Browser',
|
15
|
+
'1I' => 'IE Browser Fast',
|
16
|
+
'1V' => 'Vegas Browser',
|
17
|
+
'1O' => 'OH Browser',
|
18
|
+
'3O' => 'OH Private Browser',
|
19
|
+
'1X' => 'XBrowser Mini',
|
20
|
+
'1S' => 'Sharkee Browser',
|
21
|
+
'2L' => 'Lark Browser',
|
22
|
+
'3P' => 'Pluma',
|
23
|
+
'1A' => 'Anka Browser',
|
24
|
+
'AZ' => 'Azka Browser',
|
25
|
+
'1D' => 'Dragon Browser',
|
26
|
+
'1E' => 'Easy Browser',
|
27
|
+
'DW' => 'Dark Web Browser',
|
28
|
+
'18' => '18+ Privacy Browser',
|
6
29
|
'1B' => '115 Browser',
|
30
|
+
'DM' => '1DM Browser',
|
31
|
+
'1M' => '1DM+ Browser',
|
7
32
|
'2B' => '2345 Browser',
|
8
|
-
'36' => '360 Phone Browser',
|
9
33
|
'3B' => '360 Browser',
|
34
|
+
'36' => '360 Phone Browser',
|
10
35
|
'7B' => '7654 Browser',
|
11
36
|
'AA' => 'Avant Browser',
|
12
37
|
'AB' => 'ABrowse',
|
38
|
+
'BW' => 'AdBlock Browser',
|
39
|
+
'A7' => 'Adult Browser',
|
13
40
|
'AF' => 'ANT Fresco',
|
14
41
|
'AG' => 'ANTGalio',
|
15
42
|
'AL' => 'Aloha Browser',
|
16
43
|
'AH' => 'Aloha Browser Lite',
|
17
44
|
'AM' => 'Amaya',
|
45
|
+
'A3' => 'Amaze Browser',
|
46
|
+
'A5' => 'Amerigo',
|
18
47
|
'AO' => 'Amigo',
|
19
48
|
'AN' => 'Android Browser',
|
20
49
|
'AE' => 'AOL Desktop',
|
21
50
|
'AD' => 'AOL Shield',
|
51
|
+
'A4' => 'AOL Shield Pro',
|
52
|
+
'A6' => 'AppBrowzer',
|
53
|
+
'AP' => 'APUS Browser',
|
22
54
|
'AR' => 'Arora',
|
23
55
|
'AX' => 'Arctic Fox',
|
24
56
|
'AV' => 'Amiga Voyager',
|
25
57
|
'AW' => 'Amiga Aweb',
|
58
|
+
'PN' => 'APN Browser',
|
26
59
|
'AI' => 'Arvin',
|
60
|
+
'AK' => 'Ask.com',
|
61
|
+
'AU' => 'Asus Browser',
|
27
62
|
'A0' => 'Atom',
|
28
63
|
'AT' => 'Atomic Web Browser',
|
64
|
+
'A2' => 'Atlas',
|
29
65
|
'AS' => 'Avast Secure Browser',
|
30
66
|
'VG' => 'AVG Secure Browser',
|
31
67
|
'AC' => 'Avira Scout',
|
@@ -33,24 +69,40 @@ class DeviceDetector
|
|
33
69
|
'BA' => 'Beaker Browser',
|
34
70
|
'BM' => 'Beamrise',
|
35
71
|
'BB' => 'BlackBerry Browser',
|
72
|
+
'H1' => 'BrowseHere',
|
73
|
+
'B8' => 'Browser Hup Pro',
|
36
74
|
'BD' => 'Baidu Browser',
|
37
75
|
'BS' => 'Baidu Spark',
|
76
|
+
'B9' => 'Bangla Browser',
|
38
77
|
'BI' => 'Basilisk',
|
78
|
+
'BV' => 'Belva Browser',
|
79
|
+
'B5' => 'Beyond Private Browser',
|
39
80
|
'BE' => 'Beonex',
|
81
|
+
'B2' => 'Berry Browser',
|
82
|
+
'BT' => 'Bitchute Browser',
|
40
83
|
'BH' => 'BlackHawk',
|
84
|
+
'B0' => 'Bloket',
|
41
85
|
'BJ' => 'Bunjalloo',
|
42
86
|
'BL' => 'B-Line',
|
87
|
+
'B6' => 'Black Lion Browser',
|
43
88
|
'BU' => 'Blue Browser',
|
89
|
+
'BO' => 'Bonsai',
|
44
90
|
'BN' => 'Borealis Navigator',
|
45
91
|
'BR' => 'Brave',
|
46
92
|
'BK' => 'BriskBard',
|
93
|
+
'B3' => 'Browspeed Browser',
|
47
94
|
'BX' => 'BrowseX',
|
48
95
|
'BZ' => 'Browzar',
|
96
|
+
'B7' => 'Browlser',
|
49
97
|
'BY' => 'Biyubi',
|
50
98
|
'BF' => 'Byffox',
|
99
|
+
'B4' => 'BF Browser',
|
51
100
|
'CA' => 'Camino',
|
52
101
|
'CL' => 'CCleaner',
|
102
|
+
'C8' => 'CG Browser',
|
103
|
+
'CJ' => 'ChanjetCloud',
|
53
104
|
'C6' => 'Chedot',
|
105
|
+
'C9' => 'Cherry Browser',
|
54
106
|
'C0' => 'Centaury',
|
55
107
|
'CC' => 'Coc Coc',
|
56
108
|
'C4' => 'CoolBrowser',
|
@@ -59,14 +111,17 @@ class DeviceDetector
|
|
59
111
|
'C1' => 'Coast',
|
60
112
|
'CX' => 'Charon',
|
61
113
|
'CE' => 'CM Browser',
|
114
|
+
'C7' => 'CM Mini',
|
62
115
|
'CF' => 'Chrome Frame',
|
63
116
|
'HC' => 'Headless Chrome',
|
64
117
|
'CH' => 'Chrome',
|
65
118
|
'CI' => 'Chrome Mobile iOS',
|
66
119
|
'CK' => 'Conkeror',
|
67
120
|
'CM' => 'Chrome Mobile',
|
121
|
+
'3C' => 'Chowbo',
|
68
122
|
'CN' => 'CoolNovo',
|
69
123
|
'CO' => 'CometBird',
|
124
|
+
'2C' => 'Comfort Browser',
|
70
125
|
'CB' => 'COS Browser',
|
71
126
|
'CW' => 'Cornowser',
|
72
127
|
'C3' => 'Chim Lac',
|
@@ -80,30 +135,41 @@ class DeviceDetector
|
|
80
135
|
'CZ' => 'Crazy Browser',
|
81
136
|
'CU' => 'Cunaguaro',
|
82
137
|
'CV' => 'Chrome Webview',
|
138
|
+
'YC' => 'CyBrowser',
|
83
139
|
'DB' => 'dbrowser',
|
140
|
+
'PD' => 'Peeps dBrowser',
|
141
|
+
'D1' => 'Debuggable Browser',
|
142
|
+
'DC' => 'Decentr',
|
84
143
|
'DE' => 'Deepnet Explorer',
|
85
144
|
'DG' => 'deg-degan',
|
86
145
|
'DA' => 'Deledao',
|
87
146
|
'DT' => 'Delta Browser',
|
147
|
+
'D0' => 'Desi Browser',
|
88
148
|
'DS' => 'DeskBrowse',
|
89
149
|
'DF' => 'Dolphin',
|
150
|
+
'DZ' => 'Dolphin Zero',
|
90
151
|
'DO' => 'Dorado',
|
91
152
|
'DR' => 'Dot Browser',
|
92
153
|
'DL' => 'Dooble',
|
93
154
|
'DI' => 'Dillo',
|
155
|
+
'DU' => 'DUC Browser',
|
94
156
|
'DD' => 'DuckDuckGo Privacy Browser',
|
95
157
|
'EC' => 'Ecosia',
|
96
158
|
'EW' => 'Edge WebView',
|
97
159
|
'EI' => 'Epic',
|
98
160
|
'EL' => 'Elinks',
|
161
|
+
'EN' => 'EinkBro',
|
99
162
|
'EB' => 'Element Browser',
|
100
163
|
'EE' => 'Elements Browser',
|
164
|
+
'EX' => 'Explore Browser',
|
101
165
|
'EZ' => 'eZ Browser',
|
102
166
|
'EU' => 'EUI Browser',
|
103
167
|
'EP' => 'GNOME Web',
|
168
|
+
'G1' => 'G Browser',
|
104
169
|
'ES' => 'Espial TV Browser',
|
105
170
|
'FA' => 'Falkon',
|
106
171
|
'FX' => 'Faux Browser',
|
172
|
+
'F4' => 'Fiery Browser',
|
107
173
|
'F1' => 'Firefox Mobile iOS',
|
108
174
|
'FB' => 'Firebird',
|
109
175
|
'FD' => 'Fluid',
|
@@ -112,27 +178,47 @@ class DeviceDetector
|
|
112
178
|
'FK' => 'Firefox Focus',
|
113
179
|
'FY' => 'Firefox Reality',
|
114
180
|
'FR' => 'Firefox Rocket',
|
181
|
+
'1F' => 'Firefox Klar',
|
182
|
+
'F0' => 'Float Browser',
|
115
183
|
'FL' => 'Flock',
|
184
|
+
'FP' => 'Floorp',
|
116
185
|
'FO' => 'Flow',
|
186
|
+
'F2' => 'Flow Browser',
|
117
187
|
'FM' => 'Firefox Mobile',
|
118
188
|
'FW' => 'Fireweb',
|
119
189
|
'FN' => 'Fireweb Navigator',
|
190
|
+
'FH' => 'Flash Browser',
|
120
191
|
'FS' => 'Flast',
|
192
|
+
'F5' => 'Flyperlink',
|
121
193
|
'FU' => 'FreeU',
|
194
|
+
'F3' => 'Frost+',
|
195
|
+
'FI' => 'Fulldive',
|
122
196
|
'GA' => 'Galeon',
|
197
|
+
'G8' => 'Gener8',
|
123
198
|
'GH' => 'Ghostery Privacy Browser',
|
124
199
|
'GI' => 'GinxDroid Browser',
|
125
200
|
'GB' => 'Glass Browser',
|
126
201
|
'GE' => 'Google Earth',
|
202
|
+
'GP' => 'Google Earth Pro',
|
127
203
|
'GO' => 'GOG Galaxy',
|
128
204
|
'GR' => 'GoBrowser',
|
205
|
+
'HB' => 'Harman Browser',
|
129
206
|
'HS' => 'HasBrowser',
|
130
207
|
'HA' => 'Hawk Turbo Browser',
|
208
|
+
'HQ' => 'Hawk Quick Browser',
|
131
209
|
'HE' => 'Helio',
|
210
|
+
'HX' => 'Hexa Web Browser',
|
211
|
+
'HI' => 'Hi Browser',
|
132
212
|
'HO' => 'hola! Browser',
|
133
213
|
'HJ' => 'HotJava',
|
134
|
-
'
|
214
|
+
'HT' => 'HTC Browser',
|
215
|
+
'HU' => 'Huawei Browser Mobile',
|
216
|
+
'HP' => 'Huawei Browser',
|
217
|
+
'H3' => 'HUB Browser',
|
218
|
+
'IO' => 'iBrowser',
|
219
|
+
'IS' => 'iBrowser Mini',
|
135
220
|
'IB' => 'IBrowse',
|
221
|
+
'I6' => 'iDesktop PC Browser',
|
136
222
|
'IC' => 'iCab',
|
137
223
|
'I2' => 'iCab Mobile',
|
138
224
|
'I1' => 'Iridium',
|
@@ -141,16 +227,23 @@ class DeviceDetector
|
|
141
227
|
'ID' => 'IceDragon',
|
142
228
|
'IV' => 'Isivioo',
|
143
229
|
'IW' => 'Iceweasel',
|
230
|
+
'IN' => 'Inspect Browser',
|
144
231
|
'IE' => 'Internet Explorer',
|
232
|
+
'I7' => 'Internet Browser Secure',
|
233
|
+
'I5' => 'Indian UC Mini Browser',
|
145
234
|
'IM' => 'IE Mobile',
|
146
235
|
'IR' => 'Iron',
|
147
236
|
'JB' => 'Japan Browser',
|
148
237
|
'JS' => 'Jasmine',
|
149
238
|
'JA' => 'JavaFX',
|
239
|
+
'JL' => 'Jelly',
|
150
240
|
'JI' => 'Jig Browser',
|
151
241
|
'JP' => 'Jig Browser Plus',
|
152
242
|
'JO' => 'Jio Browser',
|
243
|
+
'J1' => 'JioPages',
|
153
244
|
'KB' => 'K.Browser',
|
245
|
+
'KF' => 'Keepsafe Browser',
|
246
|
+
'KS' => 'Kids Safe Browser',
|
154
247
|
'KI' => 'Kindle Browser',
|
155
248
|
'KM' => 'K-meleon',
|
156
249
|
'KO' => 'Konqueror',
|
@@ -158,40 +251,53 @@ class DeviceDetector
|
|
158
251
|
'KN' => 'Kinza',
|
159
252
|
'KW' => 'Kiwi',
|
160
253
|
'KD' => 'Kode Browser',
|
254
|
+
'KT' => 'KUTO Mini Browser',
|
161
255
|
'KY' => 'Kylo',
|
162
256
|
'KZ' => 'Kazehakase',
|
163
257
|
'LB' => 'Cheetah Browser',
|
258
|
+
'LA' => 'Lagatos Browser',
|
259
|
+
'LR' => 'Lexi Browser',
|
260
|
+
'LV' => 'Lenovo Browser',
|
164
261
|
'LF' => 'LieBaoFast',
|
165
262
|
'LG' => 'LG Browser',
|
166
263
|
'LH' => 'Light',
|
264
|
+
'L1' => 'Lilo',
|
167
265
|
'LI' => 'Links',
|
168
266
|
'IF' => 'Lolifox',
|
169
267
|
'LO' => 'Lovense Browser',
|
268
|
+
'LT' => 'LT Browser',
|
170
269
|
'LU' => 'LuaKit',
|
171
270
|
'LL' => 'Lulumi',
|
172
271
|
'LS' => 'Lunascape',
|
173
272
|
'LN' => 'Lunascape Lite',
|
174
273
|
'LX' => 'Lynx',
|
274
|
+
'L2' => 'Lynket Browser',
|
175
275
|
'MD' => 'Mandarin',
|
176
276
|
'M1' => 'mCent',
|
177
277
|
'MB' => 'MicroB',
|
178
278
|
'MC' => 'NCSA Mosaic',
|
179
279
|
'MZ' => 'Meizu Browser',
|
180
280
|
'ME' => 'Mercury',
|
281
|
+
'M2' => 'Me Browser',
|
181
282
|
'MF' => 'Mobile Safari',
|
182
283
|
'MI' => 'Midori',
|
284
|
+
'M3' => 'Midori Lite',
|
183
285
|
'MO' => 'Mobicip',
|
184
286
|
'MU' => 'MIUI Browser',
|
185
287
|
'MS' => 'Mobile Silk',
|
186
288
|
'MN' => 'Minimo',
|
187
289
|
'MT' => 'Mint Browser',
|
188
290
|
'MX' => 'Maxthon',
|
291
|
+
'M4' => 'MaxTube Browser',
|
189
292
|
'MA' => 'Maelstrom',
|
293
|
+
'MM' => 'Mmx Browser',
|
190
294
|
'NM' => 'MxNitro',
|
191
295
|
'MY' => 'Mypal',
|
192
296
|
'MR' => 'Monument Browser',
|
193
297
|
'MW' => 'MAUI WAP Browser',
|
194
298
|
'NW' => 'Navigateur Web',
|
299
|
+
'NK' => 'Naked Browser',
|
300
|
+
'NA' => 'Naked Browser Pro',
|
195
301
|
'NR' => 'NFS Browser',
|
196
302
|
'NB' => 'Nokia Browser',
|
197
303
|
'NO' => 'Nokia OSS Browser',
|
@@ -202,16 +308,20 @@ class DeviceDetector
|
|
202
308
|
'NL' => 'NetFront Life',
|
203
309
|
'NP' => 'NetPositive',
|
204
310
|
'NS' => 'Netscape',
|
311
|
+
'WR' => 'NextWord Browser',
|
205
312
|
'NT' => 'NTENT Browser',
|
206
313
|
'OC' => 'Oculus Browser',
|
207
314
|
'O1' => 'Opera Mini iOS',
|
208
315
|
'OB' => 'Obigo',
|
209
316
|
'O2' => 'Odin',
|
317
|
+
'2O' => 'Odin Browser',
|
210
318
|
'H2' => 'OceanHero',
|
211
319
|
'OD' => 'Odyssey Web Browser',
|
212
320
|
'OF' => 'Off By One',
|
321
|
+
'O5' => 'Office Browser',
|
213
322
|
'HH' => 'OhHai Browser',
|
214
323
|
'OE' => 'ONE Browser',
|
324
|
+
'Y1' => 'Opera Crypto',
|
215
325
|
'OX' => 'Opera GX',
|
216
326
|
'OG' => 'Opera Neon',
|
217
327
|
'OH' => 'Opera Devices',
|
@@ -227,6 +337,9 @@ class DeviceDetector
|
|
227
337
|
'OY' => 'Origyn Web Browser',
|
228
338
|
'OV' => 'Openwave Mobile Browser',
|
229
339
|
'O3' => 'OpenFin',
|
340
|
+
'O4' => 'Open Browser',
|
341
|
+
'4U' => 'Open Browser 4U',
|
342
|
+
'5G' => 'Open Browser fast 5G',
|
230
343
|
'OW' => 'OmniWeb',
|
231
344
|
'OT' => 'Otter Browser',
|
232
345
|
'PL' => 'Palm Blazer',
|
@@ -235,22 +348,31 @@ class DeviceDetector
|
|
235
348
|
'PP' => 'Oppo Browser',
|
236
349
|
'PR' => 'Palm Pre',
|
237
350
|
'PU' => 'Puffin',
|
351
|
+
'2P' => 'Puffin Web Browser',
|
238
352
|
'PW' => 'Palm WebPro',
|
239
353
|
'PA' => 'Palmscape',
|
240
354
|
'PE' => 'Perfect Browser',
|
355
|
+
'P1' => 'Phantom.me',
|
241
356
|
'PH' => 'Phantom Browser',
|
242
357
|
'PX' => 'Phoenix',
|
243
358
|
'PB' => 'Phoenix Browser',
|
244
359
|
'PF' => 'PlayFree Browser',
|
360
|
+
'PK' => 'PocketBook Browser',
|
245
361
|
'PO' => 'Polaris',
|
246
362
|
'PT' => 'Polarity',
|
247
363
|
'LY' => 'PolyBrowser',
|
248
364
|
'PI' => 'PrivacyWall',
|
365
|
+
'P4' => 'Privacy Explorer Fast Safe',
|
366
|
+
'P2' => 'Pi Browser',
|
367
|
+
'P0' => 'PronHub Browser',
|
368
|
+
'PC' => 'PSI Secure Browser',
|
369
|
+
'RW' => 'Reqwireless WebViewer',
|
249
370
|
'PS' => 'Microsoft Edge',
|
250
371
|
'QA' => 'Qazweb',
|
251
372
|
'Q2' => 'QQ Browser Lite',
|
252
373
|
'Q1' => 'QQ Browser Mini',
|
253
374
|
'QQ' => 'QQ Browser',
|
375
|
+
'QS' => 'Quick Browser',
|
254
376
|
'QT' => 'Qutebrowser',
|
255
377
|
'QU' => 'Quark',
|
256
378
|
'QZ' => 'QupZilla',
|
@@ -264,76 +386,120 @@ class DeviceDetector
|
|
264
386
|
'S8' => 'Seewo Browser',
|
265
387
|
'SC' => 'SEMC-Browser',
|
266
388
|
'SE' => 'Sogou Explorer',
|
389
|
+
'SO' => 'Sogou Mobile Browser',
|
390
|
+
'RF' => 'SOTI Surf',
|
391
|
+
'2S' => 'Soul Browser',
|
267
392
|
'SF' => 'Safari',
|
393
|
+
'PV' => 'Safari Technology Preview',
|
268
394
|
'S5' => 'Safe Exam Browser',
|
269
395
|
'SW' => 'SalamWeb',
|
396
|
+
'VN' => 'Savannah Browser',
|
397
|
+
'SD' => 'SavySoda',
|
270
398
|
'S9' => 'Secure Browser',
|
271
399
|
'SV' => 'SFive',
|
272
400
|
'SH' => 'Shiira',
|
401
|
+
'K1' => 'Sidekick',
|
273
402
|
'S1' => 'SimpleBrowser',
|
403
|
+
'3S' => 'SilverMob US',
|
274
404
|
'SY' => 'Sizzy',
|
275
405
|
'SK' => 'Skyfire',
|
276
406
|
'SS' => 'Seraphic Sraf',
|
407
|
+
'KK' => 'SiteKiosk',
|
277
408
|
'SL' => 'Sleipnir',
|
278
409
|
'S6' => 'Slimjet',
|
279
410
|
'S7' => 'SP Browser',
|
411
|
+
'9S' => 'Sony Small Browser',
|
412
|
+
'8S' => 'Secure Private Browser',
|
280
413
|
'T1' => 'Stampy Browser',
|
281
414
|
'7S' => '7Star',
|
415
|
+
'SQ' => 'Smart Browser',
|
416
|
+
'6S' => 'Smart Search & Web Browser',
|
282
417
|
'LE' => 'Smart Lenovo Browser',
|
283
418
|
'OZ' => 'Smooz',
|
284
419
|
'SN' => 'Snowshoe',
|
285
|
-
'
|
420
|
+
'B1' => 'Spectre Browser',
|
286
421
|
'S2' => 'Splash',
|
287
422
|
'SI' => 'Sputnik Browser',
|
288
423
|
'SR' => 'Sunrise',
|
289
424
|
'SP' => 'SuperBird',
|
290
425
|
'SU' => 'Super Fast Browser',
|
426
|
+
'5S' => 'SuperFast Browser',
|
427
|
+
'HR' => 'Sushi Browser',
|
291
428
|
'S3' => 'surf',
|
429
|
+
'4S' => 'Surf Browser',
|
292
430
|
'SG' => 'Stargon',
|
293
431
|
'S0' => 'START Internet Browser',
|
294
432
|
'S4' => 'Steam In-Game Overlay',
|
295
433
|
'ST' => 'Streamy',
|
296
434
|
'SX' => 'Swiftfox',
|
297
435
|
'SZ' => 'Seznam Browser',
|
436
|
+
'W1' => 'Sweet Browser',
|
437
|
+
'2X' => 'SX Browser',
|
438
|
+
'TP' => 'T+Browser',
|
298
439
|
'TR' => 'T-Browser',
|
299
440
|
'TO' => 't-online.de Browser',
|
300
441
|
'TA' => 'Tao Browser',
|
301
442
|
'TF' => 'TenFourFox',
|
302
443
|
'TB' => 'Tenta Browser',
|
444
|
+
'TE' => 'Tesla Browser',
|
303
445
|
'TZ' => 'Tizen Browser',
|
446
|
+
'TI' => 'Tint Browser',
|
447
|
+
'TC' => 'TUC Mini Browser',
|
304
448
|
'TU' => 'Tungsten',
|
305
449
|
'TG' => 'ToGate',
|
306
450
|
'TS' => 'TweakStyle',
|
307
451
|
'TV' => 'TV Bro',
|
452
|
+
'U0' => 'U Browser',
|
308
453
|
'UB' => 'UBrowser',
|
309
454
|
'UC' => 'UC Browser',
|
310
455
|
'UH' => 'UC Browser HD',
|
311
456
|
'UM' => 'UC Browser Mini',
|
312
457
|
'UT' => 'UC Browser Turbo',
|
458
|
+
'UI' => 'Ui Browser Mini',
|
313
459
|
'UR' => 'UR Browser',
|
314
460
|
'UZ' => 'Uzbl',
|
461
|
+
'UE' => 'Ume Browser',
|
462
|
+
'V0' => 'vBrowser',
|
463
|
+
'VA' => 'Vast Browser',
|
315
464
|
'VE' => 'Venus Browser',
|
465
|
+
'N0' => 'Nova Video Downloader Pro',
|
466
|
+
'VS' => 'Viasat Browser',
|
316
467
|
'VI' => 'Vivaldi',
|
317
468
|
'VV' => 'vivo Browser',
|
469
|
+
'V2' => 'Vivid Browser Mini',
|
318
470
|
'VB' => 'Vision Mobile Browser',
|
319
471
|
'VM' => 'VMware AirWatch',
|
320
472
|
'WI' => 'Wear Internet Browser',
|
321
473
|
'WP' => 'Web Explorer',
|
474
|
+
'W3' => 'Web Browser & Explorer',
|
322
475
|
'WE' => 'WebPositive',
|
323
476
|
'WF' => 'Waterfox',
|
477
|
+
'WB' => 'Wave Browser',
|
324
478
|
'WH' => 'Whale Browser',
|
325
479
|
'WO' => 'wOSBrowser',
|
326
480
|
'WT' => 'WeTab Browser',
|
481
|
+
'YG' => 'YAGI',
|
327
482
|
'YJ' => 'Yahoo! Japan Browser',
|
328
483
|
'YA' => 'Yandex Browser',
|
329
484
|
'YL' => 'Yandex Browser Lite',
|
330
485
|
'YN' => 'Yaani Browser',
|
486
|
+
'Y2' => 'Yo Browser',
|
331
487
|
'YB' => 'Yolo Browser',
|
488
|
+
'YO' => 'YouCare',
|
489
|
+
'YZ' => 'Yuzu Browser',
|
490
|
+
'XR' => 'xBrowser',
|
491
|
+
'XB' => 'X Browser Lite',
|
492
|
+
'X0' => 'X-VPN',
|
493
|
+
'X1' => 'xBrowser Pro Super Fast',
|
494
|
+
'XN' => 'XNX Browser',
|
495
|
+
'XT' => 'XtremeCast',
|
332
496
|
'XS' => 'xStand',
|
333
497
|
'XI' => 'Xiino',
|
498
|
+
'XO' => 'Xooloo Internet',
|
334
499
|
'XV' => 'Xvast',
|
335
500
|
'ZE' => 'Zetakey',
|
336
|
-
'ZV' => 'Zvu'
|
501
|
+
'ZV' => 'Zvu',
|
502
|
+
'ZI' => 'Zirco Browser'
|
337
503
|
|
338
504
|
# detected browsers in older versions
|
339
505
|
# 'IA' => 'Iceape', => pim
|
@@ -350,7 +516,14 @@ class DeviceDetector
|
|
350
516
|
MN MZ NX OC OI OM OZ PU PI
|
351
517
|
PE QU RE S0 S7 SA SB SG SK
|
352
518
|
ST SU T1 UH UM UT VE VV WI
|
353
|
-
WP YN
|
519
|
+
WP YN IO IS HQ RW HI PN BW
|
520
|
+
YO PK MR AP AK UI SD VN 4S
|
521
|
+
RF LR SQ BV L1 F0 KS V0 C8
|
522
|
+
AZ MM BT N0 P0 F3 DU D0 P1
|
523
|
+
O4 XO U0 B0 VA X0 A5 X1 18
|
524
|
+
B5 B6 TC A6 2X F4 YG WR NA
|
525
|
+
DM 1M A7 XN XT XB W1 HT B7
|
526
|
+
B9
|
354
527
|
]
|
355
528
|
).freeze
|
356
529
|
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class DeviceDetector
|
4
|
+
class ClientHint
|
5
|
+
ROOT = File.expand_path('../..', __dir__)
|
6
|
+
|
7
|
+
REGEX_CACHE = ::DeviceDetector::MemoryCache.new({})
|
8
|
+
private_constant :REGEX_CACHE
|
9
|
+
|
10
|
+
class HintBrowser < Struct.new(:name, :version)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(headers)
|
14
|
+
return if headers.nil?
|
15
|
+
|
16
|
+
@headers = headers
|
17
|
+
@browser_list = extract_browser_list
|
18
|
+
@app_name = extract_app_name
|
19
|
+
@platform = headers['Sec-CH-UA-Platform']
|
20
|
+
@platform_version = headers['Sec-CH-UA-Platform-Version']
|
21
|
+
@mobile = headers['Sec-CH-UA-Mobile']
|
22
|
+
@model = extract_model
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :app_name, :browser_list, :headers, :mobile, :model, :platform, :platform_version
|
26
|
+
|
27
|
+
def browser_name
|
28
|
+
return 'Iridium' if is_iridium?
|
29
|
+
|
30
|
+
browser_name_from_list || app_name
|
31
|
+
end
|
32
|
+
|
33
|
+
def os_version
|
34
|
+
return windows_version if platform == 'Windows'
|
35
|
+
|
36
|
+
platform_version
|
37
|
+
end
|
38
|
+
|
39
|
+
def os_name
|
40
|
+
return 'Android' if android_app?
|
41
|
+
return unless ['Windows', 'Chromium OS'].include?(platform)
|
42
|
+
|
43
|
+
platform
|
44
|
+
end
|
45
|
+
|
46
|
+
def os_short_name
|
47
|
+
return if os_name.nil?
|
48
|
+
|
49
|
+
DeviceDetector::OS::DOWNCASED_OPERATING_SYSTEMS[os_name.downcase]
|
50
|
+
end
|
51
|
+
|
52
|
+
def os_family
|
53
|
+
return if os_short_name.nil?
|
54
|
+
|
55
|
+
DeviceDetector::OS::FAMILY_TO_OS[os_short_name]
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
# https://github.com/matomo-org/device-detector/blob/28211c6f411528abf41304e07b886fdf322a49b7/Parser/OperatingSystem.php#L330
|
61
|
+
def android_app?
|
62
|
+
%w[com.hisense.odinbrowser com.seraphic.openinet.pre
|
63
|
+
com.appssppa.idesktoppcbrowser].include?(app_name_from_headers)
|
64
|
+
end
|
65
|
+
|
66
|
+
def browser_name_from_list
|
67
|
+
@browser_name_from_list ||= browser_list&.reject { |b| b.name == 'Chromium' }&.last&.name
|
68
|
+
end
|
69
|
+
|
70
|
+
def available_browsers
|
71
|
+
DeviceDetector::Browser::AVAILABLE_BROWSERS.values
|
72
|
+
end
|
73
|
+
|
74
|
+
def available_osses
|
75
|
+
DeviceDetector::OS::OPERATING_SYSTEMS.values
|
76
|
+
end
|
77
|
+
|
78
|
+
# https://github.com/matomo-org/device-detector/blob/28211c6f411528abf41304e07b886fdf322a49b7/Parser/OperatingSystem.php#L434
|
79
|
+
def windows_version
|
80
|
+
return if platform_version.nil?
|
81
|
+
|
82
|
+
major_version = platform_version.split('.').first.to_i
|
83
|
+
return if major_version < 1
|
84
|
+
|
85
|
+
major_version < 11 ? '10' : '11'
|
86
|
+
end
|
87
|
+
|
88
|
+
# https://github.com/matomo-org/device-detector/blob/be1c9ef486c247dc4886668da5ed0b1c49d90ba8/Parser/Client/Browser.php#L749
|
89
|
+
# If version from client hints report 2022 or 2022.04, then is the Iridium browser
|
90
|
+
# https://iridiumbrowser.de/news/2022/05/16/version-2022-04-released
|
91
|
+
def is_iridium?
|
92
|
+
return if browser_list.nil?
|
93
|
+
|
94
|
+
!browser_list.find do |browser|
|
95
|
+
browser.name == 'Chromium' && %w[2022.04 2022].include?(browser.version)
|
96
|
+
end.nil?
|
97
|
+
end
|
98
|
+
|
99
|
+
def app_name_from_headers
|
100
|
+
return if headers.nil?
|
101
|
+
|
102
|
+
headers['http-x-requested-with'] ||
|
103
|
+
headers['X-Requested-With'] ||
|
104
|
+
headers['x-requested-with']
|
105
|
+
end
|
106
|
+
|
107
|
+
def extract_app_name
|
108
|
+
requested_with = app_name_from_headers
|
109
|
+
return if requested_with.nil?
|
110
|
+
|
111
|
+
hint_app_names[requested_with]
|
112
|
+
end
|
113
|
+
|
114
|
+
def hint_app_names
|
115
|
+
DeviceDetector.cache.get_or_set('hint_app_names') do
|
116
|
+
load_hint_app_names.flatten.reduce({}, :merge)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def hint_filenames
|
121
|
+
%w[client/hints/browsers.yml client/hints/apps.yml]
|
122
|
+
end
|
123
|
+
|
124
|
+
def hint_filepaths
|
125
|
+
hint_filenames.map do |filename|
|
126
|
+
[filename.to_sym, File.join(ROOT, 'regexes', filename)]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def load_hint_app_names
|
131
|
+
hint_filepaths.map { |_, full_path| YAML.load_file(full_path) }
|
132
|
+
end
|
133
|
+
|
134
|
+
def extract_browser_list
|
135
|
+
return if headers['Sec-CH-UA'].nil?
|
136
|
+
|
137
|
+
headers['Sec-CH-UA'].split(', ').map do |component|
|
138
|
+
component_and_version = component.gsub('"', '').split("\;v=")
|
139
|
+
name = name_from_known_browsers(component_and_version.first)
|
140
|
+
next if name.nil?
|
141
|
+
|
142
|
+
HintBrowser.new(name, component_and_version.last)
|
143
|
+
end.compact
|
144
|
+
end
|
145
|
+
|
146
|
+
# https://github.com/matomo-org/device-detector/blob/be1c9ef486c247dc4886668da5ed0b1c49d90ba8/Parser/Client/Browser.php#L865
|
147
|
+
def name_from_known_browsers(name)
|
148
|
+
# https://github.com/matomo-org/device-detector/blob/be1c9ef486c247dc4886668da5ed0b1c49d90ba8/Parser/Client/Browser.php#L628
|
149
|
+
return 'Chrome' if name == 'Google Chrome'
|
150
|
+
|
151
|
+
available_browsers.find do |i|
|
152
|
+
i == name ||
|
153
|
+
i.gsub(' ', '') == name.gsub(' ', '') ||
|
154
|
+
i == name.gsub('Browser', '') ||
|
155
|
+
i == name.gsub(' Browser', '') ||
|
156
|
+
i == "#{name} Browser"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def extract_model
|
161
|
+
return if headers['Sec-CH-UA-Model'].nil? || headers['Sec-CH-UA-Model'] == ''
|
162
|
+
|
163
|
+
headers['Sec-CH-UA-Model']
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|