device_detector 1.1.0 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +19 -17
- data/lib/device_detector/browser.rb +22 -2
- data/lib/device_detector/client_hint.rb +22 -7
- data/lib/device_detector/device.rb +231 -1
- data/lib/device_detector/os.rb +10 -2
- data/lib/device_detector/parser.rb +25 -3
- data/lib/device_detector/vendor_fragment.rb +25 -0
- data/lib/device_detector/version.rb +1 -1
- data/lib/device_detector.rb +37 -5
- data/regexes/bots.yml +308 -17
- data/regexes/client/browsers.yml +82 -25
- data/regexes/client/feed_readers.yml +31 -23
- data/regexes/client/hints/apps.yml +22 -0
- data/regexes/client/hints/browsers.yml +20 -0
- data/regexes/client/libraries.yml +172 -24
- data/regexes/client/mediaplayers.yml +47 -0
- data/regexes/client/mobile_apps.yml +857 -39
- data/regexes/client/pim.yml +4 -0
- data/regexes/device/car_browsers.yml +1 -1
- data/regexes/device/consoles.yml +8 -4
- data/regexes/device/mobiles.yml +4945 -1234
- data/regexes/device/portable_media_player.yml +20 -4
- data/regexes/device/shell_tv.yml +5 -0
- data/regexes/device/televisions.yml +144 -6
- data/regexes/oss.yml +221 -107
- metadata +6 -4
@@ -5,75 +5,109 @@
|
|
5
5
|
# @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
|
6
6
|
###############
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
- regex: 'Fuzz Faster U Fool v(\d+[\.\d]+)'
|
9
|
+
name: 'FFUF'
|
10
|
+
version: '$1'
|
11
|
+
url: 'https://github.com/ffuf/ffuf'
|
12
|
+
|
13
|
+
- regex: 'Slim Framework'
|
14
|
+
name: 'Slim Framework'
|
15
|
+
version: ''
|
16
|
+
url: 'https://www.slimframework.com/'
|
17
|
+
|
18
|
+
- regex: 'msray-plus'
|
19
|
+
name: 'Msray-Plus'
|
11
20
|
version: ''
|
21
|
+
url: 'https://github.com/super-l/msray'
|
22
|
+
|
23
|
+
- regex: 'HTMLParser(?:/(\d+[\.\d]+))?'
|
24
|
+
name: 'HTML Parser'
|
25
|
+
version: '$1'
|
26
|
+
url: 'https://htmlparser.sourceforge.net/'
|
12
27
|
|
13
|
-
#
|
28
|
+
# got - a nodejs library
|
29
|
+
- regex: '^got(?:/(\d+\.[.\d]+))? \('
|
30
|
+
name: 'got'
|
31
|
+
version: '$1'
|
32
|
+
url: 'https://github.com/sindresorhus/got'
|
33
|
+
|
34
|
+
# Typhoeus
|
14
35
|
- regex: 'Typhoeus'
|
15
36
|
name: 'Typhoeus'
|
16
37
|
version: ''
|
38
|
+
url: 'https://github.com/typhoeus/typhoeus'
|
17
39
|
|
18
|
-
# req
|
40
|
+
# req
|
19
41
|
- regex: 'req/v([\.\d]+)'
|
20
42
|
name: 'req'
|
21
43
|
version: '$1'
|
44
|
+
url: 'https://github.com/imroc/req'
|
22
45
|
|
23
|
-
# quic-go
|
46
|
+
# quic-go
|
24
47
|
- regex: 'quic-go-HTTP/3'
|
25
48
|
name: 'quic-go'
|
26
49
|
version: ''
|
50
|
+
url: 'https://github.com/lucas-clemente/quic-go'
|
27
51
|
|
28
|
-
# Azure Data Factory
|
52
|
+
# Azure Data Factory
|
29
53
|
- regex: 'azure-data-factory(?:/(\d+[\.\d]+))?'
|
30
54
|
name: 'Azure Data Factory'
|
31
55
|
version: '$1'
|
56
|
+
url: 'https://azure.microsoft.com/en-us/products/data-factory/'
|
32
57
|
|
33
|
-
# Dart
|
58
|
+
# Dart
|
34
59
|
- regex: 'Dart(?:/(\d+[\.\d]+))?'
|
35
60
|
name: 'Dart'
|
36
61
|
version: '$1'
|
62
|
+
url: 'https://dart.dev/'
|
37
63
|
|
38
|
-
# r-curl
|
64
|
+
# r-curl
|
39
65
|
- regex: 'r-curl(?:/(\d+[\.\d]+))?'
|
40
66
|
name: 'r-curl'
|
41
67
|
version: '$1'
|
68
|
+
url: 'https://github.com/jeroen/curl'
|
42
69
|
|
43
|
-
# HTTPX
|
70
|
+
# HTTPX
|
44
71
|
- regex: 'python-httpx(?:/(\d+[\.\d]+))?'
|
45
72
|
name: 'HTTPX'
|
46
73
|
version: '$1'
|
74
|
+
url: 'https://www.python-httpx.org/'
|
47
75
|
|
48
|
-
# fasthttp
|
76
|
+
# fasthttp
|
49
77
|
- regex: 'fasthttp(?:/(\d+[\.\d]+))?'
|
50
78
|
name: 'fasthttp'
|
51
79
|
version: '$1'
|
80
|
+
url: 'https://github.com/valyala/fasthttp'
|
52
81
|
|
53
|
-
# GeoIP Update
|
82
|
+
# GeoIP Update
|
54
83
|
- regex: 'geoipupdate(?:/(\d+[\.\d]+))?'
|
55
84
|
name: 'GeoIP Update'
|
56
85
|
version: '$1'
|
86
|
+
url: 'https://github.com/maxmind/geoipupdate'
|
57
87
|
|
58
|
-
# PHP cURL Class
|
88
|
+
# PHP cURL Class
|
59
89
|
- regex: 'PHP-Curl-Class(?:/(\d+[\.\d]+))?'
|
60
90
|
name: 'PHP cURL Class'
|
61
91
|
version: '$1'
|
92
|
+
url: 'https://github.com/php-curl-class/php-curl-class'
|
62
93
|
|
63
|
-
# cPanel HTTP Client
|
94
|
+
# cPanel HTTP Client
|
64
95
|
- regex: 'Cpanel-HTTP-Client(?:/(\d+[\.\d]+))?'
|
65
96
|
name: 'cPanel HTTP Client'
|
66
97
|
version: '$1'
|
98
|
+
url: 'https://www.cpanel.net/'
|
67
99
|
|
68
|
-
# AnyEvent HTTP
|
100
|
+
# AnyEvent HTTP
|
69
101
|
- regex: 'AnyEvent-HTTP(?:/(\d+[\.\d]+))?'
|
70
102
|
name: 'AnyEvent HTTP'
|
71
103
|
version: '$1'
|
104
|
+
url: 'http://software.schmorp.de/pkg/AnyEvent'
|
72
105
|
|
73
|
-
# SlimerJS
|
106
|
+
# SlimerJS
|
74
107
|
- regex: 'SlimerJS/(\d+[\.\d]+)'
|
75
108
|
name: 'SlimerJS'
|
76
109
|
version: '$1'
|
110
|
+
url: 'https://www.slimerjs.org/'
|
77
111
|
|
78
112
|
- regex: 'Wget(?:/(\d+[\.\d]+))?'
|
79
113
|
name: 'Wget'
|
@@ -83,6 +117,11 @@
|
|
83
117
|
name: 'Guzzle (PHP HTTP Client)'
|
84
118
|
version: '$1'
|
85
119
|
|
120
|
+
# symphony php http client
|
121
|
+
- regex: '^Symfony HttpClient/'
|
122
|
+
name: 'Symfony'
|
123
|
+
version: '$1'
|
124
|
+
|
86
125
|
- regex: '(?:lib)?curl(?:/(\d+[\.\d]+))?'
|
87
126
|
name: 'curl'
|
88
127
|
version: '$1'
|
@@ -96,7 +135,7 @@
|
|
96
135
|
version: '$1'
|
97
136
|
url: 'https://pypi.org/project/httplib2/'
|
98
137
|
|
99
|
-
- regex: 'Python-
|
138
|
+
- regex: 'Python-urllib3?(?:/?(\d+[\.\d]+))?'
|
100
139
|
name: 'Python urllib'
|
101
140
|
version: '$1'
|
102
141
|
|
@@ -121,9 +160,11 @@
|
|
121
160
|
version: '$1'
|
122
161
|
url: 'https://github.com/grpc/grpc-java'
|
123
162
|
|
163
|
+
# java library
|
124
164
|
- regex: '(?:okhttp|network-okhttp3)/([\d\.]+)'
|
125
165
|
name: 'OkHttp'
|
126
166
|
version: '$1'
|
167
|
+
|
127
168
|
- regex: 'okhttp3-([\d\.]+)'
|
128
169
|
name: 'OkHttp'
|
129
170
|
version: '$1'
|
@@ -135,12 +176,12 @@
|
|
135
176
|
- regex: 'HTTP_Request2(?:/(\d+[\.\d]+))?'
|
136
177
|
name: 'HTTP_Request2'
|
137
178
|
version: '$1'
|
138
|
-
url: '
|
179
|
+
url: 'https://pear.php.net/package/http_request2'
|
139
180
|
|
140
181
|
- regex: 'Mechanize(?:/(\d+[\.\d]+))?'
|
141
182
|
name: 'Mechanize'
|
142
183
|
version: '$1'
|
143
|
-
url: '
|
184
|
+
url: 'https://github.com/sparklemotion/mechanize'
|
144
185
|
|
145
186
|
- regex: 'aiohttp(?:/(\d+[\.\d]+))?'
|
146
187
|
name: 'aiohttp'
|
@@ -174,14 +215,14 @@
|
|
174
215
|
name: 'HTTPie'
|
175
216
|
version: '$1'
|
176
217
|
|
177
|
-
- regex: 'rest-client/(\d
|
218
|
+
- regex: 'rest-client/(\d+\.[\.\d]+) .*ruby'
|
178
219
|
name: 'REST Client for Ruby'
|
179
220
|
version: '$1'
|
180
221
|
|
181
222
|
- regex: 'RestSharp/(\d+[\.\d]+)'
|
182
223
|
name: 'RestSharp'
|
183
224
|
version: '$1'
|
184
|
-
url: '
|
225
|
+
url: 'https://github.com/restsharp/RestSharp'
|
185
226
|
|
186
227
|
- regex: 'scalaj-http/(\d+[\.\d]+)'
|
187
228
|
name: 'ScalaJ HTTP'
|
@@ -193,7 +234,7 @@
|
|
193
234
|
version: '$1'
|
194
235
|
url: 'https://metacpan.org/pod/REST::Client'
|
195
236
|
|
196
|
-
- regex: 'node-fetch
|
237
|
+
- regex: 'node-fetch/?(\d+[\.\d]+)?'
|
197
238
|
name: 'Node Fetch'
|
198
239
|
version: '$1'
|
199
240
|
url: 'https://github.com/node-fetch/node-fetch'
|
@@ -249,7 +290,7 @@
|
|
249
290
|
name: 'Aria2'
|
250
291
|
version: '$1'
|
251
292
|
|
252
|
-
- regex: 'BTWebClient/'
|
293
|
+
- regex: '(?:BTWebClient/|^uTorrent/)'
|
253
294
|
name: 'uTorrent'
|
254
295
|
version: ''
|
255
296
|
|
@@ -281,7 +322,7 @@
|
|
281
322
|
name: 'jsdom'
|
282
323
|
version: '$1'
|
283
324
|
|
284
|
-
# hackney (https://github.com/benoitc/hackney)
|
325
|
+
# hackney (https://github.com/benoitc/hackney) (elixir)
|
285
326
|
- regex: 'hackney/([\.\d]+)'
|
286
327
|
name: 'hackney'
|
287
328
|
version: '$1'
|
@@ -372,3 +413,110 @@
|
|
372
413
|
- regex: 'axios(?:/?(\d+[\.\d]+))?'
|
373
414
|
name: Axios
|
374
415
|
version: '$1'
|
416
|
+
|
417
|
+
# Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks
|
418
|
+
- regex: '^CarrierWave/(\d+\.[.\d]+)'
|
419
|
+
name: 'CarrierWave'
|
420
|
+
version: '$1'
|
421
|
+
|
422
|
+
- regex: '^Deno/(\d+\.[.\d]+)'
|
423
|
+
name: 'Deno'
|
424
|
+
version: '$1'
|
425
|
+
|
426
|
+
# Streaming downloads using net/http, http.rb, HTTPX or wget (ruby)
|
427
|
+
- regex: '^Down/(\d+\.[.\d]+)'
|
428
|
+
name: 'Down'
|
429
|
+
version: '$1'
|
430
|
+
|
431
|
+
# various programs can use this, like vlc, but the underlying lib is ffmpeg
|
432
|
+
- regex: '^Lavf/'
|
433
|
+
name: 'ffmpeg'
|
434
|
+
version: '$1'
|
435
|
+
|
436
|
+
- regex: '^FileDownloader/(\d+\.[.\d]+)'
|
437
|
+
name: 'FileDownloader'
|
438
|
+
version: '$1'
|
439
|
+
|
440
|
+
# Allows managing large files with git, without storing the file contents in git
|
441
|
+
- regex: '^git-annex/(\d+\.[.\d]+)'
|
442
|
+
name: 'git-annex'
|
443
|
+
version: '$1'
|
444
|
+
|
445
|
+
- regex: '^GStreamer(?: souphttpsrc)[ /](\d+\.[.\d]+)?'
|
446
|
+
name: 'GStreamer'
|
447
|
+
version: '$1'
|
448
|
+
|
449
|
+
# A small, simple, correct HTTP/1.1 client (Perl)
|
450
|
+
- regex: '^HTTP-Tiny/(\d+\.[.\d]+)'
|
451
|
+
name: 'HTTP:Tiny'
|
452
|
+
version: '$1'
|
453
|
+
|
454
|
+
- regex: 'KaiOS Downloader'
|
455
|
+
name: 'KaiOS Downloader'
|
456
|
+
version: ''
|
457
|
+
|
458
|
+
# HTTP client/server library for GNOME
|
459
|
+
- regex: '^libsoup/(\d+\.[.\d]+)'
|
460
|
+
name: 'libsoup'
|
461
|
+
version: '$1'
|
462
|
+
|
463
|
+
- regex: '^Android\.LVLDM$'
|
464
|
+
name: 'Android License Verification Library'
|
465
|
+
version: '$1'
|
466
|
+
|
467
|
+
# A file downloader library for Android with pause and resume support
|
468
|
+
- regex: '^PRDownloader$'
|
469
|
+
name: 'PRDownloader'
|
470
|
+
version: ''
|
471
|
+
|
472
|
+
# a rust http library
|
473
|
+
- regex: '^reqwest/(\d+\.[.\d]+)'
|
474
|
+
name: 'reqwest'
|
475
|
+
version: '$1'
|
476
|
+
|
477
|
+
# lua http library
|
478
|
+
- regex: '^resty-requests'
|
479
|
+
name: 'resty-requests'
|
480
|
+
version: ''
|
481
|
+
|
482
|
+
# ruby core lib http download
|
483
|
+
- regex: '^Ruby'
|
484
|
+
name: 'ruby'
|
485
|
+
version: ''
|
486
|
+
|
487
|
+
# SFSafariViewController, some safari service
|
488
|
+
- regex: '^SafariViewService/(\d+\.[.\d]+)'
|
489
|
+
name: 'Safari View Service'
|
490
|
+
version: '$1'
|
491
|
+
|
492
|
+
# a nodejs lib
|
493
|
+
- regex: '^undici$'
|
494
|
+
name: 'undici'
|
495
|
+
version: ''
|
496
|
+
|
497
|
+
# URL, an emacs plugin
|
498
|
+
- regex: '^URL/Emacs Emacs/(\d+\.[.\d]+)'
|
499
|
+
name: 'Emacs'
|
500
|
+
version: '$1'
|
501
|
+
|
502
|
+
- regex: '^FDM[ /]([\d\.]+)'
|
503
|
+
name: 'Free Download Manager'
|
504
|
+
version: '$1'
|
505
|
+
|
506
|
+
# 'https://github.com/lingochamp/okdownload'
|
507
|
+
- regex: 'OkDownload/([\d\.]+)'
|
508
|
+
name: 'OKDownload Library'
|
509
|
+
version: '$1'
|
510
|
+
|
511
|
+
# podcast host https://libsyn.com (probably an importer)
|
512
|
+
- regex: '^Libsyn4-?(?:peek|download)$'
|
513
|
+
name: 'Libsyn'
|
514
|
+
version: ''
|
515
|
+
|
516
|
+
# any ios application that uses apple core media but doesn't set its user
|
517
|
+
# agent will default to this, always with 1.0.0 version.
|
518
|
+
# there was a time when (not even that long ago) apple didn't let you set
|
519
|
+
# a user agent so a ton of random applications still identify themselves this way.
|
520
|
+
- regex: 'AppleCoreMedia/1\.0\.0'
|
521
|
+
name: 'iOS Application'
|
522
|
+
version: ''
|
@@ -77,6 +77,10 @@
|
|
77
77
|
name: 'Winamp'
|
78
78
|
version: '$1'
|
79
79
|
|
80
|
+
- regex: 'J\. River Internet Reader/(\d+\.[.\d]+)'
|
81
|
+
name: 'JRiver Media Center'
|
82
|
+
version: '$1'
|
83
|
+
|
80
84
|
- regex: '(?:Windows-Media-Player|NSPlayer)(?:/(\d+[\.\d]+))?'
|
81
85
|
name: 'Windows Media Player'
|
82
86
|
version: '$1'
|
@@ -124,3 +128,46 @@
|
|
124
128
|
- regex: 'Downcast/(\d+\.[\d\.]+)?'
|
125
129
|
name: 'Downcast'
|
126
130
|
version: '$1'
|
131
|
+
|
132
|
+
- regex: '^Juice/([\d\.]+)'
|
133
|
+
name: 'Juice'
|
134
|
+
version: '$1'
|
135
|
+
|
136
|
+
- regex: 'just_audio/(\d+\.[.\d]+)'
|
137
|
+
name: 'Just Audio'
|
138
|
+
version: '$1'
|
139
|
+
|
140
|
+
# https://apps.kde.org/kasts/ ?
|
141
|
+
- regex: '^Kasts/(\d+\.[.\d]+)'
|
142
|
+
name: 'Kasts'
|
143
|
+
version: '$1'
|
144
|
+
|
145
|
+
- regex: 'MixerBox(?:%20Pro)?/([.\d]+)'
|
146
|
+
name: 'MixerBox'
|
147
|
+
version: '$1'
|
148
|
+
|
149
|
+
- regex: '^MusicBee(?:/(\d+\.[.\d]+))?'
|
150
|
+
name: 'MusicBee'
|
151
|
+
version: '$1'
|
152
|
+
|
153
|
+
- regex: '^amarok/(\d+\.[.\d]+)'
|
154
|
+
name: 'Amarok'
|
155
|
+
version: '$1'
|
156
|
+
|
157
|
+
- regex: 'Hubhopper/([\d\.]+)'
|
158
|
+
name: 'Hubhopper'
|
159
|
+
version: '$1'
|
160
|
+
|
161
|
+
- regex: 'StudioDisplay/(\d+\.[\d\.]+)'
|
162
|
+
name: 'StudioDisplay'
|
163
|
+
version: '$1'
|
164
|
+
|
165
|
+
# JHelioviewer (https://www.jhelioviewer.org/)
|
166
|
+
- regex: 'JHV/SWHV-([.\d+]+)'
|
167
|
+
name: 'JHelioviewer'
|
168
|
+
version: '$1'
|
169
|
+
|
170
|
+
# Xtream Player (https://play.google.com/store/apps/details?id=com.devcoder.iptvxtreamplayer)
|
171
|
+
- regex: 'com.devcoder.iptvxtreamplayer'
|
172
|
+
name: 'Xtream Player'
|
173
|
+
version: ''
|