device_detector 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -3
  3. data/CHANGELOG.md +10 -5
  4. data/README.md +4 -4
  5. data/Rakefile +24 -19
  6. data/device_detector.gemspec +1 -1
  7. data/lib/device_detector.rb +25 -3
  8. data/lib/device_detector/device.rb +1 -1
  9. data/lib/device_detector/model_extractor.rb +4 -0
  10. data/lib/device_detector/os.rb +8 -3
  11. data/lib/device_detector/parser.rb +1 -1
  12. data/lib/device_detector/version.rb +1 -1
  13. data/regexes/bots.yml +211 -27
  14. data/regexes/client/browsers.yml +192 -58
  15. data/regexes/client/feed_readers.yml +6 -0
  16. data/regexes/client/libraries.yml +4 -0
  17. data/regexes/client/mediaplayers.yml +8 -4
  18. data/regexes/client/mobile_apps.yml +39 -4
  19. data/regexes/client/pim.yml +4 -0
  20. data/regexes/device/mobiles.yml +1803 -242
  21. data/regexes/device/televisions.yml +53 -11
  22. data/regexes/oss.yml +180 -12
  23. data/regexes/vendorfragments.yml +1 -0
  24. data/spec/device_detector/concrete_user_agent_spec.rb +36 -0
  25. data/spec/device_detector/detector_fixtures_spec.rb +1 -1
  26. data/spec/fixtures/client/browser.yml +313 -2
  27. data/spec/fixtures/client/feed_reader.yml +8 -1
  28. data/spec/fixtures/client/library.yml +7 -1
  29. data/spec/fixtures/client/mediaplayer.yml +6 -1
  30. data/spec/fixtures/client/mobile_app.yml +6 -0
  31. data/spec/fixtures/client/pim.yml +6 -0
  32. data/spec/fixtures/detector/bots.yml +2307 -612
  33. data/spec/fixtures/detector/camera.yml +6 -0
  34. data/spec/fixtures/detector/car_browser.yml +1 -0
  35. data/spec/fixtures/detector/console.yml +14 -0
  36. data/spec/fixtures/detector/desktop.yml +308 -48
  37. data/spec/fixtures/detector/feature_phone.yml +63 -0
  38. data/spec/fixtures/detector/feed_reader.yml +50 -26
  39. data/spec/fixtures/detector/mediaplayer.yml +28 -6
  40. data/spec/fixtures/detector/mobile_apps.yml +117 -0
  41. data/spec/fixtures/detector/phablet.yml +1066 -183
  42. data/spec/fixtures/detector/portable_media_player.yml +8 -0
  43. data/spec/fixtures/detector/smart_display.yml +39 -0
  44. data/spec/fixtures/detector/smartphone-1.yml +9469 -0
  45. data/spec/fixtures/detector/smartphone-2.yml +9414 -0
  46. data/spec/fixtures/detector/smartphone-3.yml +9396 -0
  47. data/spec/fixtures/detector/smartphone-4.yml +5742 -0
  48. data/spec/fixtures/detector/smartphone.yml +3446 -23680
  49. data/spec/fixtures/detector/tablet-1.yml +9495 -0
  50. data/spec/fixtures/detector/tablet-2.yml +248 -0
  51. data/spec/fixtures/detector/tablet.yml +2786 -7961
  52. data/spec/fixtures/detector/tv.yml +1376 -210
  53. data/spec/fixtures/detector/unknown.yml +205 -509
  54. data/spec/fixtures/device/console.yml +6 -0
  55. data/spec/fixtures/parser/oss.yml +194 -1
  56. data/spec/fixtures/parser/vendorfragments.yml +6 -0
  57. metadata +16 -6
  58. data/spec/fixtures/parser/bots.yml +0 -2055
@@ -100,3 +100,9 @@
100
100
  version: '$1'
101
101
  url: 'http://www.rssowl.org/'
102
102
  type: 'Feed Reader'
103
+
104
+ - regex: 'Stringer'
105
+ name: 'Stringer'
106
+ version: ''
107
+ url: 'https://github.com/swanson/stringer'
108
+ type: 'Feed Reader'
@@ -9,6 +9,10 @@
9
9
  name: 'Wget'
10
10
  version: '$1'
11
11
 
12
+ - regex: 'Guzzle(?:/(\d+[\.\d]+))?'
13
+ name: 'Guzzle (PHP HTTP Client)'
14
+ version: '$1'
15
+
12
16
  - regex: '(?:lib)?curl(?:/(\d+[\.\d]+))?'
13
17
  name: 'curl'
14
18
  version: '$1'
@@ -9,6 +9,10 @@
9
9
  name: 'Banshee'
10
10
  version: '$1'
11
11
 
12
+ - regex: 'Boxee(?:[ /]([\d\.]+))?'
13
+ name: 'Boxee'
14
+ version: '$1'
15
+
12
16
  - regex: 'Clementine(?:[ /]([\d\.]+))?'
13
17
  name: 'Clementine'
14
18
  version: '$1'
@@ -49,7 +53,7 @@
49
53
  name: 'SubStream'
50
54
  version: '$1'
51
55
 
52
- - regex: 'VLC(?:/([\d\.]+))?'
56
+ - regex: '(?:Lib)?VLC(?:/([\d\.]+))?'
53
57
  name: 'VLC'
54
58
  version: '$1'
55
59
 
@@ -57,7 +61,7 @@
57
61
  name: 'Winamp'
58
62
  version: '$1'
59
63
 
60
- - regex: 'Windows-Media-Player(?:/(\d+[\.\d]+))?'
64
+ - regex: '(?:Windows-Media-Player|NSPlayer)(?:/(\d+[\.\d]+))?'
61
65
  name: 'Windows Media Player'
62
66
  version: '$1'
63
67
 
@@ -73,6 +77,6 @@
73
77
  name: 'Stagefright'
74
78
  version: '$1'
75
79
 
76
- - regex: 'Instacast\/([\d\.]+) CFNetwork\/([\d\.]+)'
80
+ - regex: 'Instacast(?:/([\d\.]+))? CFNetwork/([\d\.]+)'
77
81
  name: 'Instacast'
78
- version: '$1'
82
+ version: '$1'
@@ -10,16 +10,26 @@
10
10
  name: 'AndroidDownloadManager'
11
11
  version: '$1'
12
12
 
13
- # AFNetworking generic
14
- - regex: '([^/]+)/(\d+(?:\.\d+)+) \((?:iPhone|iPad); iOS [0-9\.]+; Scale/[0-9\.]+\)'
15
- name: '$1'
16
- version: '$2'
13
+ # Facebook
14
+ - regex: '(?:FBAV|com.facebook.katana)(?:[ /]([\d\.]+))?'
15
+ name: 'Facebook'
16
+ version: '$1'
17
17
 
18
18
  # FeedR
19
19
  - regex: 'FeedR(?:/([\d\.]+))?'
20
20
  name: 'FeedR'
21
21
  version: '$1'
22
22
 
23
+ # Google Play Kiosk
24
+ - regex: 'com.google.android.apps.magazines'
25
+ name: 'Google Play Newsstand'
26
+ version: ''
27
+
28
+ # Google Plus
29
+ - regex: 'com.google.GooglePlus'
30
+ name: 'Google Plus'
31
+ version: ''
32
+
23
33
  # WeChat
24
34
  - regex: 'MicroMessenger/([^ ]+)'
25
35
  name: 'WeChat'
@@ -29,3 +39,28 @@
29
39
  - regex: '.*__weibo__([0-9\.]+)__'
30
40
  name: 'Sina Weibo'
31
41
  version: '$1'
42
+
43
+ # Pinterest
44
+ - regex: 'Pinterest(?:/([\d\.]+))?'
45
+ name: 'Pinterest'
46
+ version: '$1'
47
+
48
+ # YouTube
49
+ - regex: 'com.google.android.youtube(?:/([\d\.]+))?'
50
+ name: 'YouTube'
51
+ version: '$1'
52
+
53
+ # AFNetworking generic
54
+ - regex: '([^/]+)/(\d+(?:\.\d+)+) \((?:iPhone|iPad); iOS [0-9\.]+; Scale/[0-9\.]+\)'
55
+ name: '$1'
56
+ version: '$2'
57
+
58
+ # WhatsApp
59
+ - regex: 'WhatsApp(?:[ /]([\d\.]+))?'
60
+ name: 'WhatsApp'
61
+ version: '$1'
62
+
63
+ # Line
64
+ - regex: 'Line(?:[ /]([\d\.]+))'
65
+ name: 'Line'
66
+ version: '$1'
@@ -33,6 +33,10 @@
33
33
  name: 'Postbox'
34
34
  version: '$1'
35
35
 
36
+ - regex: 'MailBar(?:[/ ](\d+[\.\d]+))?'
37
+ name: 'MailBar'
38
+ version: '$1'
39
+
36
40
  - regex: 'The Bat!(?: Voyager)?(?:[/ ](\d+[\.\d]+))?'
37
41
  name: 'The Bat!'
38
42
  version: '$1'
@@ -6,7 +6,7 @@
6
6
  ###############
7
7
 
8
8
  'Tunisie Telecom':
9
- regex: 'StarTrail TT Build'
9
+ regex: 'StarTrail TT[);/ ]'
10
10
  device: 'smartphone'
11
11
  model: 'StarTrail'
12
12
 
@@ -15,36 +15,36 @@ SFR:
15
15
  regex: 'StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem|StarTab'
16
16
  device: 'smartphone'
17
17
  models:
18
- - regex: 'StarXtrem Build'
18
+ - regex: 'StarXtrem[);/ ]'
19
19
  model: 'StarXtrem' # ZTE
20
- - regex: 'StarTrail Build'
21
- model: 'StarTrail' # ZTE
22
- - regex: 'StarTrail II Build'
23
- model: 'StarTrail 2' # Huawei Ascend Y200
24
- - regex: 'StarTrail III Build'
25
- model: 'StarTrail 3' # ZTE
26
- - regex: 'StarTrail ?4 Build'
20
+ - regex: 'StarTrail ?4[);/ ]'
27
21
  model: 'StarTrail 4' # ZTE Blade Q
28
- - regex: 'StarShine Build'
29
- model: 'StarShine' # Huawei U8180
30
- - regex: 'StarShine II Build'
22
+ - regex: 'StarTrail III[);/ ]'
23
+ model: 'StarTrail 3' # ZTE
24
+ - regex: 'StarTrail II[);/ ]'
25
+ model: 'StarTrail 2' # Huawei Ascend Y200
26
+ - regex: 'StarTrail[);/ ]'
27
+ model: 'StarTrail' # ZTE
28
+ - regex: 'StarShine II[);/ ]'
31
29
  model: 'StarShine 2' # ZTE
32
- - regex: 'STARADDICT Build'
33
- model: 'Staraddict' # ZTE
34
- - regex: 'STARADDICT II Build'
35
- model: 'Staraddict 2' # Alcatel One Touch 995
36
- - regex: 'STARADDICT II Plus Build'
37
- model: 'Staraddict 2 Plus' # ZTE Grand X
38
- - regex: 'STARADDICT III Build'
30
+ - regex: 'StarShine[);/ ]'
31
+ model: 'StarShine' # Huawei U8180
32
+ - regex: 'STARADDICT III[);/ ]'
39
33
  model: 'Staraddict 3' # Coolpad 8861U
40
- - regex: 'StarText Build'
41
- model: 'StarText' # ZTE
42
- - regex: 'StarText II Build'
34
+ - regex: 'STARADDICT II Plus[);/ ]'
35
+ model: 'Staraddict 2 Plus' # ZTE Grand X
36
+ - regex: 'STARADDICT II[);/ ]'
37
+ model: 'Staraddict 2' # Alcatel One Touch 995
38
+ - regex: 'STARADDICT[);/ ]'
39
+ model: 'Staraddict' # ZTE
40
+ - regex: 'StarText II[);/ ]'
43
41
  model: 'StarText 2' # ZTE
44
- - regex: 'StarNaute Build'
45
- model: 'StarNaute' # ZTE Amigo
46
- - regex: 'StarNaute II Build'
42
+ - regex: 'StarText[);/ ]'
43
+ model: 'StarText' # ZTE
44
+ - regex: 'StarNaute II[);/ ]'
47
45
  model: 'StarNaute 2' # ZTE
46
+ - regex: 'StarNaute[);/ ]'
47
+ model: 'StarNaute' # ZTE Amigo
48
48
  - regex: 'StarTab'
49
49
  model: 'StarTab'
50
50
  device: 'tablet'
@@ -54,10 +54,18 @@ SFR:
54
54
 
55
55
  # HTC
56
56
  HTC:
57
- regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G Build|(Desire|Sensation|Evo ?3D)[ _]?([^;/]+) Build|(Amaze[ _]4G|One ?[XELSV\+]+) Build|SPV E6[05]0'
57
+ regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G[);/ ]|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/]+) Build|(Amaze[ _]4G|One ?[XELSV\+]+)[);/ ]|SPV E6[05]0|One M8|X525a|PG86100|PC36100|XV6975|PJ83100[);/ ]'
58
58
  device: 'smartphone'
59
59
  models:
60
60
  # explicit smartphone models
61
+ - regex: 'XV6975[);/ ]'
62
+ model: 'Imagio'
63
+ - regex: 'PG86100[);/ ]'
64
+ model: 'Evo 3G'
65
+ - regex: 'PC36100[);/ ]'
66
+ model: 'Evo 4G'
67
+ - regex: 'PJ83100[);/ ]'
68
+ model: 'One X'
61
69
  - regex: 'ADR6300'
62
70
  model: 'Droid Incredible'
63
71
  - regex: 'ADR6400L'
@@ -68,13 +76,15 @@ HTC:
68
76
  model: 'Excalibur'
69
77
  - regex: 'SPV E650'
70
78
  model: 'Vox'
79
+ - regex: 'X525a'
80
+ model: 'One X+'
71
81
 
72
82
  - regex: 'NexusHD2' # custom rom for hd2
73
83
  model: 'HD2'
74
84
  - regex: 'HTC[ _\-]((?:Flyer|P715a).*) Build'
75
85
  device: 'tablet'
76
86
  model: '$1'
77
- - regex: 'HTC[ _\-]One[ _\-]max Build'
87
+ - regex: 'HTC[ _\-]One[ _\-]max[);/ ]'
78
88
  device: 'phablet'
79
89
  model: 'One max'
80
90
  - regex: 'HTC[ _]([^/;]+) [0-9]+(?:\.[0-9]+)+ Build'
@@ -94,25 +104,30 @@ HTC:
94
104
  model: '$1'
95
105
  - regex: 'HTC;(?: )?([a-z0-9 ]+)'
96
106
  model: '$1'
97
- - regex: '(Desire|Sensation|Evo ?3D)[ _]?([^;/]+) Build'
107
+ - regex: '(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/]+) Build'
98
108
  model: '$1 $2'
99
109
  - regex: '(Amaze[ _]4G|One ?[XELSV\+]*) Build'
100
110
  model: '$1'
101
- - regex: '(ADR.+) Build'
111
+ - regex: '(ADR[^;/]+) Build'
102
112
  model: '$1'
103
113
  - regex: '(ADR[a-z0-9]+)'
104
114
  model: '$1'
115
+ - regex: '(One M8)'
116
+ model: '$1'
105
117
 
106
118
  # NOKIA
107
119
  Nokia:
108
- regex: 'Nokia|Lumia|Maemo RX|portalmmm/2\.0 N7|portalmmm/2\.0 NK|nok[0-9]+|Symbian.*\s([a-z0-9]+)$'
120
+ regex: 'Nokia|Lumia|Maemo RX|portalmmm/2\.0 N7|portalmmm/2\.0 NK|nok[0-9]+|Symbian.*\s([a-z0-9]+)$|RX-51 N900'
109
121
  device: 'smartphone'
110
122
  models:
123
+ - regex: 'RX-51 N900'
124
+ model: 'N900'
125
+ device: 'tablet'
111
126
  - regex: 'Nokia(N[0-9]+)'
112
127
  model: '$1'
113
128
  - regex: 'Nokia-([a-z0-9]+)'
114
129
  model: 'N$1'
115
- - regex: 'NOKIA; ([a-z0-9\- ]+)'
130
+ - regex: 'NOKIA; (?!Qt;)([a-z0-9\- ]+)'
116
131
  model: '$1'
117
132
  - regex: 'NOKIA[ _]?([a-z0-9\-]+)'
118
133
  model: '$1'
@@ -169,23 +184,26 @@ Palm:
169
184
  models:
170
185
  - regex: '((?:Pre|Pixi))/(\d+\.\d+)'
171
186
  model: '$1 $2'
172
- - regex: 'Palm(?:[ \-])?((?!OS|Source)[a-z0-9]+)'
187
+ - regex: 'Palm(?:[ \-])?((?!OS|Source|scape)[a-z0-9]+)'
173
188
  model: '$1'
174
189
  - regex: 'Treo([a-z0-9]+)'
175
190
  model: 'Treo $1'
176
191
  - regex: 'Tungsten'
177
192
  model: 'Tungsten'
178
- - regex: 'Xiino' # Browser for Palm OS only
193
+ - regex: 'Xiino|Palmscape' # Browser for Palm OS only
179
194
  model: ''
180
195
 
181
196
  # HP
182
197
  HP:
183
- regex: 'TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP Slate|HP [78]'
198
+ regex: 'TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP Slate|HP [78]|Compaq [7|8]'
184
199
  device: 'smartphone'
185
200
  models:
186
201
  - regex: 'HP ([78][^/;]*) Build'
187
202
  model: 'Slate $1'
188
203
  device: 'tablet'
204
+ - regex: 'Compaq ([78][^/;]*) Build'
205
+ model: 'Compaq $1'
206
+ device: 'tablet'
189
207
  - regex: 'HP Slate ?(.+) Build'
190
208
  model: 'Slate $1'
191
209
  device: 'tablet'
@@ -208,37 +226,37 @@ TiPhone:
208
226
 
209
227
  # Apple
210
228
  Apple:
211
- regex: 'AppleTV|(?:Apple-)?(?:iPad|iPhone)'
229
+ regex: '(?:iTunes-)?AppleTV|(?:Apple-)?(?:iPad|iPhone)|iPh[0-9],[0-9]|CFNetwork'
212
230
  models:
213
231
  # specific smartphone devices
214
- - regex: '(?:Apple-)?iPhone1[C,]1'
232
+ - regex: '(?:Apple-)?iPh(?:one)?1[C,]1'
215
233
  model: 'iPhone'
216
234
  device: 'smartphone'
217
- - regex: '(?:Apple-)?iPhone1[C,]2'
235
+ - regex: '(?:Apple-)?iPh(?:one)?1[C,]2'
218
236
  model: 'iPhone 3G'
219
237
  device: 'smartphone'
220
- - regex: '(?:Apple-)?iPhone2[C,]1'
238
+ - regex: '(?:Apple-)?iPh(?:one)?2[C,]1'
221
239
  model: 'iPhone 3GS'
222
240
  device: 'smartphone'
223
- - regex: '(?:Apple-)?iPhone3[C,][123]'
241
+ - regex: '(?:Apple-)?iPh(?:one)?3[C,][123]'
224
242
  model: 'iPhone 4'
225
243
  device: 'smartphone'
226
- - regex: '(?:Apple-)?iPhone4[C,]1'
244
+ - regex: '(?:Apple-)?iPh(?:one)?4[C,]1'
227
245
  model: 'iPhone 4S'
228
246
  device: 'smartphone'
229
- - regex: '(?:Apple-)?iPhone5[C,][12]'
247
+ - regex: '(?:Apple-)?iPh(?:one)?5[C,][12]'
230
248
  model: 'iPhone 5'
231
249
  device: 'smartphone'
232
- - regex: '(?:Apple-)?iPhone5[C,][34]'
250
+ - regex: '(?:Apple-)?iPh(?:one)?5[C,][34]'
233
251
  model: 'iPhone 5C'
234
252
  device: 'smartphone'
235
- - regex: '(?:Apple-)?iPhone6[C,][12]'
253
+ - regex: '(?:Apple-)?iPh(?:one)?6[C,][12]'
236
254
  model: 'iPhone 5S'
237
255
  device: 'smartphone'
238
- - regex: '(?:Apple-)?iPhone7[C,]1'
256
+ - regex: '(?:Apple-)?iPh(?:one)?7[C,]1'
239
257
  model: 'iPhone 6 Plus'
240
258
  device: 'phablet'
241
- - regex: '(?:Apple-)?iPhone7[C,]2'
259
+ - regex: '(?:Apple-)?iPh(?:one)?7[C,]2'
242
260
  model: 'iPhone 6'
243
261
  device: 'smartphone'
244
262
 
@@ -271,7 +289,7 @@ Apple:
271
289
  model: 'iPad Air 2'
272
290
  device: 'tablet'
273
291
 
274
- - regex: 'AppleTV'
292
+ - regex: '(?:iTunes-)?AppleTV'
275
293
  model: 'Apple TV'
276
294
  device: 'tv'
277
295
  - regex: '(?:Apple-)?iPad'
@@ -300,9 +318,20 @@ MicroMax:
300
318
 
301
319
  # Acer
302
320
  Acer:
303
- regex: 'acer|a(?:101|110|200|210|211|500|501|510|511|700|701) Build|Android.*V3[67]0 Build|Android.*Z1[23456]0 Build|Android.*Z500 Build|A1-830|A1-81[01]|A3-A[12][01]|B1-7[1235][01]|B1-810|B1-A71|E39 Build|S5[12]0 Build'
321
+ regex: 'acer|a(?:101|110|200|210|211|500|501|510|511|700|701)[);/ ]|Android.*V3[67]0[);/ ]|Android.*Z1[23456]0 Build|Android.*Z500 Build|A1-830|A1-81[01]|A3-A[12][01]|B1-7[1235][01]|B1-810|B1-A71|E39 Build|S5[12]0 Build|DA[0-9]+HQ?L[);/ ]'
304
322
  device: 'smartphone'
305
323
  models:
324
+ # smart displays
325
+ - regex: 'DA220HQL[);/ ]'
326
+ model: 'DA220HQL'
327
+ device: 'smart display'
328
+ - regex: 'DA241HL[);/ ]'
329
+ model: 'DA241HL'
330
+ device: 'smart display'
331
+ - regex: '(DA[0-9]+HQ?L)[);/ ]'
332
+ model: '$1'
333
+ device: 'smart display'
334
+
306
335
  # explicit tablet models
307
336
  - regex: 'A1-81[01]'
308
337
  model: 'Iconia A'
@@ -320,9 +349,9 @@ Acer:
320
349
  # explicit smartphone models
321
350
  - regex: 'E39 Build'
322
351
  model: 'Liquid E700'
323
- - regex: 'Android.*V360 Build'
352
+ - regex: 'Android.*V360[);/ ]'
324
353
  model: 'Liquid E1'
325
- - regex: 'Android.*V370 Build'
354
+ - regex: 'Android.*V370[);/ ]'
326
355
  model: 'Liquid E2'
327
356
  - regex: 'S510 Build'
328
357
  model: 'Liquid S1'
@@ -340,19 +369,19 @@ Acer:
340
369
  model: '$1'
341
370
  - regex: 'acer[\-_]([a-z0-9]+)'
342
371
  model: '$1'
343
- - regex: 'a(101|110|200|210|211|500|501|510|511|700|701) Build'
372
+ - regex: 'a(101|110|200|210|211|500|501|510|511|700|701)[);/ ]'
344
373
  model: 'Iconia Tab A$1'
345
374
  device: 'tablet'
346
375
 
347
376
  # Airness
348
377
  Airness:
349
- regex: 'AIRNESS-([\w0-9]+)'
378
+ regex: 'AIRNESS-([\w]+)'
350
379
  device: 'feature phone'
351
380
  model: '$1'
352
381
 
353
382
  # Alcatel
354
383
  Alcatel:
355
- regex: 'Alcatel|Alc[a-z0-9]+|One ?Touch'
384
+ regex: 'Alcatel|Alc[a-z0-9]+|One[ _]?Touch'
356
385
  device: 'smartphone'
357
386
  models:
358
387
  - regex: '(?:Alcatel[ _])?One[ _]?Touch[ _]((?:T[0-9]+|TAB[^/;]+|EVO[78](?:HD)?)) Build'
@@ -360,6 +389,8 @@ Alcatel:
360
389
  model: 'One Touch $1'
361
390
  - regex: '(?:Alcatel[ _])?One[ _]?Touch([^/;]*) Build'
362
391
  model: 'One Touch$1'
392
+ - regex: '(?:Alcatel[ _])?One[ _]?Touch([^/;\)]*)\)'
393
+ model: 'One Touch$1'
363
394
  - regex: 'Alcatel UP'
364
395
  model: ''
365
396
  - regex: 'ALCATEL([^/;]+) Build'
@@ -371,6 +402,16 @@ Alcatel:
371
402
  - regex: 'Alc([a-z0-9]+)'
372
403
  model: '$1'
373
404
 
405
+ # Allview
406
+ Allview:
407
+ regex: 'Allview'
408
+ device: 'smartphone'
409
+ models:
410
+ - regex: 'Allview[ _-]([^;/]+) Build'
411
+ model: '$1'
412
+ - regex: 'Allview[ _-]([^;/]+)[;/)]'
413
+ model: '$1'
414
+
374
415
  # Amoi
375
416
  Amoi:
376
417
  regex: 'Amoi|A862W'
@@ -385,12 +426,22 @@ Amoi:
385
426
  - regex: 'Amoisonic-([a-z0-9]+)'
386
427
  model: '$1'
387
428
 
429
+ # Ainol
430
+ 'Ainol':
431
+ regex: 'Numy|novo[0-9]'
432
+ device: 'tablet'
433
+ models:
434
+ - regex: 'Numy[ _]([^;/]+) Build'
435
+ model: 'Numy $1'
436
+ - regex: 'Novo([0-9]+)[ \-]([^;/]+) Build'
437
+ model: 'Novo $1 $2'
438
+
388
439
  # Archos
389
440
  Archos:
390
441
  regex: 'Archos'
391
442
  device: 'smartphone'
392
443
  models:
393
- - regex: 'Archos ?5 Build'
444
+ - regex: 'Archos ?5[);/ ]'
394
445
  device: 'tablet'
395
446
  model: '5'
396
447
  - regex: 'Archos ([^/;]*(?:PAD)[^/;]*) Build'
@@ -406,10 +457,10 @@ Archos:
406
457
 
407
458
  # Axxion
408
459
  Axxion:
409
- regex: 'Axxion ATAB-[0-9]+ Build'
460
+ regex: 'Axxion ATAB-[0-9]+[);/ ]'
410
461
  device: 'tablet'
411
462
  models:
412
- - regex: 'Axxion ATAB-([0-9]+) Build'
463
+ - regex: 'Axxion ATAB-([0-9]+)[);/ ]'
413
464
  model: 'ATAB-$1'
414
465
 
415
466
  # Meu
@@ -484,11 +535,21 @@ Arnova:
484
535
  - regex: 'Arnova ([^/;]*) Build'
485
536
  model: '$1'
486
537
 
538
+ # ARRIS
539
+ ARRIS:
540
+ regex: 'ARRIS'
541
+ device: 'tv'
542
+ models:
543
+ - regex: 'ARRIS[,;] ([^),;/]+)'
544
+ model: '$1'
545
+
487
546
  # Garmin-Asus
488
547
  Garmin-Asus:
489
- regex: 'Garmin-Asus'
548
+ regex: 'Garmin-Asus|Garminfone'
490
549
  device: 'smartphone'
491
550
  models:
551
+ - regex: 'Garminfone[ \-_]([^;/]*)Build'
552
+ model: 'Garminfone $1'
492
553
  - regex: 'Garmin-Asus[ \-_]([^;/]+)Build'
493
554
  model: '$1'
494
555
  - regex: 'Garmin-Asus[ \-_]([^;/]+)[\)/]'
@@ -496,83 +557,98 @@ Garmin-Asus:
496
557
 
497
558
  # Asus
498
559
  Asus:
499
- regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|K0[01][0-9a-z] Build'
560
+ regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|Z00D)[);/ ]'
500
561
  device: 'smartphone'
501
562
  models:
502
563
  # explicit tablet models
503
- - regex: 'ME171 Build'
564
+ - regex: 'ME171[);/ ]'
504
565
  model: 'Eee Pad MeMO 171'
505
566
  device: 'tablet'
506
567
  - regex: 'ME172V'
507
568
  model: 'MeMO Pad'
508
569
  device: 'tablet'
509
- - regex: 'ME302C Build'
570
+ - regex: 'ME302C[);/ ]'
510
571
  model: 'MeMO Pad FHD 10'
511
572
  device: 'tablet'
512
- - regex: 'ME302KL Build'
573
+ - regex: 'ME302KL[);/ ]'
513
574
  model: 'MeMO Pad FHD 10 LTE'
514
575
  device: 'tablet'
515
- - regex: 'ME301T Build'
576
+ - regex: 'ME301T[);/ ]'
516
577
  model: 'MeMO Pad Smart 10'
517
578
  device: 'tablet'
518
- - regex: 'K01[3A] Build'
579
+ - regex: 'K01[3A][);/ ]'
519
580
  model: 'MeMO Pad 7'
520
581
  device: 'tablet'
521
- - regex: 'K01E Build'
582
+ - regex: 'K01E[);/ ]'
522
583
  model: 'MeMO Pad 10 ME103K'
523
584
  device: 'tablet'
524
- - regex: 'K00U|ME173X Build'
585
+ - regex: 'K00U|ME173X[);/ ]'
525
586
  model: 'MeMO Pad HD 7'
526
587
  device: 'tablet'
527
- - regex: '(?:K011|K00L) Build'
588
+ - regex: '(?:K011|K00L)[);/ ]'
528
589
  model: 'MeMO Pad 8'
529
590
  device: 'tablet'
530
- - regex: 'K014 Build'
591
+ - regex: 'K014[);/ ]'
531
592
  model: 'MeMO Pad 8.9'
532
593
  device: 'tablet'
533
- - regex: 'K00S Build'
594
+ - regex: 'K00S[);/ ]'
534
595
  model: 'MeMO Pad HD 7 Dual SIM'
535
596
  device: 'tablet'
536
- - regex: 'K00F Build'
597
+ - regex: 'K00F[);/ ]'
537
598
  model: 'MeMO Pad 10'
538
599
  device: 'tablet'
539
- - regex: 'K00C Build'
600
+ - regex: 'K00C[);/ ]'
540
601
  model: 'Transformer Pad TF701T'
541
602
  device: 'tablet'
542
- - regex: 'K010 Build'
603
+ - regex: 'K010[);/ ]'
543
604
  model: 'Transformer Pad TF103C'
544
605
  device: 'tablet'
545
- - regex: 'K018 Build'
606
+ - regex: 'K018[);/ ]'
546
607
  model: 'Transformer Pad TF103CG'
547
608
  device: 'tablet'
548
- - regex: 'TF300T Build'
609
+ - regex: 'TF300T[);/ ]'
549
610
  model: 'Transformer Pad TF300T'
550
611
  device: 'tablet'
612
+ - regex: 'K01B[);/ ]'
613
+ model: 'Transformer Pad TF303K'
614
+ device: 'tablet'
551
615
  - regex: 'Slider SL101'
552
616
  model: 'Eee Pad Slider SL101'
553
617
  device: 'tablet'
554
618
 
555
619
  # explicit phablet models
556
- - regex: 'ME371MG Build'
620
+ - regex: 'ME371MG[);/ ]'
557
621
  model: 'Fonepad'
558
622
  device: 'phablet'
559
- - regex: 'K00G Build'
623
+ - regex: 'K00G[);/ ]'
560
624
  model: 'Fonepad Note 6'
561
625
  device: 'phablet'
562
- - regex: '(?:K012|K00E) Build'
626
+ - regex: '(?:K012|K00E)[);/ ]'
563
627
  model: 'Fonepad 7'
564
628
  device: 'phablet'
565
- - regex: 'K00Z Build'
629
+ - regex: 'K00Z[);/ ]'
566
630
  model: 'Fonepad 7 Dual SIM'
567
631
  device: 'phablet'
568
- - regex: 'K016 Build'
632
+ - regex: 'K016[);/ ]'
569
633
  model: 'Fonepad 8'
570
634
  device: 'phablet'
571
635
 
572
636
 
573
637
  # explicit smartphone models
638
+ - regex: '(?:ASUS_)?Z007'
639
+ model: 'ZenFone C'
640
+ - regex: '(?:ASUS_)?(?:Z00D|Z008D|Z00AD[AB]?)'
641
+ model: 'ZenFone 2'
574
642
  - regex: '(?:ASUS_)?T00[IQ]'
575
643
  model: 'ZenFone 4'
644
+ - regex: '(?:ASUS_)?T00[JF]'
645
+ model: 'ZenFone 5'
646
+ - regex: '(?:ASUS_)?T00P'
647
+ model: 'ZenFone 5 LTE'
648
+ - regex: '(?:ASUS_)?T00K'
649
+ model: 'ZenFone 5 Lite'
650
+ - regex: '(?:ASUS_)?(?:T00G|Z002)'
651
+ model: 'ZenFone 6'
576
652
 
577
653
  # general detections
578
654
  - regex: 'Asus(?:-|;)?([a-z0-9]+)'
@@ -628,14 +704,51 @@ Blu:
628
704
  device: 'smartphone'
629
705
  model: '$1'
630
706
 
707
+ # Boway
708
+ Boway:
709
+ regex: 'BOWAY'
710
+ device: 'smartphone'
711
+ models:
712
+ - regex: 'BOWAY[ _-]([^/;]+)[ _]Build'
713
+ model: '$1'
714
+ - regex: '([^/;]+) Build/BOWAY'
715
+ model: '$1'
716
+ - regex: '.*BOWAY[ _-]([^/;]+)/'
717
+ model: '$1'
718
+
719
+ # Brondi
720
+ Brondi:
721
+ regex: '(?:CENTURION|GLADIATOR| GLORY|LUXURY|SENSUELLE|VICTORY)(?:[ _-]?[2-6])?[);/ ]|Surfing Tab'
722
+ device: 'smartphone'
723
+ models:
724
+ - regex: 'CENTURION(?:[ _-]?([2-6]))?[);/ ]'
725
+ model: 'CENTURION $1'
726
+ - regex: 'GLADIATOR(?:[ _-]?([2-6]))?[);/ ]'
727
+ model: 'GLADIATOR $1'
728
+ - regex: 'GLORY(?:[ _-]?([2-6]))?[);/ ]'
729
+ model: 'GLORY $1'
730
+ - regex: 'LUXURY(?:[ _-]?([2-6]))?[);/ ]'
731
+ model: 'LUXURY $1'
732
+ - regex: 'SENSUELLE(?:[ _-]?([2-6]))?[);/ ]'
733
+ model: 'SENSUELLE $1'
734
+ - regex: 'VICTORY(?:[ _-]?([2-6]))?[);/ ]'
735
+ model: 'VICTORY $1'
736
+
737
+ - regex: 'Surfing Tab ([^;/]+) Build'
738
+ model: 'SURFING TAB $1'
739
+ device: 'tablet'
740
+ - regex: 'Surfing Tab ([^;/]+)[);/ ]'
741
+ model: 'SURFING TAB $1'
742
+ device: 'tablet'
743
+
631
744
  # Vivo
632
745
  Vivo:
633
- regex: 'vivo'
746
+ regex: '(?:VIV-|BBG-)?vivo'
634
747
  device: 'smartphone'
635
748
  models:
636
- - regex: 'vivo ([^/;]+) Build'
749
+ - regex: '(?:VIV-|BBG-)?vivo[ _]([^/;]+) Build'
637
750
  model: 'Vivo $1'
638
- - regex: 'vivo_([a-z0-9]+)'
751
+ - regex: '(?:VIV-|BBG-)?vivo[ _]([^);/]+)[);/]+'
639
752
  model: 'Vivo $1'
640
753
 
641
754
  # Bird
@@ -645,8 +758,6 @@ Bird:
645
758
  models:
646
759
  - regex: 'BIRD[\-. _]([^;/]+) Build'
647
760
  model: '$1'
648
- - regex: 'BIRD[\-. _]([^;/]+)_TD'
649
- model: '$1'
650
761
  - regex: 'BIRD[\-. _]([^;/]+)'
651
762
  model: '$1'
652
763
 
@@ -682,31 +793,52 @@ Bmobile:
682
793
 
683
794
  # bq
684
795
  bq:
685
- regex: 'Aquaris|bq [^/;]+ Build'
796
+ regex: 'Aquaris|bq [^/;]+ Build|BQS-4007'
686
797
  device: 'tablet'
687
798
  models:
799
+ - regex: 'BQS-4007'
800
+ device: 'smartphone'
801
+ model: 'Valencia'
802
+
688
803
  - regex: '(?:bq )?(Aquaris[^/;]*) Build'
689
804
  model: '$1'
690
805
  device: 'smartphone'
691
806
  - regex: 'bq ([^/;]+) Build'
692
807
  model: '$1'
693
808
 
809
+ # Bush
810
+ Bush:
811
+ regex: 'Bush[ _-]'
812
+ device: 'smartphone'
813
+ models:
814
+ - regex: 'BUSH ([^;/]+)Tablet Build'
815
+ model: '$1Tablet'
816
+ device: 'tablet'
817
+ - regex: 'BUSH ([^;/]+) Build'
818
+ model: '$1'
819
+
694
820
  # Capitel
695
821
  Capitel:
696
822
  regex: 'Capitel-([a-z0-9]+)'
697
823
  device: 'feature phone'
698
824
  model: '$1'
699
825
 
826
+ # Captiva
827
+ Captiva:
828
+ regex: 'Captiva[ _-]([^;/]+) Build'
829
+ device: 'tablet'
830
+ model: 'Pad $1'
831
+
700
832
  # Casio
701
833
  Casio:
702
- regex: '(C811|C7[57]1)(?: 4G)? Build'
834
+ regex: '(C811|C7[57]1)(?: 4G)?[);/ ]'
703
835
  device: 'smartphone'
704
836
  models:
705
- - regex: 'C751 Build'
837
+ - regex: 'C751[);/ ]'
706
838
  model: "G'zOne Ravine"
707
- - regex: 'C771 Build'
839
+ - regex: 'C771[);/ ]'
708
840
  model: "G'zOne Commando"
709
- - regex: 'C811 4G Build'
841
+ - regex: 'C811 4G[);/ ]'
710
842
  model: "G'zOne Commando 4G LTE"
711
843
 
712
844
  # Cat
@@ -719,6 +851,18 @@ Cat:
719
851
  - regex: 'Cat ?tablet'
720
852
  model: 'Nova'
721
853
 
854
+ # Carrefour
855
+ Carrefour:
856
+ regex: 'CT(?:10[0123]0|7[12]0|820)(?:W|FR)?[);/ ]'
857
+ device: 'tablet'
858
+ models:
859
+ - regex: 'CT820'
860
+ model: 'Touch Tablet Neo2'
861
+ - regex: 'CT(10[0123]0(?:W|FR)?)'
862
+ model: 'CT$1'
863
+ - regex: 'CT(7[12]0(?:W|FR)?)'
864
+ model: 'CT$1'
865
+
722
866
  # Celkon
723
867
  Celkon:
724
868
  regex: 'Celkon'
@@ -735,6 +879,14 @@ Celkon:
735
879
  - regex: 'Celkon[\. _*]([^;/\)]+)[\)/]'
736
880
  model: '$1'
737
881
 
882
+ # Changhong
883
+ Changhong:
884
+ regex: 'Changhong'
885
+ device: 'tv'
886
+ models:
887
+ - regex: 'Changhong-([^);/]+)'
888
+ model: '$1'
889
+
738
890
  # Cherry Mobile
739
891
  'Cherry Mobile':
740
892
  regex: 'Cherry|Flare2X|Fusion Bolt'
@@ -770,9 +922,13 @@ ConCorde:
770
922
 
771
923
  # Coolpad
772
924
  Coolpad:
773
- regex: '(?:YL-)?Coolpad'
925
+ regex: '(?:YL-)?Coolpad|8190Q[ ;/\)]|8295 Build'
774
926
  device: 'smartphone'
775
927
  models:
928
+ - regex: '8190Q[ ;/\)]'
929
+ model: '8190Q'
930
+ - regex: '8295 Build'
931
+ model: '8295'
776
932
  - regex: '(?:YL-)?Coolpad[ _\-]?([^/;]+) Build'
777
933
  model: '$1'
778
934
  - regex: '(?:YL-)?Coolpad[ _\-]?([a-z0-9\-]+)'
@@ -786,20 +942,57 @@ Cricket:
786
942
 
787
943
  # Crius
788
944
  'Crius Mea':
789
- regex: '(Q7A\+?) Build'
945
+ regex: '(Q7A\+?)[);/ ]'
790
946
  device: 'tablet'
791
947
  model: '$1'
792
948
 
949
+ # Crosscall
950
+ Crosscall:
951
+ regex: 'Crosscall'
952
+ device: 'smartphone'
953
+ models:
954
+ - regex: 'Crosscall ([^;/]+) Build'
955
+ model: '$1'
956
+
793
957
  # Cube
794
958
  Cube:
795
- regex: 'Cube|(U[0-9]+GT(?:[0-9]|[\-_][a-z]+)|K8GT)'
959
+ regex: 'Cube|(U[0-9]+GT|K8GT)'
796
960
  device: 'tablet'
797
961
  models:
798
- - regex: '(U[0-9]+GT(?:[0-9]|[\-_][a-z]+))'
962
+ - regex: 'U27GT'
963
+ model: 'Talk 8'
964
+ - regex: 'U55GT'
965
+ model: 'Talk 79'
966
+ - regex: 'U65GT'
967
+ model: 'Talk 9X'
968
+
969
+ - regex: '(U[0-9]+GT[^;/]*) Build'
970
+ model: '$1'
971
+ - regex: '(U[0-9]+GT(?:[0-9]|[\-_][a-z]+)?)'
799
972
  model: '$1'
800
973
  - regex: '(K8GT)'
801
974
  model: '$1'
802
975
 
976
+ # CUBOT
977
+ CUBOT:
978
+ regex: 'CUBOT'
979
+ device: 'smartphone'
980
+ models:
981
+ - regex: 'CUBOT ([^;/]+) Build'
982
+ model: '$1'
983
+ - regex: '([^;/]+) Build/CUBOT'
984
+ model: '$1'
985
+
986
+ # Datang
987
+ Datang:
988
+ regex: 'DATANG'
989
+ device: 'smartphone'
990
+ models:
991
+ - regex: '(?:DATANG[ _-])+([^;/]+) Build'
992
+ model: '$1'
993
+ - regex: '(?:DATANG[ _-])+([^;/)]+)[;/)]'
994
+ model: '$1'
995
+
803
996
  # Danew
804
997
  Danew:
805
998
  regex: 'Dslide ?([^;/]+) Build'
@@ -814,9 +1007,11 @@ Denver:
814
1007
 
815
1008
  # Dell
816
1009
  Dell:
817
- regex: 'Dell|Venue'
1010
+ regex: 'Dell|Venue|XCD35'
818
1011
  device: 'smartphone'
819
1012
  models:
1013
+ - regex: 'XCD35'
1014
+ model: 'XCD35'
820
1015
  - regex: '(?:Dell )?(Streak|Venue) ?([^/;]*) Build'
821
1016
  model: '$1 $2'
822
1017
  device: 'tablet'
@@ -828,6 +1023,16 @@ Dell:
828
1023
  - regex: 'Dell[ _\-]([^/;]+) Build'
829
1024
  model: '$1'
830
1025
 
1026
+ # Desay
1027
+ Desay:
1028
+ regex: 'Desay'
1029
+ device: 'smartphone'
1030
+ models:
1031
+ - regex: 'Desay[ _-]?([^;/)]+) Build'
1032
+ model: '$1'
1033
+ - regex: 'Desay[ _-]?([^;/)]+)[);/ ]'
1034
+ model: '$1'
1035
+
831
1036
  # Dbtel
832
1037
  Dbtel:
833
1038
  regex: 'DBTEL(?:[\-/])?([a-z0-9]+)'
@@ -854,9 +1059,25 @@ DoCoMo:
854
1059
 
855
1060
  # Doogee
856
1061
  Doogee:
857
- regex: '((?:BIGBOY|COLLO[23]?|DAGGER|DISCOVERY|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER) DG[0-9]+) Build'
1062
+ regex: 'DOOGEE[ _-]|((?:BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS))[ -](DG[0-9]+C?)[);/ ]'
858
1063
  device: 'smartphone'
859
- model: '$1'
1064
+ models:
1065
+ - regex: '(?:DOOGEE[ _-])?((?:BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS))[ -](DG[0-9]+C?)[);/ ]'
1066
+ model: '$1 $2'
1067
+ - regex: 'DOOGEE[ _-]([^);/]+) Build'
1068
+ model: '$1'
1069
+ - regex: 'DOOGEE[ _-]([^);/]+)[);/ ]'
1070
+ model: '$1'
1071
+
1072
+ # Doov
1073
+ Doov:
1074
+ regex: '(?:Doov-)?Doov[ _]'
1075
+ device: 'smartphone'
1076
+ models:
1077
+ - regex: '(?:Doov-)?Doov[ _]([^;/]+) Build'
1078
+ model: '$1'
1079
+ - regex: '(?:Doov-)?Doov[ _]([^);/]+)[);/ ]'
1080
+ model: '$1'
860
1081
 
861
1082
  # Dopod
862
1083
  Dopod:
@@ -864,6 +1085,29 @@ Dopod:
864
1085
  device: 'feature phone'
865
1086
  model: '$1'
866
1087
 
1088
+ # Dune HD
1089
+ 'Dune HD':
1090
+ regex: 'DuneHD'
1091
+ device: 'tv'
1092
+ models:
1093
+ - regex: 'DuneHD/\d.\d \([a-z]+__([a-z0-9_-]+);'
1094
+ model: '$1'
1095
+ - regex: 'DuneHD/\d.\d \(([a-z0-9_-]+);'
1096
+ model: '$1'
1097
+
1098
+ # DNS
1099
+ DNS:
1100
+ regex: '(?:DNS|AirTab)[ _\-]([^;/]+)Build|S4505M[);/ ]'
1101
+ device: 'smartphone'
1102
+ models:
1103
+ - regex: 'S4505M[);/ ]'
1104
+ model: 'S4505M'
1105
+ - regex: 'AirTab[ _\-]([^;/]+)Build'
1106
+ model: 'AirTab $1'
1107
+ device: 'tablet'
1108
+ - regex: 'DNS[ _\-]([^;/]+)Build'
1109
+ model: '$1'
1110
+
867
1111
  # E-Boda
868
1112
  E-Boda:
869
1113
  regex: 'E-Boda'
@@ -886,18 +1130,28 @@ Easypix:
886
1130
  model: '$1'
887
1131
  device: 'tablet'
888
1132
 
1133
+ # Ebest
1134
+ EBEST:
1135
+ regex: 'EBEST'
1136
+ device: 'smartphone'
1137
+ models:
1138
+ - regex: 'EBEST[ _-]?([^;/)]+) Build'
1139
+ model: '$1'
1140
+ - regex: 'EBEST[ _-]?([^;/)]+)[);/ ]'
1141
+ model: '$1'
1142
+
889
1143
  # ECS
890
1144
  ECS:
891
- regex: '(?:TA10CA3|TM105A?|TR10CS1) Build'
1145
+ regex: '(?:TA10CA3|TM105A?|TR10CS1)[);/ ]'
892
1146
  device: 'tablet'
893
1147
  models:
894
- - regex: 'TA10CA3 Build'
1148
+ - regex: 'TA10CA3[);/ ]'
895
1149
  model: 'TA10CA3'
896
- - regex: 'TR10CS1 Build'
1150
+ - regex: 'TR10CS1[);/ ]'
897
1151
  model: 'TR10CS1'
898
- - regex: 'TM105A Build'
1152
+ - regex: 'TM105A[);/ ]'
899
1153
  model: 'TM105A'
900
- - regex: 'TM105 Build'
1154
+ - regex: 'TM105[);/ ]'
901
1155
  model: 'TM105'
902
1156
 
903
1157
  # Elephone
@@ -906,12 +1160,28 @@ Elephone:
906
1160
  device: 'smartphone'
907
1161
  model: '$1'
908
1162
 
1163
+ # Energy Sistem
1164
+ 'Energy Sistem':
1165
+ regex: 'ENERGY[ _-]?([^;/]+) Build'
1166
+ device: 'tablet'
1167
+ model: '$1'
1168
+
909
1169
  # Ericy
910
1170
  Ericy:
911
1171
  regex: 'Ericy-([a-z0-9]+)'
912
1172
  device: 'feature phone'
913
1173
  model: '$1'
914
1174
 
1175
+ # Eton
1176
+ Eton:
1177
+ regex: 'Eton'
1178
+ device: 'smartphone'
1179
+ models:
1180
+ - regex: 'Eton[ _-]?([^;/)]+) Build'
1181
+ model: '$1'
1182
+ - regex: 'Eton[ _-]?([^;/)]+)[);/ ]'
1183
+ model: '$1'
1184
+
915
1185
  # Rikomagic
916
1186
  Rikomagic:
917
1187
  regex: 'MK(80[28][^/;]*) Build'
@@ -920,7 +1190,7 @@ Rikomagic:
920
1190
 
921
1191
  # Sony & Sony Ericsson (combined as they are mixed up)
922
1192
  Sony:
923
- regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|C1[569]0[45]|C2[01]0[45]|C2305|C530[236]|C5502|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5322|D5503|D58[03]3|D65(?:0[23]|43)|D66[05]3|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]*[0-9]*(?: Build|\))|X?L39H|portalmmm/2\.0 K|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[345]D|[234]E|[12]C|[1235]F|[12]G)|R800[aix]'
1193
+ regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|C1[569]0[45]|C2[01]0[45]|C2305|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5322|D5503|D58[03]3|D65(?:0[23]|43)|D66[05]3|E2303|E58[02]3|E6553|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]*[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[345]D|[234]E|[12]C|[1235]F|[12]G)|R800[aix]|LiveWithWalkman'
924
1194
  device: 'smartphone'
925
1195
  models:
926
1196
  # SONY ERICSSON: explicit smartphone models
@@ -966,13 +1236,13 @@ Sony:
966
1236
  - regex: '(?:Sony(?:Ericsson)?)?X10[ai]v?'
967
1237
  model: 'Xperia X10'
968
1238
  brand: 'Sony Ericsson'
969
- - regex: '(?:Sony(?:Ericsson)?)?M1'
1239
+ - regex: '(?:Sony(?:Ericsson)?)M1'
970
1240
  model: 'Aspen'
971
1241
  brand: 'Sony Ericsson'
972
1242
  - regex: '(?:Sony(?:Ericsson)?)?R800'
973
1243
  model: 'Xperia PLAY'
974
1244
  brand: 'Sony Ericsson'
975
- - regex: '(?:Sony(?:Ericsson)?)?WT19'
1245
+ - regex: '(?:Sony(?:Ericsson)?)?WT19|LiveWithWalkman'
976
1246
  model: 'Live with Walkman'
977
1247
  brand: 'Sony Ericsson'
978
1248
 
@@ -1037,6 +1307,10 @@ Sony:
1037
1307
  model: 'Yendo'
1038
1308
  brand: 'Sony Ericsson'
1039
1309
  device: 'feature phone'
1310
+ - regex: '(?:Sony(?:Ericsson)?)?W960'
1311
+ model: 'W960'
1312
+ brand: 'Sony Ericsson'
1313
+ device: 'feature phone'
1040
1314
  - regex: '(?:Sony(?:Ericsson)?)?WT13'
1041
1315
  model: 'Mix Walkman'
1042
1316
  brand: 'Sony Ericsson'
@@ -1085,13 +1359,13 @@ Sony:
1085
1359
  model: 'Xperia M'
1086
1360
  - regex: '(?:Sony(?:Ericsson)?)?C200[45]'
1087
1361
  model: 'Xperia M Dual'
1088
- - regex: '(?:Sony(?:Ericsson)?)?C210[45]'
1362
+ - regex: '(?:Sony(?:Ericsson)?)?C210[45]|S36h'
1089
1363
  model: 'Xperia L'
1090
- - regex: '(?:Sony(?:Ericsson)?)?C2305'
1364
+ - regex: '(?:Sony(?:Ericsson)?)?C2305|S39h'
1091
1365
  model: 'Xperia C'
1092
1366
  - regex: '(?:Sony(?:Ericsson)?)?C530[236]'
1093
1367
  model: 'Xperia SP'
1094
- - regex: '(?:Sony(?:Ericsson)?)?C5502'
1368
+ - regex: '(?:Sony(?:Ericsson)?)?C550[23]'
1095
1369
  model: 'Xperia ZR'
1096
1370
  - regex: '(?:Sony(?:Ericsson)?)?C650[236]'
1097
1371
  model: 'Xperia ZL'
@@ -1116,16 +1390,20 @@ Sony:
1116
1390
  model: 'Xperia M2'
1117
1391
  - regex: '(?:Sony(?:Ericsson)?)?D240[36]'
1118
1392
  model: 'Xperia M2 Aqua'
1393
+ - regex: '(?:Sony(?:Ericsson)?)?E2303'
1394
+ model: 'Xperia M4 Aqua'
1119
1395
  - regex: '(?:Sony(?:Ericsson)?)?D2502'
1120
1396
  model: 'Xperia C3 Dual'
1121
1397
  - regex: '(?:Sony(?:Ericsson)?)?D2533'
1122
1398
  model: 'Xperia C3'
1123
1399
  - regex: '(?:Sony(?:Ericsson)?)?D510[236]'
1124
1400
  model: 'Xperia T3'
1125
- - regex: '(?:Sony(?:Ericsson)?)?D530[36]'
1401
+ - regex: '(?:Sony(?:Ericsson)?)?D530[36]|XM50[ht]'
1126
1402
  model: 'Xperia T2 Ultra'
1403
+ device: 'phablet'
1127
1404
  - regex: '(?:Sony(?:Ericsson)?)?D5322'
1128
1405
  model: 'Xperia T2 Ultra Dual'
1406
+ device: 'phablet'
1129
1407
  - regex: '(?:Sony(?:Ericsson)?)?D5503'
1130
1408
  model: 'Xperia Z1 Compact'
1131
1409
  - regex: '(?:Sony(?:Ericsson)?)?(?:D58[03]3|SO-02G)'
@@ -1134,6 +1412,10 @@ Sony:
1134
1412
  model: 'Xperia Z2'
1135
1413
  - regex: '(?:Sony(?:Ericsson)?)?(?:D66[05]3|SO-01G)'
1136
1414
  model: 'Xperia Z3'
1415
+ - regex: '(?:Sony(?:Ericsson)?)?(?:E6553)'
1416
+ model: 'Xperia Z3+'
1417
+ - regex: '(?:Sony(?:Ericsson)?)?(?:E58[02]3)'
1418
+ model: 'Xperia Z5 Compact'
1137
1419
  - regex: '(?:Sony(?:Ericsson)?)?SO-04E'
1138
1420
  model: 'Xperia A'
1139
1421
  - regex: '(?:Sony(?:Ericsson)?)?SO-04D'
@@ -1142,24 +1424,33 @@ Sony:
1142
1424
  model: 'Xperia SX'
1143
1425
 
1144
1426
  # SONY: explicit tablet models
1145
- - regex: 'SGP(?:311|312|321) Build|SO-03E'
1427
+ - regex: 'SGP(?:311|312|321)[);/ ]|SO-03E'
1146
1428
  model: 'Xperia Tablet Z'
1147
1429
  device: 'tablet'
1148
- - regex: 'SGP(?:511|512|521) Build|SO-05F'
1430
+ - regex: 'SGP(?:511|512|521)[);/ ]|SO-05F'
1149
1431
  model: 'Xperia Tablet Z2'
1150
1432
  device: 'tablet'
1151
- - regex: 'SGP(?:6[24]1) Build'
1433
+ - regex: 'SGP(?:6[24]1)[);/ ]'
1152
1434
  model: 'Xperia Tablet Z3 Compact'
1153
1435
  device: 'tablet'
1154
- - regex: 'SGPT(?:12|121|122|123|13|131|132|133) Build'
1436
+ - regex: 'SGPT(?:12|121|122|123|13|131|132|133)[);/ ]'
1155
1437
  model: 'Xperia Tablet S'
1156
1438
  device: 'tablet'
1157
1439
 
1158
1440
  # general detections
1441
+ - regex: 'SonyBDP|SonyDBV'
1442
+ model: 'Blu-ray Player'
1443
+ device: 'tv'
1444
+ - regex: '(?:Sony-)?(KDL?-?[0-9a-z]+)'
1445
+ model: '$1'
1446
+ device: 'tv'
1447
+ - regex: 'Opera TV Store.*(?:Sony-)([0-9a-z-_]+)'
1448
+ model: '$1'
1449
+ device: 'tv'
1159
1450
  - regex: '((?:WT|SO|ST|SK|MK)[0-9]+[a-z]*[0-9]*)(?: Build|\))'
1160
1451
  model: '$1'
1161
1452
  brand: 'Sony Ericsson'
1162
- - regex: '(MT[0-9]{2}[a-z]?) Build'
1453
+ - regex: '(MT[0-9]{2}[a-z]?)[);/ ]'
1163
1454
  model: '$1'
1164
1455
  brand: 'Sony Ericsson'
1165
1456
  - regex: 'portalmmm/2.0 K([a-z0-9]+)'
@@ -1187,9 +1478,9 @@ Sony:
1187
1478
  device: 'tablet'
1188
1479
  - regex: 'Xperia ([^;/]+) Build'
1189
1480
  model: 'Xperia $1'
1190
- - regex: 'Sony[ ]?([^/;]*) Build'
1481
+ - regex: 'Sony[ -]?([^/;]*) Build'
1191
1482
  model: '$1'
1192
- - regex: 'Sony[ ]?([a-z0-9\-]+)'
1483
+ - regex: 'Sony[ -]?([a-z0-9\-]+)'
1193
1484
  model: '$1'
1194
1485
 
1195
1486
  # Ericsson
@@ -1221,9 +1512,14 @@ Storex:
1221
1512
 
1222
1513
  # Evertek
1223
1514
  Evertek:
1224
- regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy)[^/;]*) Build'
1515
+ regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy|Vivid|Slim|Glow|Magic|Smart|Star)[^/;]*) Build|E70[25]0HD|E805[01]HD|E9054HD|E8050HG|E7914HG'
1225
1516
  device: 'smartphone'
1226
- model: '$1'
1517
+ models:
1518
+ - regex: '(E70[25]0HD|E805[01]HD|E9054HD|E8050HG|E7914HG)'
1519
+ device: 'tablet'
1520
+ model: 'Everpad $1'
1521
+ - regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy|Vivid|Slim|Glow|Magic|Smart|Star)[^/;]*) Build'
1522
+ model: '$1'
1227
1523
 
1228
1524
  # Ezze
1229
1525
  Ezze:
@@ -1241,6 +1537,21 @@ Ezio:
1241
1537
  device: 'feature phone'
1242
1538
  model: '$1'
1243
1539
 
1540
+ # Foxconn
1541
+ Foxconn:
1542
+ regex: 'InFocus M[0-9]+[a-z]?'
1543
+ device: 'smartphone'
1544
+ models:
1545
+ - regex: 'InFocus M([0-9]+[a-z]?)'
1546
+ model: 'InFocus M$1'
1547
+
1548
+ # Fairphone
1549
+ Fairphone:
1550
+ regex: '(FP1U?)[);/ ]'
1551
+ device: 'smartphone'
1552
+ model: '$1'
1553
+
1554
+
1244
1555
  # Fujitsu
1245
1556
  Fujitsu:
1246
1557
  regex: 'F-01F|F-02[EF]|F-05[DE]|F-06E|F-08D|F-09E'
@@ -1292,34 +1603,92 @@ Gigaset:
1292
1603
 
1293
1604
  # Gionee
1294
1605
  Gionee:
1295
- regex: 'GIONEE-[a-z0-9]+'
1606
+ regex: '(?:GIO-)?GIONEE[ _-]?[a-z0-9]+|(?:Dream_D1|V188S?|GN[0-9]{3,4}[a-z]?)[);/ ]'
1296
1607
  device: 'smartphone'
1297
1608
  models:
1298
- - regex: 'GIONEE-([a-z0-9]+).*Android'
1609
+ - regex: 'GN810[);/ ]'
1610
+ model: 'GN810'
1611
+ device: 'phablet'
1612
+ - regex: 'GN([0-9]{3,4}[a-z]?)[);/ ]'
1613
+ model: 'GN$1'
1614
+ - regex: 'V188S[);/ ]'
1615
+ model: 'V188S'
1616
+ - regex: 'V188[);/ ]'
1617
+ model: 'V188'
1618
+ - regex: '(?:(?:GIO-)?GIONEE[ _-])?Dream_D1[);/ ]'
1619
+ model: 'Dream D1'
1620
+ - regex: '(?:GIO-)?GIONEE[ _-]([a-z0-9_-]+).*Android'
1299
1621
  model: '$1'
1300
- - regex: 'Android.*GIONEE-([a-z0-9]+)'
1622
+ - regex: 'Android.*(?:GIO-)?GIONEE[ _-]([a-z0-9_-]+)'
1301
1623
  model: '$1'
1302
- - regex: 'GIONEE-([a-z0-9]+)'
1624
+ - regex: '(?:GIO-)?GIONEE[ _-]?([a-z0-9]+)'
1303
1625
  model: '$1'
1304
1626
  device: 'feature phone'
1305
1627
 
1628
+ # Vizio
1629
+ Vizio:
1630
+ regex: 'Vizio|VAP430|VTAB1008'
1631
+ device: 'tv'
1632
+ models:
1633
+ - regex: 'VAP430'
1634
+ model: 'VAP430'
1635
+ - regex: 'VTAB1008'
1636
+ device: 'tablet'
1637
+ model: 'VTAB1008'
1638
+
1639
+ # GOCLEVER
1640
+ GOCLEVER:
1641
+ regex: 'GOCLEVER|QUANTUM|ARIES|INSIGNIA'
1642
+ device: 'smartphone'
1643
+ models:
1644
+ - regex: '((?:QUANTUM|ARIES|INSIGNIA)[ _-]?[^;/]+) Build'
1645
+ model: '$1'
1646
+ - regex: 'GOCLEVER[ _-]TAB[ _-]?([^;/]+) Build'
1647
+ model: 'TAB $1'
1648
+ device: 'tablet'
1649
+ - regex: 'GOCLEVER[ _-]?([^;/]+) Build'
1650
+ model: '$1'
1651
+ - regex: 'TAB ([^;/)]+) Build/GOCLEVER'
1652
+ model: 'TAB $1'
1653
+ device: 'tablet'
1654
+ - regex: '([^;/)]+) Build/GOCLEVER'
1655
+ model: '$1'
1656
+ - regex: 'GOCLEVER[ _-]?TAB[ _-]([^;/)]+)[;/)]'
1657
+ model: 'TAB $1'
1658
+ device: 'tablet'
1659
+ - regex: 'GOCLEVER[ _-]?([^;/)]+)[;/)]'
1660
+ model: '$1'
1661
+
1662
+ # Goly
1663
+ Goly:
1664
+ regex: 'Goly[ _-]'
1665
+ device: 'smartphone'
1666
+ models:
1667
+ - regex: 'Goly[ _-]([^;/]+) Build'
1668
+ model: '$1'
1669
+ - regex: 'Goly[ _-]([^;/)]+)[;/)]'
1670
+ model: '$1'
1671
+
1306
1672
  # Google
1307
1673
  Google:
1308
- regex: 'Nexus|GoogleTV|Glass'
1674
+ regex: 'Nexus|GoogleTV|Glass|CrKey[^a-z0-9]'
1309
1675
  device: 'smartphone'
1310
1676
  models:
1311
1677
  - regex: 'Glass'
1312
1678
  model: 'Glass'
1313
1679
  - regex: 'Galaxy Nexus'
1314
1680
  model: 'Galaxy Nexus'
1315
- - regex: '(Nexus (?:S|4|5|One))'
1681
+ - regex: '(Nexus (?:S|4|5X?|One))'
1316
1682
  model: '$1'
1317
- - regex: '(Nexus (?:6))'
1683
+ - regex: '(Nexus (?:6P?))'
1318
1684
  device: 'phablet'
1319
1685
  model: '$1'
1320
1686
  - regex: '(Nexus (?:7|9|10))'
1321
1687
  device: 'tablet'
1322
1688
  model: '$1'
1689
+ - regex: 'CrKey[^a-z0-9]'
1690
+ model: 'Chromecast'
1691
+ device: 'tv'
1323
1692
  - regex: 'GoogleTV'
1324
1693
  device: 'tv'
1325
1694
  model: 'GoogleTV'
@@ -1349,9 +1718,11 @@ Grundig:
1349
1718
 
1350
1719
  # Haier
1351
1720
  Haier:
1352
- regex: 'Haier'
1721
+ regex: 'Haier|(?:HW-)?W(?:716|757|860|970)[);/ ]'
1353
1722
  device: 'smartphone'
1354
1723
  models:
1724
+ - regex: '(?:HW-)?W(716|757|860|970)[);/ ]'
1725
+ model: 'W$1'
1355
1726
  - regex: 'Haier[ _\-](H[WT]-[^/;]+) Build'
1356
1727
  model: '$1'
1357
1728
  - regex: 'Haier[ _\-](H[WT]-[a-z0-9_\-]+)'
@@ -1362,9 +1733,19 @@ Haier:
1362
1733
  model: '$1'
1363
1734
  device: 'feature phone'
1364
1735
 
1736
+ # Hasee
1737
+ Hasee:
1738
+ regex: 'Hasee'
1739
+ device: 'smartphone'
1740
+ models:
1741
+ - regex: 'Hasee ([^;/]+) Build'
1742
+ model: '$1'
1743
+ - regex: 'Hasee ([^;/)]+)[);/ ]'
1744
+ model: '$1'
1745
+
1365
1746
  # Hisense
1366
1747
  Hisense:
1367
- regex: '(?:HS-)?Hisense ([^;/]+) Build|HS-(?:U|EG?)[0-9]+[a-z0-9\-]*|E270BSA|M470BS[AE]|E2281'
1748
+ regex: '(?:HS-)?Hisense ([^;/]+) Build|Hisense [^);/]+|HS-(?:U|EG?|I|T|X)[0-9]+[a-z0-9\-]*|E270BSA|M470BS[AE]|E2281'
1368
1749
  device: 'smartphone'
1369
1750
  models:
1370
1751
  # explicit tablet models
@@ -1378,10 +1759,12 @@ Hisense:
1378
1759
  device: 'tablet'
1379
1760
  model: 'Sero 8'
1380
1761
 
1381
- - regex: '(HS-(?:U|EG?)[0-9]+[a-z0-9\-]*)'
1762
+ - regex: '(HS-(?:U|EG?|I|T|X)[0-9]+[a-z0-9\-]*)'
1382
1763
  model: '$1'
1383
1764
  - regex: '(?:HS-)?Hisense ([^;/]+) Build'
1384
1765
  model: '$1'
1766
+ - regex: 'Hisense ([^);/]+)'
1767
+ model: '$1'
1385
1768
 
1386
1769
  # Hi-Level
1387
1770
  Hi-Level:
@@ -1389,11 +1772,55 @@ Hi-Level:
1389
1772
  device: 'tablet'
1390
1773
  model: 'HLV-T$1'
1391
1774
 
1775
+ # Hosin
1776
+ Hosin:
1777
+ regex: 'HOSIN[ _-]'
1778
+ device: 'smartphone'
1779
+ models:
1780
+ - regex: 'HOSIN[ _-]([^;/]+) Build'
1781
+ model: '$1'
1782
+ - regex: 'HOSIN[ _-]([^;/]+)[;/)]'
1783
+ model: '$1'
1784
+
1392
1785
  # Huawei
1393
1786
  Huawei:
1394
- regex: '(HW-)?Huawei|Ideos|vodafone[a-z0-9]+'
1787
+ regex: '(HW-)?(?:Huawei|Ideos|Honor[ _]|(?:H60-L(?:01|02|03|04|11|12)|H30-(?:C00|L01M?|L02|U10|T00|T10)|G621-TL00M?|PLK-(?:AL10|CL00|TL00|TL01H?|UL00|L01)|SCL-(?:AL00|CL00|TL00H?)|CH(?:E2?|M)-[CUT]L00[HM]?|CHE1-CL[12]0|CHE2-L11|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))[);/ ])'
1395
1788
  device: 'smartphone'
1396
1789
  models:
1790
+ - regex: 'U(8230|8661|8667)[);/ ]'
1791
+ model: 'U$1'
1792
+ - regex: 'U8500[);/ ]'
1793
+ model: 'Ideos X2'
1794
+ - regex: 'U8510[);/ ]'
1795
+ model: 'Ideos X3'
1796
+ - regex: 'U8665[);/ ]'
1797
+ model: 'Fusion 2'
1798
+ - regex: 'U8800[);/ ]'
1799
+ model: 'Ideos X5'
1800
+ - regex: 'U8818[);/ ]'
1801
+ model: 'Ascend G300'
1802
+ - regex: 'U8860[);/ ]'
1803
+ model: 'Honor'
1804
+ - regex: 'U9200[);/ ]'
1805
+ model: 'Ascend P1'
1806
+ - regex: 'U9500[);/ ]'
1807
+ model: 'Ascend D1'
1808
+ - regex: 'U9508[);/ ]'
1809
+ model: 'Honor 2'
1810
+ - regex: 'CHE2?-[UT]L00[HM]?|CHE1-CL[12]0|CHE2-L11'
1811
+ model: 'Honor 4X'
1812
+ - regex: 'CHM-[CUT]L00[HM]?'
1813
+ model: 'Honor Play 4C'
1814
+ - regex: '(?:Honor_|HW-)?G621-TL00M?[);/ ]'
1815
+ model: 'G621'
1816
+ - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?[);/ ]'
1817
+ model: 'Honor 3C'
1818
+ - regex: '(?:Honor_|HW-)?SCL-(?:AL00|CL00|TL00H?)(?:_TD)?[);/ ]'
1819
+ model: 'Honor 4A'
1820
+ - regex: '(?:Honor_|HW-)?H60-L(?:01|02|03|04|11|12)(?:_TD)?[);/ ]'
1821
+ model: 'Honor 6'
1822
+ - regex: '(?:Honor_|HW-)?PLK-(?:AL10|CL00|TL00|TL01H?|UL00|L01)[);/ ]'
1823
+ model: 'Honor 7'
1397
1824
  - regex: '(MediaPad[^/;]*) Build'
1398
1825
  device: 'tablet'
1399
1826
  model: '$1'
@@ -1408,8 +1835,6 @@ Huawei:
1408
1835
  model: '$1'
1409
1836
  - regex: 'Huawei; ([a-z0-9 \-]+)'
1410
1837
  model: '$1'
1411
- - regex: 'vodafone([a-z0-9]+)'
1412
- model: 'Vodafone $1'
1413
1838
 
1414
1839
  # Hyundai
1415
1840
  Hyundai:
@@ -1419,6 +1844,38 @@ Hyundai:
1419
1844
  - regex: 'Hyundai ([^;/]+) Build'
1420
1845
  model: '$1'
1421
1846
 
1847
+ #i-Joy
1848
+ 'i-Joy':
1849
+ regex: 'i-Joy|i-Call|(?:Neon[79]|Sygnus|Deox|Elektra (?:M|L|XL|XXL))[);/ ]'
1850
+ device: 'smartphone'
1851
+ models:
1852
+ # explicit smartphone models
1853
+ - regex: 'Elektra M[);/ ]'
1854
+ model: 'Elektra M'
1855
+ - regex: 'Elektra L[);/ ]'
1856
+ model: 'Elektra L'
1857
+ - regex: 'Elektra XL[);/ ]'
1858
+ model: 'Elektra XL'
1859
+ - regex: 'Elektra XXL[);/ ]'
1860
+ model: 'Elektra XXL'
1861
+ device: 'phablet'
1862
+
1863
+ # explicit tablet models
1864
+ - regex: 'Neon([79])[);/ ]'
1865
+ model: 'Neon $1'
1866
+ device: 'tablet'
1867
+ - regex: 'Sygnus[);/ ]'
1868
+ model: 'Sygnus'
1869
+ device: 'tablet'
1870
+ - regex: 'Deox[);/ ]'
1871
+ model: 'Deox'
1872
+ device: 'tablet'
1873
+
1874
+ - regex: 'i-Call ([^;/]+) Build'
1875
+ model: 'i-Call $1'
1876
+ - regex: 'i-Joy ([^;/]+) Build'
1877
+ model: '$1'
1878
+
1422
1879
  # iBall
1423
1880
  iBall:
1424
1881
  regex: 'iBall[ _]([^/;]*)[ _]Build'
@@ -1435,6 +1892,22 @@ iBerry:
1435
1892
  - regex: 'AUXUS ([^/;]+) Build'
1436
1893
  model: '$1'
1437
1894
 
1895
+ # iNew
1896
+ iNew:
1897
+ regex: 'iNew|(?:V7A|V3 Plus|V3-?E|V3C)(?: Build|[;/\)])'
1898
+ device: 'smartphone'
1899
+ models:
1900
+ - regex: 'V3C(?: Build|[;/\)])'
1901
+ model: 'V3C'
1902
+ - regex: 'V3-?E(?: Build|[;/\)])'
1903
+ model: 'V3-E'
1904
+ - regex: 'V3 Plus(?: Build|[;/\)])'
1905
+ model: 'V3 Plus'
1906
+ - regex: 'V7A(?: Build|[;/\)])'
1907
+ model: 'V7A'
1908
+ - regex: 'iNew[ -_]([^;/]+) Build'
1909
+ model: '$1'
1910
+
1438
1911
  # Infinix
1439
1912
  Infinix:
1440
1913
  regex: 'Infinix'
@@ -1491,13 +1964,19 @@ i-mate:
1491
1964
 
1492
1965
  # i-mobile
1493
1966
  i-mobile:
1494
- regex: 'i-mobile ?[a-z0-9]+'
1967
+ regex: 'i-mobile ?[a-z0-9]+|i-Style|IQ ?(9\.1|5\.5|5\.6A?)'
1495
1968
  device: 'feature phone'
1496
1969
  models:
1497
1970
  - regex: 'i-mobile (i-note[^/;]*) Build'
1498
1971
  model: '$1'
1499
1972
  device: 'tablet'
1500
- - regex: 'i-mobile ((?:IQ|i-style)[^/;]*) Build'
1973
+ - regex: 'i-Style ?([^;/]+) Build'
1974
+ model: 'i-Style $1'
1975
+ device: 'smartphone'
1976
+ - regex: 'IQ ?(9\.1|5\.5|5\.6A?)'
1977
+ model: 'IQ $1'
1978
+ device: 'smartphone'
1979
+ - regex: 'i-mobile (IQ[^/;]*) Build'
1501
1980
  model: '$1'
1502
1981
  device: 'smartphone'
1503
1982
  - regex: 'i-mobile(?: )?([a-z0-9\- ]+) Build'
@@ -1511,6 +1990,16 @@ iKoMo:
1511
1990
  device: 'feature phone'
1512
1991
  model: '$1'
1513
1992
 
1993
+ # iOcean
1994
+ iOcean:
1995
+ regex: 'iOCEAN'
1996
+ device: 'smartphone'
1997
+ models:
1998
+ - regex: 'iOCEAN[ _\-]?([^/;]+) Build'
1999
+ model: '$1'
2000
+ - regex: 'iOCEAN[ _\-]?([^);/ ]+)'
2001
+ model: '$1'
2002
+
1514
2003
  # iTel
1515
2004
  iTel:
1516
2005
  regex: 'itel|iNote'
@@ -1527,7 +2016,7 @@ iTel:
1527
2016
 
1528
2017
  #Jiayu
1529
2018
  Jiayu:
1530
- regex: '(JY-[a-z0-9]+) Build'
2019
+ regex: '(JY-[a-z0-9]+)[);/ ]'
1531
2020
  device: 'smartphone'
1532
2021
  model: '$1'
1533
2022
 
@@ -1539,17 +2028,59 @@ Jolla:
1539
2028
 
1540
2029
  # Kazam
1541
2030
  Kazam:
1542
- regex: 'Kazam ([^;/]+) Build|Trooper_X[0-9][0-9] Build'
2031
+ regex: 'Kazam ([^;/]+) Build|Trooper_X[0-9][0-9][);/ ]|Tornado 348'
1543
2032
  device: 'smartphone'
1544
2033
  models:
1545
- - regex: 'Trooper_X([0-9])([0-9]) Build'
2034
+ - regex: 'Tornado 348'
2035
+ model: 'Tornado 348'
2036
+ - regex: 'Trooper_X([0-9])([0-9])[);/ ]'
1546
2037
  model: 'Trooper X$1.$2'
1547
2038
  - regex: 'Kazam ([^;/]+) Build'
1548
2039
  model: '$1'
1549
2040
 
2041
+ # Kingsun
2042
+ Kingsun:
2043
+ regex: 'Kingsun[ _-]'
2044
+ device: 'smartphone'
2045
+ models:
2046
+ - regex: 'Kingsun[ _-]([^;/]+) Build'
2047
+ model: '$1'
2048
+ - regex: 'Kingsun[ -]((?!Build)[a-z0-9_-]+)'
2049
+ model: '$1'
2050
+
2051
+ # Komu
2052
+ Komu:
2053
+ regex: 'Komu[ -]'
2054
+ device: 'smartphone'
2055
+ models:
2056
+ - regex: 'Komu[ -]([^;/]+) Build'
2057
+ model: '$1'
2058
+ - regex: 'Komu[ -]([a-z0-9_-]+)'
2059
+ model: '$1'
2060
+
2061
+ # Koobee
2062
+ Koobee:
2063
+ regex: 'Koobee'
2064
+ device: 'smartphone'
2065
+ models:
2066
+ - regex: 'Koobee[ _\-]?([^;/]+) Build'
2067
+ model: '$1'
2068
+ - regex: 'Koobee[ _\-]?([a-z0-9_-]+)'
2069
+ model: '$1'
2070
+
2071
+ # Kumai
2072
+ Kumai:
2073
+ regex: '(?:KM-)?Kumai'
2074
+ device: 'smartphone'
2075
+ models:
2076
+ - regex: '(?:KM-)?Kumai[ _\-]?([^;/]+) Build'
2077
+ model: '$1'
2078
+ - regex: '(?:KM-)?Kumai[ _\-]?([a-z0-9_-]+)'
2079
+ model: '$1'
2080
+
1550
2081
  # KT-Tech
1551
2082
  KT-Tech:
1552
- regex: '(KM-[a-z0-9]+|EV-[a-z0-9]+) Build'
2083
+ regex: '(KM-[a-z0-9]+|EV-[a-z0-9]+)[);/ ]'
1553
2084
  device: 'smartphone'
1554
2085
  model: '$1'
1555
2086
 
@@ -1559,22 +2090,40 @@ KDDI:
1559
2090
  device: 'feature phone'
1560
2091
  model: '$1'
1561
2092
 
2093
+ # KOPO
2094
+ KOPO:
2095
+ regex: 'KOPO[ _-]'
2096
+ device: 'smartphone'
2097
+ models:
2098
+ - regex: 'KOPO[ _\-]?([^/;]+) Build'
2099
+ model: '$1'
2100
+ - regex: 'KOPO[ _\-]?([^);/ ]+)'
2101
+ model: '$1'
2102
+
2103
+ # Koridy
2104
+ Koridy:
2105
+ regex: 'KORIDY[ _-]([^/;]+) Build'
2106
+ device: 'smartphone'
2107
+ model: '$1'
2108
+
1562
2109
  #k-touch
1563
2110
  K-Touch:
1564
- regex: 'K-Touch[ _][a-z0-9]+'
2111
+ regex: 'K-?Touch[ _][a-z0-9]+'
1565
2112
  device: 'smartphone'
1566
2113
  models:
1567
- - regex: 'K-Touch[ _]([^/;]*)[ _]Build'
2114
+ - regex: 'K-?Touch[ _]([^/;]*)[ _]Build'
1568
2115
  model: '$1'
1569
- - regex: 'K-Touch[ _]([a-z0-9]+)'
2116
+ - regex: 'K-?Touch[ _]([a-z0-9]+)'
1570
2117
  model: '$1'
1571
2118
 
1572
2119
  # kyocera
1573
2120
  Kyocera:
1574
- regex: 'Kyocera|KWC-|QC-|C5170|C5155|C5215|C6750|C6522N?|S2151'
2121
+ regex: 'Kyocera|KWC-|QC-|C5120|C5170|C5155|C5215|C6750|C6522N?|S2151'
1575
2122
  device: 'smartphone'
1576
2123
  models:
1577
2124
  # explicit smartphone models
2125
+ - regex: 'C5120'
2126
+ model: 'Milano'
1578
2127
  - regex: 'C5155'
1579
2128
  model: 'Rise'
1580
2129
  - regex: 'C5170'
@@ -1627,7 +2176,7 @@ LCT:
1627
2176
  model: 'Le Pan Mini'
1628
2177
  - regex: 'TC970 ([^;/]+)Build'
1629
2178
  model: 'TC970 $1'
1630
- - regex: 'Le ?Pan ?(II|S) Build'
2179
+ - regex: 'Le ?Pan ?(II|S)[);/ ]'
1631
2180
  model: 'Le Pan $1'
1632
2181
  - regex: 'Le ?Pan ?([^;/]+) Build'
1633
2182
  model: '$1'
@@ -1657,14 +2206,14 @@ Lenovo:
1657
2206
  device: 'tablet'
1658
2207
  - regex: 'Lenovo ([^/;]*) Build'
1659
2208
  model: '$1'
1660
- - regex: '(?:LNV-|Lenovo-)?Lenovo[ \-_]([a-z0-9_+\-]+)'
1661
- model: '$1'
1662
2209
  - regex: 'IdeaTab[ \-_]?([a-z0-9]+)'
1663
2210
  model: 'IdeaTab $1'
1664
2211
  device: 'tablet'
1665
2212
  - regex: 'Yoga Tablet([^;/]+) Build'
1666
2213
  model: 'Yoga Tablet$1'
1667
2214
  device: 'tablet'
2215
+ - regex: '(?:LNV-|Lenovo-)?Lenovo[ \-_]([a-z0-9_+\-]+)'
2216
+ model: '$1'
1668
2217
 
1669
2218
  # lexibook
1670
2219
  Lexibook:
@@ -1722,14 +2271,21 @@ Lexibook:
1722
2271
 
1723
2272
  # lg
1724
2273
  LG:
1725
- regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|VX[0-9]+|L-01D|L-07C'
2274
+ regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713)[);/ ]|NetCast'
1726
2275
  device: 'smartphone'
1727
2276
  models:
2277
+ - regex: 'P713'
2278
+ model: 'Optimus L7II'
1728
2279
  - regex: 'L-01D'
1729
2280
  model: 'Optimus LTE L-01D'
2281
+ - regex: 'L-02D'
2282
+ model: 'PRADA phone L-02D'
1730
2283
  - regex: 'L-07C'
1731
2284
  model: 'Optimus Bright L-07C'
1732
2285
 
2286
+ - regex: 'webOS.TV'
2287
+ device: 'tv'
2288
+ model: 'WebOS TV'
1733
2289
  - regex: 'LGE_DLNA_SDK|NetCast'
1734
2290
  device: 'tv'
1735
2291
  model: 'NetCast'
@@ -1751,9 +2307,19 @@ LG:
1751
2307
  - regex: '(VX[0-9]+)'
1752
2308
  model: '$1'
1753
2309
 
2310
+ # Lingwin
2311
+ Lingwin:
2312
+ regex: 'Lingwin[ _\-]'
2313
+ device: 'smartphone'
2314
+ models:
2315
+ - regex: 'Lingwin[ _\-]?([^/;]+) Build'
2316
+ model: '$1'
2317
+ - regex: 'Lingwin[ _\-]?([^);/ ]+)'
2318
+ model: '$1'
2319
+
1754
2320
  # Logicom
1755
2321
  Logicom:
1756
- regex: '(TAB950|TAB1062|E731|E812|E912|E1031) Build'
2322
+ regex: '(TAB950|TAB1062|E731|E812|E912|E1031)[);/ ]'
1757
2323
  device: 'tablet'
1758
2324
  model: '$1'
1759
2325
 
@@ -1817,31 +2383,150 @@ Sagem:
1817
2383
 
1818
2384
  # Coby Kyros
1819
2385
  Coby Kyros:
1820
- regex: '(MID(?:1024|1125|1126|1045|1048|1060|1065|4331|7012|7015A?|7016|7022|7032|7035|7036|7042|7047|7048|7052|7065|7120|8024|8042|8048|8065|8125|8127|8128|9724|9740|9742)) Build'
2386
+ regex: '(MID(?:1024|1125|1126|1045|1048|1060|1065|4331|7012|7015A?|7016|7022|7032|7035|7036|7042|7047|7048|7052|7065|7120|8024|8042|8048|8065|8125|8127|8128|9724|9740|9742))[);/ ]'
1821
2387
  device: 'tablet'
1822
2388
  model: '$1'
1823
2389
 
1824
2390
  # Mpman
1825
2391
  Mpman:
1826
- regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7) Build'
2392
+ regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)[);/ ]'
1827
2393
  device: 'tablet'
1828
2394
  models:
1829
2395
  - regex: '((?:MPQC|MPDC)[0-9]+[^/;]+) Build'
1830
2396
  model: '$1'
1831
- - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7) Build'
2397
+ - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)[);/ ]'
1832
2398
  model: '$1'
1833
2399
  - regex: '(PH(?:150|340|350|360|451|500|520))'
1834
2400
  model: '$1'
1835
2401
  device: 'smartphone'
1836
2402
 
2403
+ # Majestic
2404
+ Majestic:
2405
+ regex: 'MAJESTIC[ _-]|CRONO ?[0-9]+'
2406
+ device: 'smartphone'
2407
+ models:
2408
+ - regex: 'MAJESTIC[ _]Tab([^;/]+)Build'
2409
+ model: 'Tab$1'
2410
+ device: 'tablet'
2411
+ - regex: 'MAJESTIC[ _]Tab([^);/]+)[);/]'
2412
+ model: 'Tab$1'
2413
+ device: 'tablet'
2414
+ - regex: 'MAJESTIC[ _]([^;/]+)Build'
2415
+ model: '$1'
2416
+ - regex: 'MAJESTIC[ _]([^);/]+)[);/]'
2417
+ model: '$1'
2418
+ - regex: 'CRONO ?([0-9]+) Build'
2419
+ model: 'Crono $1'
2420
+ - regex: 'CRONO ?([0-9]+)[);/]'
2421
+ model: 'Crono $1'
1837
2422
 
1838
2423
  # Manta Multimedia
1839
2424
  Manta Multimedia:
1840
- regex: '(MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|1001|1002|1003|1004(?: 3G)?|1005|7802|9701|9702)) Build'
2425
+ regex: '(MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|1001|1002|1003|1004(?: 3G)?|1005|7802|9701|9702))[);/ ]'
1841
2426
  device: 'tablet'
1842
2427
  model: '$1'
1843
2428
 
1844
- #Medion
2429
+ # Mediacom
2430
+ Mediacom:
2431
+ regex: '(?:SmartPad7503G|SmartPad970s2(?:3G)?|M[_-][MP]P[0-9a-z]+|M-IPRO[0-9a-z]+)[);/ ]'
2432
+ device: 'tablet'
2433
+ models:
2434
+ - regex: 'SmartPad7503G[);/ ]'
2435
+ model: 'SmartPad 750 3G'
2436
+ - regex: 'SmartPad970s23G[);/ ]'
2437
+ model: 'SmartPad 970 S2 3G'
2438
+ - regex: 'SmartPad970s2[);/ ]'
2439
+ model: 'SmartPad 970 S2'
2440
+ - regex: 'M-MP84[02]M[);/ ]'
2441
+ model: 'SmartPad 8.0 Mobile'
2442
+ - regex: 'M-MP940M[);/ ]'
2443
+ model: 'SmartPad 9.7 Mobile'
2444
+ - regex: 'M-MP(?:710|720|725|726|740)GOx?[);/ ]'
2445
+ model: 'SmartPad 7.0 Go'
2446
+ - regex: 'M-MP876S2[);/ ]'
2447
+ model: 'SmartPad 8.0 S2'
2448
+ - regex: 'M-MP8S2[AB]?3G[);/ ]'
2449
+ model: 'SmartPad 8.0 S2 3G'
2450
+ - regex: 'M-MP(101|102|860|875)S2[BW]?[);/ ]'
2451
+ model: 'SmartPad $1 S2'
2452
+ - regex: 'M-MP85S23G[);/ ]'
2453
+ model: 'SmartPad 875 S2 3G'
2454
+ - regex: 'M-MP10[45][01]S2[);/ ]'
2455
+ model: 'SmartPad 10.1 S2'
2456
+ - regex: 'M-MP1S2[AB]3G[);/ ]'
2457
+ model: 'SmartPad 10.1 S2 3G'
2458
+ - regex: 'M-MP8[24]S4[);/ ]'
2459
+ model: 'SmartPad 8.0 S4'
2460
+ - regex: 'M-MP8S4[AB]3G[);/ ]'
2461
+ model: 'SmartPad 8.0 S4 3G'
2462
+ - regex: 'M-MP9S4A3G[);/ ]'
2463
+ model: 'SmartPad 9.7 S4 3G'
2464
+ - regex: 'M-MP1[02]S4[);/ ]'
2465
+ model: 'SmartPad 10.1 S4'
2466
+ - regex: 'M-MP1040MC?[);/ ]'
2467
+ model: 'SmartPad 10.1 HD S4 3G'
2468
+ - regex: 'M-MP1S4[AB]3G[);/ ]'
2469
+ model: 'SmartPad 10.1 S4 3G'
2470
+ - regex: 'M-MP8PA3G[);/ ]'
2471
+ model: 'SmartPad 8.0 HD Pro 3G'
2472
+ - regex: 'M-MP10PA[);/ ]'
2473
+ model: 'SmartPad 10.1 HD Pro'
2474
+ - regex: 'M-MP10PA3G[);/ ]'
2475
+ model: 'SmartPad 10.1 HD Pro 3G'
2476
+ - regex: 'M-IPRO([18][01]0)[BW][);/ ]'
2477
+ model: 'SmartPad 8.0 HD iPro$1 3G'
2478
+
2479
+ - regex: '(?:M-MP75S23G|M-MP72[01]M)[);/ ]'
2480
+ model: 'SmartPad 7.0 Mobile'
2481
+ device: 'phablet'
2482
+ - regex: 'M-MP7S2[ABDK]3G[);/ ]'
2483
+ model: 'SmartPad 7.0 S2 3G'
2484
+ device: 'phablet'
2485
+ - regex: 'M-MP5303G[);/ ]'
2486
+ model: 'SmartPad Mini Mobile'
2487
+ device: 'phablet'
2488
+ - regex: 'M-PPAG550[);/ ]'
2489
+ model: 'PhonePad Duo G550'
2490
+ device: 'phablet'
2491
+ - regex: 'M-PP2G530[);/ ]'
2492
+ model: 'PhonePad Duo G530'
2493
+ device: 'phablet'
2494
+ - regex: 'M-PPG700[);/ ]'
2495
+ model: 'PhonePad Duo G700'
2496
+ device: 'phablet'
2497
+ - regex: 'M-PPxS531[);/ ]'
2498
+ model: 'PhonePad Duo S531'
2499
+ device: 'phablet'
2500
+ - regex: 'M-PP2S550[);/ ]'
2501
+ model: 'PhonePad Duo S550'
2502
+ device: 'phablet'
2503
+ - regex: 'M-PP2S650C?[);/ ]'
2504
+ model: 'PhonePad Duo S650'
2505
+ device: 'phablet'
2506
+ - regex: 'M-PPxS551U[);/ ]'
2507
+ model: 'PhonePad Duo S551U'
2508
+ device: 'phablet'
2509
+
2510
+ - regex: 'M-PP[ABC]G500[);/ ]'
2511
+ model: 'PhonePad Duo G500'
2512
+ device: 'smartphone'
2513
+ - regex: 'M-PP2S500[BC]?[);/ ]'
2514
+ model: 'PhonePad Duo S500'
2515
+ device: 'smartphone'
2516
+ - regex: 'M[_-]PP[Ax]X(470|510|520)U[);/ ]'
2517
+ model: 'PhonePad Duo X$1U'
2518
+ device: 'smartphone'
2519
+ - regex: 'M-PPxG(400|501)[);/ ]'
2520
+ model: 'PhonePad Duo G$1'
2521
+ device: 'smartphone'
2522
+ - regex: 'M-PPxS(470|501)[);/ ]'
2523
+ model: 'PhonePad Duo S$1'
2524
+ device: 'smartphone'
2525
+
2526
+ - regex: 'M-MP([0-9a-z]+)'
2527
+ model: 'SmartPad $1'
2528
+
2529
+ # Medion
1845
2530
  Medion:
1846
2531
  regex: 'Medion|(?:MD_)?LIFETAB'
1847
2532
  device: 'smartphone'
@@ -1852,28 +2537,65 @@ Medion:
1852
2537
  - regex: 'Medion(?: Smartphone)? ([^/;]+) Build'
1853
2538
  model: '$1'
1854
2539
 
1855
- # Meizu
1856
- Meizu:
1857
- regex: '(M04[05]|M35[1356]|MX[ -]?[234](?: Pro)?|m1 note) Build'
2540
+ # MEEG
2541
+ MEEG:
2542
+ regex: 'MEEG[ _-]'
1858
2543
  device: 'smartphone'
1859
2544
  models:
1860
- - regex: 'm1 note Build'
1861
- device: 'phablet'
1862
- model: 'M1 Note'
1863
- - regex: '(M04[05]|MX[ -]?2) Build'
2545
+ - regex: 'MEEG[ _\-]?([^/;]+) Build'
2546
+ model: '$1'
2547
+ - regex: 'MEEG[ _\-]?([^);/ ]+)'
2548
+ model: '$1'
2549
+
2550
+ # Meizu
2551
+ Meizu:
2552
+ regex: '(M04[05]|M35[1356]|MX[ -]?[234](?: Pro)?|(?:MZ-)?m[12] note|(?:MZ-)?M57[18]C)[);/ ]'
2553
+ device: 'smartphone'
2554
+ models:
2555
+ - regex: '(?:MZ-)?M571C'
2556
+ device: 'phablet'
2557
+ model: 'M2 Note'
2558
+ - regex: '(?:MZ-)?m(1|2) note[);/ ]'
2559
+ device: 'phablet'
2560
+ model: 'M$1 Note'
2561
+ - regex: '(?:MZ-)?M578C'
2562
+ model: 'M2'
2563
+ - regex: '(M04[05]|MX[ -]?2)[);/ ]'
1864
2564
  model: 'MX2'
1865
- - regex: '(M35[1356]|MX[ -]?3) Build'
2565
+ - regex: '(M35[1356]|MX[ -]?3)[);/ ]'
1866
2566
  model: 'MX3'
1867
- - regex: 'MX[ -]?4 Build'
1868
- model: 'MX4'
1869
- - regex: 'MX[ -]?4 Pro Build'
2567
+ - regex: 'MX[ -]?4 Pro[);/ ]'
1870
2568
  model: 'MX4 Pro'
2569
+ - regex: 'MX[ -]?4[);/ ]'
2570
+ model: 'MX4'
1871
2571
 
1872
2572
  # Memup
1873
2573
  Memup:
1874
- regex: 'SlidePad ?([^;/]*) Build'
2574
+ regex: 'SlidePad ?([^;/]*) Build|SPNG?[0-9]{2,4}[a-z]{0,2}[ ;/)]|SP704CE?'
1875
2575
  device: 'tablet'
1876
- model: 'SlidePad $1'
2576
+ models:
2577
+ - regex: 'SlidePad ?([^;/]*) Build'
2578
+ model: 'SlidePad $1'
2579
+ - regex: 'SPNG([0-9]{2,4}[a-z]{0,2})[ ;/)]'
2580
+ model: 'SlidePad NG$1'
2581
+ - regex: 'SP704(CE?)'
2582
+ model: 'SlidePad 704$1'
2583
+
2584
+ # Mecer
2585
+ Mecer:
2586
+ regex: '(M785|800P3[12]C|101P51C|X1010)[);/ ]'
2587
+ device: 'tablet'
2588
+ models:
2589
+ - regex: 'M785[);/ ]'
2590
+ model: 'Xpress Smartlife M785'
2591
+ - regex: 'X1010[);/ ]'
2592
+ model: 'X1010'
2593
+ - regex: '800P31C[);/ ]'
2594
+ model: 'Xpress Smartlife 800P31C'
2595
+ - regex: '800P32C[);/ ]'
2596
+ model: 'Xpress Smartlife 800P32C'
2597
+ - regex: '101P51C[);/ ]'
2598
+ model: 'Xpress Smartlife 101P51C'
1877
2599
 
1878
2600
  # mio
1879
2601
  Mio:
@@ -1893,12 +2615,46 @@ Mitsubishi:
1893
2615
  - regex: 'portalmmm/[12]\.0 (M[a-z0-9]+)'
1894
2616
  model: '$1'
1895
2617
 
2618
+ # MSI
2619
+ MSI:
2620
+ regex: 'Primo ?(?:91|76)|Enjoy 7 Plus'
2621
+ device: 'tablet'
2622
+ models:
2623
+ # explicit tablet models
2624
+ - regex: 'Primo ?76'
2625
+ model: 'Primo 76'
2626
+ - regex: 'Primo ?91'
2627
+ model: 'Primo 91'
2628
+ - regex: 'Enjoy 7 Plus'
2629
+ model: 'Enjoy 7 Plus'
2630
+
2631
+ # MLLED
2632
+ MLLED:
2633
+ regex: 'MLLED[ _]'
2634
+ device: 'smartphone'
2635
+ models:
2636
+ - regex: 'MLLED[ _]([^;/]+)Build'
2637
+ model: '$1'
2638
+ - regex: 'MLLED[ _]([^);/]+)[);/]'
2639
+ model: '$1'
2640
+
1896
2641
  # Mobistel
1897
2642
  Mobistel:
1898
2643
  regex: '(Cynus [^/;]+) Build'
1899
2644
  device: 'smartphone'
1900
2645
  model: '$1'
1901
2646
 
2647
+
2648
+ # Mofut
2649
+ Mofut:
2650
+ regex: 'Mofut'
2651
+ device: 'smartphone'
2652
+ models:
2653
+ - regex: 'Mofut[ _\-]?([^/;]+) Build'
2654
+ model: '$1'
2655
+ - regex: 'Mofut[ _\-]?((?!Build)[^);/ ]+)'
2656
+ model: '$1'
2657
+
1902
2658
  # motorola
1903
2659
  Motorola:
1904
2660
  regex: 'MOT|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\))?(?: Build|\))'
@@ -1991,7 +2747,7 @@ Motorola:
1991
2747
  model: 'RAZR $1'
1992
2748
  - regex: 'MOTORIZR[ _\-]([a-z0-9]+)'
1993
2749
  model: 'RIZR $1'
1994
- - regex: 'MOT[O]?[_\-]?([a-z0-9.]+)'
2750
+ - regex: 'MOT(?!OROLA)[O]?[_\-]?([a-z0-9.]+)'
1995
2751
  model: '$1'
1996
2752
  - regex: '(?<!AN)DROID ?([a-z0-9 ]*) Build'
1997
2753
  model: 'DROID $1'
@@ -2002,21 +2758,21 @@ Motorola:
2002
2758
  - regex: '(XOOM [^;/]*)Build'
2003
2759
  device: 'tablet'
2004
2760
  model: '$1'
2005
- - regex: '(MZ[0-9]{3}) Build'
2761
+ - regex: '(MZ[0-9]{3})[);/ ]'
2006
2762
  device: 'tablet'
2007
2763
  model: '$1'
2008
- - regex: '((?:ME|MB|XT)[0-9]{3,4}(?:\(Defy\))?) Build'
2764
+ - regex: '((?:ME|MB|XT)[0-9]{3,4}(?:\(Defy\))?)[);/ ]'
2009
2765
  model: '$1'
2010
2766
 
2011
2767
  # myphone
2012
2768
  MyPhone:
2013
- regex: '(?:MyPhone|MyPad) .+ Build'
2769
+ regex: '(?:MyPhone|MyPad) [^;/]+ Build'
2014
2770
  device: 'smartphone'
2015
2771
  models:
2016
- - regex: 'MyPad (.+) Build'
2772
+ - regex: 'MyPad ([^;/]+) Build'
2017
2773
  model: 'MyPad $1'
2018
2774
  device: 'tablet'
2019
- - regex: 'MyPhone (.+) Build'
2775
+ - regex: 'MyPhone ([^;/]+) Build'
2020
2776
  model: '$1'
2021
2777
 
2022
2778
  # M.T.T.
@@ -2048,15 +2804,44 @@ Newgen:
2048
2804
  device: 'feature phone'
2049
2805
  model: '$1'
2050
2806
 
2807
+ # Netgear
2808
+ Netgear:
2809
+ regex: 'GTV100'
2810
+ device: 'tv'
2811
+ models:
2812
+ - regex: 'GTV100'
2813
+ model: 'NeoTV Prime'
2814
+
2815
+ # NextBook
2816
+ NextBook:
2817
+ regex: 'Next[0-9]|NX785QC8G|NXM900MC|NX008HD8G|NX010HI8G|NXM908HC|NXM726'
2818
+ device: 'tablet'
2819
+ models:
2820
+ - regex: 'NX008HD8G'
2821
+ model: 'Premium 8 HD'
2822
+ - regex: 'NXM908HC'
2823
+ model: 'Premium 9'
2824
+ - regex: 'NX010HI8G'
2825
+ model: 'Premium 10 Hi'
2826
+ - regex: 'NX785QC8G'
2827
+ model: '8'
2828
+ - regex: 'NXM900MC'
2829
+ model: '8 HD'
2830
+ - regex: 'NXM726'
2831
+ model: 'Premium 7'
2832
+
2833
+ - regex: 'Next([0-9]+[^;/]+) Build'
2834
+ model: 'Next $1'
2835
+
2051
2836
  # ngm
2052
2837
  NGM:
2053
- regex: 'NGM[_ ][a-z0-9]+|(Forward|Dynamic)[ _][^/;]+(?:Build|/)'
2838
+ regex: 'NGM[_ ][a-z0-9]+|(Forward|Dynamic)[ _]?[^/;]+(?:Build|/)'
2054
2839
  device: 'smartphone'
2055
2840
  models:
2056
- - regex: '((?:Forward|Dynamic)[ _][^/;]+) Build'
2057
- model: '$1'
2058
- - regex: '((?:Forward|Dynamic)[ _][^/;]+)/'
2059
- model: '$1'
2841
+ - regex: '(Forward|Dynamic)[ _]?([^/;]+) Build'
2842
+ model: '$1 $2'
2843
+ - regex: '(Forward|Dynamic)[ _]?([^/;]+)/'
2844
+ model: '$1 $2'
2060
2845
  - regex: 'NGM ([^;/]+) Build'
2061
2846
  model: '$1'
2062
2847
  - regex: 'NGM_([a-z0-9]+)'
@@ -2072,6 +2857,26 @@ Nexian:
2072
2857
  - regex: 'S?Nexian-([a-z0-9]+)'
2073
2858
  model: '$1'
2074
2859
 
2860
+ # Noain
2861
+ Noain:
2862
+ regex: 'NOAIN'
2863
+ device: 'smartphone'
2864
+ models:
2865
+ - regex: 'NOAIN[ _-]([^;/]+) Build'
2866
+ model: '$1'
2867
+ - regex: 'NOAIN[ _-]([^;/)]+)[;/)]'
2868
+ model: '$1'
2869
+
2870
+ # Nomi
2871
+ Nomi:
2872
+ regex: 'Nomi[ _-]'
2873
+ device: 'smartphone'
2874
+ models:
2875
+ - regex: 'Nomi[ _-]([^;/]+) Build'
2876
+ model: '$1'
2877
+ - regex: 'Nomi[ _-]([^;/)]+)[;/)]'
2878
+ model: '$1'
2879
+
2075
2880
  # o2
2076
2881
  O2:
2077
2882
  regex: 'Xda|O2[ \-]|COCOON'
@@ -2103,29 +2908,108 @@ Onda:
2103
2908
 
2104
2909
  # oppo
2105
2910
  OPPO:
2106
- regex: 'OPPO[ _]?([a-z0-9]+)|X9006'
2911
+ regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|(?:X90[07][067]|U707T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?)|N520[79]|N5117[);/ ]'
2107
2912
  device: 'smartphone'
2108
2913
  models:
2109
- - regex: 'OPPO[ _]?([a-z0-9]+)'
2110
- model: '$1'
2111
- - regex: 'X9006'
2914
+ - regex: '(?:OPPO[ _]?)?U707T?[);/ ]'
2915
+ model: 'Find Way S'
2916
+ - regex: '(?:OPPO[ _]?)?X909T?[);/ ]'
2917
+ model: 'Find 5'
2918
+ - regex: '(?:OPPO[ _]?)?X907[067][);/ ]'
2919
+ model: 'Find 7'
2920
+ - regex: '(?:OPPO[ _]?)?X900[067][);/ ]'
2112
2921
  model: 'Find 7a'
2922
+ - regex: '(?:OPPO[ _]?)?R8006[);/ ]'
2923
+ model: 'R1L'
2924
+ - regex: '(?:OPPO[ _]?)?R800[07][);/ ]'
2925
+ model: 'R1S'
2926
+ - regex: '(?:OPPO[ _]?)?R8015[);/ ]'
2927
+ model: 'Find Guitar'
2928
+ - regex: '(?:OPPO[ _]?)?R810[679][);/ ]'
2929
+ model: 'R5'
2930
+ - regex: '(?:OPPO[ _]?)?R8111[);/ ]'
2931
+ model: 'Find Melody'
2932
+ - regex: '(?:OPPO[ _]?)?R8113[);/ ]'
2933
+ model: 'Piano'
2934
+ - regex: '(?:OPPO[ _]?)?R815[TW]?[);/ ]'
2935
+ model: 'Find Clover'
2936
+ - regex: '(?:OPPO[ _]?)?R821T?[);/ ]'
2937
+ model: 'Find Muse'
2938
+ - regex: '(?:OPPO[ _]?)?R827T?[);/ ]'
2939
+ model: 'Find 5 Mini'
2940
+ - regex: '(?:OPPO[ _]?)?R831[SL][);/ ]'
2941
+ model: 'Neo 5'
2942
+ - regex: '(?:OPPO[ _]?)?R831K[);/ ]'
2943
+ model: 'Neo 3'
2944
+ - regex: '(?:OPPO[ _]?)?R831T?[);/ ]'
2945
+ model: 'Neo'
2946
+ - regex: '(?:OPPO[ _]?)?N520[79][);/ ]'
2947
+ model: 'N3'
2948
+ - regex: '(?:OPPO[ _]?)?N5117[);/ ]'
2949
+ model: 'N1 Mini'
2950
+
2951
+ - regex: 'N1T?[);/ ]'
2952
+ model: 'N1T'
2953
+ device: 'phablet'
2954
+
2955
+ - regex: 'R([0-9]{3,4}[KSTW]?)[);/ ]' # valid model numbers are filtered in main regex
2956
+ model: 'R$1'
2957
+
2958
+ - regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)'
2959
+ model: '$1'
2113
2960
 
2114
2961
  # Opsson
2115
2962
  Opsson:
2116
- regex: 'Opsson ([^/;]+) Build'
2963
+ regex: 'Opsson|IUSAI'
2117
2964
  device: 'smartphone'
2118
- model: '$1'
2965
+ models:
2966
+ - regex: 'IUSAI[ _]([^/;]+) Build'
2967
+ model: 'Iusai $1'
2968
+ - regex: 'IUSAI[ _]([^/;\)]+)[/;\)]'
2969
+ model: 'Iusai $1'
2970
+ - regex: 'Opsson[ _]([^/;]+) Build'
2971
+ model: '$1'
2972
+ - regex: '(?:Opsson-)?Opsson[ -_]([^/;]+)/'
2973
+ model: '$1'
2119
2974
 
2120
2975
  # orange
2121
2976
  Orange:
2122
- regex: 'SPV[ \-]?([a-z0-9]+)|Orange ([^/;]+) Build'
2977
+ regex: 'SPV[ \-]?([a-z0-9]+)|Orange ([^/;]+) Build|SC/IHD92'
2123
2978
  device: 'smartphone'
2124
2979
  models:
2125
2980
  - regex: 'Orange ([^/;]+) Build'
2126
2981
  model: '$1'
2127
2982
  - regex: 'SPV[ \-]?([a-z0-9]+)'
2128
2983
  model: 'SPV $1'
2984
+ - regex: 'SC/IHD92'
2985
+ model: 'Livebox Play'
2986
+ device: 'tv' # set top box
2987
+
2988
+ # Ouki
2989
+ Ouki:
2990
+ regex: 'OUKI|OK[AU][0-9]+[a-z]* Build'
2991
+ device: 'smartphone'
2992
+ models:
2993
+ - regex: 'OUKI[ _-]?([^;/]+) Build'
2994
+ model: '$1'
2995
+ - regex: '([^;/)]+) Build/OUKI'
2996
+ model: '$1'
2997
+ - regex: 'OUKI[ _-]?([^;/)]+)[;/)]'
2998
+ model: '$1'
2999
+ - regex: '(OK[AU][0-9]+[a-z]*) Build'
3000
+ model: '$1'
3001
+
3002
+ # Overmax
3003
+ Overmax:
3004
+ regex: 'OV-[a-z]+(?:[^;/]+)? Build'
3005
+ device: 'tablet'
3006
+ models:
3007
+ - regex: 'OV-Vertis-([^;/]+) Build'
3008
+ model: 'OV-Vertis-$1'
3009
+ device: 'smartphone'
3010
+
3011
+ - regex: '(OV-[a-z]+(?:[^;/]+)?) Build'
3012
+ model: '$1'
2129
3013
 
2130
3014
  # Oysters
2131
3015
  Oysters:
@@ -2140,12 +3024,18 @@ Oysters:
2140
3024
 
2141
3025
  # panasonic
2142
3026
  Panasonic:
2143
- regex: 'Panasonic'
3027
+ regex: 'Panasonic|PANATV[0-9]+|Viera/|P902i[);/ ]'
2144
3028
  device: 'smartphone'
2145
3029
  models:
3030
+ - regex: 'P902i[);/ ]'
3031
+ device: 'feature phone'
3032
+ model: 'P902i'
2146
3033
  - regex: 'Panasonic MIL DLNA'
2147
3034
  device: 'tv'
2148
3035
  model: 'Viera Cast'
3036
+ - regex: 'PANATV[0-9]+|Viera/'
3037
+ device: 'tv'
3038
+ model: 'Smart TV'
2149
3039
  - regex: 'Panasonic[ \-]?([a-z0-9]+)'
2150
3040
  model: '$1'
2151
3041
  - regex: 'portalmmm/2.0 (P[a-z0-9]+)'
@@ -2153,9 +3043,18 @@ Panasonic:
2153
3043
 
2154
3044
  # philips
2155
3045
  Philips:
2156
- regex: 'Philips'
3046
+ regex: 'Philips|AND1E[);/ ]|NETTV/'
2157
3047
  device: 'smartphone'
2158
3048
  models:
3049
+ - regex: 'AND1E(?: TV)?[);/ ]'
3050
+ model: 'Android TV'
3051
+ device: 'tv'
3052
+ - regex: 'Philips, BDP([0-9]{4})'
3053
+ model: 'Blu-ray Player (BDP$1)'
3054
+ device: 'tv'
3055
+ - regex: '(NETTV/[0-9\.]{5})'
3056
+ model: 'NetTV Series'
3057
+ device: 'tv'
2159
3058
  - regex: 'Philips-FISIO ([a-z0-9]+)'
2160
3059
  model: 'Fisio $1'
2161
3060
  - regex: 'Philips[ ]?([a-z0-9]+)'
@@ -2169,6 +3068,104 @@ phoneOne:
2169
3068
  device: 'smartphone'
2170
3069
  model: '$1'
2171
3070
 
3071
+ # Pioneer
3072
+ Pioneer:
3073
+ regex: 'Pioneer|.*; R1 Build'
3074
+ device: 'smartphone'
3075
+ models:
3076
+ - regex: '.*; R1 Build'
3077
+ model: 'R1'
3078
+ device: 'tablet'
3079
+ - regex: 'Pioneer[ _-]?([^;/]+) Build'
3080
+ model: '$1'
3081
+ - regex: 'Pioneer[ _-]?([^;/)]+)[;/)]'
3082
+ model: '$1'
3083
+
3084
+
3085
+ # PULID
3086
+ PULID:
3087
+ regex: 'PULID[ _]|F1[01357]\+? Build'
3088
+ device: 'smartphone'
3089
+ models:
3090
+ - regex: 'F(1[01357]\+?) Build'
3091
+ model: 'F$1'
3092
+ - regex: 'PULID[ _]([^;/]+) Build'
3093
+ model: '$1'
3094
+ - regex: 'PULID[ _]([a-z0-9_]+)\)'
3095
+ model: '$1'
3096
+
3097
+ # Point of View
3098
+ 'Point of View':
3099
+ regex: 'POV_TV|POV_TAB|MOB-5045'
3100
+ device: 'tablet'
3101
+ models:
3102
+ - regex: 'POV_TV-HDMI-KB-01'
3103
+ model: 'HDMI Smart TV Dongle'
3104
+ device: 'tv'
3105
+ - regex: 'POV_TV-HDMI-200BT'
3106
+ model: 'Mini PC HDMI Dongle'
3107
+ device: 'tv'
3108
+ - regex: 'MOB-5045'
3109
+ model: 'Mobii Phone 5045'
3110
+ device: 'smartphone'
3111
+ - regex: 'POV_TAB-P506'
3112
+ model: 'ONYX 506 Navi'
3113
+ - regex: 'POV_TAB[_-]NAVI7[_-]3G[_-]M'
3114
+ model: 'ONYX 507 Navi'
3115
+ - regex: 'POV_TAB-P527S'
3116
+ model: 'ONYX 527S'
3117
+ - regex: 'POV_TAB-P547'
3118
+ model: 'ONYX 547 Navi'
3119
+ - regex: 'POV_TAB-PROTAB26'
3120
+ model: 'ProTab 26 XXL IPS'
3121
+ - regex: 'POV_TAB-PROTAB25XXL8?'
3122
+ model: 'ProTab 25XXL'
3123
+ - regex: 'POV_TAB-PL1015'
3124
+ model: 'Mobii 1015'
3125
+
3126
+ - regex: 'POV_TAB-PROTAB([a-z0-9]+)'
3127
+ model: 'ProTab $1'
3128
+ - regex: 'POV_TAB-P?([a-z0-9]+)'
3129
+ model: 'Mobii $1'
3130
+
3131
+ # Pomp
3132
+ Pomp:
3133
+ regex: 'POMP[ _-]'
3134
+ device: 'smartphone'
3135
+ models:
3136
+ - regex: 'POMP[ _-]([^;/]+) Build'
3137
+ model: '$1'
3138
+ - regex: 'POMP[ _-]([^;/)]+)[;/)]'
3139
+ model: '$1'
3140
+
3141
+ # ProScan
3142
+ ProScan:
3143
+ regex: 'PLT([^;/]+) Build'
3144
+ device: 'tablet'
3145
+ model: 'PLT$1'
3146
+
3147
+ # RCA Tablets
3148
+ 'RCA Tablets':
3149
+ regex: 'RCT([^;/]+) Build'
3150
+ device: 'tablet'
3151
+ model: 'RCT$1'
3152
+
3153
+ # Readboy
3154
+ Readboy:
3155
+ regex: 'Readboy[ _-]'
3156
+ device: 'tablet'
3157
+ models:
3158
+ - regex: 'Readboy[ _-]([^;/]+) Build'
3159
+ model: '$1'
3160
+ - regex: 'Readboy[ _-]([^;/]+)[;/)]'
3161
+ model: '$1'
3162
+
3163
+ # Roku
3164
+ Roku:
3165
+ regex: 'Roku/DVP'
3166
+ device: 'tv'
3167
+ model: 'Digital Video Player'
3168
+
2172
3169
  # Rover
2173
3170
  Rover:
2174
3171
  regex: 'Rover ([0-9]+)'
@@ -2191,19 +3188,25 @@ Siemens:
2191
3188
 
2192
3189
  # Samsung
2193
3190
  Samsung:
2194
- regex: 'SAMSUNG|SC-(?:02C|04E|01F)|N7100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]'
3191
+ regex: 'SAMSUNG|Maple |SC-(?:02C|04E|01F)|N[57]100|N5110|N9100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]|vollo Vi86[);/ ]|(?:OTV-)?SMT-E5015|ISW11SC'
2195
3192
  device: 'smartphone'
2196
3193
  models:
2197
3194
  # explicit tv models
2198
3195
  - regex: 'GT-B9150'
2199
3196
  device: 'tv'
2200
3197
  model: 'Home Sync'
3198
+ - regex: '(?:OTV-)?SMT-E5015'
3199
+ device: 'tv'
3200
+ model: 'SMT-E5015' # set top box
3201
+ - regex: 'Maple '
3202
+ device: 'tv'
3203
+ model: ''
2201
3204
 
2202
3205
  # explicit tablet models
2203
- - regex: '(?:SAMSUNG-)?GT-N5100'
3206
+ - regex: '(?:SAMSUNG-)?(?:GT-)?N5100'
2204
3207
  device: 'tablet'
2205
3208
  model: 'GALAXY Note 8.0"'
2206
- - regex: '(?:SAMSUNG-)?GT-N5110'
3209
+ - regex: '(?:SAMSUNG-)?(?:GT-)?N5110'
2207
3210
  device: 'tablet'
2208
3211
  model: 'GALAXY Note 8.0" WiFi'
2209
3212
  - regex: '(?:SAMSUNG-)?GT-N5120'
@@ -2388,6 +3391,8 @@ Samsung:
2388
3391
  model: 'GALAXY S Advance'
2389
3392
  - regex: '(?:SAMSUNG-)?GT-I910[08]'
2390
3393
  model: 'GALAXY S II'
3394
+ - regex: '(?:SAMSUNG-)?ISW11SC'
3395
+ model: 'GALAXY S II WiMAX'
2391
3396
  - regex: '(?:SAMSUNG-)?GT-I9103'
2392
3397
  model: 'GALAXY R'
2393
3398
  - regex: '(?:SAMSUNG-)?GT-I9105'
@@ -2400,7 +3405,7 @@ Samsung:
2400
3405
  model: 'GALAXY S III'
2401
3406
  - regex: '(?:SAMSUNG-)?(?:GT-I9305|SCH-R530)'
2402
3407
  model: 'GALAXY S III LTE'
2403
- - regex: '(?:SAMSUNG-)?(?:GT-I9505|SCH-I545|SCH-I959|SCH-R970)'
3408
+ - regex: '(?:SAMSUNG-)?(?:GT-I9505|SCH-I545|SCH-I959|SCH-R970|GALAXY-S4)'
2404
3409
  model: 'GALAXY S4'
2405
3410
  - regex: '(?:SAMSUNG-)?GT-I9506'
2406
3411
  model: 'GALAXY S4 with LTE+'
@@ -2450,7 +3455,7 @@ Samsung:
2450
3455
  model: 'GALAXY S5 mini'
2451
3456
  - regex: '(?:SAMSUNG-)?SM-G9009D'
2452
3457
  model: 'GALAXY S5 Dual-SIM'
2453
- - regex: '(?:SAMSUNG-)?SM-G900'
3458
+ - regex: '(?:SAMSUNG-)?SM-G900|GALAXY-S5'
2454
3459
  model: 'GALAXY S5'
2455
3460
  - regex: '(?:SAMSUNG-)?SCH-I200'
2456
3461
  model: 'GALAXY Stellar'
@@ -2460,6 +3465,8 @@ Samsung:
2460
3465
  model: 'GALAXY Discover'
2461
3466
  - regex: '(?:SAMSUNG-)?SCH-S738'
2462
3467
  model: 'GALAXY Centura'
3468
+ - regex: 'vollo Vi86[);/ ]'
3469
+ model: 'Vollo Vi86'
2463
3470
 
2464
3471
  # explicit phablet models
2465
3472
  - regex: '(?:SAMSUNG-)?GT-I9060'
@@ -2498,7 +3505,7 @@ Samsung:
2498
3505
  - regex: '(?:SAMSUNG-)?SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?'
2499
3506
  model: 'GALAXY Note 3'
2500
3507
  device: 'phablet'
2501
- - regex: '(?:SAMSUNG-)?SM-N910'
3508
+ - regex: '(?:SAMSUNG-)?SM-N910|N9100'
2502
3509
  model: 'GALAXY Note 4'
2503
3510
  device: 'phablet'
2504
3511
  - regex: '(?:SAMSUNG-)?SM-N915'
@@ -2532,11 +3539,18 @@ Samsung:
2532
3539
  model: '$1'
2533
3540
  - regex: '((?:SCH|SGH|SPH|SHV|SHW|GT|SM)-[a-z0-9_\-]+)'
2534
3541
  model: '$1'
3542
+ - regex: 'SMART-TV'
3543
+ device: 'tv'
3544
+ model: 'Smart TV'
3545
+ - regex: 'Galaxy ([^/;]+) Build'
3546
+ model: 'GALAXY $1'
3547
+ - regex: 'Galaxy ([a-z0-9]+)'
3548
+ model: 'GALAXY $1'
2535
3549
  - regex: 'SAMSUNG[\-][ ]?([a-z0-9]+[\-_][a-z0-9]+)'
2536
3550
  model: '$1'
2537
3551
  - regex: 'SAMSUNG;[ ]?([a-z0-9]+[\-_][a-z0-9]+)'
2538
3552
  model: '$1'
2539
- - regex: 'SAMSUNG[ _/\-]?([a-z0-9\-]+)'
3553
+ - regex: 'SAMSUNG(?!Browser)[ _/\-]?([a-z0-9\-]+)'
2540
3554
  model: '$1'
2541
3555
  - regex: 'SAMSUNG;[ ]?([a-z0-9 ]+)'
2542
3556
  model: '$1'
@@ -2544,18 +3558,53 @@ Samsung:
2544
3558
  model: '$1'
2545
3559
  - regex: 'SAM-([a-z0-9]+)'
2546
3560
  model: 'SCH-$1'
2547
- - regex: 'SMART-TV'
2548
- device: 'tv'
2549
- model: 'Smart TV'
2550
- - regex: 'Galaxy ([^/;]+) Build'
2551
- model: 'GALAXY $1'
2552
- - regex: 'Galaxy ([a-z0-9]+)'
2553
- model: 'GALAXY $1'
2554
3561
  - regex: '(?:portalmmm|o2imode)/2\.0 ([SZ][a-z0-9]+)'
2555
3562
  model: '$1'
2556
3563
  - regex: 'sam([rua][0-9]+)'
2557
3564
  model: 'SCH-$1'
2558
3565
 
3566
+ # Sencor
3567
+ Sencor:
3568
+ regex: 'Sencor|ELEMENT[ _]?(?:7|8|9\.7|10[ _]1)(?:[ _]?V[23])?[);/ ]|ELEMENT[ _]?(?:P[0-9]+)[);/ ]'
3569
+ device: 'tablet'
3570
+ models:
3571
+ # explicit tablet models
3572
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V3'
3573
+ model: 'Element 7 V3'
3574
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V2[ _]BASIC'
3575
+ model: 'Element 7 V2 Basic'
3576
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V2'
3577
+ model: 'Element 7 V2'
3578
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]8[ _]?V3'
3579
+ model: 'Element 8 V3'
3580
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]8[ _]?V2'
3581
+ model: 'Element 8 V2'
3582
+ - regex: '(?:SENCOR[ _])?ELEMENT8'
3583
+ model: 'Element 8'
3584
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]9\.7[ _]?V3'
3585
+ model: 'Element 9.7 V3'
3586
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]9\.7[ _]?V2'
3587
+ model: 'Element 9.7 V2'
3588
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]9\.7'
3589
+ model: 'Element 9.7'
3590
+ - regex: '(?:SENCOR[ _])?ELEMENT10[ _]1'
3591
+ model: 'Element 10.1'
3592
+
3593
+ - regex: '(?:SENCOR[ _])?ELEMENT[ _]?P([0-9]+)'
3594
+ model: 'Element P$1'
3595
+ device: 'smartphone'
3596
+
3597
+ - regex: 'Sencor[ _]([^;/]+) Build'
3598
+ model: '$1'
3599
+
3600
+ # Skyworth
3601
+ Skyworth:
3602
+ regex: 'Sky_?worth'
3603
+ device: 'tv'
3604
+ models:
3605
+ - regex: 'Sky_?worth ([^;/]+) Build'
3606
+ model: '$1'
3607
+
2559
3608
  # Smartfren
2560
3609
  Smartfren:
2561
3610
  regex: 'Smartfren|Androtab|Andromax|PD6D1J|AD682J|AD68[89]G|AD6B1H|AD9A1H|AD682H|AD683G'
@@ -2590,12 +3639,22 @@ Smartfren:
2590
3639
  model: 'Andromax $1'
2591
3640
  - regex: 'Andromax[ _\-]([a-z0-9]+)'
2592
3641
  model: 'Andromax $1'
2593
- - regex: 'Smartfren[ _\-]([^/;]+) Build'
3642
+ - regex: 'Smartfren[ _\-]([^/;\)]+)(?: Build|[/;\)])'
2594
3643
  model: '$1'
2595
3644
  - regex: '(Androtab[^/;]+) Build'
2596
3645
  model: '$1'
2597
3646
  device: 'tablet'
2598
3647
 
3648
+ # Stonex
3649
+ Stonex:
3650
+ regex: 'STX[ -]([^;/]+)'
3651
+ device: 'smartphone'
3652
+ models:
3653
+ - regex: 'STX[ -]([^;/]+) Build'
3654
+ model: '$1'
3655
+ - regex: 'STX[ -]([a-z0-9_-]+)'
3656
+ model: '$1'
3657
+
2599
3658
  # SuperSonic
2600
3659
  SuperSonic:
2601
3660
  regex: '(SC-[0-9]+[a-z]+)'
@@ -2608,9 +3667,47 @@ Sumvision:
2608
3667
  device: 'tablet'
2609
3668
  model: '$1'
2610
3669
 
3670
+ # SunVan
3671
+ SunVan:
3672
+ regex: 'SUNVAN[ _\-]'
3673
+ device: 'smartphone'
3674
+ models:
3675
+ - regex: 'SUNVAN[ _\-]?([^/;]+) Build'
3676
+ model: '$1'
3677
+ - regex: 'SUNVAN[ _\-]?([^);/ ]+)'
3678
+ model: '$1'
3679
+
3680
+ # Thomson
3681
+ Thomson:
3682
+ regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|8950|MID1002)[);/ ]|(?:Tlink|Every)[0-9]+'
3683
+ device: 'tablet'
3684
+ models:
3685
+ # already detected as manta device
3686
+ #- regex: 'MID1002'
3687
+ # model: 'MID1002'
3688
+ - regex : 'Primo(7|8)'
3689
+ model: 'Primo $1'
3690
+ - regex: 'QM734-2'
3691
+ model: 'QM734-2'
3692
+ - regex: 'QM734-8G'
3693
+ model: 'QM734-8G'
3694
+ - regex: 'QM735-8G'
3695
+ model: 'QM735-8G'
3696
+ - regex: 'QM736-8G\(HD\)'
3697
+ model: 'QM736-8G (HD)'
3698
+ - regex: '8950 Build'
3699
+ model: '3G 8950'
3700
+
3701
+ - regex: 'Tlink([0-9]+)'
3702
+ device: 'smartphone'
3703
+ model: 'Tlink$1'
3704
+ - regex: 'Every([0-9]+)'
3705
+ device: 'smartphone'
3706
+ model: 'Every$1'
3707
+
2611
3708
  # pantech
2612
3709
  Pantech:
2613
- regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+ Build|ADR910L'
3710
+ regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+[);/ ]|ADR910L'
2614
3711
  device: 'smartphone'
2615
3712
  models:
2616
3713
  # explicit smartphone models
@@ -2625,12 +3722,24 @@ Pantech:
2625
3722
  model: '$1'
2626
3723
  - regex: '(TX[T]?[0-9]+)'
2627
3724
  model: '$1'
2628
- - regex: '(IM-[a-z0-9]+) Build'
3725
+ - regex: '(IM-[a-z0-9]+)[);/ ]'
2629
3726
  model: '$1'
2630
3727
 
2631
- #Polaroid
3728
+ # Ployer
3729
+ Ployer:
3730
+ regex: 'MOMO([0-9]|miniS)'
3731
+ device: 'tablet'
3732
+ models:
3733
+ - regex: 'MOMOminiS'
3734
+ model: 'MOMO mini S'
3735
+ - regex: 'MOMO([0-9][^);/]*) Build'
3736
+ model: 'MOMO $1'
3737
+ - regex: 'MOMO([0-9][^);/]*)[);/]'
3738
+ model: 'MOMO $1'
3739
+
3740
+ # Polaroid
2632
3741
  Polaroid:
2633
- regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+ Build|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])'
3742
+ regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+[);/ ]|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])'
2634
3743
  device: 'tablet'
2635
3744
  models:
2636
3745
  # explicit smartphone models
@@ -2649,7 +3758,7 @@ Polaroid:
2649
3758
  device: 'smartphone'
2650
3759
  - regex: '(MID(?:1014|0714))'
2651
3760
  model: '$1'
2652
- - regex: '((?:PMID|MIDC)[0-9a-z]+) Build'
3761
+ - regex: '((?:PMID|MIDC)[0-9a-z]+)[);/ ]'
2653
3762
  model: '$1'
2654
3763
  - regex: 'Polaroid'
2655
3764
  model: ''
@@ -2659,7 +3768,7 @@ PolyPad:
2659
3768
  regex: 'POLY ?PAD'
2660
3769
  device: 'tablet'
2661
3770
  models:
2662
- - regex: 'POLY ?PAD[_ \.]([a-z0-9]+) Build'
3771
+ - regex: 'POLY ?PAD[_ \.]([a-z0-9]+)[);/ ]'
2663
3772
  model: '$1'
2664
3773
  - regex: 'POLY ?PAD[_\.]([a-z0-9]+)'
2665
3774
  model: '$1'
@@ -2674,12 +3783,12 @@ Positivo:
2674
3783
 
2675
3784
  # Prestigio
2676
3785
  Prestigio:
2677
- regex: '(?:PMP|PAP)[0-9]+[a-z0-9_]+ Build'
3786
+ regex: '(?:PMP|PAP)[0-9]+[a-z0-9_]+[);/ ]'
2678
3787
  device: 'tablet'
2679
3788
  models:
2680
- - regex: '(PMP[0-9]+[a-z0-9_]+) Build'
3789
+ - regex: '(PMP[0-9]+[a-z0-9_]+)[);/ ]'
2681
3790
  model: '$1'
2682
- - regex: '(PAP[0-9]+[a-z0-9_]+) Build'
3791
+ - regex: '(PAP[0-9]+[a-z0-9_]+(?: DUO)?)[);/ ]'
2683
3792
  model: '$1'
2684
3793
  device: 'smartphone'
2685
3794
 
@@ -2717,6 +3826,22 @@ Qilive:
2717
3826
  model: '$1'
2718
3827
  device: 'tablet'
2719
3828
 
3829
+ # QMobile
3830
+ QMobile:
3831
+ regex: 'QMobile|QTab|Q-Smart'
3832
+ device: 'smartphone'
3833
+ models:
3834
+ - regex: 'QTab[ _-]([^;/]+) Build'
3835
+ model: '$1 Tab'
3836
+ device: 'tablet'
3837
+ - regex: 'QTab[ _-]([^;/)]+)[;/)]'
3838
+ model: '$1 Tab'
3839
+ device: 'tablet'
3840
+ - regex: '(?:QMobile|Q-Smart)[ _-]([^;/]+) Build'
3841
+ model: '$1'
3842
+ - regex: '(?:QMobile|Q-Smart)[ _-]([^;/)]+)[;/)]'
3843
+ model: '$1'
3844
+
2720
3845
  # Quechua
2721
3846
  Quechua:
2722
3847
  regex: 'Quechua Phone 5'
@@ -2740,7 +3865,7 @@ Turbo-X:
2740
3865
  regex: 'Turbo-X'
2741
3866
  device: 'smartphone'
2742
3867
  models:
2743
- - regex: 'Turbo-X Ice Build'
3868
+ - regex: 'Turbo-X Ice[);/ ]'
2744
3869
  device: 'tablet'
2745
3870
  model: 'Ice'
2746
3871
  - regex: 'Turbo-X Tablet([^;/]+) Build'
@@ -2761,7 +3886,7 @@ Spice:
2761
3886
 
2762
3887
  # Sharp
2763
3888
  Sharp:
2764
- regex: 'SHARP|SBM|SH-[0-9]+[a-z]? Build|AQUOS'
3889
+ regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?[);/ ]|AQUOS'
2765
3890
  device: 'smartphone'
2766
3891
  models:
2767
3892
  # explicit smartphone models
@@ -2775,6 +3900,9 @@ Sharp:
2775
3900
  device: 'tablet'
2776
3901
  model: 'Sharp Aquos Pad'
2777
3902
 
3903
+ - regex: '(LC-(?:[0-9]{2})[a-z0-9]+)(?:[);/ ]|$)'
3904
+ device: 'tv'
3905
+ model: '$1'
2778
3906
  - regex: 'SHARP-AQUOS|AQUOSBrowser'
2779
3907
  device: 'tv'
2780
3908
  model: 'Aquos Net Plus'
@@ -2782,7 +3910,7 @@ Sharp:
2782
3910
  model: '$1'
2783
3911
  - regex: '(?:SHARP|SBM)([a-z0-9]+)'
2784
3912
  model: '$1'
2785
- - regex: '(SH-[0-9]+[a-z]?) Build'
3913
+ - regex: '(SH-?[0-9]+[a-z]?)[);/ ]'
2786
3914
  model: '$1'
2787
3915
 
2788
3916
  # Softbank
@@ -2797,27 +3925,57 @@ Softbank:
2797
3925
  - regex: 'J-PHONE/[0-9]\.[0-9]/([a-z0-9\-]+)'
2798
3926
  model: '$1'
2799
3927
 
3928
+ # Star
3929
+ Star:
3930
+ regex: 'N(9[5678]00|8800|9000|9977)[);/ ]'
3931
+ device: 'smartphone'
3932
+ models:
3933
+ - regex: 'N9000'
3934
+ model: 'Note 3'
3935
+
3936
+ - regex: 'N(9[5678]00|8800|9977)[);/ ]'
3937
+ model: 'N$1'
3938
+
2800
3939
  # Kindle
2801
- Kindle:
2802
- regex: 'KF(?:OT|TT|JWI|JWA|SOWI|APWI|THWI) Build|Kindle|Silk/\d+\.\d+|Amazon (?:Tate|Jem)'
3940
+ Amazon:
3941
+ regex: 'KF(?:OT|TT|JWI|JWA|SOWI|A[PRS]WI|THWI|SAW[IA])[);/ ]|Kindle|Silk/\d+\.\d+|Amazon (?:Tate|Jem)|AFT[BM]|SD4930UR'
2803
3942
  device: 'tablet'
2804
3943
  models:
2805
- - regex: 'KFTT Build'
3944
+ - regex: 'AFTB'
3945
+ model: 'Fire TV'
3946
+ device: 'tv'
3947
+ - regex: 'AFTM'
3948
+ model: 'Fire TV stick'
3949
+ device: 'tv'
3950
+ - regex: 'KFTT[);/ ]'
2806
3951
  model: 'Kindle Fire HD'
2807
- - regex: 'KFJWI Build|Amazon Jem'
3952
+ - regex: 'KFJWI[);/ ]|Amazon Jem'
2808
3953
  model: 'Kindle Fire HD 8.9" WiFi'
2809
- - regex: 'KFJWA Build'
3954
+ - regex: 'KFJWA[);/ ]'
2810
3955
  model: 'Kindle Fire HD 8.9" 4G'
2811
- - regex: 'KFSOWI Build|Amazon Tate'
3956
+ - regex: 'KFSOWI[);/ ]|Amazon Tate'
2812
3957
  model: 'Kindle Fire HD 7" WiFi'
2813
- - regex: 'KFTHWI Build'
3958
+ - regex: 'KFTHWI[);/ ]'
2814
3959
  model: 'Kindle Fire HDX 7" WiFi'
2815
- - regex: 'KFTHWA Build'
3960
+ - regex: 'KFTHWA[);/ ]'
2816
3961
  model: 'Kindle Fire HDX 7" 4G'
2817
- - regex: 'KFAPWI Build'
3962
+ - regex: 'KFAPWI[);/ ]'
2818
3963
  model: 'Kindle Fire HDX 8.9" WiFi'
2819
- - regex: 'KFAPWA Build'
3964
+ - regex: 'KFAPWA[);/ ]'
2820
3965
  model: 'Kindle Fire HDX 8.9" 4G'
3966
+ - regex: 'KFARWI[);/ ]'
3967
+ model: 'Fire HD 6'
3968
+ - regex: 'KFASWI[);/ ]'
3969
+ model: 'Fire HD 7'
3970
+ - regex: 'KFSAWI[);/ ]'
3971
+ model: 'Fire HDX 8.9'
3972
+ - regex: 'KFSAWA[);/ ]'
3973
+ model: 'Fire HDX 8.9 4G'
3974
+ - regex: 'SD4930UR'
3975
+ model: 'Fire Phone'
3976
+ device: 'smartphone'
3977
+
3978
+
2821
3979
  - regex: 'KFOT|Kindle Fire|Silk/\d+\.\d+'
2822
3980
  model: 'Kindle Fire'
2823
3981
  - regex: 'Kindle'
@@ -2847,9 +4005,13 @@ T-Mobile:
2847
4005
 
2848
4006
  # Tcl
2849
4007
  TCL:
2850
- regex: 'TCL-([a-z0-9]+)'
4008
+ regex: 'TCL[ -][a-z0-9]+|TCL[_ -][^;/]+ Build'
2851
4009
  device: 'smartphone'
2852
- model: '$1'
4010
+ models:
4011
+ - regex: 'TCL[_ -]([^;/]+) Build'
4012
+ model: '$1'
4013
+ - regex: 'TCL[ -]([a-z0-9]+)'
4014
+ model: '$1'
2853
4015
 
2854
4016
  # Tecno Mobile
2855
4017
  Tecno Mobile:
@@ -2873,6 +4035,16 @@ teXet:
2873
4035
  device: 'tablet'
2874
4036
  model: '$1'
2875
4037
 
4038
+ # Telenor
4039
+ Telenor:
4040
+ regex: 'Telenor'
4041
+ device: 'smartphone'
4042
+ models:
4043
+ - regex: 'Telenor[ _]([^;/]+) Build'
4044
+ model: '$1'
4045
+ - regex: 'Telenor[ _]([^a-z0-9_]+)\)'
4046
+ model: '$1'
4047
+
2876
4048
  # Telit
2877
4049
  Telit:
2878
4050
  regex: 'Telit'
@@ -2883,6 +4055,16 @@ Telit:
2883
4055
  - regex: 'Telit[\-_]?([a-z0-9]+)'
2884
4056
  model: '$1'
2885
4057
 
4058
+ # ThL
4059
+ ThL:
4060
+ regex: 'ThL[ _-]'
4061
+ device: 'smartphone'
4062
+ models:
4063
+ - regex: 'ThL[ _-]*([^;/]+) Build'
4064
+ model: '$1'
4065
+ - regex: 'ThL[ _-]*([^ ;/)]+)[ ;/)]'
4066
+ model: '$1'
4067
+
2886
4068
  # Tianyu
2887
4069
  TIANYU:
2888
4070
  regex: 'TIANYU'
@@ -2905,6 +4087,46 @@ Toplux:
2905
4087
  device: 'feature phone'
2906
4088
  model: '$1'
2907
4089
 
4090
+ # Trevi
4091
+ Trevi:
4092
+ regex: 'Trevi[ _]|TAB[ _]10[ _]3G[ _]V16|TAB[ _](7|8)[ _]3G[ _]V8|TAB9 3G|MINITAB 3GV|Phablet[ _](?:4|4\.5|5|5\,3|6)[ _]?[C|S|Q]|REVERSE[ _]5\.5[ _]?Q'
4093
+ device: 'tablet'
4094
+ models:
4095
+ - regex: 'TAB[ _]?(7|8)[ _]3G[ _]V8'
4096
+ model: 'TAB $1 3G V8'
4097
+ - regex: 'TAB[ _]?9[ _]3G[ _]V8'
4098
+ model: 'TAB 9 3G V8'
4099
+ - regex: 'TAB[ _]?9[ _]3G'
4100
+ model: 'TAB 9 3G'
4101
+ - regex: 'TAB[ _]10[ _]3G[ _]V16'
4102
+ model: 'TAB 10 3G V16'
4103
+ - regex: 'MINITAB 3GV'
4104
+ model: 'MINITAB 3G V'
4105
+ - regex: '(?:Trevi_)?Phablet[ _]4[ _]?C'
4106
+ model: 'Phablet 4 C'
4107
+ device: 'smartphone'
4108
+ - regex: '(?:Trevi_)?Phablet[ _]4[ _]?S'
4109
+ model: 'Phablet 4 S'
4110
+ device: 'smartphone'
4111
+ - regex: '(?:Trevi_)?Phablet[ _]4.5[ _]?Q'
4112
+ model: 'Phablet 4.5Q'
4113
+ device: 'smartphone'
4114
+ - regex: '(?:Trevi_)?PHABLET[ _]5[ _]?S'
4115
+ model: 'Phablet 5 S'
4116
+ device: 'smartphone'
4117
+ - regex: '(?:Trevi_)?PHABLET[ _]5,3[ _]?Q'
4118
+ model: 'Phablet 5.3 Q'
4119
+ device: 'phablet'
4120
+ - regex: '(?:Trevi_)?REVERSE[ _]5.5[ _]?Q'
4121
+ model: 'Phablet 5.5 Q REVERSE'
4122
+ device: 'phablet'
4123
+ - regex: '(?:Trevi_)?PHABLET[ _]6[ _]?S'
4124
+ model: 'Phablet 6 S'
4125
+ device: 'phablet'
4126
+
4127
+ - regex: 'Trevi[_]([^;/]+) Build'
4128
+ model: '$1'
4129
+
2908
4130
  #TVC
2909
4131
  TVC:
2910
4132
  regex: '(NuclearSX-SP5)'
@@ -2924,15 +4146,36 @@ UTStarcom:
2924
4146
  device: 'feature phone'
2925
4147
  model: '$1'
2926
4148
 
4149
+ # Uniscope
4150
+ Uniscope:
4151
+ regex: 'Uniscope'
4152
+ device: 'smartphone'
4153
+ models:
4154
+ - regex: 'Uniscope[ _\-]?([^/;]+) Build'
4155
+ model: '$1'
4156
+ - regex: 'Uniscope[ _\-]?([^);/ ]+)'
4157
+ model: '$1'
4158
+
4159
+ # Vastking
4160
+ Vastking:
4161
+ regex: 'M910A[);/ ]'
4162
+ device: 'tablet'
4163
+ models:
4164
+ - regex: 'M910A[);/ ]'
4165
+ model: 'M910A'
4166
+
2927
4167
  # ViewSonic
2928
4168
  ViewSonic:
2929
- regex: 'ViewSonic|VSD[0-9]+ Build|ViewPad'
4169
+ regex: 'ViewSonic|VSD[0-9]+[);/ ]|ViewPad|ViewPhone'
2930
4170
  device: 'smart display'
2931
4171
  models:
4172
+ - regex: '(?:ViewSonic-)?ViewPhone ?([^;/]+) Build'
4173
+ model: 'ViewPhone $1'
4174
+ device: 'smartphone'
2932
4175
  - regex: '(?:ViewSonic-)?ViewPad ?([^;/]+) Build'
2933
4176
  model: 'ViewPad $1'
2934
4177
  device: 'tablet'
2935
- - regex: '(VSD[0-9]+) Build'
4178
+ - regex: '(VSD[0-9]+)[);/ ]'
2936
4179
  model: '$1'
2937
4180
 
2938
4181
  # Vitelcom
@@ -2949,7 +4192,7 @@ Vitelcom:
2949
4192
 
2950
4193
  # VK Mobile
2951
4194
  VK Mobile:
2952
- regex: 'VK[\-]?([a-z0-9 ]+)'
4195
+ regex: 'VK[\-]?([a-z0-9 ]+)[ ;\)/]'
2953
4196
  device: 'feature phone'
2954
4197
  model: '$1'
2955
4198
 
@@ -2961,9 +4204,74 @@ Vertu:
2961
4204
 
2962
4205
  # Videocon
2963
4206
  Videocon:
2964
- regex: 'Videocon[_ ]([a-z0-9]+)'
4207
+ regex: 'Videocon[_ \-]|VT75C'
2965
4208
  device: 'smartphone'
2966
- model: '$1'
4209
+ models:
4210
+ - regex: 'Videocon[_ \-]([a-z0-9]+)'
4211
+ model: '$1'
4212
+ - regex: 'VT75C[/;) ]'
4213
+ model: 'VT75C'
4214
+
4215
+ # Vodafone
4216
+ Vodafone:
4217
+ regex: 'Vodafone[ _-]|Smart ?Tab ?(?:III? ?)?(?:|4G|7|10)[);/ -]|VodafoneSmartChat'
4218
+ device: 'smartphone'
4219
+ models:
4220
+ - regex: 'Vodafone[ _]875[);/ ]'
4221
+ model: 'Smart Mini' # Alcatel
4222
+ - regex: 'Vodafone[ _]975N?[);/ ]'
4223
+ model: 'Smart 3' # Alcatel
4224
+ - regex: 'Vodafone[ _]785[);/ ]'
4225
+ model: 'Smart 4 Mini'
4226
+ - regex: 'Vodafone[ _]890N[);/ ]'
4227
+ model: 'Smart 4 Turbo' # Coolpad 3601U
4228
+ - regex: 'Vodafone[ _]985N[);/ ]'
4229
+ model: 'Smart 4 Power'
4230
+ - regex: 'VodafoneSmartChat'
4231
+ model: 'Smart Chat'
4232
+
4233
+ # explicit table models
4234
+ - regex: 'Smart ?Tab ?3G'
4235
+ device: 'tablet'
4236
+ model: 'Smart Tab 3G'
4237
+ - regex: 'Smart ?Tab ?4G'
4238
+ device: 'tablet'
4239
+ model: 'Smart Tab 4G' # Alcatel
4240
+ - regex: 'SmartTab7[);/ -]'
4241
+ model: 'Smart Tab 7' # ZTE
4242
+ device: 'tablet'
4243
+ - regex: 'SmartTab10[);/ -]'
4244
+ model: 'Smart Tab 10' # ZTE
4245
+ device: 'tablet'
4246
+ - regex: 'Smart ?Tab ?II ?7'
4247
+ model: 'Smart Tab II 7' # Lenovo
4248
+ device: 'tablet'
4249
+ - regex: 'Smart ?Tab ?II ?10'
4250
+ model: 'Smart Tab II 10' # Lenovo
4251
+ device: 'tablet'
4252
+ - regex: 'Smart ?Tab ?III ?7'
4253
+ model: 'Smart Tab III 7' # Lenovo
4254
+ device: 'tablet'
4255
+ - regex: 'Smart ?Tab ?III ?10'
4256
+ model: 'Smart Tab III 10' # Lenovo
4257
+ device: 'tablet'
4258
+
4259
+ - regex: 'Vodafone[ _-]([^;/]+) Build'
4260
+ model: '$1'
4261
+ - regex: 'Vodafone[ _-]([a-z0-9_-]+)'
4262
+ model: '$1'
4263
+
4264
+ # Voto
4265
+ Voto:
4266
+ regex: 'VOTO[ _\-]|VT8[89]8[;/) ]'
4267
+ device: 'smartphone'
4268
+ models:
4269
+ - regex: 'VOTO[ _\-]?([^/;]+) Build'
4270
+ model: '$1'
4271
+ - regex: 'VOTO[ _\-]?([^);/ ]+)'
4272
+ model: '$1'
4273
+ - regex: '(VT8[89]8)[;/) ]'
4274
+ model: '$1'
2967
4275
 
2968
4276
  # Voxtel
2969
4277
  Voxtel:
@@ -2971,15 +4279,53 @@ Voxtel:
2971
4279
  device: 'feature phone'
2972
4280
  model: '$1'
2973
4281
 
4282
+ # Walton
4283
+ Walton:
4284
+ regex: 'Walton|Walpad|Primo[ _](C[1234]?|D[12345]|E[12345]|EF[23]?|EM|F[123456]i?|G[12345]|GF[234]?|GH[23]?|GM|H[23]|HM|N|N1|NF|NX2?|R[123]|RH2?|RM2?|RX[23]?|S[1234]|V1|X[123]|Z|ZX)'
4285
+ device: 'smartphone'
4286
+ models:
4287
+ - regex: 'Walpad ([^;/]+) Build'
4288
+ device: 'tablet'
4289
+ model: 'Primo Walpad $1'
4290
+ - regex: 'Walton[ _]([^;/]+) Build'
4291
+ model: '$1'
4292
+ - regex: 'Walton[ _]([^;/]+)\)'
4293
+ model: '$1'
4294
+ - regex: 'Primo[ _]([^;/]+) Build'
4295
+ model: 'Primo $1'
4296
+ - regex: 'Primo[ _]([0-9a-z]+)'
4297
+ model: 'Primo $1'
4298
+
2974
4299
  # Wellcom
2975
4300
  WellcoM:
2976
4301
  regex: 'WELLCOM[ _\-/]([a-z0-9]+)'
2977
4302
  device: 'smartphone'
2978
4303
  model: '$1'
2979
4304
 
4305
+ # Wexler
4306
+ Wexler:
4307
+ regex: 'Wexler|TAB[ _]10Q[);/ ]|ZEN[ _](?:4\.5|4\.7|5)'
4308
+ device: 'tablet'
4309
+ models:
4310
+ - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.5[);/ ]'
4311
+ model: 'ZEN 4.5'
4312
+ device: 'smartphone'
4313
+ - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.7[);/ ]'
4314
+ model: 'ZEN 4.7'
4315
+ device: 'smartphone'
4316
+ - regex: '(?:Wexler[ _\-\.])?ZEN[ _]5[);/ ]'
4317
+ model: 'ZEN 5'
4318
+ device: 'smartphone'
4319
+ - regex: '(?:Wexler[ _\-\.])?TAB[ _]10Q[);/ ]'
4320
+ model: 'TAB 10Q'
4321
+ - regex: 'Wexler[ _\-\.]([^;/]+) Build'
4322
+ model: '$1'
4323
+ - regex: 'Wexler[ _\-\.]([^);/]+)[);/]'
4324
+ model: '$1'
4325
+
2980
4326
  # Wiko
2981
4327
  Wiko:
2982
- regex: '(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink.*|Highway.*|Iggy|Stairway|Rainbow|Darkside|Darkmoon|Darkfull|Darknight|Sublim|Ozzy|Barry|Birdy|Bloom|Getaway|Goa|Kite|Lenny|Slide|Sunset|Wax) Build'
4328
+ regex: '(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink.*|Highway.*|Iggy|Stairway|Rainbow|Darkside|Darkmoon|Darkfull|Darknight|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa|Kite|Lenny|Slide|Sunset|Wax|Ridge(?: Fab)?)(?: 4G)? Build'
2983
4329
  device: 'smartphone'
2984
4330
  models:
2985
4331
  - regex: '(?:WIKO-)?CINK_([a-z0-9_]+)'
@@ -2994,8 +4340,16 @@ Wiko:
2994
4340
  model: 'Iggy'
2995
4341
  - regex: '(?:WIKO-)?Stairway Build'
2996
4342
  model: 'Stairway'
4343
+ - regex: '(?:WIKO-)?Ridge Build'
4344
+ model: 'Ridge'
4345
+ - regex: '(?:WIKO-)?Ridge Fab 4G Build'
4346
+ model: 'Ridge Fab 4G'
4347
+ - regex: '(?:WIKO-)?Ridge 4G Build'
4348
+ model: 'Ridge 4G'
2997
4349
  - regex: '(?:WIKO-)?Rainbow Build'
2998
4350
  model: 'Rainbow'
4351
+ - regex: '(?:WIKO-)?Rainbow 4G Build'
4352
+ model: 'Rainbow 4G'
2999
4353
  - regex: '(?:WIKO-)?Darkside Build'
3000
4354
  model: 'Darkside'
3001
4355
  - regex: '(?:WIKO-)?Darkmoon Build'
@@ -3014,6 +4368,8 @@ Wiko:
3014
4368
  model: 'Birdy'
3015
4369
  - regex: '(?:WIKO-)?Bloom Build'
3016
4370
  model: 'Bloom'
4371
+ - regex: '(?:WIKO-)?JIMMY Build'
4372
+ model: 'Jimmy'
3017
4373
  - regex: '(?:WIKO-)?Getaway Build'
3018
4374
  model: 'Getaway'
3019
4375
  - regex: '(?:WIKO-)?Goa Build'
@@ -3048,23 +4404,57 @@ Wonu:
3048
4404
 
3049
4405
  # Woxter
3050
4406
  Woxter:
3051
- regex: 'Woxter (.+) Build'
4407
+ regex: 'Woxter ([^/;]+) Build'
3052
4408
  device: 'tablet'
3053
4409
  model: '$1'
3054
4410
 
3055
4411
  #Xiaomi
3056
4412
  Xiaomi:
3057
- regex: '(MI [a-z0-9]+|MI-One[ _]Plus) Build|HM ([^/;]+) Build'
4413
+ regex: 'Xiaomi|(MI [a-z0-9]+|MI-One[ _]?[a-z0-9]+)[);/ ]|HM ([^/;]+) Build|(2014501|2014011|201481[13]|201302[23]|2013061) Build|Redmi'
3058
4414
  device: 'smartphone'
3059
4415
  models:
3060
- - regex: '(MI [a-z0-9]+|MI-One[ _]Plus) Build'
4416
+ # specific smartphone models
4417
+ - regex: 'Xiaomi_2014501|2014501 Build'
4418
+ model: 'Hongmi 4G'
4419
+ - regex: 'Xiaomi_2014011|2014011 Build'
4420
+ model: 'Hongmi 1S'
4421
+ - regex: 'Xiaomi_201481[13]|201481[13] Build'
4422
+ model: 'Hongmi 2 4G'
4423
+ - regex: 'Xiaomi_201302[23]|201302[23] Build'
4424
+ model: 'Hongmi'
4425
+ - regex: 'Xiaomi_2013061|2013061 Build'
4426
+ model: 'MI 3'
4427
+
4428
+ - regex: 'Redmi Note ([^;/]+)? Build'
4429
+ model: 'Redmi Note $1'
4430
+ device: 'phablet'
4431
+ - regex: 'Redmi ([^;/]+)? Build'
4432
+ model: 'Redmi $1'
4433
+ - regex: 'MI Note ([^;/]+)? Build'
4434
+ model: 'MI Note $1'
4435
+ device: 'phablet'
4436
+ - regex: '(MI(?:-One)?[ _](?:[^;/]*))Build'
4437
+ model: '$1'
4438
+ - regex: '(MI [a-z0-9]+|MI-One[ _]?[a-z0-9]+)[);/ ]'
3061
4439
  model: '$1'
3062
4440
  - regex: 'HM Note ([^/;]+) Build'
3063
- device: 'tablet'
4441
+ device: 'phablet'
3064
4442
  model: 'HM Note $1'
3065
4443
  - regex: 'HM ([^/;]+) Build'
3066
4444
  model: 'HM $1'
3067
4445
 
4446
+ # Xolo
4447
+ Xolo:
4448
+ regex: 'Xolo|(?:Q600|Q700s?|Q800|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])[);/ ]'
4449
+ device: 'smartphone'
4450
+ models:
4451
+ - regex: '(Q600|Q700s?|Q800|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])[);/ ]'
4452
+ model: '$1'
4453
+ - regex: 'Xolo[ _]?([^;/]+) Build'
4454
+ model: '$1'
4455
+ - regex: 'Xolo[ _]?([a-z0-9_-]+)'
4456
+ model: '$1'
4457
+
3068
4458
  # Yarvik
3069
4459
  Yarvik:
3070
4460
  regex: 'Xenta[ \-]Tab|Luna TAB|TAB09-410|TAB10-410|TAB07-485|TAB0[78]-200|TAB08-201-3G|TAB9-200|TAB09-211|TAB10-2[01]1|TAB13-201'
@@ -3106,7 +4496,7 @@ Yarvik:
3106
4496
 
3107
4497
  # Yuandao
3108
4498
  Yuandao:
3109
- regex: 'N101[ _]DUAL(?:[ _]CORE)?(?:[ _]?2|\|\|)?(?:[ _]V11)? Build'
4499
+ regex: 'N101[ _]DUAL(?:[ _]CORE)?(?:[ _]?2|\|\|)?(?:[ _]V11)?[);/ ]'
3110
4500
  device: 'tablet'
3111
4501
  model: 'N101'
3112
4502
 
@@ -3124,6 +4514,16 @@ Yusun:
3124
4514
  - regex: 'Yusun ([a-z0-9_\-\+]+)'
3125
4515
  model: '$1'
3126
4516
 
4517
+ # Ytone
4518
+ Ytone:
4519
+ regex: 'YTONE[ _\-]'
4520
+ device: 'smartphone'
4521
+ models:
4522
+ - regex: 'YTONE[ _\-]?([^/;]+) Build'
4523
+ model: '$1'
4524
+ - regex: 'YTONE[ _\-]?([^);/ ]+)'
4525
+ model: '$1'
4526
+
3127
4527
  # Zonda
3128
4528
  Zonda:
3129
4529
  regex: '(ZM(?:CK|EM|TFTV|TN)[a-z0-9]+)'
@@ -3132,7 +4532,7 @@ Zonda:
3132
4532
 
3133
4533
  # Toshiba
3134
4534
  Toshiba:
3135
- regex: 'Toshiba|portalmmm/[12].0 TS|T-01C|T-0[12]D|IS04|IS11T|AT1S0|AT300SE|AT(100|200|270|300|330|374|400|470|500|503|570|703|830)'
4535
+ regex: 'Toshiba|TSBNetTV/|portalmmm/[12].0 TS|T-01C|T-0[12]D|IS04|IS11T|AT1S0|AT300SE|AT(100|200|270|300|330|374|400|470|500|503|570|703|830)'
3136
4536
  device: 'smartphone'
3137
4537
  models:
3138
4538
  # explicit smartphone models
@@ -3161,6 +4561,9 @@ Toshiba:
3161
4561
  model: 'Regza AT$1'
3162
4562
  device: 'tablet'
3163
4563
 
4564
+ - regex: 'TSBNetTV/'
4565
+ device: 'tv'
4566
+ model: ''
3164
4567
  - regex: 'Toshiba[ /_\-]?([a-z0-9_ \-]+) Build'
3165
4568
  model: '$1'
3166
4569
  - regex: 'Toshiba[ /_\-]?([a-z0-9_\-]+)'
@@ -3170,13 +4573,99 @@ Toshiba:
3170
4573
 
3171
4574
  # Fly
3172
4575
  Fly:
3173
- regex: 'Fly(?!Flow|touch)|MERIDIAN-'
4576
+ regex: 'Fly(?!Flow|touch)|MERIDIAN-|(?:IQ[0-9]{3,})[ _]?(?:Quad|Firebird|Quattro|Turbo|Magic)?(?: Build|[;/\)])'
3174
4577
  device: 'smartphone'
3175
4578
  models:
4579
+ - regex: '(?:Fly_)?IQ310(?: Build|[;/\)])'
4580
+ model: 'Panorama'
4581
+ device: 'tablet'
4582
+
4583
+ - regex: '(?:Fly_)?IQ236(?: Build|[;/\)])'
4584
+ model: 'Victory'
4585
+ - regex: '(?:Fly_)?IQ237(?: Build|[;/\)])'
4586
+ model: 'Dynamic'
4587
+ - regex: '(?:Fly_)?IQ238(?: Build|[;/\)])'
4588
+ model: 'Jazz'
4589
+ - regex: '(?:Fly_)?IQ240(?: Build|[;/\)])'
4590
+ model: 'Whizz'
4591
+ - regex: '(?:Fly_)?IQ255(?: Build|[;/\)])'
4592
+ model: 'Pride'
4593
+ - regex: '(?:Fly_)?IQ270(?: Firebird)?(?: Build|[;/\)])'
4594
+ model: 'Firebird'
4595
+ - regex: '(?:Fly_)?IQ275(?: Build|[;/\)])'
4596
+ model: 'Marathon'
4597
+ - regex: '(?:Fly_)?IQ285(?: Turbo)?(?: Build|[;/\)])'
4598
+ model: 'Turbo'
4599
+ - regex: '(?:Fly_)?IQ430(?: Build|[;/\)])'
4600
+ model: 'Evoke'
4601
+ - regex: '(?:Fly_)?IQ431(?: Build|[;/\)])'
4602
+ model: 'Glory'
4603
+ - regex: '(?:Fly_)?IQ432(?: Build|[;/\)])'
4604
+ model: 'Era Nano 1'
4605
+ - regex: '(?:Fly_)?IQ434(?: Build|[;/\)])'
4606
+ model: 'Era Nano 5'
4607
+ - regex: '(?:Fly_)?IQ436(?: Build|[;/\)])'
4608
+ model: 'Era Nano 3'
4609
+ - regex: '(?:Fly_)?IQ440(?: Build|[;/\)])'
4610
+ model: 'Energy'
4611
+ - regex: '(?:Fly_)?IQ441(?: Build|[;/\)])'
4612
+ model: 'Radiance'
4613
+ - regex: '(?:Fly_)?IQ442(?: Build|[;/\)])'
4614
+ model: 'Miracle'
4615
+ - regex: '(?:Fly_)?IQ442 Quad(?: Build|[;/\)])'
4616
+ model: 'Miracle 2'
4617
+ - regex: '(?:Fly_)?IQ443(?: Build|[;/\)])'
4618
+ model: 'Trend'
4619
+ - regex: '(?:Fly_)?IQ444(?: Quattro)?(?: Build|[;/\)])'
4620
+ model: 'Diamond 2'
4621
+ - regex: '(?:Fly_)?IQ445(?: Build|[;/\)])'
4622
+ model: 'Genius'
4623
+ - regex: '(?:Fly_)?IQ446(?: Magic)?(?: Build|[;/\)])'
4624
+ model: 'Magic'
4625
+ - regex: '(?:Fly_)?IQ447(?: Build|[;/\)])'
4626
+ model: 'Era Life 1'
4627
+ - regex: '(?:Fly_)?IQ448(?: Build|[;/\)])'
4628
+ model: 'Chic'
4629
+ - regex: '(?:Fly_)?IQ449(?: Build|[;/\)])'
4630
+ model: 'Pronto'
4631
+ - regex: '(?:Fly_)?IQ450(?: Build|[;/\)])'
4632
+ model: 'Horizon'
4633
+ - regex: '(?:Fly_)?IQ450[ _]Quattro(?: Build|[;/\)])'
4634
+ model: 'Horizon 2'
4635
+ - regex: '(?:Fly_)?IQ451(?: Build|[;/\)])'
4636
+ model: 'Vista'
4637
+ - regex: '(?:Fly_)?IQ452 Quad(?: Build|[;/\)])'
4638
+ model: 'Ego Vision 1'
4639
+ - regex: '(?:Fly_)?IQ454(?: Build|[;/\)])'
4640
+ model: 'Evo Tech 1'
4641
+ - regex: '(?:Fly_)?IQ456(?: Build|[;/\)])'
4642
+ model: 'Era Life 2'
4643
+ - regex: '(?:Fly_)?IQ4403(?: Build|[;/\)])'
4644
+ model: 'Energy 3'
4645
+ - regex: '(?:Fly_)?IQ4404(?: Build|[;/\)])'
4646
+ model: 'Spark'
4647
+ - regex: '(?:Fly_)?IQ4406(?: Build|[;/\)])'
4648
+ model: 'Era Nano 6'
4649
+ - regex: '(?:Fly_)?IQ4410 Quad(?: Build|[;/\)])'
4650
+ model: 'Phoenix'
4651
+ - regex: '(?:Fly_)?IQ4411(?: Build|[;/\)])'
4652
+ model: 'Energy 2'
4653
+ - regex: '(?:Fly_)?IQ4412 Quad(?: Build|[;/\)])'
4654
+ model: 'Coral'
4655
+ - regex: '(?:Fly_)?IQ4414 Quad(?: Build|[;/\)])'
4656
+ model: 'Evo Tech 3'
4657
+ - regex: '(?:Fly_)?IQ4415 Quad(?: Build|[;/\)])'
4658
+ model: 'Era Style 3'
4659
+ - regex: '(?:Fly_)?IQ4490(?: Build|[;/\)])'
4660
+ model: 'Era Nano 4'
4661
+ - regex: '(?:Fly_)?IQ4504 Quad(?: Build|[;/\)])'
4662
+ model: 'Evo Energy 5'
4663
+ - regex: '(?:Fly_)?IQ([0-9]+) ?(?:Quad|Firebird|Quattro)? Build'
4664
+ model: 'IQ$1'
3176
4665
  - regex: 'Fly[ _\-]?([a-z0-9_]+)/'
3177
4666
  model: '$1'
3178
4667
  device: 'feature phone'
3179
- - regex: 'Flylife[ _\-]?(.*) Build'
4668
+ - regex: 'Flylife[ _\-]?([^/;]+) Build'
3180
4669
  model: 'Flylife $1'
3181
4670
  device: 'tablet'
3182
4671
  - regex: 'Fly[ _\-]?([a-z0-9]+)'
@@ -3184,11 +4673,21 @@ Fly:
3184
4673
  - regex: 'MERIDIAN-([a-z0-9]+)'
3185
4674
  model: '$1'
3186
4675
 
3187
- # Web TV
3188
- Web TV:
4676
+ # Devices with undectable brand, but detectable model
4677
+ Unknown:
3189
4678
  regex: 'WebTV/(\d+\.\d+)'
3190
4679
  device: 'tv'
3191
- model: ''
4680
+ model: 'Web TV'
4681
+
4682
+ # Zeemi
4683
+ Zeemi:
4684
+ regex: 'ZEEMI[ _-]'
4685
+ device: 'smartphone'
4686
+ models:
4687
+ - regex: 'ZEEMI[ _-]([^/;]+) Build'
4688
+ model: '$1'
4689
+ - regex: 'ZEEMI[ _-]([^/;)]+)[/;)]'
4690
+ model: '$1'
3192
4691
 
3193
4692
  # Zopo
3194
4693
  Zopo:
@@ -3198,16 +4697,68 @@ Zopo:
3198
4697
 
3199
4698
  # ZTE
3200
4699
  ZTE:
3201
- regex: 'ZTE|Z331|N799D|([a-z0-9]+)_USA_Cricket'
4700
+ regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade S6|N9[15]8St|NX(?:403A|40[X2]|507J|503A|505J|506J|508J|510J|511J|513J|601J)|Z331|N9510|N9180|N9101|N9515|N952[01]|N9810|N799D|[UV]9180|[UV]9815|Z768G)[);/ ]'
3202
4701
  device: 'smartphone'
3203
4702
  models:
3204
4703
  # explicit smartphone models
3205
- - regex: 'N799D'
4704
+ - regex: 'N799D[);/ ]'
3206
4705
  model: 'MTS Blaze 4'
4706
+ - regex: 'N918St[);/ ]'
4707
+ model: 'V5S'
4708
+ - regex: 'N958St[);/ ]'
4709
+ model: 'V5 Max'
4710
+ - regex: 'N9101[);/ ]'
4711
+ model: 'Imperial'
4712
+ - regex: 'N9180[);/ ]'
4713
+ model: 'V5'
4714
+ - regex: 'N9510[);/ ]'
4715
+ model: 'Wrap 4G'
4716
+ - regex: 'N9515[);/ ]'
4717
+ model: 'Wrap Sync'
4718
+ - regex: 'N9520[);/ ]'
4719
+ model: 'Boost Max'
4720
+ - regex: 'N9521[);/ ]'
4721
+ model: 'Boost Max+'
4722
+ - regex: 'N9810[);/ ]'
4723
+ model: 'Vital'
4724
+ - regex: 'NX40[X2][);/ ]'
4725
+ model: 'Nubia Z5 mini'
4726
+ - regex: 'NX403A[);/ ]'
4727
+ model: 'Nubia Z5S mini'
4728
+ - regex: 'NX503A[);/ ]'
4729
+ model: 'Nubia Z5S'
4730
+ - regex: 'NX506J[);/ ]'
4731
+ model: 'Nubia Z7'
4732
+ - regex: 'NX507J[);/ ]'
4733
+ model: 'Nubia Z7 mini'
4734
+ - regex: 'NX505J[);/ ]'
4735
+ model: 'Nubia Z7 max'
4736
+ - regex: 'NX508J[);/ ]'
4737
+ model: 'Nubia Z9'
4738
+ - regex: 'NX511J[);/ ]'
4739
+ model: 'Nubia Z9 mini'
4740
+ - regex: 'NX510J[);/ ]'
4741
+ model: 'Nubia Z9 max'
4742
+ - regex: 'NX513J[);/ ]'
4743
+ model: 'Nubia My Prague'
4744
+ - regex: 'NX601J[);/ ]'
4745
+ model: 'Nubia X6'
4746
+ - regex: '[UV]9180[);/ ]'
4747
+ model: 'V5 Red Bull'
4748
+ - regex: '[UV]9815[);/ ]'
4749
+ model: 'Grand Memo'
4750
+ - regex: 'Z331[);/ ]'
4751
+ model: 'Z331'
4752
+ - regex: 'Blade S6[);/ ]'
4753
+ model: 'Blade S6'
4754
+ - regex: 'Z768G[);/ ]'
4755
+ model: 'Midnight'
3207
4756
 
4757
+ - regex: 'AxonPhone ([^;/]+) Build'
4758
+ model: 'AxonPhone $1'
3208
4759
  - regex: '([a-z0-9]+)_USA_Cricket'
3209
4760
  model: '$1'
3210
- - regex: 'ZTE[\- ](V98|V96A|V81|V70) Build'
4761
+ - regex: 'ZTE[\- ](V98|V96A|V81|V70)[);/ ]'
3211
4762
  model: '$1'
3212
4763
  device: 'tablet'
3213
4764
  - regex: 'ZTE[\- ]([a-z0-9\-_ ]+) Build'
@@ -3216,11 +4767,21 @@ ZTE:
3216
4767
  model: '$1'
3217
4768
  - regex: 'ZTE[ _]([a-z0-9]+)'
3218
4769
  model: '$1'
3219
- - regex: 'Z331'
3220
- model: 'Z331'
3221
4770
 
3222
4771
  # Symbian to Nokia ??
3223
4772
  # Change name from Nokia to other to not change above Nokia element
3224
4773
  #Nokia:
3225
4774
  # regex: 'Symbian'
3226
4775
  # device: 'feature phone'
4776
+
4777
+ # OnePlus
4778
+ OnePlus:
4779
+ regex: '(?:A0001|A2005|E1003) Build'
4780
+ device: 'smartphone'
4781
+ models:
4782
+ - regex: 'A0001'
4783
+ model: 'One'
4784
+ - regex: 'A2005'
4785
+ model: 'Two'
4786
+ - regex: 'E1003'
4787
+ model: 'X'