device_detector 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -6
  3. data/lib/device_detector/browser.rb +364 -0
  4. data/lib/device_detector/client.rb +8 -0
  5. data/lib/device_detector/device.rb +1124 -4
  6. data/lib/device_detector/os.rb +36 -11
  7. data/lib/device_detector/version.rb +1 -1
  8. data/lib/device_detector/version_extractor.rb +9 -0
  9. data/lib/device_detector.rb +57 -13
  10. data/regexes/bots.yml +551 -58
  11. data/regexes/client/browser_engine.yml +7 -1
  12. data/regexes/client/browsers.yml +594 -71
  13. data/regexes/client/feed_readers.yml +4 -10
  14. data/regexes/client/libraries.yml +47 -2
  15. data/regexes/client/mediaplayers.yml +25 -1
  16. data/regexes/client/mobile_apps.yml +447 -77
  17. data/regexes/client/pim.yml +49 -1
  18. data/regexes/device/cameras.yml +5 -5
  19. data/regexes/device/car_browsers.yml +16 -0
  20. data/regexes/device/consoles.yml +6 -0
  21. data/regexes/device/mobiles.yml +12905 -4561
  22. data/regexes/device/portable_media_player.yml +20 -3
  23. data/regexes/device/shell_tv.yml +117 -0
  24. data/regexes/device/televisions.yml +426 -35
  25. data/regexes/oss.yml +567 -139
  26. data/spec/device_detector/concrete_user_agent_spec.rb +30 -42
  27. data/spec/device_detector/detector_fixtures_spec.rb +9 -5
  28. data/spec/device_detector/device_spec.rb +26 -10
  29. data/spec/fixtures/client/browser.yml +1463 -391
  30. data/spec/fixtures/client/feed_reader.yml +0 -12
  31. data/spec/fixtures/client/library.yml +91 -37
  32. data/spec/fixtures/client/mediaplayer.yml +30 -0
  33. data/spec/fixtures/client/mobile_app.yml +498 -45
  34. data/spec/fixtures/client/pim.yml +60 -0
  35. data/spec/fixtures/detector/bots.yml +1189 -568
  36. data/spec/fixtures/detector/camera.yml +12 -26
  37. data/spec/fixtures/detector/car_browser.yml +151 -15
  38. data/spec/fixtures/detector/console.yml +70 -48
  39. data/spec/fixtures/detector/desktop.yml +2041 -916
  40. data/spec/fixtures/detector/feature_phone.yml +895 -189
  41. data/spec/fixtures/detector/feed_reader.yml +50 -77
  42. data/spec/fixtures/detector/mediaplayer.yml +79 -26
  43. data/spec/fixtures/detector/mobile_apps.yml +726 -72
  44. data/spec/fixtures/detector/peripheral.yml +271 -0
  45. data/spec/fixtures/detector/phablet.yml +3635 -1596
  46. data/spec/fixtures/detector/portable_media_player.yml +355 -46
  47. data/spec/fixtures/detector/smart_display.yml +183 -9
  48. data/spec/fixtures/detector/smart_speaker.yml +13 -8
  49. data/spec/fixtures/detector/smartphone-1.yml +4002 -4286
  50. data/spec/fixtures/detector/smartphone-10.yml +3771 -4763
  51. data/spec/fixtures/detector/smartphone-11.yml +3615 -4692
  52. data/spec/fixtures/detector/smartphone-12.yml +3856 -4764
  53. data/spec/fixtures/detector/smartphone-13.yml +4213 -4713
  54. data/spec/fixtures/detector/smartphone-14.yml +4039 -4497
  55. data/spec/fixtures/detector/smartphone-15.yml +5642 -2956
  56. data/spec/fixtures/detector/smartphone-16.yml +4739 -5082
  57. data/spec/fixtures/detector/smartphone-17.yml +4832 -4275
  58. data/spec/fixtures/detector/smartphone-18.yml +9806 -0
  59. data/spec/fixtures/detector/smartphone-19.yml +9965 -0
  60. data/spec/fixtures/detector/smartphone-2.yml +4842 -2589
  61. data/spec/fixtures/detector/smartphone-20.yml +9710 -0
  62. data/spec/fixtures/detector/smartphone-21.yml +8693 -0
  63. data/spec/fixtures/detector/smartphone-22.yml +10178 -0
  64. data/spec/fixtures/detector/smartphone-23.yml +9453 -0
  65. data/spec/fixtures/detector/smartphone-24.yml +9843 -0
  66. data/spec/fixtures/detector/smartphone-25.yml +9703 -0
  67. data/spec/fixtures/detector/smartphone-26.yml +10007 -0
  68. data/spec/fixtures/detector/smartphone-27.yml +4927 -0
  69. data/spec/fixtures/detector/smartphone-3.yml +4387 -4427
  70. data/spec/fixtures/detector/smartphone-4.yml +3597 -4582
  71. data/spec/fixtures/detector/smartphone-5.yml +4066 -5022
  72. data/spec/fixtures/detector/smartphone-6.yml +3455 -4621
  73. data/spec/fixtures/detector/smartphone-7.yml +3574 -4574
  74. data/spec/fixtures/detector/smartphone-8.yml +4617 -4704
  75. data/spec/fixtures/detector/smartphone-9.yml +4080 -5035
  76. data/spec/fixtures/detector/smartphone.yml +3244 -4234
  77. data/spec/fixtures/detector/tablet-1.yml +4652 -4492
  78. data/spec/fixtures/detector/tablet-2.yml +3515 -4434
  79. data/spec/fixtures/detector/tablet-3.yml +3418 -4351
  80. data/spec/fixtures/detector/tablet-4.yml +5149 -3200
  81. data/spec/fixtures/detector/tablet-5.yml +9273 -0
  82. data/spec/fixtures/detector/tablet-6.yml +4588 -0
  83. data/spec/fixtures/detector/tablet.yml +1621 -2613
  84. data/spec/fixtures/detector/tv-1.yml +2501 -0
  85. data/spec/fixtures/detector/tv.yml +7826 -3114
  86. data/spec/fixtures/detector/unknown.yml +370 -531
  87. data/spec/fixtures/detector/wearable.yml +863 -9
  88. data/spec/fixtures/parser/oss.yml +1350 -21
  89. data/spec/fixtures/parser/vendorfragments.yml +53 -53
  90. metadata +35 -5
@@ -16,9 +16,1112 @@ class DeviceDetector
16
16
  'portable media player',
17
17
  'phablet',
18
18
  'smart speaker',
19
- 'wearable'
19
+ 'wearable',
20
+ 'peripheral'
20
21
  ].freeze
21
22
 
23
+ DEVICE_BRANDS = {
24
+ '5E' => '2E',
25
+ '2F' => 'F2 Mobile',
26
+ '3Q' => '3Q',
27
+ 'J7' => '7 Mobile',
28
+ '2Q' => '3GNET',
29
+ '4G' => '4Good',
30
+ '27' => '3GO',
31
+ '04' => '4ife',
32
+ '36' => '360',
33
+ '88' => '8848',
34
+ '41' => 'A1',
35
+ '00' => 'Accent',
36
+ 'AE' => 'Ace',
37
+ 'AC' => 'Acer',
38
+ '3K' => 'Acteck',
39
+ 'A9' => 'Advan',
40
+ 'AD' => 'Advance',
41
+ '76' => 'Adronix',
42
+ 'AF' => 'AfriOne',
43
+ 'A3' => 'AGM',
44
+ 'J0' => 'AG Mobile',
45
+ 'AZ' => 'Ainol',
46
+ 'AI' => 'Airness',
47
+ 'AT' => 'Airties',
48
+ 'U0' => 'AIRON',
49
+ '0A' => 'AIS',
50
+ 'AW' => 'Aiwa',
51
+ '85' => 'Aiuto',
52
+ 'AK' => 'Akai',
53
+ 'Q3' => 'AKIRA',
54
+ '1A' => 'Alba',
55
+ 'AL' => 'Alcatel',
56
+ '20' => 'Alcor',
57
+ '7L' => 'ALDI NORD',
58
+ '6L' => 'ALDI SÜD',
59
+ '3L' => 'Alfawise',
60
+ '4A' => 'Aligator',
61
+ 'AA' => 'AllCall',
62
+ '3A' => 'AllDocube',
63
+ 'A2' => 'Allview',
64
+ 'A7' => 'Allwinner',
65
+ 'A1' => 'Altech UEC',
66
+ '66' => 'Altice',
67
+ 'A5' => 'altron',
68
+ 'KN' => 'Amazon',
69
+ 'AG' => 'AMGOO',
70
+ '9A' => 'Amigoo',
71
+ 'AO' => 'Amoi',
72
+ '54' => 'AMCV',
73
+ '60' => 'Andowl',
74
+ '7A' => 'Anry',
75
+ 'A0' => 'ANS',
76
+ '74' => 'Anker',
77
+ '3N' => 'Aoson',
78
+ 'O8' => 'AOC',
79
+ 'J2' => 'AOYODKG',
80
+ '55' => 'AOpen',
81
+ 'AP' => 'Apple',
82
+ 'AR' => 'Archos',
83
+ 'AB' => 'Arian Space',
84
+ 'A6' => 'Ark',
85
+ '5A' => 'ArmPhone',
86
+ 'AN' => 'Arnova',
87
+ 'AS' => 'ARRIS',
88
+ 'AQ' => 'Aspera',
89
+ '40' => 'Artel',
90
+ '21' => 'Artizlee',
91
+ '8A' => 'Asano',
92
+ '90' => 'Asanzo',
93
+ '1U' => 'Astro',
94
+ 'A4' => 'Ask',
95
+ 'A8' => 'Assistant',
96
+ 'AU' => 'Asus',
97
+ '6A' => 'AT&T',
98
+ '2A' => 'Atom',
99
+ 'Z2' => 'Atvio',
100
+ 'AX' => 'Audiovox',
101
+ 'AJ' => 'AURIS',
102
+ 'ZA' => 'Avenzo',
103
+ 'AH' => 'AVH',
104
+ 'AV' => 'Avvio',
105
+ 'AY' => 'Axxion',
106
+ 'XA' => 'Axioo',
107
+ 'AM' => 'Azumi Mobile',
108
+ 'BO' => 'BangOlufsen',
109
+ 'BN' => 'Barnes & Noble',
110
+ 'BB' => 'BBK',
111
+ '0B' => 'BB Mobile',
112
+ 'B6' => 'BDF',
113
+ 'BE' => 'Becker',
114
+ 'B5' => 'Beeline',
115
+ 'B0' => 'Beelink',
116
+ 'BL' => 'Beetel',
117
+ 'BQ' => 'BenQ',
118
+ 'BS' => 'BenQ-Siemens',
119
+ '4Y' => 'Benzo',
120
+ 'BY' => 'BS Mobile',
121
+ 'BZ' => 'Bezkam',
122
+ '9B' => 'Bellphone',
123
+ '63' => 'Beyond',
124
+ 'BG' => 'BGH',
125
+ '6B' => 'Bigben',
126
+ 'B8' => 'BIHEE',
127
+ '1B' => 'Billion',
128
+ 'BA' => 'BilimLand',
129
+ 'BH' => 'BioRugged',
130
+ 'BI' => 'Bird',
131
+ 'BT' => 'Bitel',
132
+ 'B7' => 'Bitmore',
133
+ 'BK' => 'Bkav',
134
+ '5B' => 'Black Bear',
135
+ 'BF' => 'Black Fox',
136
+ 'B2' => 'Blackview',
137
+ 'BP' => 'Blaupunkt',
138
+ 'BU' => 'Blu',
139
+ 'B3' => 'Bluboo',
140
+ '2B' => 'Bluedot',
141
+ 'BD' => 'Bluegood',
142
+ 'LB' => 'Bluewave',
143
+ 'J8' => 'Bluebird',
144
+ '7B' => 'Blloc',
145
+ 'UB' => 'Bleck',
146
+ 'Q2' => 'Blow',
147
+ 'BM' => 'Bmobile',
148
+ 'Y5' => 'BMAX',
149
+ 'B9' => 'Bobarry',
150
+ 'B4' => 'bogo',
151
+ 'BW' => 'Boway',
152
+ 'BX' => 'bq',
153
+ '8B' => 'Brandt',
154
+ 'BV' => 'Bravis',
155
+ 'BR' => 'Brondi',
156
+ 'BJ' => 'BrightSign',
157
+ 'B1' => 'Bush',
158
+ '4Q' => 'Bundy',
159
+ 'C9' => 'CAGI',
160
+ 'CT' => 'Capitel',
161
+ 'G3' => 'CG Mobile',
162
+ '37' => 'CGV',
163
+ 'CP' => 'Captiva',
164
+ 'CF' => 'Carrefour',
165
+ 'CS' => 'Casio',
166
+ 'R4' => 'Casper',
167
+ 'CA' => 'Cat',
168
+ 'BC' => 'Camfone',
169
+ 'CJ' => 'Cavion',
170
+ '4D' => 'Canal Digital',
171
+ '02' => 'Cell-C',
172
+ '34' => 'CellAllure',
173
+ '7C' => 'Celcus',
174
+ 'CE' => 'Celkon',
175
+ '62' => 'Centric',
176
+ 'C2' => 'Changhong',
177
+ 'CH' => 'Cherry Mobile',
178
+ 'C3' => 'China Mobile',
179
+ 'CI' => 'Chico Mobile',
180
+ 'HG' => 'CHIA',
181
+ '1C' => 'Chuwi',
182
+ 'L8' => 'Clarmin',
183
+ '25' => 'Claresta',
184
+ 'CD' => 'Cloudfone',
185
+ '6C' => 'Cloudpad',
186
+ 'C0' => 'Clout',
187
+ 'CN' => 'CnM',
188
+ 'CY' => 'Coby Kyros',
189
+ 'XC' => 'Cobalt',
190
+ 'C6' => 'Comio',
191
+ 'CL' => 'Compal',
192
+ 'CQ' => 'Compaq',
193
+ 'C7' => 'ComTrade Tesla',
194
+ 'C8' => 'Concord',
195
+ 'CC' => 'ConCorde',
196
+ 'C5' => 'Condor',
197
+ '4C' => 'Conquest',
198
+ '3C' => 'Contixo',
199
+ '8C' => 'Connex',
200
+ '53' => 'Connectce',
201
+ '9C' => 'Colors',
202
+ 'CO' => 'Coolpad',
203
+ '4R' => 'CORN',
204
+ '1O' => 'Cosmote',
205
+ 'CW' => 'Cowon',
206
+ '75' => 'Covia',
207
+ '33' => 'Clementoni',
208
+ 'CR' => 'CreNova',
209
+ 'CX' => 'Crescent',
210
+ 'CK' => 'Cricket',
211
+ 'CM' => 'Crius Mea',
212
+ '0C' => 'Crony',
213
+ 'C1' => 'Crosscall',
214
+ 'CU' => 'Cube',
215
+ 'CB' => 'CUBOT',
216
+ 'CV' => 'CVTE',
217
+ 'C4' => 'Cyrus',
218
+ 'D5' => 'Daewoo',
219
+ 'DA' => 'Danew',
220
+ 'DT' => 'Datang',
221
+ 'D7' => 'Datawind',
222
+ '7D' => 'Datamini',
223
+ '6D' => 'Datalogic',
224
+ 'D1' => 'Datsun',
225
+ 'DB' => 'Dbtel',
226
+ 'DL' => 'Dell',
227
+ 'DE' => 'Denver',
228
+ 'DS' => 'Desay',
229
+ 'DW' => 'DeWalt',
230
+ 'DX' => 'DEXP',
231
+ 'DG' => 'Dialog',
232
+ 'DI' => 'Dicam',
233
+ 'D4' => 'Digi',
234
+ 'D3' => 'Digicel',
235
+ 'DH' => 'Digihome',
236
+ 'DD' => 'Digiland',
237
+ 'Q0' => 'DIGIFORS',
238
+ '9D' => 'Ditecma',
239
+ 'D2' => 'Digma',
240
+ '1D' => 'Diva',
241
+ 'D6' => 'Divisat',
242
+ 'X6' => 'DIXON',
243
+ '5D' => 'DING DING',
244
+ 'DM' => 'DMM',
245
+ 'DN' => 'DNS',
246
+ 'DC' => 'DoCoMo',
247
+ 'DF' => 'Doffler',
248
+ 'D9' => 'Dolamee',
249
+ 'DO' => 'Doogee',
250
+ 'D0' => 'Doopro',
251
+ 'DV' => 'Doov',
252
+ 'DP' => 'Dopod',
253
+ 'DR' => 'Doro',
254
+ 'D8' => 'Droxio',
255
+ 'DJ' => 'Dragon Touch',
256
+ 'DU' => 'Dune HD',
257
+ 'EB' => 'E-Boda',
258
+ 'EJ' => 'Engel',
259
+ '2E' => 'E-Ceros',
260
+ 'E8' => 'E-tel',
261
+ 'EP' => 'Easypix',
262
+ 'EQ' => 'Eagle',
263
+ 'EA' => 'EBEST',
264
+ 'E4' => 'Echo Mobiles',
265
+ 'ES' => 'ECS',
266
+ '35' => 'ECON',
267
+ 'E6' => 'EE',
268
+ 'EK' => 'EKO',
269
+ 'EY' => 'Einstein',
270
+ 'EM' => 'Eks Mobility',
271
+ '4K' => 'EKT',
272
+ '7E' => 'ELARI',
273
+ '03' => 'Electroneum',
274
+ 'Z8' => 'ELECTRONIA',
275
+ 'L0' => 'Element',
276
+ 'EG' => 'Elenberg',
277
+ 'EL' => 'Elephone',
278
+ 'JE' => 'Elekta',
279
+ '4E' => 'Eltex',
280
+ 'ED' => 'Energizer',
281
+ 'E1' => 'Energy Sistem',
282
+ '3E' => 'Enot',
283
+ '8E' => 'Epik One',
284
+ 'E7' => 'Ergo',
285
+ 'EC' => 'Ericsson',
286
+ '05' => 'Erisson',
287
+ 'ER' => 'Ericy',
288
+ 'EE' => 'Essential',
289
+ 'E2' => 'Essentielb',
290
+ '6E' => 'eSTAR',
291
+ 'EN' => 'Eton',
292
+ 'ET' => 'eTouch',
293
+ '1E' => 'Etuline',
294
+ 'EU' => 'Eurostar',
295
+ 'E9' => 'Evercoss',
296
+ 'EV' => 'Evertek',
297
+ 'E3' => 'Evolio',
298
+ 'EO' => 'Evolveo',
299
+ 'E0' => 'EvroMedia',
300
+ 'XE' => 'ExMobile',
301
+ '4Z' => 'Exmart',
302
+ 'EH' => 'EXO',
303
+ 'EX' => 'Explay',
304
+ 'E5' => 'Extrem',
305
+ 'EF' => 'EXCEED',
306
+ 'QE' => 'EWIS',
307
+ 'EI' => 'Ezio',
308
+ 'EZ' => 'Ezze',
309
+ '5F' => 'F150',
310
+ 'F6' => 'Facebook',
311
+ 'FA' => 'Fairphone',
312
+ 'FM' => 'Famoco',
313
+ '17' => 'FarEasTone',
314
+ '9R' => 'FaRao Pro',
315
+ 'FB' => 'Fantec',
316
+ 'FE' => 'Fengxiang',
317
+ 'F7' => 'Fero',
318
+ 'FI' => 'FiGO',
319
+ 'F1' => 'FinePower',
320
+ 'FX' => 'Finlux',
321
+ 'F3' => 'FireFly Mobile',
322
+ 'F8' => 'FISE',
323
+ 'FL' => 'Fly',
324
+ 'QC' => 'FLYCAT',
325
+ 'FN' => 'FNB',
326
+ 'FD' => 'Fondi',
327
+ '0F' => 'Fourel',
328
+ '44' => 'Four Mobile',
329
+ 'F0' => 'Fonos',
330
+ 'F2' => 'FORME',
331
+ 'F5' => 'Formuler',
332
+ 'FR' => 'Forstar',
333
+ 'RF' => 'Fortis',
334
+ 'FO' => 'Foxconn',
335
+ 'FT' => 'Freetel',
336
+ 'F4' => 'F&U',
337
+ '1F' => 'FMT',
338
+ 'FG' => 'Fuego',
339
+ 'FU' => 'Fujitsu',
340
+ 'FW' => 'FNF',
341
+ 'GT' => 'G-TiDE',
342
+ 'G9' => 'G-Touch',
343
+ '0G' => 'GFive',
344
+ 'GM' => 'Garmin-Asus',
345
+ 'GA' => 'Gateway',
346
+ '99' => 'Galaxy Innovations',
347
+ 'GD' => 'Gemini',
348
+ 'GN' => 'General Mobile',
349
+ '2G' => 'Genesis',
350
+ 'G2' => 'GEOFOX',
351
+ 'GE' => 'Geotel',
352
+ 'Q4' => 'Geotex',
353
+ 'GH' => 'Ghia',
354
+ '2C' => 'Ghong',
355
+ 'GG' => 'Gigabyte',
356
+ 'GS' => 'Gigaset',
357
+ 'GZ' => 'Ginzzu',
358
+ '1G' => 'Gini',
359
+ 'GI' => 'Gionee',
360
+ 'G4' => 'Globex',
361
+ 'G7' => 'GoGEN',
362
+ 'GC' => 'GOCLEVER',
363
+ 'GB' => 'Gol Mobile',
364
+ 'GL' => 'Goly',
365
+ 'GX' => 'GLX',
366
+ 'G5' => 'Gome',
367
+ 'G1' => 'GoMobile',
368
+ 'GO' => 'Google',
369
+ 'G0' => 'Goophone',
370
+ '6G' => 'Gooweel',
371
+ 'GR' => 'Gradiente',
372
+ 'GP' => 'Grape',
373
+ 'G6' => 'Gree',
374
+ '3G' => 'Greentel',
375
+ 'GF' => 'Gretel',
376
+ '82' => 'Gresso',
377
+ 'GU' => 'Grundig',
378
+ 'HF' => 'Hafury',
379
+ 'HA' => 'Haier',
380
+ 'HE' => 'HannSpree',
381
+ 'HK' => 'Hardkernel',
382
+ 'HS' => 'Hasee',
383
+ 'H6' => 'Helio',
384
+ 'ZH' => 'Hezire',
385
+ 'HL' => 'Hi-Level',
386
+ '3H' => 'Hi',
387
+ 'H2' => 'Highscreen',
388
+ 'Q1' => 'High Q',
389
+ '1H' => 'Hipstreet',
390
+ 'HI' => 'Hisense',
391
+ 'HC' => 'Hitachi',
392
+ 'H8' => 'Hitech',
393
+ 'W3' => 'HiMax',
394
+ 'H1' => 'Hoffmann',
395
+ 'H0' => 'Hometech',
396
+ 'HM' => 'Homtom',
397
+ 'HZ' => 'Hoozo',
398
+ 'H7' => 'Horizon',
399
+ 'HO' => 'Hosin',
400
+ 'H3' => 'Hotel',
401
+ 'HV' => 'Hotwav',
402
+ 'HW' => 'How',
403
+ 'WH' => 'Honeywell',
404
+ 'HP' => 'HP',
405
+ 'HT' => 'HTC',
406
+ 'HD' => 'Huadoo',
407
+ 'HU' => 'Huawei',
408
+ 'HX' => 'Humax',
409
+ 'HR' => 'Hurricane',
410
+ 'H5' => 'Huskee',
411
+ 'HY' => 'Hyrican',
412
+ 'HN' => 'Hyundai',
413
+ '7H' => 'Hyve',
414
+ '3I' => 'i-Cherry',
415
+ 'IJ' => 'i-Joy',
416
+ 'IM' => 'i-mate',
417
+ 'IO' => 'i-mobile',
418
+ 'OF' => 'iOutdoor',
419
+ 'IB' => 'iBall',
420
+ 'IY' => 'iBerry',
421
+ '7I' => 'iBrit',
422
+ 'I2' => 'IconBIT',
423
+ 'IC' => 'iDroid',
424
+ 'IG' => 'iGet',
425
+ 'IH' => 'iHunt',
426
+ 'IA' => 'Ikea',
427
+ '8I' => 'IKU Mobile',
428
+ '2K' => 'IKI Mobile',
429
+ 'IK' => 'iKoMo',
430
+ 'I7' => 'iLA',
431
+ '2I' => 'iLife',
432
+ '1I' => 'iMars',
433
+ 'U4' => 'iMan',
434
+ 'IL' => 'IMO Mobile',
435
+ 'I3' => 'Impression',
436
+ 'FC' => 'INCAR',
437
+ '2H' => 'Inch',
438
+ '6I' => 'Inco',
439
+ 'IW' => 'iNew',
440
+ 'IF' => 'Infinix',
441
+ 'I0' => 'InFocus',
442
+ 'II' => 'Inkti',
443
+ '81' => 'InfoKit',
444
+ 'I5' => 'InnJoo',
445
+ '26' => 'Innos',
446
+ 'IN' => 'Innostream',
447
+ 'I4' => 'Inoi',
448
+ 'IQ' => 'INQ',
449
+ 'QN' => 'iQ&T',
450
+ 'IS' => 'Insignia',
451
+ 'IT' => 'Intek',
452
+ 'IX' => 'Intex',
453
+ 'IV' => 'Inverto',
454
+ '32' => 'Invens',
455
+ '4I' => 'Invin',
456
+ 'I1' => 'iOcean',
457
+ 'IP' => 'iPro',
458
+ '8Q' => 'IQM',
459
+ 'I6' => 'Irbis',
460
+ '5I' => 'Iris',
461
+ 'IR' => 'iRola',
462
+ 'IU' => 'iRulu',
463
+ '9I' => 'iSWAG',
464
+ '86' => 'IT',
465
+ 'IZ' => 'iTel',
466
+ '0I' => 'iTruck',
467
+ 'I8' => 'iVA',
468
+ 'IE' => 'iView',
469
+ '0J' => 'iVooMi',
470
+ 'UI' => 'ivvi',
471
+ 'I9' => 'iZotron',
472
+ 'JA' => 'JAY-Tech',
473
+ 'KJ' => 'Jiake',
474
+ 'J6' => 'Jeka',
475
+ 'JF' => 'JFone',
476
+ 'JI' => 'Jiayu',
477
+ 'JG' => 'Jinga',
478
+ 'VJ' => 'Jivi',
479
+ 'JK' => 'JKL',
480
+ 'JO' => 'Jolla',
481
+ 'J5' => 'Just5',
482
+ 'JV' => 'JVC',
483
+ 'JS' => 'Jesy',
484
+ 'KT' => 'K-Touch',
485
+ 'K4' => 'Kaan',
486
+ 'K7' => 'Kaiomy',
487
+ 'KL' => 'Kalley',
488
+ 'K6' => 'Kanji',
489
+ 'KA' => 'Karbonn',
490
+ 'K5' => 'KATV1',
491
+ 'K0' => 'Kata',
492
+ 'KZ' => 'Kazam',
493
+ 'KD' => 'KDDI',
494
+ 'KS' => 'Kempler & Strauss',
495
+ 'K3' => 'Keneksi',
496
+ 'KX' => 'Kenxinda',
497
+ 'K1' => 'Kiano',
498
+ 'KI' => 'Kingsun',
499
+ 'KF' => 'KINGZONE',
500
+ '46' => 'Kiowa',
501
+ 'KV' => 'Kivi',
502
+ '64' => 'Kvant',
503
+ '0K' => 'Klipad',
504
+ 'KC' => 'Kocaso',
505
+ 'KK' => 'Kodak',
506
+ 'KG' => 'Kogan',
507
+ 'KM' => 'Komu',
508
+ 'KO' => 'Konka',
509
+ 'KW' => 'Konrow',
510
+ 'KB' => 'Koobee',
511
+ '7K' => 'Koolnee',
512
+ 'K9' => 'Kooper',
513
+ 'KP' => 'KOPO',
514
+ 'KR' => 'Koridy',
515
+ 'K2' => 'KRONO',
516
+ 'KE' => 'Krüger&Matz',
517
+ '5K' => 'KREZ',
518
+ 'KH' => 'KT-Tech',
519
+ 'Z6' => 'KUBO',
520
+ 'K8' => 'Kuliao',
521
+ '8K' => 'Kult',
522
+ 'KU' => 'Kumai',
523
+ '6K' => 'Kurio',
524
+ 'KY' => 'Kyocera',
525
+ 'KQ' => 'Kyowon',
526
+ '1K' => 'Kzen',
527
+ 'LQ' => 'LAIQ',
528
+ 'L6' => 'Land Rover',
529
+ 'L2' => 'Landvo',
530
+ 'LA' => 'Lanix',
531
+ 'LK' => 'Lark',
532
+ 'Z3' => 'Laurus',
533
+ 'LV' => 'Lava',
534
+ 'LC' => 'LCT',
535
+ 'L5' => 'Leagoo',
536
+ 'U3' => 'Leben',
537
+ 'LD' => 'Ledstar',
538
+ 'L1' => 'LeEco',
539
+ '4B' => 'Leff',
540
+ 'L4' => 'Lemhoov',
541
+ 'LN' => 'Lenco',
542
+ 'LE' => 'Lenovo',
543
+ 'LT' => 'Leotec',
544
+ 'LP' => 'Le Pan',
545
+ 'L7' => 'Lephone',
546
+ 'LZ' => 'Lesia',
547
+ 'L3' => 'Lexand',
548
+ 'LX' => 'Lexibook',
549
+ 'LG' => 'LG',
550
+ 'LF' => 'Lifemaxx',
551
+ 'LJ' => 'L-Max',
552
+ 'LI' => 'Lingwin',
553
+ '5L' => 'Linsar',
554
+ 'LW' => 'Linnex',
555
+ 'LO' => 'Loewe',
556
+ 'YL' => 'Loview',
557
+ '1L' => 'Logic',
558
+ 'LM' => 'Logicom',
559
+ '0L' => 'Lumigon',
560
+ 'LU' => 'Lumus',
561
+ 'L9' => 'Luna',
562
+ 'LR' => 'Luxor',
563
+ 'LY' => 'LYF',
564
+ 'LL' => 'Leader Phone',
565
+ 'QL' => 'LT Mobile',
566
+ 'MQ' => 'M.T.T.',
567
+ 'MN' => 'M4tel',
568
+ 'XM' => 'Macoox',
569
+ '92' => 'MAC AUDIO',
570
+ 'MJ' => 'Majestic',
571
+ '23' => 'Magnus',
572
+ 'NH' => 'Manhattan',
573
+ '5M' => 'Mann',
574
+ 'MA' => 'Manta Multimedia',
575
+ 'Z0' => 'Mantra',
576
+ 'J4' => 'Mara',
577
+ '2M' => 'Masstel',
578
+ '50' => 'Matrix',
579
+ '7M' => 'Maxcom',
580
+ 'ZM' => 'Maximus',
581
+ '6X' => 'Maxtron',
582
+ '0D' => 'MAXVI',
583
+ 'MW' => 'Maxwest',
584
+ 'M0' => 'Maze',
585
+ 'YM' => 'Maze Speed',
586
+ '87' => 'Malata',
587
+ '3D' => 'MDC Store',
588
+ '09' => 'meanIT',
589
+ 'M3' => 'Mecer',
590
+ '0M' => 'Mecool',
591
+ 'MC' => 'Mediacom',
592
+ 'MK' => 'MediaTek',
593
+ 'MD' => 'Medion',
594
+ 'M2' => 'MEEG',
595
+ 'MP' => 'MegaFon',
596
+ 'X0' => 'mPhone',
597
+ '3M' => 'Meitu',
598
+ 'M1' => 'Meizu',
599
+ '0E' => 'Melrose',
600
+ 'MU' => 'Memup',
601
+ 'ME' => 'Metz',
602
+ 'MX' => 'MEU',
603
+ 'MI' => 'MicroMax',
604
+ 'MS' => 'Microsoft',
605
+ '1X' => 'Minix',
606
+ 'OM' => 'Mintt',
607
+ 'MO' => 'Mio',
608
+ 'M7' => 'Miray',
609
+ '8M' => 'Mito',
610
+ 'MT' => 'Mitsubishi',
611
+ 'M5' => 'MIXC',
612
+ '2D' => 'MIVO',
613
+ '1Z' => 'MiXzo',
614
+ 'ML' => 'MLLED',
615
+ 'LS' => 'MLS',
616
+ '4M' => 'Mobicel',
617
+ 'M6' => 'Mobiistar',
618
+ 'MH' => 'Mobiola',
619
+ 'MB' => 'Mobistel',
620
+ '6W' => 'MobiWire',
621
+ '9M' => 'Mobo',
622
+ 'M4' => 'Modecom',
623
+ 'MF' => 'Mofut',
624
+ 'MR' => 'Motorola',
625
+ 'MV' => 'Movic',
626
+ 'MM' => 'Mpman',
627
+ 'MZ' => 'MSI',
628
+ '3R' => 'MStar',
629
+ 'M9' => 'MTC',
630
+ 'N4' => 'MTN',
631
+ '72' => 'M-Tech',
632
+ '9H' => 'M-Horse',
633
+ '1R' => 'Multilaser',
634
+ '1M' => 'MYFON',
635
+ 'MY' => 'MyPhone',
636
+ '51' => 'Myros',
637
+ 'M8' => 'Myria',
638
+ '6M' => 'Mystery',
639
+ '3T' => 'MyTab',
640
+ 'MG' => 'MyWigo',
641
+ 'J3' => 'Mymaga',
642
+ '08' => 'Nabi',
643
+ 'N7' => 'National',
644
+ 'NC' => 'Navcity',
645
+ '6N' => 'Navitech',
646
+ '7V' => 'Navitel',
647
+ 'N3' => 'Navon',
648
+ 'NP' => 'Naomi Phone',
649
+ 'NE' => 'NEC',
650
+ '8N' => 'Necnot',
651
+ 'NF' => 'Neffos',
652
+ '1N' => 'Neomi',
653
+ 'NA' => 'Netgear',
654
+ 'NU' => 'NeuImage',
655
+ 'NW' => 'Newgen',
656
+ 'N9' => 'Newland',
657
+ '0N' => 'Newman',
658
+ 'NS' => 'NewsMy',
659
+ 'ND' => 'Newsday',
660
+ 'HB' => 'New Balance',
661
+ 'XB' => 'NEXBOX',
662
+ 'NX' => 'Nexian',
663
+ 'N8' => 'NEXON',
664
+ 'N2' => 'Nextbit',
665
+ 'NT' => 'NextBook',
666
+ '4N' => 'NextTab',
667
+ 'NG' => 'NGM',
668
+ 'NZ' => 'NG Optics',
669
+ 'NN' => 'Nikon',
670
+ 'NI' => 'Nintendo',
671
+ 'N5' => 'NOA',
672
+ 'N1' => 'Noain',
673
+ 'N6' => 'Nobby',
674
+ '57' => 'Nubia',
675
+ 'JN' => 'NOBUX',
676
+ 'NB' => 'Noblex',
677
+ 'NK' => 'Nokia',
678
+ 'NM' => 'Nomi',
679
+ '2N' => 'Nomu',
680
+ 'NR' => 'Nordmende',
681
+ '7N' => 'NorthTech',
682
+ '5N' => 'Nos',
683
+ 'NO' => 'Nous',
684
+ 'NQ' => 'Novex',
685
+ 'NJ' => 'NuAns',
686
+ 'NL' => 'NUU Mobile',
687
+ 'N0' => 'Nuvo',
688
+ 'NV' => 'Nvidia',
689
+ 'NY' => 'NYX Mobile',
690
+ 'O3' => 'O+',
691
+ 'OT' => 'O2',
692
+ 'O7' => 'Oale',
693
+ 'OC' => 'OASYS',
694
+ 'OB' => 'Obi',
695
+ 'O1' => 'Odys',
696
+ 'O9' => 'Ok',
697
+ 'OA' => 'Okapia',
698
+ 'OD' => 'Onda',
699
+ 'ON' => 'OnePlus',
700
+ 'OX' => 'Onix',
701
+ '3O' => 'ONYX BOOX',
702
+ 'O4' => 'ONN',
703
+ '2O' => 'OpelMobile',
704
+ 'OH' => 'Openbox',
705
+ 'OP' => 'OPPO',
706
+ 'OO' => 'Opsson',
707
+ 'OR' => 'Orange',
708
+ 'O5' => 'Orbic',
709
+ 'OS' => 'Ordissimo',
710
+ 'OK' => 'Ouki',
711
+ '0O' => 'OINOM',
712
+ 'QK' => 'OKWU',
713
+ 'OE' => 'Oukitel',
714
+ 'OU' => 'OUYA',
715
+ 'OV' => 'Overmax',
716
+ '30' => 'Ovvi',
717
+ 'O2' => 'Owwo',
718
+ 'OY' => 'Oysters',
719
+ 'O6' => 'Oyyu',
720
+ 'OZ' => 'OzoneHD',
721
+ '7P' => 'P-UP',
722
+ 'PM' => 'Palm',
723
+ 'PN' => 'Panacom',
724
+ 'PA' => 'Panasonic',
725
+ 'PT' => 'Pantech',
726
+ '94' => 'Packard Bell',
727
+ 'PB' => 'PCBOX',
728
+ 'PC' => 'PCD',
729
+ 'PD' => 'PCD Argentina',
730
+ 'PE' => 'PEAQ',
731
+ 'PG' => 'Pentagram',
732
+ 'PQ' => 'Pendoo',
733
+ '93' => 'Perfeo',
734
+ '1P' => 'Phicomm',
735
+ '4P' => 'Philco',
736
+ 'PH' => 'Philips',
737
+ '5P' => 'Phonemax',
738
+ 'PO' => 'phoneOne',
739
+ 'PI' => 'Pioneer',
740
+ 'PJ' => 'PiPO',
741
+ '8P' => 'Pixelphone',
742
+ '9O' => 'Pixela',
743
+ 'PX' => 'Pixus',
744
+ 'QP' => 'Pico',
745
+ '9P' => 'Planet Computers',
746
+ 'PY' => 'Ployer',
747
+ 'P4' => 'Plum',
748
+ '22' => 'Pluzz',
749
+ 'P8' => 'PocketBook',
750
+ '0P' => 'POCO',
751
+ 'PV' => 'Point of View',
752
+ 'PL' => 'Polaroid',
753
+ 'PP' => 'PolyPad',
754
+ 'P5' => 'Polytron',
755
+ 'P2' => 'Pomp',
756
+ 'P0' => 'Poppox',
757
+ 'PS' => 'Positivo',
758
+ '3P' => 'Positivo BGH',
759
+ 'P3' => 'PPTV',
760
+ 'FP' => 'Premio',
761
+ 'PR' => 'Prestigio',
762
+ 'P9' => 'Primepad',
763
+ '6P' => 'Primux',
764
+ '2P' => 'Prixton',
765
+ 'PF' => 'PROFiLO',
766
+ 'P6' => 'Proline',
767
+ 'P1' => 'ProScan',
768
+ 'P7' => 'Protruly',
769
+ 'R0' => 'ProVision',
770
+ 'PU' => 'PULID',
771
+ 'QH' => 'Q-Touch',
772
+ 'QB' => 'Q.Bell',
773
+ 'QI' => 'Qilive',
774
+ 'QM' => 'QMobile',
775
+ 'QT' => 'Qtek',
776
+ 'QA' => 'Quantum',
777
+ 'QU' => 'Quechua',
778
+ 'QO' => 'Qumo',
779
+ 'UQ' => 'Qubo',
780
+ 'QY' => 'Qnet Mobile',
781
+ 'R2' => 'R-TV',
782
+ 'RA' => 'Ramos',
783
+ '0R' => 'Raspberry',
784
+ 'R9' => 'Ravoz',
785
+ 'RZ' => 'Razer',
786
+ '95' => 'Rakuten',
787
+ 'RC' => 'RCA Tablets',
788
+ '2R' => 'Reach',
789
+ 'RB' => 'Readboy',
790
+ 'RE' => 'Realme',
791
+ 'R8' => 'RED',
792
+ 'RD' => 'Reeder',
793
+ 'Z9' => 'REGAL',
794
+ 'RP' => 'Revo',
795
+ 'RI' => 'Rikomagic',
796
+ 'RM' => 'RIM',
797
+ 'RN' => 'Rinno',
798
+ 'RX' => 'Ritmix',
799
+ 'R7' => 'Ritzviva',
800
+ 'RV' => 'Riviera',
801
+ '6R' => 'Rivo',
802
+ 'RR' => 'Roadrover',
803
+ 'R1' => 'Rokit',
804
+ 'RK' => 'Roku',
805
+ 'R3' => 'Rombica',
806
+ 'R5' => 'Ross&Moor',
807
+ 'RO' => 'Rover',
808
+ 'R6' => 'RoverPad',
809
+ 'RQ' => 'RoyQueen',
810
+ 'RT' => 'RT Project',
811
+ 'RG' => 'RugGear',
812
+ 'RU' => 'Runbo',
813
+ 'RL' => 'Ruio',
814
+ 'RY' => 'Ryte',
815
+ 'X5' => 'Saba',
816
+ '8L' => 'S-TELL',
817
+ '89' => 'Seatel',
818
+ 'X1' => 'Safaricom',
819
+ 'SG' => 'Sagem',
820
+ '4L' => 'Salora',
821
+ 'SA' => 'Samsung',
822
+ 'S0' => 'Sanei',
823
+ '12' => 'Sansui',
824
+ 'SQ' => 'Santin',
825
+ 'SY' => 'Sanyo',
826
+ 'S9' => 'Savio',
827
+ 'Y4' => 'SCBC',
828
+ 'CZ' => 'Schneider',
829
+ 'G8' => 'SEG',
830
+ 'SD' => 'Sega',
831
+ '9G' => 'Selenga',
832
+ 'SV' => 'Selevision',
833
+ 'SL' => 'Selfix',
834
+ '0S' => 'SEMP TCL',
835
+ 'S1' => 'Sencor',
836
+ 'SN' => 'Sendo',
837
+ '01' => 'Senkatel',
838
+ 'S6' => 'Senseit',
839
+ 'EW' => 'Senwa',
840
+ '24' => 'Seeken',
841
+ '61' => 'Seuic',
842
+ 'SX' => 'SFR',
843
+ 'SH' => 'Sharp',
844
+ '7S' => 'Shift Phones',
845
+ 'RS' => 'Shtrikh-M',
846
+ '3S' => 'Shuttle',
847
+ '13' => 'Sico',
848
+ 'SI' => 'Siemens',
849
+ '1S' => 'Sigma',
850
+ '70' => 'Silelis',
851
+ 'SJ' => 'Silent Circle',
852
+ '10' => 'Simbans',
853
+ '98' => 'Simply',
854
+ '52' => 'Singtech',
855
+ '31' => 'Siragon',
856
+ '83' => 'Sirin labs',
857
+ 'GK' => 'SKG',
858
+ 'SW' => 'Sky',
859
+ 'SK' => 'Skyworth',
860
+ '14' => 'Smadl',
861
+ '19' => 'Smailo',
862
+ 'SR' => 'Smart Electronic',
863
+ '49' => 'Smart',
864
+ '47' => 'SmartBook',
865
+ '3B' => 'Smartab',
866
+ '80' => 'SMARTEC',
867
+ 'SC' => 'Smartfren',
868
+ 'S7' => 'Smartisan',
869
+ '1Q' => 'Smotreshka',
870
+ 'SF' => 'Softbank',
871
+ '9L' => 'SOLE',
872
+ 'JL' => 'SOLO',
873
+ '16' => 'Solone',
874
+ 'OI' => 'Sonim',
875
+ 'SO' => 'Sony',
876
+ 'SE' => 'Sony Ericsson',
877
+ 'X2' => 'Soundmax',
878
+ '8S' => 'Soyes',
879
+ '77' => 'SONOS',
880
+ 'PK' => 'Spark',
881
+ 'FS' => 'SPC',
882
+ '6S' => 'Spectrum',
883
+ '43' => 'Spectralink',
884
+ 'SP' => 'Spice',
885
+ '84' => 'Sprint',
886
+ 'QS' => 'SQOOL',
887
+ 'S4' => 'Star',
888
+ 'OL' => 'Starlight',
889
+ '18' => 'Starmobile',
890
+ '2S' => 'Starway',
891
+ '45' => 'Starwind',
892
+ 'SB' => 'STF Mobile',
893
+ 'S8' => 'STK',
894
+ 'GQ' => 'STG Telecom',
895
+ 'S2' => 'Stonex',
896
+ 'ST' => 'Storex',
897
+ '71' => 'StrawBerry',
898
+ '69' => 'Stylo',
899
+ '9S' => 'Sugar',
900
+ '06' => 'Subor',
901
+ 'SZ' => 'Sumvision',
902
+ '0H' => 'Sunstech',
903
+ 'S3' => 'SunVan',
904
+ '5S' => 'Sunvell',
905
+ '5Y' => 'Sunny',
906
+ 'SU' => 'SuperSonic',
907
+ '79' => 'SuperTab',
908
+ 'S5' => 'Supra',
909
+ 'ZS' => 'Suzuki',
910
+ '0W' => 'Swipe',
911
+ 'SS' => 'SWISSMOBILITY',
912
+ '1W' => 'Swisstone',
913
+ 'W7' => 'SWTV',
914
+ 'SM' => 'Symphony',
915
+ '4S' => 'Syrox',
916
+ 'TM' => 'T-Mobile',
917
+ 'TK' => 'Takara',
918
+ '73' => 'Tambo',
919
+ '9N' => 'Tanix',
920
+ 'T5' => 'TB Touch',
921
+ 'TC' => 'TCL',
922
+ 'T0' => 'TD Systems',
923
+ 'H4' => 'Technicolor',
924
+ 'Z5' => 'Technika',
925
+ 'TX' => 'TechniSat',
926
+ 'TT' => 'TechnoTrend',
927
+ 'TP' => 'TechPad',
928
+ '9E' => 'Techwood',
929
+ 'T7' => 'Teclast',
930
+ 'TB' => 'Tecno Mobile',
931
+ '91' => 'TEENO',
932
+ '2L' => 'Tele2',
933
+ 'TL' => 'Telefunken',
934
+ 'TG' => 'Telego',
935
+ 'T2' => 'Telenor',
936
+ 'TE' => 'Telit',
937
+ '65' => 'Telia',
938
+ 'TD' => 'Tesco',
939
+ 'TA' => 'Tesla',
940
+ '9T' => 'Tetratab',
941
+ 'TZ' => 'teXet',
942
+ '29' => 'Teknosa',
943
+ 'T4' => 'ThL',
944
+ 'TN' => 'Thomson',
945
+ 'O0' => 'Thuraya',
946
+ 'TI' => 'TIANYU',
947
+ '8T' => 'Time2',
948
+ 'TQ' => 'Timovi',
949
+ '2T' => 'Tinai',
950
+ 'TF' => 'Tinmo',
951
+ 'TH' => 'TiPhone',
952
+ 'Y3' => 'TOKYO',
953
+ 'T1' => 'Tolino',
954
+ '0T' => 'Tone',
955
+ 'TY' => 'Tooky',
956
+ 'T9' => 'Top House',
957
+ '42' => 'Topway',
958
+ 'TO' => 'Toplux',
959
+ '7T' => 'Torex',
960
+ 'TS' => 'Toshiba',
961
+ 'T8' => 'Touchmate',
962
+ '5R' => 'Transpeed',
963
+ 'T6' => 'TrekStor',
964
+ 'T3' => 'Trevi',
965
+ 'TJ' => 'Trifone',
966
+ '4T' => 'Tronsmart',
967
+ '11' => 'True',
968
+ 'JT' => 'True Slim',
969
+ 'J1' => 'Trio',
970
+ '5C' => 'TTEC',
971
+ 'TU' => 'Tunisie Telecom',
972
+ '1T' => 'Turbo',
973
+ 'TR' => 'Turbo-X',
974
+ '5X' => 'TurboPad',
975
+ '5T' => 'TurboKids',
976
+ 'TV' => 'TVC',
977
+ 'TW' => 'TWM',
978
+ 'Z1' => 'TWZ',
979
+ '6T' => 'Twoe',
980
+ '15' => 'Tymes',
981
+ 'UC' => 'U.S. Cellular',
982
+ 'UG' => 'Ugoos',
983
+ 'U1' => 'Uhans',
984
+ 'UH' => 'Uhappy',
985
+ 'UL' => 'Ulefone',
986
+ 'UA' => 'Umax',
987
+ 'UM' => 'UMIDIGI',
988
+ 'UZ' => 'Unihertz',
989
+ '3Z' => 'UZ Mobile',
990
+ 'UX' => 'Unimax',
991
+ 'US' => 'Uniscope',
992
+ 'U2' => 'UNIWA',
993
+ 'UO' => 'Unnecto',
994
+ 'UU' => 'Unonu',
995
+ 'UN' => 'Unowhy',
996
+ 'UK' => 'UTOK',
997
+ '3U' => 'IUNI',
998
+ 'UT' => 'UTStarcom',
999
+ '6U' => 'UTime',
1000
+ '5V' => 'VAIO',
1001
+ 'WV' => 'VAVA',
1002
+ 'VA' => 'Vastking',
1003
+ 'VP' => 'Vargo',
1004
+ 'VB' => 'VC',
1005
+ 'VN' => 'Venso',
1006
+ 'VQ' => 'Vega',
1007
+ '4V' => 'Verico',
1008
+ 'V4' => 'Verizon',
1009
+ 'VR' => 'Vernee',
1010
+ 'VX' => 'Vertex',
1011
+ 'VE' => 'Vertu',
1012
+ 'VL' => 'Verykool',
1013
+ 'V8' => 'Vesta',
1014
+ 'VT' => 'Vestel',
1015
+ '48' => 'Vexia',
1016
+ 'V6' => 'VGO TEL',
1017
+ 'VD' => 'Videocon',
1018
+ 'VW' => 'Videoweb',
1019
+ 'VS' => 'ViewSonic',
1020
+ 'V7' => 'Vinga',
1021
+ 'V3' => 'Vinsoc',
1022
+ '0V' => 'Vipro',
1023
+ 'VI' => 'Vitelcom',
1024
+ '8V' => 'Viumee',
1025
+ 'V5' => 'Vivax',
1026
+ 'VV' => 'Vivo',
1027
+ '6V' => 'VIWA',
1028
+ 'VZ' => 'Vizio',
1029
+ '9V' => 'Vision Touch',
1030
+ 'VK' => 'VK Mobile',
1031
+ 'JM' => 'v-mobile',
1032
+ 'V0' => 'VKworld',
1033
+ 'VM' => 'Vodacom',
1034
+ 'VF' => 'Vodafone',
1035
+ 'V2' => 'Vonino',
1036
+ '1V' => 'Vontar',
1037
+ 'VG' => 'Vorago',
1038
+ '2V' => 'Vorke',
1039
+ 'V1' => 'Voto',
1040
+ 'Z7' => 'VOX',
1041
+ 'VO' => 'Voxtel',
1042
+ 'VY' => 'Voyo',
1043
+ 'VH' => 'Vsmart',
1044
+ 'V9' => 'Vsun',
1045
+ 'VU' => 'Vulcan',
1046
+ '3V' => 'VVETIME',
1047
+ 'WA' => 'Walton',
1048
+ 'WM' => 'Weimei',
1049
+ 'WE' => 'WellcoM',
1050
+ 'W6' => 'WELLINGTON',
1051
+ 'WD' => 'Western Digital',
1052
+ 'WT' => 'Westpoint',
1053
+ 'WY' => 'Wexler',
1054
+ '3W' => 'WE',
1055
+ 'WP' => 'Wieppo',
1056
+ 'W2' => 'Wigor',
1057
+ 'WI' => 'Wiko',
1058
+ 'WF' => 'Wileyfox',
1059
+ 'WS' => 'Winds',
1060
+ 'WN' => 'Wink',
1061
+ '9W' => 'Winmax',
1062
+ 'W5' => 'Winnovo',
1063
+ 'WU' => 'Wintouch',
1064
+ 'W0' => 'Wiseasy',
1065
+ '2W' => 'Wizz',
1066
+ 'W4' => 'WIWA',
1067
+ 'WL' => 'Wolder',
1068
+ 'WG' => 'Wolfgang',
1069
+ 'WO' => 'Wonu',
1070
+ 'W1' => 'Woo',
1071
+ 'WR' => 'Wortmann',
1072
+ 'WX' => 'Woxter',
1073
+ 'X3' => 'X-BO',
1074
+ 'XT' => 'X-TIGI',
1075
+ 'XV' => 'X-View',
1076
+ 'X4' => 'X.Vision',
1077
+ 'XG' => 'Xgody',
1078
+ 'QX' => 'XGIMI',
1079
+ 'XL' => 'Xiaolajiao',
1080
+ 'XI' => 'Xiaomi',
1081
+ 'XN' => 'Xion',
1082
+ 'XO' => 'Xolo',
1083
+ 'XR' => 'Xoro',
1084
+ 'XS' => 'Xshitou',
1085
+ '4X' => 'Xtouch',
1086
+ 'X8' => 'Xtratech',
1087
+ 'YD' => 'Yandex',
1088
+ 'YA' => 'Yarvik',
1089
+ 'Y2' => 'Yes',
1090
+ 'YE' => 'Yezz',
1091
+ 'YK' => 'Yoka TV',
1092
+ 'YO' => 'Yota',
1093
+ 'YT' => 'Ytone',
1094
+ 'Y1' => 'Yu',
1095
+ 'Y0' => 'YUHO',
1096
+ 'YN' => 'Yuno',
1097
+ 'YU' => 'Yuandao',
1098
+ 'YS' => 'Yusun',
1099
+ 'YJ' => 'YASIN',
1100
+ 'YX' => 'Yxtel',
1101
+ '0Z' => 'Zatec',
1102
+ '2Z' => 'Zaith',
1103
+ 'PZ' => 'Zebra',
1104
+ 'ZE' => 'Zeemi',
1105
+ 'ZN' => 'Zen',
1106
+ 'ZK' => 'Zenek',
1107
+ 'ZL' => 'Zentality',
1108
+ 'ZF' => 'Zfiner',
1109
+ 'ZI' => 'Zidoo',
1110
+ 'FZ' => 'ZIFRO',
1111
+ 'ZX' => 'Ziox',
1112
+ 'ZO' => 'Zonda',
1113
+ 'ZP' => 'Zopo',
1114
+ 'ZT' => 'ZTE',
1115
+ 'ZU' => 'Zuum',
1116
+ 'ZY' => 'Zync',
1117
+ 'ZQ' => 'ZYQ',
1118
+ 'Z4' => 'ZH&K',
1119
+ 'OW' => 'öwn',
1120
+ # legacy brands, might be removed in future versions
1121
+ 'WB' => 'Web TV',
1122
+ 'XX' => 'Unknown'
1123
+ }.freeze
1124
+
22
1125
  def known?
23
1126
  regex_meta.any?
24
1127
  end
@@ -28,7 +1131,11 @@ class DeviceDetector
28
1131
  end
29
1132
 
30
1133
  def type
31
- hbbtv? ? 'tv' : regex_meta[:device]
1134
+ if hbbtv? || shelltv?
1135
+ 'tv'
1136
+ else
1137
+ regex_meta[:device]
1138
+ end
32
1139
  end
33
1140
 
34
1141
  def brand
@@ -42,18 +1149,21 @@ class DeviceDetector
42
1149
  def filenames
43
1150
  [
44
1151
  'device/televisions.yml',
1152
+ 'device/shell_tv.yml',
1153
+ 'device/notebooks.yml',
45
1154
  'device/consoles.yml',
46
1155
  'device/car_browsers.yml',
47
1156
  'device/cameras.yml',
48
1157
  'device/portable_media_player.yml',
49
- 'device/mobiles.yml',
50
- 'device/notebooks.yml'
1158
+ 'device/mobiles.yml'
51
1159
  ]
52
1160
  end
53
1161
 
54
1162
  def matching_regex
55
1163
  from_cache([self.class.name, user_agent]) do
56
1164
  regex_list = hbbtv? ? regexes_for_hbbtv : regexes_other
1165
+ regex_list = shelltv? ? regexes_for_shelltv : regex_list
1166
+
57
1167
  regex = regex_find(user_agent, regex_list)
58
1168
  if regex && regex[:models]
59
1169
  model_regex = regex[:models].find { |m| user_agent =~ m[:regex] }
@@ -63,6 +1173,7 @@ class DeviceDetector
63
1173
  model: model_regex[:model],
64
1174
  brand: model_regex[:brand]
65
1175
  })
1176
+ regex[:brand] = DEVICE_BRANDS[regex[:brand]] if DEVICE_BRANDS.key?(regex[:brand])
66
1177
  regex[:device] = model_regex[:device] if model_regex.key?(:device)
67
1178
  regex.delete(:models)
68
1179
  end
@@ -93,10 +1204,19 @@ class DeviceDetector
93
1204
  user_agent =~ @regex_hbbtv
94
1205
  end
95
1206
 
1207
+ def shelltv?
1208
+ @regex_shelltv ||= build_regex('[a-z]+[ _]Shell[ _]\w{6}')
1209
+ user_agent =~ @regex_shelltv
1210
+ end
1211
+
96
1212
  def regexes_for_hbbtv
97
1213
  regexes.select { |r| r[:path] == :'device/televisions.yml' }
98
1214
  end
99
1215
 
1216
+ def regexes_for_shelltv
1217
+ regexes.select { |r| r[:path] == :'device/shell_tv.yml' }
1218
+ end
1219
+
100
1220
  def regexes_other
101
1221
  regexes.reject { |r| r[:path] == :'device/televisions.yml' }
102
1222
  end