logstash-filter-useragent 2.0.6 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a819faf9a94146acff9669c375430cc6973cc34c
4
- data.tar.gz: 5e7ed1317e13faa689c1aa79cee6f07cbf96f3d8
3
+ metadata.gz: 55b8146cce378b78c12dadc50629baf2dfd9da7f
4
+ data.tar.gz: fa31a6a016e3846c18a12adca716e2d86aa11903
5
5
  SHA512:
6
- metadata.gz: d2dec3c1e7c5901b29d006ce6ae9142f986ae829f72d2917b01da1dac43cae88897bfbe992abde19206dd9e9a70887b355a53b272ad8a91cdfcca0752564183e
7
- data.tar.gz: 486c34ad9b00dccb43ee9bc09c8e1c08d8b2ecccc22903fdc05b11f5e2c82655c18df6dc33527dc92c90306559cf707f78b524edd9a96a35462199933e663426
6
+ metadata.gz: 819ee5fb530c036bab8bedec26a795fc7055a72d20d16893da5913ccdd1918286a60c6a9ed9bcaf38bdb414980811d64e974205141f3ebf5443123439185b48e
7
+ data.tar.gz: a805d2d3651e39974b767d0fe10113bdc7945b19b6886b741a6fd3ab28d1c91e17001d9cf1a48064b467173254efb975471ba91e85195bf339933c410617d7d6
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Logstash Plugin
2
2
 
3
- [![Build
4
- Status](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Filters/job/logstash-plugin-filter-useragent-unit/badge/icon)](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Filters/job/logstash-plugin-filter-useragent-unit/)
3
+ [![Build Status](https://travis-ci.org/logstash-plugins/logstash-filter-useragent.svg?branch=master)](https://travis-ci.org/logstash-plugins/logstash-filter-useragent)
5
4
 
6
5
  This is a plugin for [Logstash](https://github.com/elastic/logstash).
7
6
 
@@ -3,6 +3,7 @@ require "logstash/filters/base"
3
3
  require "logstash/namespace"
4
4
  require "lru_redux"
5
5
  require "tempfile"
6
+ require "thread"
6
7
 
7
8
  # Parse user agent strings into structured data based on BrowserScope data
8
9
  #
@@ -72,6 +73,7 @@ class LogStash::Filters::UserAgent < LogStash::Filters::Base
72
73
  @logger.info("Using user agent regexes", :regexes => @regexes)
73
74
  @parser = UserAgentParser::Parser.new(:patterns_path => @regexes)
74
75
  end
76
+ @parser_mutex = Mutex.new
75
77
 
76
78
  LOOKUP_CACHE.max_size = @lru_cache_size
77
79
 
@@ -120,7 +122,10 @@ class LogStash::Filters::UserAgent < LogStash::Filters::Base
120
122
  cached = LOOKUP_CACHE[useragent]
121
123
  return cached if cached
122
124
 
123
- ua_data = @parser.parse(useragent)
125
+ # the UserAgentParser::Parser class is not thread safe, indications are that it is probably
126
+ # caused by the underlying JRuby regex code that is not thread safe.
127
+ # see https://github.com/logstash-plugins/logstash-filter-useragent/issues/25
128
+ ua_data = @parser_mutex.synchronize { @parser.parse(useragent) }
124
129
 
125
130
  LOOKUP_CACHE[useragent] = ua_data
126
131
  ua_data
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-useragent'
4
- s.version = '2.0.6'
4
+ s.version = '2.0.7'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Parse user agent strings into structured data based on BrowserScope data"
7
7
  s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.require_paths = ["lib"]
12
12
 
13
13
  # Files
14
- s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']
14
+ s.files = Dir['lib/**/*','spec/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']
15
15
 
16
16
  # Tests
17
17
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-useragent
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6
4
+ version: 2.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-24 00:00:00.000000000 Z
11
+ date: 2016-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: logstash-core-plugin-api
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
14
20
  requirement: !ruby/object:Gem::Requirement
15
21
  requirements:
16
- - - "~>"
22
+ - - ~>
17
23
  - !ruby/object:Gem::Version
18
24
  version: '1.0'
19
- name: logstash-core-plugin-api
20
25
  prerelease: false
21
26
  type: :runtime
27
+ - !ruby/object:Gem::Dependency
28
+ name: user_agent_parser
22
29
  version_requirements: !ruby/object:Gem::Requirement
23
30
  requirements:
24
- - - "~>"
31
+ - - '>='
25
32
  - !ruby/object:Gem::Version
26
- version: '1.0'
27
- - !ruby/object:Gem::Dependency
33
+ version: 2.0.0
28
34
  requirement: !ruby/object:Gem::Requirement
29
35
  requirements:
30
- - - ">="
36
+ - - '>='
31
37
  - !ruby/object:Gem::Version
32
38
  version: 2.0.0
33
- name: user_agent_parser
34
39
  prerelease: false
35
40
  type: :runtime
41
+ - !ruby/object:Gem::Dependency
42
+ name: lru_redux
36
43
  version_requirements: !ruby/object:Gem::Requirement
37
44
  requirements:
38
- - - ">="
45
+ - - ~>
39
46
  - !ruby/object:Gem::Version
40
- version: 2.0.0
41
- - !ruby/object:Gem::Dependency
47
+ version: 1.1.0
42
48
  requirement: !ruby/object:Gem::Requirement
43
49
  requirements:
44
- - - "~>"
50
+ - - ~>
45
51
  - !ruby/object:Gem::Version
46
52
  version: 1.1.0
47
- name: lru_redux
48
53
  prerelease: false
49
54
  type: :runtime
55
+ - !ruby/object:Gem::Dependency
56
+ name: logstash-devutils
50
57
  version_requirements: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - "~>"
59
+ - - '>='
53
60
  - !ruby/object:Gem::Version
54
- version: 1.1.0
55
- - !ruby/object:Gem::Dependency
61
+ version: '0'
56
62
  requirement: !ruby/object:Gem::Requirement
57
63
  requirements:
58
- - - ">="
64
+ - - '>='
59
65
  - !ruby/object:Gem::Version
60
66
  version: '0'
61
- name: logstash-devutils
62
67
  prerelease: false
63
68
  type: :development
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
69
  description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
70
70
  email: info@elastic.co
71
71
  executables: []
@@ -81,7 +81,6 @@ files:
81
81
  - lib/logstash/filters/useragent.rb
82
82
  - logstash-filter-useragent.gemspec
83
83
  - spec/filters/useragent_spec.rb
84
- - vendor/regexes.yaml
85
84
  homepage: http://www.elastic.co/guide/en/logstash/current/index.html
86
85
  licenses:
87
86
  - Apache License (2.0)
@@ -94,12 +93,12 @@ require_paths:
94
93
  - lib
95
94
  required_ruby_version: !ruby/object:Gem::Requirement
96
95
  requirements:
97
- - - ">="
96
+ - - '>='
98
97
  - !ruby/object:Gem::Version
99
98
  version: '0'
100
99
  required_rubygems_version: !ruby/object:Gem::Requirement
101
100
  requirements:
102
- - - ">="
101
+ - - '>='
103
102
  - !ruby/object:Gem::Version
104
103
  version: '0'
105
104
  requirements: []
data/vendor/regexes.yaml DELETED
@@ -1,1335 +0,0 @@
1
- user_agent_parsers:
2
- #### SPECIAL CASES TOP ####
3
-
4
- # HbbTV standard defines what features the browser should understand.
5
- # but it's like targeting "HTML5 browsers", effective browser support depends on the model
6
- # See os_parsers if you want to target a specific TV
7
- - regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \('
8
-
9
- # must go before Firefox to catch Chimera/SeaMonkey/Camino
10
- - regex: '(Chimera|SeaMonkey|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)?'
11
-
12
- # Firefox
13
- - regex: '(Pale[Mm]oon)/(\d+)\.(\d+)\.?(\d+)?'
14
- family_replacement: 'Pale Moon (Firefox Variant)'
15
- - regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
16
- family_replacement: 'Firefox Mobile'
17
- - regex: '(Fennec)/(\d+)\.(\d+)(pre)'
18
- family_replacement: 'Firefox Mobile'
19
- - regex: '(Fennec)/(\d+)\.(\d+)'
20
- family_replacement: 'Firefox Mobile'
21
- - regex: 'Mobile.*(Firefox)/(\d+)\.(\d+)'
22
- family_replacement: 'Firefox Mobile'
23
- - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
24
- family_replacement: 'Firefox ($1)'
25
- - regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
26
- family_replacement: 'Firefox Alpha'
27
- - regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
28
- family_replacement: 'Firefox Beta'
29
- - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)'
30
- family_replacement: 'Firefox Alpha'
31
- - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)'
32
- family_replacement: 'Firefox Beta'
33
- - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
34
- family_replacement: 'Firefox ($1)'
35
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
36
- family_replacement: 'MicroB'
37
- - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
38
-
39
- # e.g.: Flock/2.0b2
40
- - regex: '(Flock)/(\d+)\.(\d+)(b\d+?)'
41
-
42
- # RockMelt
43
- - regex: '(RockMelt)/(\d+)\.(\d+)\.(\d+)'
44
-
45
- # e.g.: Fennec/0.9pre
46
- - regex: '(Navigator)/(\d+)\.(\d+)\.(\d+)'
47
- family_replacement: 'Netscape'
48
-
49
- - regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
50
- family_replacement: 'Netscape'
51
-
52
- - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+)?'
53
- family_replacement: 'Netscape'
54
-
55
- - regex: '(MyIBrow)/(\d+)\.(\d+)'
56
- family_replacement: 'My Internet Browser'
57
-
58
- # Opera will stop at 9.80 and hide the real version in the Version string.
59
- # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
60
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?'
61
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
62
- family_replacement: 'Opera Mobile'
63
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
64
- family_replacement: 'Opera Mobile'
65
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
66
- family_replacement: 'Opera Mobile'
67
- - regex: 'Opera Mobi'
68
- family_replacement: 'Opera Mobile'
69
- - regex: '(Opera Mini)(?:/att)?/(\d+)\.(\d+)'
70
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
71
-
72
- # Opera 14 for Android uses a WebKit render engine.
73
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
74
- family_replacement: 'Opera Mobile'
75
-
76
- # Opera 15 for Desktop is similar to Chrome but includes an "OPR" Version string.
77
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
78
- family_replacement: 'Opera'
79
-
80
- # Palm WebOS looks a lot like Safari.
81
- - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
82
- family_replacement: 'webOS Browser'
83
-
84
- # LuaKit has no version info.
85
- # http://luakit.org/projects/luakit/
86
- - regex: '(luakit)'
87
- family_replacement: 'LuaKit'
88
-
89
- # Snowshoe
90
- - regex: '(Snowshoe)/(\d+)\.(\d+).(\d+)'
91
-
92
- # Lightning (for Thunderbird)
93
- # http://www.mozilla.org/projects/calendar/lightning/
94
- - regex: '(Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
95
-
96
- # Swiftfox
97
- - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
98
- family_replacement: 'Swiftfox'
99
- - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)'
100
- family_replacement: 'Swiftfox'
101
-
102
- # Rekonq
103
- - regex: '(rekonq)/(\d+)\.(\d+)\.?(\d+)? Safari'
104
- family_replacement: 'Rekonq'
105
- - regex: 'rekonq'
106
- family_replacement: 'Rekonq'
107
-
108
- # Conkeror lowercase/uppercase
109
- # http://conkeror.org/
110
- - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?'
111
- family_replacement: 'Conkeror'
112
-
113
- # catches lower case konqueror
114
- - regex: '(konqueror)/(\d+)\.(\d+)\.(\d+)'
115
- family_replacement: 'Konqueror'
116
-
117
- - regex: '(WeTab)-Browser'
118
-
119
- - regex: '(Comodo_Dragon)/(\d+)\.(\d+)\.(\d+)'
120
- family_replacement: 'Comodo Dragon'
121
-
122
- # Bots
123
- - regex: '(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)'
124
-
125
- - regex: '(Symphony) (\d+).(\d+)'
126
-
127
- - regex: '(Minimo)'
128
-
129
- - regex: 'PLAYSTATION 3.+WebKit'
130
- family_replacement: 'NetFront NX'
131
- - regex: 'PLAYSTATION 3'
132
- family_replacement: 'NetFront'
133
- - regex: '(PlayStation Portable)'
134
- family_replacement: 'NetFront'
135
- - regex: '(PlayStation Vita)'
136
- family_replacement: 'NetFront NX'
137
-
138
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
139
- family_replacement: 'NetFront NX'
140
- - regex: '(Nintendo 3DS)'
141
- family_replacement: 'NetFront NX'
142
-
143
- # Amazon Silk, should go before Safari and Chrome Mobile
144
- - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
145
- family_replacement: 'Amazon Silk'
146
-
147
-
148
- # @ref: http://www.puffinbrowser.com
149
- - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))?'
150
-
151
- # Chrome Mobile
152
- - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
153
- family_replacement: 'Chrome Mobile'
154
- - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
155
- family_replacement: 'Chrome Mobile iOS'
156
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile'
157
- family_replacement: 'Chrome Mobile'
158
-
159
- # Chrome Frame must come before MSIE.
160
- - regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
161
- family_replacement: 'Chrome Frame'
162
-
163
- # UC Browser
164
- - regex: '(UCBrowser)[ /](\d+)\.(\d+)\.(\d+)'
165
- family_replacement: 'UC Browser'
166
- - regex: '(UC Browser)[ /](\d+)\.(\d+)\.(\d+)'
167
- - regex: '(UC Browser|UCBrowser|UCWEB)(\d+)\.(\d+)\.(\d+)'
168
- family_replacement: 'UC Browser'
169
-
170
- # Tizen Browser (second case included in browser/major.minor regex)
171
- - regex: '(SLP Browser)/(\d+)\.(\d+)'
172
- family_replacement: 'Tizen Browser'
173
-
174
- # Sogou Explorer 2.X
175
- - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
176
- family_replacement: 'Sogou Explorer'
177
-
178
- # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
179
- - regex: '(baidubrowser)[/\s](\d+)'
180
- family_replacement: 'Baidu Browser'
181
- - regex: '(FlyFlow)/(\d+)\.(\d+)'
182
- family_replacement: 'Baidu Explorer'
183
-
184
- # QQ Browsers
185
- - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
186
- family_replacement: 'QQ Browser Mini'
187
- - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
188
- family_replacement: 'QQ Browser Mobile'
189
- - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))?)?)?'
190
- family_replacement: 'QQ Browser'
191
-
192
- # Pingdom
193
- - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
194
- family_replacement: 'PingdomBot'
195
-
196
- # Facebook
197
- - regex: '(facebookexternalhit)/(\d+)\.(\d+)'
198
- family_replacement: 'FacebookBot'
199
-
200
- # LinkedIn
201
- - regex: '(LinkedInBot)/(\d+)\.(\d+)'
202
- family_replacement: 'LinkedInBot'
203
-
204
- # Twitterbot
205
- - regex: '(Twitterbot)/(\d+)\.(\d+)'
206
- family_replacement: 'TwitterBot'
207
-
208
- # Google Plus
209
- - regex: 'Google.*/\+/web/snippet'
210
- family_replacement: 'GooglePlusBot'
211
-
212
- # Rackspace Monitoring
213
- - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
214
- family_replacement: 'RackspaceBot'
215
-
216
- # PyAMF
217
- - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
218
-
219
- # Yandex Browser
220
- - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)'
221
- family_replacement: 'Yandex Browser'
222
-
223
- # Mail.ru Amigo/Internet Browser (Chromium-based)
224
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
225
- family_replacement: 'Mail.ru Chromium Browser'
226
-
227
- # AOL Browser (IE-based)
228
- - regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
229
-
230
- #### END SPECIAL CASES TOP ####
231
-
232
- #### MAIN CASES - this catches > 50% of all browsers ####
233
-
234
- # Browser/major_version.minor_version.beta_version
235
- - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|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+)'
236
-
237
- # Outlook 2007
238
- - regex: 'MSOffice 12'
239
- family_replacement: 'Outlook'
240
- v1_replacement: '2007'
241
-
242
- # Outlook 2010
243
- - regex: 'MSOffice 14'
244
- family_replacement: 'Outlook'
245
- v1_replacement: '2010'
246
-
247
- # Outlook 2013
248
- - regex: 'Microsoft Outlook 15\.\d+\.\d+'
249
- family_replacement: 'Outlook'
250
- v1_replacement: '2013'
251
-
252
- # Apple Air Mail
253
- - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'
254
-
255
- # Thunderbird
256
- - regex: '(Thunderbird)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
257
- family_replacement: 'Thunderbird'
258
-
259
- # Chrome/Chromium/major_version.minor_version.beta_version
260
- - regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)'
261
-
262
- # Dolphin Browser
263
- # @ref: http://www.dolphin.com
264
- - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)\.?(\d+)?'
265
-
266
- # Browser/major_version.minor_version
267
- - regex: '(bingbot|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|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin)/(\d+)\.(\d+)\.?(\d+)?'
268
-
269
- # Chrome/Chromium/major_version.minor_version
270
- - regex: '(Chromium|Chrome)/(\d+)\.(\d+)'
271
-
272
- ##########
273
- # IE Mobile needs to happen before Android to catch cases such as:
274
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
275
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
276
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
277
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Vodafone)...
278
- ##########
279
-
280
- # IE Mobile
281
- - regex: '(IEMobile)[ /](\d+)\.(\d+)'
282
- family_replacement: 'IE Mobile'
283
-
284
- # Browser major_version.minor_version.beta_version (space instead of slash)
285
- - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
286
- # Browser major_version.minor_version (space instead of slash)
287
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\d+)\.(\d+)\.?(\d+)?'
288
-
289
- # Kindle WebKit
290
- - regex: '(Kindle)/(\d+)\.(\d+)'
291
-
292
- # weird android UAs
293
- - regex: '(Android) Donut'
294
- v1_replacement: '1'
295
- v2_replacement: '2'
296
-
297
- - regex: '(Android) Eclair'
298
- v1_replacement: '2'
299
- v2_replacement: '1'
300
-
301
- - regex: '(Android) Froyo'
302
- v1_replacement: '2'
303
- v2_replacement: '2'
304
-
305
- - regex: '(Android) Gingerbread'
306
- v1_replacement: '2'
307
- v2_replacement: '3'
308
-
309
- - regex: '(Android) Honeycomb'
310
- v1_replacement: '3'
311
-
312
- # desktop mode
313
- # http://www.anandtech.com/show/3982/windows-phone-7-review
314
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
315
- family_replacement: 'IE Large Screen'
316
-
317
- #### END MAIN CASES ####
318
-
319
- #### SPECIAL CASES ####
320
- - regex: '(Obigo)InternetBrowser'
321
- - regex: '(Obigo)\-Browser'
322
- - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
323
- family_replacement: 'Obigo'
324
-
325
- - regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
326
- family_replacement: 'Maxthon'
327
- - regex: '(Maxthon|MyIE2|Uzbl|Shiira)'
328
- v1_replacement: '0'
329
-
330
- - regex: '(BrowseX) \((\d+)\.(\d+)\.(\d+)'
331
-
332
- - regex: '(NCSA_Mosaic)/(\d+)\.(\d+)'
333
- family_replacement: 'NCSA Mosaic'
334
-
335
- # Polaris/d.d is above
336
- - regex: '(POLARIS)/(\d+)\.(\d+)'
337
- family_replacement: 'Polaris'
338
- - regex: '(Embider)/(\d+)\.(\d+)'
339
- family_replacement: 'Polaris'
340
-
341
- - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+)?'
342
- family_replacement: 'Bon Echo'
343
-
344
- # @note: iOS / OSX Applications
345
- - regex: '(CFNetwork)(?:/(\d+)\.(\d+)\.?(\d+)?)?'
346
- family_replacement: 'CFNetwork'
347
-
348
- - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'
349
- family_replacement: 'Mobile Safari'
350
- - regex: '(iPod).*Version/(\d+)\.(\d+)'
351
- family_replacement: 'Mobile Safari'
352
- - regex: '(iPhone).*Version/(\d+)\.(\d+)\.(\d+)'
353
- family_replacement: 'Mobile Safari'
354
- - regex: '(iPhone).*Version/(\d+)\.(\d+)'
355
- family_replacement: 'Mobile Safari'
356
- - regex: '(iPad).*Version/(\d+)\.(\d+)\.(\d+)'
357
- family_replacement: 'Mobile Safari'
358
- - regex: '(iPad).*Version/(\d+)\.(\d+)'
359
- family_replacement: 'Mobile Safari'
360
- - regex: '(iPod|iPhone|iPad);.*CPU.*OS (\d+)_(\d+)(?:_(\d+))?.*Mobile'
361
- family_replacement: 'Mobile Safari'
362
- - regex: '(iPod|iPhone|iPad)'
363
- family_replacement: 'Mobile Safari'
364
-
365
- - regex: '(AvantGo) (\d+).(\d+)'
366
-
367
- - regex: '(OneBrowser)/(\d+).(\d+)'
368
- family_replacement: 'ONE Browser'
369
-
370
- - regex: '(Avant)'
371
- v1_replacement: '1'
372
-
373
- # This is the Tesla Model S (see similar entry in device parsers)
374
- - regex: '(QtCarBrowser)'
375
- v1_replacement: '1'
376
-
377
- - regex: '^(iBrowser/Mini)(\d+).(\d+)'
378
- family_replacement: 'iBrowser Mini'
379
- - regex: '^(iBrowser|iRAPP)/(\d+).(\d+)'
380
-
381
- # nokia browsers
382
- # based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
383
- - regex: '^(Nokia)'
384
- family_replacement: 'Nokia Services (WAP) Browser'
385
- - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)\.(\d+)'
386
- family_replacement: 'Nokia Browser'
387
- - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)'
388
- family_replacement: 'Nokia Browser'
389
- - regex: '(NokiaBrowser)/(\d+)\.(\d+)'
390
- family_replacement: 'Nokia Browser'
391
- - regex: '(BrowserNG)/(\d+)\.(\d+).(\d+)'
392
- family_replacement: 'Nokia Browser'
393
- - regex: '(Series60)/5\.0'
394
- family_replacement: 'Nokia Browser'
395
- v1_replacement: '7'
396
- v2_replacement: '0'
397
- - regex: '(Series60)/(\d+)\.(\d+)'
398
- family_replacement: 'Nokia OSS Browser'
399
- - regex: '(S40OviBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
400
- family_replacement: 'Ovi Browser'
401
- - regex: '(Nokia)[EN]?(\d+)'
402
-
403
- # BlackBerry devices
404
- - regex: '(BB10);'
405
- family_replacement: 'BlackBerry WebKit'
406
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
407
- family_replacement: 'BlackBerry WebKit'
408
- - regex: '(Black[bB]erry).+Version/(\d+)\.(\d+)\.(\d+)'
409
- family_replacement: 'BlackBerry WebKit'
410
- - regex: '(Black[bB]erry)\s?(\d+)'
411
- family_replacement: 'BlackBerry'
412
-
413
- - regex: '(OmniWeb)/v(\d+)\.(\d+)'
414
-
415
- - regex: '(Blazer)/(\d+)\.(\d+)'
416
- family_replacement: 'Palm Blazer'
417
-
418
- - regex: '(Pre)/(\d+)\.(\d+)'
419
- family_replacement: 'Palm Pre'
420
-
421
- # fork of Links
422
- - regex: '(ELinks)/(\d+)\.(\d+)'
423
- - regex: '(ELinks) \((\d+)\.(\d+)'
424
- - regex: '(Links) \((\d+)\.(\d+)'
425
-
426
- - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
427
-
428
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
429
- # family_replacement: 'iPad'
430
-
431
- # Phantomjs, should go before Safari
432
- - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
433
-
434
- # WebKit Nightly
435
- - regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari'
436
- family_replacement: 'WebKit Nightly'
437
-
438
- # Safari
439
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
440
- family_replacement: 'Safari'
441
- # Safari didn't provide "Version/d.d.d" prior to 3.0
442
- - regex: '(Safari)/\d+'
443
-
444
- - regex: '(OLPC)/Update(\d+)\.(\d+)'
445
-
446
- - regex: '(OLPC)/Update()\.(\d+)'
447
- v1_replacement: '0'
448
-
449
- - regex: '(SEMC\-Browser)/(\d+)\.(\d+)'
450
-
451
- - regex: '(Teleca)'
452
- family_replacement: 'Teleca Browser'
453
-
454
- - regex: '(Phantom)/V(\d+)\.(\d+)'
455
- family_replacement: 'Phantom Browser'
456
-
457
- - regex: 'Trident(.*)rv.(\d+)\.(\d+)'
458
- family_replacement: 'IE'
459
-
460
- # Espial
461
- - regex: '(Espial)/(\d+)(?:\.(\d+))?(?:\.(\d+))?'
462
-
463
- # Apple Mail
464
-
465
- # apple mail - not directly detectable, have it after Safari stuff
466
- - regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'
467
- family_replacement: 'AppleMail'
468
-
469
- # AFTER THE EDGE CASES ABOVE!
470
- # AFTER IE11
471
- # BEFORE all other IE
472
- - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
473
- - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
474
-
475
- - regex: '([MS]?IE) (\d+)\.(\d+)'
476
- family_replacement: 'IE'
477
-
478
- - regex: '(python-requests)/(\d+)\.(\d+)'
479
- family_replacement: 'Python Requests'
480
-
481
- os_parsers:
482
- ##########
483
- # HbbTV vendors
484
- ##########
485
-
486
- # starts with the easy one : Panasonic seems consistent across years, hope it will continue
487
- #HbbTV/1.1.1 (;Panasonic;VIERA 2011;f.532;0071-0802 2000-0000;)
488
- #HbbTV/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)
489
- #HbbTV/1.2.1 (;Panasonic;VIERA 2013;3.672;4101-0003 0002-0000;)
490
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Panasonic);VIERA ([0-9]{4});'
491
-
492
- # Sony is consistent too but do not place year like the other
493
- # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
494
- # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
495
- # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
496
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
497
-
498
-
499
- # LG is consistent too, but we need to add manually the year model
500
- #Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)
501
- #Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ HbbTV/1.1.1 ( ;LGE ;NetCast 3.0 ;1.0 ;1.0M ;)
502
- - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 4.0'
503
- os_v1_replacement: '2013'
504
- - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 3.0'
505
- os_v1_replacement: '2012'
506
-
507
- # Samsung is on its way of normalizing their user-agent
508
- # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-FXPDEUC-1102.2;;) WebKit
509
- # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-MST12DEUC-1102.1;;) WebKit
510
- # HbbTV/1.1.1 (;Samsung;SmartTV2012;;;) WebKit
511
- # HbbTV/1.1.1 (;;;;;) Maple_2011
512
- - regex: 'HbbTV/1.1.1 \(;;;;;\) Maple_2011'
513
- os_replacement: 'Samsung'
514
- os_v1_replacement: '2011'
515
- # manage the two models of 2013
516
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
517
- os_v2_replacement: 'UE40F7000'
518
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
519
- os_v2_replacement: 'UE32F4500'
520
- # generic Samsung (works starting in 2012)
521
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
522
-
523
- # Philips : not found any other way than a manual mapping
524
- # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
525
- # Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
526
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/4'
527
- os_v1_replacement: '2013'
528
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/3'
529
- os_v1_replacement: '2012'
530
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/2'
531
- os_v1_replacement: '2011'
532
-
533
- # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
534
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
535
- os_replacement: 'FireHbbTV'
536
-
537
- # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
538
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
539
-
540
- ##########
541
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
542
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
543
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
544
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
545
- # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Vodafone)...
546
- ##########
547
-
548
- - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
549
-
550
- ##########
551
- # Android
552
- # can actually detect rooted android os. do we care?
553
- ##########
554
- - regex: '(Android)[ \-/](\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
555
-
556
- - regex: '(Android) Donut'
557
- os_v1_replacement: '1'
558
- os_v2_replacement: '2'
559
-
560
- - regex: '(Android) Eclair'
561
- os_v1_replacement: '2'
562
- os_v2_replacement: '1'
563
-
564
- - regex: '(Android) Froyo'
565
- os_v1_replacement: '2'
566
- os_v2_replacement: '2'
567
-
568
- - regex: '(Android) Gingerbread'
569
- os_v1_replacement: '2'
570
- os_v2_replacement: '3'
571
-
572
- - regex: '(Android) Honeycomb'
573
- os_v1_replacement: '3'
574
-
575
- # UCWEB
576
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?;'
577
- os_replacement: 'Android'
578
- - regex: '^UCWEB.*; (iPad OS|iPh OS) (\d+)_(\d+)(?:_(\d+))?;'
579
- os_replacement: 'iOS'
580
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))?;'
581
- os_replacement: 'Windows Phone'
582
- # JUC
583
- - regex: '^(JUC).*; ?U; ?(?:Android)?(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+))?'
584
- os_replacement: 'Android'
585
-
586
- ##########
587
- # Kindle Android
588
- ##########
589
- - regex: '(Silk-Accelerated=[a-z]{4,5})'
590
- os_replacement: 'Android'
591
-
592
- ##########
593
- # Windows
594
- # http://en.wikipedia.org/wiki/Windows_NT#Releases
595
- # possibility of false positive when different marketing names share same NT kernel
596
- # e.g. windows server 2003 and windows xp
597
- # lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
598
- # (very) roughly ordered in terms of frequency of occurence of regex (win xp currently most frequent, etc)
599
- ##########
600
-
601
- # ie mobile desktop mode
602
- # spoofs nt 6.1. must come before windows 7
603
- - regex: '(XBLWP7)'
604
- os_replacement: 'Windows Phone'
605
-
606
- # @note: This needs to come before Windows NT 6.1
607
- - regex: '(Windows ?Mobile)'
608
- os_replacement: 'Windows Mobile'
609
-
610
- - regex: '(Windows (?:NT 5\.2|NT 5\.1))'
611
- os_replacement: 'Windows XP'
612
-
613
- - regex: '(Windows NT 6\.1)'
614
- os_replacement: 'Windows 7'
615
-
616
- - regex: '(Windows NT 6\.0)'
617
- os_replacement: 'Windows Vista'
618
-
619
- - regex: '(Win 9x 4\.90)'
620
- os_replacement: 'Windows ME'
621
-
622
- - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
623
-
624
- - regex: '(Windows NT 6\.2; ARM;)'
625
- os_replacement: 'Windows RT'
626
- - regex: '(Windows NT 6\.2)'
627
- os_replacement: 'Windows 8'
628
-
629
- - regex: '(Windows NT 6\.3; ARM;)'
630
- os_replacement: 'Windows RT 8.1'
631
- - regex: '(Windows NT 6\.3)'
632
- os_replacement: 'Windows 8.1'
633
-
634
- - regex: '(Windows NT 5\.0)'
635
- os_replacement: 'Windows 2000'
636
-
637
- - regex: '(WinNT4.0)'
638
- os_replacement: 'Windows NT 4.0'
639
-
640
- - regex: '(Windows ?CE)'
641
- os_replacement: 'Windows CE'
642
-
643
- - regex: 'Win ?(95|98|3.1|NT|ME|2000)'
644
- os_replacement: 'Windows $1'
645
-
646
- - regex: 'Win16'
647
- os_replacement: 'Windows 3.1'
648
-
649
- - regex: 'Win32'
650
- os_replacement: 'Windows 95'
651
-
652
- ##########
653
- # Tizen OS from Samsung
654
- # spoofs Android so pushing it above
655
- ##########
656
- - regex: '(Tizen)/(\d+)\.(\d+)'
657
-
658
- ##########
659
- # Mac OS
660
- # @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
661
- # @ref: http://www.puredarwin.org/curious/versions
662
- ##########
663
- - regex: '(Mac OS X) (\d+)[_.](\d+)(?:[_.](\d+))?'
664
- # Leopard
665
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
666
- os_replacement: 'Mac OS X'
667
- os_v1_replacement: '10'
668
- os_v2_replacement: '5'
669
- # Snow Leopard
670
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
671
- os_replacement: 'Mac OS X'
672
- os_v1_replacement: '10'
673
- os_v2_replacement: '6'
674
- # Lion
675
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
676
- os_replacement: 'Mac OS X'
677
- os_v1_replacement: '10'
678
- os_v2_replacement: '7'
679
- # Mountain Lion
680
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
681
- os_replacement: 'Mac OS X'
682
- os_v1_replacement: '10'
683
- os_v2_replacement: '8'
684
- # Mavericks
685
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
686
- os_replacement: 'Mac OS X'
687
- os_v1_replacement: '10'
688
- os_v2_replacement: '9'
689
-
690
- # IE on Mac doesn't specify version number
691
- - regex: 'Mac_PowerPC'
692
- os_replacement: 'Mac OS'
693
-
694
- # builds before tiger don't seem to specify version?
695
-
696
- # ios devices spoof (mac os x), so including intel/ppc prefixes
697
- - regex: '(?:PPC|Intel) (Mac OS X)'
698
-
699
- ##########
700
- # iOS
701
- # http://en.wikipedia.org/wiki/IOS_version_history
702
- ##########
703
- - regex: '(CPU OS|iPhone OS|CPU iPhone) +(\d+)[_\.](\d+)(?:[_\.](\d+))?'
704
- os_replacement: 'iOS'
705
-
706
- # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
707
- - regex: '(iPhone|iPad|iPod); Opera'
708
- os_replacement: 'iOS'
709
-
710
- # few more stragglers
711
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
712
- os_replacement: 'iOS'
713
-
714
- - regex: '(AppleTV)/(\d+)\.(\d+)'
715
- os_replacement: 'ATV OS X'
716
-
717
- # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
718
- # whether the os maps to Mac OS, or iOS, or just Darwin.
719
- # See: http://user-agents.me/cfnetwork-version-list
720
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
721
- os_replacement: 'iOS'
722
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
723
- os_replacement: 'iOS'
724
- - regex: '(CFNetwork)/(5)48\.(1)\.4'
725
- os_replacement: 'iOS'
726
- - regex: '(CFNetwork)/(4)85\.1(3)\.9'
727
- os_replacement: 'iOS'
728
- - regex: '(CFNetwork)/(6)09\.(1)\.4'
729
- os_replacement: 'iOS'
730
- - regex: '(CFNetwork)/(6)(0)9'
731
- os_replacement: 'iOS'
732
- - regex: '(CFNetwork)/6(7)2\.(1)\.13'
733
- os_replacement: 'iOS'
734
- - regex: '(CFNetwork)/6(7)2\.(1)\.(1)4'
735
- os_replacement: 'iOS'
736
- - regex: '(CF)(Network)/6(7)(2)\.1\.15'
737
- os_replacement: 'iOS'
738
- os_v1_replacement: '7'
739
- os_v2_replacement: '1'
740
- - regex: '(CFNetwork)/6(7)2\.(0)\.(?:2|8)'
741
- os_replacement: 'iOS'
742
- - regex: '(CFNetwork)/709\.1'
743
- os_replacement: 'iOS'
744
- os_v1_replacement: '8'
745
- os_v2_replacement: '0.b5'
746
-
747
- ##########
748
- # CFNetwork iOS Apps
749
- # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
750
- ##########
751
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
752
- os_replacement: 'iOS'
753
- os_v1_replacement: '1'
754
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
755
- os_replacement: 'iOS'
756
- os_v1_replacement: '4'
757
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
758
- os_replacement: 'iOS'
759
- os_v1_replacement: '5'
760
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
761
- os_replacement: 'iOS'
762
- os_v1_replacement: '6'
763
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
764
- os_replacement: 'iOS'
765
- os_v1_replacement: '7'
766
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
767
- os_replacement: 'iOS'
768
- os_v1_replacement: '8'
769
- os_v2_replacement: '0'
770
- # iOS Apps
771
- - regex: '\b(iOS[ /]|iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?'
772
- os_replacement: 'iOS'
773
-
774
- ##########
775
- # Chrome OS
776
- # if version 0.0.0, probably this stuff:
777
- # http://code.google.com/p/chromium-os/issues/detail?id=11573
778
- # http://code.google.com/p/chromium-os/issues/detail?id=13790
779
- ##########
780
- - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))?'
781
- os_replacement: 'Chrome OS'
782
-
783
- ##########
784
- # Linux distros
785
- ##########
786
- - regex: '([Dd]ebian)'
787
- os_replacement: 'Debian'
788
- - regex: '(Linux Mint)(?:/(\d+))?'
789
- - regex: '(Mandriva)(?: Linux)?/(?:[\d.-]+m[a-z]{2}(\d+).(\d))?'
790
-
791
- ##########
792
- # Symbian + Symbian OS
793
- # http://en.wikipedia.org/wiki/History_of_Symbian
794
- ##########
795
- - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
796
- os_replacement: 'Symbian OS'
797
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
798
- os_replacement: 'Symbian^3 Anna'
799
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
800
- os_replacement: 'Symbian^3 Belle'
801
- - regex: '(Symbian/3)'
802
- os_replacement: 'Symbian^3'
803
- - regex: '\b(Series 60|SymbOS|S60Version|S60V\d|S60\b)'
804
- os_replacement: 'Symbian OS'
805
- - regex: '(MeeGo)'
806
- - regex: 'Symbian [Oo][Ss]'
807
- os_replacement: 'Symbian OS'
808
- - regex: 'Series40;'
809
- os_replacement: 'Nokia Series 40'
810
- - regex: 'Series30Plus;'
811
- os_replacement: 'Nokia Series 30 Plus'
812
-
813
- ##########
814
- # BlackBerry devices
815
- ##########
816
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
817
- os_replacement: 'BlackBerry OS'
818
- - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
819
- os_replacement: 'BlackBerry OS'
820
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
821
- os_replacement: 'BlackBerry OS'
822
- - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
823
- os_replacement: 'BlackBerry Tablet OS'
824
- - regex: '(Play[Bb]ook)'
825
- os_replacement: 'BlackBerry Tablet OS'
826
- - regex: '(Black[Bb]erry)'
827
- os_replacement: 'BlackBerry OS'
828
-
829
- ##########
830
- # Firefox OS
831
- ##########
832
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
833
- os_replacement: 'Firefox OS'
834
-
835
- ##########
836
- # BREW
837
- # yes, Brew is lower-cased for Brew MP
838
- ##########
839
- - regex: '(BREW)[ /](\d+)\.(\d+)\.(\d+)'
840
- - regex: '(BREW);'
841
- - regex: '(Brew MP|BMP)[ /](\d+)\.(\d+)\.(\d+)'
842
- os_replacement: 'Brew MP'
843
- - regex: 'BMP;'
844
- os_replacement: 'Brew MP'
845
-
846
- ##########
847
- # Google TV
848
- ##########
849
- - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))?|/[\da-z]+)'
850
-
851
- - regex: '(WebTV)/(\d+).(\d+)'
852
-
853
- ##########
854
- # Misc mobile
855
- ##########
856
- - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
857
- os_replacement: 'webOS'
858
- - regex: '(VRE);'
859
-
860
- ##########
861
- # Generic patterns
862
- # since the majority of os cases are very specific, these go last
863
- ##########
864
- - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
865
-
866
- # Gentoo Linux + Kernel Version
867
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))?.*gentoo'
868
- os_replacement: 'Gentoo'
869
-
870
- # Opera Mini Bada
871
- - regex: '\((Bada);'
872
-
873
- # just os
874
- - regex: '(Windows|Android|WeTab|Maemo)'
875
- - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Gentoo|Mageia|(?:Free|Open|Net|\b)BSD)'
876
- # Linux + Kernel Version
877
- - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))?)?'
878
- - regex: 'SunOS'
879
- os_replacement: 'Solaris'
880
-
881
- device_parsers:
882
- ##########
883
- # incomplete!
884
- # multiple replacement placeholds i.e. ($1) ($2) help solve problem of single device with multiple representations in ua
885
- # e.g. HTC Dream S should parse to the same device as HTC_DreamS
886
- ##########
887
-
888
- ##########
889
- # incomplete!
890
- # HTC
891
- # http://en.wikipedia.org/wiki/List_of_HTC_phones
892
- # this is quickly getting unwieldy
893
- ##########
894
- # example: Mozilla/5.0 (Linux; U; Android 2.3.2; fr-fr; HTC HD2 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
895
- - regex: 'HTC ([A-Z][a-z0-9]+) Build'
896
- device_replacement: 'HTC $1'
897
- # example: Mozilla/5.0 (Linux; U; Android 2.1; es-es; HTC Legend 1.23.161.1 Build/ERD79) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17,gzip
898
- - regex: 'HTC ([A-Z][a-z0-9 ]+) \d+\.\d+\.\d+\.\d+'
899
- device_replacement: 'HTC $1'
900
- # example: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HTC_Touch_Diamond2_T5353; Windows Phone 6.5.3.5)
901
- - regex: 'HTC_Touch_([A-Za-z0-9]+)'
902
- device_replacement: 'HTC Touch ($1)'
903
- # should come after HTC_Touch
904
- - regex: 'USCCHTC(\d+)'
905
- device_replacement: 'HTC $1 (US Cellular)'
906
- - regex: 'Sprint APA(9292)'
907
- device_replacement: 'HTC $1 (Sprint)'
908
- - regex: 'HTC ([A-Za-z0-9]+ [A-Z])'
909
- device_replacement: 'HTC $1'
910
- - regex: 'HTC[-_/\s]([A-Za-z0-9]+)'
911
- device_replacement: 'HTC $1'
912
- - regex: '(ADR[A-Za-z0-9]+)'
913
- device_replacement: 'HTC $1'
914
- - regex: '(HTC)'
915
-
916
- # Tesla Model S
917
- - regex: '(QtCarBrowser)'
918
- device_replacement: 'Tesla Model S'
919
-
920
- # Samsung
921
- - regex: '(SamsungSGHi560)'
922
- device_replacement: 'Samsung SGHi560'
923
-
924
- - regex: '(SCH-[A-Za-z0-9_-]+)'
925
- device_replacement: 'Samsung $1'
926
-
927
- - regex: '(SGH-[A-Za-z0-9_-]+)'
928
- device_replacement: 'Samsung $1'
929
-
930
- - regex: '(GT-[A-Za-z0-9_-]+)'
931
- device_replacement: 'Samsung $1'
932
-
933
- - regex: '(SM-[A-Za-z0-9_-]+)'
934
- device_replacement: 'Samsung $1'
935
-
936
- - regex: '(SPH-[A-Za-z0-9_-]+)'
937
- device_replacement: 'Samsung $1'
938
-
939
- - regex: 'SAMSUNG-([A-Za-z0-9_-]+)'
940
- device_replacement: 'Samsung $1'
941
-
942
- - regex: 'SAMSUNG ([A-Za-z0-9_-]+)'
943
- device_replacement: 'Samsung $1'
944
-
945
-
946
- #########
947
- # Ericsson - must come before nokia since they also use symbian
948
- #########
949
- - regex: 'SonyEricsson([A-Za-z0-9]+)/'
950
- device_replacement: 'Ericsson $1'
951
-
952
- ##########
953
- # PlayStation
954
- # The Vita spoofs the Kindle
955
- ##########
956
- - regex: 'PLAYSTATION 3'
957
- device_replacement: 'PlayStation 3'
958
- - regex: '(PlayStation (:?Portable|Vita))'
959
- - regex: '(PlayStation (:?\d+))'
960
-
961
- ##########
962
- # incomplete!
963
- # Kindle
964
- # http://amazonsilk.wordpress.com/useful-bits/silk-user-agent/
965
- ##########
966
- - regex: '(KFOT Build)'
967
- device_replacement: 'Kindle Fire'
968
- - regex: '(KFTT Build)'
969
- device_replacement: 'Kindle Fire HD'
970
- - regex: '(KFJWI Build)'
971
- device_replacement: 'Kindle Fire HD 8.9" WiFi'
972
- - regex: '(KFJWA Build)'
973
- device_replacement: 'Kindle Fire HD 8.9" 4G'
974
- - regex: '(KFSOWI Build)'
975
- device_replacement: 'Kindle Fire HD 7" WiFi'
976
- - regex: '(KFTHWI Build)'
977
- device_replacement: 'Kindle Fire HDX 7" WiFi'
978
- - regex: '(KFTHWA Build)'
979
- device_replacement: 'Kindle Fire HDX 7" 4G'
980
- - regex: '(KFAPWI Build)'
981
- device_replacement: 'Kindle Fire HDX 8.9" WiFi'
982
- - regex: '(KFAPWA Build)'
983
- device_replacement: 'Kindle Fire HDX 8.9" 4G'
984
- - regex: '(Kindle Fire)'
985
- - regex: '(Kindle)'
986
- - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
987
- device_replacement: 'Kindle Fire'
988
-
989
-
990
-
991
- ##########
992
- # NOKIA
993
- # nokia NokiaN8-00 comes before iphone. sometimes spoofs iphone
994
- ##########
995
- - regex: 'NokiaN([0-9]+)'
996
- device_replacement: 'Nokia N$1'
997
- - regex: 'NOKIA([A-Za-z0-9\v-]+)'
998
- device_replacement: 'Nokia $1'
999
- - regex: 'Nokia([A-Za-z0-9\v-]+)'
1000
- device_replacement: 'Nokia $1'
1001
- - regex: 'NOKIA ([A-Za-z0-9\-]+)'
1002
- device_replacement: 'Nokia $1'
1003
- - regex: 'Nokia ([A-Za-z0-9\-]+)'
1004
- device_replacement: 'Nokia $1'
1005
- - regex: 'Lumia ([A-Za-z0-9\-]+)'
1006
- device_replacement: 'Lumia $1'
1007
- - regex: 'Symbian'
1008
- device_replacement: 'Nokia'
1009
-
1010
- ##########
1011
- # BlackBerry
1012
- # http://www.useragentstring.com/pages/BlackBerry/
1013
- ##########
1014
- - regex: 'BB10; ([A-Za-z0-9\- ]+)\)'
1015
- device_replacement: 'BlackBerry $1'
1016
- - regex: '(PlayBook).+RIM Tablet OS'
1017
- device_replacement: 'BlackBerry Playbook'
1018
- - regex: 'Black[Bb]erry ([0-9]+);'
1019
- device_replacement: 'BlackBerry $1'
1020
- - regex: 'Black[Bb]erry([0-9]+)'
1021
- device_replacement: 'BlackBerry $1'
1022
- - regex: 'Black[Bb]erry;'
1023
- device_replacement: 'BlackBerry'
1024
-
1025
- ##########
1026
- # PALM / HP
1027
- ##########
1028
- # some palm devices must come before iphone. sometimes spoofs iphone in ua
1029
- - regex: '(Pre)/(\d+)\.(\d+)'
1030
- device_replacement: 'Palm Pre'
1031
- - regex: '(Pixi)/(\d+)\.(\d+)'
1032
- device_replacement: 'Palm Pixi'
1033
- - regex: '(Touch[Pp]ad)/(\d+)\.(\d+)'
1034
- device_replacement: 'HP TouchPad'
1035
- - regex: 'HPiPAQ([A-Za-z0-9]+)/(\d+).(\d+)'
1036
- device_replacement: 'HP iPAQ $1'
1037
- - regex: 'Palm([A-Za-z0-9]+)'
1038
- device_replacement: 'Palm $1'
1039
- - regex: 'Treo([A-Za-z0-9]+)'
1040
- device_replacement: 'Palm Treo $1'
1041
- - regex: 'webOS.*(P160UNA)/(\d+).(\d+)'
1042
- device_replacement: 'HP Veer'
1043
-
1044
- ##########
1045
- # AppleTV
1046
- # No built in browser that I can tell
1047
- # Stack Overflow indicated iTunes-AppleTV/4.1 as a known UA for app available and I'm seeing it in live traffic
1048
- ##########
1049
- - regex: '(AppleTV)'
1050
- device_replacement: 'AppleTV'
1051
-
1052
- ##########
1053
- # Catch the google mobile crawler before checking for iPhones.
1054
- ##########
1055
-
1056
- - regex: 'AdsBot-Google-Mobile'
1057
- device_replacement: 'Spider'
1058
-
1059
- - regex: 'Googlebot-Mobile/(\d+).(\d+)'
1060
- device_replacement: 'Spider'
1061
-
1062
- - regex: 'Googlebot/\d+.\d+'
1063
- device_replacement: 'Spider'
1064
-
1065
- - regex: 'NING/(\d+).(\d+)'
1066
- device_replacement: 'Spider'
1067
-
1068
- - regex: 'MsnBot-Media /(\d+).(\d+)'
1069
- device_replacement: 'Spider'
1070
-
1071
- ##########
1072
- # complete but probably catches spoofs
1073
- # iSTUFF
1074
- ##########
1075
- # ipad and ipod must be parsed before iphone
1076
- # cannot determine specific device type from ua string. (3g, 3gs, 4, etc)
1077
- - regex: '(iPad) Simulator;'
1078
- - regex: '(iPad);'
1079
- - regex: '(iPod) touch;'
1080
- - regex: '(iPod);'
1081
- - regex: '(iPhone) Simulator;'
1082
- - regex: '(iPhone);'
1083
-
1084
- ##########
1085
- # Acer
1086
- ##########
1087
- - regex: 'acer_([A-Za-z0-9]+)_'
1088
- device_replacement: 'Acer $1'
1089
- - regex: 'acer_([A-Za-z0-9]+)_'
1090
- device_replacement: 'Acer $1'
1091
-
1092
- ##########
1093
- # Alcatel
1094
- ##########
1095
- - regex: 'ALCATEL-([A-Za-z0-9]+)'
1096
- device_replacement: 'Alcatel $1'
1097
- - regex: 'Alcatel-([A-Za-z0-9]+)'
1098
- device_replacement: 'Alcatel $1'
1099
- - regex: 'ALCATEL_ONE_TOUCH_([A-Za-z0-9]+)'
1100
- device_replacement: 'Alcatel ONE TOUCH $1'
1101
- - regex: 'ALCATEL (ONE TOUCH [A-Za-z0-9]+)'
1102
- device_replacement: 'Alcatel $1'
1103
- - regex: 'ALCATEL (one touch [A-Za-z0-9]+)'
1104
- device_replacement: 'Alcatel $1'
1105
- - regex: 'ALCATEL ([A-Za-z0-9]+)'
1106
- device_replacement: 'Alcatel $1'
1107
- ##########
1108
- # Amoi
1109
- ##########
1110
- - regex: 'Amoi\-([A-Za-z0-9]+)'
1111
- device_replacement: 'Amoi $1'
1112
- - regex: 'AMOI\-([A-Za-z0-9]+)'
1113
- device_replacement: 'Amoi $1'
1114
-
1115
- ##########
1116
- # Amoi
1117
- ##########
1118
- - regex: 'Asus\-([A-Za-z0-9]+)'
1119
- device_replacement: 'Asus $1'
1120
- - regex: 'ASUS\-([A-Za-z0-9]+)'
1121
- device_replacement: 'Asus $1'
1122
-
1123
- ##########
1124
- # Bird
1125
- ##########
1126
- - regex: 'BIRD\-([A-Za-z0-9]+)'
1127
- device_replacement: 'Bird $1'
1128
- - regex: 'BIRD\.([A-Za-z0-9]+)'
1129
- device_replacement: 'Bird $1'
1130
- - regex: 'BIRD ([A-Za-z0-9]+)'
1131
- device_replacement: 'Bird $1'
1132
-
1133
- ##########
1134
- # Dell
1135
- ##########
1136
- - regex: 'Dell ([A-Za-z0-9]+)'
1137
- device_replacement: 'Dell $1'
1138
-
1139
- ##########
1140
- # DoCoMo
1141
- ##########
1142
- - regex: 'DoCoMo/2\.0 ([A-Za-z0-9]+)'
1143
- device_replacement: 'DoCoMo $1'
1144
- - regex: '([A-Za-z0-9]+)_W\;FOMA'
1145
- device_replacement: 'DoCoMo $1'
1146
- - regex: '([A-Za-z0-9]+)\;FOMA'
1147
- device_replacement: 'DoCoMo $1'
1148
-
1149
- ##########
1150
- # Huawei
1151
- ##########
1152
- - regex: 'Huawei([A-Za-z0-9]+)'
1153
- device_replacement: 'Huawei $1'
1154
- - regex: 'HUAWEI-([A-Za-z0-9]+)'
1155
- device_replacement: 'Huawei $1'
1156
- - regex: 'vodafone([A-Za-z0-9]+)'
1157
- device_replacement: 'Huawei Vodafone $1'
1158
-
1159
- ##########
1160
- # i-mate
1161
- ##########
1162
- - regex: 'i\-mate ([A-Za-z0-9]+)'
1163
- device_replacement: 'i-mate $1'
1164
-
1165
- ##########
1166
- # kyocera
1167
- ##########
1168
- - regex: 'Kyocera\-([A-Za-z0-9]+)'
1169
- device_replacement: 'Kyocera $1'
1170
- - regex: 'KWC\-([A-Za-z0-9]+)'
1171
- device_replacement: 'Kyocera $1'
1172
-
1173
- ##########
1174
- # lenovo
1175
- ##########
1176
- - regex: 'Lenovo\-([A-Za-z0-9]+)'
1177
- device_replacement: 'Lenovo $1'
1178
- - regex: 'Lenovo_([A-Za-z0-9]+)'
1179
- device_replacement: 'Lenovo $1'
1180
-
1181
- ##########
1182
- # HbbTV (European and Australian standard)
1183
- # written before the LG regexes, as LG is making HbbTV too
1184
- ##########
1185
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+'
1186
-
1187
- ##########
1188
- # lg
1189
- ##########
1190
- - regex: 'LG/([A-Za-z0-9]+)'
1191
- device_replacement: 'LG $1'
1192
- - regex: 'LG-LG([A-Za-z0-9]+)'
1193
- device_replacement: 'LG $1'
1194
- - regex: 'LGE-LG([A-Za-z0-9]+)'
1195
- device_replacement: 'LG $1'
1196
- - regex: 'LGE VX([A-Za-z0-9]+)'
1197
- device_replacement: 'LG $1'
1198
- - regex: 'LG ([A-Za-z0-9]+)'
1199
- device_replacement: 'LG $1'
1200
- - regex: 'LGE LG\-AX([A-Za-z0-9]+)'
1201
- device_replacement: 'LG $1'
1202
- - regex: 'LG\-([A-Za-z0-9]+)'
1203
- device_replacement: 'LG $1'
1204
- - regex: 'LGE\-([A-Za-z0-9]+)'
1205
- device_replacement: 'LG $1'
1206
- - regex: 'LG([A-Za-z0-9]+)'
1207
- device_replacement: 'LG $1'
1208
-
1209
- ##########
1210
- # kin
1211
- ##########
1212
- - regex: '(KIN)\.One (\d+)\.(\d+)'
1213
- device_replacement: 'Microsoft $1'
1214
- - regex: '(KIN)\.Two (\d+)\.(\d+)'
1215
- device_replacement: 'Microsoft $1'
1216
-
1217
- ##########
1218
- # motorola
1219
- ##########
1220
- - regex: '(Motorola)\-([A-Za-z0-9]+)'
1221
- - regex: 'MOTO\-([A-Za-z0-9]+)'
1222
- device_replacement: 'Motorola $1'
1223
- - regex: 'MOT\-([A-Za-z0-9]+)'
1224
- device_replacement: 'Motorola $1'
1225
- - regex: ' (DROID RAZR [A-Za-z0-9 ]+) '
1226
- device_replacement: 'Motorola $1'
1227
- - regex: ' (DROID[2 ][A-Za-z0-9 ]+) '
1228
- device_replacement: 'Motorola $1'
1229
- - regex: ' (Droid2| )'
1230
- device_replacement: 'Motorola $1'
1231
- - regex: ' (DROID2| )'
1232
- device_replacement: 'Motorola $1'
1233
-
1234
- ##########
1235
- # nintendo
1236
- ##########
1237
- - regex: '(Nintendo WiiU)'
1238
- device_replacement: 'Nintendo Wii U'
1239
- - regex: 'Nintendo (DS|3DS|DSi|Wii);'
1240
- device_replacement: 'Nintendo $1'
1241
-
1242
- ##########
1243
- # pantech
1244
- ##########
1245
- - regex: 'Pantech([A-Za-z0-9]+)'
1246
- device_replacement: 'Pantech $1'
1247
-
1248
- ##########
1249
- # philips
1250
- ##########
1251
- - regex: 'Philips([A-Za-z0-9]+)'
1252
- device_replacement: 'Philips $1'
1253
- - regex: 'Philips ([A-Za-z0-9]+)'
1254
- device_replacement: 'Philips $1'
1255
-
1256
- ##########
1257
- # Samsung
1258
- ##########
1259
- - regex: 'SAMSUNG-([A-Za-z0-9\-]+)'
1260
- device_replacement: 'Samsung $1'
1261
- - regex: 'SAMSUNG\; ([A-Za-z0-9\-]+)'
1262
- device_replacement: 'Samsung $1'
1263
-
1264
- ##########
1265
- # ZTE
1266
- ##########
1267
- - regex: 'ZTE-([A-Za-z0-9\-]+)'
1268
- device_replacement: 'ZTE $1'
1269
- - regex: 'ZTE ([A-Za-z0-9\-]+)'
1270
- device_replacement: 'ZTE $1'
1271
- - regex: 'ZTE_([A-Za-z0-9\-]+)'
1272
- device_replacement: 'ZTE $1'
1273
-
1274
- ##########
1275
- # Sega
1276
- ##########
1277
- - regex: 'Dreamcast'
1278
- device_replacement: 'Sega Dreamcast'
1279
-
1280
- ##########
1281
- # Softbank
1282
- ##########
1283
- - regex: 'Softbank/1\.0/([A-Za-z0-9]+)'
1284
- device_replacement: 'Softbank $1'
1285
- - regex: 'Softbank/2\.0/([A-Za-z0-9]+)'
1286
- device_replacement: 'Softbank $1'
1287
-
1288
- ##########
1289
- # SONY #
1290
- ##########
1291
- - regex: 'Sony([^ ]+) '
1292
- device_replacement: 'Sony $1'
1293
-
1294
- ##########
1295
- # WebTV
1296
- ##########
1297
- - regex: '(WebTV)/(\d+).(\d+)'
1298
-
1299
- #########
1300
- # Android General Device Matching (far from perfect)
1301
- #########
1302
- - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; [^;]+; ([A-Za-z0-9 _-]+) '
1303
- - regex: 'Android[\- ][\d]+\.[\d]+; [^;]+; ([A-Za-z0-9 _-]+) '
1304
- - regex: 'Android[\- ][\d]+\.[\d]+; [^;]+; WOWMobile ([A-Za-z0-9 _-]+) '
1305
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [^;]+; ([A-Za-z0-9 _-]+) '
1306
- - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+;[^;]+;([A-Za-z0-9 _-]+) '
1307
- - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; ([A-Za-z0-9 _-]+) '
1308
- - regex: 'Android[\- ][\d]+\.[\d]+; ([A-Za-z0-9 _-]+) '
1309
- - regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; [^;]+; ([A-Za-z0-9\.\/_-]+) '
1310
- - regex: 'Android[\- ][\d]+\.[\d]+; [^;]+; ([A-Za-z0-9\.\/_-]+) '
1311
-
1312
- ##########
1313
- # Generic Smart Phone
1314
- ##########
1315
- - regex: '(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)'
1316
- device_replacement: "Generic Smartphone"
1317
-
1318
- ##########
1319
- # Generic Feature Phone
1320
- ##########
1321
- - 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)'
1322
- device_replacement: 'Generic Feature Phone'
1323
- - 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)'
1324
- device_replacement: 'Generic Feature Phone'
1325
- - 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)'
1326
- device_replacement: 'Generic Feature Phone'
1327
- - 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_)'
1328
- device_replacement: 'Generic Feature Phone'
1329
-
1330
- ##########
1331
- # Spiders (this is hack...)
1332
- ##########
1333
- - regex: '(bingbot|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|Netvibes|Sogou Pic Spider|ICC\-Crawler|Innovazion Crawler|Daumoa|EtaoSpider|A6\-Indexer|YisouSpider|Riddler|DBot|wsr\-agent|Xenu|SeznamBot|PaperLiBot|SputnikBot|CCBot|ProoXiBot|Scrapy|Genieo|Screaming Frog|YahooCacheSystem|CiBra|Nutch)'
1334
- device_replacement: 'Spider'
1335
-