user_agent_parser 2.5.1 → 2.5.2
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.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/vendor/uap-core/regexes.yaml +352 -222
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2108d04c3b134892dfe8b64a8d922b43cefce3234b97883229c2f94987231fe9
|
4
|
+
data.tar.gz: 21ae5ddc52e16c080c20dd7c573f0a0daa46602cdb36ad963f7c408a3122c46d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa1854eb92882b92b497775861a4c0063ad644d09f6294e0c629f88eb2bd8dd6e1442140076ed787b7d35f46f7f1c0f13a61df178a6db902b75a5184899166f0
|
7
|
+
data.tar.gz: 58235ccba086edc533135b48e49c8b9750c0582b94a87570c4b02878e0fddad9ae69e79218faa2df43aa78c06b66fec10eeb55e958f276bb09416b70b29b4243
|
data/MIT-LICENSE
CHANGED
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
17
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
19
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -7,9 +7,9 @@ user_agent_parsers:
|
|
7
7
|
family_replacement: 'AntennaPod'
|
8
8
|
- regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
|
9
9
|
- regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
|
10
|
-
- regex: '^(.*)-iPad
|
11
|
-
- regex: '^(.*)-iPhone/(\d+)
|
12
|
-
- regex: '^(.*)/(\d+)
|
10
|
+
- regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
|
11
|
+
- regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
|
12
|
+
- regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
|
13
13
|
|
14
14
|
# Podcast catchers
|
15
15
|
- regex: '(espn\.go)'
|
@@ -23,16 +23,23 @@ user_agent_parsers:
|
|
23
23
|
- regex: ' (Rivo) RHYTHM'
|
24
24
|
|
25
25
|
# @note: iOS / OSX Applications
|
26
|
-
- regex: '(CFNetwork)(?:/(\d+)\.(\d+)
|
26
|
+
- regex: '(CFNetwork)(?:/(\d+)\.(\d+)(?:\.(\d+)|)|)'
|
27
27
|
family_replacement: 'CFNetwork'
|
28
28
|
|
29
29
|
# Pingdom
|
30
|
-
- regex: '(Pingdom
|
30
|
+
- regex: '(Pingdom\.com_bot_version_)(\d+)\.(\d+)'
|
31
31
|
family_replacement: 'PingdomBot'
|
32
32
|
# 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
|
33
33
|
- regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
|
34
34
|
family_replacement: 'PingdomBot'
|
35
35
|
|
36
|
+
# PTST / WebPageTest.org crawlers
|
37
|
+
- regex: ' (PTST)/(\d+)(?:\.(\d+)|)$'
|
38
|
+
family_replacement: 'WebPageTest.org bot'
|
39
|
+
|
40
|
+
# Datanyze.com spider
|
41
|
+
- regex: 'X11; (Datanyze); Linux'
|
42
|
+
|
36
43
|
# New Relic Pinger
|
37
44
|
- regex: '(NewRelicPinger)/(\d+)\.(\d+)'
|
38
45
|
family_replacement: 'NewRelicPingerBot'
|
@@ -57,11 +64,11 @@ user_agent_parsers:
|
|
57
64
|
family_replacement: 'GooglePlusBot'
|
58
65
|
|
59
66
|
# Gmail
|
60
|
-
- regex: 'via ggpht
|
67
|
+
- regex: 'via ggpht\.com GoogleImageProxy'
|
61
68
|
family_replacement: 'GmailImageProxy'
|
62
69
|
|
63
70
|
# Yahoo
|
64
|
-
- regex: 'YahooMailProxy; https://help
|
71
|
+
- regex: 'YahooMailProxy; https://help\.yahoo\.com/kb/yahoo-mail-proxy-SLN28749\.html'
|
65
72
|
family_replacement: 'YahooMailProxy'
|
66
73
|
|
67
74
|
# Twitter
|
@@ -69,37 +76,49 @@ user_agent_parsers:
|
|
69
76
|
family_replacement: 'TwitterBot'
|
70
77
|
|
71
78
|
# Bots Pattern '/name-0.0'
|
72
|
-
- regex: '/((?:Ant
|
79
|
+
- regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
73
80
|
# Bots Pattern 'name/0.0'
|
74
|
-
- 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+))
|
81
|
+
- 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+)|)'
|
75
82
|
|
76
83
|
# MSIECrawler
|
77
|
-
- regex: '(MSIE) (\d+)\.(\d+)([a-z]\d
|
84
|
+
- regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
|
78
85
|
family_replacement: 'MSIECrawler'
|
79
86
|
|
80
87
|
# DAVdroid
|
81
|
-
- regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+))
|
88
|
+
- regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
82
89
|
|
83
90
|
# Downloader ...
|
84
|
-
- regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))
|
91
|
+
- regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
85
92
|
|
86
93
|
# Pinterestbot
|
87
|
-
- regex: '(Pinterest(?:bot)
|
94
|
+
- regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
|
88
95
|
family_replacement: 'Pinterestbot'
|
89
96
|
|
90
97
|
# Bots
|
91
|
-
- regex: '(1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]
|
98
|
+
- regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|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]{1,30}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 .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
|
92
99
|
|
93
100
|
# AWS S3 Clients
|
94
101
|
# must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
|
95
|
-
- regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+))
|
102
|
+
- regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
103
|
+
|
104
|
+
# Facebook
|
105
|
+
# Must come before "Bots General matcher" to catch OrangeBotswana
|
106
|
+
# Facebook Messenger must go before Facebook
|
107
|
+
- regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
108
|
+
family_replacement: 'Facebook Messenger'
|
109
|
+
# Facebook
|
110
|
+
- regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
111
|
+
family_replacement: 'Facebook'
|
112
|
+
# Sometimes Facebook does not specify a version (FBAV)
|
113
|
+
- regex: '\[FB.*;'
|
114
|
+
family_replacement: 'Facebook'
|
96
115
|
|
97
116
|
# Bots General matcher 'name/0.0'
|
98
|
-
- regex: '(?:\/[A-Za-z0-9\.]
|
99
|
-
# Bots
|
100
|
-
- regex: '(
|
101
|
-
# Bots containing spider|scrape|
|
102
|
-
- regex: '((?:[A-z0-9]
|
117
|
+
- regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
118
|
+
# Bots containing bot(but not CUBOT)
|
119
|
+
- regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
120
|
+
# Bots containing spider|scrape|Crawl
|
121
|
+
- regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
103
122
|
|
104
123
|
# HbbTV standard defines what features the browser should understand.
|
105
124
|
# but it's like targeting "HTML5 browsers", effective browser support depends on the model
|
@@ -107,30 +126,33 @@ user_agent_parsers:
|
|
107
126
|
- regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \('
|
108
127
|
|
109
128
|
# must go before Firefox to catch Chimera/SeaMonkey/Camino/Waterfox
|
110
|
-
- regex: '(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]
|
129
|
+
- regex: '(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*|)'
|
111
130
|
|
112
|
-
#
|
113
|
-
|
114
|
-
|
115
|
-
|
131
|
+
# must be before Firefox / Gecko to catch SailfishBrowser properly
|
132
|
+
- regex: '(SailfishBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
133
|
+
family_replacement: 'Sailfish Browser'
|
134
|
+
|
135
|
+
# Social Networks (non-Facebook)
|
116
136
|
# Pinterest
|
117
137
|
- regex: '\[(Pinterest)/[^\]]+\]'
|
118
|
-
- regex: '(Pinterest)(?: for Android(?: Tablet)
|
138
|
+
- regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
119
139
|
# Instagram app
|
120
140
|
- regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
|
121
|
-
#
|
141
|
+
# Flipboard app
|
122
142
|
- regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
|
123
|
-
#
|
143
|
+
# Flipboard-briefing app
|
124
144
|
- regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
|
125
145
|
# Onefootball app
|
126
146
|
- regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
|
147
|
+
# Snapchat
|
148
|
+
- regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
127
149
|
|
128
150
|
# Basilisk
|
129
151
|
- regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
|
130
152
|
family_replacement: 'Basilisk'
|
131
153
|
|
132
154
|
# Pale Moon
|
133
|
-
- regex: '(PaleMoon)/(\d+)\.(\d+)
|
155
|
+
- regex: '(PaleMoon)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
134
156
|
family_replacement: 'Pale Moon'
|
135
157
|
|
136
158
|
# Firefox
|
@@ -142,22 +164,22 @@ user_agent_parsers:
|
|
142
164
|
family_replacement: 'Firefox Mobile'
|
143
165
|
- regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
|
144
166
|
family_replacement: 'Firefox Mobile'
|
145
|
-
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)
|
167
|
+
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
|
146
168
|
family_replacement: 'Firefox ($1)'
|
147
169
|
- regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
|
148
170
|
family_replacement: 'Firefox Alpha'
|
149
171
|
- regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
|
150
172
|
family_replacement: 'Firefox Beta'
|
151
|
-
- regex: '(Firefox)-(?:\d+\.\d
|
173
|
+
- regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(a\d+[a-z]*)'
|
152
174
|
family_replacement: 'Firefox Alpha'
|
153
|
-
- regex: '(Firefox)-(?:\d+\.\d
|
175
|
+
- regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(b\d+[a-z]*)'
|
154
176
|
family_replacement: 'Firefox Beta'
|
155
|
-
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]
|
177
|
+
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
|
156
178
|
family_replacement: 'Firefox ($1)'
|
157
179
|
- regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
|
158
180
|
family_replacement: 'MicroB'
|
159
|
-
- regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]
|
160
|
-
- regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+))
|
181
|
+
- regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
|
182
|
+
- regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
|
161
183
|
family_replacement: 'Firefox iOS'
|
162
184
|
|
163
185
|
# e.g.: Flock/2.0b2
|
@@ -173,7 +195,7 @@ user_agent_parsers:
|
|
173
195
|
- regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
|
174
196
|
family_replacement: 'Netscape'
|
175
197
|
|
176
|
-
- regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d
|
198
|
+
- regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+|)'
|
177
199
|
family_replacement: 'Netscape'
|
178
200
|
|
179
201
|
- regex: '(MyIBrow)/(\d+)\.(\d+)'
|
@@ -186,8 +208,8 @@ user_agent_parsers:
|
|
186
208
|
|
187
209
|
# Opera will stop at 9.80 and hide the real version in the Version string.
|
188
210
|
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
|
189
|
-
- regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))
|
190
|
-
- regex: '(Opera Mini)(?:/att)
|
211
|
+
- regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
|
212
|
+
- regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
|
191
213
|
- regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
|
192
214
|
family_replacement: 'Opera Mobile'
|
193
215
|
- regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
|
@@ -196,7 +218,7 @@ user_agent_parsers:
|
|
196
218
|
family_replacement: 'Opera Mobile'
|
197
219
|
- regex: 'Opera Mobi'
|
198
220
|
family_replacement: 'Opera Mobile'
|
199
|
-
- regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))
|
221
|
+
- regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
|
200
222
|
|
201
223
|
# Opera 14 for Android uses a WebKit render engine.
|
202
224
|
- regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
|
@@ -219,7 +241,7 @@ user_agent_parsers:
|
|
219
241
|
family_replacement: 'Opera Neon'
|
220
242
|
|
221
243
|
# Palm WebOS looks a lot like Safari.
|
222
|
-
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))
|
244
|
+
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
|
223
245
|
family_replacement: 'webOS Browser'
|
224
246
|
|
225
247
|
# LuaKit has no version info.
|
@@ -235,20 +257,20 @@ user_agent_parsers:
|
|
235
257
|
- regex: 'Gecko/\d+ (Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
|
236
258
|
|
237
259
|
# Swiftfox
|
238
|
-
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)
|
260
|
+
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre|)) \(Swiftfox\)'
|
239
261
|
family_replacement: 'Swiftfox'
|
240
|
-
- regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]
|
262
|
+
- regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*|) \(Swiftfox\)'
|
241
263
|
family_replacement: 'Swiftfox'
|
242
264
|
|
243
265
|
# Rekonq
|
244
|
-
- regex: '(rekonq)/(\d+)\.(\d+)
|
266
|
+
- regex: '(rekonq)/(\d+)\.(\d+)(?:\.(\d+)|) Safari'
|
245
267
|
family_replacement: 'Rekonq'
|
246
268
|
- regex: 'rekonq'
|
247
269
|
family_replacement: 'Rekonq'
|
248
270
|
|
249
271
|
# Conkeror lowercase/uppercase
|
250
272
|
# http://conkeror.org/
|
251
|
-
- regex: '(conkeror|Conkeror)/(\d+)\.(\d+)
|
273
|
+
- regex: '(conkeror|Conkeror)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
252
274
|
family_replacement: 'Conkeror'
|
253
275
|
|
254
276
|
# catches lower case konqueror
|
@@ -277,11 +299,11 @@ user_agent_parsers:
|
|
277
299
|
family_replacement: 'NetFront NX'
|
278
300
|
|
279
301
|
# Amazon Silk, should go before Safari and Chrome Mobile
|
280
|
-
- regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))
|
302
|
+
- regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)'
|
281
303
|
family_replacement: 'Amazon Silk'
|
282
304
|
|
283
305
|
# @ref: http://www.puffinbrowser.com
|
284
|
-
- regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))
|
306
|
+
- regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
285
307
|
|
286
308
|
# Edge Mobile
|
287
309
|
- regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
|
@@ -292,26 +314,43 @@ user_agent_parsers:
|
|
292
314
|
family_replacement: 'Samsung Internet'
|
293
315
|
|
294
316
|
# Seznam.cz browser (based on WebKit)
|
295
|
-
- regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+))
|
317
|
+
- regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
296
318
|
family_replacement: 'Seznam prohlížeč'
|
297
319
|
|
298
320
|
# Coc Coc browser, based on Chrome (used in Vietnam)
|
299
|
-
- regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+))
|
321
|
+
- regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
300
322
|
family_replacement: 'Coc Coc'
|
301
323
|
|
302
324
|
# Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
|
303
|
-
- regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)(?:\.(\d+))
|
325
|
+
- regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
304
326
|
family_replacement: 'Baidu Browser'
|
305
327
|
- regex: '(FlyFlow)/(\d+)\.(\d+)'
|
306
328
|
family_replacement: 'Baidu Explorer'
|
307
329
|
|
308
330
|
# MxBrowser is Maxthon. Must go before Mobile Chrome for Android
|
309
|
-
- regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+))
|
331
|
+
- regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
310
332
|
family_replacement: 'Maxthon'
|
311
333
|
|
312
334
|
# Crosswalk must go before Mobile Chrome for Android
|
313
335
|
- regex: '(Crosswalk)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
314
336
|
|
337
|
+
# LINE https://line.me/en/
|
338
|
+
# Must go before Mobile Chrome for Android
|
339
|
+
- regex: '(Line)/(\d+)\.(\d+)\.(\d+)'
|
340
|
+
family_replacement: 'LINE'
|
341
|
+
|
342
|
+
# MiuiBrowser should got before Mobile Chrome for Android
|
343
|
+
- regex: '(MiuiBrowser)/(\d+)\.(\d+)\.(\d+)'
|
344
|
+
family_replacement: 'MiuiBrowser'
|
345
|
+
|
346
|
+
# Mint Browser should got before Mobile Chrome for Android
|
347
|
+
- regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
|
348
|
+
family_replacement: 'Mint Browser'
|
349
|
+
|
350
|
+
# Google Search App on Android, eg:
|
351
|
+
- regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
|
352
|
+
family_replacement: 'Google'
|
353
|
+
|
315
354
|
# Chrome Mobile
|
316
355
|
- regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
317
356
|
family_replacement: 'Chrome Mobile WebView'
|
@@ -339,11 +378,11 @@ user_agent_parsers:
|
|
339
378
|
family_replacement: 'Sogou Explorer'
|
340
379
|
|
341
380
|
# QQ Browsers
|
342
|
-
- regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))
|
381
|
+
- regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
343
382
|
family_replacement: 'QQ Browser Mini'
|
344
|
-
- regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))
|
383
|
+
- regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
345
384
|
family_replacement: 'QQ Browser Mobile'
|
346
|
-
- regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))
|
385
|
+
- regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
|
347
386
|
family_replacement: 'QQ Browser'
|
348
387
|
|
349
388
|
# Rackspace Monitoring
|
@@ -365,7 +404,7 @@ user_agent_parsers:
|
|
365
404
|
- regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
|
366
405
|
|
367
406
|
# Podcast catcher Applications using iTunes
|
368
|
-
- regex: '(PodCruncher|Downcast)[ /]?(\d+)
|
407
|
+
- regex: '(PodCruncher|Downcast)[ /]?(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
|
369
408
|
|
370
409
|
# Box Notes https://www.box.com/resources/downloads
|
371
410
|
# Must be before Electron
|
@@ -378,6 +417,10 @@ user_agent_parsers:
|
|
378
417
|
- regex: '(Whale)/(\d+)\.(\d+)\.(\d+)'
|
379
418
|
family_replacement: 'Whale'
|
380
419
|
|
420
|
+
# Ghost
|
421
|
+
# @ref: http://www.ghost.org
|
422
|
+
- regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
|
423
|
+
|
381
424
|
#### END SPECIAL CASES TOP ####
|
382
425
|
|
383
426
|
#### MAIN CASES - this catches > 50% of all browsers ####
|
@@ -389,7 +432,7 @@ user_agent_parsers:
|
|
389
432
|
|
390
433
|
# HipChat provides a version on Mac, but not on Windows.
|
391
434
|
# Needs to be before Chrome on Windows, and AppleMail on Mac.
|
392
|
-
- regex: '(HipChat)/?(\d
|
435
|
+
- regex: '(HipChat)/?(\d+|)'
|
393
436
|
family_replacement: 'HipChat Desktop Client'
|
394
437
|
|
395
438
|
# Browser/major_version.minor_version.beta_version
|
@@ -415,15 +458,18 @@ user_agent_parsers:
|
|
415
458
|
family_replacement: 'Outlook'
|
416
459
|
v1_replacement: '2016'
|
417
460
|
|
461
|
+
# Word 2014
|
462
|
+
- regex: 'Microsoft Office (Word) 2014'
|
463
|
+
|
418
464
|
# Windows Live Mail
|
419
465
|
- regex: 'Outlook-Express\/7\.0.*'
|
420
466
|
family_replacement: 'Windows Live Mail'
|
421
467
|
|
422
468
|
# Apple Air Mail
|
423
|
-
- regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))
|
469
|
+
- regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+)|)'
|
424
470
|
|
425
471
|
# Thunderbird
|
426
|
-
- regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre)
|
472
|
+
- regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre|))|)'
|
427
473
|
family_replacement: 'Thunderbird'
|
428
474
|
|
429
475
|
# Postbox
|
@@ -431,18 +477,20 @@ user_agent_parsers:
|
|
431
477
|
family_replacement: 'Postbox'
|
432
478
|
|
433
479
|
# Barca
|
434
|
-
- regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+))
|
480
|
+
- regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
435
481
|
family_replacement: 'Barca'
|
436
482
|
|
437
483
|
# Lotus Notes
|
438
|
-
- regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+))
|
484
|
+
- regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
439
485
|
family_replacement: 'Lotus Notes'
|
440
486
|
|
441
487
|
# Vivaldi uses "Vivaldi"
|
442
488
|
- regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
|
443
489
|
|
444
490
|
# Edge/major_version.minor_version
|
445
|
-
|
491
|
+
# Edge with chromium Edg/major_version.minor_version.patch.minor_patch
|
492
|
+
- regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
|
493
|
+
family_replacement: 'Edge'
|
446
494
|
|
447
495
|
# Brave Browser https://brave.com/
|
448
496
|
- regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
|
@@ -454,23 +502,23 @@ user_agent_parsers:
|
|
454
502
|
|
455
503
|
# Dolphin Browser
|
456
504
|
# @ref: http://www.dolphin.com
|
457
|
-
- regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)
|
505
|
+
- regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)(?:\.(\d+)|)'
|
458
506
|
|
459
507
|
# Headless Chrome
|
460
508
|
# https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
|
461
|
-
- regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+))
|
509
|
+
- regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+)|)'
|
462
510
|
|
463
511
|
# Evolution Mail CardDav/CalDav integration
|
464
512
|
- regex: '(Evolution)/(\d+)\.(\d+)\.(\d+\.\d+)'
|
465
513
|
|
466
514
|
# Roundcube Mail CardDav plugin
|
467
|
-
- regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev)
|
515
|
+
- regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev|))'
|
468
516
|
|
469
517
|
# Browser/major_version.minor_version
|
470
|
-
- 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+))
|
518
|
+
- 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+)|)'
|
471
519
|
|
472
520
|
# Chrome/Chromium/major_version.minor_version
|
473
|
-
- regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+))
|
521
|
+
- regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
474
522
|
|
475
523
|
##########
|
476
524
|
# IE Mobile needs to happen before Android to catch cases such as:
|
@@ -490,8 +538,8 @@ user_agent_parsers:
|
|
490
538
|
# Podcast catchers
|
491
539
|
- regex: '^(bPod|Pocket Casts|Player FM)$'
|
492
540
|
- regex: '^(AlexaMediaPlayer|VLC)/(\d+)\.(\d+)\.([^.\s]+)'
|
493
|
-
- regex: '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)
|
494
|
-
- regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]
|
541
|
+
- regex: '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
542
|
+
- regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
495
543
|
- regex: '^(bPod|Player FM) BMID/(\S+)'
|
496
544
|
- regex: '^(Podcast ?Addict)/v(\d+) '
|
497
545
|
- regex: '^(Podcast ?Addict) '
|
@@ -501,8 +549,8 @@ user_agent_parsers:
|
|
501
549
|
- regex: '(CITA) RSS Aggregator/(\d+)\.(\d+)'
|
502
550
|
- regex: '(Pocket Casts)$'
|
503
551
|
- regex: '(Player FM)$'
|
504
|
-
- regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\d+)\.(\d+)\.?([^.\s]
|
505
|
-
- regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]
|
552
|
+
- regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
|
553
|
+
- regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
|
506
554
|
- regex: '(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)'
|
507
555
|
- regex: '(QuickTime)\.(\d+)\.(\d+)\.(\d+)'
|
508
556
|
- regex: '(Kinoma)(\d+)'
|
@@ -510,35 +558,35 @@ user_agent_parsers:
|
|
510
558
|
family_replacement: 'FancyMusic'
|
511
559
|
- regex: 'EspnDownloadManager'
|
512
560
|
family_replacement: 'ESPN'
|
513
|
-
- regex: '(ESPN) Radio (\d+)\.(\d+)
|
514
|
-
- regex: '(podracer|jPodder) v ?(\d+)\.(\d+)
|
561
|
+
- regex: '(ESPN) Radio (\d+)\.(\d+)(?:\.(\d+)|) ?(?:rv:(\d+)|) '
|
562
|
+
- regex: '(podracer|jPodder) v ?(\d+)\.(\d+)(?:\.(\d+)|)'
|
515
563
|
- regex: '(ZDM)/(\d+)\.(\d+)[; ]?'
|
516
|
-
- regex: '(Zune|BeyondPod) (\d+)
|
564
|
+
- regex: '(Zune|BeyondPod) (\d+)(?:\.(\d+)|)[\);]'
|
517
565
|
- regex: '(WMPlayer)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
518
566
|
- regex: '^(Lavf)'
|
519
567
|
family_replacement: 'WMPlayer'
|
520
|
-
- regex: '^(RSSRadio)[ /]?(\d
|
568
|
+
- regex: '^(RSSRadio)[ /]?(\d+|)'
|
521
569
|
- regex: '(RSS_Radio) (\d+)\.(\d+)'
|
522
570
|
family_replacement: 'RSSRadio'
|
523
571
|
- regex: '(Podkicker) \S+/(\d+)\.(\d+)\.(\d+)'
|
524
572
|
family_replacement: 'Podkicker'
|
525
|
-
- regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)
|
573
|
+
- regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
|
526
574
|
- regex: '^(Stitcher)/iOS'
|
527
575
|
- regex: '^(Stitcher)/Android'
|
528
576
|
- regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
|
529
577
|
- regex: ' (VLC) for'
|
530
578
|
- regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
|
531
579
|
family_replacement: 'VLC'
|
532
|
-
- regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]
|
533
|
-
- regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]
|
534
|
-
- regex: '(amarok)/([^.\s]+)\.([^.\s]
|
580
|
+
- regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
581
|
+
- regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
582
|
+
- regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
|
535
583
|
family_replacement: 'Amarok'
|
536
584
|
- regex: '(Custom)-Feed Reader'
|
537
585
|
|
538
586
|
# Browser major_version.minor_version.beta_version (space instead of slash)
|
539
587
|
- regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
|
540
588
|
# Browser major_version.minor_version (space instead of slash)
|
541
|
-
- regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)
|
589
|
+
- regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)'
|
542
590
|
|
543
591
|
# Kindle WebKit
|
544
592
|
- regex: '(Kindle)/(\d+)\.(\d+)'
|
@@ -578,12 +626,16 @@ user_agent_parsers:
|
|
578
626
|
- regex: '(ownCloud-android)/(\d+)\.(\d+)\.(\d+)'
|
579
627
|
family_replacement: 'Owncloud'
|
580
628
|
|
629
|
+
# Skype for Business
|
630
|
+
- regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
|
631
|
+
family_replacement: 'Skype'
|
632
|
+
|
581
633
|
#### END MAIN CASES ####
|
582
634
|
|
583
635
|
#### SPECIAL CASES ####
|
584
636
|
- regex: '(Obigo)InternetBrowser'
|
585
637
|
- regex: '(Obigo)\-Browser'
|
586
|
-
- regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))
|
638
|
+
- regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+)|)'
|
587
639
|
family_replacement: 'Obigo'
|
588
640
|
|
589
641
|
- regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
|
@@ -602,24 +654,28 @@ user_agent_parsers:
|
|
602
654
|
- regex: '(Embider)/(\d+)\.(\d+)'
|
603
655
|
family_replacement: 'Polaris'
|
604
656
|
|
605
|
-
- regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d
|
657
|
+
- regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
|
606
658
|
family_replacement: 'Bon Echo'
|
607
659
|
|
608
660
|
# @note: iOS / OSX Applications
|
609
|
-
- regex: '(iPod|iPhone|iPad).+
|
661
|
+
- regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
|
662
|
+
family_replacement: 'Google'
|
663
|
+
- regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
|
610
664
|
family_replacement: 'Mobile Safari'
|
611
|
-
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))
|
665
|
+
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
|
612
666
|
family_replacement: 'Mobile Safari UI/WKWebView'
|
613
|
-
- regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))
|
667
|
+
- regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
|
614
668
|
family_replacement: 'Mobile Safari UI/WKWebView'
|
615
|
-
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))
|
669
|
+
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari'
|
616
670
|
family_replacement: 'Mobile Safari'
|
617
|
-
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))
|
671
|
+
- regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile'
|
618
672
|
family_replacement: 'Mobile Safari UI/WKWebView'
|
619
673
|
- regex: '(iPod|iPhone|iPad).* Safari'
|
620
674
|
family_replacement: 'Mobile Safari'
|
621
675
|
- regex: '(iPod|iPhone|iPad)'
|
622
676
|
family_replacement: 'Mobile Safari UI/WKWebView'
|
677
|
+
- regex: '(Watch)(\d+),(\d+)'
|
678
|
+
family_replacement: 'Apple $1 App'
|
623
679
|
|
624
680
|
##########################
|
625
681
|
# Outlook on iOS >= 2.62.0
|
@@ -687,18 +743,18 @@ user_agent_parsers:
|
|
687
743
|
|
688
744
|
- regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
|
689
745
|
|
690
|
-
#- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))
|
746
|
+
#- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
|
691
747
|
# family_replacement: 'iPad'
|
692
748
|
|
693
749
|
# Phantomjs, should go before Safari
|
694
750
|
- regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
|
695
751
|
|
696
752
|
# WebKit Nightly
|
697
|
-
- regex: '(AppleWebKit)/(\d+)
|
753
|
+
- regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
|
698
754
|
family_replacement: 'WebKit Nightly'
|
699
755
|
|
700
756
|
# Safari
|
701
|
-
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))
|
757
|
+
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
|
702
758
|
family_replacement: 'Safari'
|
703
759
|
# Safari didn't provide "Version/d.d.d" prior to 3.0
|
704
760
|
- regex: '(Safari)/\d+'
|
@@ -733,9 +789,9 @@ user_agent_parsers:
|
|
733
789
|
v1_replacement: '8'
|
734
790
|
|
735
791
|
# Espial
|
736
|
-
- regex: '(Espial)/(\d+)(?:\.(\d+))
|
792
|
+
- regex: '(Espial)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
737
793
|
|
738
|
-
|
794
|
+
# Apple Mail
|
739
795
|
|
740
796
|
# apple mail - not directly detectable, have it after Safari stuff
|
741
797
|
- regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'
|
@@ -745,7 +801,7 @@ user_agent_parsers:
|
|
745
801
|
# AFTER IE11
|
746
802
|
# BEFORE all other IE
|
747
803
|
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
|
748
|
-
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]
|
804
|
+
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
|
749
805
|
|
750
806
|
- regex: '([MS]?IE) (\d+)\.(\d+)'
|
751
807
|
family_replacement: 'IE'
|
@@ -754,13 +810,13 @@ user_agent_parsers:
|
|
754
810
|
family_replacement: 'Python Requests'
|
755
811
|
|
756
812
|
# headless user-agents
|
757
|
-
- regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))
|
813
|
+
- regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
|
758
814
|
|
759
|
-
- regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]
|
815
|
+
- regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
|
760
816
|
|
761
817
|
# Cloud Storage Clients
|
762
|
-
- regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d
|
763
|
-
- regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com)
|
818
|
+
- regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
|
819
|
+
- regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
|
764
820
|
# rclone - rsync for cloud storage - https://rclone.org/
|
765
821
|
- regex: '^(rclone)/v(\d+)\.(\d+)'
|
766
822
|
|
@@ -774,6 +830,10 @@ user_agent_parsers:
|
|
774
830
|
# Box Drive and Box Sync https://www.box.com/resources/downloads
|
775
831
|
- regex: '^(Box(?: Sync)?)/(\d+)\.(\d+)\.(\d+)'
|
776
832
|
|
833
|
+
# ViaFree streaming app https://www.viafree.{dk|se|no}
|
834
|
+
- regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
|
835
|
+
family_replacement: 'ViaFree'
|
836
|
+
|
777
837
|
os_parsers:
|
778
838
|
##########
|
779
839
|
# HbbTV vendors
|
@@ -819,11 +879,11 @@ os_parsers:
|
|
819
879
|
# Philips : not found any other way than a manual mapping
|
820
880
|
# 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
|
821
881
|
# 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
|
822
|
-
- regex: 'HbbTV/1
|
882
|
+
- regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
|
823
883
|
os_v1_replacement: '2013'
|
824
|
-
- regex: 'HbbTV/1
|
884
|
+
- regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
|
825
885
|
os_v1_replacement: '2012'
|
826
|
-
- regex: 'HbbTV/1
|
886
|
+
- regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
|
827
887
|
os_v1_replacement: '2011'
|
828
888
|
|
829
889
|
# the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
|
@@ -844,14 +904,14 @@ os_parsers:
|
|
844
904
|
- regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
|
845
905
|
|
846
906
|
# Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
|
847
|
-
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))
|
907
|
+
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
|
848
908
|
os_replacement: 'iOS'
|
849
909
|
|
850
910
|
##########
|
851
911
|
# Android
|
852
912
|
# can actually detect rooted android os. do we care?
|
853
913
|
##########
|
854
|
-
- regex: '(Android)[ \-/](\d+)
|
914
|
+
- regex: '(Android)[ \-/](\d+)(?:\.(\d+)|)(?:[.\-]([a-z0-9]+)|)'
|
855
915
|
|
856
916
|
- regex: '(Android) Donut'
|
857
917
|
os_v1_replacement: '1'
|
@@ -873,18 +933,18 @@ os_parsers:
|
|
873
933
|
os_v1_replacement: '3'
|
874
934
|
|
875
935
|
# UCWEB
|
876
|
-
- regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))
|
936
|
+
- regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
|
877
937
|
os_replacement: 'Android'
|
878
|
-
- regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+))
|
938
|
+
- regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
|
879
939
|
os_replacement: 'iOS'
|
880
|
-
- regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))
|
940
|
+
- regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
|
881
941
|
os_replacement: 'Windows Phone'
|
882
942
|
# JUC
|
883
|
-
- regex: '^(JUC).*; ?U; ?(?:Android)
|
943
|
+
- regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
|
884
944
|
os_replacement: 'Android'
|
885
945
|
|
886
946
|
# Salesforce
|
887
|
-
- regex: '(android)\s(?:mobile\/)(\d+)
|
947
|
+
- regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
|
888
948
|
os_replacement: 'Android'
|
889
949
|
|
890
950
|
##########
|
@@ -893,6 +953,14 @@ os_parsers:
|
|
893
953
|
- regex: '(Silk-Accelerated=[a-z]{4,5})'
|
894
954
|
os_replacement: 'Android'
|
895
955
|
|
956
|
+
# Citrix Chrome App on Chrome OS
|
957
|
+
# Note, this needs to come before the windows parsers as the app doesn't
|
958
|
+
# properly identify as Chrome OS
|
959
|
+
#
|
960
|
+
# ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
|
961
|
+
- regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
|
962
|
+
os_replacement: 'Chrome OS'
|
963
|
+
|
896
964
|
##########
|
897
965
|
# Windows
|
898
966
|
# http://en.wikipedia.org/wiki/Windows_NT#Releases
|
@@ -911,6 +979,10 @@ os_parsers:
|
|
911
979
|
- regex: '(Windows ?Mobile)'
|
912
980
|
os_replacement: 'Windows Mobile'
|
913
981
|
|
982
|
+
- regex: '(Windows 10)'
|
983
|
+
os_replacement: 'Windows'
|
984
|
+
os_v1_replacement: '10'
|
985
|
+
|
914
986
|
- regex: '(Windows (?:NT 5\.2|NT 5\.1))'
|
915
987
|
os_replacement: 'Windows'
|
916
988
|
os_v1_replacement: 'XP'
|
@@ -927,8 +999,6 @@ os_parsers:
|
|
927
999
|
os_replacement: 'Windows'
|
928
1000
|
os_v1_replacement: 'ME'
|
929
1001
|
|
930
|
-
- regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
|
931
|
-
|
932
1002
|
- regex: '(Windows NT 6\.2; ARM;)'
|
933
1003
|
os_replacement: 'Windows'
|
934
1004
|
os_v1_replacement: 'RT'
|
@@ -939,11 +1009,13 @@ os_parsers:
|
|
939
1009
|
|
940
1010
|
- regex: '(Windows NT 6\.3; ARM;)'
|
941
1011
|
os_replacement: 'Windows'
|
942
|
-
os_v1_replacement: 'RT 8
|
1012
|
+
os_v1_replacement: 'RT 8'
|
1013
|
+
os_v2_replacement: '1'
|
943
1014
|
|
944
1015
|
- regex: '(Windows NT 6\.3)'
|
945
1016
|
os_replacement: 'Windows'
|
946
|
-
os_v1_replacement: '8
|
1017
|
+
os_v1_replacement: '8'
|
1018
|
+
os_v2_replacement: '1'
|
947
1019
|
|
948
1020
|
- regex: '(Windows NT 6\.4)'
|
949
1021
|
os_replacement: 'Windows'
|
@@ -965,7 +1037,7 @@ os_parsers:
|
|
965
1037
|
os_replacement: 'Windows'
|
966
1038
|
os_v1_replacement: 'CE'
|
967
1039
|
|
968
|
-
- regex: 'Win ?(95|98|3.1|NT|ME|2000)'
|
1040
|
+
- regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)'
|
969
1041
|
os_replacement: 'Windows'
|
970
1042
|
os_v1_replacement: '$1'
|
971
1043
|
|
@@ -993,13 +1065,13 @@ os_parsers:
|
|
993
1065
|
# @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
|
994
1066
|
# @ref: http://www.puredarwin.org/curious/versions
|
995
1067
|
##########
|
996
|
-
- regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+))
|
1068
|
+
- regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
|
997
1069
|
os_replacement: 'Mac OS X'
|
998
|
-
- regex: '
|
1070
|
+
- regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
|
999
1071
|
os_replacement: 'Mac OS X'
|
1000
|
-
os_v1_replacement: '$
|
1001
|
-
os_v2_replacement: '$
|
1002
|
-
os_v3_replacement: '$
|
1072
|
+
os_v1_replacement: '$1'
|
1073
|
+
os_v2_replacement: '$2'
|
1074
|
+
os_v3_replacement: '$3'
|
1003
1075
|
# Leopard
|
1004
1076
|
- regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
|
1005
1077
|
os_replacement: 'Mac OS X'
|
@@ -1038,7 +1110,7 @@ os_parsers:
|
|
1038
1110
|
- regex: '(?:PPC|Intel) (Mac OS X)'
|
1039
1111
|
|
1040
1112
|
# Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
|
1041
|
-
- regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+))
|
1113
|
+
- regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
|
1042
1114
|
os_replacement: 'Mac OS X'
|
1043
1115
|
|
1044
1116
|
##########
|
@@ -1046,10 +1118,10 @@ os_parsers:
|
|
1046
1118
|
# http://en.wikipedia.org/wiki/IOS_version_history
|
1047
1119
|
##########
|
1048
1120
|
# keep this above generic iOS, since AppleTV UAs contain 'CPU OS'
|
1049
|
-
- regex: '(Apple\s?TV)(?:/(\d+)\.(\d+))
|
1121
|
+
- regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
|
1050
1122
|
os_replacement: 'ATV OS X'
|
1051
1123
|
|
1052
|
-
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))
|
1124
|
+
- regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
|
1053
1125
|
os_replacement: 'iOS'
|
1054
1126
|
|
1055
1127
|
# remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
|
@@ -1231,19 +1303,31 @@ os_parsers:
|
|
1231
1303
|
os_replacement: 'iOS'
|
1232
1304
|
|
1233
1305
|
# iOS Apps
|
1234
|
-
- regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))
|
1306
|
+
- regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+)|)'
|
1235
1307
|
os_replacement: 'iOS'
|
1236
1308
|
- regex: '\((iOS);'
|
1237
1309
|
|
1310
|
+
##########
|
1311
|
+
# Apple Watch
|
1312
|
+
##########
|
1313
|
+
- regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
|
1314
|
+
os_replacement: 'WatchOS'
|
1315
|
+
|
1238
1316
|
##########################
|
1239
1317
|
# Outlook on iOS >= 2.62.0
|
1240
1318
|
##########################
|
1241
1319
|
- regex: 'Outlook-(iOS)/\d+\.\d+\.prod\.iphone'
|
1242
1320
|
|
1321
|
+
##########################
|
1322
|
+
# iOS devices, the same regex matches mobile safari webviews
|
1323
|
+
##########################
|
1324
|
+
- regex: '(iPod|iPhone|iPad)'
|
1325
|
+
os_replacement: 'iOS'
|
1326
|
+
|
1243
1327
|
##########
|
1244
1328
|
# Apple TV
|
1245
1329
|
##########
|
1246
|
-
- regex: '(tvOS)/(\d+)
|
1330
|
+
- regex: '(tvOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
|
1247
1331
|
os_replacement: 'tvOS'
|
1248
1332
|
|
1249
1333
|
##########
|
@@ -1252,7 +1336,7 @@ os_parsers:
|
|
1252
1336
|
# http://code.google.com/p/chromium-os/issues/detail?id=11573
|
1253
1337
|
# http://code.google.com/p/chromium-os/issues/detail?id=13790
|
1254
1338
|
##########
|
1255
|
-
- regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))
|
1339
|
+
- regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+)|)'
|
1256
1340
|
os_replacement: 'Chrome OS'
|
1257
1341
|
|
1258
1342
|
##########
|
@@ -1260,8 +1344,8 @@ os_parsers:
|
|
1260
1344
|
##########
|
1261
1345
|
- regex: '([Dd]ebian)'
|
1262
1346
|
os_replacement: 'Debian'
|
1263
|
-
- regex: '(Linux Mint)(?:/(\d+))
|
1264
|
-
- regex: '(Mandriva)(?: Linux)
|
1347
|
+
- regex: '(Linux Mint)(?:/(\d+)|)'
|
1348
|
+
- regex: '(Mandriva)(?: Linux|)/(?:[\d.-]+m[a-z]{2}(\d+).(\d)|)'
|
1265
1349
|
|
1266
1350
|
##########
|
1267
1351
|
# Symbian + Symbian OS
|
@@ -1290,9 +1374,9 @@ os_parsers:
|
|
1290
1374
|
##########
|
1291
1375
|
- regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
|
1292
1376
|
os_replacement: 'BlackBerry OS'
|
1293
|
-
- regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))
|
1377
|
+
- regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
|
1294
1378
|
os_replacement: 'BlackBerry OS'
|
1295
|
-
- regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))
|
1379
|
+
- regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
|
1296
1380
|
os_replacement: 'BlackBerry OS'
|
1297
1381
|
- regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
|
1298
1382
|
os_replacement: 'BlackBerry Tablet OS'
|
@@ -1359,20 +1443,20 @@ os_parsers:
|
|
1359
1443
|
##########
|
1360
1444
|
# Google TV
|
1361
1445
|
##########
|
1362
|
-
- regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))
|
1446
|
+
- regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+)|)|/[\da-z]+)'
|
1363
1447
|
|
1364
1448
|
- regex: '(WebTV)/(\d+).(\d+)'
|
1365
1449
|
|
1366
1450
|
##########
|
1367
1451
|
# Chromecast
|
1368
1452
|
##########
|
1369
|
-
- regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+))
|
1453
|
+
- regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
|
1370
1454
|
os_replacement: 'Chromecast'
|
1371
1455
|
|
1372
1456
|
##########
|
1373
1457
|
# Misc mobile
|
1374
1458
|
##########
|
1375
|
-
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))
|
1459
|
+
- regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
|
1376
1460
|
os_replacement: 'webOS'
|
1377
1461
|
- regex: '(VRE);'
|
1378
1462
|
|
@@ -1380,10 +1464,10 @@ os_parsers:
|
|
1380
1464
|
# Generic patterns
|
1381
1465
|
# since the majority of os cases are very specific, these go last
|
1382
1466
|
##########
|
1383
|
-
- regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))
|
1467
|
+
- regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
|
1384
1468
|
|
1385
1469
|
# Gentoo Linux + Kernel Version
|
1386
|
-
- regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))
|
1470
|
+
- regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
|
1387
1471
|
os_replacement: 'Gentoo'
|
1388
1472
|
|
1389
1473
|
# Opera Mini Bada
|
@@ -1393,7 +1477,7 @@ os_parsers:
|
|
1393
1477
|
- regex: '(Windows|Android|WeTab|Maemo|Web0S)'
|
1394
1478
|
- regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
|
1395
1479
|
# Linux + Kernel Version
|
1396
|
-
- regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))
|
1480
|
+
- regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
|
1397
1481
|
- regex: 'SunOS'
|
1398
1482
|
os_replacement: 'Solaris'
|
1399
1483
|
# Wget/x.x.x (linux-gnu)
|
@@ -1424,6 +1508,16 @@ device_parsers:
|
|
1424
1508
|
brand_replacement: 'Spider'
|
1425
1509
|
model_replacement: 'Feature Phone'
|
1426
1510
|
|
1511
|
+
# PTST / WebPageTest.org crawlers
|
1512
|
+
- regex: ' PTST/\d+(?:\.)?\d+$'
|
1513
|
+
device_replacement: 'Spider'
|
1514
|
+
brand_replacement: 'Spider'
|
1515
|
+
|
1516
|
+
# Datanyze.com spider
|
1517
|
+
- regex: 'X11; Datanyze; Linux'
|
1518
|
+
device_replacement: 'Spider'
|
1519
|
+
brand_replacement: 'Spider'
|
1520
|
+
|
1427
1521
|
#########
|
1428
1522
|
# WebBrowser for SmartWatch
|
1429
1523
|
# @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
|
@@ -1440,7 +1534,7 @@ device_parsers:
|
|
1440
1534
|
######################################################################
|
1441
1535
|
|
1442
1536
|
# Android Application
|
1443
|
-
- regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson)
|
1537
|
+
- regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
|
1444
1538
|
device_replacement: '$1 $2'
|
1445
1539
|
brand_replacement: '$1$2'
|
1446
1540
|
model_replacement: '$3'
|
@@ -1471,7 +1565,7 @@ device_parsers:
|
|
1471
1565
|
# Acer
|
1472
1566
|
# @ref: http://us.acer.com/ac/en/US/content/group/tablets
|
1473
1567
|
#########
|
1474
|
-
- regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G)
|
1568
|
+
- regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build'
|
1475
1569
|
device_replacement: '$1'
|
1476
1570
|
brand_replacement: 'Acer'
|
1477
1571
|
model_replacement: '$1'
|
@@ -1494,7 +1588,7 @@ device_parsers:
|
|
1494
1588
|
# @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
|
1495
1589
|
# custom ROM builds for Vega
|
1496
1590
|
#########
|
1497
|
-
- regex: '; *(Advent )
|
1591
|
+
- regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build'
|
1498
1592
|
device_replacement: '$1$2'
|
1499
1593
|
brand_replacement: 'Advent'
|
1500
1594
|
model_replacement: '$2'
|
@@ -1503,7 +1597,7 @@ device_parsers:
|
|
1503
1597
|
# Ainol
|
1504
1598
|
# @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
|
1505
1599
|
#########
|
1506
|
-
- regex: '; *(Ainol )
|
1600
|
+
- regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build'
|
1507
1601
|
device_replacement: '$1$2'
|
1508
1602
|
brand_replacement: 'Ainol'
|
1509
1603
|
model_replacement: '$2'
|
@@ -1540,7 +1634,7 @@ device_parsers:
|
|
1540
1634
|
device_replacement: 'Alcatel One Touch $2'
|
1541
1635
|
brand_replacement: 'Alcatel'
|
1542
1636
|
model_replacement: 'One Touch $2'
|
1543
|
-
- regex: '; *(?:alcatel[ _])
|
1637
|
+
- regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
|
1544
1638
|
regex_flag: 'i'
|
1545
1639
|
device_replacement: 'Alcatel One Touch $1'
|
1546
1640
|
brand_replacement: 'Alcatel'
|
@@ -1580,7 +1674,7 @@ device_parsers:
|
|
1580
1674
|
device_replacement: '$1$2'
|
1581
1675
|
brand_replacement: 'Allview'
|
1582
1676
|
model_replacement: '$2'
|
1583
|
-
- regex: '; *(ALLVIEW[ _]?|Allview[ _]
|
1677
|
+
- regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build'
|
1584
1678
|
device_replacement: '$1$2'
|
1585
1679
|
brand_replacement: 'Allview'
|
1586
1680
|
model_replacement: '$2'
|
@@ -1640,7 +1734,7 @@ device_parsers:
|
|
1640
1734
|
# @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
|
1641
1735
|
# @note: brand owned by luckystar
|
1642
1736
|
#########
|
1643
|
-
- regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T)
|
1737
|
+
- regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build'
|
1644
1738
|
device_replacement: 'Aoson $1'
|
1645
1739
|
brand_replacement: 'Aoson'
|
1646
1740
|
model_replacement: '$1'
|
@@ -1715,7 +1809,7 @@ device_parsers:
|
|
1715
1809
|
# Assistant
|
1716
1810
|
# @ref: http://www.assistant.ua
|
1717
1811
|
#########
|
1718
|
-
- regex: '; *(?:ASSISTANT )
|
1812
|
+
- regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
|
1719
1813
|
device_replacement: 'Assistant $1-$2'
|
1720
1814
|
brand_replacement: 'Assistant'
|
1721
1815
|
model_replacement: '$1-$2'
|
@@ -1724,7 +1818,7 @@ device_parsers:
|
|
1724
1818
|
# Asus
|
1725
1819
|
# @ref: http://www.asus.com/uk/Tablets_Mobile/
|
1726
1820
|
#########
|
1727
|
-
- regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013)
|
1821
|
+
- regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
|
1728
1822
|
device_replacement: 'Asus $1'
|
1729
1823
|
brand_replacement: 'Asus'
|
1730
1824
|
model_replacement: '$1'
|
@@ -2272,7 +2366,7 @@ device_parsers:
|
|
2272
2366
|
# Gionee
|
2273
2367
|
# @ref: http://www.gionee.com/
|
2274
2368
|
#########
|
2275
|
-
- regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]
|
2369
|
+
- regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build'
|
2276
2370
|
regex_flag: 'i'
|
2277
2371
|
device_replacement: '$1 $2'
|
2278
2372
|
brand_replacement: 'Gionee'
|
@@ -2436,7 +2530,7 @@ device_parsers:
|
|
2436
2530
|
# @ref: http://www.huaweidevice.com
|
2437
2531
|
# @note: Needs to be before HTC due to Desire HD Build on U8815
|
2438
2532
|
#########
|
2439
|
-
- regex: '; *(HUAWEI |Huawei
|
2533
|
+
- regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
|
2440
2534
|
device_replacement: '$1$2'
|
2441
2535
|
brand_replacement: 'Huawei'
|
2442
2536
|
model_replacement: '$2'
|
@@ -2452,7 +2546,7 @@ device_parsers:
|
|
2452
2546
|
device_replacement: '$1$2'
|
2453
2547
|
brand_replacement: 'Huawei'
|
2454
2548
|
model_replacement: '$2'
|
2455
|
-
- regex: '; *((?:HUAWEI[ _]?|Huawei[ _])
|
2549
|
+
- regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
|
2456
2550
|
device_replacement: '$1$2'
|
2457
2551
|
brand_replacement: 'Huawei'
|
2458
2552
|
model_replacement: '$2'
|
@@ -2488,6 +2582,10 @@ device_parsers:
|
|
2488
2582
|
device_replacement: 'Huawei $1'
|
2489
2583
|
brand_replacement: 'Huawei'
|
2490
2584
|
model_replacement: '$1'
|
2585
|
+
- regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
|
2586
|
+
device_replacement: 'Huawei $1'
|
2587
|
+
brand_replacement: 'Huawei'
|
2588
|
+
model_replacement: '$1'
|
2491
2589
|
|
2492
2590
|
#########
|
2493
2591
|
# HTC
|
@@ -2507,33 +2605,33 @@ device_parsers:
|
|
2507
2605
|
device_replacement: 'HTC $1'
|
2508
2606
|
brand_replacement: 'HTC'
|
2509
2607
|
model_replacement: '$1'
|
2510
|
-
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+))
|
2608
|
+
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
|
2511
2609
|
device_replacement: 'HTC $1 $2'
|
2512
2610
|
brand_replacement: 'HTC'
|
2513
2611
|
model_replacement: '$1 $2'
|
2514
|
-
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))
|
2612
|
+
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
|
2515
2613
|
device_replacement: 'HTC $1 $2 $3'
|
2516
2614
|
brand_replacement: 'HTC'
|
2517
2615
|
model_replacement: '$1 $2 $3'
|
2518
|
-
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))
|
2616
|
+
- regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
|
2519
2617
|
device_replacement: 'HTC $1 $2 $3 $4'
|
2520
2618
|
brand_replacement: 'HTC'
|
2521
2619
|
model_replacement: '$1 $2 $3 $4'
|
2522
2620
|
|
2523
2621
|
# Android HTC without Version Number matcher
|
2524
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2622
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
|
2525
2623
|
device_replacement: 'HTC $1'
|
2526
2624
|
brand_replacement: 'HTC'
|
2527
2625
|
model_replacement: '$1'
|
2528
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2626
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
|
2529
2627
|
device_replacement: 'HTC $1 $2'
|
2530
2628
|
brand_replacement: 'HTC'
|
2531
2629
|
model_replacement: '$1 $2'
|
2532
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2630
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
|
2533
2631
|
device_replacement: 'HTC $1 $2 $3'
|
2534
2632
|
brand_replacement: 'HTC'
|
2535
2633
|
model_replacement: '$1 $2 $3'
|
2536
|
-
- regex: '; *(?:(?:HTC|htc)(?:_blocked)
|
2634
|
+
- regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
|
2537
2635
|
device_replacement: 'HTC $1 $2 $3 $4'
|
2538
2636
|
brand_replacement: 'HTC'
|
2539
2637
|
model_replacement: '$1 $2 $3 $4'
|
@@ -2544,7 +2642,7 @@ device_parsers:
|
|
2544
2642
|
brand_replacement: 'HTC'
|
2545
2643
|
model_replacement: '$1'
|
2546
2644
|
# general matcher for anything else
|
2547
|
-
- regex: '(?:[;,] *|^)(?:htccn_chs
|
2645
|
+
- regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
|
2548
2646
|
regex_flag: 'i'
|
2549
2647
|
device_replacement: 'HTC $1'
|
2550
2648
|
brand_replacement: 'HTC'
|
@@ -2583,12 +2681,12 @@ device_parsers:
|
|
2583
2681
|
# iBall
|
2584
2682
|
# @ref: http://www.iball.co.in/Category/Mobiles/22
|
2585
2683
|
#########
|
2586
|
-
- regex: '; *(?:iBall[ _\-])
|
2684
|
+
- regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build'
|
2587
2685
|
regex_flag: 'i'
|
2588
2686
|
device_replacement: '$1 $2'
|
2589
2687
|
brand_replacement: 'iBall'
|
2590
2688
|
model_replacement: '$1 $2'
|
2591
|
-
- regex: '; *(IBall)(?:[ _]([^;/]+))
|
2689
|
+
- regex: '; *(IBall)(?:[ _]([^;/]+)|) Build'
|
2592
2690
|
regex_flag: 'i'
|
2593
2691
|
device_replacement: '$1 $2'
|
2594
2692
|
brand_replacement: 'iBall'
|
@@ -2598,7 +2696,7 @@ device_parsers:
|
|
2598
2696
|
# IconBIT
|
2599
2697
|
# @ref: http://www.iconbit.com/catalog/tablets/
|
2600
2698
|
#########
|
2601
|
-
- regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]
|
2699
|
+
- regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|) Build'
|
2602
2700
|
device_replacement: '$1'
|
2603
2701
|
brand_replacement: 'IconBIT'
|
2604
2702
|
model_replacement: '$1'
|
@@ -2671,17 +2769,17 @@ device_parsers:
|
|
2671
2769
|
# @note: Zync also offers a "Cloud Z5" device
|
2672
2770
|
#########
|
2673
2771
|
# smartphones
|
2674
|
-
- regex: '; *(?:Intex[ _])
|
2772
|
+
- regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
|
2675
2773
|
device_replacement: '$1$2$3'
|
2676
2774
|
brand_replacement: 'Intex'
|
2677
2775
|
model_replacement: '$1 $3'
|
2678
2776
|
# matches "INTEX CLOUD X1"
|
2679
|
-
- regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+))
|
2777
|
+
- regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
|
2680
2778
|
device_replacement: '$1 $2'
|
2681
2779
|
brand_replacement: 'Intex'
|
2682
2780
|
model_replacement: '$1 $2'
|
2683
2781
|
# tablets
|
2684
|
-
- regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| )
|
2782
|
+
- regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
|
2685
2783
|
device_replacement: '$1 $2 $3'
|
2686
2784
|
brand_replacement: 'Intex'
|
2687
2785
|
model_replacement: 'iBuddy $2 $3'
|
@@ -2704,7 +2802,7 @@ device_parsers:
|
|
2704
2802
|
# i.onik
|
2705
2803
|
# @ref: http://www.i-onik.de/
|
2706
2804
|
#########
|
2707
|
-
- regex: '; *(TP\d+(?:\.\d
|
2805
|
+
- regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build'
|
2708
2806
|
device_replacement: 'ionik $1'
|
2709
2807
|
brand_replacement: 'ionik'
|
2710
2808
|
model_replacement: '$1'
|
@@ -2920,7 +3018,7 @@ device_parsers:
|
|
2920
3018
|
# Lava
|
2921
3019
|
# @ref: http://www.lavamobiles.com/
|
2922
3020
|
#########
|
2923
|
-
- regex: '; *(?:LAVA[ _])
|
3021
|
+
- regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
|
2924
3022
|
regex_flag: 'i'
|
2925
3023
|
device_replacement: 'Iris $1'
|
2926
3024
|
brand_replacement: 'Lava'
|
@@ -2972,15 +3070,15 @@ device_parsers:
|
|
2972
3070
|
device_replacement: 'Lenovo $1 $2'
|
2973
3071
|
brand_replacement: 'Lenovo'
|
2974
3072
|
model_replacement: '$1 $2'
|
2975
|
-
- regex: '; *(?:LNV
|
3073
|
+
- regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
|
2976
3074
|
device_replacement: 'Lenovo $1'
|
2977
3075
|
brand_replacement: 'Lenovo'
|
2978
3076
|
model_replacement: '$1'
|
2979
|
-
- regex: '[;,] (?:Vodafone )
|
3077
|
+
- regex: '[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\d+) Build/'
|
2980
3078
|
device_replacement: 'Lenovo $1 $2 $3'
|
2981
3079
|
brand_replacement: 'Lenovo'
|
2982
3080
|
model_replacement: '$1 $2 $3'
|
2983
|
-
- regex: '; *(?:Ideapad )
|
3081
|
+
- regex: '; *(?:Ideapad |)K1 Build/'
|
2984
3082
|
device_replacement: 'Lenovo Ideapad K1'
|
2985
3083
|
brand_replacement: 'Lenovo'
|
2986
3084
|
model_replacement: 'Ideapad K1'
|
@@ -3010,7 +3108,7 @@ device_parsers:
|
|
3010
3108
|
device_replacement: '$1'
|
3011
3109
|
brand_replacement: 'LG'
|
3012
3110
|
model_replacement: '$1'
|
3013
|
-
- regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d
|
3111
|
+
- regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
|
3014
3112
|
device_replacement: '$1'
|
3015
3113
|
brand_replacement: 'LG'
|
3016
3114
|
model_replacement: '$1'
|
@@ -3093,7 +3191,7 @@ device_parsers:
|
|
3093
3191
|
# Medion
|
3094
3192
|
# @ref: http://www.medion.com/en/
|
3095
3193
|
#########
|
3096
|
-
- regex: '; *(?:MD_)
|
3194
|
+
- regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build'
|
3097
3195
|
regex_flag: 'i'
|
3098
3196
|
device_replacement: 'Medion Lifetab $1'
|
3099
3197
|
brand_replacement: 'Medion'
|
@@ -3171,7 +3269,7 @@ device_parsers:
|
|
3171
3269
|
# Modecom
|
3172
3270
|
# @ref: http://www.modecom.eu/tablets/portal/
|
3173
3271
|
#########
|
3174
|
-
- regex: '; *(MODECOM )
|
3272
|
+
- regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build'
|
3175
3273
|
regex_flag: 'i'
|
3176
3274
|
device_replacement: '$1$2 $3'
|
3177
3275
|
brand_replacement: 'Modecom'
|
@@ -3229,7 +3327,7 @@ device_parsers:
|
|
3229
3327
|
# MSI
|
3230
3328
|
# @ref: http://www.msi.com/product/windpad/
|
3231
3329
|
#########
|
3232
|
-
- regex: '; *(?:MSI[ _])
|
3330
|
+
- regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build'
|
3233
3331
|
regex_flag: 'i'
|
3234
3332
|
device_replacement: '$1'
|
3235
3333
|
brand_replacement: 'Msi'
|
@@ -3256,7 +3354,7 @@ device_parsers:
|
|
3256
3354
|
device_replacement: '$1$2 $3'
|
3257
3355
|
brand_replacement: 'MyPhone'
|
3258
3356
|
model_replacement: '$3'
|
3259
|
-
- regex: '; *(A\d+)[ _](Duo)
|
3357
|
+
- regex: '; *(A\d+)[ _](Duo|) Build'
|
3260
3358
|
regex_flag: 'i'
|
3261
3359
|
device_replacement: '$1 $2'
|
3262
3360
|
brand_replacement: 'MyPhone'
|
@@ -3325,7 +3423,7 @@ device_parsers:
|
|
3325
3423
|
device_replacement: '$1$2'
|
3326
3424
|
brand_replacement: 'Nook'
|
3327
3425
|
model_replacement: '$2'
|
3328
|
-
- regex: '; *(NOOK )
|
3426
|
+
- regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
|
3329
3427
|
device_replacement: '$1$2'
|
3330
3428
|
brand_replacement: 'Nook'
|
3331
3429
|
model_replacement: '$2'
|
@@ -3410,7 +3508,7 @@ device_parsers:
|
|
3410
3508
|
device_replacement: 'OnePlus $1'
|
3411
3509
|
brand_replacement: 'OnePlus'
|
3412
3510
|
model_replacement: '$1'
|
3413
|
-
- regex: '; (ONEPLUS [a-zA-Z]\d+) Build
|
3511
|
+
- regex: '; (ONEPLUS [a-zA-Z]\d+)(?: Build/|)'
|
3414
3512
|
device_replacement: 'OnePlus $1'
|
3415
3513
|
brand_replacement: 'OnePlus'
|
3416
3514
|
model_replacement: '$1'
|
@@ -3460,11 +3558,11 @@ device_parsers:
|
|
3460
3558
|
# @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
|
3461
3559
|
# @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21
|
3462
3560
|
#########
|
3463
|
-
- regex: '; *(SKY[ _])
|
3561
|
+
- regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
|
3464
3562
|
device_replacement: 'Pantech $1$2'
|
3465
3563
|
brand_replacement: 'Pantech'
|
3466
3564
|
model_replacement: '$1$2'
|
3467
|
-
- regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G)
|
3565
|
+
- regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
|
3468
3566
|
device_replacement: '$1'
|
3469
3567
|
brand_replacement: 'Pantech'
|
3470
3568
|
model_replacement: '$1'
|
@@ -3547,7 +3645,7 @@ device_parsers:
|
|
3547
3645
|
# Polaroid/ Acho
|
3548
3646
|
# @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
|
3549
3647
|
#########
|
3550
|
-
- regex: '; *(?:Polaroid[ _])
|
3648
|
+
- regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/'
|
3551
3649
|
device_replacement: '$1'
|
3552
3650
|
brand_replacement: 'Polaroid'
|
3553
3651
|
model_replacement: '$1'
|
@@ -3574,7 +3672,7 @@ device_parsers:
|
|
3574
3672
|
device_replacement: '$1'
|
3575
3673
|
brand_replacement: 'Positivo'
|
3576
3674
|
model_replacement: '$1'
|
3577
|
-
- regex: '; *(?:Positivo )
|
3675
|
+
- regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/'
|
3578
3676
|
device_replacement: '$1'
|
3579
3677
|
brand_replacement: 'Positivo'
|
3580
3678
|
model_replacement: '$1'
|
@@ -3602,7 +3700,7 @@ device_parsers:
|
|
3602
3700
|
# @ref: http://www.prestigio.com/catalogue/MultiPhones
|
3603
3701
|
# @ref: http://www.prestigio.com/catalogue/MultiPads
|
3604
3702
|
#########
|
3605
|
-
- regex: '; *(?:Prestigio )
|
3703
|
+
- regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/'
|
3606
3704
|
device_replacement: 'Prestigio $1'
|
3607
3705
|
brand_replacement: 'Prestigio'
|
3608
3706
|
model_replacement: '$1'
|
@@ -3620,7 +3718,7 @@ device_parsers:
|
|
3620
3718
|
# QMobile
|
3621
3719
|
# @ref: http://www.qmobile.com.pk/
|
3622
3720
|
#########
|
3623
|
-
- regex: '; *(A2|A5|A8|A900)_?(Classic)
|
3721
|
+
- regex: '; *(A2|A5|A8|A900)_?(Classic|) Build'
|
3624
3722
|
device_replacement: '$1 $2'
|
3625
3723
|
brand_replacement: 'Qmobile'
|
3626
3724
|
model_replacement: '$1 $2'
|
@@ -3686,11 +3784,11 @@ device_parsers:
|
|
3686
3784
|
# Samsung Android Devices
|
3687
3785
|
# @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
|
3688
3786
|
#########
|
3689
|
-
- regex: '; *(SAMSUNG |Samsung )
|
3787
|
+
- regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
|
3690
3788
|
device_replacement: 'Samsung $1$2'
|
3691
3789
|
brand_replacement: 'Samsung'
|
3692
3790
|
model_replacement: '$2'
|
3693
|
-
- regex: '; *(Google )
|
3791
|
+
- regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
|
3694
3792
|
device_replacement: 'Samsung $1$2'
|
3695
3793
|
brand_replacement: 'Samsung'
|
3696
3794
|
model_replacement: '$2'
|
@@ -3698,15 +3796,15 @@ device_parsers:
|
|
3698
3796
|
device_replacement: 'Samsung $2'
|
3699
3797
|
brand_replacement: 'Samsung'
|
3700
3798
|
model_replacement: '$2'
|
3701
|
-
- regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G)
|
3799
|
+
- regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
|
3702
3800
|
device_replacement: 'Samsung $1'
|
3703
3801
|
brand_replacement: 'Samsung'
|
3704
3802
|
model_replacement: '$1'
|
3705
|
-
- regex: '; *(SAMSUNG[ _\-]
|
3803
|
+
- regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
|
3706
3804
|
device_replacement: 'Samsung $2'
|
3707
3805
|
brand_replacement: 'Samsung'
|
3708
3806
|
model_replacement: '$2'
|
3709
|
-
- regex: '; *(SAMSUNG
|
3807
|
+
- regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
|
3710
3808
|
device_replacement: 'Samsung $1$2$3'
|
3711
3809
|
brand_replacement: 'Samsung'
|
3712
3810
|
model_replacement: '$2'
|
@@ -3718,11 +3816,15 @@ device_parsers:
|
|
3718
3816
|
device_replacement: 'Samsung $1$2'
|
3719
3817
|
brand_replacement: 'Samsung'
|
3720
3818
|
model_replacement: '$2'
|
3721
|
-
- regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]
|
3819
|
+
- regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
|
3820
|
+
device_replacement: 'Samsung $1'
|
3821
|
+
brand_replacement: 'Samsung'
|
3822
|
+
model_replacement: '$1'
|
3823
|
+
- regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
|
3722
3824
|
device_replacement: 'Samsung $1'
|
3723
3825
|
brand_replacement: 'Samsung'
|
3724
3826
|
model_replacement: '$1'
|
3725
|
-
- regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]
|
3827
|
+
- regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
|
3726
3828
|
device_replacement: 'Samsung $1'
|
3727
3829
|
brand_replacement: 'Samsung'
|
3728
3830
|
model_replacement: '$1'
|
@@ -3730,6 +3832,10 @@ device_parsers:
|
|
3730
3832
|
device_replacement: 'Samsung $1'
|
3731
3833
|
brand_replacement: 'Samsung'
|
3732
3834
|
model_replacement: '$1'
|
3835
|
+
- regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
|
3836
|
+
device_replacement: 'Samsung $1'
|
3837
|
+
brand_replacement: 'Samsung'
|
3838
|
+
model_replacement: '$1'
|
3733
3839
|
|
3734
3840
|
#########
|
3735
3841
|
# Sharp
|
@@ -3859,7 +3965,7 @@ device_parsers:
|
|
3859
3965
|
device_replacement: '$1$2'
|
3860
3966
|
brand_replacement: 'SonyEricsson'
|
3861
3967
|
model_replacement: '$2'
|
3862
|
-
- regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o)
|
3968
|
+
- regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
|
3863
3969
|
device_replacement: '$1'
|
3864
3970
|
brand_replacement: 'SonyEricsson'
|
3865
3971
|
model_replacement: '$1'
|
@@ -3923,7 +4029,7 @@ device_parsers:
|
|
3923
4029
|
# Spice
|
3924
4030
|
# @ref: http://www.spicemobilephones.co.in/
|
3925
4031
|
#########
|
3926
|
-
- regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]
|
4032
|
+
- regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*) Build/'
|
3927
4033
|
device_replacement: '$1$2$3$4'
|
3928
4034
|
brand_replacement: 'Spice'
|
3929
4035
|
model_replacement: 'Mi$4'
|
@@ -4062,7 +4168,7 @@ device_parsers:
|
|
4062
4168
|
device_replacement: '$1'
|
4063
4169
|
brand_replacement: 'HTC'
|
4064
4170
|
model_replacement: 'Dream'
|
4065
|
-
- regex: '\b(T-Mobile
|
4171
|
+
- regex: '\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\/]*) (?:Mozilla|Build)'
|
4066
4172
|
device_replacement: '$1$2 $3 $4'
|
4067
4173
|
brand_replacement: 'HTC'
|
4068
4174
|
model_replacement: '$2 $3 $4'
|
@@ -4107,7 +4213,7 @@ device_parsers:
|
|
4107
4213
|
device_replacement: '$1'
|
4108
4214
|
brand_replacement: 'Toshiba'
|
4109
4215
|
model_replacement: 'Folio 100'
|
4110
|
-
- regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a)
|
4216
|
+
- regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
|
4111
4217
|
device_replacement: 'Toshiba $1'
|
4112
4218
|
brand_replacement: 'Toshiba'
|
4113
4219
|
model_replacement: '$1'
|
@@ -4227,7 +4333,7 @@ device_parsers:
|
|
4227
4333
|
# Walton
|
4228
4334
|
# @ref: http://www.waltonbd.com/
|
4229
4335
|
#########
|
4230
|
-
- regex: '; *(?:Walton[ _\-])
|
4336
|
+
- regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build'
|
4231
4337
|
regex_flag: 'i'
|
4232
4338
|
device_replacement: 'Walton $1'
|
4233
4339
|
brand_replacement: 'Walton'
|
@@ -4237,7 +4343,7 @@ device_parsers:
|
|
4237
4343
|
# Wiko
|
4238
4344
|
# @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
|
4239
4345
|
#########
|
4240
|
-
- regex: '; *(?:WIKO[ \-])
|
4346
|
+
- regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
|
4241
4347
|
regex_flag: 'i'
|
4242
4348
|
device_replacement: 'Wiko $1'
|
4243
4349
|
brand_replacement: 'Wiko'
|
@@ -4283,7 +4389,7 @@ device_parsers:
|
|
4283
4389
|
# Yarvik Zania
|
4284
4390
|
# @ref: http://yarvik.com
|
4285
4391
|
#########
|
4286
|
-
- regex: '; *(?:Xenta |Luna )
|
4392
|
+
- regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/'
|
4287
4393
|
device_replacement: 'Yarvik $1'
|
4288
4394
|
brand_replacement: 'Yarvik'
|
4289
4395
|
model_replacement: '$1'
|
@@ -4306,7 +4412,19 @@ device_parsers:
|
|
4306
4412
|
# XiaoMi
|
4307
4413
|
# @ref: http://www.xiaomi.com/event/buyphone
|
4308
4414
|
#########
|
4309
|
-
- regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note )
|
4415
|
+
- regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
|
4416
|
+
device_replacement: 'XiaoMi $1'
|
4417
|
+
brand_replacement: 'XiaoMi'
|
4418
|
+
model_replacement: '$1'
|
4419
|
+
- regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
|
4420
|
+
device_replacement: 'XiaoMi $1'
|
4421
|
+
brand_replacement: 'XiaoMi'
|
4422
|
+
model_replacement: '$1'
|
4423
|
+
- regex: '; *(MIX) (Build|MIUI)/'
|
4424
|
+
device_replacement: 'XiaoMi $1'
|
4425
|
+
brand_replacement: 'XiaoMi'
|
4426
|
+
model_replacement: '$1'
|
4427
|
+
- regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
|
4310
4428
|
device_replacement: 'XiaoMi $1'
|
4311
4429
|
brand_replacement: 'XiaoMi'
|
4312
4430
|
model_replacement: '$1'
|
@@ -4472,7 +4590,7 @@ device_parsers:
|
|
4472
4590
|
device_replacement: 'Kindle'
|
4473
4591
|
brand_replacement: 'Amazon'
|
4474
4592
|
model_replacement: 'Kindle'
|
4475
|
-
- regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))
|
4593
|
+
- regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|) Build\b'
|
4476
4594
|
device_replacement: 'Kindle Fire'
|
4477
4595
|
brand_replacement: 'Amazon'
|
4478
4596
|
model_replacement: 'Kindle Fire$2'
|
@@ -4524,7 +4642,7 @@ device_parsers:
|
|
4524
4642
|
#########
|
4525
4643
|
# Alcatel Windows Phones
|
4526
4644
|
#########
|
4527
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4645
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
|
4528
4646
|
device_replacement: 'Alcatel $1'
|
4529
4647
|
brand_replacement: 'Alcatel'
|
4530
4648
|
model_replacement: '$1'
|
@@ -4532,8 +4650,8 @@ device_parsers:
|
|
4532
4650
|
#########
|
4533
4651
|
# Asus Windows Phones
|
4534
4652
|
#########
|
4535
|
-
#~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4536
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4653
|
+
#~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
|
4654
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
|
4537
4655
|
device_replacement: 'Asus $1'
|
4538
4656
|
brand_replacement: 'Asus'
|
4539
4657
|
model_replacement: '$1'
|
@@ -4541,7 +4659,7 @@ device_parsers:
|
|
4541
4659
|
#########
|
4542
4660
|
# Dell Windows Phones
|
4543
4661
|
#########
|
4544
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4662
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
|
4545
4663
|
device_replacement: 'Dell $1'
|
4546
4664
|
brand_replacement: 'Dell'
|
4547
4665
|
model_replacement: '$1'
|
@@ -4549,7 +4667,7 @@ device_parsers:
|
|
4549
4667
|
#########
|
4550
4668
|
# HTC Windows Phones
|
4551
4669
|
#########
|
4552
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4670
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
|
4553
4671
|
device_replacement: 'HTC $1'
|
4554
4672
|
brand_replacement: 'HTC'
|
4555
4673
|
model_replacement: '$1'
|
@@ -4557,7 +4675,7 @@ device_parsers:
|
|
4557
4675
|
#########
|
4558
4676
|
# Huawei Windows Phones
|
4559
4677
|
#########
|
4560
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4678
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
|
4561
4679
|
device_replacement: 'Huawei $1'
|
4562
4680
|
brand_replacement: 'Huawei'
|
4563
4681
|
model_replacement: '$1'
|
@@ -4565,7 +4683,7 @@ device_parsers:
|
|
4565
4683
|
#########
|
4566
4684
|
# LG Windows Phones
|
4567
4685
|
#########
|
4568
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4686
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
|
4569
4687
|
device_replacement: 'LG $1'
|
4570
4688
|
brand_replacement: 'LG'
|
4571
4689
|
model_replacement: '$1'
|
@@ -4573,15 +4691,15 @@ device_parsers:
|
|
4573
4691
|
#########
|
4574
4692
|
# Noka Windows Phones
|
4575
4693
|
#########
|
4576
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4694
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
|
4577
4695
|
device_replacement: 'Lumia $1'
|
4578
4696
|
brand_replacement: 'Nokia'
|
4579
4697
|
model_replacement: 'Lumia $1'
|
4580
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4698
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
|
4581
4699
|
device_replacement: 'Nokia $1'
|
4582
4700
|
brand_replacement: 'Nokia'
|
4583
4701
|
model_replacement: '$1'
|
4584
|
-
- regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch;
|
4702
|
+
- regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
|
4585
4703
|
device_replacement: 'Nokia $1'
|
4586
4704
|
brand_replacement: 'Nokia'
|
4587
4705
|
model_replacement: '$1'
|
@@ -4589,7 +4707,7 @@ device_parsers:
|
|
4589
4707
|
#########
|
4590
4708
|
# Microsoft Windows Phones
|
4591
4709
|
#########
|
4592
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch;
|
4710
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
|
4593
4711
|
device_replacement: 'Microsoft $1'
|
4594
4712
|
brand_replacement: 'Microsoft'
|
4595
4713
|
model_replacement: '$1'
|
@@ -4597,7 +4715,7 @@ device_parsers:
|
|
4597
4715
|
#########
|
4598
4716
|
# Samsung Windows Phones
|
4599
4717
|
#########
|
4600
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4718
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
|
4601
4719
|
device_replacement: 'Samsung $1'
|
4602
4720
|
brand_replacement: 'Samsung'
|
4603
4721
|
model_replacement: '$1'
|
@@ -4605,7 +4723,7 @@ device_parsers:
|
|
4605
4723
|
#########
|
4606
4724
|
# Toshiba Windows Phones
|
4607
4725
|
#########
|
4608
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4726
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
|
4609
4727
|
device_replacement: 'Toshiba $1'
|
4610
4728
|
brand_replacement: 'Toshiba'
|
4611
4729
|
model_replacement: '$1'
|
@@ -4613,7 +4731,7 @@ device_parsers:
|
|
4613
4731
|
#########
|
4614
4732
|
# Generic Windows Phones
|
4615
4733
|
#########
|
4616
|
-
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest;
|
4734
|
+
- regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
|
4617
4735
|
device_replacement: '$1 $2'
|
4618
4736
|
brand_replacement: '$1'
|
4619
4737
|
model_replacement: '$2'
|
@@ -4633,7 +4751,7 @@ device_parsers:
|
|
4633
4751
|
#########
|
4634
4752
|
# Firefox OS
|
4635
4753
|
#########
|
4636
|
-
- regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]
|
4754
|
+
- regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
|
4637
4755
|
device_replacement: 'Alcatel $1 $2 $3'
|
4638
4756
|
brand_replacement: 'Alcatel'
|
4639
4757
|
model_replacement: 'One Touch $3'
|
@@ -4664,7 +4782,7 @@ device_parsers:
|
|
4664
4782
|
brand_replacement: '$1'
|
4665
4783
|
model_replacement: '$2'
|
4666
4784
|
# Nokia Symbian
|
4667
|
-
- regex: '\(Symbian(?:/3)
|
4785
|
+
- regex: '\(Symbian(?:/3|); U; ([^;]+);'
|
4668
4786
|
device_replacement: 'Nokia $1'
|
4669
4787
|
brand_replacement: 'Nokia'
|
4670
4788
|
model_replacement: '$1'
|
@@ -4709,7 +4827,7 @@ device_parsers:
|
|
4709
4827
|
device_replacement: 'Palm Treo $1'
|
4710
4828
|
brand_replacement: 'Palm'
|
4711
4829
|
model_replacement: 'Treo $1'
|
4712
|
-
- regex: 'webOS.*(P160U(?:NA)
|
4830
|
+
- regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
|
4713
4831
|
device_replacement: 'HP Veer'
|
4714
4832
|
brand_replacement: 'HP'
|
4715
4833
|
model_replacement: 'Veer'
|
@@ -4768,6 +4886,10 @@ device_parsers:
|
|
4768
4886
|
device_replacement: '$1'
|
4769
4887
|
brand_replacement: 'Apple'
|
4770
4888
|
model_replacement: '$1'
|
4889
|
+
- regex: '(Watch)(\d+,\d+)'
|
4890
|
+
device_replacement: 'Apple $1'
|
4891
|
+
brand_replacement: 'Apple'
|
4892
|
+
model_replacement: 'Apple $1 $2'
|
4771
4893
|
- regex: '(Apple Watch)(?:;| Simulator;)'
|
4772
4894
|
device_replacement: '$1'
|
4773
4895
|
brand_replacement: 'Apple'
|
@@ -4836,7 +4958,11 @@ device_parsers:
|
|
4836
4958
|
device_replacement: 'Asus $1'
|
4837
4959
|
brand_replacement: 'Asus'
|
4838
4960
|
model_replacement: '$1'
|
4839
|
-
- regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _])
|
4961
|
+
- regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
|
4962
|
+
device_replacement: 'Asus $1'
|
4963
|
+
brand_replacement: 'Asus'
|
4964
|
+
model_replacement: '$1'
|
4965
|
+
- regex: '(?:ASUS)_([A-Za-z0-9\-]+)'
|
4840
4966
|
device_replacement: 'Asus $1'
|
4841
4967
|
brand_replacement: 'Asus'
|
4842
4968
|
model_replacement: '$1'
|
@@ -4877,7 +5003,7 @@ device_parsers:
|
|
4877
5003
|
##########
|
4878
5004
|
# htc
|
4879
5005
|
##########
|
4880
|
-
- regex: '\b(?:HTC/|HTC/[a-z0-9]
|
5006
|
+
- regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
|
4881
5007
|
device_replacement: 'HTC $1'
|
4882
5008
|
brand_replacement: 'HTC'
|
4883
5009
|
model_replacement: '$1'
|
@@ -4893,6 +5019,10 @@ device_parsers:
|
|
4893
5019
|
device_replacement: 'Huawei $1'
|
4894
5020
|
brand_replacement: 'Huawei'
|
4895
5021
|
model_replacement: '$1'
|
5022
|
+
- regex: 'HUAWEI ([A-Za-z0-9\-]+)'
|
5023
|
+
device_replacement: 'Huawei $1'
|
5024
|
+
brand_replacement: 'Huawei'
|
5025
|
+
model_replacement: '$1'
|
4896
5026
|
- regex: 'vodafone([A-Za-z0-9]+)'
|
4897
5027
|
device_replacement: 'Huawei Vodafone $1'
|
4898
5028
|
brand_replacement: 'Huawei'
|
@@ -4934,11 +5064,11 @@ device_parsers:
|
|
4934
5064
|
device_replacement: '$1'
|
4935
5065
|
brand_replacement: '$2'
|
4936
5066
|
model_replacement: '$3'
|
4937
|
-
- regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor
|
5067
|
+
- regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
|
4938
5068
|
device_replacement: '$1'
|
4939
5069
|
brand_replacement: 'Thomson'
|
4940
5070
|
model_replacement: '$4'
|
4941
|
-
- regex: '(HbbTV)(?:/1\.1\.1)?(?:
|
5071
|
+
- regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
|
4942
5072
|
device_replacement: '$1'
|
4943
5073
|
brand_replacement: '$2'
|
4944
5074
|
model_replacement: '$3'
|
@@ -4955,7 +5085,7 @@ device_parsers:
|
|
4955
5085
|
##########
|
4956
5086
|
# LGE NetCast TV
|
4957
5087
|
##########
|
4958
|
-
- regex: 'LGE; (?:Media
|
5088
|
+
- regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
|
4959
5089
|
device_replacement: 'NetCast$2'
|
4960
5090
|
brand_replacement: 'LG'
|
4961
5091
|
model_replacement: '$1'
|
@@ -4984,7 +5114,7 @@ device_parsers:
|
|
4984
5114
|
brand_replacement: '$1'
|
4985
5115
|
model_replacement: '$2'
|
4986
5116
|
# other LG phones
|
4987
|
-
- regex: '\b(?:LGE[ \-]LG\-(?:AX)
|
5117
|
+
- regex: '\b(?:LGE[ \-]LG\-(?:AX|)|LGE |LGE?-LG|LGE?[ \-]|LG[ /\-]|lg[\-])([A-Za-z0-9]+)\b'
|
4988
5118
|
device_replacement: 'LG $1'
|
4989
5119
|
brand_replacement: 'LG'
|
4990
5120
|
model_replacement: '$1'
|
@@ -5129,7 +5259,7 @@ device_parsers:
|
|
5129
5259
|
device_replacement: '$2 $1'
|
5130
5260
|
brand_replacement: '$2'
|
5131
5261
|
model_replacement: '$1'
|
5132
|
-
- regex: '(Sony)(?:BDP
|
5262
|
+
- regex: '(Sony)(?:BDP\/|\/|)([^ /;\)]+)[ /;\)]'
|
5133
5263
|
device_replacement: '$1 $2'
|
5134
5264
|
brand_replacement: '$1'
|
5135
5265
|
model_replacement: '$2'
|
@@ -5159,27 +5289,27 @@ device_parsers:
|
|
5159
5289
|
#########
|
5160
5290
|
# Android General Device Matching (far from perfect)
|
5161
5291
|
#########
|
5162
|
-
- regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+) Build[/ ]'
|
5292
|
+
- regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
|
5163
5293
|
brand_replacement: 'Generic_Android'
|
5164
5294
|
model_replacement: '$1'
|
5165
|
-
- regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?) Build[/ ]'
|
5295
|
+
- regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
|
5166
5296
|
brand_replacement: 'Generic_Android'
|
5167
5297
|
model_replacement: '$1'
|
5168
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5298
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
|
5169
5299
|
brand_replacement: 'Generic_Android'
|
5170
5300
|
model_replacement: '$1'
|
5171
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5301
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
|
5172
5302
|
brand_replacement: 'Generic_Android'
|
5173
5303
|
model_replacement: '$1'
|
5174
5304
|
# No build info at all - "Build" follows locale immediately
|
5175
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5305
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
|
5176
5306
|
device_replacement: 'Generic Smartphone'
|
5177
5307
|
brand_replacement: 'Generic'
|
5178
5308
|
model_replacement: 'Smartphone'
|
5179
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5309
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
|
5180
5310
|
brand_replacement: 'Generic_Android'
|
5181
5311
|
model_replacement: '$1'
|
5182
|
-
- regex: 'Android[\- ][\d]+(?:\.[\d]+)
|
5312
|
+
- regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?)( Build[/ ]|\))'
|
5183
5313
|
brand_replacement: 'Generic_Android'
|
5184
5314
|
model_replacement: '$1'
|
5185
5315
|
|