user_agent_parser 0.1.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of user_agent_parser might be problematic. Click here for more details.

@@ -1,32 +1,47 @@
1
1
  module UserAgentParser
2
-
3
2
  class Version
4
3
 
5
- attr_accessor :version
4
+ # Private: Regex used to split version string into major, minor, patch,
5
+ # and patch_minor.
6
+ SEGMENTS_REGEX = /\d+\-\d+|\d+[a-zA-Z]+$|\d+|[A-Za-z][0-9A-Za-z-]*$/
7
+
8
+ attr_reader :version
6
9
  alias :to_s :version
7
10
 
8
11
  def initialize(version)
9
- self.version = version.to_s.strip
12
+ @version = version.to_s.strip
10
13
  end
11
14
 
12
- def segments
13
- version.scan(/\d+\-\d+|\d+[a-zA-Z]+$|\d+|[A-Za-z][0-9A-Za-z-]*$/).map do |s|
14
- /^\d+$/ =~ s ? s.to_i : s
15
- end
15
+ def major
16
+ segments[0]
17
+ end
18
+
19
+ def minor
20
+ segments[1]
21
+ end
22
+
23
+ def patch
24
+ segments[2]
16
25
  end
17
26
 
18
- def [](segment)
19
- segments[segment]
27
+ def patch_minor
28
+ segments[3]
20
29
  end
21
-
30
+
22
31
  def inspect
23
32
  "#<#{self.class} #{to_s}>"
24
33
  end
25
-
26
- def ==(other)
27
- version == other.version
34
+
35
+ def eql?(other)
36
+ self.class.eql?(other.class) &&
37
+ version == other.version
28
38
  end
29
39
 
30
- end
40
+ alias_method :==, :eql?
31
41
 
32
- end
42
+ # Private
43
+ def segments
44
+ @segments ||= version.scan(SEGMENTS_REGEX)
45
+ end
46
+ end
47
+ end
@@ -1,28 +1,29 @@
1
- ### THIS FILE WAS COPIED ON JAN 26 2012.
2
- ### ORIGINAL IS AT: http://code.google.com/p/ua-parser/source/browse/trunk/resources/user_agent_parser.yaml
3
- ### Please review the CHANGELOG to see how this file differs from the original
4
1
  user_agent_parsers:
5
2
  #### SPECIAL CASES TOP ####
6
3
 
7
- # must go before Opera
8
- - regex: '^(Opera)/(\d+)\.(\d+) \(Nintendo Wii'
9
- family_replacement: 'Wii'
10
-
11
4
  # must go before Firefox to catch SeaMonkey/Camino
12
5
  - regex: '(SeaMonkey|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
13
6
 
14
7
  # Firefox
8
+ - regex: '(Pale[Mm]oon)/(\d+)\.(\d+)\.?(\d+)?'
9
+ family_replacement: 'Pale Moon (Firefox Variant)'
15
10
  - regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
16
11
  family_replacement: 'Firefox Mobile'
17
12
  - regex: '(Fennec)/(\d+)\.(\d+)(pre)'
18
- family_replacment: 'Firefox Mobile'
13
+ family_replacement: 'Firefox Mobile'
19
14
  - regex: '(Fennec)/(\d+)\.(\d+)'
20
15
  family_replacement: 'Firefox Mobile'
16
+ - regex: 'Mobile.*(Firefox)/(\d+)\.(\d+)'
17
+ family_replacement: 'Firefox Mobile'
21
18
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
22
19
  family_replacement: 'Firefox ($1)'
23
- - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)'
20
+ - regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
21
+ family_replacement: 'Firefox Alpha'
22
+ - regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
24
23
  family_replacement: 'Firefox Beta'
25
- - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)([ab]\d+[a-z]*)'
24
+ - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)'
25
+ family_replacement: 'Firefox Alpha'
26
+ - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)'
26
27
  family_replacement: 'Firefox Beta'
27
28
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
28
29
  family_replacement: 'Firefox ($1)'
@@ -60,17 +61,21 @@ user_agent_parsers:
60
61
  - regex: '(Opera Mini)/att/(\d+)\.(\d+)'
61
62
  - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
62
63
 
64
+ # Opera 14 for Android uses a WebKit render engine.
65
+ - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
66
+ family_replacement: 'Opera Mobile'
67
+
63
68
  # Palm WebOS looks a lot like Safari.
64
- - regex: '(webOSBrowser)/(\d+)\.(\d+)'
65
- - regex: '(webOS)/(\d+)\.(\d+)'
66
- family_replacement: 'webOSBrowser'
67
- - regex: '(wOSBrowser).+TouchPad/(\d+)\.(\d+)'
68
- family_replacement: 'webOS TouchPad'
69
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
70
+ family_replacement: 'webOS Browser'
69
71
 
70
72
  # LuaKit has no version info.
71
73
  # http://luakit.org/projects/luakit/
72
74
  - regex: '(luakit)'
73
75
  family_replacement: 'LuaKit'
76
+
77
+ # Snowshoe
78
+ - regex: '(Snowshoe)/(\d+)\.(\d+).(\d+)'
74
79
 
75
80
  # Lightning (for Thunderbird)
76
81
  # http://www.mozilla.org/projects/calendar/lightning/
@@ -83,6 +88,8 @@ user_agent_parsers:
83
88
  family_replacement: 'Swiftfox'
84
89
 
85
90
  # Rekonq
91
+ - regex: '(rekonq)/(\d+)\.(\d+) Safari'
92
+ family_replacement: 'Rekonq'
86
93
  - regex: 'rekonq'
87
94
  family_replacement: 'Rekonq'
88
95
 
@@ -100,42 +107,94 @@ user_agent_parsers:
100
107
  - regex: '(Comodo_Dragon)/(\d+)\.(\d+)\.(\d+)'
101
108
  family_replacement: 'Comodo Dragon'
102
109
 
103
- # YottaaMonitor bot
104
- - regex: '(YottaaMonitor)'
105
-
106
- # must go before NetFront below
107
- - regex: '(Kindle)/(\d+)\.(\d+)'
110
+ # Bots
111
+ - regex: '(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)'
108
112
 
109
113
  - regex: '(Symphony) (\d+).(\d+)'
110
114
 
111
- - regex: 'Minimo'
115
+ - regex: '(Minimo)'
112
116
 
113
117
  # Chrome Mobile
114
118
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
115
119
  family_replacement: 'Chrome Mobile'
120
+ - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
121
+ family_replacement: 'Chrome Mobile iOS'
122
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile'
123
+ family_replacement: 'Chrome Mobile'
116
124
 
117
125
  # Chrome Frame must come before MSIE.
118
126
  - regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
119
127
  family_replacement: 'Chrome Frame'
120
128
 
121
129
  # UC Browser
122
- - regex: '(UC Browser)(\d+)\.(\d+)\.(\d+)'
130
+ - regex: '(UCBrowser)[ /](\d+)\.(\d+)\.(\d+)'
131
+ family_replacement: 'UC Browser'
132
+ - regex: '(UC Browser)[ /](\d+)\.(\d+)\.(\d+)'
133
+ - regex: '(UC Browser|UCBrowser|UCWEB)(\d+)\.(\d+)\.(\d+)'
134
+ family_replacement: 'UC Browser'
135
+
136
+ # Tizen Browser (second case included in browser/major.minor regex)
137
+ - regex: '(SLP Browser)/(\d+)\.(\d+)'
138
+ family_replacement: 'Tizen Browser'
139
+
140
+ # Epiphany browser (identifies as Chromium)
141
+ - regex: '(Epiphany)/(\d+)\.(\d+).(\d+)'
142
+
143
+ # Sogou Explorer 2.X
144
+ - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
145
+ family_replacement: 'Sogou Explorer'
146
+
147
+ # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
148
+ - regex: '(baidubrowser)[/\s](\d+)'
149
+ family_replacement: 'Baidu Browser'
150
+ - regex: '(FlyFlow)/(\d+)\.(\d+)'
151
+ family_replacement: 'Baidu Explorer'
152
+
153
+ # Pingdom
154
+ - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
155
+ family_replacement: 'PingdomBot'
156
+
157
+ # Facebook
158
+ - regex: '(facebookexternalhit)/(\d+)\.(\d+)'
159
+ family_replacement: 'FacebookBot'
160
+
161
+ # Twitterbot
162
+ - regex: '(Twitterbot)/(\d+)\.(\d+)'
163
+ family_replacement: 'TwitterBot'
164
+
165
+ # Rackspace Monitoring
166
+ - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
167
+ family_replacement: 'RackspaceBot'
168
+
169
+ # PyAMF
170
+ - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
171
+
172
+ # Yandex Browser
173
+ - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)'
174
+ family_replacement: 'Yandex Browser'
175
+
176
+ # Mail.ru Amigo/Internet Browser (Chromium-based)
177
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
178
+ family_replacement: 'Mail.ru Chromium Browser'
123
179
 
124
180
  #### END SPECIAL CASES TOP ####
125
181
 
126
182
  #### MAIN CASES - this catches > 50% of all browsers ####
127
183
 
128
184
  # Browser/major_version.minor_version.beta_version
129
- - regex: '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iron|Iris|UP\.Browser|Bunjaloo)/(\d+)\.(\d+)\.(\d+)'
185
+ - regex: '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)'
130
186
 
131
187
  # Browser/major_version.minor_version
132
- - regex: '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Iron|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo)/(\d+)\.(\d+)'
188
+ - regex: '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser)/(\d+)\.(\d+)'
133
189
 
134
190
  # Browser major_version.minor_version.beta_version (space instead of slash)
135
191
  - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
136
192
  # Browser major_version.minor_version (space instead of slash)
137
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|BREW) (\d+)\.(\d+)\.?(\d+)?'
138
-
193
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\d+)\.(\d+)\.?(\d+)?'
194
+
195
+ # Kindle WebKit
196
+ - regex: '(Kindle)/(\d+)\.(\d+)'
197
+
139
198
  # weird android UAs
140
199
  - regex: '(Android) Donut'
141
200
  v1_replacement: '1'
@@ -174,18 +233,33 @@ user_agent_parsers:
174
233
  - regex: '(Obigo)InternetBrowser'
175
234
  - regex: '(Obigo)\-Browser'
176
235
  - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
236
+ family_replacement: 'Obigo'
177
237
 
178
238
  - regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
179
239
  family_replacement: 'Maxthon'
180
240
  - regex: '(Maxthon|MyIE2|Uzbl|Shiira)'
181
241
  v1_replacement: '0'
182
242
 
183
- - regex: '(PLAYSTATION) (\d+)'
184
- family_replacement: 'PlayStation'
185
- - regex: '(PlayStation Portable)[^\d]+(\d+).(\d+)'
243
+ - regex: 'PLAYSTATION 3.+WebKit'
244
+ family_replacement: 'NetFront NX'
245
+ - regex: 'PLAYSTATION 3'
246
+ family_replacement: 'NetFront'
247
+ - regex: '(PlayStation Portable)'
248
+ family_replacement: 'NetFront'
249
+ - regex: '(PlayStation Vita)'
250
+ family_replacement: 'NetFront NX'
251
+
252
+ - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
253
+ family_replacement: 'NetFront NX'
254
+ - regex: '(Nintendo 3DS)'
255
+ family_replacement: 'NetFront NX'
186
256
 
187
257
  - regex: '(BrowseX) \((\d+)\.(\d+)\.(\d+)'
188
258
 
259
+ - regex: '(NCSA_Mosaic)/(\d+)\.(\d+)'
260
+ family_replacement: 'NCSA Mosaic'
261
+
262
+ # Polaris/d.d is above
189
263
  - regex: '(POLARIS)/(\d+)\.(\d+)'
190
264
  family_replacement: 'Polaris'
191
265
  - regex: '(Embider)/(\d+)\.(\d+)'
@@ -194,56 +268,71 @@ user_agent_parsers:
194
268
  - regex: '(BonEcho)/(\d+)\.(\d+)\.(\d+)'
195
269
  family_replacement: 'Bon Echo'
196
270
 
271
+ - regex: 'M?QQBrowser'
272
+ family_replacement: 'QQ Browser'
273
+
197
274
  - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'
198
275
  family_replacement: 'Mobile Safari'
199
276
  - regex: '(iPod).*Version/(\d+)\.(\d+)'
200
277
  family_replacement: 'Mobile Safari'
201
- - regex: '(iPod)'
202
- family_replacement: 'Mobile Safari'
203
278
  - regex: '(iPhone).*Version/(\d+)\.(\d+)\.(\d+)'
204
279
  family_replacement: 'Mobile Safari'
205
280
  - regex: '(iPhone).*Version/(\d+)\.(\d+)'
206
281
  family_replacement: 'Mobile Safari'
207
- - regex: '(iPhone)'
208
- family_replacement: 'Mobile Safari'
209
282
  - regex: '(iPad).*Version/(\d+)\.(\d+)\.(\d+)'
210
283
  family_replacement: 'Mobile Safari'
211
284
  - regex: '(iPad).*Version/(\d+)\.(\d+)'
212
285
  family_replacement: 'Mobile Safari'
213
- - regex: '(iPad)'
286
+ - regex: '(iPod|iPhone|iPad);.*CPU.*OS (\d+)(?:_\d+)?_(\d+).*Mobile'
287
+ family_replacement: 'Mobile Safari'
288
+ - regex: '(iPod|iPhone|iPad)'
214
289
  family_replacement: 'Mobile Safari'
215
290
 
216
291
  - regex: '(AvantGo) (\d+).(\d+)'
292
+
293
+ - regex: '(OneBrowser)/(\d+).(\d+)'
294
+ family_replacement: 'ONE Browser'
217
295
 
218
296
  - regex: '(Avant)'
219
297
  v1_replacement: '1'
220
298
 
299
+ # This is the Tesla Model S (see similar entry in device parsers)
300
+ - regex: '(QtCarBrowser)'
301
+ v1_replacement: '1'
302
+
303
+ - regex: '(iBrowser/Mini)(\d+).(\d+)'
304
+ family_replacement: 'iBrowser Mini'
221
305
  # nokia browsers
222
306
  # based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
223
307
  - regex: '^(Nokia)'
224
308
  family_replacement: 'Nokia Services (WAP) Browser'
225
309
  - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)\.(\d+)'
310
+ family_replacement: 'Nokia Browser'
226
311
  - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)'
312
+ family_replacement: 'Nokia Browser'
227
313
  - regex: '(NokiaBrowser)/(\d+)\.(\d+)'
314
+ family_replacement: 'Nokia Browser'
228
315
  - regex: '(BrowserNG)/(\d+)\.(\d+).(\d+)'
229
- family_replacement: 'NokiaBrowser'
316
+ family_replacement: 'Nokia Browser'
230
317
  - regex: '(Series60)/5\.0'
231
- family_replacement: 'NokiaBrowser'
318
+ family_replacement: 'Nokia Browser'
232
319
  v1_replacement: '7'
233
320
  v2_replacement: '0'
234
321
  - regex: '(Series60)/(\d+)\.(\d+)'
235
322
  family_replacement: 'Nokia OSS Browser'
236
323
  - regex: '(S40OviBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
237
- family_replacement: 'Nokia Series 40 Ovi Browser'
324
+ family_replacement: 'Ovi Browser'
238
325
  - regex: '(Nokia)[EN]?(\d+)'
239
326
 
240
327
  # BlackBerry devices
328
+ - regex: '(BB10);'
329
+ family_replacement: 'BlackBerry WebKit'
241
330
  - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
242
- family_replacement: 'Blackberry WebKit'
331
+ family_replacement: 'BlackBerry WebKit'
243
332
  - regex: '(Black[bB]erry).+Version/(\d+)\.(\d+)\.(\d+)'
244
- family_replacement: 'Blackberry WebKit'
333
+ family_replacement: 'BlackBerry WebKit'
245
334
  - regex: '(Black[bB]erry)\s?(\d+)'
246
- family_replacement: 'Blackberry'
335
+ family_replacement: 'BlackBerry'
247
336
 
248
337
  - regex: '(OmniWeb)/v(\d+)\.(\d+)'
249
338
 
@@ -262,6 +351,14 @@ user_agent_parsers:
262
351
 
263
352
  # Amazon Silk, should go before Safari
264
353
  - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
354
+ family_replacement: 'Amazon Silk'
355
+
356
+ # Phantomjs, should go before Safari
357
+ - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
358
+
359
+ # WebKit Nightly
360
+ - regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari'
361
+ family_replacement: 'WebKit Nightly'
265
362
 
266
363
  # Safari
267
364
  - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
@@ -278,11 +375,50 @@ user_agent_parsers:
278
375
 
279
376
  - regex: '(Teleca)'
280
377
  family_replacement: 'Teleca Browser'
378
+
379
+ - regex: '(Phantom)/V(\d+)\.(\d+)'
380
+ family_replacement: 'Phantom Browser'
281
381
 
282
- - regex: '(MSIE) (\d+)\.(\d+)'
382
+ - regex: '([MS]?IE) (\d+)\.(\d+)'
283
383
  family_replacement: 'IE'
284
384
 
385
+ - regex: '(python-requests)/(\d+)\.(\d+)'
386
+ family_replacement: 'Python Requests'
387
+
285
388
  os_parsers:
389
+
390
+ ##########
391
+ # Android
392
+ # can actually detect rooted android os. do we care?
393
+ ##########
394
+ - regex: '(Android) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
395
+ - regex: '(Android)\-(\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
396
+
397
+ - regex: '(Android) Donut'
398
+ os_v1_replacement: '1'
399
+ os_v2_replacement: '2'
400
+
401
+ - regex: '(Android) Eclair'
402
+ os_v1_replacement: '2'
403
+ os_v2_replacement: '1'
404
+
405
+ - regex: '(Android) Froyo'
406
+ os_v1_replacement: '2'
407
+ os_v2_replacement: '2'
408
+
409
+ - regex: '(Android) Gingerbread'
410
+ os_v1_replacement: '2'
411
+ os_v2_replacement: '3'
412
+
413
+ - regex: '(Android) Honeycomb'
414
+ os_v1_replacement: '3'
415
+
416
+ ##########
417
+ # Kindle Android
418
+ ##########
419
+ - regex: '(Silk-Accelerated=[a-z]{4,5})'
420
+ os_replacement: 'Android'
421
+
286
422
  ##########
287
423
  # Windows
288
424
  # http://en.wikipedia.org/wiki/Windows_NT#Releases
@@ -291,15 +427,14 @@ os_parsers:
291
427
  # lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
292
428
  # (very) roughly ordered in terms of frequency of occurence of regex (win xp currently most frequent, etc)
293
429
  ##########
294
- - regex: '(Windows Phone 6\.5)'
295
-
430
+
296
431
  - regex: '(Windows (?:NT 5\.2|NT 5\.1))'
297
432
  os_replacement: 'Windows XP'
298
433
 
299
434
  # ie mobile des ktop mode
300
435
  # spoofs nt 6.1. must come before windows 7
301
436
  - regex: '(XBLWP7)'
302
- os_replacement: 'Windows Phone OS'
437
+ os_replacement: 'Windows Phone'
303
438
 
304
439
  - regex: '(Windows NT 6\.1)'
305
440
  os_replacement: 'Windows 7'
@@ -307,7 +442,10 @@ os_parsers:
307
442
  - regex: '(Windows NT 6\.0)'
308
443
  os_replacement: 'Windows Vista'
309
444
 
310
- - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000)'
445
+ - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
446
+
447
+ - regex: '(Windows NT 6\.2; ARM;)'
448
+ os_replacement: 'Windows RT'
311
449
 
312
450
  # is this a spoof or is nt 6.2 out and about in some capacity?
313
451
  - regex: '(Windows NT 6\.2)'
@@ -316,8 +454,8 @@ os_parsers:
316
454
  - regex: '(Windows NT 5\.0)'
317
455
  os_replacement: 'Windows 2000'
318
456
 
319
- - regex: '(Windows Phone OS) (\d+)\.(\d+)'
320
-
457
+ - regex: '(Windows Phone) (\d+)\.(\d+)'
458
+ - regex: '(Windows Phone) OS (\d+)\.(\d+)'
321
459
  - regex: '(Windows ?Mobile)'
322
460
  os_replacement: 'Windows Mobile'
323
461
 
@@ -328,36 +466,20 @@ os_parsers:
328
466
  os_replacement: 'Windows 98'
329
467
 
330
468
  ##########
331
- # Android
332
- # can actually detect rooted android os. do we care?
469
+ # Tizen OS from Samsung
470
+ # spoofs Android so pushing it above
333
471
  ##########
334
- - regex: '(Android) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
335
- - regex: '(Android)\-(\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
336
-
337
- - regex: '(Android) Donut'
338
- os_v1_replacement: '1'
339
- os_v2_replacement: '2'
340
-
341
- - regex: '(Android) Eclair'
342
- os_v1_replacement: '2'
343
- os_v2_replacement: '1'
344
-
345
- - regex: '(Android) Froyo'
346
- os_v1_replacement: '2'
347
- os_v2_replacement: '2'
348
-
349
- - regex: '(Android) Gingerbread'
350
- os_v1_replacement: '2'
351
- os_v2_replacement: '3'
352
-
353
- - regex: '(Android) Honeycomb'
354
- os_v1_replacement: '3'
472
+ - regex: '(Tizen)/(\d+)\.(\d+)'
355
473
 
356
474
  ##########
357
475
  # Mac OS
358
476
  # http://en.wikipedia.org/wiki/Mac_OS_X#Versions
359
477
  ##########
360
478
  - regex: '(Mac OS X) (\d+)[_.](\d+)(?:[_.](\d+))?'
479
+
480
+ # IE on Mac doesn't specify version number
481
+ - regex: 'Mac_PowerPC'
482
+ os_replacement: 'Mac OS'
361
483
 
362
484
  # builds before tiger don't seem to specify version?
363
485
 
@@ -379,6 +501,11 @@ os_parsers:
379
501
  - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
380
502
  os_replacement: 'iOS'
381
503
 
504
+ - regex: '(AppleTV)/(\d+)\.(\d+)'
505
+ os_replacement: 'ATV OS X'
506
+ os_v1_replacement: '$1'
507
+ os_v2_replacement: '$2'
508
+
382
509
  ##########
383
510
  # Chrome OS
384
511
  # if version 0.0.0, probably this stuff:
@@ -412,10 +539,14 @@ os_parsers:
412
539
  - regex: '(MeeGo)'
413
540
  - regex: 'Symbian [Oo][Ss]'
414
541
  os_replacement: 'Symbian OS'
542
+ - regex: 'Series40;'
543
+ os_replacement: 'Nokia Series 40'
415
544
 
416
545
  ##########
417
546
  # BlackBerry devices
418
547
  ##########
548
+ - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
549
+ os_replacement: 'BlackBerry OS'
419
550
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
420
551
  os_replacement: 'BlackBerry OS'
421
552
  - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
@@ -425,13 +556,40 @@ os_parsers:
425
556
  - regex: '(Play[Bb]ook)'
426
557
  os_replacement: 'BlackBerry Tablet OS'
427
558
  - regex: '(Black[Bb]erry)'
428
- os_replacement: 'Blackberry OS'
559
+ os_replacement: 'BlackBerry OS'
560
+
561
+ ##########
562
+ # Firefox OS
563
+ ##########
564
+ - regex: '\(Mobile;.+Firefox/\d+\.\d+'
565
+ os_replacement: 'Firefox OS'
566
+
567
+ ##########
568
+ # BREW
569
+ # yes, Brew is lower-cased for Brew MP
570
+ ##########
571
+ - regex: '(BREW)[ /](\d+)\.(\d+)\.(\d+)'
572
+ - regex: '(BREW);'
573
+ - regex: '(Brew MP|BMP)[ /](\d+)\.(\d+)\.(\d+)'
574
+ os_replacement: 'Brew MP'
575
+ - regex: 'BMP;'
576
+ os_replacement: 'Brew MP'
577
+
578
+ ##########
579
+ # Google TV
580
+ ##########
581
+ - regex: '(GoogleTV) (\d+)\.(\d+)\.(\d+)'
582
+ # Old style
583
+ - regex: '(GoogleTV)\/\d+'
429
584
 
585
+ - regex: '(WebTV)/(\d+).(\d+)'
586
+
430
587
  ##########
431
588
  # Misc mobile
432
589
  ##########
433
- - regex: '(webOS|hpwOS)/(\d+)\.(\d+)(?:\.(\d+))?'
590
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
434
591
  os_replacement: 'webOS'
592
+ - regex: '(VRE);'
435
593
 
436
594
  ##########
437
595
  # Generic patterns
@@ -448,7 +606,10 @@ os_parsers:
448
606
 
449
607
  # just os
450
608
  - regex: '(Windows|OpenBSD|FreeBSD|NetBSD|Ubuntu|Kubuntu|Android|Arch Linux|CentOS|WeTab|Slackware)'
609
+ - regex: '(Linux)/(\d+)\.(\d+)'
451
610
  - regex: '(Linux|BSD)'
611
+ - regex: 'SunOS'
612
+ os_replacement: 'Solaris'
452
613
 
453
614
  device_parsers:
454
615
  ##########
@@ -478,30 +639,64 @@ device_parsers:
478
639
  - regex: 'Sprint APA(9292)'
479
640
  device_replacement: 'HTC $1 (Sprint)'
480
641
  - regex: 'HTC ([A-Za-z0-9]+ [A-Z])'
481
- device_replacement: HTC $1
482
- - regex: 'HTC-([A-Za-z0-9]+)'
483
- device_replacement: 'HTC $1'
484
- - regex: 'HTC_([A-Za-z0-9]+)'
485
642
  device_replacement: 'HTC $1'
486
- - regex: 'HTC ([A-Za-z0-9]+)'
643
+ - regex: 'HTC[-_/\s]([A-Za-z0-9]+)'
487
644
  device_replacement: 'HTC $1'
488
- - regex: '(ADR[A-z0-9]+)'
645
+ - regex: '(ADR[A-Za-z0-9]+)'
489
646
  device_replacement: 'HTC $1'
490
647
  - regex: '(HTC)'
491
648
 
649
+ # Tesla Model S
650
+ - regex: '(QtCarBrowser)'
651
+ device_replacement: 'Tesla Model S'
652
+
653
+ # Samsung
654
+ - regex: '(SamsungSGHi560)'
655
+ device_replacement: 'Samsung SGHi560'
656
+
492
657
  #########
493
658
  # Ericsson - must come before nokia since they also use symbian
494
659
  #########
495
- - regex: 'SonyEricsson([A-z0-9]+)/'
660
+ - regex: 'SonyEricsson([A-Za-z0-9]+)/'
496
661
  device_replacement: 'Ericsson $1'
497
662
 
663
+ ##########
664
+ # PlayStation
665
+ # The Vita spoofs the Kindle
666
+ ##########
667
+ - regex: 'PLAYSTATION 3'
668
+ device_replacement: 'PlayStation 3'
669
+ - regex: '(PlayStation Portable)'
670
+ - regex: '(PlayStation Vita)'
671
+
672
+ ##########
673
+ # incomplete!
674
+ # Kindle
675
+ # http://amazonsilk.wordpress.com/useful-bits/silk-user-agent/
676
+ ##########
677
+ - regex: '(KFOT Build)'
678
+ device_replacement: 'Kindle Fire'
679
+ - regex: '(KFTT Build)'
680
+ device_replacement: 'Kindle Fire HD'
681
+ - regex: '(KFJWI Build)'
682
+ device_replacement: 'Kindle Fire HD 8.9" WiFi'
683
+ - regex: '(KFJWA Build)'
684
+ device_replacement: 'Kindle Fire HD 8.9" 4G'
685
+ - regex: '(Kindle Fire)'
686
+ - regex: '(Kindle)'
687
+ - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
688
+ device_replacement: 'Kindle Fire'
689
+
498
690
  #########
499
691
  # Android General Device Matching (far from perfect)
500
692
  #########
501
- - regex: 'Android[\- ][\d]+\.[\d]+\; [A-z]{2}\-[A-z]{2}\; WOWMobile (.+) Build'
502
- - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; [A-z]{2}\-[A-z]{2}\; (.+) Build'
503
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1\; [A-z]{2}\-[A-z]{2}\; (.+) Build'
504
- - regex: 'Android[\- ][\d]+\.[\d]+\; [A-z]{2}\-[A-z]{2}\; (.+) Build'
693
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{2}; WOWMobile (.+) Build'
694
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{2}; (.+) Build'
695
+ - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{2}; (.+) Build'
696
+ - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+;[A-Za-z]{2}\-[A-Za-z]{2};(.+) Build'
697
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{2}; (.+) Build'
698
+ - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; (.+) Build'
699
+ - regex: 'Android[\- ][\d]+\.[\d]+; (.+) Build'
505
700
 
506
701
  ##########
507
702
  # NOKIA
@@ -509,6 +704,8 @@ device_parsers:
509
704
  ##########
510
705
  - regex: 'NokiaN([0-9]+)'
511
706
  device_replacement: 'Nokia N$1'
707
+ - regex: 'NOKIA([A-Za-z0-9\v-]+)'
708
+ device_replacement: 'Nokia $1'
512
709
  - regex: 'Nokia([A-Za-z0-9\v-]+)'
513
710
  device_replacement: 'Nokia $1'
514
711
  - regex: 'NOKIA ([A-Za-z0-9\-]+)'
@@ -521,14 +718,19 @@ device_parsers:
521
718
  device_replacement: 'Nokia'
522
719
 
523
720
  ##########
524
- # Blackberry
721
+ # BlackBerry
525
722
  # http://www.useragentstring.com/pages/BlackBerry/
526
723
  ##########
724
+ - regex: 'BB10; ([A-Za-z0-9\- ]+)\)'
725
+ device_replacement: 'BlackBerry $1'
527
726
  - regex: '(PlayBook).+RIM Tablet OS'
528
- device_replacement: 'Blackberry Playbook'
529
- - regex: '(Black[Bb]erry [0-9]+);'
727
+ device_replacement: 'BlackBerry Playbook'
728
+ - regex: 'Black[Bb]erry ([0-9]+);'
729
+ device_replacement: 'BlackBerry $1'
530
730
  - regex: 'Black[Bb]erry([0-9]+)'
531
731
  device_replacement: 'BlackBerry $1'
732
+ - regex: 'Black[Bb]erry;'
733
+ device_replacement: 'BlackBerry'
532
734
 
533
735
  ##########
534
736
  # PALM / HP
@@ -538,26 +740,35 @@ device_parsers:
538
740
  device_replacement: 'Palm Pre'
539
741
  - regex: '(Pixi)/(\d+)\.(\d+)'
540
742
  device_replacement: 'Palm Pixi'
541
- - regex: '(Touchpad)/(\d+)\.(\d+)'
542
- device_replacement: 'HP Touchpad'
543
- - regex: 'HPiPAQ([A-z0-9]+)/(\d+).(\d+)'
743
+ - regex: '(Touch[Pp]ad)/(\d+)\.(\d+)'
744
+ device_replacement: 'HP TouchPad'
745
+ - regex: 'HPiPAQ([A-Za-z0-9]+)/(\d+).(\d+)'
544
746
  device_replacement: 'HP iPAQ $1'
545
- - regex: 'Palm([A-z0-9]+)'
747
+ - regex: 'Palm([A-Za-z0-9]+)'
546
748
  device_replacement: 'Palm $1'
547
- - regex: 'Treo([A-z0-9]+)'
749
+ - regex: 'Treo([A-Za-z0-9]+)'
548
750
  device_replacement: 'Palm Treo $1'
549
751
  - regex: 'webOS.*(P160UNA)/(\d+).(\d+)'
550
752
  device_replacement: 'HP Veer'
551
753
 
552
754
  ##########
553
- # incomplete!
554
- # Kindle
755
+ # AppleTV
756
+ # No built in browser that I can tell
757
+ # Stack Overflow indicated iTunes-AppleTV/4.1 as a known UA for app available and I'm seeing it in live traffic
555
758
  ##########
556
- - regex: '(Kindle Fire)'
557
- - regex: '(Kindle)'
558
- - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
559
- device_replacement: 'Kindle Fire'
759
+ - regex: '(AppleTV)'
760
+ device_replacement: 'AppleTV'
560
761
 
762
+ ##########
763
+ # Catch the google mobile crawler before checking for iPhones.
764
+ ##########
765
+
766
+ - regex: 'AdsBot-Google-Mobile'
767
+ device_replacement: 'Spider'
768
+
769
+ - regex: 'Googlebot-Mobile/(\d+).(\d+)'
770
+ device_replacement: 'Spider'
771
+
561
772
  ##########
562
773
  # complete but probably catches spoofs
563
774
  # iSTUFF
@@ -573,101 +784,113 @@ device_parsers:
573
784
  ##########
574
785
  # Acer
575
786
  ##########
576
- - regex: 'acer_([A-z0-9]+)_'
787
+ - regex: 'acer_([A-Za-z0-9]+)_'
577
788
  device_replacement: 'Acer $1'
578
- - regex: 'acer_([A-z0-9]+)_'
789
+ - regex: 'acer_([A-Za-z0-9]+)_'
579
790
  device_replacement: 'Acer $1'
580
791
 
792
+ ##########
793
+ # Alcatel
794
+ ##########
795
+ - regex: 'ALCATEL-([A-Za-z0-9]+)'
796
+ device_replacement: 'Alcatel $1'
797
+ - regex: 'Alcatel-([A-Za-z0-9]+)'
798
+ device_replacement: 'Alcatel $1'
799
+
581
800
  ##########
582
801
  # Amoi
583
802
  ##########
584
- - regex: 'Amoi\-([A-z0-9]+)'
803
+ - regex: 'Amoi\-([A-Za-z0-9]+)'
585
804
  device_replacement: 'Amoi $1'
586
- - regex: 'AMOI\-([A-z0-9]+)'
805
+ - regex: 'AMOI\-([A-Za-z0-9]+)'
587
806
  device_replacement: 'Amoi $1'
588
807
 
589
808
  ##########
590
809
  # Amoi
591
810
  ##########
592
- - regex: 'Asus\-([A-z0-9]+)'
811
+ - regex: 'Asus\-([A-Za-z0-9]+)'
593
812
  device_replacement: 'Asus $1'
594
- - regex: 'ASUS\-([A-z0-9]+)'
813
+ - regex: 'ASUS\-([A-Za-z0-9]+)'
595
814
  device_replacement: 'Asus $1'
596
815
 
597
816
  ##########
598
817
  # Bird
599
818
  ##########
600
- - regex: 'BIRD\-([A-z0-9]+)'
819
+ - regex: 'BIRD\-([A-Za-z0-9]+)'
601
820
  device_replacement: 'Bird $1'
602
- - regex: 'BIRD\.([A-z0-9]+)'
821
+ - regex: 'BIRD\.([A-Za-z0-9]+)'
603
822
  device_replacement: 'Bird $1'
604
- - regex: 'BIRD ([A-z0-9]+)'
823
+ - regex: 'BIRD ([A-Za-z0-9]+)'
605
824
  device_replacement: 'Bird $1'
606
825
 
607
826
  ##########
608
827
  # Dell
609
828
  ##########
610
- - regex: 'Dell ([A-z0-9]+)'
829
+ - regex: 'Dell ([A-Za-z0-9]+)'
611
830
  device_replacement: 'Dell $1'
612
831
 
613
832
  ##########
614
833
  # DoCoMo
615
834
  ##########
616
- - regex: 'DoCoMo/2\.0 ([A-z0-9]+)'
835
+ - regex: 'DoCoMo/2\.0 ([A-Za-z0-9]+)'
617
836
  device_replacement: 'DoCoMo $1'
618
- - regex: '([A-z0-9]+)\_W\;FOMA'
837
+ - regex: '([A-Za-z0-9]+)_W\;FOMA'
619
838
  device_replacement: 'DoCoMo $1'
620
- - regex: '([A-z0-9]+)\;FOMA'
839
+ - regex: '([A-Za-z0-9]+)\;FOMA'
621
840
  device_replacement: 'DoCoMo $1'
622
841
 
623
842
  ##########
624
- # Huawei Vodafone
843
+ # Huawei
625
844
  ##########
626
- - regex: 'vodafone([A-z0-9]+)'
845
+ - regex: 'Huawei([A-Za-z0-9]+)'
846
+ device_replacement: 'Huawei $1'
847
+ - regex: 'HUAWEI-([A-Za-z0-9]+)'
848
+ device_replacement: 'Huawei $1'
849
+ - regex: 'vodafone([A-Za-z0-9]+)'
627
850
  device_replacement: 'Huawei Vodafone $1'
628
851
 
629
852
  ##########
630
853
  # i-mate
631
854
  ##########
632
- - regex: 'i\-mate ([A-z0-9]+)'
855
+ - regex: 'i\-mate ([A-Za-z0-9]+)'
633
856
  device_replacement: 'i-mate $1'
634
857
 
635
858
  ##########
636
859
  # kyocera
637
860
  ##########
638
- - regex: 'Kyocera\-([A-z0-9]+)'
861
+ - regex: 'Kyocera\-([A-Za-z0-9]+)'
639
862
  device_replacement: 'Kyocera $1'
640
- - regex: 'KWC\-([A-z0-9]+)'
863
+ - regex: 'KWC\-([A-Za-z0-9]+)'
641
864
  device_replacement: 'Kyocera $1'
642
865
 
643
866
  ##########
644
867
  # lenovo
645
868
  ##########
646
- - regex: 'Lenovo\-([A-z0-9]+)'
869
+ - regex: 'Lenovo\-([A-Za-z0-9]+)'
647
870
  device_replacement: 'Lenovo $1'
648
- - regex: 'Lenovo\_([A-z0-9]+)'
871
+ - regex: 'Lenovo_([A-Za-z0-9]+)'
649
872
  device_replacement: 'Lenovo $1'
650
873
 
651
874
  ##########
652
875
  # lg
653
876
  ##########
654
- - regex: 'LG/([A-z0-9]+)'
877
+ - regex: 'LG/([A-Za-z0-9]+)'
655
878
  device_replacement: 'LG $1'
656
- - regex: 'LG-LG([A-z0-9]+)'
879
+ - regex: 'LG-LG([A-Za-z0-9]+)'
657
880
  device_replacement: 'LG $1'
658
- - regex: 'LGE-LG([A-z0-9]+)'
881
+ - regex: 'LGE-LG([A-Za-z0-9]+)'
659
882
  device_replacement: 'LG $1'
660
- - regex: 'LGE VX([A-z0-9]+)'
883
+ - regex: 'LGE VX([A-Za-z0-9]+)'
661
884
  device_replacement: 'LG $1'
662
- - regex: 'LG ([A-z0-9]+)'
885
+ - regex: 'LG ([A-Za-z0-9]+)'
663
886
  device_replacement: 'LG $1'
664
- - regex: 'LGE LG\-AX([A-z0-9]+)'
887
+ - regex: 'LGE LG\-AX([A-Za-z0-9]+)'
665
888
  device_replacement: 'LG $1'
666
- - regex: 'LG\-([A-z0-9]+)'
889
+ - regex: 'LG\-([A-Za-z0-9]+)'
667
890
  device_replacement: 'LG $1'
668
- - regex: 'LGE\-([A-z0-9]+)'
891
+ - regex: 'LGE\-([A-Za-z0-9]+)'
669
892
  device_replacement: 'LG $1'
670
- - regex: 'LG([A-z0-9]+)'
893
+ - regex: 'LG([A-Za-z0-9]+)'
671
894
  device_replacement: 'LG $1'
672
895
 
673
896
  ##########
@@ -681,36 +904,61 @@ device_parsers:
681
904
  ##########
682
905
  # motorola
683
906
  ##########
684
- - regex: '(Motorola)\-([A-z0-9]+)'
685
- - regex: 'MOTO\-([A-z0-9]+)'
907
+ - regex: '(Motorola)\-([A-Za-z0-9]+)'
908
+ - regex: 'MOTO\-([A-Za-z0-9]+)'
686
909
  device_replacement: 'Motorola $1'
687
- - regex: 'MOT\-([A-z0-9]+)'
910
+ - regex: 'MOT\-([A-Za-z0-9]+)'
688
911
  device_replacement: 'Motorola $1'
912
+
913
+ ##########
914
+ # nintendo
915
+ ##########
916
+ - regex: '(Nintendo WiiU)'
917
+ device_replacement: 'Nintendo Wii U'
918
+ - regex: 'Nintendo (DS|3DS|DSi|Wii);'
919
+ device_replacement: 'Nintendo $1'
689
920
 
921
+ ##########
922
+ # pantech
923
+ ##########
924
+ - regex: 'Pantech([A-Za-z0-9]+)'
925
+ device_replacement: 'Pantech $1'
926
+
690
927
  ##########
691
928
  # philips
692
929
  ##########
693
- - regex: 'Philips([A-z0-9]+)'
930
+ - regex: 'Philips([A-Za-z0-9]+)'
694
931
  device_replacement: 'Philips $1'
695
- - regex: 'Philips ([A-z0-9]+)'
932
+ - regex: 'Philips ([A-Za-z0-9]+)'
696
933
  device_replacement: 'Philips $1'
697
934
 
698
935
  ##########
699
936
  # Samsung
700
937
  ##########
701
- - regex: 'SAMSUNG-([A-z0-9\-]+)'
938
+ - regex: 'SAMSUNG-([A-Za-z0-9\-]+)'
702
939
  device_replacement: 'Samsung $1'
703
- - regex: 'SAMSUNG\; ([A-z0-9\-]+)'
940
+ - regex: 'SAMSUNG\; ([A-Za-z0-9\-]+)'
704
941
  device_replacement: 'Samsung $1'
705
942
 
943
+ ##########
944
+ # Sega
945
+ ##########
946
+ - regex: 'Dreamcast'
947
+ device_replacement: 'Sega Dreamcast'
948
+
706
949
  ##########
707
950
  # Softbank
708
951
  ##########
709
- - regex: 'Softbank/1\.0/([A-z0-9]+)'
952
+ - regex: 'Softbank/1\.0/([A-Za-z0-9]+)'
710
953
  device_replacement: 'Softbank $1'
711
- - regex: 'Softbank/2\.0/([A-z0-9]+)'
954
+ - regex: 'Softbank/2\.0/([A-Za-z0-9]+)'
712
955
  device_replacement: 'Softbank $1'
713
956
 
957
+ ##########
958
+ # WebTV
959
+ ##########
960
+ - regex: '(WebTV)/(\d+).(\d+)'
961
+
714
962
  ##########
715
963
  # Generic Smart Phone
716
964
  ##########
@@ -720,17 +968,18 @@ device_parsers:
720
968
  ##########
721
969
  # Generic Feature Phone
722
970
  ##########
723
- - regex: '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\-|airn|alav|asus|attw|au\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\-n|bw\-u|beck|benq|bilb|blac|c55/|cdm\-|chtm|capi|comp|cond|craw|dall|dbte|dc\-s|dica|ds\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\-|fly\_|g\-mo|g1 u|g560|gf\-5|grun|gene|go.w|good|grad|hcit|hd\-m|hd\-p|hd\-t|hei\-|hp i|hpip|hs\-c|htc |htc\-|htca|htcg)'
971
+ - regex: '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\-|airn|alav|asus|attw|au\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\-n|bw\-u|beck|benq|bilb|blac|c55/|cdm\-|chtm|capi|comp|cond|craw|dall|dbte|dc\-s|dica|ds\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\-|fly_|g\-mo|g1 u|g560|gf\-5|grun|gene|go.w|good|grad|hcit|hd\-m|hd\-p|hd\-t|hei\-|hp i|hpip|hs\-c|htc |htc\-|htca|htcg)'
724
972
  device_replacement: 'Generic Feature Phone'
725
- - regex: '^(htcp|htcs|htct|htc\_|haie|hita|huaw|hutc|i\-20|i\-go|i\-ma|i230|iac|iac\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\-|klon|lexi|lg g|lg\-a|lg\-b|lg\-c|lg\-d|lg\-f|lg\-g|lg\-k|lg\-l|lg\-m|lg\-o|lg\-p|lg\-s|lg\-t|lg\-u|lg\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\-|lge/|lynx|leno|m1\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\-|nem\-|newg|neon)'
973
+ - regex: '^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\-20|i\-go|i\-ma|i230|iac|iac\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\-|klon|lexi|lg g|lg\-a|lg\-b|lg\-c|lg\-d|lg\-f|lg\-g|lg\-k|lg\-l|lg\-m|lg\-o|lg\-p|lg\-s|lg\-t|lg\-u|lg\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\-|lge/|lynx|leno|m1\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\-|nem\-|newg|neon)'
726
974
  device_replacement: 'Generic Feature Phone'
727
975
  - regex: '^(netf|noki|nzph|o2 x|o2\-x|opwv|owg1|opti|oran|ot\-s|p800|pand|pg\-1|pg\-2|pg\-3|pg\-6|pg\-8|pg\-c|pg13|phil|pn\-2|pt\-g|palm|pana|pire|pock|pose|psio|qa\-a|qc\-2|qc\-3|qc\-5|qc\-7|qc07|qc12|qc21|qc32|qc60|qci\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\-|scp\-|sdk/|se47|sec\-|sec0|sec1|semc|sgh\-|shar|sie\-|sk\-0|sl45|slid|smb3|smt5|sp01|sph\-|spv |spv\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\-mo|t218|t250|t600|t610|t618|tcl\-|tdg\-|telm|tim\-|ts70|tsm\-|tsm3|tsm5|tx\-9|tagt)'
728
976
  device_replacement: 'Generic Feature Phone'
729
- - regex: '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\-|your|zte\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\-|webc|whit|wmlb|xda\-|xda\_)'
977
+ - regex: '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\-|your|zte\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\-|webc|whit|wmlb|xda\-|xda_)'
730
978
  device_replacement: 'Generic Feature Phone'
731
979
 
732
980
  ##########
733
981
  # Spiders (this is hack...)
734
982
  ##########
735
- - regex: '(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks)'
983
+ - regex: '(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks|crawler)'
736
984
  device_replacement: 'Spider'
985
+