user_agent_parser 2.3.0 → 2.3.1

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

Potentially problematic release.


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

Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/vendor/uap-core/regexes.yaml +232 -71
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 060db7ab278763b6c771c71a003be6293b708075
4
- data.tar.gz: 62ea54ddbf2caf8d207b3a29759de102743938f0
3
+ metadata.gz: 7fe22bcba079cdff8ad9ae2c58b4270ebf2b877f
4
+ data.tar.gz: 63e31e3fdc2f9074e44dfb7e52c3774d6bc03e9e
5
5
  SHA512:
6
- metadata.gz: 1b298cd04b81477ecca1697585fe9846d049def5b3a70f9686a565318320d09fa8657bb18d32ae60ab0d81d6d2c9dc6d1f89901d149c7e445ceb0abd1d8dcd35
7
- data.tar.gz: f71bfd96bfcb98f9789ade5e636212c3391e905462c792eb146e938bb255488437fa8d4236f3bec5be2c003858fba85837ccb3cee6772d0cc52dee13bac4f291
6
+ metadata.gz: 153fe2308068f9c566f8b5c25085f5cca6efa0bd05f8a0c0ef69c77d4b072dac6fb837dd76fc7c3f3ac6ff1fde7692d5bbf7299936e0dabe233da14fbd3b07bf
7
+ data.tar.gz: e8854b5205443f2de36364a1c65d51d6f1c56a49caed1d3a305c1283edcce8bc83bfde797048c5465783618887e83f76d1686509df8adf24445eecc6360ea801
@@ -8,6 +8,13 @@ user_agent_parsers:
8
8
  # Pingdom
9
9
  - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
10
10
  family_replacement: 'PingdomBot'
11
+ # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
12
+ - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
13
+ family_replacement: 'PingdomBot'
14
+
15
+ #StatusCake
16
+ - regex: '(\(StatusCake\))'
17
+ family_replacement: 'StatusCakeBot'
11
18
 
12
19
  # Facebook
13
20
  - regex: '(facebookexternalhit)/(\d+)\.(\d+)'
@@ -17,20 +24,28 @@ user_agent_parsers:
17
24
  - regex: 'Google.*/\+/web/snippet'
18
25
  family_replacement: 'GooglePlusBot'
19
26
 
27
+ # Gmail
28
+ - regex: 'via ggpht.com GoogleImageProxy'
29
+ family_replacement: 'GmailImageProxy'
30
+
31
+ # Twitter
32
+ - regex: '(Twitterbot)/(\d+)\.(\d+)'
33
+ family_replacement: 'TwitterBot'
34
+
20
35
  # Bots Pattern '/name-0.0'
21
36
  - regex: '/((?:Ant-)?Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)(?:\.(\d+))?)?'
22
37
  # Bots Pattern 'name/0.0'
23
- - regex: '(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
38
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
24
39
 
25
40
  # MSIECrawler
26
41
  - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d?)?;.* MSIECrawler'
27
42
  family_replacement: 'MSIECrawler'
28
43
 
29
44
  # Downloader ...
30
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
45
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
31
46
 
32
47
  # Bots
33
- - regex: '(1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]+-Agent|AdsBot-Google(?:-[a-z]+)?|altavista|AppEngine-Google|archive.*?\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]+)*|bingbot|BingPreview|blitzbot|BlogBridge|BoardReader(?: [A-Za-z]+)*|boitho.com-dc|BotSeer|\b\w*favicon\w*\b|\bYeti(?:-[a-z]+)?|Catchpoint bot|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher)?|Feed Seeker Bot|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]+-)?Googlebot(?:-[a-zA-Z]+)?|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile)?|IconSurf|IlTrovatore(?:-Setaccio)?|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]+Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masidani_bot|Mediapartners-Google|Microsoft .*? Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media *)?|msrbot|netresearch|Netvibes|NewsGator[^/]*|^NING|Nutch[^/]*|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slurp|snappy|Speedy Spider|Squrl Java|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|TwitterBot|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]+|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s)? Link Sleuth|Xerka [A-z]+Bot|yacy(?:bot)?|Yahoo[a-z]*Seeker|Yahoo! Slurp|Yandex\w+|YodaoBot(?:-[A-z]+)?|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
48
+ - regex: '(1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]+-Agent|AdsBot-Google(?:-[a-z]+)?|altavista|AppEngine-Google|archive.*?\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]+)*|bingbot|BingPreview|blitzbot|BlogBridge|BoardReader(?: [A-Za-z]+)*|boitho.com-dc|BotSeer|\b\w*favicon\w*\b|\bYeti(?:-[a-z]+)?|Catchpoint bot|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher)?|Feed Seeker Bot|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]+-)?Googlebot(?:-[a-zA-Z]+)?|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile)?|IconSurf|IlTrovatore(?:-Setaccio)?|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]+Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .*? Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media *)?|msrbot|netresearch|Netvibes|NewsGator[^/]*|^NING|Nutch[^/]*|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]+|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s)? Link Sleuth|Xerka [A-z]+Bot|yacy(?:bot)?|Yahoo[a-z]*Seeker|Yahoo! Slurp|Yandex\w+|YodaoBot(?:-[A-z]+)?|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
34
49
 
35
50
  # Bots General matcher 'name/0.0'
36
51
  - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9 \-_\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*))/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
@@ -55,9 +70,11 @@ user_agent_parsers:
55
70
  - regex: '\[(Pinterest)/[^\]]+\]'
56
71
  - regex: '(Pinterest)(?: for Android(?: Tablet)?)?/(\d+)(?:\.(\d+)(?:\.(\d)+)?)?'
57
72
 
73
+ # Pale Moon
74
+ - regex: '(PaleMoon)/(\d+)\.(\d+)\.?(\d+)?'
75
+ family_replacement: 'Pale Moon'
76
+
58
77
  # Firefox
59
- - regex: '(Pale[Mm]oon)/(\d+)\.(\d+)\.?(\d+)?'
60
- family_replacement: 'Pale Moon (Firefox Variant)'
61
78
  - regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
62
79
  family_replacement: 'Firefox Mobile'
63
80
  - regex: '(Fennec)/(\d+)\.(\d+)(pre)'
@@ -103,9 +120,15 @@ user_agent_parsers:
103
120
  - regex: '(MyIBrow)/(\d+)\.(\d+)'
104
121
  family_replacement: 'My Internet Browser'
105
122
 
123
+ # UC Browser
124
+ # we need check it before opera. In other case case UC Browser detected look like Opera Mini
125
+ - regex: '(UC? ?Browser|UCWEB|U3)[ /]?(\d+)\.(\d+)\.(\d+)'
126
+ family_replacement: 'UC Browser'
127
+
106
128
  # Opera will stop at 9.80 and hide the real version in the Version string.
107
129
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
108
130
  - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?'
131
+ - regex: '(Opera Mini)(?:/att)?/?(\d+)?(?:\.(\d+))?(?:\.(\d+))?'
109
132
  - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
110
133
  family_replacement: 'Opera Mobile'
111
134
  - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
@@ -114,7 +137,6 @@ user_agent_parsers:
114
137
  family_replacement: 'Opera Mobile'
115
138
  - regex: 'Opera Mobi'
116
139
  family_replacement: 'Opera Mobile'
117
- - regex: '(Opera Mini)(?:/att)?/(\d+)\.(\d+)'
118
140
  - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
119
141
 
120
142
  # Opera 14 for Android uses a WebKit render engine.
@@ -133,6 +155,10 @@ user_agent_parsers:
133
155
  - regex: '(OPiOS)/(\d+).(\d+).(\d+)'
134
156
  family_replacement: 'Opera Mini'
135
157
 
158
+ # Opera Neon
159
+ - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
160
+ family_replacement: 'Opera Neon'
161
+
136
162
  # Palm WebOS looks a lot like Safari.
137
163
  - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
138
164
  family_replacement: 'webOS Browser'
@@ -147,7 +173,7 @@ user_agent_parsers:
147
173
 
148
174
  # Lightning (for Thunderbird)
149
175
  # http://www.mozilla.org/projects/calendar/lightning/
150
- - regex: '(Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
176
+ - regex: 'Gecko/\d+ (Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
151
177
 
152
178
  # Swiftfox
153
179
  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
@@ -177,8 +203,6 @@ user_agent_parsers:
177
203
 
178
204
  - regex: '(Symphony) (\d+).(\d+)'
179
205
 
180
- - regex: '(Minimo)'
181
-
182
206
  - regex: 'PLAYSTATION 3.+WebKit'
183
207
  family_replacement: 'NetFront NX'
184
208
  - regex: 'PLAYSTATION 3'
@@ -197,29 +221,37 @@ user_agent_parsers:
197
221
  - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
198
222
  family_replacement: 'Amazon Silk'
199
223
 
200
-
201
224
  # @ref: http://www.puffinbrowser.com
202
225
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))?'
203
226
 
227
+ # Edge Mobile
228
+ - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
229
+ family_replacement: 'Edge Mobile'
230
+
231
+ # Samsung Internet (based on Chrome, but lacking some features)
232
+ - regex: '(SamsungBrowser)/(\d+)\.(\d+)'
233
+ family_replacement: 'Samsung Internet'
234
+
235
+ # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
236
+ - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)(?:\.(\d+))?)?'
237
+ family_replacement: 'Baidu Browser'
238
+ - regex: '(FlyFlow)/(\d+)\.(\d+)'
239
+ family_replacement: 'Baidu Explorer'
240
+
204
241
  # Chrome Mobile
205
242
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
206
243
  family_replacement: 'Chrome Mobile'
207
244
  - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
208
245
  family_replacement: 'Chrome Mobile iOS'
209
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile'
246
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
247
+ family_replacement: 'Chrome Mobile'
248
+ - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
210
249
  family_replacement: 'Chrome Mobile'
211
250
 
212
251
  # Chrome Frame must come before MSIE.
213
252
  - regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
214
253
  family_replacement: 'Chrome Frame'
215
254
 
216
- # UC Browser
217
- - regex: '(UCBrowser)[ /](\d+)\.(\d+)\.(\d+)'
218
- family_replacement: 'UC Browser'
219
- - regex: '(UC Browser)[ /](\d+)\.(\d+)\.(\d+)'
220
- - regex: '(UC Browser|UCBrowser|UCWEB)(\d+)\.(\d+)\.(\d+)'
221
- family_replacement: 'UC Browser'
222
-
223
255
  # Tizen Browser (second case included in browser/major.minor regex)
224
256
  - regex: '(SLP Browser)/(\d+)\.(\d+)'
225
257
  family_replacement: 'Tizen Browser'
@@ -228,12 +260,6 @@ user_agent_parsers:
228
260
  - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
229
261
  family_replacement: 'Sogou Explorer'
230
262
 
231
- # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
232
- - regex: '(baidubrowser)[/\s](\d+)'
233
- family_replacement: 'Baidu Browser'
234
- - regex: '(FlyFlow)/(\d+)\.(\d+)'
235
- family_replacement: 'Baidu Explorer'
236
-
237
263
  # QQ Browsers
238
264
  - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
239
265
  family_replacement: 'QQ Browser Mini'
@@ -260,20 +286,24 @@ user_agent_parsers:
260
286
  # AOL Browser (IE-based)
261
287
  - regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
262
288
 
289
+ # MxBrowser is Maxthon
290
+ - regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+))?'
291
+ family_replacement: 'Maxthon'
292
+
263
293
  #### END SPECIAL CASES TOP ####
264
294
 
265
295
  #### MAIN CASES - this catches > 50% of all browsers ####
266
296
 
267
297
  # Browser/major_version.minor_version.beta_version
268
- - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|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+)'
298
+ - regex: '\b(MobileIron|Crosswalk|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|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|MacOutlook|Electron)/(\d+)\.(\d+)\.(\d+)'
269
299
 
270
300
  # Outlook 2007
271
- - regex: 'MSOffice 12'
301
+ - regex: 'Microsoft Office Outlook 12\.\d+\.\d+|MSOffice 12'
272
302
  family_replacement: 'Outlook'
273
303
  v1_replacement: '2007'
274
304
 
275
305
  # Outlook 2010
276
- - regex: 'MSOffice 14'
306
+ - regex: 'Microsoft Outlook 14\.\d+\.\d+|MSOffice 14'
277
307
  family_replacement: 'Outlook'
278
308
  v1_replacement: '2010'
279
309
 
@@ -282,31 +312,63 @@ user_agent_parsers:
282
312
  family_replacement: 'Outlook'
283
313
  v1_replacement: '2013'
284
314
 
315
+ # Outlook 2016
316
+ - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+'
317
+ family_replacement: 'Outlook'
318
+ v1_replacement: '2016'
319
+
320
+ # Windows Live Mail
321
+ - regex: 'Outlook-Express\/7\.0.*'
322
+ family_replacement: 'Windows Live Mail'
323
+
285
324
  # Apple Air Mail
286
325
  - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'
287
326
 
288
327
  # Thunderbird
289
- - regex: '(Thunderbird)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
328
+ - regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre)?))?'
290
329
  family_replacement: 'Thunderbird'
291
330
 
331
+ # Postbox
332
+ - regex: '(Postbox)/(\d+)\.(\d+)\.(\d+)'
333
+ family_replacement: 'Postbox'
334
+
335
+ # Barca
336
+ - regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+))?'
337
+ family_replacement: 'Barca'
338
+
339
+ # Lotus Notes
340
+ - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+))?'
341
+ family_replacement: 'Lotus Notes'
342
+
292
343
  # Vivaldi uses "Vivaldi"
293
344
  - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
294
345
 
295
346
  # Edge/major_version.minor_version
296
347
  - regex: '(Edge)/(\d+)\.(\d+)'
297
348
 
298
- # Chrome/Chromium/major_version.minor_version.beta_version
299
- - regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)'
349
+ # Brave Browser https://brave.com/
350
+ - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
351
+ family_replacement: 'Brave'
352
+
353
+ # Iron Browser ~since version 50
354
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
355
+ family_replacement: 'Iron'
300
356
 
301
357
  # Dolphin Browser
302
358
  # @ref: http://www.dolphin.com
303
359
  - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)\.?(\d+)?'
304
360
 
361
+ # Headless Chrome
362
+ # https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
363
+ # Currently only available on Linux
364
+ - regex: 'HeadlessChrome'
365
+ family_replacement: 'HeadlessChrome'
366
+
305
367
  # Browser/major_version.minor_version
306
- - 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|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin)/(\d+)\.(\d+)\.?(\d+)?'
368
+ - regex: '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|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|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+))?'
307
369
 
308
370
  # Chrome/Chromium/major_version.minor_version
309
- - regex: '(Chromium|Chrome)/(\d+)\.(\d+)'
371
+ - regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+))?'
310
372
 
311
373
  ##########
312
374
  # IE Mobile needs to happen before Android to catch cases such as:
@@ -320,10 +382,13 @@ user_agent_parsers:
320
382
  - regex: '(IEMobile)[ /](\d+)\.(\d+)'
321
383
  family_replacement: 'IE Mobile'
322
384
 
385
+ # Baca Berita App News Reader
386
+ - regex: '(BacaBerita App)\/(\d+)\.(\d+)\.(\d+)'
387
+
323
388
  # Browser major_version.minor_version.beta_version (space instead of slash)
324
389
  - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
325
390
  # Browser major_version.minor_version (space instead of slash)
326
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\d+)\.(\d+)\.?(\d+)?'
391
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)\.?(\d+)?'
327
392
 
328
393
  # Kindle WebKit
329
394
  - regex: '(Kindle)/(\d+)\.(\d+)'
@@ -353,6 +418,10 @@ user_agent_parsers:
353
418
  - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
354
419
  family_replacement: 'IE Large Screen'
355
420
 
421
+ # Slack desktop client (needs to be before Apple Mail as it gets wrongly detected on Mac OS otherwise)
422
+ - regex: '(Slack_SSB)/(\d+)\.(\d+)\.(\d+)'
423
+ family_replacement: 'Slack Desktop Client'
424
+
356
425
  #### END MAIN CASES ####
357
426
 
358
427
  #### SPECIAL CASES ####
@@ -381,22 +450,18 @@ user_agent_parsers:
381
450
  family_replacement: 'Bon Echo'
382
451
 
383
452
  # @note: iOS / OSX Applications
384
- - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'
385
- family_replacement: 'Mobile Safari'
386
- - regex: '(iPod).*Version/(\d+)\.(\d+)'
387
- family_replacement: 'Mobile Safari'
388
- - regex: '(iPhone).*Version/(\d+)\.(\d+)\.(\d+)'
453
+ - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))?.*[ +]Safari'
389
454
  family_replacement: 'Mobile Safari'
390
- - regex: '(iPhone).*Version/(\d+)\.(\d+)'
455
+ - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))?'
456
+ family_replacement: 'Mobile Safari UI/WKWebView'
457
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))?.*Mobile.*[ +]Safari'
391
458
  family_replacement: 'Mobile Safari'
392
- - regex: '(iPad).*Version/(\d+)\.(\d+)\.(\d+)'
393
- family_replacement: 'Mobile Safari'
394
- - regex: '(iPad).*Version/(\d+)\.(\d+)'
395
- family_replacement: 'Mobile Safari'
396
- - regex: '(iPod|iPhone|iPad);.*CPU.*OS (\d+)_(\d+)(?:_(\d+))?.*Mobile'
459
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))?.*Mobile'
460
+ family_replacement: 'Mobile Safari UI/WKWebView'
461
+ - regex: '(iPod|iPhone|iPad).* Safari'
397
462
  family_replacement: 'Mobile Safari'
398
463
  - regex: '(iPod|iPhone|iPad)'
399
- family_replacement: 'Mobile Safari'
464
+ family_replacement: 'Mobile Safari UI/WKWebView'
400
465
 
401
466
  - regex: '(AvantGo) (\d+).(\d+)'
402
467
 
@@ -437,11 +502,9 @@ user_agent_parsers:
437
502
  - regex: '(Nokia)[EN]?(\d+)'
438
503
 
439
504
  # BlackBerry devices
440
- - regex: '(BB10);'
441
- family_replacement: 'BlackBerry WebKit'
442
505
  - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
443
506
  family_replacement: 'BlackBerry WebKit'
444
- - regex: '(Black[bB]erry).+Version/(\d+)\.(\d+)\.(\d+)'
507
+ - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
445
508
  family_replacement: 'BlackBerry WebKit'
446
509
  - regex: '(Black[bB]erry)\s?(\d+)'
447
510
  family_replacement: 'BlackBerry'
@@ -500,7 +563,7 @@ user_agent_parsers:
500
563
 
501
564
  # apple mail - not directly detectable, have it after Safari stuff
502
565
  - regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'
503
- family_replacement: 'AppleMail'
566
+ family_replacement: 'Apple Mail'
504
567
 
505
568
  # AFTER THE EDGE CASES ABOVE!
506
569
  # AFTER IE11
@@ -514,8 +577,19 @@ user_agent_parsers:
514
577
  - regex: '(python-requests)/(\d+)\.(\d+)'
515
578
  family_replacement: 'Python Requests'
516
579
 
580
+ # headless user-agents
581
+ - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|Wget|OpenBSD ftp|jupdate)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
582
+
517
583
  - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+)*'
518
584
 
585
+ # Roku Digital-Video-Players https://www.roku.com/
586
+ - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
587
+
588
+ # Kurio App News Reader https://kurio.co.id/
589
+ - regex: '(Kurio)\/(\d+)\.(\d+)\.(\d+)'
590
+ family_replacement: 'Kurio App'
591
+
592
+
519
593
  os_parsers:
520
594
  ##########
521
595
  # HbbTV vendors
@@ -585,6 +659,10 @@ os_parsers:
585
659
 
586
660
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
587
661
 
662
+ # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
663
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))?.*Outlook-iOS-Android'
664
+ os_replacement: 'iOS'
665
+
588
666
  ##########
589
667
  # Android
590
668
  # can actually detect rooted android os. do we care?
@@ -613,7 +691,7 @@ os_parsers:
613
691
  # UCWEB
614
692
  - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?;'
615
693
  os_replacement: 'Android'
616
- - regex: '^UCWEB.*; (iPad OS|iPh OS) (\d+)_(\d+)(?:_(\d+))?;'
694
+ - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+))?;'
617
695
  os_replacement: 'iOS'
618
696
  - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))?;'
619
697
  os_replacement: 'Windows Phone'
@@ -696,14 +774,14 @@ os_parsers:
696
774
  # Tizen OS from Samsung
697
775
  # spoofs Android so pushing it above
698
776
  ##########
699
- - regex: '(Tizen)/(\d+)\.(\d+)'
777
+ - regex: '(Tizen)[/ ](\d+)\.(\d+)'
700
778
 
701
779
  ##########
702
780
  # Mac OS
703
781
  # @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
704
782
  # @ref: http://www.puredarwin.org/curious/versions
705
783
  ##########
706
- - regex: '((?:Mac ?|; )OS X)[\s/](?:(\d+)[_.](\d+)(?:[_.](\d+))?|Mach-O)'
784
+ - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+))?|Mach-O)'
707
785
  os_replacement: 'Mac OS X'
708
786
  # Leopard
709
787
  - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
@@ -750,7 +828,7 @@ os_parsers:
750
828
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+))?'
751
829
  os_replacement: 'ATV OS X'
752
830
 
753
- - regex: '(CPU OS|iPhone OS|CPU iPhone) +(\d+)[_\.](\d+)(?:[_\.](\d+))?'
831
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))?'
754
832
  os_replacement: 'iOS'
755
833
 
756
834
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -797,11 +875,30 @@ os_parsers:
797
875
  os_replacement: 'Mac OS X'
798
876
  os_v1_replacement: '10'
799
877
  os_v2_replacement: '10'
878
+ - regex: '(CF)(Network)/(760)\.(\d)'
879
+ os_replacement: 'Mac OS X'
880
+ os_v1_replacement: '10'
881
+ os_v2_replacement: '11'
800
882
  - regex: '(CF)(Network)/758\.(\d)'
801
883
  os_replacement: 'iOS'
802
884
  os_v1_replacement: '9'
885
+ - regex: '(CF)(Network)/808\.(\d)'
886
+ os_replacement: 'iOS'
887
+ os_v1_replacement: '10'
803
888
 
804
889
  ##########
890
+ # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
891
+ # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
892
+ ##########
893
+ - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
894
+ os_replacement: 'Mac OS X'
895
+ os_v1_replacement: '10'
896
+ os_v2_replacement: '12'
897
+ - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
898
+ os_replacement: 'Mac OS X'
899
+ os_v1_replacement: '10'
900
+ os_v2_replacement: '11'
901
+ ##########
805
902
  # CFNetwork iOS Apps
806
903
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
807
904
  ##########
@@ -828,9 +925,19 @@ os_parsers:
828
925
  os_replacement: 'iOS'
829
926
  os_v1_replacement: '9'
830
927
  os_v2_replacement: '0'
928
+ - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
929
+ os_replacement: 'iOS'
930
+ os_v1_replacement: '10'
831
931
  # iOS Apps
832
- - regex: '\b(iOS[ /]|iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?'
932
+ - regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?'
833
933
  os_replacement: 'iOS'
934
+ - regex: '\((iOS);'
935
+
936
+ ##########
937
+ # Apple TV
938
+ ##########
939
+ - regex: '(tvOS)/(\d+).(\d+)'
940
+ os_replacement: 'tvOS'
834
941
 
835
942
  ##########
836
943
  # Chrome OS
@@ -949,6 +1056,12 @@ os_parsers:
949
1056
 
950
1057
  - regex: '(WebTV)/(\d+).(\d+)'
951
1058
 
1059
+ ##########
1060
+ # Chromecast
1061
+ ##########
1062
+ - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+))?)?'
1063
+ os_replacement: 'Chromecast'
1064
+
952
1065
  ##########
953
1066
  # Misc mobile
954
1067
  ##########
@@ -970,20 +1083,23 @@ os_parsers:
970
1083
  - regex: '\((Bada);'
971
1084
 
972
1085
  # just os
973
- - regex: '(Windows|Android|WeTab|Maemo)'
974
- - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Gentoo|Mageia|(?:Free|Open|Net|\b)BSD)'
1086
+ - regex: '(Windows|Android|WeTab|Maemo|Web0S)'
1087
+ - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
975
1088
  # Linux + Kernel Version
976
1089
  - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))?)?'
977
1090
  - regex: 'SunOS'
978
1091
  os_replacement: 'Solaris'
979
1092
 
1093
+ # Roku Digital-Video-Players https://www.roku.com/
1094
+ - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
1095
+
980
1096
  device_parsers:
981
1097
 
982
1098
  #########
983
1099
  # Mobile Spiders
984
1100
  # Catch the mobile crawler before checking for iPhones / Androids.
985
1101
  #########
986
- - regex: '(?:(?:iPhone|Windows CE|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1102
+ - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
987
1103
  regex_flag: 'i'
988
1104
  device_replacement: 'Spider'
989
1105
  brand_replacement: 'Spider'
@@ -1877,6 +1993,10 @@ device_parsers:
1877
1993
  device_replacement: '$1'
1878
1994
  brand_replacement: 'Google'
1879
1995
  model_replacement: '$1'
1996
+ - regex: '; *(Pixel \w+) Build'
1997
+ device_replacement: '$1'
1998
+ brand_replacement: 'Google'
1999
+ model_replacement: '$1'
1880
2000
 
1881
2001
  #########
1882
2002
  # Gigabyte
@@ -2029,7 +2149,7 @@ device_parsers:
2029
2149
  device_replacement: '$1'
2030
2150
  brand_replacement: 'Huawei'
2031
2151
  model_replacement: '$1'
2032
- - regex: '; *([^;]+) Build/Huawei'
2152
+ - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2033
2153
  device_replacement: '$1'
2034
2154
  brand_replacement: 'Huawei'
2035
2155
  model_replacement: '$1'
@@ -2045,7 +2165,7 @@ device_parsers:
2045
2165
  device_replacement: 'Huawei Ideos$1'
2046
2166
  brand_replacement: 'Huawei'
2047
2167
  model_replacement: 'Ideos$1'
2048
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660) Build'
2168
+ - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
2049
2169
  device_replacement: 'Huawei $1'
2050
2170
  brand_replacement: 'Huawei'
2051
2171
  model_replacement: '$1'
@@ -2567,7 +2687,7 @@ device_parsers:
2567
2687
  # LG
2568
2688
  # @ref: http://www.lg.com/uk/mobile
2569
2689
  #########
2570
- - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus [45]|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
2690
+ - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
2571
2691
  device_replacement: '$1'
2572
2692
  brand_replacement: 'LG'
2573
2693
  model_replacement: '$1'
@@ -2587,6 +2707,10 @@ device_parsers:
2587
2707
  device_replacement: '$1 $2'
2588
2708
  brand_replacement: 'LG'
2589
2709
  model_replacement: '$2'
2710
+ - regex: '(Web0S); Linux/(SmartTV)'
2711
+ device_replacement: 'LG $1 $2'
2712
+ brand_replacement: 'LG'
2713
+ model_replacement: '$1 $2'
2590
2714
 
2591
2715
  #########
2592
2716
  # Malata
@@ -2959,6 +3083,19 @@ device_parsers:
2959
3083
  brand_replacement: 'Odys'
2960
3084
  model_replacement: '$1'
2961
3085
 
3086
+ #########
3087
+ # OnePlus
3088
+ # @ref https://oneplus.net/
3089
+ #########
3090
+ - regex: '; (ONE [a-zA-Z]\d+) Build/'
3091
+ device_replacement: 'OnePlus $1'
3092
+ brand_replacement: 'OnePlus'
3093
+ model_replacement: '$1'
3094
+ - regex: '; (ONEPLUS [a-zA-Z]\d+) Build/'
3095
+ device_replacement: 'OnePlus $1'
3096
+ brand_replacement: 'OnePlus'
3097
+ model_replacement: '$1'
3098
+
2962
3099
  #########
2963
3100
  # Orion
2964
3101
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
@@ -3199,6 +3336,15 @@ device_parsers:
3199
3336
  brand_replacement: 'Quanta'
3200
3337
  model_replacement: '$1'
3201
3338
 
3339
+ #########
3340
+ # RCA
3341
+ # @ref: http://rcamobilephone.com/
3342
+ #########
3343
+ - regex: '; (RCT\w+) Build/'
3344
+ device_replacement: '$1'
3345
+ brand_replacement: 'RCA'
3346
+ model_replacement: '$1'
3347
+
3202
3348
  #########
3203
3349
  # Rockchip
3204
3350
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
@@ -3837,7 +3983,7 @@ device_parsers:
3837
3983
  # XiaoMi
3838
3984
  # @ref: http://www.xiaomi.com/event/buyphone
3839
3985
  #########
3840
- - regex: '; *(MI \d[^;/]*|MI-ONE Plus) Build/'
3986
+ - regex: '; *((MI|HM|MI-ONE|Redmi)[ -](NOTE |Note )?[^;/]*) (Build|MIUI)/'
3841
3987
  device_replacement: 'XiaoMi $1'
3842
3988
  brand_replacement: 'XiaoMi'
3843
3989
  model_replacement: '$1'
@@ -4282,10 +4428,10 @@ device_parsers:
4282
4428
  # cannot determine specific device type from ua string. (3g, 3gs, 4, etc)
4283
4429
  ##########
4284
4430
  # @note: on some ua the device can be identified e.g. iPhone5,1
4285
- - regex: '((?:iPhone|iPad|iPod)\d+,\d+)'
4431
+ - regex: '(iPhone|iPad|iPod)(\d+,\d+)'
4286
4432
  device_replacement: '$1'
4287
4433
  brand_replacement: 'Apple'
4288
- model_replacement: '$1'
4434
+ model_replacement: '$1$2'
4289
4435
  # @note: iPad needs to be before iPhone
4290
4436
  - regex: '(iPad)(?:;| Simulator;)'
4291
4437
  device_replacement: '$1'
@@ -4304,6 +4450,12 @@ device_parsers:
4304
4450
  device_replacement: '$1$2,$3'
4305
4451
  brand_replacement: 'Apple'
4306
4452
  model_replacement: '$1$2,$3'
4453
+ # @note: newer desktop applications don't show device info
4454
+ # This is here so as to not have them recorded as iOS-Device
4455
+ - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
4456
+ device_replacement: 'Mac'
4457
+ brand_replacement: 'Apple'
4458
+ model_replacement: 'Mac'
4307
4459
  # @note: iOS applications do not show device info
4308
4460
  - regex: 'CFNetwork/.* Darwin/\d'
4309
4461
  device_replacement: 'iOS-Device'
@@ -4569,6 +4721,11 @@ device_parsers:
4569
4721
  ##########
4570
4722
  # Samsung
4571
4723
  ##########
4724
+ # Samsung Smart-TV
4725
+ - regex: '(SMART-TV); .* Tizen '
4726
+ device_replacement: 'Samsung $1'
4727
+ brand_replacement: 'Samsung'
4728
+ model_replacement: '$1'
4572
4729
  # Samsung Symbian Devices
4573
4730
  - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
4574
4731
  device_replacement: 'Samsung $1'
@@ -4659,27 +4816,27 @@ device_parsers:
4659
4816
  #########
4660
4817
  # Android General Device Matching (far from perfect)
4661
4818
  #########
4662
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+) Build'
4819
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+) Build[/ ]'
4663
4820
  brand_replacement: 'Generic_Android'
4664
4821
  model_replacement: '$1'
4665
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?) Build'
4822
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?) Build[/ ]'
4666
4823
  brand_replacement: 'Generic_Android'
4667
4824
  model_replacement: '$1'
4668
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?) Build'
4825
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?) Build[/ ]'
4669
4826
  brand_replacement: 'Generic_Android'
4670
4827
  model_replacement: '$1'
4671
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{0,2}\- *; *(.+?) Build'
4828
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{0,2}\- *; *(.+?) Build[/ ]'
4672
4829
  brand_replacement: 'Generic_Android'
4673
4830
  model_replacement: '$1'
4674
4831
  # No build info at all - "Build" follows locale immediately
4675
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};? Build'
4832
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};? Build[/ ]'
4676
4833
  device_replacement: 'Generic Smartphone'
4677
4834
  brand_replacement: 'Generic'
4678
4835
  model_replacement: 'Smartphone'
4679
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *\-?[A-Za-z]{2}; *(.+?) Build'
4836
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *\-?[A-Za-z]{2}; *(.+?) Build[/ ]'
4680
4837
  brand_replacement: 'Generic_Android'
4681
4838
  model_replacement: '$1'
4682
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}(?:;.*)?; *(.+?) Build'
4839
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}(?:;.*)?; *(.+?) Build[/ ]'
4683
4840
  brand_replacement: 'Generic_Android'
4684
4841
  model_replacement: '$1'
4685
4842
 
@@ -4696,6 +4853,10 @@ device_parsers:
4696
4853
  - regex: '(WebTV)/\d+.\d+'
4697
4854
  brand_replacement: 'Generic_Inettv'
4698
4855
  model_replacement: '$1'
4856
+ # Roku Digital-Video-Players https://www.roku.com/
4857
+ - regex: '^(Roku)/DVP-\d+\.\d+'
4858
+ brand_replacement: 'Generic_Inettv'
4859
+ model_replacement: '$1'
4699
4860
 
4700
4861
  ##########
4701
4862
  # Generic Tablet
@@ -4722,7 +4883,7 @@ device_parsers:
4722
4883
  ##########
4723
4884
  # Spiders (this is hack...)
4724
4885
  ##########
4725
- - regex: '(bot|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes)'
4886
+ - regex: '(bot|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan)'
4726
4887
  regex_flag: 'i'
4727
4888
  device_replacement: 'Spider'
4728
4889
  brand_replacement: 'Spider'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: user_agent_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Lucas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-07 00:00:00.000000000 Z
11
+ date: 2017-05-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple, comprehensive Ruby gem for parsing user agent strings with
14
14
  the help of BrowserScope's UA database
@@ -29,7 +29,7 @@ files:
29
29
  - lib/user_agent_parser/user_agent.rb
30
30
  - lib/user_agent_parser/version.rb
31
31
  - vendor/uap-core/regexes.yaml
32
- homepage: http://github.com/toolmantim/user_agent_parser
32
+ homepage: https://github.com/ua-parser/uap-ruby
33
33
  licenses:
34
34
  - MIT
35
35
  metadata: {}
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  version: '0'
50
50
  requirements: []
51
51
  rubyforge_project:
52
- rubygems_version: 2.4.5.1
52
+ rubygems_version: 2.6.10
53
53
  signing_key:
54
54
  specification_version: 4
55
55
  summary: A simple, comprehensive Ruby gem for parsing user agent strings with the