user_agent_parser 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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