Compare commits

..

1 Commits

Author SHA1 Message Date
Faisal Salman
a21b0f2294 Increment minor version 2014-06-25 14:05:58 +07:00
21 changed files with 1204 additions and 1927 deletions

4
.gitignore vendored
View File

@@ -1,12 +1,12 @@
node_modules/ node_modules/
npm-debug.log npm-debug.log
<<<<<<< HEAD
### vim ### ### vim ###
.*.s[a-w][a-z] .*.s[a-w][a-z]
*.un~ *.un~
Session.vim Session.vim
.netrwhist .netrwhist
*~ *~
.versions
### OSX ### ### OSX ###
.DS_Store .DS_Store
@@ -21,4 +21,6 @@ Icon
# Files that might appear on external disk # Files that might appear on external disk
.Spotlight-V100 .Spotlight-V100
.Trashes .Trashes
=======
.idea .idea
>>>>>>> baf4bb99b4ef92c71419931e8fd334e34c051e52

View File

@@ -1,13 +1,6 @@
language: node_js language: node_js
node_js: node_js:
- stable - 0.8
- "0.10" - 0.6
notifications: notifications:
email: false email: false
cache:
directories:
- node_modules
sudo: false

View File

@@ -1,17 +1,39 @@
{ {
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "0.7.12", "version": "0.7.0",
"authors": [ "authors": [
"Faisal Salman <fyzlman@gmail.com>" "Faisal Salman <fyzlman@gmail.com>"
], ],
"private": false, "private": false,
"main": "src/ua-parser.js", "main": "src/ua-parser.js",
"ignore": [ "ignore": [
"build", "build",
"node_modules", "node_modules",
"bower_components", "bower_components",
"test", "test",
"tests" "tests"
], ],
"dependencies": {} "contributors": [
"Faisal Salman <fyzlman@gmail.com>",
"Benjamin Bertrand <bertrand.design@gmail.com>",
"Christopher De Cairos <chris.decairos@gmail.com>",
"Davit Barbakadze <jayarjo@gmail.com>",
"Dmitry Tyschenko <dtyschenko@gmail.com>",
"Douglas Li <doug@knotch.it>",
"Erik Hesselink <hesselink@gmail.com>",
"Fabian Becker <halfdan@xnorfz.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>",
"Lee Treveil <leetreveil@gmail.com>",
"Leonardo <leofiore@libero.it>",
"Michael Hess <mhess@connectify.me>",
"Ross Noble <rosshnoble@gmail.com>",
"Sandro Sonntag <sandro.sonntag@adorsys.de>"
],
"dependencies": {
}
} }

37
build/build.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/bash
# dependencies
JSHINT_DIR="node_modules/jshint/bin/jshint"
MOCHA_DIR="node_modules/mocha/bin/mocha"
UGLIFY_DIR="node_modules/uglify-js/bin/uglifyjs"
# check module directory & install if not found
function check_module {
if ! type $2 &> /dev/null
then
echo "$2 is not found"
if ! type "npm" &> /dev/null
then
echo "npm is not installed"
echo "Exiting"
exit 1
else
echo "Installing $1..."
npm install $1
fi
fi
}
check_module "jshint" $JSHINT_DIR
check_module "mocha" $MOCHA_DIR
check_module "uglify-js" $UGLIFY_DIR
echo "Verifiying code..."
$JSHINT_DIR src/ua-parser.js
echo "Running test..."
$MOCHA_DIR -R nyan test/test.js
echo "Minifying script..."
$UGLIFY_DIR src/ua-parser.js > src/ua-parser.min.js
echo "OK"

14
component.json Normal file
View File

@@ -0,0 +1,14 @@
{
"name": "ua-parser-js",
"version": "0.7.0",
"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
View File

@@ -1 +0,0 @@
<script src="./ua-parser.min.js"></script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,12 +0,0 @@
Package.describe({
name: 'faisalman:ua-parser-js',
version: '0.7.12',
summary: 'Lightweight JavaScript-based user-agent string parser',
git: 'https://github.com/faisalman/ua-parser-js.git',
documentation: 'readme.md'
});
Package.onUse(function (api) {
api.addFiles("src/ua-parser.js");
api.export("UAParser");
});

View File

@@ -1,7 +1,7 @@
{ {
"title": "UAParser.js", "title": "UAParser.js",
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "0.7.12", "version": "0.7.0",
"author": "Faisal Salman <fyzlman@gmail.com> (http://faisalman.com)", "author": "Faisal Salman <fyzlman@gmail.com> (http://faisalman.com)",
"description": "Lightweight JavaScript-based user-agent string parser", "description": "Lightweight JavaScript-based user-agent string parser",
"keywords": [ "keywords": [
@@ -17,67 +17,51 @@
"contributors": [ "contributors": [
"Faisal Salman <fyzlman@gmail.com>", "Faisal Salman <fyzlman@gmail.com>",
"Benjamin Bertrand <bertrand.design@gmail.com>", "Benjamin Bertrand <bertrand.design@gmail.com>",
"Carl C Von Lewin <carlchristianlewin@gmail.com>",
"Christopher De Cairos <chris.decairos@gmail.com>", "Christopher De Cairos <chris.decairos@gmail.com>",
"Davit Barbakadze <jayarjo@gmail.com>", "Davit Barbakadze <jayarjo@gmail.com>",
"Dmitry Tyschenko <dtyschenko@gmail.com>", "Dmitry Tyschenko <dtyschenko@gmail.com>",
"Douglas Li <doug@knotch.it>", "Douglas Li <doug@knotch.it>",
"Dumitru Uzun <contact@duzun.me>",
"Erik Hesselink <hesselink@gmail.com>", "Erik Hesselink <hesselink@gmail.com>",
"Fabian Becker <halfdan@xnorfz.de>", "Fabian Becker <halfdan@xnorfz.de>",
"Hendrik Helwich <h.helwich@iplabs.de>",
"Jackpoll <jackpoll123456@gmail.com>", "Jackpoll <jackpoll123456@gmail.com>",
"Jake Mc <startswithaj@users.noreply.github.com>", "Jake Mc <startswithaj@users.noreply.github.com>",
"John Tantalo <john.tantalo@gmail.com>", "John Tantalo <john.tantalo@gmail.com>",
"John Yanarella <jmy@codecatalyst.com>", "John Yanarella <jmy@codecatalyst.com>",
"Jon Buckley <jon@jbuckley.ca>", "Jon Buckley <jon@jbuckley.ca>",
"Kendall Buchanan <kendall@kendagriff.com>",
"Lee Treveil <leetreveil@gmail.com>", "Lee Treveil <leetreveil@gmail.com>",
"Leonardo <leofiore@libero.it>", "Leonardo <leofiore@libero.it>",
"Max Maurer <maxemanuel.maurer@gmail.com>",
"Michael Hess <mhess@connectify.me>", "Michael Hess <mhess@connectify.me>",
"OtakuSiD <otakusid@gmail.com>",
"Ross Noble <rosshnoble@gmail.com>", "Ross Noble <rosshnoble@gmail.com>",
"Sandro Sonntag <sandro.sonntag@adorsys.de>" "Sandro Sonntag <sandro.sonntag@adorsys.de>"
], ],
"main": "src/ua-parser.js", "main": "src/ua-parser.js",
"scripts": { "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", "test": "./build/build.sh"
"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"
],
"regs": [
"^((?:\\$|(\\s*\\*\\s*@)|(\\s*(?:var|,)?\\s+))(?:LIBVERSION|version)[\\s\\:='\"]+)([0-9]+(?:\\.[0-9]+){2,2})",
"^(\\s?\\*.*v)([0-9]+(?:\\.[0-9]+){2,2})"
]
}, },
"devDependencies": { "devDependencies": {
"jshint": "~1.1.0", "jshint": "~1.1.0",
"mocha": "~1.8.0", "mocha": "~1.7.1",
"requirejs": "^2.3.2", "uglify-js": "~1.3.4"
"uglify-js": "~1.3.4",
"verup": "^1.3.x"
}, },
"repository": { "repository" : {
"type": "git", "type": "git",
"url": "https://github.com/faisalman/ua-parser-js.git" "url": "https://github.com/faisalman/ua-parser-js.git"
}, },
"license": "(GPL-2.0 OR MIT)", "licenses": [
{
"type": "GPLv2",
"url": "http://www.gnu.org/licenses/gpl-2.0.html"
},
{
"type": "MIT",
"url": "http://www.opensource.org/licenses/mit-license.php"
}
],
"engines": { "engines": {
"node": "*" "node": "*"
}, },
"directories": { "directories": {
"dist": "dist", "lib": "src",
"src": "src",
"test": "test" "test": "test"
} }
} }

170
readme.md
View File

@@ -1,36 +1,36 @@
# UAParser.js # UAParser.js
<img align="right" src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/logo.png"> A not-so-lightweight-anymore 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 (~11KB when minified / ~4KB gzipped). Written in vanilla JavaScript, which means it doesn't require any other library and can be used independently. Lightweight JavaScript-based User-Agent string parser. Supports browser & node.js environment. Also available as Component package, Bower package, jQuery.ua, & AMD module
[![Build Status](https://travis-ci.org/faisalman/ua-parser-js.svg?branch=master)](https://travis-ci.org/faisalman/ua-parser-js) [![Build Status](https://travis-ci.org/faisalman/ua-parser-js.png?branch=master)](https://travis-ci.org/faisalman/ua-parser-js)
[![NPM](https://img.shields.io/npm/v/ua-parser-js.svg)](https://www.npmjs.com/package/ua-parser-js)
[![Bower](https://img.shields.io/bower/v/ua-parser-js.svg)](https://bower.io/)
[![CDNJS](https://img.shields.io/cdnjs/v/UAParser.js.svg)](https://cdnjs.com/libraries/UAParser.js)
[![Gratipay](https://img.shields.io/gratipay/team/UAParser.js.svg)](https://gratipay.com/UAParser.js)
[![Flattr this](http://api.flattr.com/button/flattr-badge-large.png)](http://flattr.com/thing/3867907/faisalmanua-parser-js-on-GitHub)
* Author : Faisal Salman <<fyzlman@gmail.com>> * Author : Faisalman <<fyzlman@gmail.com>>
* Demo : http://faisalman.github.io/ua-parser-js * Demo : http://faisalman.github.com/ua-parser-js
* Source : https://github.com/faisalman/ua-parser-js * Source : https://github.com/faisalman/ua-parser-js
## Features
# Methods Extract detailed type of web browser, layout engine, operating system, cpu architecture, and device purely from user-agent string with relatively lightweight footprint (~7KB minified / ~3KB gzipped). Written in vanilla js, which means it doesn't depends on any other library.
![It's over 9000](https://pbs.twimg.com/media/A9LpEG6CIAA5VrT.jpg)
## Methods
* `getBrowser()` * `getBrowser()`
* returns `{ name: '', version: '' }` * returns `{ name: '', major: '', version: '' }`
``` ```
# Possible 'browser.name': # Possible 'browser.name':
Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome, Amaya, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome, Chromium,
Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Epiphany, Fennec, Firebird,
Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,
Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links, Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,
Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari, Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, [Mobile] Safari, Mosaic, Mozilla,
Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet], Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet], Phoenix,
PhantomJS, Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser, Swiftfox,
Swiftfox, Tizen, UCBrowser, Vivaldi, w3m, WeChat, Yandex Tizen, UCBrowser, w3m, Yandex
# 'browser.version' determined dynamically # 'browser.version' & 'browser.major' determined dynamically
``` ```
* `getDevice()` * `getDevice()`
@@ -38,13 +38,12 @@ Swiftfox, Tizen, UCBrowser, Vivaldi, w3m, WeChat, Yandex
``` ```
# Possible 'device.type': # Possible 'device.type':
console, mobile, tablet, smarttv, wearable, embedded console, mobile, tablet
# Possible 'device.vendor': # Possible 'device.vendor':
Acer, Alcatel, Amazon, Apple, Archos, Asus, BenQ, BlackBerry, Dell, GeeksPhone, Acer, Alcatel, Apple, Asus, BenQ, BlackBerry, Dell, GeeksPhone, HP, HTC, Huawei,
Google, HP, HTC, Huawei, Jolla, Lenovo, LG, Meizu, Microsoft, Motorola, Nexian, Lenovo, LG, Meizu, Motorola, Nexian, Nintendo, Nokia, Palm, Panasonic,
Nintendo, Nokia, Nvidia, Ouya, Palm, Panasonic, Polytron, RIM, Samsung, Sharp, RIM, Samsung, Siemens, Sony-Ericsson, Sprint, ZTE
Siemens, Sony-Ericsson, Sprint, Xbox, ZTE
# 'device.model' determined dynamically # 'device.model' determined dynamically
``` ```
@@ -54,8 +53,8 @@ Siemens, Sony-Ericsson, Sprint, Xbox, ZTE
``` ```
# Possible 'engine.name' # Possible 'engine.name'
Amaya, EdgeHTML, Gecko, iCab, KHTML, Links, Lynx, NetFront, NetSurf, Presto, Amaya, Gecko, iCab, KHTML, Links, Lynx, NetFront, NetSurf, Presto, Tasman,
Tasman, Trident, w3m, WebKit Trident, w3m, WebKit
# 'engine.version' determined dynamically # 'engine.version' determined dynamically
``` ```
@@ -65,12 +64,12 @@ Tasman, Trident, w3m, WebKit
``` ```
# Possible 'os.name' # Possible 'os.name'
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS, Contiki, AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS,
Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS, Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,
Joli, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD, Joli, Linux, Mac OS, Mandriva, MeeGo, Minix, Mint, Morph OS, NetBSD, Nintendo,
Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat, OpenBSD, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat, RIM Tablet OS,
RIM Tablet OS, RISC OS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen, RISC OS, Slackware, Solaris, SUSE, Symbian, Tizen, Ubuntu, UNIX, WebOS,
Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk Windows [Phone/Mobile], Zenwalk
# 'os.version' determined dynamically # 'os.version' determined dynamically
``` ```
@@ -80,21 +79,17 @@ Ubuntu, UNIX, VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk
``` ```
# Possible 'cpu.architecture' # Possible 'cpu.architecture'
68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc, 68k, amd64, arm, ia32, ia64, irix, irix64, mips, mips64, pa-risc, ppc, sparc, sparc64
ppc, sparc, sparc64
``` ```
* `getResult()` * `getResult()`
* returns `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }` * returns `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
* `getUA()` * `getUA()`
* returns UA string of current instance * returns UA string of current instance
* `setUA(uastring)` * `setUA(uastring)`
* set & parse UA string * set & parse UA string
## Example
# Example
```html ```html
<!doctype html> <!doctype html>
@@ -113,7 +108,8 @@ ppc, sparc, sparc64
ua: "", ua: "",
browser: { browser: {
name: "", name: "",
version: "" version: "",
major: ""
}, },
engine: { engine: {
name: "", name: "",
@@ -142,7 +138,7 @@ ppc, sparc, sparc64
// this will also produce the same result (without instantiation): // this will also produce the same result (without instantiation):
// var result = UAParser(uastring); // var result = UAParser(uastring);
console.log(result.browser); // {name: "Chromium", version: "15.0.874.106"} console.log(result.browser); // {name: "Chromium", major: "15", version: "15.0.874.106"}
console.log(result.device); // {model: undefined, type: undefined, vendor: undefined} console.log(result.device); // {model: undefined, type: undefined, vendor: undefined}
console.log(result.os); // {name: "Ubuntu", version: "11.10"} console.log(result.os); // {name: "Ubuntu", version: "11.10"}
console.log(result.os.version); // "11.10" console.log(result.os.version); // "11.10"
@@ -167,58 +163,49 @@ ppc, sparc, sparc64
</html> </html>
``` ```
## Using node.js ### Using node.js
```sh ```sh
$ npm install ua-parser-js $ npm install ua-parser-js
``` ```
```js ```js
var http = require('http'); var UAParser = require('ua-parser-js');
var parser = require('ua-parser-js'); var parser = new UAParser();
var ua = request.headers['user-agent']; // user-agent header from an HTTP request
http.createServer(function (req, res) { console.log(parser.setUA(ua).getResult());
// get user-agent header
var ua = parser(req.headers['user-agent']);
// write the result as response
res.end(JSON.stringify(ua, null, ' '));
})
.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
``` ```
## Using requirejs ### Using requirejs
```js ```js
requirejs.config({ require(['ua-parser'], function(UAParser) {
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(); var parser = new UAParser();
console.log(parser.getResult()); console.log(parser.getResult());
}); });
``` ```
## Using bower ### Using component
```sh
$ component install faisalman/ua-parser-js
```
```js
var UAParser = require('ua-parser-js');
var parser = new UAParser();
console.log(parser.getResult());
```
### Using bower
```sh ```sh
$ bower install ua-parser-js $ bower install ua-parser-js
``` ```
## Using meteor ### Using jQuery.ua
```sh Although written in vanilla js (which means it doesn't depends on jQuery), this library will automatically detect if jQuery 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)`.
$ meteor add faisalman: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)`.
```js ```js
// In browser with default user-agent: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0': // In browser with default user-agent: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0':
@@ -239,52 +226,27 @@ console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type:
console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4 console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
``` ```
## Extending regex patterns ## Development
* `UAParser(uastring[, extensions])` Install dependencies
Pass your own regexes to extend the limited matching rules.
```js
// Example:
var uaString = 'MyOwnBrowser/1.3';
var myOwnRegex = [[/(myownbrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]];
var parser = new UAParser(uaString, { browser: myOwnRegex });
console.log(parser.getBrowser()); // {name: "MyOwnBrowser", version: "1.3"}
```
# 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
```sh ```sh
$ npm run test $ npm install jshint
$ npm install mocha
$ npm install uglify-js
``` ```
* Commit and push to your own repository Verify, test, & minify script
* Submit a pull request to this repository under `develop` branch
* Profit?
## Build
Build a minified & packed script
```sh ```sh
$ npm run build $ ./build/build.sh
``` ```
## License
# License
Dual licensed under GPLv2 & MIT Dual licensed under GPLv2 & MIT
Copyright © 2012-2016 Faisal Salman <<fyzlman@gmail.com>> Copyright © 2012-2013 Faisalman <<fyzlman@gmail.com>>
Permission is hereby granted, free of charge, to any person obtaining a copy of 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 this software and associated documentation files (the "Software"), to deal in

View File

@@ -1,11 +1,9 @@
/** // UAParser.js v0.7.0
* UAParser.js v0.7.12 // Lightweight JavaScript-based User-Agent string parser
* Lightweight JavaScript-based User-Agent string parser // https://github.com/faisalman/ua-parser-js
* https://github.com/faisalman/ua-parser-js //
* // Copyright © 2012-2013 Faisalman <fyzlman@gmail.com>
* Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com> // Dual licensed under GPLv2 & MIT
* Dual licensed under GPLv2 & MIT
*/
(function (window, undefined) { (function (window, undefined) {
@@ -16,14 +14,12 @@
///////////// /////////////
var LIBVERSION = '0.7.12', var EMPTY = '',
EMPTY = '',
UNKNOWN = '?', UNKNOWN = '?',
FUNC_TYPE = 'function', FUNC_TYPE = 'function',
UNDEF_TYPE = 'undefined', UNDEF_TYPE = 'undefined',
OBJ_TYPE = 'object', OBJ_TYPE = 'object',
STR_TYPE = 'string', MAJOR = 'major',
MAJOR = 'major', // deprecated
MODEL = 'model', MODEL = 'model',
NAME = 'name', NAME = 'name',
TYPE = 'type', TYPE = 'type',
@@ -33,9 +29,7 @@
CONSOLE = 'console', CONSOLE = 'console',
MOBILE = 'mobile', MOBILE = 'mobile',
TABLET = 'tablet', TABLET = 'tablet',
SMARTTV = 'smarttv', SMARTTV = 'smarttv';
WEARABLE = 'wearable',
EMBEDDED = 'embedded';
/////////// ///////////
@@ -44,32 +38,13 @@
var util = { var util = {
extend : function (regexes, extensions) {
var margedRegexes = {};
for (var i in regexes) {
if (extensions[i] && extensions[i].length % 2 === 0) {
margedRegexes[i] = extensions[i].concat(regexes[i]);
} else {
margedRegexes[i] = regexes[i];
}
}
return margedRegexes;
},
has : function (str1, str2) { has : function (str1, str2) {
if (typeof str1 === "string") { if (typeof str1 === "string") {
return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1; return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
} else {
return false;
} }
}, },
lowerize : function (str) { lowerize : function (str) {
return str.toLowerCase(); return str.toLowerCase();
},
major : function (version) {
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, '');
} }
}; };
@@ -83,41 +58,36 @@
rgx : function () { rgx : function () {
var result, i = 0, j, k, p, q, matches, match, args = arguments;
// loop through all regexes maps // loop through all regexes maps
while (i < args.length && !matches) { for (var result, i = 0, j, k, p, q, matches, match, args = arguments; i < args.length; i += 2) {
var regex = args[i], // even sequence (0,2,4,..) var regex = args[i], // even sequence (0,2,4,..)
props = args[i + 1]; // odd sequence (1,3,5,..) props = args[i + 1]; // odd sequence (1,3,5,..)
// construct object barebones // construct object barebones
if (typeof result === UNDEF_TYPE) { if (typeof(result) === UNDEF_TYPE) {
result = {}; result = {};
for (p in props) { for (p in props) {
if (props.hasOwnProperty(p)){ q = props[p];
q = props[p]; if (typeof(q) === OBJ_TYPE) {
if (typeof q === OBJ_TYPE) { result[q[0]] = undefined;
result[q[0]] = undefined; } else {
} else { result[q] = undefined;
result[q] = undefined;
}
} }
} }
} }
// try matching uastring with regexes // try matching uastring with regexes
j = k = 0; for (j = k = 0; j < regex.length; j++) {
while (j < regex.length && !matches) { matches = regex[j].exec(this.getUA());
matches = regex[j++].exec(this.getUA());
if (!!matches) { if (!!matches) {
for (p = 0; p < props.length; p++) { for (p = 0; p < props.length; p++) {
match = matches[++k]; match = matches[++k];
q = props[p]; q = props[p];
// check if given property is actually array // check if given property is actually array
if (typeof q === OBJ_TYPE && q.length > 0) { if (typeof(q) === OBJ_TYPE && q.length > 0) {
if (q.length == 2) { if (q.length == 2) {
if (typeof q[1] == FUNC_TYPE) { if (typeof(q[1]) == FUNC_TYPE) {
// assign modified match // assign modified match
result[q[0]] = q[1].call(this, match); result[q[0]] = q[1].call(this, match);
} else { } else {
@@ -126,7 +96,7 @@
} }
} else if (q.length == 3) { } else if (q.length == 3) {
// check whether function or regex // check whether function or regex
if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) { if (typeof(q[1]) === FUNC_TYPE && !(q[1].exec && q[1].test)) {
// call function (usually string mapper) // call function (usually string mapper)
result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined; result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
} else { } else {
@@ -140,9 +110,11 @@
result[q] = match ? match : undefined; result[q] = match ? match : undefined;
} }
} }
break;
} }
} }
i += 2;
if(!!matches) break; // break the loop immediately if match found
} }
return result; return result;
}, },
@@ -151,7 +123,7 @@
for (var i in map) { for (var i in map) {
// check if array // check if array
if (typeof map[i] === OBJ_TYPE && map[i].length > 0) { if (typeof(map[i]) === OBJ_TYPE && map[i].length > 0) {
for (var j = 0; j < map[i].length; j++) { for (var j = 0; j < map[i].length; j++) {
if (util.has(map[i][j], str)) { if (util.has(map[i][j], str)) {
return (i === UNKNOWN) ? undefined : i; return (i === UNKNOWN) ? undefined : i;
@@ -175,6 +147,11 @@
browser : { browser : {
oldsafari : { oldsafari : {
major : {
'1' : ['/8', '/1', '/3'],
'2' : '/4',
'?' : '/'
},
version : { version : {
'1.0' : '/8', '1.0' : '/8',
'1.2' : '/1', '1.2' : '/1',
@@ -189,11 +166,6 @@
}, },
device : { device : {
amazon : {
model : {
'Fire Phone' : ['SD', 'KF']
}
},
sprint : { sprint : {
model : { model : {
'Evo Shift 4G' : '7373KT' 'Evo Shift 4G' : '7373KT'
@@ -217,7 +189,6 @@
'7' : 'NT 6.1', '7' : 'NT 6.1',
'8' : 'NT 6.2', '8' : 'NT 6.2',
'8.1' : 'NT 6.3', '8.1' : 'NT 6.3',
'10' : ['NT 6.4', 'NT 10.0'],
'RT' : 'ARM' 'RT' : 'ARM'
} }
} }
@@ -234,131 +205,96 @@
browser : [[ browser : [[
/APP-([\w\s-\d]+)\/((\d+)?[\w\.]+)/i // KTA App
], [NAME, VERSION, MAJOR], [
// Presto based // Presto based
/(opera\smini)\/([\w\.-]+)/i, // Opera Mini /(opera\smini)\/((\d+)?[\w\.-]+)/i, // Opera Mini
/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet /(opera\s[mobiletab]+).+version\/((\d+)?[\w\.-]+)/i, // Opera Mobi/Tablet
/(opera).+version\/([\w\.]+)/i, // Opera > 9.80 /(opera).+version\/((\d+)?[\w\.]+)/i, // Opera > 9.80
/(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80 /(opera)[\/\s]+((\d+)?[\w\.]+)/i // Opera < 9.80
], [NAME, VERSION], [
/(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0 ], [NAME, VERSION, MAJOR], [
], [[NAME, 'Opera Mini'], VERSION], [
/\s(opr)\/([\w\.]+)/i // Opera Webkit /\s(opr)\/((\d+)?[\w\.]+)/i // Opera Webkit
], [[NAME, 'Opera'], VERSION], [ ], [[NAME, 'Opera'], VERSION, MAJOR], [
// Mixed // Mixed
/(kindle)\/([\w\.]+)/i, // Kindle /(kindle)\/((\d+)?[\w\.]+)/i, // Kindle
/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?((\d+)?[\w\.]+)*/i,
// Lunascape/Maxthon/Netfront/Jasmine/Blazer // Lunascape/Maxthon/Netfront/Jasmine/Blazer
// Trident based // Trident based
/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i, /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?((\d+)?[\w\.]*)/i,
// Avant/IEMobile/SlimBrowser/Baidu // Avant/IEMobile/SlimBrowser/Baidu
/(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer /(?:ms|\()(ie)\s((\d+)?[\w\.]+)/i, // Internet Explorer
// Webkit/KHTML based // Webkit/KHTML based
/(rekonq)\/([\w\.]+)*/i, // Rekonq /(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|ovibrowser|bolt|iron)\/((\d+)?[\w\.-]+)/i
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11 /(trident).+rv[:\s]((\d+)?[\w\.]+).+like\sgecko/i // IE11
], [[NAME, 'IE'], VERSION], [ ], [[NAME, 'IE'], VERSION, MAJOR], [
/(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge /(yabrowser)\/((\d+)?[\w\.]+)/i // Yandex
], [NAME, VERSION], [ ], [[NAME, 'Yandex'], VERSION, MAJOR], [
/(yabrowser)\/([\w\.]+)/i // Yandex /(comodo_dragon)\/((\d+)?[\w\.]+)/i // Comodo Dragon
], [[NAME, 'Yandex'], VERSION], [ ], [[NAME, /_/g, ' '], VERSION, MAJOR], [
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?((\d+)?[\w\.]+)/i
], [[NAME, /_/g, ' '], VERSION], [
/(micromessenger)\/([\w\.]+)/i // WeChat
], [[NAME, 'WeChat'], VERSION], [
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
], [VERSION, [NAME, 'MIUI Browser']], [
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
/android.+samsungbrowser\/([\w\.]+)/i,
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
], [VERSION, [NAME, 'Android Browser']], [
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
// Chrome/OmniWeb/Arora/Tizen/Nokia // Chrome/OmniWeb/Arora/Tizen/Nokia
/(qqbrowser)[\/\s]?([\w\.]+)/i ], [NAME, VERSION, MAJOR], [
// QQBrowser
], [NAME, VERSION], [
/(uc\s?browser)[\/\s]?([\w\.]+)/i, /(dolfin)\/((\d+)?[\w\.]+)/i // Dolphin
/ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i, ], [[NAME, 'Dolphin'], VERSION, MAJOR], [
/juc.+(ucweb)[\/\s]?([\w\.]+)/i
// UCBrowser
], [[NAME, 'UCBrowser'], VERSION], [
/(dolfin)\/([\w\.]+)/i // Dolphin /((?:android.+)crmo|crios)\/((\d+)?[\w\.]+)/i // Chrome for Android/iOS
], [[NAME, 'Dolphin'], VERSION], [ ], [[NAME, 'Chrome'], VERSION, MAJOR], [
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS /version\/((\d+)?[\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
], [[NAME, 'Chrome'], VERSION], [ ], [VERSION, MAJOR, [NAME, 'Mobile Safari']], [
/;fbav\/([\w\.]+);/i // Facebook App for iOS /version\/((\d+)?[\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
], [VERSION, [NAME, 'Facebook']], [ ], [VERSION, MAJOR, NAME], [
/fxios\/([\w\.-]+)/i // Firefox for iOS /webkit.+?(mobile\s?safari|safari)((\/[\w\.]+))/i // Safari < 3.0
], [VERSION, [NAME, 'Firefox']], [ ], [NAME, [MAJOR, mapper.str, maps.browser.oldsafari.major], [VERSION, mapper.str, maps.browser.oldsafari.version]], [
/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari /(konqueror)\/((\d+)?[\w\.]+)/i, // Konqueror
], [VERSION, [NAME, 'Mobile Safari']], [ /(webkit|khtml)\/((\d+)?[\w\.]+)/i
], [NAME, VERSION, MAJOR], [
/version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
], [VERSION, NAME], [
/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], [
// Gecko based // Gecko based
/(navigator|netscape)\/([\w\.-]+)/i // Netscape /(navigator|netscape)\/((\d+)?[\w\.-]+)/i // Netscape
], [[NAME, 'Netscape'], VERSION], [ ], [[NAME, 'Netscape'], VERSION, MAJOR], [
/(swiftfox)/i, // Swiftfox /(swiftfox)/i, // Swiftfox
/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?((\d+)?[\w\.\+]+)/i,
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror // 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)\/((\d+)?[\w\.-]+)/i,
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla /(mozilla)\/((\d+)?[\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
// Other // Other
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i, /(uc\s?browser|polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|qqbrowser)[\/\s]?((\d+)?[\w\.]+)/i,
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir // UCBrowser/Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/QQBrowser
/(links)\s\(([\w\.]+)/i, // Links /(links)\s\(((\d+)?[\w\.]+)/i, // Links
/(gobrowser)\/?([\w\.]+)*/i, // GoBrowser /(gobrowser)\/?((\d+)?[\w\.]+)*/i, // GoBrowser
/(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser /(ice\s?browser)\/v?((\d+)?[\w\._]+)/i, // ICE Browser
/(mosaic)[\/\s]([\w\.]+)/i // Mosaic /(mosaic)[\/\s]((\d+)?[\w\.]+)/i // Mosaic
], [NAME, VERSION] ], [NAME, VERSION, MAJOR], [
/* /////////////////////
// Media players BEGIN
////////////////////////
, [
/(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
/(coremedia) v((\d+)[\w\._]+)/i /(coremedia) v((\d+)[\w\._]+)/i
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i, /(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 // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
@@ -366,12 +302,12 @@
/(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
/(lg player|nexplayer)\s((\d+)[\d\.]+)/i, /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
/player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(flrp)\/((\d+)[\w\.-]+)/i // Flip Player /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
], [[NAME, 'Flip Player'], VERSION], [ ], [[NAME, 'Flip Player'], VERSION, MAJOR], [
/(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
// FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
@@ -379,23 +315,23 @@
/(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
// Gstreamer // Gstreamer
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
/(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i, /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
// Java/urllib/requests/wget/cURL // Java/urllib/requests/wget/cURL
/(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG) /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S /(htc_one_s)\/((\d+)[\d\.]+)/i, // HTC One S
], [[NAME, /_/g, ' '], VERSION], [ ], [[NAME, /_/g, ' '], VERSION, MAJOR], [
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i,
// MPlayer SVN // MPlayer SVN
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i, // MPlayer
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(mplayer)/i, // MPlayer (no other info) /(mplayer)/i, // MPlayer (no other info)
/(yourmuze)/i, // YourMuze /(yourmuze)/i, // YourMuze
@@ -403,18 +339,18 @@
], [NAME], [ ], [NAME], [
/(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
/(winamp)\s((\d+)[\w\.-]+)/i, /(winamp)\s((\d+)[\w\.-]+)/i,
/(winamp)mpeg\/((\d+)[\w\.-]+)/i /(winamp)mpeg\/((\d+)[\w\.-]+)/i
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info) /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
// inlight radio // inlight radio
@@ -423,36 +359,32 @@
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
// QuickTime/RealMedia/RadioApp/RadioClientApplication/ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
// SoundTap/Totem/Stagefright/Streamium // SoundTap/Totem/Stagefright/Streamium
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(smp)((\d+)[\d\.]+)/i // SMP /(smp)((\d+)[\d\.]+)/i // SMP
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
/(vlc)\/((\d+)[\w\.-]+)/i, /(vlc)\/((\d+)[\w\.-]+)/i,
/(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
/(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000 /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
/(itunes)\/((\d+)[\d\.]+)/i // iTunes /(itunes)\/((\d+)[\d\.]+)/i // iTunes
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
/(windows-media-player)\/((\d+)[\w\.-]+)/i /(windows-media-player)\/((\d+)[\w\.-]+)/i
], [[NAME, /-/g, ' '], VERSION], [ ], [[NAME, /-/g, ' '], VERSION, MAJOR], [
/windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
// Windows Media Server // Windows Media Server
], [VERSION, [NAME, 'Windows']], [ ], [VERSION, MAJOR, [NAME, 'Windows']], [
/(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
], [NAME, VERSION], [ ], [NAME, VERSION, MAJOR], [
/(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
/(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
], [[NAME, 'rad.io'], VERSION] ], [[NAME, 'rad.io'], VERSION, MAJOR]
//////////////////////
// Media players END
////////////////////*/
], ],
@@ -477,9 +409,9 @@
/(sun4\w)[;\)]/i // SPARC /(sun4\w)[;\)]/i // SPARC
], [[ARCHITECTURE, 'sparc']], [ ], [[ARCHITECTURE, 'sparc']], [
/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i /(ia64(?=;)|68k(?=\))|arm(?=v\d+;)|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC // IA64, 68K, ARM, IRIX, MIPS, SPARC, PA-RISC
], [[ARCHITECTURE, util.lowerize]] ], [ARCHITECTURE, util.lowerize]
], ],
device : [[ device : [[
@@ -493,18 +425,14 @@
/(apple\s{0,1}tv)/i // Apple TV /(apple\s{0,1}tv)/i // Apple TV
], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [ ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
/(archos)\s(gamepad2?)/i, // Archos
/(hp).+(touchpad)/i, // HP TouchPad /(hp).+(touchpad)/i, // HP TouchPad
/(hp).+(tablet)/i, // HP Tablet
/(kindle)\/([\w\.]+)/i, // Kindle /(kindle)\/([\w\.]+)/i, // Kindle
/\s(nook)[\w\s]+build\/(\w+)/i, // Nook /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
/(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
], [VENDOR, MODEL, [TYPE, TABLET]], [ ], [VENDOR, MODEL, [TYPE, TABLET]], [
/(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i // Kindle Fire HD /(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i, // Kindle Fire HD
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
/(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i // Fire Phone
], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
/\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
], [MODEL, VENDOR, [TYPE, MOBILE]], [ ], [MODEL, VENDOR, [TYPE, MOBILE]], [
@@ -512,196 +440,76 @@
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [ ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
/(blackberry)[\s-]?(\w+)/i, // BlackBerry /(blackberry)[\s-]?(\w+)/i, // BlackBerry
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i, /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola)[\s_-]?([\w-]+)*/i,
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola
/(hp)\s([\w\s]+\w)/i, // HP iPAQ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
/(asus)-?(\w+)/i // Asus /(asus)-?(\w+)/i // Asus
], [VENDOR, MODEL, [TYPE, MOBILE]], [ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
/\(bb10;\s(\w+)/i // BlackBerry 10 /\((bb10);\s(\w+)/i // BlackBerry 10
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [ ], [[VENDOR, 'BlackBerry'], MODEL, [TYPE, MOBILE]], [
// Asus Tablets // Asus Tablets
/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i /android.+((transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7))/i
], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [ ], [[VENDOR, 'Asus'], MODEL, [TYPE, TABLET]], [
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony /(sony)\s(tablet\s[ps])/i // Sony Tablets
/(sony)?(?:sgp.+)\sbuild\//i ], [VENDOR, MODEL, [TYPE, TABLET]], [
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
/(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [
/\s(ouya)\s/i, // Ouya
/(nintendo)\s([wids3u]+)/i // Nintendo /(nintendo)\s([wids3u]+)/i // Nintendo
], [VENDOR, MODEL, [TYPE, CONSOLE]], [ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
/android.+;\s(shield)\sbuild/i // Nvidia /((playstation)\s[3portablevi]+)/i // Playstation
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [ ], [[VENDOR, 'Sony'], MODEL, [TYPE, CONSOLE]], [
/(playstation\s[34portablevi]+)/i // Playstation
], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
/(sprint\s(\w+))/i // Sprint Phones /(sprint\s(\w+))/i // Sprint Phones
], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [ ], [[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 /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
/(zte)-(\w+)*/i, // ZTE /(zte)-(\w+)*/i, // ZTE
/(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i /(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
// Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony // Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
/(nexus\s9)/i // HTC Nexus 9
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
/(nexus\s6p)/i // Huawei Nexus 6P
], [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 // Motorola
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i, /\s((milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?))[\w\s]+build\//i,
/mot[\s-]?(\w+)*/i, /(mot)[\s-]?(\w+)*/i
/(XT\d{3,4}) build\//i, ], [[VENDOR, 'Motorola'], MODEL, [TYPE, MOBILE]], [
/(nexus\s6)/i /android.+\s((mz60\d|xoom[\s2]{0,2}))\sbuild\//i
], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [ ], [[VENDOR, 'Motorola'], MODEL, [TYPE, TABLET]], [
/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices /android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n8000|sgh-t8[56]9|nexus 10))/i
], [[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]], [
/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 ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
/smart-tv.+(samsung)/i /((s[cgp]h-\w+|gt-\w+|galaxy\snexus))/i,
], [VENDOR, [TYPE, SMARTTV], MODEL], [
/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
/(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i, /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
/sec-((sgh\w+))/i /sec-((sgh\w+))/i
], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [ ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
/(sie)-(\w+)*/i // Siemens
/sie-(\w+)*/i // Siemens ], [[VENDOR, 'Siemens'], MODEL, [TYPE, MOBILE]], [
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
/(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
/(nokia)[\s_-]?([\w-]+)*/i /(nokia)[\s_-]?([\w-]+)*/i
], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [ ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
/android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer /android\s3\.[\s\w-;]{10}((a\d{3}))/i // Acer
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [ ], [[VENDOR, 'Acer'], MODEL, [TYPE, TABLET]], [
/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet /android\s3\.[\s\w-;]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [ ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
/(lg) netcast\.tv/i // LG SmartTV /(lg) netcast\.tv/i // LG SmartTV
], [VENDOR, MODEL, [TYPE, SMARTTV]], [ ], [VENDOR, [TYPE, SMARTTV]], [
/(nexus\s[45])/i, // LG /((nexus\s[45]))/i, // LG
/lg[e;\s\/-]+(\w+)*/i /(lg)[e;\s-\/]+(\w+)*/i
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [ ], [[VENDOR, 'LG'], MODEL, [TYPE, MOBILE]], [
/android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo /android.+((ideatab[a-z0-9\-\s]+))/i // Lenovo
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [ ], [[VENDOR, 'Lenovo'], MODEL, [TYPE, TABLET]], [
/linux;.+((jolla));/i // Jolla
], [VENDOR, MODEL, [TYPE, MOBILE]], [
/((pebble))app\/[\d\.]+\s/i // Pebble
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
/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|note lte)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
/android.+a000(1)\s+build/i // OnePlus
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
/\s(tablet)[;\/]/i, // Unidentifiable Tablet
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
], [[TYPE, util.lowerize], VENDOR, MODEL]
/*//////////////////////////
// TODO: move to string map
////////////////////////////
/(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]], [
/(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]], [
/(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]], [
/(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]], [
/(V972M)/i // ZTE V972M
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
/(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]], [
/////////////
// END TODO
///////////*/
/(mobile|tablet);.+rv\:.+gecko\//i // Unidentifiable
], [TYPE, VENDOR, MODEL]
], ],
engine : [[ engine : [[
/APP-([\w\s-\d]+)\/((\d+)?[\w\.]+)/i // KTA App
/windows.+\sedge\/([\w\.]+)/i // EdgeHTML ], [[NAME, 'Mobile-App'], VERSION], [
], [VERSION, [NAME, 'EdgeHTML']], [
/(presto)\/([\w\.]+)/i, // Presto /(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)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
@@ -716,11 +524,10 @@
os : [[ os : [[
// Windows based // Windows based
/microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes) /microsoft\s(windows)\s(vista|xp)/i, // Windows (iTunes)
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i, // Windows Phone /(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [ ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [ ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
@@ -729,27 +536,23 @@
/\((bb)(10);/i // BlackBerry 10 /\((bb)(10);/i // BlackBerry 10
], [[NAME, 'BlackBerry'], VERSION], [ ], [[NAME, 'BlackBerry'], VERSION], [
/(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
/(tizen)[\/\s]([\w\.]+)/i, // Tizen /(tizen)\/([\w\.]+)/i, // Tizen
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i, /(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego)[\/\s-]?([\w\.]+)*/i
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo
/linux;.+(sailfish);/i // Sailfish OS
], [NAME, VERSION], [ ], [NAME, VERSION], [
/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
], [[NAME, 'Symbian'], VERSION], [ ], [[NAME, 'Symbian'], VERSION],[
/\((series40);/i // Series 40
], [NAME], [
/mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
], [[NAME, 'Firefox OS'], VERSION], [ ], [[NAME, 'Firefox OS'], VERSION], [
// Console // Console
/(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation /(nintendo|playstation)\s([wids3portablevu]+)/i, // Nintendo/Playstation
// GNU/Linux based // 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|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk)[\/\s-]?([\w\.-]+)*/i,
/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk
/(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
/(gnu)\s?([\w\.]+)*/i // GNU /(gnu)\s?([\w\.]+)*/i // GNU
], [NAME, VERSION], [ ], [NAME, VERSION], [
@@ -765,21 +568,17 @@
/\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],[ ], [NAME, VERSION],[
/(haiku)\s(\w+)/i // Haiku /(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i // iOS
], [NAME, VERSION],[
/(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [ ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
/(mac\sos\sx)\s?([\w\s\.]+\w)*/i, /(mac\sos\sx)\s?([\w\s\.]+\w)*/i // Mac OS
/(macintosh|mac(?=_powerpc)\s)/i // Mac OS ], [NAME, [VERSION, /_/g, '.']], [
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
// Other // Other
/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris /(haiku)\s(\w+)/i, // Haiku
/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i, /(macintosh|mac(?=_powerpc)|plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos)/i,
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS
/(unix)\s?([\w\.]+)*/i // UNIX /(unix)\s?([\w\.]+)*/i // UNIX
], [NAME, VERSION] ], [NAME, VERSION]
] ]
@@ -791,31 +590,27 @@
//////////////// ////////////////
var UAParser = function (uastring, extensions) { var UAParser = function (uastring) {
if (!(this instanceof UAParser)) {
return new UAParser(uastring, extensions).getResult();
}
var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY); var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
if (!(this instanceof UAParser)) {
return new UAParser(uastring).getResult();
}
this.getBrowser = function () { this.getBrowser = function () {
var browser = mapper.rgx.apply(this, rgxmap.browser); return mapper.rgx.apply(this, regexes.browser);
browser.major = util.major(browser.version);
return browser;
}; };
this.getCPU = function () { this.getCPU = function () {
return mapper.rgx.apply(this, rgxmap.cpu); return mapper.rgx.apply(this, regexes.cpu);
}; };
this.getDevice = function () { this.getDevice = function () {
return mapper.rgx.apply(this, rgxmap.device); return mapper.rgx.apply(this, regexes.device);
}; };
this.getEngine = function () { this.getEngine = function () {
return mapper.rgx.apply(this, rgxmap.engine); return mapper.rgx.apply(this, regexes.engine);
}; };
this.getOS = function () { this.getOS = function () {
return mapper.rgx.apply(this, rgxmap.os); return mapper.rgx.apply(this, regexes.os);
}; };
this.getResult = function() { this.getResult = function() {
return { return {
@@ -834,36 +629,7 @@
ua = uastring; ua = uastring;
return this; return this;
}; };
return this; this.setUA(ua);
};
UAParser.VERSION = LIBVERSION;
UAParser.BROWSER = {
NAME : NAME,
MAJOR : MAJOR, // deprecated
VERSION : VERSION
};
UAParser.CPU = {
ARCHITECTURE : ARCHITECTURE
};
UAParser.DEVICE = {
MODEL : MODEL,
VENDOR : VENDOR,
TYPE : TYPE,
CONSOLE : CONSOLE,
MOBILE : MOBILE,
SMARTTV : SMARTTV,
TABLET : TABLET,
WEARABLE: WEARABLE,
EMBEDDED: EMBEDDED
};
UAParser.ENGINE = {
NAME : NAME,
VERSION : VERSION
};
UAParser.OS = {
NAME : NAME,
VERSION : VERSION
}; };
@@ -875,41 +641,35 @@
// check js environment // check js environment
if (typeof(exports) !== UNDEF_TYPE) { if (typeof(exports) !== UNDEF_TYPE) {
// nodejs env // nodejs env
if (typeof module !== UNDEF_TYPE && module.exports) { if (typeof(module) !== UNDEF_TYPE && module.exports) {
exports = module.exports = UAParser; exports = module.exports = UAParser;
} }
exports.UAParser = UAParser; exports.UAParser = UAParser;
} else { } else {
// browser env
window.UAParser = UAParser;
// requirejs env (optional) // requirejs env (optional)
if (typeof(define) === FUNC_TYPE && define.amd) { if (typeof(define) === FUNC_TYPE && define.amd) {
define(function () { define(function () {
return UAParser; return UAParser;
}); });
} else { }
// browser env // jQuery specific (optional)
window.UAParser = UAParser; if (typeof(window.jQuery) !== UNDEF_TYPE) {
var $ = window.jQuery;
var parser = new UAParser();
$.ua = parser.getResult();
$.ua.get = function() {
return parser.getUA();
};
$.ua.set = function (uastring) {
parser.setUA(uastring);
var result = parser.getResult();
for (var prop in result) {
$.ua[prop] = result[prop];
}
};
} }
} }
// jQuery/Zepto specific (optional) })(this);
// 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 parser = new UAParser();
$.ua = parser.getResult();
$.ua.get = function() {
return parser.getUA();
};
$.ua.set = function (uastring) {
parser.setUA(uastring);
var result = parser.getResult();
for (var prop in result) {
$.ua[prop] = result[prop];
}
};
}
})(typeof window === 'object' ? window : this);

1
src/ua-parser.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -102,5 +102,21 @@
{ {
"architecture" : "amd64" "architecture" : "amd64"
} }
},
{
"desc" : "KTB iPad",
"ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
"expect" :
{
"architecture" : "undefined"
}
},
{
"desc" : "KTB-Nexus 5",
"ua" : "APP-My App/1.0 (Linux; Android 4.2.1; Nexus 5 Build/JOP40D)",
"expect" :
{
"architecture" : "undefined"
}
} }
] ]

View File

@@ -1,34 +1,4 @@
[ [
{
"desc" : "Asus Nexus 7",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 7 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
"expect" :
{
"vendor" : "Asus",
"model" : "Nexus 7",
"type" : "tablet"
}
},
{
"desc" : "Asus Padfone",
"ua" : "Mozilla/5.0 (Linux; Android 4.1.1; PadFone 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36",
"expect" :
{
"vendor" : "Asus",
"model" : "PadFone",
"type" : "tablet"
}
},
{
"desc" : "Desktop (IE11 with Tablet string)",
"ua" : "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; GWX:MANAGED; rv:11.0) like Gecko",
"expect" :
{
"vendor" : "undefined",
"model" : "undefined",
"type" : "undefined"
}
},
{ {
"desc" : "HTC Evo Shift 4G", "desc" : "HTC Evo Shift 4G",
"ua" : "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0", "ua" : "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0",
@@ -39,36 +9,6 @@
"type" : "mobile" "type" : "mobile"
} }
}, },
{
"desc" : "HTC Nexus 9",
"ua" : "Mozilla/5.0 (Linux; Android 5.0; Nexus 9 Build/LRX21R) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Mobile Crosswalk/7.36.154.13 Safari/537.36",
"expect" :
{
"vendor" : "HTC",
"model" : "Nexus 9",
"type" : "tablet"
}
},
{
"desc" : "Huawei Nexus 6P",
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC19V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537",
"expect" :
{
"vendor" : "Huawei",
"model" : "Nexus 6P",
"type" : "mobile"
}
},
{
"desc" : "iPod",
"ua" : "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
"expect" :
{
"vendor" : "Apple",
"model" : "iPod touch",
"type" : "mobile"
}
},
{ {
"desc" : "LG Nexus 4", "desc" : "LG Nexus 4",
"ua" : "Mozilla/5.0 (Linux; Android 4.2.1; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19", "ua" : "Mozilla/5.0 (Linux; Android 4.2.1; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19",
@@ -89,36 +29,6 @@
"type" : "mobile" "type" : "mobile"
} }
}, },
{
"desc" : "Microsoft Lumia 950",
"ua" : "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586",
"expect" :
{
"vendor" : "Microsoft",
"model" : "Lumia 950",
"type" : "mobile"
}
},
{
"desc" : "Motorola Moto X",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; XT1097 Build/KXE21.187-38) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Motorola",
"model" : "XT1097",
"type" : "mobile"
}
},
{
"desc" : "Motorola Nexus 6",
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Motorola",
"model" : "Nexus 6",
"type" : "mobile"
}
},
{ {
"desc" : "Motorola Droid RAZR 4G", "desc" : "Motorola Droid RAZR 4G",
"ua" : "Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "ua" : "Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; DROID RAZR 4G Build/6.5.1-73_DHD-11_M1-29) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
@@ -150,19 +60,109 @@
} }
}, },
{ {
"desc" : "Moto X", "desc" : "AppleCoreMedia",
"ua" : "Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; XT1058 Build/13.9.0Q2.X-70-GHOST-ATT_LE-2) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30", "ua" : "AppleCoreMedia/1.0.0.10A403 (iPad; U; CPU OS 6_0 like Mac OS X; it_it)",
"expect" : "expect" :
{ {
"vendor" : "Motorola", "vendor" : "Apple",
"model" : "XT1058", "model" : "iPad",
"type" : "tablet"
}
},
{
"desc" : "AppleTV",
"ua" : "AppleTV/3.0.2 (Macintosh; Intel Mac OS X 10.4.7) AppleWebKit/528.18",
"expect" :
{
"vendor" : "Apple",
"model" : "Apple TV",
"type" : "undefined"
}
},
{
"desc" : "AppleTV",
"ua" : "AppleCoreMedia/1.0.0.11B511d (Apple TV; U; CPU OS 7_0_3 like Mac OS X; es_es)",
"expect" :
{
"vendor" : "Apple",
"model" : "Apple TV",
"type" : "undefined"
}
},
{
"desc" : "Dalvik",
"ua" : "Dalvik/1.2.0 (Linux; U; Android 2.2.1; GT-S5830L Build/FROYO)",
"expect" :
{
"vendor" : "Samsung",
"model" : "GT-S5830L",
"type" : "mobile"
}
},
{
"desc" : "GStreamer",
"ua" : "GStreamer souphttpsrc (compatible; LG NetCast.TV-2012) libsoup/2.34.2",
"expect" :
{
"vendor" : "LG",
"model" : "undefined",
"type" : "smarttv"
}
},
{
"desc" : "HTC Streaming Player",
"ua" : "HTC Streaming Player htc_asia_wwe / 1.0 / endeavoru / 4.1.1",
"expect" :
{
"vendor" : "HTC",
"model" : "undefined",
"type" : "mobile"
}
},
{
"desc" : "HTC One S",
"ua" : "HTC_One_S/3.16.111.10",
"expect" :
{
"vendor" : "HTC",
"model" : "One S",
"type" : "mobile"
}
},
{
"desc" : "LG Player",
"ua" : "LG Player 1.0; Android",
"expect" :
{
"vendor" : "LG",
"model" : "undefined",
"type" : "mobile"
}
},
{
"desc" : "NexPlayer",
"ua" : "LG-P700/V10k-DEC-12-2012 Player/NexPlayer 4.0 for Android",
"expect" :
{
"vendor" : "LG",
"model" : "P700",
"type" : "mobile"
}
},
{
"desc" : "LG Player",
"ua" : "LGE400/V10b Player/LG Player 1.0",
"expect" :
{
"vendor" : "LG",
"model" : "E400",
"type" : "mobile" "type" : "mobile"
} }
}, },
{ {
"desc" : "Nokia3xx", "desc" : "Nokia3xx",
"ua" : "Nokia303/14.87 CLDC-1.1", "ua" : "Nokia303/14.87 CLDC-1.1",
"expect" : "expect" :
{ {
"vendor" : "Nokia", "vendor" : "Nokia",
"model" : "303", "model" : "303",
@@ -170,23 +170,43 @@
} }
}, },
{ {
"desc" : "OnePlus One", "desc" : "KTB-iPhone",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; A0001 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36", "ua" : "APP-BE/1.0 (iPhone; Apple; CPU iPhone OS 7_0 like Mac OS X)",
"expect" : "expect" :
{ {
"vendor" : "OnePlus", "vendor" : "Apple",
"model" : "1", "model" : "iPhone",
"type" : "mobile" "type" : "mobile"
} }
}, },
{ {
"desc" : "Philips SmartTV", "desc" : "stagefright",
"ua" : "Opera/9.80 HbbTV/1.1.1 (; Philips; ; ; ; ) NETTV/4.0.2; en) Version/11.60", "ua" : "Samsung GT-I9070 stagefright/1.1 (Linux;Android 2.3.6)",
"expect" :
{
"vendor" : "Samsung",
"model" : "GT-I9070",
"type" : "mobile"
}
},
{
"desc" : "KTB-iPod Touch",
"ua" : "APP-BE/1.0 (iPod touch; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
"expect" : "expect" :
{ {
"vendor" : "Philips", "vendor" : "Apple",
"model" : "", "model" : "iPod touch",
"type" : "smarttv" "type" : "mobile"
}
},
{
"desc" : "rad.io",
"ua" : "rad.io 1.18.1 rv:593 (iPhone 4S; iPhone OS 7.0.4; it_IT)",
"expect" :
{
"vendor" : "Apple",
"model" : "iPhone 4S",
"type" : "mobile"
} }
}, },
{ {
@@ -200,283 +220,22 @@
} }
}, },
{ {
"desc" : "Samsung Galaxy Note 8", "desc" : "KTB-iPad",
"ua" : "Mozilla/5.0 (Linux; Android 4.2.2; GT-N5100 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36", "ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
"expect" : "expect" :
{ {
"vendor" : "Samsung", "vendor" : "Apple",
"model" : "GT-N5100", "model" : "iPad",
"type" : "tablet" "type" : "tablet"
} }
}, },
{ {
"desc" : "Samsung SM-T231", "desc" : "KTB-Nexus 5",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T231 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36", "ua" : "APP-My App/1.0 (Linux; Android 4.2.1; Nexus 5 Build/JOP40D)",
"expect" : "expect" :
{ {
"vendor" : "Samsung", "vendor" : "LG",
"model" : "SM-T231", "model" : "Nexus 5",
"type" : "tablet"
}
},
{
"desc" : "Samsung SM-T700",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T700 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
"expect" :
{
"vendor" : "Samsung",
"model" : "SM-T700",
"type" : "tablet"
}
},
{
"desc" : "Samsung SM-T520",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-T520 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
"expect" :
{
"vendor" : "Samsung",
"model" : "SM-T520",
"type" : "tablet"
}
},
{
"desc" : "Samsung SmartTV2011",
"ua" : "HbbTV/1.1.1 (;;;;;) Maple;2011",
"expect" :
{
"vendor" : "Samsung",
"model" : "SmartTV2011",
"type" : "smarttv"
}
},
{
"desc" : "Samsung SmartTV2012",
"ua" : "HbbTV/1.1.1 (;Samsung;SmartTV2012;;;) WebKit",
"expect" :
{
"vendor" : "Samsung",
"model" : "SmartTV2012",
"type" : "smarttv"
}
},
{
"desc" : "Samsung SmartTV2014",
"ua" : "HbbTV/1.1.1 (;Samsung;SmartTV2014;T-NT14UDEUC-1060.4;;) WebKit",
"expect" :
{
"vendor" : "Samsung",
"model" : "SmartTV2014",
"type" : "smarttv"
}
},
{
"desc" : "Samsung SmartTV",
"ua" : "Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1",
"expect" :
{
"vendor" : "Samsung",
"model" : "undefined",
"type" : "smarttv"
}
},
{
"desc" : "Sony C5303 (Xperia SP)",
"ua" : "Mozilla/5.0 (Linux; Android 4.3; C5303 Build/12.1.A.1.205) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Phone",
"type" : "mobile"
}
},
{
"desc" : "Sony SO-02F (Xperia Z1 F)",
"ua" : "Mozilla/5.0 (Linux; Android 4.2.2; SO-02F Build/14.1.H.2.119) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Phone",
"type" : "mobile"
}
},
{
"desc" : "Sony D6653 (Xperia Z3)",
"ua" : "Mozilla/5.0 (Linux; Android 4.4; D6653 Build/23.0.A.0.376) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Phone",
"type" : "mobile"
}
},
{
"desc" : "Sony Xperia SOL25 (ZL2)",
"ua" : "Mozilla/5.0 (Linux; U; Android 4.4; SOL25 Build/17.1.1.C.1.64) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Phone",
"type" : "mobile"
}
},
{
"desc" : "Sony Xperia SP",
"ua" : "Mozilla/5.0 (Linux; Android 4.3; C5302 Build/12.1.A.1.201) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Phone",
"type" : "mobile"
}
},
{
"desc" : "Sony SGP521 (Xperia Z2 Tablet)",
"ua" : "Mozilla/5.0 (Linux; Android 4.4; SGP521 Build/17.1.A.0.432) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Tablet",
"type" : "tablet"
}
},
{
"desc" : "Sony Tablet S",
"ua" : "Mozilla/5.0 (Linux; U; Android 3.1; Sony Tablet S Build/THMAS10000) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Tablet",
"type" : "tablet"
}
},
{
"desc" : "Sony Tablet Z LTE",
"ua" : "Mozilla/5.0 (Linux; U; Android 4.1; SonySGP321 Build/10.2.C.0.143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
"expect" :
{
"vendor" : "Sony",
"model" : "Xperia Tablet",
"type" : "tablet"
}
},
{
"desc" : "Xiaomi 2013023",
"ua" : "Mozilla/5.0 (Linux; U; Android 4.2.2; en-US; 2013023 Build/HM2013023) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/10.0.1.512 U3/0.8.0 Mobile Safari/533.1",
"expect" :
{
"vendor" : "Xiaomi",
"model" : "2013023",
"type" : "mobile"
}
},
{
"desc" : "Xiaomi Hongmi Note 1W",
"ua" : "Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; HM NOTE 1W Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.9.439 U3/0.8.0 Mobile Safari/533.1",
"expect" :
{
"vendor" : "Xiaomi",
"model" : "HM NOTE 1W",
"type" : "mobile"
}
},
{
"desc" : "Xiaomi Mi 3C",
"ua" : "Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; MI 3C Build/JLS36C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.9.439 U3/0.8.0 Mobile Safari/533.1",
"expect" :
{
"vendor" : "Xiaomi",
"model" : "MI 3C",
"type" : "mobile"
}
},
{
"desc" : "Xiaomi Mi Note",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.4; MI NOTE LTE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Xiaomi",
"model" : "MI NOTE LTE",
"type" : "mobile"
}
},
{
"desc" : "Xiaomi Mi One Plus",
"ua" : "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; MI-ONE Plus Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
"expect" :
{
"vendor" : "Xiaomi",
"model" : "MI-ONE Plus",
"type" : "mobile"
}
},
{
"desc" : "PlayStation 4",
"ua" : "Mozilla/5.0 (PlayStation 4 3.00) AppleWebKit/537.73 (KHTML, like Gecko)",
"expect" :
{
"vendor" : "Sony",
"model" : "PlayStation 4",
"type" : "console"
}
},
{
"desc" : "Galaxy Nexus",
"ua" : "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",
"expect" :
{
"vendor" : "Samsung",
"model" : "Galaxy Nexus",
"type" : "mobile"
}
},
{
"desc" : "Samsung Galaxy S5",
"ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900F Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Samsung",
"model" : "SM-G900F",
"type" : "mobile"
}
},
{
"desc" : "Samsung Galaxy S6",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-G920I Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
"expect" :
{
"vendor" : "Samsung",
"model" : "SM-G920I",
"type" : "mobile"
}
},
{
"desc" : "Samsung Galaxy S6 Edge",
"ua" : "Mozilla/5.0 (Linux; Android 4.4.2; SM-G925I Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36",
"expect" :
{
"vendor" : "Samsung",
"model" : "SM-G925I",
"type" : "mobile"
}
},
{
"desc" : "Samsung Galaxy Note 5 Chrome",
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; SM-N920C Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Samsung",
"model" : "SM-N920C",
"type" : "mobile"
}
}
,
{
"desc" : "Samsung Galaxy Note 5 Samsung Browser",
"ua" : "Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-N920C Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36",
"expect" :
{
"vendor" : "Samsung",
"model" : "SM-N920C",
"type" : "mobile" "type" : "mobile"
} }
} }

View File

@@ -1,13 +1,4 @@
[ [
{
"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",
"expect" :
{
"name" : "EdgeHTML",
"version" : "12.0"
}
},
{ {
"desc" : "Gecko", "desc" : "Gecko",
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre", "ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre",
@@ -70,5 +61,24 @@
"name" : "WebKit", "name" : "WebKit",
"version" : "533.19.4" "version" : "533.19.4"
} }
},
{
"desc" : "KTA Mobile App",
"ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
"expect" :
{
"name" : "Mobile-App",
"version" : "1.0"
}
},
{
"desc" : "KTB-Nexus 5",
"ua" : "APP-My App/1.0 (Linux; Android 4.2.1; Nexus 5 Build/JOP40D)",
"expect" :
{
"name" : "Mobile-App",
"version" : "1.0"
}
} }
] ]

View File

@@ -1,582 +0,0 @@
[
{
"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"
}
}
]

View File

@@ -71,15 +71,6 @@
"version" : "8" "version" : "8"
} }
}, },
{
"desc" : "Windows 10",
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
"expect" :
{
"name" : "Windows",
"version" : "10"
}
},
{ {
"desc" : "Windows RT", "desc" : "Windows RT",
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)", "ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)",
@@ -107,15 +98,6 @@
"version" : "6.1" "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", "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)", "ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)",
@@ -154,11 +136,11 @@
}, },
{ {
"desc" : "Tizen", "desc" : "Tizen",
"ua" : "Mozilla/5.0 (Linux; Tizen 2.3; SAMSUNG SM-Z130H) AppleWebKit/537.3 (KHTML, like Gecko) Version/2.3 Mobile Safari/537.3", "ua" : "",
"expect" : "expect" :
{ {
"name" : "Tizen", "name" : "",
"version" : "2.3" "version" : ""
} }
}, },
{ {
@@ -260,15 +242,6 @@
"version" : "" "version" : ""
} }
}, },
{
"desc" : "PlayStation 4",
"ua" : "Mozilla/5.0 (PlayStation 4 3.00) AppleWebKit/537.73 (KHTML, like Gecko)",
"expect" :
{
"name" : "PlayStation",
"version" : "4"
}
},
{ {
"desc" : "Mint", "desc" : "Mint",
"ua" : "", "ua" : "",
@@ -289,20 +262,11 @@
}, },
{ {
"desc" : "Ubuntu", "desc" : "Ubuntu",
"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", "ua" : "",
"expect" : "expect" :
{ {
"name" : "Ubuntu", "name" : "",
"version" : "12.04" "version" : ""
}
},
{
"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"
} }
}, },
{ {
@@ -508,17 +472,17 @@
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36", "ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36",
"expect" : "expect" :
{ {
"name" : "Mac OS", "name" : "Mac OS X",
"version" : "10.6.8" "version" : "10.6.8"
} }
}, },
{ {
"desc" : "Haiku", "desc" : "Haiku",
"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", "ua" : "",
"expect" : "expect" :
{ {
"name" : "Haiku", "name" : "",
"version" : "R1" "version" : ""
} }
}, },
{ {

View File

@@ -1,5 +1,4 @@
var assert = require('assert'); var assert = require('assert');
var requirejs = require('requirejs');
var UAParser = require('./../src/ua-parser'); var UAParser = require('./../src/ua-parser');
var browsers = require('./browser-test.json'); var browsers = require('./browser-test.json');
var cpus = require('./cpu-test.json'); var cpus = require('./cpu-test.json');
@@ -49,9 +48,9 @@ for (var i in methods) {
for (var j in methods[i]['list']) { for (var j in methods[i]['list']) {
if (!!methods[i]['list'][j].ua) { if (!!methods[i]['list'][j].ua) {
describe('[' + methods[i]['list'][j].desc + ']', function () { describe('[' + methods[i]['list'][j].desc + ']', function () {
describe('"' + methods[i]['list'][j].ua + '"', function () { describe('"' + methods[i]['list'][j].ua + '"', function () {
var expect = methods[i]['list'][j].expect; var expect = methods[i]['list'][j].expect;
var result = parser.setUA(methods[i]['list'][j].ua).getResult()[methods[i]['label']]; var result = parser.setUA(methods[i]['list'][j].ua).getResult()[methods[i]['label']];
methods[i]['properties'].forEach(function(m) { methods[i]['properties'].forEach(function(m) {
it('should return ' + methods[i]['label'] + ' ' + m + ': ' + expect[m], function () { it('should return ' + methods[i]['label'] + ' ' + m + ': ' + expect[m], function () {
@@ -64,28 +63,3 @@ for (var i in methods) {
} }
}); });
} }
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 parser = new UAParser(uaString, {browser: myOwnBrowser});
assert.equal(parser.getBrowser().name, 'MyOwnBrowser');
assert.equal(parser.getBrowser().version, '1.3');
assert.equal(parser.getBrowser().major, '1');
});
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();
});
});
});

View File

@@ -1,32 +1,32 @@
{ {
"title": "UAParser.js", "title": "UAParser.js",
"name": "ua-parser-js", "name": "ua-parser-js",
"version": "0.7.12", "version": "0.7.0",
"description": "Lightweight JavaScript-based user-agent string parser", "description": "Lightweight JavaScript-based user-agent string parser",
"keywords": [ "keywords": [
"user-agent", "user-agent",
"parser", "parser",
"browser", "browser",
"engine", "engine",
"os", "os",
"device", "device",
"cpu" "cpu"
], ],
"homepage": "https://faisalman.github.com/ua-parser-js", "homepage": "https://faisalman.github.com/ua-parser-js",
"author": { "author": {
"name": "Faisal Salman", "name": "Faisal Salman",
"email": "fyzlman@gmail.com" "email": "fyzlman@gmail.com"
}, },
"dependencies": { "dependencies": {
"jquery": ">=1.5" "jquery": ">=1.5"
}, },
"licenses": [ "licenses": [
{ {
"type": "MIT", "type": "MIT",
"url": "http://www.opensource.org/licenses/mit-license.php" "url": "http://www.opensource.org/licenses/mit-license.php"
} }
], ],
"bugs": "https://github.com/faisalman/ua-parser-js/issues", "bugs": "https://github.com/faisalman/ua-parser-js/issues",
"docs": "https://github.com/faisalman/ua-parser-js", "docs": "https://github.com/faisalman/ua-parser-js",
"download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.min.js" "download": "https://raw.github.com/faisalman/ua-parser-js/master/src/ua-parser.min.js"
} }