user_agent_parser 0.1.2 → 2.1.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.

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
+