browserx 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +29 -0
  3. data/LICENSE.md +21 -0
  4. data/README.md +438 -0
  5. data/bot_exceptions.yml +5 -0
  6. data/bots.yml +327 -0
  7. data/languages.yml +113 -0
  8. data/lib/browser/accept_language.rb +55 -0
  9. data/lib/browser/action_controller.rb +20 -0
  10. data/lib/browser/aliases.rb +33 -0
  11. data/lib/browser/alipay.rb +21 -0
  12. data/lib/browser/base.rb +292 -0
  13. data/lib/browser/blackberry.rb +23 -0
  14. data/lib/browser/bot/empty_user_agent_matcher.rb +11 -0
  15. data/lib/browser/bot/keyword_matcher.rb +11 -0
  16. data/lib/browser/bot/known_bots_matcher.rb +11 -0
  17. data/lib/browser/bot.rb +119 -0
  18. data/lib/browser/browser.rb +116 -0
  19. data/lib/browser/chrome.rb +43 -0
  20. data/lib/browser/detect_version.rb +22 -0
  21. data/lib/browser/device/android.rb +20 -0
  22. data/lib/browser/device/base.rb +13 -0
  23. data/lib/browser/device/blackberry_playbook.rb +19 -0
  24. data/lib/browser/device/ipad.rb +19 -0
  25. data/lib/browser/device/iphone.rb +19 -0
  26. data/lib/browser/device/ipod_touch.rb +19 -0
  27. data/lib/browser/device/kindle.rb +19 -0
  28. data/lib/browser/device/kindle_fire.rb +19 -0
  29. data/lib/browser/device/playstation3.rb +19 -0
  30. data/lib/browser/device/playstation4.rb +19 -0
  31. data/lib/browser/device/psp.rb +19 -0
  32. data/lib/browser/device/psvita.rb +19 -0
  33. data/lib/browser/device/samsung.rb +33 -0
  34. data/lib/browser/device/surface.rb +23 -0
  35. data/lib/browser/device/switch.rb +19 -0
  36. data/lib/browser/device/tv.rb +19 -0
  37. data/lib/browser/device/unknown.rb +19 -0
  38. data/lib/browser/device/wii.rb +19 -0
  39. data/lib/browser/device/wiiu.rb +19 -0
  40. data/lib/browser/device/xbox_360.rb +19 -0
  41. data/lib/browser/device/xbox_one.rb +19 -0
  42. data/lib/browser/device.rb +222 -0
  43. data/lib/browser/duck_duck_go.rb +22 -0
  44. data/lib/browser/edge.rb +25 -0
  45. data/lib/browser/electron.rb +22 -0
  46. data/lib/browser/epiphany.rb +21 -0
  47. data/lib/browser/facebook.rb +23 -0
  48. data/lib/browser/firefox.rb +21 -0
  49. data/lib/browser/google_search_app.rb +21 -0
  50. data/lib/browser/huawei_browser.rb +21 -0
  51. data/lib/browser/instagram.rb +21 -0
  52. data/lib/browser/internet_explorer.rb +63 -0
  53. data/lib/browser/maxthon.rb +21 -0
  54. data/lib/browser/meta/base.rb +42 -0
  55. data/lib/browser/meta/device.rb +11 -0
  56. data/lib/browser/meta/generic_browser.rb +15 -0
  57. data/lib/browser/meta/id.rb +11 -0
  58. data/lib/browser/meta/ie.rb +20 -0
  59. data/lib/browser/meta/ios.rb +11 -0
  60. data/lib/browser/meta/mobile.rb +11 -0
  61. data/lib/browser/meta/platform.rb +11 -0
  62. data/lib/browser/meta/proxy.rb +11 -0
  63. data/lib/browser/meta/safari.rb +11 -0
  64. data/lib/browser/meta/tablet.rb +11 -0
  65. data/lib/browser/meta/webkit.rb +11 -0
  66. data/lib/browser/meta.rb +14 -0
  67. data/lib/browser/micro_messenger.rb +21 -0
  68. data/lib/browser/middleware/context/additions.rb +18 -0
  69. data/lib/browser/middleware/context/url_methods.rb +15 -0
  70. data/lib/browser/middleware/context.rb +22 -0
  71. data/lib/browser/middleware.rb +70 -0
  72. data/lib/browser/miui_browser.rb +21 -0
  73. data/lib/browser/nokia.rb +21 -0
  74. data/lib/browser/opera.rb +21 -0
  75. data/lib/browser/otter.rb +21 -0
  76. data/lib/browser/phantom_js.rb +21 -0
  77. data/lib/browser/platform/adobe_air.rb +23 -0
  78. data/lib/browser/platform/android.rb +23 -0
  79. data/lib/browser/platform/base.rb +18 -0
  80. data/lib/browser/platform/blackberry.rb +23 -0
  81. data/lib/browser/platform/chrome_os.rb +23 -0
  82. data/lib/browser/platform/firefox_os.rb +23 -0
  83. data/lib/browser/platform/ios.rb +36 -0
  84. data/lib/browser/platform/kai_os.rb +23 -0
  85. data/lib/browser/platform/linux.rb +23 -0
  86. data/lib/browser/platform/mac.rb +25 -0
  87. data/lib/browser/platform/unknown.rb +23 -0
  88. data/lib/browser/platform/windows.rb +23 -0
  89. data/lib/browser/platform/windows_mobile.rb +23 -0
  90. data/lib/browser/platform/windows_phone.rb +23 -0
  91. data/lib/browser/platform.rb +193 -0
  92. data/lib/browser/qq.rb +25 -0
  93. data/lib/browser/rails.rb +23 -0
  94. data/lib/browser/safari.rb +40 -0
  95. data/lib/browser/samsung_browser.rb +21 -0
  96. data/lib/browser/snapchat.rb +21 -0
  97. data/lib/browser/sougou_browser.rb +24 -0
  98. data/lib/browser/sputnik.rb +21 -0
  99. data/lib/browser/testing.rb +27 -0
  100. data/lib/browser/uc_browser.rb +21 -0
  101. data/lib/browser/unknown.rb +32 -0
  102. data/lib/browser/version.rb +5 -0
  103. data/lib/browser/weibo.rb +21 -0
  104. data/lib/browser/yandex.rb +21 -0
  105. data/lib/browser.rb +4 -0
  106. data/lib/browserx.rb +3 -0
  107. data/samsung.yml +138 -0
  108. data/search_engines.yml +7 -0
  109. data/test/ua.yml +181 -0
  110. data/test/ua_bots.yml +121 -0
  111. data/test/ua_search_engines.yml +7 -0
  112. metadata +267 -0
data/bots.yml ADDED
@@ -0,0 +1,327 @@
1
+ ---
2
+ 200pleasebot: 200PleaseBot
3
+ 360spider: 360Spider
4
+ abot: CrawlDaddy, abot
5
+ addthis: AddThis
6
+ adldxbot: Microsoft Bing Ads
7
+ admantx: ADmantX Platform Semantic Analyzer
8
+ adsbot-google: Google Adwords
9
+ adstxtcrawler: AdsTxtCrawler
10
+ advbot: AdvBot
11
+ ahrefsbot: Ahrefs backlinks research tool
12
+ alexa: Alexa Crawler
13
+ anderspink: AndersPinkBot
14
+ apache-httpclient: Java http library
15
+ apachebench: ApacheBench (ab)
16
+ apis-google: APIs-Google
17
+ appengine-google: Google App Engine
18
+ applebot: Apple Bot
19
+ appsignal: AppSignal Bot
20
+ archive.org_bot: Internet Archive (archive.org)
21
+ archiveteam archivebot: ArchiveTeam ArchiveBot
22
+ ask jeeves: Ask Jeeves
23
+ asynchttpclient: Java http and WebSocket client library
24
+ awe.sm: Awe.sm URL expander
25
+ baidu: Baidu
26
+ barkrowler: Barkrowler
27
+ bdcbot: Big Data Corp
28
+ bingbot: Microsoft Bing
29
+ bingpreview: Microsoft Bing preview
30
+ bitlybot: bit.ly bot
31
+ blekkobot: Blekkobot
32
+ blexbot: BLEXBot (webmeup)
33
+ bot@linkfluence.net: Linkfluence bot
34
+ bubing: BUbiNG
35
+ bufferbot: BufferBot
36
+ buibui-checkbot: buibui
37
+ butterfly: Topsy Labs
38
+ buzzbot: Buzzbot
39
+ buzztalk: buzztalk
40
+ catchbot: CatchBot (catchbot.com)
41
+ check_http: Nagios monitor
42
+ checkly: Checkly
43
+ chrome-lighthouse: Chrome-Lighthouse
44
+ cipacrawler: CipaCrawler
45
+ cliqzbot: Cliqzbot
46
+ cloudflare: CloudFlare-AlwaysOnline
47
+ cmradar/0.1: CMRadar/0.1
48
+ coldfusion: ColdFusion http library
49
+ commoncrawl: CCBot
50
+ comodo ssl checker: COMODO SSL Checker
51
+ comodo-webinspector-crawler: Comodo
52
+ copypants: BotPants
53
+ crowsnest: Crowsnest
54
+ curabot: cura.yt
55
+ curl: curl unix CLI http client
56
+ dap/nethttp: DAP/NetHTTP
57
+ datafeedwatch: DataFeedWatch
58
+ datagnionbot: datagnion.com/bot.html
59
+ datanyze: Datanyze
60
+ daumoa: Korean portal and search engine indexing bot
61
+ developers.google.com/+/web/snippet/: Google Plus
62
+ diffbot: Diffbot
63
+ digitalpersona fingerprint software: HP Fingerprint scanner
64
+ domain re-animator bot: Domain Re-Animator Bot
65
+ domainsbot: DomainsBot
66
+ domaintunocrawler: DomainTuno
67
+ dotbot: Dot Bot
68
+ duckduckbot: Duck Duck Go
69
+ elb-healthchecker: AWS ELB HealthChecker
70
+ embedly: Embedly
71
+ eoaagent: EOAAgent
72
+ everyonesocialbot: EveryoneSocial
73
+ evrinid: Evri bot
74
+ exabot: Exalead's bot
75
+ exaleadcloudview: ExaleadCloudView
76
+ ez publish: eZ Publish Link Validator
77
+ facebookexternalhit: Facebook Bot
78
+ facebot: Facebook Bot
79
+ feedburner: RSS bot
80
+ feedfetcher-google: Google Feedfetcher
81
+ findxbot: Findxbot
82
+ flipboardproxy: FlipboardProxy
83
+ friendfeedbot: FriendFeed
84
+ fyrebot: Fyrebot
85
+ garlik: GarlikCrawler
86
+ genieo: Genieo Web filter bot
87
+ germcrawler: GermCrawler
88
+ getprismatic.com: getprismatic.com
89
+ gigabot: Gigabot spider
90
+ gimme60bot: Gimme60 (gimme60.com)
91
+ gimmeusabot: Gimme60 (gimme60.com)
92
+ go http package: Go http library
93
+ go-http-client: Go http client
94
+ google page speed insights: Google Page Speed Insights
95
+ google web preview: Google Instant Previews crawler
96
+ google-site-verification: Google Site Verification
97
+ google-structured-data-testing-tool: Google Structured Data Testing Tool
98
+ google-structureddatatestingtool: Google Structured Data Testing Tool
99
+ google-xrawler: Google Shopping
100
+ googlebot: Google Bot
101
+ googleimageproxy: Google Image Proxy
102
+ googlestackdrivermonitoring-uptimechecks: Google Stackdriver Monitoring - Uptime Checks
103
+ grapeshotcrawler: GrapeshotCrawler
104
+ gravitybot: Gravity Bot
105
+ hatena::bookmark: Hatena::Bookmark
106
+ heritrix: heritrix
107
+ https://developers.google.com/+/web/snippet: Google+ Snippet Fetcher
108
+ httrack: HTTrack
109
+ hubspot: HubSpot
110
+ ia_archiver: Internet Archive (WayBackMachine)
111
+ icoreservice: iCoreService
112
+ idmarch: idmarch.org/bot.html
113
+ implisensebot: ImplisenseBot
114
+ inagist: URL resolver
115
+ insieve: Insieve Bot
116
+ insitesbot: Insitesbot
117
+ instapaper: Instapaper
118
+ istellabot: IstellaBot
119
+ jaunt: Jaunt - Java Web Scraping & JSON Querying
120
+ jetslide: Jetslide
121
+ jobseeker: jobseeker.com.au/bot.html
122
+ jooble: Jooble
123
+ js-kit: URL resolver
124
+ kemvibot: Kemvi
125
+ kimengi: Kimengi Bot
126
+ knows.is: knows.is
127
+ kojitsubot: Kojitsubot
128
+ komodiabot: KomodiaBot
129
+ kraken: kraken
130
+ laconica: Laconica
131
+ lijit crawler: Lijit
132
+ linkdexbot: Linkdex Bot
133
+ linkedinbot: LinkedIn
134
+ linkscrawler: LinksCrawler
135
+ linode: Linode Longview
136
+ lipperhey: Lipperhey
137
+ livelapbot: Livelapbot
138
+ loadtimebot: Load Time Bot
139
+ longurl: URL expander service
140
+ ltx71: ltx71.com
141
+ lumibot: Lumibot
142
+ magpie-crawler: magpie-crawler
143
+ mail.ru_bot: Mail.ru Bot
144
+ mappydata: Mappy
145
+ mastodon: Mastodon URL expander
146
+ mauibot: MauiBot
147
+ meanpathbot: meanpath
148
+ mediapartners-google: Google Adsense bot
149
+ megaindex.ru: MegaIndex
150
+ memorybot: mignify.com/bot.html
151
+ metauri: MetaURI
152
+ mfe_expand: Mcafee spider
153
+ mir web crawler: MIR web crawler
154
+ mj12bot: Majestic-12 spider
155
+ mojeekbot: Mojeek UK search crawler
156
+ ms search 6.0 robot: MS Search 6.0 Robot
157
+ msnbot-media: Microsoft media bot
158
+ msnbot: Microsoft bot
159
+ nerdybot: NerdyBot
160
+ netcraft: Netcraft
161
+ netstate: netEstate NE Crawler
162
+ netvibes: Personalized dashboard bot
163
+ netzcheckbot: netzcheck
164
+ newrelicmonitor: NewRelic monitor
165
+ newrelicpinger: NewRelicPinger
166
+ newsme: newsme
167
+ niki-bot: niki-bot
168
+ ning: NING - Yet Another Twitter Swarmer
169
+ nutch: Apache search spider
170
+ openhosebot: OpenHoseBot
171
+ orangebot: OrangeBot
172
+ paessler: paessler.com - PRTG Network Monitor
173
+ pagesinventory: pagesinventory.com
174
+ panopta: Monitoring service
175
+ paperlibot: PaperLi
176
+ peerindex: peerindex
177
+ percolatecrawler: PercolateCrawler
178
+ perfectmarketkwtbot: PerfectMarket
179
+ phantomjs: PhantomJS
180
+ pingdom: Pingdom monitoring
181
+ pinterest: Pinterest
182
+ plukkie: botje.com/plukkie.htm
183
+ pr-cy.ru: PR-CY.RU
184
+ privacyawarebot: PrivacyAwareBot
185
+ proximic: Proximic Spider
186
+ psbot-page: Picsearch
187
+ pu_in: Pu_iN Crawler
188
+ publiclibraryarchive.org: publiclibraryarchive.org
189
+ pycurl: Python http library
190
+ python-httplib2: Python-httplib2
191
+ python-requests: Python http library
192
+ python-urllib: Python http library
193
+ queryseeker: QuerySeekerSpider
194
+ quick-crawler: Quick-Crawler
195
+ quicklook: QuickLook
196
+ re-animator: Domain Re-Animator Bot
197
+ readability: Readability
198
+ rebelmouse: RebelMouse
199
+ redditbot: Reddit Bot
200
+ relateiq: RelateIQ
201
+ riddler: Riddler Bot
202
+ rogerbot: SeoMoz spider
203
+ rssmicro: RSS/Atom Feed Robot (rssmicro.com)
204
+ scouturlmonitor: ScoutURLMonitor
205
+ scrapy: Scrapy
206
+ screaming frog seo spider: Screaming Frog SEO Spider
207
+ searchmetricsbot: SearchmetricsBot
208
+ semanticbot: Semanticbot
209
+ semrushbot: SEO analysis bot
210
+ seo-audit: seo-audit-check-bot
211
+ seobilitybot: SeobilityBot
212
+ seodiver: SEOdiver
213
+ seokicks: SEOKicks
214
+ seznambot: SeznamBot
215
+ shopwiki: ShopWiki
216
+ shortlinktranslate: Link shortener
217
+ showyoubot: Showyou iOS app spider
218
+ siege: Joe Dog Siege
219
+ sistrix: SISTRIX
220
+ sitecheck: SiteCheck sitecrawl
221
+ siteuptime: Site monitoring services
222
+ skypeuripreview: SkypeUriPreview
223
+ slack-imgproxy: Slack Image Proxy
224
+ slack-linkexpanding: Slack Link Expanding
225
+ slack: Slack Link Expanding
226
+ slackbot: Slackbot
227
+ slurp: Yahoo spider
228
+ smtbot: SimilarTech
229
+ snapchat: Snapchat
230
+ socialrank: SocialRankIOBot
231
+ sogou: Chinese search engine
232
+ spbot: OpenLinkProfiler
233
+ spinn3r: Spinn3r aggregator
234
+ sputnikbot: SputnikBot
235
+ squider: Squider
236
+ statuscake: StatusCake
237
+ swiftbot: Swiftype Bot
238
+ tangibleebot: TangibleeBot
239
+ teeraid: TeeRaidBot
240
+ test certificate info: C http library?
241
+ the knowledge ai: Knowledge AI Bot
242
+ tineye: TinEye Bot
243
+ traackr: Traackr Bot
244
+ trendictionbot: Trendiction Search
245
+ trendsmap: Trendsmap Resolver
246
+ turnitinbot: TurnitinBot
247
+ tweetedtimes: The Tweeted Times
248
+ tweetmemebot: TweetMeMe Crawler
249
+ twikle: Social web search bot
250
+ twitjobsearch: TwitJobSearch
251
+ twitmunin: Twitmunin
252
+ twitterbot: Twitter URL expander
253
+ twurly: Twurly
254
+ typhoeus: Typhoeus
255
+ umbot: uberMetrics
256
+ unwindfetch: Gnip
257
+ updown: Updown.io monitor
258
+ uptimerobot: Uptime Robot
259
+ vagabondo: Vagabondo
260
+ vb project: Visual Basic
261
+ vigil: Vigil
262
+ vkshare: VKontake Sharer
263
+ voilabot: VoilaBot
264
+ vrcrawler: Venture Radar
265
+ wasalive-bot: Wasalive Bots
266
+ watchsumo: WatchSumo
267
+ wbsearchbot: Ware Bay Best Buys
268
+ webceo: online-webceo-bot
269
+ webscout: Webscout
270
+ wesee: WeSEE
271
+ wget: wget unix CLI http client
272
+ whatsapp: WhatsApp
273
+ wikido: WikiDo
274
+ woorank: WooRank
275
+ wordpress: WordPress spider
276
+ woriobot: woriobot
277
+ wormly: WormlyBot
278
+ wotbox: Wotbox
279
+ xenu link sleuth: Xenu Link Sleuth
280
+ xing-contenttabreceiver: Xing bot
281
+ xovibot: XoviBot
282
+ yacybot: YaCy
283
+ yahoo-ad-monitoring: Yahoo Ad monitoring
284
+ yandex: Yandex
285
+ yanga: Yanga WorldSearch Bot
286
+ yeti: Naver Corp
287
+ yourls: YOURLS
288
+ zabbix: Zabbix
289
+ zelist.ro: feed parser
290
+ zibb: ZIBB spider
291
+ zitebot: Zite
292
+ zoombot: ZoomBot
293
+ zoominfobot: ZoominfoBot
294
+ zyborg: Zyborg
295
+
296
+ # AI Crawlers
297
+ # https://darkvisitors.com
298
+ amazonbot: Amazon
299
+ anthropic-ai: Anthropic-AI
300
+ applebot: Apple
301
+ bytespider: TikTok
302
+ ccbot: Common Crawl
303
+ chatgpt-user: ChatGPT
304
+ claude-web: Anthropic-AI
305
+ cohere-ai: Cohere
306
+ diffbot: Diffbot
307
+ facebookbot: Facebook
308
+ google-extended: Google
309
+ googleother: Google
310
+ gptbot: ChatGPT
311
+ omgili: Webz.io
312
+ perplexitybot: Perplexity
313
+ webz.io: Webz.io
314
+ youbot: You.com
315
+
316
+ # Generic lib user agents go here.
317
+ httpie: HTTPie
318
+ eventmachine httpclient: Ruby http library
319
+ go 1.1 package http: Go 1.1 package http
320
+ htmlparser: HTMLParser
321
+ http_request2: HTTP_Request2
322
+ httpclient: HTTPClient
323
+ jakarta commons: Jakarta Commons HttpClient
324
+ java: Generic Java http library
325
+ libwww-perl: Perl client-server library
326
+ lwp-trivial: Another Perl library
327
+ ruby: Ruby
data/languages.yml ADDED
@@ -0,0 +1,113 @@
1
+ "af": "Afrikaans"
2
+ "sq": "Albanian"
3
+ "eu": "Basque"
4
+ "bg": "Bulgarian"
5
+ "be": "Byelorussian"
6
+ "ca": "Catalan"
7
+ "zh": "Chinese"
8
+ "zh-CN": "Chinese/China"
9
+ "zh-TW": "Chinese/Taiwan"
10
+ "zh-HK": "Chinese/Hong Kong"
11
+ "zh-SG": "Chinese/singapore"
12
+ "hr": "Croatian"
13
+ "cs": "Czech"
14
+ "da": "Danish"
15
+ "nl": "Dutch"
16
+ "nl-NL": "Dutch/Netherlands"
17
+ "nl-BE": "Dutch/Belgium"
18
+ "en": "English"
19
+ "en-GB": "English/United Kingdom"
20
+ "en-US": "English/United States"
21
+ "en-AU": "English/Australian"
22
+ "en-CA": "English/Canada"
23
+ "en-NZ": "English/New Zealand"
24
+ "en-IE": "English/Ireland"
25
+ "en-ZA": "English/South Africa"
26
+ "en-JM": "English/Jamaica"
27
+ "en-BZ": "English/Belize"
28
+ "en-TT": "English/Trinidad"
29
+ "et": "Estonian"
30
+ "fo": "Faeroese"
31
+ "fa": "Farsi"
32
+ "fi": "Finnish"
33
+ "fr": "French"
34
+ "fr-BE": "French/Belgium"
35
+ "fr-FR": "French/France"
36
+ "fr-CH": "French/Switzerland"
37
+ "fr-CA": "French/Canada"
38
+ "fr-LU": "French/Luxembourg"
39
+ "gl": "Galician"
40
+ "de": "German"
41
+ "de-AT": "German/Austria"
42
+ "de-DE": "German/Germany"
43
+ "de-CH": "German/Switzerland"
44
+ "de-LU": "German/Luxembourg"
45
+ "de-LI": "German/Liechtenstein"
46
+ "el": "Greek"
47
+ "he": "Hebrew"
48
+ "he-IL": "Hebrew/Israel"
49
+ "hi": "Hindi"
50
+ "hu": "Hungarian"
51
+ "ie-EE": "Internet Explorer/Easter Egg"
52
+ "is": "Icelandic"
53
+ "id": "Indonesian"
54
+ "in": "Indonesian"
55
+ "ga": "Irish"
56
+ "it": "Italian"
57
+ "it-CH": "Italian/ Switzerland"
58
+ "ja": "Japanese"
59
+ "km": "Khmer"
60
+ "km-KH": "Khmer/Cambodia"
61
+ "ko": "Korean"
62
+ "lv": "Latvian"
63
+ "lt": "Lithuanian"
64
+ "mk": "Macedonian"
65
+ "ms": "Malaysian"
66
+ "mt": "Maltese"
67
+ "no": "Norwegian"
68
+ "pl": "Polish"
69
+ "pt": "Portuguese"
70
+ "pt-BR": "Portuguese/Brazil"
71
+ "rm": "Rhaeto-Romanic"
72
+ "ro": "Romanian"
73
+ "ro-MO": "Romanian/Moldavia"
74
+ "ru": "Russian"
75
+ "ru-MO": "Russian /Moldavia"
76
+ "gd": "Scots Gaelic"
77
+ "sr": "Serbian"
78
+ "sk": "Slovack"
79
+ "sl": "Slovenian"
80
+ "sb": "Sorbian"
81
+ "es": "Spanish"
82
+ "es-DO": "Spanish"
83
+ "es-AR": "Spanish/Argentina"
84
+ "es-CO": "Spanish/Colombia"
85
+ "es-MX": "Spanish/Mexico"
86
+ "es-ES": "Spanish/Spain"
87
+ "es-GT": "Spanish/Guatemala"
88
+ "es-CR": "Spanish/Costa Rica"
89
+ "es-PA": "Spanish/Panama"
90
+ "es-VE": "Spanish/Venezuela"
91
+ "es-PE": "Spanish/Peru"
92
+ "es-EC": "Spanish/Ecuador"
93
+ "es-CL": "Spanish/Chile"
94
+ "es-UY": "Spanish/Uruguay"
95
+ "es-PY": "Spanish/Paraguay"
96
+ "es-BO": "Spanish/Bolivia"
97
+ "es-SV": "Spanish/El salvador"
98
+ "es-HN": "Spanish/Honduras"
99
+ "es-NI": "Spanish/Nicaragua"
100
+ "es-PR": "Spanish/Puerto Rico"
101
+ "sx": "Sutu"
102
+ "sv": "Swedish"
103
+ "sv-SE": "Swedish/Sweden"
104
+ "sv-FI": "Swedish/Finland"
105
+ "ts": "Thai"
106
+ "tn": "Tswana"
107
+ "tr": "Turkish"
108
+ "uk": "Ukrainian"
109
+ "ur": "Urdu"
110
+ "vi": "Vietnamese"
111
+ "xh": "Xshosa"
112
+ "ji": "Yiddish"
113
+ "zu": "Zulu"
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class AcceptLanguage
5
+ def self.languages
6
+ @languages ||= YAML.load_file(Browser.root.join("languages.yml"))
7
+ end
8
+
9
+ def self.parse(accept_language)
10
+ return [] unless accept_language
11
+
12
+ languages = accept_language.split(",")
13
+ languages.map! { |string| new(string.squeeze(" ").strip) }
14
+ languages.reject! { |al| al.quality.zero? }
15
+ languages.sort_by.with_index { |al, idx| [-al.quality, idx] }
16
+ end
17
+
18
+ attr_reader :part
19
+
20
+ def initialize(part)
21
+ @part = part
22
+ end
23
+
24
+ def full
25
+ @full ||= [code, region].compact.join("-")
26
+ end
27
+
28
+ def name
29
+ self.class.languages[full] || self.class.languages[code]
30
+ end
31
+
32
+ def code
33
+ @code ||= part[/\A([^-;]+)/, 1]&.downcase
34
+ end
35
+
36
+ def region
37
+ @region ||= part[/\A(?:.*?)-([^;-]+)/, 1]&.upcase
38
+ end
39
+
40
+ def quality
41
+ @quality ||= begin
42
+ Float(quality_value || 1.0)
43
+ rescue ArgumentError
44
+ 0.1
45
+ end
46
+ end
47
+
48
+ private def quality_value
49
+ qvalue = part[/;q=([\d.]+)/, 1]
50
+ qvalue = "0.0" if /\A0\.0?\z/.match?(qvalue)
51
+ qvalue = qvalue.squeeze(".") if qvalue
52
+ qvalue
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "action_controller/railtie"
4
+
5
+ module Browser
6
+ module ActionController
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ helper_method(:browser) if respond_to?(:helper_method)
11
+ end
12
+
13
+ private def browser
14
+ @browser ||= Browser.new(
15
+ request.headers["User-Agent"],
16
+ accept_language: request.headers["Accept-Language"]
17
+ )
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../browser"
4
+ require "forwardable"
5
+
6
+ module Browser
7
+ module Aliases
8
+ PLATFORM_ALIASES = %w[
9
+ adobe_air? android? blackberry? chrome_os? firefox_os? ios? ios_app?
10
+ ios_webview? linux? mac? windows10? windows7? windows8? windows8_1?
11
+ windows? windows_mobile? windows_phone? windows_rt?
12
+ windows_touchscreen_desktop? windows_vista? windows_wow64? windows_x64?
13
+ windows_x64_inclusive? windows_xp?
14
+ ].freeze
15
+
16
+ DEVICE_ALIASES = %w[
17
+ blackberry_playbook? console? ipad? iphone? ipod_touch? kindle?
18
+ kindle_fire? mobile? nintendo? nintendo_switch? nintendo_wii?
19
+ nintendo_wiiu? playbook? playstation3? playstation4? playstation?
20
+ playstation_vita? ps3? ps4? psp? psp_vita? silk? surface? tablet? tv?
21
+ vita? wii? wiiu? xbox? xbox_360? xbox_one?
22
+ ].freeze
23
+
24
+ def self.included(target)
25
+ target.class_eval do
26
+ extend Forwardable
27
+
28
+ def_delegators :platform, *PLATFORM_ALIASES
29
+ def_delegators :device, *DEVICE_ALIASES
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Browser
4
+ class Alipay < Base
5
+ def id
6
+ :alipay
7
+ end
8
+
9
+ def name
10
+ "Alipay"
11
+ end
12
+
13
+ def full_version
14
+ ua[%r{(?:AlipayClient)/([\d.]+)}i, 1] || "0.0"
15
+ end
16
+
17
+ def match?
18
+ ua.match?(/AlipayClient/i)
19
+ end
20
+ end
21
+ end