logstash-filter-useragent 0.1.2 → 0.1.3

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: bf6c5e426e63cb3ce40fc1be083225d75d697a2b
4
- data.tar.gz: decaf9b5d1026f780cc092fdfc3ee86d61387b4e
3
+ metadata.gz: 18e097248f0118fc6bc5e6048e886f5efe2ce69a
4
+ data.tar.gz: 94d0d9d30c02ba26c7a2d050a2ab28d22b714d89
5
5
  SHA512:
6
- metadata.gz: 01a6c071b2cfcb9431ba399d47dfbd6b4c0ad5f19136dfde6a9935d57d028ec4485d4e4429252ec54e37537641703887f7111ae1e0a1e2902ccaf10967fbe3f5
7
- data.tar.gz: f5ddff739518600b9a3d7d5b5f546d53f75b2720d62d7dadb0bc7a98406e18ca696a796c4e349f5fcfa6e29b1d6cbd31fc93cf5347591504c041b78185e072ec
6
+ metadata.gz: 4ad75cd9499e2583ac056cb3e249ecc19a74d7556fe6d85668e5826b3126118ad627f82c5a0f595509e962f69c5ca75698b152d718f06f459e7f9003f5b641b7
7
+ data.tar.gz: bb2587fae7fff05e2c065c7acf5d84bb034143ef2478edee2f31961532956ef60fb69ec7a2555be9056f53268a9cd8dfc66908e97287117fdd8431d4d6874c6f
data/CONTRIBUTORS ADDED
@@ -0,0 +1,18 @@
1
+ The following is a list of people who have contributed ideas, code, bug
2
+ reports, or in general have helped logstash along its way.
3
+
4
+ Contributors:
5
+ * Alex Tambellini (atambo)
6
+ * Colin Surprenant (colinsurprenant)
7
+ * Dan Everton (deverton)
8
+ * Jay Luker (lbjay)
9
+ * Jordan Sissel (jordansissel)
10
+ * Kubes (pkubat)
11
+ * Pier-Hugues Pellerin (ph)
12
+ * Richard Pijnenburg (electrical)
13
+ * Suyog Rao (suyograo)
14
+
15
+ Note: If you've sent us patches, bug reports, or otherwise contributed to
16
+ Logstash, and you aren't on the list above and want to be, please let us know
17
+ and we'll make sure you're here. Contributions from folks like you are what make
18
+ open source awesome.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2014 Elasticsearch <http://www.elasticsearch.org>
1
+ Copyright (c) 2012-2015 Elasticsearch <http://www.elasticsearch.org>
2
2
 
3
3
  Licensed under the Apache License, Version 2.0 (the "License");
4
4
  you may not use this file except in compliance with the License.
data/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # Logstash Plugin
2
+
3
+ This is a plugin for [Logstash](https://github.com/elasticsearch/logstash).
4
+
5
+ It is fully free and fully open source. The license is Apache 2.0, meaning you are pretty much free to use it however you want in whatever way.
6
+
7
+ ## Documentation
8
+
9
+ Logstash provides infrastructure to automatically generate documentation for this plugin. We use the asciidoc format to write documentation so any comments in the source code will be first converted into asciidoc and then into html. All plugin documentation are placed under one [central location](http://www.elasticsearch.org/guide/en/logstash/current/).
10
+
11
+ - For formatting code or config example, you can use the asciidoc `[source,ruby]` directive
12
+ - For more asciidoc formatting tips, see the excellent reference here https://github.com/elasticsearch/docs#asciidoc-guide
13
+
14
+ ## Need Help?
15
+
16
+ Need help? Try #logstash on freenode IRC or the logstash-users@googlegroups.com mailing list.
17
+
18
+ ## Developing
19
+
20
+ ### 1. Plugin Developement and Testing
21
+
22
+ #### Code
23
+ - To get started, you'll need JRuby with the Bundler gem installed.
24
+
25
+ - Create a new plugin or clone and existing from the GitHub [logstash-plugins](https://github.com/logstash-plugins) organization.
26
+
27
+ - Install dependencies
28
+ ```sh
29
+ bundle install
30
+ ```
31
+
32
+ #### Test
33
+
34
+ ```sh
35
+ bundle exec rspec
36
+ ```
37
+
38
+ The Logstash code required to run the tests/specs is specified in the `Gemfile` by the line similar to:
39
+ ```ruby
40
+ gem "logstash", :github => "elasticsearch/logstash", :branch => "1.5"
41
+ ```
42
+ To test against another version or a local Logstash, edit the `Gemfile` to specify an alternative location, for example:
43
+ ```ruby
44
+ gem "logstash", :github => "elasticsearch/logstash", :ref => "master"
45
+ ```
46
+ ```ruby
47
+ gem "logstash", :path => "/your/local/logstash"
48
+ ```
49
+
50
+ Then update your dependencies and run your tests:
51
+
52
+ ```sh
53
+ bundle install
54
+ bundle exec rspec
55
+ ```
56
+
57
+ ### 2. Running your unpublished Plugin in Logstash
58
+
59
+ #### 2.1 Run in a local Logstash clone
60
+
61
+ - Edit Logstash `tools/Gemfile` and add the local plugin path, for example:
62
+ ```ruby
63
+ gem "logstash-filter-awesome", :path => "/your/local/logstash-filter-awesome"
64
+ ```
65
+ - Update Logstash dependencies
66
+ ```sh
67
+ rake vendor:gems
68
+ ```
69
+ - Run Logstash with your plugin
70
+ ```sh
71
+ bin/logstash -e 'filter {awesome {}}'
72
+ ```
73
+ At this point any modifications to the plugin code will be applied to this local Logstash setup. After modifying the plugin, simply rerun Logstash.
74
+
75
+ #### 2.2 Run in an installed Logstash
76
+
77
+ - Build your plugin gem
78
+ ```sh
79
+ gem build logstash-filter-awesome.gemspec
80
+ ```
81
+ - Install the plugin from the Logstash home
82
+ ```sh
83
+ bin/plugin install /your/local/plugin/logstash-filter-awesome.gem
84
+ ```
85
+ - Start Logstash and proceed to test the plugin
86
+
87
+ ## Contributing
88
+
89
+ All contributions are welcome: ideas, patches, documentation, bug reports, complaints, and even something you drew up on a napkin.
90
+
91
+ Programming is not a required skill. Whatever you've seen about open source and maintainers or community members saying "send patches or die" - you will not see that here.
92
+
93
+ It is more important to me that you are able to contribute.
94
+
95
+ For more information about contributing, see the [CONTRIBUTING](https://github.com/elasticsearch/logstash/blob/master/CONTRIBUTING.md) file.
@@ -13,7 +13,6 @@ require "tempfile"
13
13
  # <https://github.com/tobie/ua-parser/>.
14
14
  class LogStash::Filters::UserAgent < LogStash::Filters::Base
15
15
  config_name "useragent"
16
- milestone 3
17
16
 
18
17
  # The field containing the user agent string. If this field is an
19
18
  # array, only the first value will be used.
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-useragent'
4
- s.version = '0.1.2'
4
+ s.version = '0.1.3'
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"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-useragent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elasticsearch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-21 00:00:00.000000000 Z
11
+ date: 2015-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -65,13 +65,14 @@ extensions: []
65
65
  extra_rdoc_files: []
66
66
  files:
67
67
  - .gitignore
68
+ - CONTRIBUTORS
68
69
  - Gemfile
69
70
  - LICENSE
71
+ - README.md
70
72
  - Rakefile
71
73
  - lib/logstash/filters/useragent.rb
72
74
  - logstash-filter-useragent.gemspec
73
75
  - spec/filters/useragent_spec.rb
74
- - vendor/regexes.yaml
75
76
  homepage: http://www.elasticsearch.org/guide/en/logstash/current/index.html
76
77
  licenses:
77
78
  - Apache License (2.0)
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
-