mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-15 22:52:16 +03:00
Compare commits
269 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a88934fadf | ||
|
|
8cf2a87938 | ||
|
|
b1d6eda6e1 | ||
|
|
a9fc6163b8 | ||
|
|
7ef62a68de | ||
|
|
de3b3bd55e | ||
|
|
700220f2b9 | ||
|
|
90ae87ec17 | ||
|
|
f60fdbefa5 | ||
|
|
97e919024b | ||
|
|
a88b70bdd4 | ||
|
|
89635fcc6e | ||
|
|
b6d2bb5262 | ||
|
|
73192e64d4 | ||
|
|
557c46f413 | ||
|
|
9fb502ea6d | ||
|
|
37cac21d0c | ||
|
|
95f37b4ce5 | ||
|
|
cc479f81ae | ||
|
|
d1a7f365ad | ||
|
|
a4da1e2b65 | ||
|
|
795139e1b8 | ||
|
|
97dc89ae03 | ||
|
|
995e872ff8 | ||
|
|
3bad800860 | ||
|
|
bc4fd7417c | ||
|
|
6f27f8b862 | ||
|
|
df5229cb62 | ||
|
|
732cf5834e | ||
|
|
ddcc29f63f | ||
|
|
ce95d9ac17 | ||
|
|
56978dec0a | ||
|
|
60c4c2b693 | ||
|
|
213d2296df | ||
|
|
ed1ccb3902 | ||
|
|
61e5d24bb5 | ||
|
|
7c5991a725 | ||
|
|
3a5a701375 | ||
|
|
f6ef14d0cd | ||
|
|
7aca357879 | ||
|
|
7f8f357995 | ||
|
|
0fd919bd51 | ||
|
|
a400d2163c | ||
|
|
073c672af5 | ||
|
|
93e17524c0 | ||
|
|
2c7e61f9a2 | ||
|
|
87c6e5c1bd | ||
|
|
b88c52131f | ||
|
|
6c2a767e32 | ||
|
|
7dbf0c6867 | ||
|
|
0304152f72 | ||
|
|
4cc29dd88c | ||
|
|
95fcd3f672 | ||
|
|
d7608d0459 | ||
|
|
f8820389a9 | ||
|
|
46b9f0f2aa | ||
|
|
41ccecadea | ||
|
|
964431ef89 | ||
|
|
bf79eabecc | ||
|
|
01eab85f7d | ||
|
|
384bafe31c | ||
|
|
eb83122c5e | ||
|
|
64bd8a4e60 | ||
|
|
fc4c0df095 | ||
|
|
a142c0ee94 | ||
|
|
5c30aeed59 | ||
|
|
00064be6d6 | ||
|
|
76be1cb328 | ||
|
|
d601ab195f | ||
|
|
ac3b0624b8 | ||
|
|
b49865266c | ||
|
|
565d67bbb6 | ||
|
|
58c71a019e | ||
|
|
8c2607aac9 | ||
|
|
55ffb10a5f | ||
|
|
1493587742 | ||
|
|
f5e0aa83eb | ||
|
|
8fdc32f5b8 | ||
|
|
0059eef770 | ||
|
|
93affc671c | ||
|
|
a3f5efa680 | ||
|
|
4c00ccc6c2 | ||
|
|
34f934fa55 | ||
|
|
218e3a4a3b | ||
|
|
5eda2491b1 | ||
|
|
7acaf9ced8 | ||
|
|
bafac18512 | ||
|
|
ee553df245 | ||
|
|
bc4e75573a | ||
|
|
378dee1aaa | ||
|
|
d413cb0745 | ||
|
|
7fb860f030 | ||
|
|
2e57a9778f | ||
|
|
fb92a46479 | ||
|
|
4790f944bf | ||
|
|
3ed9d3f4ff | ||
|
|
0c6ae1a1e3 | ||
|
|
84bfaaf225 | ||
|
|
9ceb402834 | ||
|
|
a795cf83c4 | ||
|
|
8b54a7256e | ||
|
|
dfb8e758d1 | ||
|
|
083cb66d46 | ||
|
|
50bd78afb1 | ||
|
|
ac7f87f199 | ||
|
|
b367a3f741 | ||
|
|
4bbd7bd27c | ||
|
|
610781dac3 | ||
|
|
1b86f8fb94 | ||
|
|
0413755986 | ||
|
|
618c92aec9 | ||
|
|
7964f909a3 | ||
|
|
934e077aea | ||
|
|
503bb6eb06 | ||
|
|
435335e12f | ||
|
|
a6e1ed6392 | ||
|
|
9dfeee5211 | ||
|
|
ce2a8a3939 | ||
|
|
46dfe2aeb8 | ||
|
|
9c06febfce | ||
|
|
a75de42f8e | ||
|
|
6095258673 | ||
|
|
40aa1a693b | ||
|
|
25e143ee7c | ||
|
|
7bd9ffea24 | ||
|
|
c566f45cbd | ||
|
|
3b89dff771 | ||
|
|
5ba5e7abc9 | ||
|
|
b8978f5933 | ||
|
|
eeb1b9ef81 | ||
|
|
aeae29be66 | ||
|
|
3ce12c0cf9 | ||
|
|
4d95ac10ef | ||
|
|
61b4a089c5 | ||
|
|
74ec93ffb6 | ||
|
|
2c28b3e97e | ||
|
|
459f3d34f5 | ||
|
|
6f621f1ae2 | ||
|
|
7ae3098778 | ||
|
|
806c2b8030 | ||
|
|
cb1a64b509 | ||
|
|
b49cfae4e2 | ||
|
|
91b046462c | ||
|
|
69509af6dd | ||
|
|
225f703b67 | ||
|
|
7f217753f5 | ||
|
|
10f9fb35ca | ||
|
|
5ae468a3d3 | ||
|
|
fd46c4d2be | ||
|
|
297c6538bc | ||
|
|
f9f9fa79e1 | ||
|
|
07fe58b793 | ||
|
|
3a4626b5e8 | ||
|
|
3fd01f07ea | ||
|
|
d103dd5450 | ||
|
|
6cc6742f5e | ||
|
|
cf977c50ed | ||
|
|
4c15b10730 | ||
|
|
a3c7619d3a | ||
|
|
82aba654f9 | ||
|
|
2f1b14906f | ||
|
|
a3a09d33bc | ||
|
|
946ba02c54 | ||
|
|
d2d570fcd5 | ||
|
|
18e08428f4 | ||
|
|
552915907e | ||
|
|
6984de7927 | ||
|
|
7a68f35574 | ||
|
|
2bc75f10bc | ||
|
|
2610f37a8b | ||
|
|
a25bb8b1a6 | ||
|
|
ee2db31f8c | ||
|
|
89775a8ae7 | ||
|
|
7d826ed62e | ||
|
|
a6316f02b0 | ||
|
|
72a11e24b2 | ||
|
|
f7ca724f3b | ||
|
|
8d826fcc24 | ||
|
|
951106c425 | ||
|
|
83ca52bb28 | ||
|
|
6fb4941458 | ||
|
|
48ab3b372c | ||
|
|
38c409e8d9 | ||
|
|
4e2cbdfd16 | ||
|
|
fbe8a0e3a6 | ||
|
|
8e9c400ec5 | ||
|
|
b89fa098aa | ||
|
|
f3882f1882 | ||
|
|
a25426840c | ||
|
|
985a7b18e0 | ||
|
|
8e09cd49e3 | ||
|
|
4768992762 | ||
|
|
f89e08f2c0 | ||
|
|
fe568ffe96 | ||
|
|
252db2534e | ||
|
|
6555bf6e81 | ||
|
|
740fc93b4b | ||
|
|
eed646f9ce | ||
|
|
764de40fe0 | ||
|
|
49609c0990 | ||
|
|
ef69224d7c | ||
|
|
caa2f47c06 | ||
|
|
5177c460a5 | ||
|
|
3e2d5c1817 | ||
|
|
29a0372611 | ||
|
|
2aa2f77881 | ||
|
|
1e228b2fbe | ||
|
|
5379ec8513 | ||
|
|
01ae611dfa | ||
|
|
2de1f2a75d | ||
|
|
975cbdc89e | ||
|
|
507714c3c7 | ||
|
|
2b4a20d162 | ||
|
|
34848e8ec2 | ||
|
|
97b52b2cfd | ||
|
|
9f0419607b | ||
|
|
b13c891d7f | ||
|
|
7f9919f896 | ||
|
|
9fe7561d78 | ||
|
|
b99840d074 | ||
|
|
61b0f1c054 | ||
|
|
58880fda7f | ||
|
|
73735e1ca8 | ||
|
|
0f0ea13fab | ||
|
|
1fb82fb6ff | ||
|
|
88f2f4e24c | ||
|
|
1a4dab5829 | ||
|
|
2467a458e3 | ||
|
|
aadabcce29 | ||
|
|
d0b7c5892f | ||
|
|
d3f959ee28 | ||
|
|
d1a33d7d85 | ||
|
|
3dae55a3c8 | ||
|
|
87b88246a2 | ||
|
|
a56c990ec3 | ||
|
|
458f3c3cd2 | ||
|
|
f28f87c412 | ||
|
|
10775bd17c | ||
|
|
c03a84a601 | ||
|
|
eade7a9355 | ||
|
|
4e0aa0b88b | ||
|
|
4e7c662b0b | ||
|
|
93993dc311 | ||
|
|
55e75dd1b3 | ||
|
|
c71373b666 | ||
|
|
bf4c2e170e | ||
|
|
51b8089958 | ||
|
|
550420d725 | ||
|
|
fbcfe248b8 | ||
|
|
2a5cd4d119 | ||
|
|
c3f7294a44 | ||
|
|
b254f93ec1 | ||
|
|
1020d10a30 | ||
|
|
5ba9fd50ed | ||
|
|
bb69ef2bd4 | ||
|
|
3a457f9bd9 | ||
|
|
d929c3e508 | ||
|
|
0d42b3a752 | ||
|
|
1ec2119288 | ||
|
|
4344c43d04 | ||
|
|
909d6fc26d | ||
|
|
8e46a85549 | ||
|
|
1f92d6148c | ||
|
|
5d57850074 | ||
|
|
8e81811dea | ||
|
|
99a80e88fb | ||
|
|
cbba2f5728 | ||
|
|
2e5dff95c8 | ||
|
|
792dc0246a |
8
.gitignore
vendored
8
.gitignore
vendored
@@ -1,5 +1,6 @@
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
|
||||
### vim ###
|
||||
.*.s[a-w][a-z]
|
||||
*.un~
|
||||
@@ -8,17 +9,20 @@ Session.vim
|
||||
*~
|
||||
.versions
|
||||
|
||||
### editors ###
|
||||
.vscode
|
||||
.idea
|
||||
*.sublime-*
|
||||
|
||||
### OSX ###
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear on external disk
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
.idea
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- stable
|
||||
- "0.10"
|
||||
- lts/*
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
|
||||
30
bower.json
30
bower.json
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "ua-parser-js",
|
||||
"version": "0.7.10",
|
||||
"version": "0.7.20",
|
||||
"authors": [
|
||||
"Faisal Salman <fyzlman@gmail.com>"
|
||||
"Faisal Salman <f@faisalman.com>"
|
||||
],
|
||||
"private": false,
|
||||
"main": "src/ua-parser.js",
|
||||
@@ -13,31 +13,5 @@
|
||||
"test",
|
||||
"tests"
|
||||
],
|
||||
"contributors": [
|
||||
"Faisal Salman <fyzlman@gmail.com>",
|
||||
"Benjamin Bertrand <bertrand.design@gmail.com>",
|
||||
"Carl C Von Lewin <carlchristianlewin@gmail.com>",
|
||||
"Christopher De Cairos <chris.decairos@gmail.com>",
|
||||
"Davit Barbakadze <jayarjo@gmail.com>",
|
||||
"Dmitry Tyschenko <dtyschenko@gmail.com>",
|
||||
"Douglas Li <doug@knotch.it>",
|
||||
"Dumitru Uzun <duzun@mail.ru>",
|
||||
"Erik Hesselink <hesselink@gmail.com>",
|
||||
"Fabian Becker <halfdan@xnorfz.de>",
|
||||
"Hendrik Helwich <h.helwich@iplabs.de>",
|
||||
"Jackpoll <jackpoll123456@gmail.com>",
|
||||
"Jake Mc <startswithaj@users.noreply.github.com>",
|
||||
"John Tantalo <john.tantalo@gmail.com>",
|
||||
"John Yanarella <jmy@codecatalyst.com>",
|
||||
"Jon Buckley <jon@jbuckley.ca>",
|
||||
"Kendall Buchanan <kendall@kendagriff.com>",
|
||||
"Lee Treveil <leetreveil@gmail.com>",
|
||||
"Leonardo <leofiore@libero.it>",
|
||||
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
||||
"Michael Hess <mhess@connectify.me>",
|
||||
"OtakuSiD <otakusid@gmail.com>",
|
||||
"Ross Noble <rosshnoble@gmail.com>",
|
||||
"Sandro Sonntag <sandro.sonntag@adorsys.de>"
|
||||
],
|
||||
"dependencies": {}
|
||||
}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"name": "ua-parser-js",
|
||||
"version": "0.7.10",
|
||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||
"keywords": [
|
||||
"user-agent",
|
||||
"parser",
|
||||
"browser",
|
||||
"engine",
|
||||
"os",
|
||||
"device",
|
||||
"cpu"
|
||||
],
|
||||
"scripts": [
|
||||
"src/ua-parser.js"
|
||||
],
|
||||
"main": "src/ua-parser.js",
|
||||
"license": "MIT",
|
||||
"development": {
|
||||
"jshint/jshint": "*",
|
||||
"visionmedia/mocha": "*",
|
||||
"mishoo/uglifyjs2": "*"
|
||||
}
|
||||
}
|
||||
1
dist/ua-parser.html
vendored
Normal file
1
dist/ua-parser.html
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<script src="./ua-parser.min.js"></script>
|
||||
11
dist/ua-parser.min.js
vendored
11
dist/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
11
dist/ua-parser.pack.js
vendored
11
dist/ua-parser.pack.js
vendored
File diff suppressed because one or more lines are too long
21
license.md
Normal file
21
license.md
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2012-2019 Faisal Salman <<f@faisalman.com>>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,11 +1,12 @@
|
||||
Package.describe({
|
||||
name: 'faisalman:ua-parser-js',
|
||||
version: '0.7.10',
|
||||
version: '0.7.20',
|
||||
summary: 'Lightweight JavaScript-based user-agent string parser',
|
||||
git: 'https://github.com/faisalman/ua-parser-js.git',
|
||||
documentation: 'readme.md'
|
||||
});
|
||||
|
||||
Package.on_use(function (api) {
|
||||
Package.onUse(function (api) {
|
||||
api.addFiles("src/ua-parser.js");
|
||||
api.export("UAParser");
|
||||
});
|
||||
|
||||
95
package.json
95
package.json
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"title": "UAParser.js",
|
||||
"name": "ua-parser-js",
|
||||
"version": "0.7.10",
|
||||
"author": "Faisal Salman <fyzlman@gmail.com> (http://faisalman.com)",
|
||||
"version": "0.7.20",
|
||||
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||
"keywords": [
|
||||
"user-agent",
|
||||
@@ -11,46 +11,100 @@
|
||||
"engine",
|
||||
"os",
|
||||
"device",
|
||||
"cpu"
|
||||
"cpu",
|
||||
"jquery-plugin",
|
||||
"ecosystem:jquery"
|
||||
],
|
||||
"homepage": "http://github.com/faisalman/ua-parser-js",
|
||||
"contributors": [
|
||||
"Faisal Salman <fyzlman@gmail.com>",
|
||||
"Aamir Poonawalla <aamir@urx.com>",
|
||||
"Admas <mollases@users.noreply.github.com>",
|
||||
"algenon <m@antonz.ru>",
|
||||
"Alvin Portillo <portilloalvin@gmail.com>",
|
||||
"Andrea Vaghi <andrea.vaghi@jobrapido.com>",
|
||||
"Anton Zhiyanov <m@antonz.ru>",
|
||||
"Arturo Mejia <amejia@blim.com>",
|
||||
"Arun Rama Reddy <arunramareddy@gmail.com>",
|
||||
"Austin Pray <austin@austinpray.com>",
|
||||
"Benjamin Bertrand <bertrand.design@gmail.com>",
|
||||
"Benjamin Urban <benjamin.urban@sueddeutsche.de>",
|
||||
"boneyao <admin@boneyao.com>",
|
||||
"Carl C Von Lewin <carlchristianlewin@gmail.com>",
|
||||
"CESAR RAMOS <c@imagenproactiva.com>",
|
||||
"Christopher De Cairos <chris.decairos@gmail.com>",
|
||||
"Dario Vladovic <d.vladimyr@gmail.com>",
|
||||
"Davit Barbakadze <jayarjo@gmail.com>",
|
||||
"ddivernois <david-emmanuel.divernois@amadeus.com>",
|
||||
"Demis Palma <demis.palma@gmail.com>",
|
||||
"dhoko <aurelien@protonmail.com>",
|
||||
"dianhe <dianhe@webank.com>",
|
||||
"Dmitry Tyschenko <dtyschenko@gmail.com>",
|
||||
"Douglas Li <doug@knotch.it>",
|
||||
"Dumitru Uzun <contact@duzun.me>",
|
||||
"Eric Schrenker <eric.schrenker@gmail.com>",
|
||||
"Erik Hesselink <hesselink@gmail.com>",
|
||||
"Fabian Becker <halfdan@xnorfz.de>",
|
||||
"Faisal Salman <fyzlman@gmail.com>",
|
||||
"Frédéric Camblor <fcamblor@gmail.com>",
|
||||
"Germán M. Bravo <german.mb@gmail.com>",
|
||||
"Grigory Dmitrenko <grigory@snsk.ru>",
|
||||
"Hendrik Helwich <h.helwich@iplabs.de>",
|
||||
"Jackpoll <jackpoll123456@gmail.com>",
|
||||
"Hermann Ebert <ebbmo@HE.local>",
|
||||
"jackpoll <jackpoll123456@gmail.com>",
|
||||
"Jake Mc <startswithaj@users.noreply.github.com>",
|
||||
"John Tantalo <john.tantalo@gmail.com>",
|
||||
"John Yanarella <jmy@codecatalyst.com>",
|
||||
"Jon Buckley <jon@jbuckley.ca>",
|
||||
"Kendall Buchanan <kendall@kendagriff.com>",
|
||||
"Lee Treveil <leetreveil@gmail.com>",
|
||||
"Leonardo <leofiore@libero.it>",
|
||||
"leonardo <leofiore@libero.it>",
|
||||
"Levente Balogh <balogh.levente.hu@gmail.com>",
|
||||
"Liam Quinn <lquinn@blackberry.com>",
|
||||
"Lithin <lithin@webklipper.com>",
|
||||
"Loris Guignard <loris.guignard@gmail.com>",
|
||||
"Lukas Drgon <lukas.drgon@gmail.com>",
|
||||
"Lukas Eipert <leipert@users.noreply.github.com>",
|
||||
"Malash <i@malash.me>",
|
||||
"Martynas <martynas@firmfirm.co>",
|
||||
"Matt Brophy <matt@brophy.org>",
|
||||
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
||||
"Maximilian Haupt <mail@maximilianhaupt.com>",
|
||||
"Michael Hess <mhess@connectify.me>",
|
||||
"OtakuSiD <otakusid@gmail.com>",
|
||||
"naoh <naoh.cs03g@nctu.edu.tw>",
|
||||
"Nik Rolls <nik@rolls.cc>",
|
||||
"Nikhil Motiani <nikhil.m@247-inc.com>",
|
||||
"niris <nirisix@gmail.com>",
|
||||
"Nobuo Okada <nookada@yahoo-corp.jp>",
|
||||
"otakuSiD <otakusid@gmail.com>",
|
||||
"Peter Dave Hello <PeterDaveHello@users.noreply.github.com>",
|
||||
"philippsimon <github@philippsimon.de>",
|
||||
"Pieter Hendrickx <pieter.hendrickx@belfius.be>",
|
||||
"Piper Chester <piperchester@gmail.com>",
|
||||
"Robert Tod <robert@qubit.com>",
|
||||
"Ron Korland <ron@testim.io>",
|
||||
"Ross Noble <rosshnoble@gmail.com>",
|
||||
"Sandro Sonntag <sandro.sonntag@adorsys.de>"
|
||||
"Sandro Sonntag <sandro.sonntag@adorsys.de>",
|
||||
"sgautrea <shanegautreau@gmail.com>",
|
||||
"Shane Gautreau <sgautrea@opentext.com>",
|
||||
"Shane Thacker <shane@steadymade.com>",
|
||||
"shchotse <topal@mail.ua>",
|
||||
"Simon Eisenmann <simon@longsleep.org>",
|
||||
"Simon Lang <me@simonlang.org>",
|
||||
"Stiekel <histkc@gmail.com>",
|
||||
"Sylvain Gizard <sylvain.gizard@gmail.com>",
|
||||
"szchenghuang <szchenghuang@gmail.com>",
|
||||
"Vadim Kurachevsky <vadim@hmvs.org>",
|
||||
"Yun Young-jin <yupmin@yupmin-office-macmini.local>"
|
||||
],
|
||||
"main": "src/ua-parser.js",
|
||||
"scripts": {
|
||||
"build": "uglifyjs src/ua-parser.js > dist/ua-parser.min.js --comments '/UAParser\\.js/' && uglifyjs src/ua-parser.js > dist/ua-parser.pack.js --comments '/UAParser\\.js/' --compress --mangle",
|
||||
"build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/UAParser\\.js/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/UAParser\\.js/' --compress --mangle",
|
||||
"test": "jshint src/ua-parser.js && mocha -R nyan test/test.js",
|
||||
"verup": "node ./node_modules/verup",
|
||||
"version": "node ./node_modules/verup 0"
|
||||
},
|
||||
"verup": {
|
||||
"files": [
|
||||
"ua-parser-js.jquery.json",
|
||||
"component.json",
|
||||
"bower.json",
|
||||
"package.js",
|
||||
"src/ua-parser.js"
|
||||
@@ -63,23 +117,15 @@
|
||||
"devDependencies": {
|
||||
"jshint": "~1.1.0",
|
||||
"mocha": "~1.8.0",
|
||||
"uglify-js": "~1.3.4",
|
||||
"requirejs": "^2.3.2",
|
||||
"uglify-js": "~2.7.5",
|
||||
"verup": "^1.3.x"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/faisalman/ua-parser-js.git"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "GPLv2",
|
||||
"url": "http://www.gnu.org/licenses/gpl-2.0.html"
|
||||
},
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "http://www.opensource.org/licenses/mit-license.php"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
@@ -87,5 +133,8 @@
|
||||
"dist": "dist",
|
||||
"src": "src",
|
||||
"test": "test"
|
||||
}
|
||||
},
|
||||
"bugs": "https://github.com/faisalman/ua-parser-js/issues",
|
||||
"demo": "https://faisalman.github.io/ua-parser-js",
|
||||
"download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.min.js"
|
||||
}
|
||||
|
||||
179
readme.md
179
readme.md
@@ -1,35 +1,45 @@
|
||||
# UAParser.js
|
||||
|
||||
Lightweight JavaScript-based User-Agent string parser. Supports browser & node.js environment. Also available as jQuery/Zepto plugin, Component/Bower/Meteor package, & RequireJS/AMD module
|
||||
<img align="right" src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/logo.png"> A JavaScript-based User-Agent string parser. Can be used either in browser (client-side) or in node.js (server-side) environment. Also available as jQuery/Zepto plugin, Bower/Meteor package, & RequireJS/AMD module. This library aims to identify detailed type of web browser, layout engine, operating system, cpu architecture, and device type/model, entirely from user-agent string with a relatively small footprint (~17KB when minified / ~6KB gzipped). Written in vanilla JavaScript, which means it doesn't require any other library and can be used independently. However, it's not recommended to use this library as browser detection since the result may not be more accurate than using feature detection.
|
||||
|
||||
[](https://travis-ci.org/faisalman/ua-parser-js)
|
||||
[](http://flattr.com/thing/3867907/faisalmanua-parser-js-on-GitHub)
|
||||
[](https://www.npmjs.com/package/ua-parser-js)
|
||||
[](https://www.npmjs.com/package/ua-parser-js)
|
||||
[](https://bower.io/)
|
||||
[](https://cdnjs.com/libraries/UAParser.js)
|
||||
|
||||
* Author : Faisal Salman <<fyzlman@gmail.com>>
|
||||
* Author : Faisal Salman <<f@faisalman.com>>
|
||||
* Demo : http://faisalman.github.io/ua-parser-js
|
||||
* Source : https://github.com/faisalman/ua-parser-js
|
||||
|
||||
## Features
|
||||
# Constructor
|
||||
|
||||
Extract detailed type of web browser, layout engine, operating system, cpu architecture, and device type/model purely from user-agent string with relatively lightweight footprint (~11KB minified / ~4KB gzipped). Written in vanilla js, which means it doesn't depends on any other library.
|
||||
* `new UAParser([uastring][,extensions])`
|
||||
* returns new instance
|
||||
|
||||

|
||||
* `UAParser([uastring][,extensions])`
|
||||
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
||||
|
||||
## Methods
|
||||
# Methods
|
||||
|
||||
* `getBrowser()`
|
||||
* returns `{ name: '', version: '' }`
|
||||
|
||||
```
|
||||
```sh
|
||||
# Possible 'browser.name':
|
||||
Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome,
|
||||
Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec,
|
||||
Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,
|
||||
Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,
|
||||
Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,
|
||||
Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],
|
||||
PhantomJS, Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser,
|
||||
Swiftfox, Tizen, UCBrowser, Vivaldi, w3m, Yandex
|
||||
2345Explorer, Amaya, Android Browser, Arora, Avant, BIDUBrowser, Baidu,
|
||||
Basilisk, Blazer, Bolt, Bowser, Camino, Chimera, Chrome Headless,
|
||||
Chrome WebView, Chrome, Chromium, Comodo Dragon, Dillo, Dolphin, Doris, Edge,
|
||||
Epiphany, Facebook, Falkon, Fennec, Firebird, Firefox, Flock, GSA, GoBrowser,
|
||||
ICE Browser, IE, IEMobile, IceApe, IceCat, IceDragon, Iceape, Iceweasel,
|
||||
Iridium, Iron, Jasmine, K-Meleon, Kindle, Konqueror, LBBROWSER Line, Links,
|
||||
Lunascape, Lynx, MIUI Browser, Maemo Browser, Maemo, Maxthon, MetaSr Midori,
|
||||
Minimo, Mobile Safari, Mosaic, Mozilla, NetFront, NetSurf, Netfront, Netscape,
|
||||
NokiaBrowser, Oculus Browser, OmniWeb, Opera Coast, Opera Mini, Opera Mobi,
|
||||
Opera Tablet, Opera, PaleMoon, PhantomJS, Phoenix, Polaris, Puffin, QQ,
|
||||
QQBrowser, QQBrowserLite, Quark, QupZilla, RockMelt, Safari, Samsung Browser,
|
||||
SeaMonkey, Silk, Skyfire, Sleipnir, Slim, SlimBrowser, Swiftfox, Tizen Browser,
|
||||
UCBrowser, Vivaldi, Waterfox, WeChat, Yandex, baidu, iCab, w3m, ...
|
||||
|
||||
# 'browser.version' determined dynamically
|
||||
```
|
||||
@@ -37,15 +47,15 @@ Swiftfox, Tizen, UCBrowser, Vivaldi, w3m, Yandex
|
||||
* `getDevice()`
|
||||
* returns `{ model: '', type: '', vendor: '' }`
|
||||
|
||||
```
|
||||
```sh
|
||||
# Possible 'device.type':
|
||||
console, mobile, tablet, smarttv, wearable, embedded
|
||||
|
||||
# Possible 'device.vendor':
|
||||
Acer, Alcatel, Amazon, Apple, Archos, Asus, BenQ, BlackBerry, Dell, GeeksPhone,
|
||||
Google, HP, HTC, Huawei, Jolla, Lenovo, LG, Meizu, Microsoft, Motorola, Nexian,
|
||||
Nintendo, Nokia, Nvidia, Ouya, Palm, Panasonic, Polytron, RIM, Samsung, Sharp,
|
||||
Siemens, Sony-Ericsson, Sprint, Xbox, ZTE
|
||||
Acer, Alcatel, Amazon, Apple, Archos, Asus, BenQ, BlackBerry, Dell, Essential,
|
||||
GeeksPhone, Google, HP, HTC, Huawei, Jolla, Lenovo, LG, Meizu, Microsoft, Motorola,
|
||||
Nexian, Nintendo, Nokia, Nvidia, OnePlus, Ouya, Palm, Panasonic, Pebble, Polytron,
|
||||
RIM, Samsung, Sharp, Siemens, Sony[Ericsson], Sprint, Xbox, Xiaomi, ZTE, ...
|
||||
|
||||
# 'device.model' determined dynamically
|
||||
```
|
||||
@@ -53,10 +63,10 @@ Siemens, Sony-Ericsson, Sprint, Xbox, ZTE
|
||||
* `getEngine()`
|
||||
* returns `{ name: '', version: '' }`
|
||||
|
||||
```
|
||||
```sh
|
||||
# Possible 'engine.name'
|
||||
Amaya, EdgeHTML, Gecko, iCab, KHTML, Links, Lynx, NetFront, NetSurf, Presto,
|
||||
Tasman, Trident, w3m, WebKit
|
||||
Amaya, Blink, EdgeHTML, Gecko, Goanna, iCab, KHTML, Links, Lynx, NetFront, NetSurf,
|
||||
Presto, Tasman, Trident, w3m, WebKit
|
||||
|
||||
# 'engine.version' determined dynamically
|
||||
```
|
||||
@@ -64,14 +74,14 @@ Tasman, Trident, w3m, WebKit
|
||||
* `getOS()`
|
||||
* returns `{ name: '', version: '' }`
|
||||
|
||||
```
|
||||
```sh
|
||||
# Possible 'os.name'
|
||||
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS, Contiki,
|
||||
Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,
|
||||
Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Fuchsia, Gentoo, GNU, Haiku, Hurd, iOS,
|
||||
Joli, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD,
|
||||
Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat,
|
||||
Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PC-BSD, PCLinuxOS, Plan9, Playstation, QNX, RedHat,
|
||||
RIM Tablet OS, RISC OS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,
|
||||
Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk
|
||||
Ubuntu, Unix, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk, ...
|
||||
|
||||
# 'os.version' determined dynamically
|
||||
```
|
||||
@@ -79,10 +89,9 @@ Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk
|
||||
* `getCPU()`
|
||||
* returns `{ architecture: '' }`
|
||||
|
||||
```
|
||||
```sh
|
||||
# Possible 'cpu.architecture'
|
||||
68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc,
|
||||
ppc, sparc, sparc64
|
||||
68k, amd64, arm[64], avr, ia[32/64], irix[64], mips[64], pa-risc, ppc, sparc[64]
|
||||
```
|
||||
|
||||
* `getResult()`
|
||||
@@ -92,9 +101,11 @@ ppc, sparc, sparc64
|
||||
* returns UA string of current instance
|
||||
|
||||
* `setUA(uastring)`
|
||||
* set & parse UA string
|
||||
* set UA string to parse
|
||||
* returns current instance
|
||||
|
||||
## Example
|
||||
|
||||
# Example
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
@@ -167,7 +178,7 @@ ppc, sparc, sparc64
|
||||
</html>
|
||||
```
|
||||
|
||||
### Using node.js
|
||||
## Using node.js
|
||||
|
||||
```sh
|
||||
$ npm install ua-parser-js
|
||||
@@ -188,34 +199,49 @@ http.createServer(function (req, res) {
|
||||
console.log('Server running at http://127.0.0.1:1337/');
|
||||
```
|
||||
|
||||
### Using requirejs
|
||||
## Using requirejs
|
||||
|
||||
```js
|
||||
require(['ua-parser'], function(UAParser) {
|
||||
requirejs.config({
|
||||
baseUrl : 'js/lib', // path to your script directory
|
||||
paths : {
|
||||
'ua-parser-js' : 'ua-parser.min'
|
||||
}
|
||||
});
|
||||
|
||||
requirejs(['ua-parser-js'], function(UAParser) {
|
||||
var parser = new UAParser();
|
||||
console.log(parser.getResult());
|
||||
});
|
||||
```
|
||||
|
||||
### Using component
|
||||
## Using CDN
|
||||
|
||||
```sh
|
||||
$ component install faisalman/ua-parser-js
|
||||
```html
|
||||
<script src="https://cdn.jsdelivr.net/npm/ua-parser-js@0/dist/ua-parser.min.js"></script>
|
||||
```
|
||||
|
||||
### Using bower
|
||||
## Using bower
|
||||
|
||||
```sh
|
||||
$ bower install ua-parser-js
|
||||
```
|
||||
|
||||
### Using meteor
|
||||
## Using meteor
|
||||
|
||||
```sh
|
||||
$ meteor add faisalman:ua-parser-js
|
||||
```
|
||||
|
||||
### Using jQuery/Zepto ($.ua)
|
||||
## Using TypeScript
|
||||
|
||||
```sh
|
||||
$ npm install --save @types/ua-parser-js
|
||||
# Download TS type definition from DefinitelyTyped repository:
|
||||
# https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/ua-parser-js
|
||||
```
|
||||
|
||||
## Using jQuery/Zepto ($.ua)
|
||||
|
||||
Although written in vanilla js (which means it doesn't depends on jQuery), this library will automatically detect if jQuery/Zepto is present and create `$.ua` object based on browser's user-agent (although in case you need, `window.UAParser` constructor is still present). To get/set user-agent you can use: `$.ua.get()` / `$.ua.set(uastring)`.
|
||||
|
||||
@@ -236,46 +262,75 @@ console.log($.ua.browser.name); // "Safari"
|
||||
console.log($.ua.engine.name); // "Webkit"
|
||||
console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type: "tablet"}
|
||||
console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
|
||||
|
||||
// Add class to <body> tag
|
||||
// <body class="ua-browser-safari ua-devicetype-tablet">
|
||||
$('body').addClass('ua-browser-' + $.ua.browser.name + ' ua-devicetype-' + $.ua.device.type);
|
||||
```
|
||||
|
||||
### Extending regex patterns
|
||||
## Extending regex patterns
|
||||
|
||||
* `UAParser(uastring[, extensions])`
|
||||
* `UAParser([uastring,] extensions)`
|
||||
|
||||
Pass your own regexes to extend the limited matching rules.
|
||||
|
||||
```js
|
||||
// Example:
|
||||
var uaString = 'ownbrowser/1.3';
|
||||
var ownBrowser = [[/(ownbrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]];
|
||||
var parser = new UAParser(uaString, {browser: ownBrowser});
|
||||
console.log(parser.getBrowser()); // {name: "ownbrowser", version: "1.3"}
|
||||
var myOwnRegex = [[/(myownbrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]];
|
||||
var myParser = new UAParser({ browser: myOwnRegex });
|
||||
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
||||
console.log(myParser.setUA(uaString).getBrowser()); // {name: "MyOwnBrowser", version: "1.3"}
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
Verify, test, & minify script
|
||||
# Development
|
||||
|
||||
## Contribute
|
||||
|
||||
* Fork and clone this repository
|
||||
* Make some changes as required
|
||||
* Write a unit test to showcase your feature
|
||||
* Run the test suites to make sure the changes you made didn't break anything `$ npm run test`
|
||||
* Commit and push to your own repository
|
||||
* Submit a pull request to this repository under `develop` branch
|
||||
* Profit? $$$
|
||||
|
||||
## Build
|
||||
|
||||
Build a minified & packed script
|
||||
|
||||
```sh
|
||||
$ npm run test
|
||||
$ npm run build
|
||||
```
|
||||
|
||||
Then submit a pull request to https://github.com/faisalman/ua-parser-js under `develop` branch.
|
||||
|
||||
# Donate
|
||||
|
||||
Do you use & like UAParser.js but you don’t find a way to show some love? If yes, please consider donating to support this project. Otherwise, no worries, regardless of whether there is support or not, I will keep maintaining this project. Still, if you buy me a cup of coffee I would be more than happy though :)
|
||||
|
||||
[](https://www.paypal.me/faisalman/)
|
||||
|
||||
|
||||
## License
|
||||
# License
|
||||
|
||||
Dual licensed under GPLv2 & MIT
|
||||
MIT License
|
||||
|
||||
Copyright © 2012-2015 Faisal Salman <<fyzlman@gmail.com>>
|
||||
Copyright (c) 2012-2019 Faisal Salman <<f@faisalman.com>>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||
Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
633
src/ua-parser.js
Normal file → Executable file
633
src/ua-parser.js
Normal file → Executable file
@@ -1,10 +1,10 @@
|
||||
/**
|
||||
* UAParser.js v0.7.10
|
||||
/*!
|
||||
* UAParser.js v0.7.20
|
||||
* Lightweight JavaScript-based User-Agent string parser
|
||||
* https://github.com/faisalman/ua-parser-js
|
||||
*
|
||||
* Copyright © 2012-2015 Faisal Salman <fyzlman@gmail.com>
|
||||
* Dual licensed under GPLv2 & MIT
|
||||
* Copyright © 2012-2019 Faisal Salman <f@faisalman.com>
|
||||
* Licensed under MIT License
|
||||
*/
|
||||
|
||||
(function (window, undefined) {
|
||||
@@ -16,7 +16,7 @@
|
||||
/////////////
|
||||
|
||||
|
||||
var LIBVERSION = '0.7.10',
|
||||
var LIBVERSION = '0.7.20',
|
||||
EMPTY = '',
|
||||
UNKNOWN = '?',
|
||||
FUNC_TYPE = 'function',
|
||||
@@ -45,12 +45,15 @@
|
||||
|
||||
var util = {
|
||||
extend : function (regexes, extensions) {
|
||||
for (var i in extensions) {
|
||||
if ("browser cpu device engine os".indexOf(i) !== -1 && extensions[i].length % 2 === 0) {
|
||||
regexes[i] = extensions[i].concat(regexes[i]);
|
||||
var mergedRegexes = {};
|
||||
for (var i in regexes) {
|
||||
if (extensions[i] && extensions[i].length % 2 === 0) {
|
||||
mergedRegexes[i] = extensions[i].concat(regexes[i]);
|
||||
} else {
|
||||
mergedRegexes[i] = regexes[i];
|
||||
}
|
||||
}
|
||||
return regexes;
|
||||
return mergedRegexes;
|
||||
},
|
||||
has : function (str1, str2) {
|
||||
if (typeof str1 === "string") {
|
||||
@@ -63,7 +66,10 @@
|
||||
return str.toLowerCase();
|
||||
},
|
||||
major : function (version) {
|
||||
return typeof(version) === STR_TYPE ? version.split(".")[0] : undefined;
|
||||
return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
|
||||
},
|
||||
trim : function (str) {
|
||||
return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -75,35 +81,22 @@
|
||||
|
||||
var mapper = {
|
||||
|
||||
rgx : function () {
|
||||
rgx : function (ua, arrays) {
|
||||
|
||||
var result, i = 0, j, k, p, q, matches, match, args = arguments;
|
||||
var i = 0, j, k, p, q, matches, match;
|
||||
|
||||
// loop through all regexes maps
|
||||
while (i < args.length && !matches) {
|
||||
while (i < arrays.length && !matches) {
|
||||
|
||||
var regex = args[i], // even sequence (0,2,4,..)
|
||||
props = args[i + 1]; // odd sequence (1,3,5,..)
|
||||
|
||||
// construct object barebones
|
||||
if (typeof result === UNDEF_TYPE) {
|
||||
result = {};
|
||||
for (p in props) {
|
||||
if (props.hasOwnProperty(p)){
|
||||
q = props[p];
|
||||
if (typeof q === OBJ_TYPE) {
|
||||
result[q[0]] = undefined;
|
||||
} else {
|
||||
result[q] = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var regex = arrays[i], // even sequence (0,2,4,..)
|
||||
props = arrays[i + 1]; // odd sequence (1,3,5,..)
|
||||
j = k = 0;
|
||||
|
||||
// try matching uastring with regexes
|
||||
j = k = 0;
|
||||
while (j < regex.length && !matches) {
|
||||
matches = regex[j++].exec(this.getUA());
|
||||
|
||||
matches = regex[j++].exec(ua);
|
||||
|
||||
if (!!matches) {
|
||||
for (p = 0; p < props.length; p++) {
|
||||
match = matches[++k];
|
||||
@@ -113,32 +106,31 @@
|
||||
if (q.length == 2) {
|
||||
if (typeof q[1] == FUNC_TYPE) {
|
||||
// assign modified match
|
||||
result[q[0]] = q[1].call(this, match);
|
||||
this[q[0]] = q[1].call(this, match);
|
||||
} else {
|
||||
// assign given value, ignore regex match
|
||||
result[q[0]] = q[1];
|
||||
this[q[0]] = q[1];
|
||||
}
|
||||
} else if (q.length == 3) {
|
||||
// check whether function or regex
|
||||
if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
|
||||
// call function (usually string mapper)
|
||||
result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
|
||||
this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
|
||||
} else {
|
||||
// sanitize match using given regex
|
||||
result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
|
||||
this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
|
||||
}
|
||||
} else if (q.length == 4) {
|
||||
result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
|
||||
this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
|
||||
}
|
||||
} else {
|
||||
result[q] = match ? match : undefined;
|
||||
this[q] = match ? match : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
i += 2;
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
str : function (str, map) {
|
||||
@@ -233,15 +225,17 @@
|
||||
/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
|
||||
/(opera).+version\/([\w\.]+)/i, // Opera > 9.80
|
||||
/(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
|
||||
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
|
||||
], [[NAME, 'Opera Mini'], VERSION], [
|
||||
|
||||
/\s(opr)\/([\w\.]+)/i // Opera Webkit
|
||||
], [[NAME, 'Opera'], VERSION], [
|
||||
|
||||
// Mixed
|
||||
/(kindle)\/([\w\.]+)/i, // Kindle
|
||||
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
|
||||
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
|
||||
// Lunascape/Maxthon/Netfront/Jasmine/Blazer
|
||||
|
||||
// Trident based
|
||||
@@ -250,34 +244,96 @@
|
||||
/(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
|
||||
|
||||
// Webkit/KHTML based
|
||||
/(rekonq)\/([\w\.]+)*/i, // Rekonq
|
||||
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i
|
||||
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS
|
||||
/(rekonq)\/([\w\.]*)/i, // Rekonq
|
||||
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i
|
||||
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(konqueror)\/([\w\.]+)/i // Konqueror
|
||||
], [[NAME, 'Konqueror'], VERSION], [
|
||||
|
||||
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
|
||||
], [[NAME, 'IE'], VERSION], [
|
||||
|
||||
/(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge
|
||||
], [NAME, VERSION], [
|
||||
/(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
|
||||
], [[NAME, 'Edge'], VERSION], [
|
||||
|
||||
/(yabrowser)\/([\w\.]+)/i // Yandex
|
||||
], [[NAME, 'Yandex'], VERSION], [
|
||||
|
||||
/(puffin)\/([\w\.]+)/i // Puffin
|
||||
], [[NAME, 'Puffin'], VERSION], [
|
||||
|
||||
/(focus)\/([\w\.]+)/i // Firefox Focus
|
||||
], [[NAME, 'Firefox Focus'], VERSION], [
|
||||
|
||||
/(opt)\/([\w\.]+)/i // Opera Touch
|
||||
], [[NAME, 'Opera Touch'], VERSION], [
|
||||
|
||||
/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
|
||||
], [[NAME, 'UCBrowser'], VERSION], [
|
||||
|
||||
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
||||
], [[NAME, /_/g, ' '], VERSION], [
|
||||
|
||||
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
|
||||
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
||||
/(qqbrowser)[\/\s]?([\w\.]+)/i
|
||||
// QQBrowser
|
||||
/(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
|
||||
], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
|
||||
|
||||
/(micromessenger)\/([\w\.]+)/i // WeChat
|
||||
], [[NAME, 'WeChat'], VERSION], [
|
||||
|
||||
/(brave)\/([\w\.]+)/i // Brave browser
|
||||
], [[NAME, 'Brave'], VERSION], [
|
||||
|
||||
/(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(uc\s?browser)[\/\s]?([\w\.]+)/i,
|
||||
/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
|
||||
/JUC.+(ucweb)[\/\s]?([\w\.]+)/i
|
||||
// UCBrowser
|
||||
], [[NAME, 'UCBrowser'], VERSION], [
|
||||
/(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(BIDUBrowser)[\/\s]?([\w\.]+)/i // Baidu Browser
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
|
||||
], [NAME], [
|
||||
|
||||
/(LBBROWSER)/i // LieBao Browser
|
||||
], [NAME], [
|
||||
|
||||
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
||||
], [VERSION, [NAME, 'MIUI Browser']], [
|
||||
|
||||
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
|
||||
], [VERSION, [NAME, 'Facebook']], [
|
||||
|
||||
/safari\s(line)\/([\w\.]+)/i, // Line App for iOS
|
||||
/android.+(line)\/([\w\.]+)\/iab/i // Line App for Android
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
|
||||
], [VERSION, [NAME, 'Chrome Headless']], [
|
||||
|
||||
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
|
||||
], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
|
||||
|
||||
/((?:oculus|samsung)browser)\/([\w\.]+)/i
|
||||
], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
|
||||
|
||||
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
|
||||
], [VERSION, [NAME, 'Android Browser']], [
|
||||
|
||||
/(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
|
||||
], [[NAME, 'Sailfish Browser'], VERSION], [
|
||||
|
||||
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
|
||||
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(dolfin)\/([\w\.]+)/i // Dolphin
|
||||
], [[NAME, 'Dolphin'], VERSION], [
|
||||
@@ -285,14 +341,8 @@
|
||||
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
||||
], [[NAME, 'Chrome'], VERSION], [
|
||||
|
||||
/XiaoMi\/MiuiBrowser\/([\w\.]+)/i // MIUI Browser
|
||||
], [VERSION, [NAME, 'MIUI Browser']], [
|
||||
|
||||
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i // Android Browser
|
||||
], [VERSION, [NAME, 'Android Browser']], [
|
||||
|
||||
/FBAV\/([\w\.]+);/i // Facebook App for iOS
|
||||
], [VERSION, [NAME, 'Facebook']], [
|
||||
/(coast)\/([\w\.]+)/i // Opera Coast
|
||||
], [[NAME, 'Opera Coast'], VERSION], [
|
||||
|
||||
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
||||
], [VERSION, [NAME, 'Firefox']], [
|
||||
@@ -303,10 +353,12 @@
|
||||
/version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
|
||||
], [VERSION, NAME], [
|
||||
|
||||
/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
|
||||
], [[NAME, 'GSA'], VERSION], [
|
||||
|
||||
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
|
||||
], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
|
||||
|
||||
/(konqueror)\/([\w\.]+)/i, // Konqueror
|
||||
/(webkit|khtml)\/([\w\.]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
@@ -316,7 +368,8 @@
|
||||
/(swiftfox)/i, // Swiftfox
|
||||
/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
|
||||
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
|
||||
/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
|
||||
/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
|
||||
|
||||
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
|
||||
/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
|
||||
|
||||
@@ -324,121 +377,10 @@
|
||||
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
|
||||
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
|
||||
/(links)\s\(([\w\.]+)/i, // Links
|
||||
/(gobrowser)\/?([\w\.]+)*/i, // GoBrowser
|
||||
/(gobrowser)\/?([\w\.]*)/i, // GoBrowser
|
||||
/(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
|
||||
/(mosaic)[\/\s]([\w\.]+)/i // Mosaic
|
||||
], [NAME, VERSION]
|
||||
|
||||
/* /////////////////////
|
||||
// Media players BEGIN
|
||||
////////////////////////
|
||||
|
||||
, [
|
||||
|
||||
/(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
|
||||
/(coremedia) v((\d+)[\w\._]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
|
||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
|
||||
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
||||
/(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
|
||||
/(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
|
||||
/player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
|
||||
], [NAME, VERSION], [
|
||||
/(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
|
||||
], [[NAME, 'Flip Player'], VERSION], [
|
||||
|
||||
/(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
|
||||
// FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
|
||||
], [NAME], [
|
||||
|
||||
/(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
|
||||
// Gstreamer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
|
||||
/(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
|
||||
// Java/urllib/requests/wget/cURL
|
||||
/(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
|
||||
], [[NAME, /_/g, ' '], VERSION], [
|
||||
|
||||
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
|
||||
// MPlayer SVN
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(mplayer)/i, // MPlayer (no other info)
|
||||
/(yourmuze)/i, // YourMuze
|
||||
/(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
|
||||
], [NAME], [
|
||||
|
||||
/(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
|
||||
/(winamp)\s((\d+)[\w\.-]+)/i,
|
||||
/(winamp)mpeg\/((\d+)[\w\.-]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
||||
// inlight radio
|
||||
], [NAME], [
|
||||
|
||||
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
|
||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
||||
// SoundTap/Totem/Stagefright/Streamium
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(smp)((\d+)[\d\.]+)/i // SMP
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
|
||||
/(vlc)\/((\d+)[\w\.-]+)/i,
|
||||
/(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
|
||||
/(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
|
||||
/(itunes)\/((\d+)[\d\.]+)/i // iTunes
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
|
||||
/(windows-media-player)\/((\d+)[\w\.-]+)/i
|
||||
], [[NAME, /-/g, ' '], VERSION], [
|
||||
|
||||
/windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
|
||||
// Windows Media Server
|
||||
], [VERSION, [NAME, 'Windows']], [
|
||||
|
||||
/(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
|
||||
/(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
|
||||
], [[NAME, 'rad.io'], VERSION]
|
||||
|
||||
//////////////////////
|
||||
// Media players END
|
||||
////////////////////*/
|
||||
|
||||
],
|
||||
|
||||
cpu : [[
|
||||
@@ -462,14 +404,14 @@
|
||||
/(sun4\w)[;\)]/i // SPARC
|
||||
], [[ARCHITECTURE, 'sparc']], [
|
||||
|
||||
/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
|
||||
/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
|
||||
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
|
||||
], [[ARCHITECTURE, util.lowerize]]
|
||||
],
|
||||
|
||||
device : [[
|
||||
|
||||
/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
|
||||
/\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
|
||||
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
||||
|
||||
/applecoremedia\/[\w\.]+ \((ipad)/ // iPad
|
||||
@@ -480,15 +422,18 @@
|
||||
|
||||
/(archos)\s(gamepad2?)/i, // Archos
|
||||
/(hp).+(touchpad)/i, // HP TouchPad
|
||||
/(hp).+(tablet)/i, // HP Tablet
|
||||
/(kindle)\/([\w\.]+)/i, // Kindle
|
||||
/\s(nook)[\w\s]+build\/(\w+)/i, // Nook
|
||||
/(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i // Kindle Fire HD
|
||||
/(kf[A-z]+)\sbuild\/.+silk\//i // Kindle Fire HD
|
||||
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
|
||||
/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i // Fire Phone
|
||||
/(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i // Fire Phone
|
||||
], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
|
||||
/android.+aft([bms])\sbuild/i // Fire TV
|
||||
], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
|
||||
|
||||
/\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
|
||||
], [MODEL, VENDOR, [TYPE, MOBILE]], [
|
||||
@@ -496,22 +441,22 @@
|
||||
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
|
||||
|
||||
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
|
||||
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
|
||||
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron
|
||||
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
|
||||
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
||||
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
|
||||
/(asus)-?(\w+)/i // Asus
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
/\(bb10;\s(\w+)/i // BlackBerry 10
|
||||
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
|
||||
// Asus Tablets
|
||||
/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7)/i
|
||||
/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
|
||||
], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
|
||||
|
||||
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
|
||||
/(sony)?(?:sgp.+)\sbuild\//i
|
||||
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
|
||||
/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i
|
||||
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [
|
||||
/android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
|
||||
], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
||||
|
||||
/\s(ouya)\s/i, // Ouya
|
||||
/(nintendo)\s([wids3u]+)/i // Nintendo
|
||||
@@ -526,64 +471,82 @@
|
||||
/(sprint\s(\w+))/i // Sprint Phones
|
||||
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
|
||||
|
||||
/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
|
||||
/(zte)-(\w+)*/i, // ZTE
|
||||
/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
|
||||
// Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
|
||||
/(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
|
||||
/(zte)-(\w*)/i, // ZTE
|
||||
/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
|
||||
// Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
||||
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
||||
|
||||
|
||||
/(nexus\s9)/i // HTC Nexus 9
|
||||
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
||||
|
||||
/d\/huawei([\w\s-]+)[;\)]/i,
|
||||
/(nexus\s6p)/i // Huawei
|
||||
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
||||
|
||||
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
|
||||
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
|
||||
/(kin\.[onetw]{3})/i // Microsoft Kin
|
||||
], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
|
||||
|
||||
// Motorola
|
||||
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
|
||||
/mot[\s-]?(\w+)*/i,
|
||||
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
|
||||
/mot[\s-]?(\w*)/i,
|
||||
/(XT\d{3,4}) build\//i,
|
||||
/(nexus\s[6])/i
|
||||
/(nexus\s6)/i
|
||||
], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
|
||||
/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
|
||||
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n8000|sgh-t8[56]9|nexus 10))/i,
|
||||
/((SM-T\w+))/i
|
||||
], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
|
||||
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-n900))/i,
|
||||
/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
|
||||
/sec-((sgh\w+))/i
|
||||
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
|
||||
/(samsung);smarttv/i
|
||||
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
|
||||
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
|
||||
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
|
||||
|
||||
/hbbtv.+maple;(\d+)/i
|
||||
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
|
||||
|
||||
/\(dtv[\);].+(aquos)/i // Sharp
|
||||
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
|
||||
/sie-(\w+)*/i // Siemens
|
||||
|
||||
/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
|
||||
/((SM-T\w+))/i
|
||||
], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
|
||||
/smart-tv.+(samsung)/i
|
||||
], [VENDOR, [TYPE, SMARTTV], MODEL], [
|
||||
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
|
||||
/(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,
|
||||
/sec-((sgh\w+))/i
|
||||
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/sie-(\w*)/i // Siemens
|
||||
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
||||
|
||||
/(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
|
||||
/(nokia)[\s_-]?([\w-]+)*/i
|
||||
/(nokia)[\s_-]?([\w-]*)/i
|
||||
], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
|
||||
/android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
|
||||
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
|
||||
], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
|
||||
/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
|
||||
], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
|
||||
/(lg) netcast\.tv/i // LG SmartTV
|
||||
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
|
||||
/(nexus\s[45])/i, // LG
|
||||
/lg[e;\s\/-]+(\w+)*/i
|
||||
/lg[e;\s\/-]+(\w*)/i,
|
||||
/android.+lg(\-?[\d\w]+)\s+build/i
|
||||
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
|
||||
|
||||
/(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
/android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
|
||||
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
|
||||
/(lenovo)[_\s-]?([\w-]+)/i
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/linux;.+((jolla));/i // Jolla
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
@@ -591,79 +554,114 @@
|
||||
/((pebble))app\/[\d\.]+\s/i // Pebble
|
||||
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
||||
|
||||
/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/crkey/i // Google Chromecast
|
||||
], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
|
||||
|
||||
/android.+;\s(glass)\s\d/i // Google Glass
|
||||
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
|
||||
|
||||
/android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
||||
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
|
||||
/android.+(mi[\s\-_]*(?:one|one[\s_]plus)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
|
||||
/android.+;\s(pixel c)[\s)]/i // Google Pixel C
|
||||
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+;\s(pixel( [23])?( xl)?)[\s)]/i // Google Pixel
|
||||
], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
|
||||
|
||||
/android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
||||
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
|
||||
/android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,
|
||||
// Xiaomi Mi
|
||||
/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
|
||||
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
||||
/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
|
||||
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
|
||||
/android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
|
||||
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
|
||||
/(mz)-([\w-]{2,})/i
|
||||
], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/\s(tablet)[;\/\s]/i, // Unidentifiable Tablet
|
||||
/\s(mobile)[;\/\s]/i // Unidentifiable Mobile
|
||||
], [[TYPE, util.lowerize], VENDOR, MODEL]
|
||||
/android.+a000(1)\s+build/i, // OnePlus
|
||||
/android.+oneplus\s(a\d{4})\s+build/i
|
||||
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
||||
|
||||
/*//////////////////////////
|
||||
// TODO: move to string map
|
||||
////////////////////////////
|
||||
/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
|
||||
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
||||
|
||||
/(C6603)/i // Sony Xperia Z C6603
|
||||
], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
||||
/(C6903)/i // Sony Xperia Z 1
|
||||
], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
||||
/android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
|
||||
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
|
||||
|
||||
/(SM-G900[F|H])/i // Samsung Galaxy S5
|
||||
], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
||||
/(SM-G7102)/i // Samsung Galaxy Grand 2
|
||||
], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
||||
/(SM-G530H)/i // Samsung Galaxy Grand Prime
|
||||
], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
||||
/(SM-G313HZ)/i // Samsung Galaxy V
|
||||
], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
||||
/(SM-T805)/i // Samsung Galaxy Tab S 10.5
|
||||
], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
||||
/(SM-G800F)/i // Samsung Galaxy S5 Mini
|
||||
], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
||||
/(SM-T311)/i // Samsung Galaxy Tab 3 8.0
|
||||
], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
||||
/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
|
||||
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
|
||||
|
||||
/(R1001)/i // Oppo R1001
|
||||
], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
|
||||
/(X9006)/i // Oppo Find 7a
|
||||
], [[MODEL, 'Find 7a'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
||||
/(R2001)/i // Oppo YOYO R2001
|
||||
], [[MODEL, 'Yoyo R2001'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
||||
/(R815)/i // Oppo Clover R815
|
||||
], [[MODEL, 'Clover R815'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
||||
/(U707)/i // Oppo Find Way S
|
||||
], [[MODEL, 'Find Way S'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
|
||||
/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i // Barnes & Noble Tablet
|
||||
], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/(T3C)/i // Advan Vandroid T3C
|
||||
], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
|
||||
/(ADVAN T1J\+)/i // Advan Vandroid T1J+
|
||||
], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
|
||||
/(ADVAN S4A)/i // Advan Vandroid S4A
|
||||
], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
|
||||
/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
|
||||
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
|
||||
|
||||
/(V972M)/i // ZTE V972M
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
|
||||
/android.+;\s(k88)\sbuild/i // ZTE K Series Tablet
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
|
||||
|
||||
/(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
/(IQ6.3)/i // i-mobile IQ IQ 6.3
|
||||
], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
|
||||
/(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
/(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
|
||||
], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
|
||||
|
||||
/(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
|
||||
], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
|
||||
/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
|
||||
|
||||
/////////////
|
||||
// END TODO
|
||||
///////////*/
|
||||
/android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
|
||||
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
||||
|
||||
/(android).+[;\/]\s+([YR]\d{2})\s+build/i,
|
||||
/android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
|
||||
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
|
||||
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i // NextBook Tablets
|
||||
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
|
||||
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
|
||||
|
||||
/android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
|
||||
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/android.+;\s(PH-1)\s/i
|
||||
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
|
||||
|
||||
/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
|
||||
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
|
||||
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
|
||||
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
|
||||
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
|
||||
|
||||
/android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
|
||||
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
|
||||
], [[TYPE, util.lowerize], VENDOR, MODEL], [
|
||||
|
||||
/[\s\/\(](smart-?tv)[;\)]/i // SmartTV
|
||||
], [[TYPE, SMARTTV]], [
|
||||
|
||||
/(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
|
||||
], [MODEL, [VENDOR, 'Generic']]
|
||||
],
|
||||
|
||||
engine : [[
|
||||
@@ -671,13 +669,17 @@
|
||||
/windows.+\sedge\/([\w\.]+)/i // EdgeHTML
|
||||
], [VERSION, [NAME, 'EdgeHTML']], [
|
||||
|
||||
/webkit\/537\.36.+chrome\/(?!27)/i // Blink
|
||||
], [[NAME, 'Blink']], [
|
||||
|
||||
/(presto)\/([\w\.]+)/i, // Presto
|
||||
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
|
||||
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
|
||||
// WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
|
||||
/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
|
||||
/(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/rv\:([\w\.]+).*(gecko)/i // Gecko
|
||||
/rv\:([\w\.]{1,9}).+(gecko)/i // Gecko
|
||||
], [VERSION, NAME]
|
||||
],
|
||||
|
||||
@@ -687,7 +689,8 @@
|
||||
/microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
|
||||
], [NAME, VERSION], [
|
||||
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
|
||||
/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
|
||||
/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
|
||||
/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
|
||||
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
|
||||
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
|
||||
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
|
||||
@@ -695,13 +698,12 @@
|
||||
// Mobile/Embedded OS
|
||||
/\((bb)(10);/i // BlackBerry 10
|
||||
], [[NAME, 'BlackBerry'], VERSION], [
|
||||
/(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
|
||||
/(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
|
||||
/(tizen)[\/\s]([\w\.]+)/i, // Tizen
|
||||
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
|
||||
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
|
||||
/linux;.+(sailfish);/i // Sailfish OS
|
||||
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
|
||||
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
|
||||
], [NAME, VERSION], [
|
||||
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
|
||||
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
|
||||
], [[NAME, 'Symbian'], VERSION], [
|
||||
/\((series40);/i // Series 40
|
||||
], [NAME], [
|
||||
@@ -712,40 +714,43 @@
|
||||
/(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
|
||||
|
||||
// GNU/Linux based
|
||||
/(mint)[\/\s\(]?(\w+)*/i, // Mint
|
||||
/(mint)[\/\s\(]?(\w*)/i, // Mint
|
||||
/(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
|
||||
/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,
|
||||
/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,
|
||||
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
|
||||
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
|
||||
/(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
|
||||
/(gnu)\s?([\w\.]+)*/i // GNU
|
||||
/(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
|
||||
/(gnu)\s?([\w\.]*)/i // GNU
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
|
||||
], [[NAME, 'Chromium OS'], VERSION],[
|
||||
|
||||
// Solaris
|
||||
/(sunos)\s?([\w\.]+\d)*/i // Solaris
|
||||
/(sunos)\s?([\w\.\d]*)/i // Solaris
|
||||
], [[NAME, 'Solaris'], VERSION], [
|
||||
|
||||
// BSD based
|
||||
/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
|
||||
/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
|
||||
], [NAME, VERSION],[
|
||||
|
||||
/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
|
||||
], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
|
||||
/(haiku)\s(\w+)/i // Haiku
|
||||
], [NAME, VERSION],[
|
||||
|
||||
/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
|
||||
/cfnetwork\/.+darwin/i,
|
||||
/ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
|
||||
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
||||
|
||||
/(mac\sos\sx)\s?([\w\s\.]*)/i,
|
||||
/(macintosh|mac(?=_powerpc)\s)/i // Mac OS
|
||||
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
|
||||
|
||||
// Other
|
||||
/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
|
||||
/(haiku)\s(\w+)/i, // Haiku
|
||||
/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
|
||||
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
|
||||
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
|
||||
/(unix)\s?([\w\.]+)*/i // UNIX
|
||||
/((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
|
||||
/(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
|
||||
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
|
||||
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
|
||||
/(unix)\s?([\w\.]*)/i // UNIX
|
||||
], [NAME, VERSION]
|
||||
]
|
||||
};
|
||||
@@ -754,10 +759,13 @@
|
||||
/////////////////
|
||||
// Constructor
|
||||
////////////////
|
||||
|
||||
|
||||
var UAParser = function (uastring, extensions) {
|
||||
|
||||
if (typeof uastring === 'object') {
|
||||
extensions = uastring;
|
||||
uastring = undefined;
|
||||
}
|
||||
|
||||
if (!(this instanceof UAParser)) {
|
||||
return new UAParser(uastring, extensions).getResult();
|
||||
}
|
||||
@@ -766,23 +774,32 @@
|
||||
var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
|
||||
|
||||
this.getBrowser = function () {
|
||||
var browser = mapper.rgx.apply(this, rgxmap.browser);
|
||||
browser.major = util.major(browser.version);
|
||||
var browser = { name: undefined, version: undefined };
|
||||
mapper.rgx.call(browser, ua, rgxmap.browser);
|
||||
browser.major = util.major(browser.version); // deprecated
|
||||
return browser;
|
||||
};
|
||||
this.getCPU = function () {
|
||||
return mapper.rgx.apply(this, rgxmap.cpu);
|
||||
var cpu = { architecture: undefined };
|
||||
mapper.rgx.call(cpu, ua, rgxmap.cpu);
|
||||
return cpu;
|
||||
};
|
||||
this.getDevice = function () {
|
||||
return mapper.rgx.apply(this, rgxmap.device);
|
||||
var device = { vendor: undefined, model: undefined, type: undefined };
|
||||
mapper.rgx.call(device, ua, rgxmap.device);
|
||||
return device;
|
||||
};
|
||||
this.getEngine = function () {
|
||||
return mapper.rgx.apply(this, rgxmap.engine);
|
||||
var engine = { name: undefined, version: undefined };
|
||||
mapper.rgx.call(engine, ua, rgxmap.engine);
|
||||
return engine;
|
||||
};
|
||||
this.getOS = function () {
|
||||
return mapper.rgx.apply(this, rgxmap.os);
|
||||
var os = { name: undefined, version: undefined };
|
||||
mapper.rgx.call(os, ua, rgxmap.os);
|
||||
return os;
|
||||
};
|
||||
this.getResult = function() {
|
||||
this.getResult = function () {
|
||||
return {
|
||||
ua : this.getUA(),
|
||||
browser : this.getBrowser(),
|
||||
@@ -799,7 +816,6 @@
|
||||
ua = uastring;
|
||||
return this;
|
||||
};
|
||||
this.setUA(ua);
|
||||
return this;
|
||||
};
|
||||
|
||||
@@ -832,7 +848,6 @@
|
||||
VERSION : VERSION
|
||||
};
|
||||
|
||||
|
||||
///////////
|
||||
// Export
|
||||
//////////
|
||||
@@ -847,26 +862,26 @@
|
||||
exports.UAParser = UAParser;
|
||||
} else {
|
||||
// requirejs env (optional)
|
||||
if (typeof(define) === FUNC_TYPE && define.amd) {
|
||||
if (typeof(define) === 'function' && define.amd) {
|
||||
define(function () {
|
||||
return UAParser;
|
||||
});
|
||||
} else {
|
||||
} else if (window) {
|
||||
// browser env
|
||||
window.UAParser = UAParser;
|
||||
}
|
||||
}
|
||||
|
||||
// jQuery/Zepto specific (optional)
|
||||
// Note:
|
||||
// Note:
|
||||
// In AMD env the global scope should be kept clean, but jQuery is an exception.
|
||||
// jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
|
||||
// and we should catch that.
|
||||
var $ = window.jQuery || window.Zepto;
|
||||
if (typeof $ !== UNDEF_TYPE) {
|
||||
var $ = window && (window.jQuery || window.Zepto);
|
||||
if (typeof $ !== UNDEF_TYPE && !$.ua) {
|
||||
var parser = new UAParser();
|
||||
$.ua = parser.getResult();
|
||||
$.ua.get = function() {
|
||||
$.ua.get = function () {
|
||||
return parser.getUA();
|
||||
};
|
||||
$.ua.set = function (uastring) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -47,6 +47,14 @@
|
||||
"architecture" : "arm"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "ARMv7",
|
||||
"ua" : "Mozilla/5.0 (X11; CrOS armv7l 9765.85.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.123 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "arm"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Pocket PC",
|
||||
"ua" : "Opera/9.7 (Windows Mobile; PPC; Opera Mobi/35166; U; en) Presto/2.2.1",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,13 @@
|
||||
[
|
||||
{
|
||||
"desc" : "Blink",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 7.0; SM-G920I Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/3.4.9 SamsungBrowser/4.0 Chrome/57.0.2987.146 Mobile VR Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Blink",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "EdgeHTML",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/12.0",
|
||||
@@ -17,6 +26,15 @@
|
||||
"version" : "2.0b9pre"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Goanna",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 5.1; rv:38.9) Gecko/20100101 Goanna/2.2 Firefox/38.9 PaleMoon/26.5.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Goanna",
|
||||
"version" : "2.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "KHTML",
|
||||
"ua" : "Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)",
|
||||
@@ -70,5 +88,14 @@
|
||||
"name" : "WebKit",
|
||||
"version" : "533.19.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebKit",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/27.0.1453.110 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "WebKit",
|
||||
"version" : "537.36"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
582
test/mediaplayer-test.json
Normal file
582
test/mediaplayer-test.json
Normal file
@@ -0,0 +1,582 @@
|
||||
[
|
||||
{
|
||||
"desc" : "Coremedia",
|
||||
"ua" : "Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F2108",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "CoreMedia",
|
||||
"version" : "1.0.0.10F2108",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "AppleCoreMedia",
|
||||
"ua" : "AppleCoreMedia/1.0.0.10A403 (iPad; U; CPU OS 6_0 like Mac OS X; it_it)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "AppleCoreMedia",
|
||||
"version" : "1.0.0.10A403",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "AppleTv",
|
||||
"ua" : "AppleTV/3.0.2 (Macintosh; Intel Mac OS X 10.4.7) AppleWebKit/528.18",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "WebKit",
|
||||
"version" : "528.18",
|
||||
"major" : "528"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Aqualung",
|
||||
"ua" : "Aqualung/R-1114",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Aqualung",
|
||||
"version" : "R-1114",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Ares",
|
||||
"ua" : "Ares 2.2.4.3048",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Ares",
|
||||
"version" : "2.2.4.3048",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Audacious",
|
||||
"ua" : "Audacious/3.2.2 neon/0.29.3",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Audacious",
|
||||
"version" : "3.2.2",
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "AudiMusicStream",
|
||||
"ua" : "AudiMusicStream/3020.130826151911",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "AudiMusicStream",
|
||||
"version" : "3020.130826151911",
|
||||
"major" : "3020"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "BASS",
|
||||
"ua" : "BASS/2.4",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "BASS",
|
||||
"version" : "2.4",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "BSPlayer",
|
||||
"ua" : "BSPlayer/2",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "BSPlayer",
|
||||
"version" : "2",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Core",
|
||||
"ua" : "CORE/6.506.4.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "CORE",
|
||||
"version" : "6.506.4.1",
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Clementine",
|
||||
"ua" : "Clementine 1.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Clementine",
|
||||
"version" : "1.1",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Dalvik",
|
||||
"ua" : "Dalvik/1.2.0 (Linux; U; Android 2.2.1; GT-S5830L Build/FROYO)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Dalvik",
|
||||
"version" : "1.2.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "NexPlayer",
|
||||
"ua" : "E97510d/ Player/NexPlayer 4.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "NexPlayer",
|
||||
"version" : "4.0",
|
||||
"major" : "4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "FLRP",
|
||||
"ua" : "FLRP/2.5 CFNetwork/609.1.4 Darwin/13.0.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Flip Player",
|
||||
"version" : "2.5",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "FStream",
|
||||
"ua" : "FStream",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "FStream",
|
||||
"version" : "undefined",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "GStreamer",
|
||||
"ua" : "GStreamer souphttpsrc (compatible; LG NetCast.TV-2012) libsoup/2.34.2",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "GStreamer",
|
||||
"version" : "2.34.2",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "GnomeMplayer",
|
||||
"ua" : "GnomeMplayer/1.0.2",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "GnomeMplayer",
|
||||
"version" : "1.0.2",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HTC Streaming Player",
|
||||
"ua" : "HTC Streaming Player htc_asia_wwe / 1.0 / endeavoru / 4.1.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "HTC Streaming Player",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HTC One S",
|
||||
"ua" : "HTC_One_S/3.16.111.10",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "HTC One S",
|
||||
"version" : "3.16.111.10",
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Java",
|
||||
"ua" : "Java/1.4.1_04",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Java",
|
||||
"version" : "1.4.1_04",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "LG Player",
|
||||
"ua" : "LG Player 1.0; Android",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "LG Player",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "NexPlayer",
|
||||
"ua" : "LG-P700/V10k-DEC-12-2012 Player/NexPlayer 4.0 for Android",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "NexPlayer",
|
||||
"version" : "4.0",
|
||||
"major" : "4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "LG Player",
|
||||
"ua" : "LGE400/V10b Player/LG Player 1.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "LG Player",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Lavf",
|
||||
"ua" : "Lavf52.111.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Lavf",
|
||||
"version" : "52.111.0",
|
||||
"major" : "52"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Lyssna",
|
||||
"ua" : "Lyssna/46 CFNetwork/609.1.4 Darwin/13.0.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Lyssna",
|
||||
"version" : "46",
|
||||
"major" : "46"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MPlayer",
|
||||
"ua" : "MPlayer 1.1-4.2.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "MPlayer",
|
||||
"version" : "1.1-4.2.1",
|
||||
"major" : ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MPlayer SVN",
|
||||
"ua" : "MPlayer SVN-r33713-4.6.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "MPlayer",
|
||||
"version" : "r33713-4.6.1",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MPlayer ubuntu",
|
||||
"ua" : "MPlayer svn r34540 (Ubuntu), built with gcc-4.6",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "MPlayer",
|
||||
"version" : "r34540",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MoC",
|
||||
"ua" : "Music On Console/2.5.0-beta1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Music On Console",
|
||||
"version" : "2.5.0-beta1",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MPD",
|
||||
"ua" : "Music Player Daemon 0.17.4",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Music Player Daemon",
|
||||
"version" : "0.17.4",
|
||||
"major" : "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "NSPlayer",
|
||||
"ua" : "NSPlayer/11.0.5358.4827 WMFSDK/11.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "NSPlayer",
|
||||
"version" : "11.0.5358.4827",
|
||||
"major" : "11"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Nero Home",
|
||||
"ua" : "Nero Home/1.5.3.0 (compatible; Nero AG; Nero Home 1.5.3.0)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Nero Home",
|
||||
"version" : "1.5.3.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "NexPlayer",
|
||||
"ua" : "NexPlayer 4.0 for Android( stagefright alternative )",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "NexPlayer",
|
||||
"version" : "4.0",
|
||||
"major" : "4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Nokia3xx",
|
||||
"ua" : "Nokia303/14.87 CLDC-1.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Nokia303",
|
||||
"version" : "14.87",
|
||||
"major" : "14"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MPlayer SVN Sherpya",
|
||||
"ua" : "MPlayer Sherpya-SVN-r33124-4.2.5",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "MPlayer",
|
||||
"version" : "r33124-4.2.5",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Philips Songbird",
|
||||
"ua" : "NotMoz/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.3) Gecko/20101207 Philips-Songbird/5.4.1980 Songbird/1.9.4 (20110302030555)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Songbird",
|
||||
"version" : "1.9.4",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Ossproxy",
|
||||
"ua" : "OSSProxy 1.3.336.320 (Build 336.320 Win32 en-us)(Aug 16 2013 17:38:43)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "OSSProxy",
|
||||
"version" : "1.3.336.320",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Winamp3",
|
||||
"ua" : "Nullsoft Winamp3 version 3.0 (compatible)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Winamp",
|
||||
"version" : "3.0",
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "PSP",
|
||||
"ua" : "PSP-InternetRadioPlayer/1.00",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "PSP-InternetRadioPlayer",
|
||||
"version" : "1.00",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "urllib",
|
||||
"ua" : "Python-urllib/2.7",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Python-urllib",
|
||||
"version" : "2.7",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "QuickTime",
|
||||
"ua" : "QuickTime/7.5.6 (qtver=7.5.6;cpu=IA32;os=Mac 10.5.8)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "QuickTime",
|
||||
"version" : "7.5.6",
|
||||
"major" : "7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RMA",
|
||||
"ua" : "RMA/1.0 (compatible; RealMedia)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "RMA",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RadioApp",
|
||||
"ua" : "RadioApp/1.0 CFNetwork/609.1.4 Darwin/11.4.2",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "RadioApp",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RadioClientApplication",
|
||||
"ua" : "RadioClientApplication/20 CFNetwork/609.1.4 Darwin/13.0.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "RadioClientApplication",
|
||||
"version" : "20",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "stagefright",
|
||||
"ua" : "Samsung GT-I9070 stagefright/1.1 (Linux;Android 2.3.6)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "stagefright",
|
||||
"version" : "1.1",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Soundtap",
|
||||
"ua" : "Soundtap/1.2.4 CFNetwork/672.0.2 Darwin/14.0.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Soundtap",
|
||||
"version" : "1.2.4",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Streamium",
|
||||
"ua" : "Streamium/1.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Streamium",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Totem",
|
||||
"ua" : "Totem/3.0.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Totem",
|
||||
"version" : "3.0.1",
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "VLC",
|
||||
"ua" : "VLC media player - version 0.8.6c Janus - (c) 1996-2007 the VideoLAN team",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "VLC",
|
||||
"version" : "0.8.6c",
|
||||
"major" : "0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "VLC",
|
||||
"ua" : "VLC/2.0.0 LibVLC/2.0.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "VLC",
|
||||
"version" : "2.0.0",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Videos",
|
||||
"ua" : "Videos/3.8.2",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Video",
|
||||
"version" : "3.8.2",
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Wget",
|
||||
"ua" : "Wget/1.12 (darwin10.7.0)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Wget",
|
||||
"version" : "1.12",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Winamp",
|
||||
"ua" : "Winamp 2.81",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Winamp",
|
||||
"version" : "2.81",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Winamp",
|
||||
"ua" : "WinampMPEG/2.00",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Winamp",
|
||||
"version" : "2.00",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows Media Player",
|
||||
"ua" : "Windows-Media-Player/10.00.00.4019",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Windows Media Player",
|
||||
"version" : "10.00.00.4019",
|
||||
"major" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "XBMC",
|
||||
"ua" : "XBMC/12.0 Git:20130127-fb595f2 (Windows NT 6.1;WOW64;Win64;x64; http://www.xbmc.org)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "XBMC",
|
||||
"version" : "12.0",
|
||||
"major" : "12"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "rad.io",
|
||||
"ua" : "rad.io 1.18.1 rv:593 (iPhone 4S; iPhone OS 7.0.4; it_IT)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "rad.io",
|
||||
"version" : "1.18.1",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "BE-Test",
|
||||
"ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "BE Test",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -107,6 +107,15 @@
|
||||
"version" : "6.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows Phone",
|
||||
"ua" : "Opera/9.80 (Windows Phone; Opera Mini/7.6.8/35.7518; U; ru) Presto/2.8.119 Version/11.10",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Windows Phone",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows Phone OS",
|
||||
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)",
|
||||
@@ -145,11 +154,11 @@
|
||||
},
|
||||
{
|
||||
"desc" : "Tizen",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (Linux; Tizen 2.3; SAMSUNG SM-Z130H) AppleWebKit/537.3 (KHTML, like Gecko) Version/2.3 Mobile Safari/537.3",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Tizen",
|
||||
"version" : "2.3"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -161,6 +170,15 @@
|
||||
"version" : "2.2.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Sailfish",
|
||||
"ua" : "Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Sailfish",
|
||||
"version" : "3.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS",
|
||||
"ua" : "",
|
||||
@@ -280,11 +298,20 @@
|
||||
},
|
||||
{
|
||||
"desc" : "Ubuntu",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.22+ (KHTML, like Gecko) Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.22+ Ubuntu/12.04 (3.4.1-0ubuntu1) Epiphany/3.4.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Ubuntu",
|
||||
"version" : "12.04"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Ubuntu",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/31.0.1650.63 Chrome/31.0.1650.63 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Ubuntu",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -415,11 +442,20 @@
|
||||
},
|
||||
{
|
||||
"desc" : "Chromium OS",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; CrOS x86_64 10575.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Chromium OS",
|
||||
"version" : "10575.58.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Fuchsia",
|
||||
"ua" : "Mozilla/5.0 (X11; Fuchsia x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3557.0 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Fuchsia",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -467,6 +503,15 @@
|
||||
"version" : ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "iOS in App",
|
||||
"ua" : "AppName/version CFNetwork/version Darwin/version",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "iOS",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "iOS with Chrome",
|
||||
"ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
|
||||
@@ -496,11 +541,11 @@
|
||||
},
|
||||
{
|
||||
"desc" : "Haiku",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Haiku R1 x86) AppleWebKit/602.1.1 (KHTML, like Gecko) WebPositive/1.2 Version/8.0 Safari/602.1.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Haiku",
|
||||
"version" : "R1"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
57
test/test.js
57
test/test.js
@@ -1,4 +1,5 @@
|
||||
var assert = require('assert');
|
||||
var requirejs = require('requirejs');
|
||||
var UAParser = require('./../src/ua-parser');
|
||||
var browsers = require('./browser-test.json');
|
||||
var cpus = require('./cpu-test.json');
|
||||
@@ -43,15 +44,6 @@ describe('UAParser()', function () {
|
||||
assert.deepEqual(UAParser(ua), new UAParser().setUA(ua).getResult());
|
||||
});
|
||||
|
||||
describe('Injected Browser', function () {
|
||||
var uaString = 'ownbrowser/1.3';
|
||||
var ownBrowser = [[/(ownbrowser)\/((\d+)?[\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, UAParser.BROWSER.MAJOR]];
|
||||
var parser = new UAParser(uaString, {browser: ownBrowser});
|
||||
assert.equal(parser.getBrowser().name, 'ownbrowser');
|
||||
assert.equal(parser.getBrowser().major, '1');
|
||||
assert.equal(parser.getBrowser().version, '1.3');
|
||||
});
|
||||
|
||||
for (var i in methods) {
|
||||
describe(methods[i]['title'], function () {
|
||||
for (var j in methods[i]['list']) {
|
||||
@@ -72,3 +64,50 @@ for (var i in methods) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
describe('Returns', function () {
|
||||
it('getResult() should returns JSON', function(done) {
|
||||
assert.deepEqual(new UAParser('').getResult(),
|
||||
{
|
||||
ua : '',
|
||||
browser: { name: undefined, version: undefined, major: undefined },
|
||||
cpu: { architecture: undefined },
|
||||
device: { vendor: undefined, model: undefined, type: undefined },
|
||||
engine: { name: undefined, version: undefined},
|
||||
os: { name: undefined, version: undefined }
|
||||
});
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Extending Regex', function () {
|
||||
var uaString = 'Mozilla/5.0 MyOwnBrowser/1.3';
|
||||
var myOwnBrowser = [[/(myownbrowser)\/((\d+)?[\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, UAParser.BROWSER.MAJOR]];
|
||||
|
||||
var parser1 = new UAParser(uaString, {browser: myOwnBrowser});
|
||||
assert.equal(parser1.getBrowser().name, 'MyOwnBrowser');
|
||||
assert.equal(parser1.getBrowser().version, '1.3');
|
||||
assert.equal(parser1.getBrowser().major, '1');
|
||||
|
||||
var parser2 = new UAParser({browser: myOwnBrowser});
|
||||
assert.equal(parser2.getBrowser().name, undefined);
|
||||
parser2.setUA(uaString);
|
||||
assert.equal(parser2.getBrowser().name, 'MyOwnBrowser');
|
||||
assert.equal(parser1.getBrowser().version, '1.3');
|
||||
});
|
||||
|
||||
describe('Using Require.js', function () {
|
||||
it('should loaded automatically', function(done) {
|
||||
requirejs.config({
|
||||
baseUrl : 'dist',
|
||||
paths : {
|
||||
'ua-parser-js' : 'ua-parser.min'
|
||||
}
|
||||
});
|
||||
requirejs(['ua-parser-js'], function(ua) {
|
||||
var parser = new ua('Dillo/1.0');
|
||||
assert.deepEqual(parser.getBrowser().name, 'Dillo');
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"title": "UAParser.js",
|
||||
"name": "ua-parser-js",
|
||||
"version": "0.7.10",
|
||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||
"keywords": [
|
||||
"user-agent",
|
||||
"parser",
|
||||
"browser",
|
||||
"engine",
|
||||
"os",
|
||||
"device",
|
||||
"cpu"
|
||||
],
|
||||
"homepage": "https://faisalman.github.com/ua-parser-js",
|
||||
"author": {
|
||||
"name": "Faisal Salman",
|
||||
"email": "fyzlman@gmail.com"
|
||||
},
|
||||
"dependencies": {
|
||||
"jquery": ">=1.5"
|
||||
},
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "http://www.opensource.org/licenses/mit-license.php"
|
||||
}
|
||||
],
|
||||
"bugs": "https://github.com/faisalman/ua-parser-js/issues",
|
||||
"docs": "https://github.com/faisalman/ua-parser-js",
|
||||
"download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.min.js"
|
||||
}
|
||||
Reference in New Issue
Block a user