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