风险系数判断修复
This commit is contained in:
Executable
+519
@@ -0,0 +1,519 @@
|
||||
<?php
|
||||
|
||||
$countries = [
|
||||
"AF" => "阿富汗 - Afghanistan",
|
||||
"AX" => "奥兰群岛 - Åland Islands",
|
||||
"AL" => "阿尔巴尼亚 - Albania",
|
||||
"DZ" => "阿尔及利亚 - Algeria",
|
||||
"AS" => "美属萨摩亚 - American Samoa",
|
||||
"AD" => "安道尔 - Andorra",
|
||||
"AO" => "安哥拉 - Angola",
|
||||
"AI" => "安圭拉 - Anguilla",
|
||||
"AQ" => "南极洲 - Antarctica",
|
||||
"AG" => "安提瓜和巴布达 - Antigua and Barbuda",
|
||||
"AR" => "阿根廷 - Argentina",
|
||||
"AM" => "亚美尼亚 - Armenia",
|
||||
"AW" => "阿鲁巴 - Aruba",
|
||||
"AU" => "澳大利亚 - Australia",
|
||||
"AT" => "奥地利 - Austria",
|
||||
"AZ" => "阿塞拜疆 - Azerbaijan",
|
||||
"BS" => "巴哈马 - Bahamas",
|
||||
"BH" => "巴林 - Bahrain",
|
||||
"BD" => "孟加拉国 - Bangladesh",
|
||||
"BB" => "巴巴多斯 - Barbados",
|
||||
"BY" => "白俄罗斯 - Belarus",
|
||||
"BE" => "比利时 - Belgium",
|
||||
"BZ" => "伯利兹 - Belize",
|
||||
"BJ" => "贝宁 - Benin",
|
||||
"BM" => "百慕大 - Bermuda",
|
||||
"BT" => "不丹 - Bhutan",
|
||||
"BO" => "玻利维亚 - Bolivia (Plurinational State of)",
|
||||
"BA" => "波斯尼亚和黑塞哥维那 - Bosnia and Herzegovina",
|
||||
"BW" => "博茨瓦纳 - Botswana",
|
||||
"BV" => "布韦岛 - Bouvet Island",
|
||||
"BR" => "巴西 - Brazil",
|
||||
"IO" => "英属印度洋领地 - British Indian Ocean Territory",
|
||||
"BN" => "文莱 - Brunei Darussalam",
|
||||
"BG" => "保加利亚 - Bulgaria",
|
||||
"BF" => "布基纳法索 - Burkina Faso",
|
||||
"BI" => "布隆迪 - Burundi",
|
||||
"CV" => "佛得角 - Cabo Verde",
|
||||
"KH" => "柬埔寨 - Cambodia",
|
||||
"CM" => "喀麦隆 - Cameroon",
|
||||
"CA" => "加拿大 - Canada",
|
||||
"BQ" => "荷属加勒比区 - Caribbean Netherlands",
|
||||
"KY" => "开曼群岛 - Cayman Islands",
|
||||
"CF" => "中非共和国 - Central African Republic",
|
||||
"TD" => "乍得 - Chad",
|
||||
"CL" => "智利 - Chile",
|
||||
"CN" => "中国 - China",
|
||||
"CX" => "圣诞岛 - Christmas Island",
|
||||
"CC" => "科科斯(基林)群岛 - Cocos (Keeling) Islands",
|
||||
"CO" => "哥伦比亚 - Colombia",
|
||||
"KM" => "科摩罗 - Comoros",
|
||||
"CG" => "刚果(布) - Congo",
|
||||
"CD" => "刚果(金) - Congo, Democratic Republic of the",
|
||||
"CK" => "库克群岛 - Cook Islands",
|
||||
"CR" => "哥斯达黎加 - Costa Rica",
|
||||
"HR" => "克罗地亚 - Croatia",
|
||||
"CU" => "古巴 - Cuba",
|
||||
"CW" => "库拉索 - Curaçao",
|
||||
"CY" => "塞浦路斯 - Cyprus",
|
||||
"CZ" => "捷克 - Czech Republic",
|
||||
"CI" => "科特迪瓦 - Côte d'Ivoire",
|
||||
"DK" => "丹麦 - Denmark",
|
||||
"DJ" => "吉布提 - Djibouti",
|
||||
"DM" => "多米尼克 - Dominica",
|
||||
"DO" => "多米尼加共和国 - Dominican Republic",
|
||||
"EC" => "厄瓜多尔 - Ecuador",
|
||||
"EG" => "埃及 - Egypt",
|
||||
"SV" => "萨尔瓦多 - El Salvador",
|
||||
"GQ" => "赤道几内亚 - Equatorial Guinea",
|
||||
"ER" => "厄立特里亚 - Eritrea",
|
||||
"EE" => "爱沙尼亚 - Estonia",
|
||||
"SZ" => "斯威士兰 - Eswatini (Swaziland)",
|
||||
"ET" => "埃塞俄比亚 - Ethiopia",
|
||||
"FK" => "福克兰群岛 - Falkland Islands (Malvinas)",
|
||||
"FO" => "法罗群岛 - Faroe Islands",
|
||||
"FJ" => "斐济 - Fiji",
|
||||
"FI" => "芬兰 - Finland",
|
||||
"FR" => "法国 - France",
|
||||
"GF" => "法属圭亚那 - French Guiana",
|
||||
"PF" => "法属波利尼西亚 - French Polynesia",
|
||||
"TF" => "法属南部领地 - French Southern Territories",
|
||||
"GA" => "加蓬 - Gabon",
|
||||
"GM" => "冈比亚 - Gambia",
|
||||
"GE" => "格鲁吉亚 - Georgia",
|
||||
"DE" => "德国 - Germany",
|
||||
"GH" => "加纳 - Ghana",
|
||||
"GI" => "直布罗陀 - Gibraltar",
|
||||
"GR" => "希腊 - Greece",
|
||||
"GL" => "格陵兰 - Greenland",
|
||||
"GD" => "格林纳达 - Grenada",
|
||||
"GP" => "瓜德罗普 - Guadeloupe",
|
||||
"GU" => "关岛 - Guam",
|
||||
"GT" => "危地马拉 - Guatemala",
|
||||
"GG" => "根西岛 - Guernsey",
|
||||
"GN" => "几内亚 - Guinea",
|
||||
"GW" => "几内亚比绍 - Guinea-Bissau",
|
||||
"GY" => "圭亚那 - Guyana",
|
||||
"HT" => "海地 - Haiti",
|
||||
"HM" => "赫德岛和麦克唐纳群岛 - Heard Island and Mcdonald Islands",
|
||||
"HN" => "洪都拉斯 - Honduras",
|
||||
"HK" => "中国香港特别行政区 - Hong Kong",
|
||||
"HU" => "匈牙利 - Hungary",
|
||||
"IS" => "冰岛 - Iceland",
|
||||
"IN" => "印度 - India",
|
||||
"ID" => "印度尼西亚 - Indonesia",
|
||||
"IR" => "伊朗 - Iran",
|
||||
"IQ" => "伊拉克 - Iraq",
|
||||
"IE" => "爱尔兰 - Ireland",
|
||||
"IM" => "马恩岛 - Isle of Man",
|
||||
"IL" => "以色列 - Israel",
|
||||
"IT" => "意大利 - Italy",
|
||||
"JM" => "牙买加 - Jamaica",
|
||||
"JP" => "日本 - Japan",
|
||||
"JE" => "泽西岛 - Jersey",
|
||||
"JO" => "约旦 - Jordan",
|
||||
"KZ" => "哈萨克斯坦 - Kazakhstan",
|
||||
"KE" => "肯尼亚 - Kenya",
|
||||
"KI" => "基里巴斯 - Kiribati",
|
||||
"KP" => "朝鲜 - Korea, North",
|
||||
"KR" => "韩国 - Korea, South",
|
||||
"XK" => "科索沃 - Kosovo",
|
||||
"KW" => "科威特 - Kuwait",
|
||||
"KG" => "吉尔吉斯斯坦 - Kyrgyzstan",
|
||||
"LA" => "老挝 - Lao People's Democratic Republic",
|
||||
"LV" => "拉脱维亚 - Latvia",
|
||||
"LB" => "黎巴嫩 - Lebanon",
|
||||
"LS" => "莱索托 - Lesotho",
|
||||
"LR" => "利比里亚 - Liberia",
|
||||
"LY" => "利比亚 - Libya",
|
||||
"LI" => "列支敦士登 - Liechtenstein",
|
||||
"LT" => "立陶宛 - Lithuania",
|
||||
"LU" => "卢森堡 - Luxembourg",
|
||||
"MO" => "中国澳门特别行政区 - Macao",
|
||||
"MK" => "北马其顿 - Macedonia North",
|
||||
"MG" => "马达加斯加 - Madagascar",
|
||||
"MW" => "马拉维 - Malawi",
|
||||
"MY" => "马来西亚 - Malaysia",
|
||||
"MV" => "马尔代夫 - Maldives",
|
||||
"ML" => "马里 - Mali",
|
||||
"MT" => "马耳他 - Malta",
|
||||
"MH" => "马绍尔群岛 - Marshall Islands",
|
||||
"MQ" => "马提尼克 - Martinique",
|
||||
"MR" => "毛里塔尼亚 - Mauritania",
|
||||
"MU" => "毛里求斯 - Mauritius",
|
||||
"YT" => "马约特 - Mayotte",
|
||||
"MX" => "墨西哥 - Mexico",
|
||||
"FM" => "密克罗尼西亚 - Micronesia",
|
||||
"MD" => "摩尔多瓦 - Moldova",
|
||||
"MC" => "摩纳哥 - Monaco",
|
||||
"MN" => "蒙古 - Mongolia",
|
||||
"ME" => "黑山 - Montenegro",
|
||||
"MS" => "蒙特塞拉特 - Montserrat",
|
||||
"MA" => "摩洛哥 - Morocco",
|
||||
"MZ" => "莫桑比克 - Mozambique",
|
||||
"MM" => "缅甸 - Myanmar (Burma)",
|
||||
"NA" => "纳米比亚 - Namibia",
|
||||
"NR" => "瑙鲁 - Nauru",
|
||||
"NP" => "尼泊尔 - Nepal",
|
||||
"NL" => "荷兰 - Netherlands",
|
||||
"AN" => "库拉索 - Netherlands Antilles",
|
||||
"NC" => "新喀里多尼亚 - New Caledonia",
|
||||
"NZ" => "新西兰 - New Zealand",
|
||||
"NI" => "尼加拉瓜 - Nicaragua",
|
||||
"NE" => "尼日尔 - Niger",
|
||||
"NG" => "尼日利亚 - Nigeria",
|
||||
"NU" => "纽埃 - Niue",
|
||||
"NF" => "诺福克岛 - Norfolk Island",
|
||||
"MP" => "北马里亚纳群岛 - Northern Mariana Islands",
|
||||
"NO" => "挪威 - Norway",
|
||||
"OM" => "阿曼 - Oman",
|
||||
"PK" => "巴基斯坦 - Pakistan",
|
||||
"PW" => "帕劳 - Palau",
|
||||
"PS" => "巴勒斯坦领土 - Palestine",
|
||||
"PA" => "巴拿马 - Panama",
|
||||
"PG" => "巴布亚新几内亚 - Papua New Guinea",
|
||||
"PY" => "巴拉圭 - Paraguay",
|
||||
"PE" => "秘鲁 - Peru",
|
||||
"PH" => "菲律宾 - Philippines",
|
||||
"PN" => "皮特凯恩群岛 - Pitcairn Islands",
|
||||
"PL" => "波兰 - Poland",
|
||||
"PT" => "葡萄牙 - Portugal",
|
||||
"PR" => "波多黎各 - Puerto Rico",
|
||||
"QA" => "卡塔尔 - Qatar",
|
||||
"RE" => "留尼汪 - Reunion",
|
||||
"RO" => "罗马尼亚 - Romania",
|
||||
"RU" => "俄罗斯 - Russian Federation",
|
||||
"RW" => "卢旺达 - Rwanda",
|
||||
"BL" => "圣巴泰勒米 - Saint Barthelemy",
|
||||
"SH" => "圣赫勒拿 - Saint Helena",
|
||||
"KN" => "圣基茨和尼维斯 - Saint Kitts and Nevis",
|
||||
"LC" => "圣卢西亚 - Saint Lucia",
|
||||
"MF" => "法属圣马丁 - Saint Martin",
|
||||
"PM" => "圣皮埃尔和密克隆群岛 - Saint Pierre and Miquelon",
|
||||
"VC" => "圣文森特和格林纳丁斯 - Saint Vincent and the Grenadines",
|
||||
"WS" => "萨摩亚 - Samoa",
|
||||
"SM" => "圣马力诺 - San Marino",
|
||||
"ST" => "圣多美和普林西比 - Sao Tome and Principe",
|
||||
"SA" => "沙特阿拉伯 - Saudi Arabia",
|
||||
"SN" => "塞内加尔 - Senegal",
|
||||
"RS" => "塞尔维亚 - Serbia",
|
||||
"CS" => "塞尔维亚 - Serbia and Montenegro",
|
||||
"SC" => "塞舌尔 - Seychelles",
|
||||
"SL" => "塞拉利昂 - Sierra Leone",
|
||||
"SG" => "新加坡 - Singapore",
|
||||
"SX" => "荷属圣马丁 - Sint Maarten",
|
||||
"SK" => "斯洛伐克 - Slovakia",
|
||||
"SI" => "斯洛文尼亚 - Slovenia",
|
||||
"SB" => "所罗门群岛 - Solomon Islands",
|
||||
"SO" => "索马里 - Somalia",
|
||||
"ZA" => "南非 - South Africa",
|
||||
"GS" => "南乔治亚和南桑威奇群岛 - South Georgia and the South Sandwich Islands",
|
||||
"SS" => "南苏丹 - South Sudan",
|
||||
"ES" => "西班牙 - Spain",
|
||||
"LK" => "斯里兰卡 - Sri Lanka",
|
||||
"SD" => "苏丹 - Sudan",
|
||||
"SR" => "苏里南 - Suriname",
|
||||
"SJ" => "斯瓦尔巴和扬马延 - Svalbard and Jan Mayen",
|
||||
"SE" => "瑞典 - Sweden",
|
||||
"CH" => "瑞士 - Switzerland",
|
||||
"SY" => "叙利亚 - Syria",
|
||||
"TW" => "台湾 - Taiwan",
|
||||
"TJ" => "塔吉克斯坦 - Tajikistan",
|
||||
"TZ" => "坦桑尼亚 - Tanzania",
|
||||
"TH" => "泰国 - Thailand",
|
||||
"TL" => "东帝汶 - Timor-Leste",
|
||||
"TG" => "多哥 - Togo",
|
||||
"TK" => "托克劳 - Tokelau",
|
||||
"TO" => "汤加 - Tonga",
|
||||
"TT" => "特立尼达和多巴哥 - Trinidad and Tobago",
|
||||
"TN" => "突尼斯 - Tunisia",
|
||||
"TR" => "土耳其 - Turkey (Türkiye)",
|
||||
"TM" => "土库曼斯坦 - Turkmenistan",
|
||||
"TC" => "特克斯和凯科斯群岛 - Turks and Caicos Islands",
|
||||
"TV" => "图瓦卢 - Tuvalu",
|
||||
"UM" => "美国本土外小岛屿 - U.S. Outlying Islands",
|
||||
"UG" => "乌干达 - Uganda",
|
||||
"UA" => "乌克兰 - Ukraine",
|
||||
"AE" => "阿拉伯联合酋长国 - United Arab Emirates",
|
||||
"GB" => "英国 - United Kingdom",
|
||||
"US" => "美国 - United States",
|
||||
"UY" => "乌拉圭 - Uruguay",
|
||||
"UZ" => "乌兹别克斯坦 - Uzbekistan",
|
||||
"VU" => "瓦努阿图 - Vanuatu",
|
||||
"VA" => "梵蒂冈 - Vatican City Holy See",
|
||||
"VE" => "委内瑞拉 - Venezuela",
|
||||
"VN" => "越南 - Vietnam",
|
||||
"VG" => "英属维尔京群岛 - Virgin Islands, British",
|
||||
"VI" => "美属维尔京群岛 - Virgin Islands, U.S",
|
||||
"WF" => "瓦利斯和富图纳 - Wallis and Futuna",
|
||||
"EH" => "西撒哈拉 - Western Sahara",
|
||||
"YE" => "也门 - Yemen",
|
||||
"ZM" => "赞比亚 - Zambia",
|
||||
"ZW" => "津巴布韦 - Zimbabwe",
|
||||
];
|
||||
|
||||
$countriesByContinent = [
|
||||
'Asia 亚洲' => [
|
||||
'AF' => 'Afghanistan 阿富汗',
|
||||
'AM' => 'Armenia 亚美尼亚',
|
||||
'AZ' => 'Azerbaijan 阿塞拜疆',
|
||||
'BH' => 'Bahrain 巴林',
|
||||
'BD' => 'Bangladesh 孟加拉国',
|
||||
'BT' => 'Bhutan 不丹',
|
||||
'BN' => 'Brunei Darussalam 文莱',
|
||||
'KH' => 'Cambodia 柬埔寨',
|
||||
'CN' => 'China 中国',
|
||||
'CY' => 'Cyprus 塞浦路斯',
|
||||
'GE' => 'Georgia 格鲁吉亚',
|
||||
'HK' => 'Hong Kong 中国香港',
|
||||
'IN' => 'India 印度',
|
||||
'ID' => 'Indonesia 印度尼西亚',
|
||||
'IR' => 'Iran 伊朗伊斯兰共和国',
|
||||
'IQ' => 'Iraq 伊拉克',
|
||||
'IL' => 'Israel 以色列',
|
||||
'JP' => 'Japan 日本',
|
||||
'JO' => 'Jordan 约旦',
|
||||
'KZ' => 'Kazakhstan 哈萨克斯坦',
|
||||
'KP' => 'North Korea 朝鲜',
|
||||
'KR' => 'South Korea 韩国',
|
||||
'KW' => 'Kuwait 科威特',
|
||||
'KG' => 'Kyrgyzstan 吉尔吉斯斯坦',
|
||||
'LA' => 'Lao 老挝',
|
||||
'LB' => 'Lebanon 黎巴嫩',
|
||||
'MO' => 'Macao 中国澳门',
|
||||
'MY' => 'Malaysia 马来西亚',
|
||||
'MV' => 'Maldives 马尔代夫',
|
||||
'MN' => 'Mongolia 蒙古',
|
||||
'MM' => 'Myanmar 缅甸',
|
||||
'NP' => 'Nepal 尼泊尔',
|
||||
'OM' => 'Oman 阿曼',
|
||||
'PK' => 'Pakistan 巴基斯坦',
|
||||
'PS' => 'Palestine, State of 巴勒斯坦国',
|
||||
'PH' => 'Philippines 菲律宾',
|
||||
'QA' => 'Qatar 卡塔尔',
|
||||
'SA' => 'Saudi Arabia 沙特阿拉伯',
|
||||
'SG' => 'Singapore 新加坡',
|
||||
'LK' => 'Sri Lanka 斯里兰卡',
|
||||
'SY' => 'Syrian Arab Republic 阿拉伯叙利亚共和国',
|
||||
'TW' => 'Taiwan 中国台湾',
|
||||
'TJ' => 'Tajikistan 塔吉克斯坦',
|
||||
'TH' => 'Thailand 泰国',
|
||||
'TL' => 'Timor-Leste 东帝汶',
|
||||
'TR' => 'Turkey 土耳其',
|
||||
'TM' => 'Turkmenistan 土库曼斯坦',
|
||||
'AE' => 'United Arab Emirates 阿联酋',
|
||||
'UZ' => 'Uzbekistan 乌兹别克斯坦',
|
||||
'VN' => 'Viet Nam 越南',
|
||||
'YE' => 'Yemen 也门',
|
||||
],
|
||||
'Europe 欧洲' => [
|
||||
'AX' => 'Åland Islands 奥兰群岛',
|
||||
'AL' => 'Albania 阿尔巴尼亚',
|
||||
'AD' => 'Andorra 安道尔',
|
||||
'AT' => 'Austria 奥地利',
|
||||
'BY' => 'Belarus 白俄罗斯',
|
||||
'BE' => 'Belgium 比利时',
|
||||
'BA' => 'Bosnia & Herzegovina 波斯尼亚和黑塞哥维那',
|
||||
'BG' => 'Bulgaria 保加利亚',
|
||||
'HR' => 'Croatia 克罗地亚',
|
||||
'CZ' => 'Czechia 捷克',
|
||||
'DK' => 'Denmark 丹麦',
|
||||
'EE' => 'Estonia 爱沙尼亚',
|
||||
'FO' => 'Faroe Islands 法罗群岛',
|
||||
'FI' => 'Finland 芬兰',
|
||||
'FR' => 'France 法国',
|
||||
'DE' => 'Germany 德国',
|
||||
'GI' => 'Gibraltar 直布罗陀',
|
||||
'GR' => 'Greece 希腊',
|
||||
'GG' => 'Guernsey 根西',
|
||||
'VA' => 'Holy See 梵蒂冈',
|
||||
'HU' => 'Hungary 匈牙利',
|
||||
'IS' => 'Iceland 冰岛',
|
||||
'IE' => 'Ireland 爱尔兰',
|
||||
'IM' => 'Isle of Man 马恩岛',
|
||||
'IT' => 'Italy 意大利',
|
||||
'JE' => 'Jersey 泽西',
|
||||
'LV' => 'Latvia 拉脱维亚',
|
||||
'LI' => 'Liechtenstein 列支敦士登',
|
||||
'LT' => 'Lithuania 立陶宛',
|
||||
'LU' => 'Luxembourg 卢森堡',
|
||||
'MT' => 'Malta 马耳他',
|
||||
'MD' => 'Moldova 摩尔多瓦',
|
||||
'MC' => 'Monaco 摩纳哥',
|
||||
'ME' => 'Montenegro 黑山',
|
||||
'NL' => 'Netherlands 荷兰',
|
||||
'MK' => 'North Macedonia 北马其顿',
|
||||
'NO' => 'Norway 挪威',
|
||||
'PL' => 'Poland 波兰',
|
||||
'PT' => 'Portugal 葡萄牙',
|
||||
'RO' => 'Romania 罗马尼亚',
|
||||
'RU' => 'Russian Federation 俄罗斯联邦',
|
||||
'SM' => 'San Marino 圣马力诺',
|
||||
'RS' => 'Serbia 塞尔维亚',
|
||||
'SK' => 'Slovakia 斯洛伐克',
|
||||
'SI' => 'Slovenia 斯洛文尼亚',
|
||||
'ES' => 'Spain 西班牙',
|
||||
'SJ' => 'Svalbard and Jan Mayen 斯瓦尔巴和扬马延',
|
||||
'SE' => 'Sweden 瑞典',
|
||||
'CH' => 'Switzerland 瑞士',
|
||||
'UA' => 'Ukraine 乌克兰',
|
||||
'GB' => 'UK 英国',
|
||||
],
|
||||
'Africa 非洲' => [
|
||||
'DZ' => 'Algeria 阿尔及利亚',
|
||||
'AO' => 'Angola 安哥拉',
|
||||
'BJ' => 'Benin 贝宁',
|
||||
'BW' => 'Botswana 博茨瓦纳',
|
||||
'IO' => 'British Indian Ocean Territory 英属印度洋领地',
|
||||
'BF' => 'Burkina Faso 布基纳法索',
|
||||
'BI' => 'Burundi 布隆迪',
|
||||
'CV' => 'Cabo Verde 佛得角',
|
||||
'CM' => 'Cameroon 喀麦隆',
|
||||
'CF' => 'Central African Republic 中非共和国',
|
||||
'TD' => 'Chad 乍得',
|
||||
'KM' => 'Comoros 科摩罗',
|
||||
'CG' => 'Congo 刚果',
|
||||
'CD' => 'Congo (Democratic Republic of the) 刚果民主共和国',
|
||||
'CI' => 'Côte d\'Ivoire 科特迪瓦',
|
||||
'DJ' => 'Djibouti 吉布提',
|
||||
'EG' => 'Egypt 埃及',
|
||||
'GQ' => 'Equatorial Guinea 赤道几内亚',
|
||||
'ER' => 'Eritrea 厄立特里亚',
|
||||
'SZ' => 'Eswatini 斯威士兰',
|
||||
'ET' => 'Ethiopia 埃塞俄比亚',
|
||||
'TF' => 'French Southern Territories 法属南部领地',
|
||||
'GA' => 'Gabon 加蓬',
|
||||
'GM' => 'Gambia 冈比亚',
|
||||
'GH' => 'Ghana 加纳',
|
||||
'GN' => 'Guinea 几内亚',
|
||||
'GW' => 'Guinea-Bissau 几内亚比绍',
|
||||
'KE' => 'Kenya 肯尼亚',
|
||||
'LS' => 'Lesotho 莱索托',
|
||||
'LR' => 'Liberia 利比里亚',
|
||||
'LY' => 'Libya 利比亚',
|
||||
'MG' => 'Madagascar 马达加斯加',
|
||||
'MW' => 'Malawi 马拉维',
|
||||
'ML' => 'Mali 马里',
|
||||
'MR' => 'Mauritania 毛里塔尼亚',
|
||||
'MU' => 'Mauritius 毛里求斯',
|
||||
'YT' => 'Mayotte 马约特',
|
||||
'MA' => 'Morocco 摩洛哥',
|
||||
'MZ' => 'Mozambique 莫桑比克',
|
||||
'NA' => 'Namibia 纳米比亚',
|
||||
'NE' => 'Niger 尼日尔',
|
||||
'NG' => 'Nigeria 尼日利亚',
|
||||
'RE' => 'Réunion 留尼汪',
|
||||
'RW' => 'Rwanda 卢旺达',
|
||||
'SH' => 'Saint Helena, Ascension and Tristan da Cunha 圣赫勒拿、阿森松和特里斯坦-达库尼亚',
|
||||
'ST' => 'Sao Tome and Principe 圣多美和普林西比',
|
||||
'SN' => 'Senegal 塞内加尔',
|
||||
'SC' => 'Seychelles 塞舌尔',
|
||||
'SL' => 'Sierra Leone 塞拉利昂',
|
||||
'SO' => 'Somalia 索马里',
|
||||
'ZA' => 'South Africa 南非',
|
||||
'SS' => 'South Sudan 南苏丹',
|
||||
'SD' => 'Sudan 苏丹',
|
||||
'TZ' => 'Tanzania, United Republic of 坦桑尼亚联合共和国',
|
||||
'TG' => 'Togo 多哥',
|
||||
'TN' => 'Tunisia 突尼斯',
|
||||
'UG' => 'Uganda 乌干达',
|
||||
'EH' => 'Western Sahara 西撒哈拉',
|
||||
'ZM' => 'Zambia 赞比亚',
|
||||
'ZW' => 'Zimbabwe 津巴布韦',
|
||||
],
|
||||
'North America 北美洲' => [
|
||||
'AI' => 'Anguilla 安圭拉',
|
||||
'AG' => 'Antigua and Barbuda 安提瓜和巴布达',
|
||||
'AW' => 'Aruba 阿鲁巴',
|
||||
'BS' => 'Bahamas 巴哈马',
|
||||
'BB' => 'Barbados 巴巴多斯',
|
||||
'BZ' => 'Belize 伯利兹',
|
||||
'BM' => 'Bermuda 百慕大',
|
||||
'BQ' => 'Bonaire, Sint Eustatius and Saba 博内尔、圣尤斯特歇斯和萨巴',
|
||||
'CA' => 'Canada 加拿大',
|
||||
'KY' => 'Cayman Islands 开曼群岛',
|
||||
'CR' => 'Costa Rica 哥斯达黎加',
|
||||
'CU' => 'Cuba 古巴',
|
||||
'CW' => 'Curaçao 库拉索',
|
||||
'DM' => 'Dominica 多米尼克',
|
||||
'DO' => 'Dominican Republic 多米尼加共和国',
|
||||
'SV' => 'El Salvador 萨尔瓦多',
|
||||
'GL' => 'Greenland 格陵兰',
|
||||
'GD' => 'Grenada 格林纳达',
|
||||
'GP' => 'Guadeloupe 瓜德罗普',
|
||||
'GT' => 'Guatemala 危地马拉',
|
||||
'HT' => 'Haiti 海地',
|
||||
'HN' => 'Honduras 洪都拉斯',
|
||||
'JM' => 'Jamaica 牙买加',
|
||||
'MQ' => 'Martinique 马提尼克',
|
||||
'MX' => 'Mexico 墨西哥',
|
||||
'MS' => 'Montserrat 蒙特塞拉特',
|
||||
'NI' => 'Nicaragua 尼加拉瓜',
|
||||
'PA' => 'Panama 巴拿马',
|
||||
'PR' => 'Puerto Rico 波多黎各',
|
||||
'BL' => 'Saint Barthélemy 圣巴泰勒米',
|
||||
'KN' => 'Saint Kitts and Nevis 圣基茨和尼维斯',
|
||||
'LC' => 'Saint Lucia 圣卢西亚',
|
||||
'MF' => 'Saint Martin (French part) 圣马丁(法属)',
|
||||
'PM' => 'Saint Pierre and Miquelon 圣皮埃尔和密克隆',
|
||||
'VC' => 'Saint Vincent and the Grenadines 圣文森特和格林纳丁斯',
|
||||
'SX' => 'Sint Maarten (Dutch part) 圣马丁(荷属)',
|
||||
'TT' => 'Trinidad and Tobago 特立尼达和多巴哥',
|
||||
'TC' => 'Turks and Caicos Islands 特克斯和凯科斯群岛',
|
||||
'US' => 'USA 美国',
|
||||
'VG' => 'Virgin Islands (British) 维尔京群岛(英属)',
|
||||
'VI' => 'Virgin Islands (U.S.) 维尔京群岛(美属)',
|
||||
],
|
||||
'South America 南美洲' => [
|
||||
'AR' => 'Argentina 阿根廷',
|
||||
'BO' => 'Bolivia (Plurinational State of) 玻利维亚多民族国',
|
||||
'BV' => 'Bouvet Island 布韦岛',
|
||||
'BR' => 'Brazil 巴西',
|
||||
'CL' => 'Chile 智利',
|
||||
'CO' => 'Colombia 哥伦比亚',
|
||||
'EC' => 'Ecuador 厄瓜多尔',
|
||||
'FK' => 'Falkland Islands (Malvinas) 福克兰群岛(马尔维纳斯)',
|
||||
'GF' => 'French Guiana 法属圭亚那',
|
||||
'GY' => 'Guyana 圭亚那',
|
||||
'PY' => 'Paraguay 巴拉圭',
|
||||
'PE' => 'Peru 秘鲁',
|
||||
'GS' => 'South Georgia and the South Sandwich Islands 南乔治亚和南桑威奇群岛',
|
||||
'SR' => 'Suriname 苏里南',
|
||||
'UY' => 'Uruguay 乌拉圭',
|
||||
'VE' => 'Venezuela (Bolivarian Republic of) 委内瑞拉玻利瓦尔共和国',
|
||||
],
|
||||
'Oceania 大洋洲' => [
|
||||
'AS' => 'American Samoa 美属萨摩亚',
|
||||
'AU' => 'Australia 澳大利亚',
|
||||
'CX' => 'Christmas Island 圣诞岛',
|
||||
'CC' => 'Cocos (Keeling) Islands 科科斯(基林)群岛',
|
||||
'CK' => 'Cook Islands 库克群岛',
|
||||
'FJ' => 'Fiji 斐济',
|
||||
'PF' => 'French Polynesia 法属波利尼西亚',
|
||||
'GU' => 'Guam 关岛',
|
||||
'HM' => 'Heard Island and McDonald Islands 赫德岛和麦克唐纳群岛',
|
||||
'KI' => 'Kiribati 基里巴斯',
|
||||
'MH' => 'Marshall Islands 马绍尔群岛',
|
||||
'FM' => 'Micronesia (Federated States of) 密克罗尼西亚联邦',
|
||||
'NR' => 'Nauru 瑙鲁',
|
||||
'NC' => 'New Caledonia 新喀里多尼亚',
|
||||
'NZ' => 'New Zealand 新西兰',
|
||||
'NU' => 'Niue 纽埃',
|
||||
'NF' => 'Norfolk Island 诺福克岛',
|
||||
'MP' => 'Northern Mariana Islands 北马里亚纳群岛',
|
||||
'PW' => 'Palau 帕劳',
|
||||
'PG' => 'Papua New Guinea 巴布亚新几内亚',
|
||||
'PN' => 'Pitcairn 皮特凯恩',
|
||||
'WS' => 'Samoa 萨摩亚',
|
||||
'SB' => 'Solomon Islands 所罗门群岛',
|
||||
'TK' => 'Tokelau 托克劳',
|
||||
'TO' => 'Tonga 汤加',
|
||||
'TV' => 'Tuvalu 图瓦卢',
|
||||
'UM' => 'U.S. Outlying Islands 美国本土外小岛屿',
|
||||
'VU' => 'Vanuatu 瓦努阿图',
|
||||
'WF' => 'Wallis and Futuna 瓦利斯和富图纳',
|
||||
],
|
||||
];
|
||||
Executable
+267
@@ -0,0 +1,267 @@
|
||||
<?php
|
||||
$langLabels = [
|
||||
// 中文
|
||||
"zh" => "中文",
|
||||
"zh-cn" => "简体中文 (中国大陆)",
|
||||
"zh-sg" => "简体中文 (新加坡)",
|
||||
"zh-tw" => "繁体中文 (台湾)",
|
||||
"zh-hk" => "繁体中文 (香港)",
|
||||
"zh-mo" => "繁体中文 (澳门)",
|
||||
"zh-us" => "中文 (美国)",
|
||||
|
||||
// 英语
|
||||
"en" => "英语",
|
||||
"en-us" => "美国英语",
|
||||
"en-gb" => "英国英语",
|
||||
"en-au" => "澳大利亚英语",
|
||||
"en-ca" => "加拿大英语",
|
||||
"en-nz" => "新西兰英语",
|
||||
"en-ie" => "爱尔兰英语",
|
||||
"en-za" => "南非英语",
|
||||
"en-jm" => "牙买加英语",
|
||||
"en-bz" => "伯利兹英语",
|
||||
"en-tt" => "特立尼达英语",
|
||||
|
||||
// 日语
|
||||
"ja" => "日语",
|
||||
"ja-jp" => "日语 (日本)",
|
||||
|
||||
// 韩语
|
||||
"ko" => "韩语",
|
||||
"ko-kr" => "韩语 (韩国)",
|
||||
|
||||
// 法语
|
||||
"fr" => "法语",
|
||||
"fr-fr" => "法语 (法国)",
|
||||
"fr-ca" => "法语 (加拿大)",
|
||||
"fr-ch" => "法语 (瑞士)",
|
||||
"fr-be" => "法语 (比利时)",
|
||||
"fr-lu" => "法语 (卢森堡)",
|
||||
"fr-mc" => "法语 (摩纳哥)",
|
||||
|
||||
// 德语
|
||||
"de" => "德语",
|
||||
"de-de" => "德语 (德国)",
|
||||
"de-at" => "德语 (奥地利)",
|
||||
"de-ch" => "德语 (瑞士)",
|
||||
"de-li" => "德语 (列支敦士登)",
|
||||
"de-lu" => "德语 (卢森堡)",
|
||||
|
||||
// 西班牙语
|
||||
"es" => "西班牙语",
|
||||
"es-es" => "西班牙语 (西班牙)",
|
||||
"es-mx" => "西班牙语 (墨西哥)",
|
||||
"es-us" => "西班牙语 (美国)",
|
||||
"es-ar" => "西班牙语 (阿根廷)",
|
||||
"es-co" => "西班牙语 (哥伦比亚)",
|
||||
"es-cl" => "西班牙语 (智利)",
|
||||
"es-pe" => "西班牙语 (秘鲁)",
|
||||
"es-ve" => "西班牙语 (委内瑞拉)",
|
||||
|
||||
// 葡萄牙语
|
||||
"pt" => "葡萄牙语",
|
||||
"pt-pt" => "葡萄牙语 (葡萄牙)",
|
||||
"pt-br" => "葡萄牙语 (巴西)",
|
||||
|
||||
// 意大利语
|
||||
"it" => "意大利语",
|
||||
"it-it" => "意大利语 (意大利)",
|
||||
"it-ch" => "意大利语 (瑞士)",
|
||||
|
||||
// 俄语
|
||||
"ru" => "俄语",
|
||||
"ru-ru" => "俄语 (俄罗斯)",
|
||||
"ru-md" => "俄语 (摩尔多瓦)",
|
||||
|
||||
// 阿拉伯语
|
||||
"ar" => "阿拉伯语",
|
||||
"ar-sa" => "阿拉伯语 (沙特阿拉伯)",
|
||||
"ar-eg" => "阿拉伯语 (埃及)",
|
||||
"ar-ae" => "阿拉伯语 (阿联酋)",
|
||||
"ar-iq" => "阿拉伯语 (伊拉克)",
|
||||
"ar-kw" => "阿拉伯语 (科威特)",
|
||||
|
||||
// 其他常见语言
|
||||
"af" => "南非语",
|
||||
"am" => "阿姆哈拉语",
|
||||
"az" => "阿塞拜疆语",
|
||||
"be" => "白俄罗斯语",
|
||||
"bg" => "保加利亚语",
|
||||
"bn" => "孟加拉语",
|
||||
"bs" => "波斯尼亚语",
|
||||
"ca" => "加泰罗尼亚语",
|
||||
"cs" => "捷克语",
|
||||
"cy" => "威尔士语",
|
||||
"da" => "丹麦语",
|
||||
"el" => "希腊语",
|
||||
"et" => "爱沙尼亚语",
|
||||
"eu" => "巴斯克语",
|
||||
"fa" => "波斯语",
|
||||
"fi" => "芬兰语",
|
||||
"fil" => "菲律宾语",
|
||||
"ga" => "爱尔兰语",
|
||||
"gl" => "加利西亚语",
|
||||
"gu" => "古吉拉特语",
|
||||
"he" => "希伯来语",
|
||||
"hi" => "印地语",
|
||||
"hr" => "克罗地亚语",
|
||||
"hu" => "匈牙利语",
|
||||
"hy" => "亚美尼亚语",
|
||||
"id" => "印度尼西亚语",
|
||||
"is" => "冰岛语",
|
||||
"ka" => "格鲁吉亚语",
|
||||
"kk" => "哈萨克语",
|
||||
"km" => "高棉语",
|
||||
"kn" => "卡纳达语",
|
||||
"lt" => "立陶宛语",
|
||||
"lv" => "拉脱维亚语",
|
||||
"mk" => "马其顿语",
|
||||
"ml" => "马拉雅拉姆语",
|
||||
"mn" => "蒙古语",
|
||||
"mr" => "马拉地语",
|
||||
"ms" => "马来语",
|
||||
"mt" => "马耳他语",
|
||||
"my" => "缅甸语",
|
||||
"nb" => "挪威语",
|
||||
"ne" => "尼泊尔语",
|
||||
"nl" => "荷兰语",
|
||||
"pl" => "波兰语",
|
||||
"pa" => "旁遮普语",
|
||||
"ro" => "罗马尼亚语",
|
||||
"si" => "僧伽罗语",
|
||||
"sk" => "斯洛伐克语",
|
||||
"sl" => "斯洛文尼亚语",
|
||||
"sq" => "阿尔巴尼亚语",
|
||||
"sr" => "塞尔维亚语",
|
||||
"sv" => "瑞典语",
|
||||
"sw" => "斯瓦希里语",
|
||||
"ta" => "泰米尔语",
|
||||
"te" => "泰卢固语",
|
||||
"th" => "泰语",
|
||||
"tr" => "土耳其语",
|
||||
"uk" => "乌克兰语",
|
||||
"ur" => "乌尔都语",
|
||||
"uz" => "乌兹别克语",
|
||||
"vi" => "越南语",
|
||||
"zu" => "祖鲁语",
|
||||
];
|
||||
|
||||
$countryLangMap = [
|
||||
"AF" => ["ps-af", "fa-af", "uz-af"], // 阿富汗: 普什图语, 达里语, 乌兹别克语
|
||||
"AL" => ["sq-al", "sq"], // 阿尔巴尼亚: 阿尔巴尼亚语
|
||||
"DZ" => ["ar-dz", "fr-dz", "ar", "fr"], // 阿尔及利亚: 阿拉伯语, 法语
|
||||
"AD" => ["ca-ad", "ca"], // 安道尔: 加泰罗尼亚语
|
||||
"AO" => ["pt-ao", "pt"], // 安哥拉: 葡萄牙语
|
||||
"AR" => ["es-ar", "es"], // 阿根廷: 西班牙语
|
||||
"AM" => ["hy-am", "hy"], // 亚美尼亚: 亚美尼亚语
|
||||
"AU" => ["en-au", "en"], // 澳大利亚: 英语
|
||||
"AT" => ["de-at", "de"], // 奥地利: 德语
|
||||
"AZ" => ["az-latn-az", "az"], // 阿塞拜疆: 阿塞拜疆语 (拉丁文)
|
||||
"BH" => ["ar-bh", "ar"], // 巴林: 阿拉伯语
|
||||
"BD" => ["bn-bd", "bn"], // 孟加拉国: 孟加拉语
|
||||
"BY" => ["be-by", "ru-by", "be", "ru"], // 白俄罗斯: 白俄罗斯语, 俄语
|
||||
"BE" => ["nl-be", "fr-be", "de-be", "nl", "fr", "de"], // 比利时: 荷兰语, 法语, 德语
|
||||
"BZ" => ["en-bz", "es-bz", "en", "es"], // 伯利兹: 英语, 西班牙语
|
||||
"BO" => ["es-bo", "qu-bo", "ay-bo", "es", "qu", "ay"], // 玻利维亚: 西班牙语, 盖丘亚语, 艾马拉语
|
||||
"BA" => ["bs-ba", "hr-ba", "sr-ba", "bs", "hr", "sr"], // 波斯尼亚和黑塞哥维那: 波斯尼亚语, 克罗地亚语, 塞尔维亚语
|
||||
"BR" => ["pt-br", "pt"], // 巴西: 葡萄牙语
|
||||
"BN" => ["ms-bn", "ms"], // 文莱: 马来语
|
||||
"BG" => ["bg-bg", "bg"], // 保加利亚: 保加利亚语
|
||||
"KH" => ["km-kh", "km"], // 柬埔寨: 高棉语
|
||||
"CA" => ["en-ca", "fr-ca", "en", "fr"], // 加拿大: 英语, 法语
|
||||
"CL" => ["es-cl", "es"], // 智利: 西班牙语
|
||||
"CN" => ["zh-cn", "zh", "zh-us"], // 中国大陆: 简体中文
|
||||
"CO" => ["es-co", "es"], // 哥伦比亚: 西班牙语
|
||||
"CR" => ["es-cr", "es"], // 哥斯达黎加: 西班牙语
|
||||
"HR" => ["hr-hr", "hr"], // 克罗地亚: 克罗地亚语
|
||||
"CU" => ["es-cu", "es"], // 古巴: 西班牙语
|
||||
"CY" => ["el-cy", "tr-cy", "el", "tr"], // 塞浦路斯: 希腊语, 土耳其语
|
||||
"CZ" => ["cs-cz", "cs"], // 捷克共和国: 捷克语
|
||||
"DK" => ["da-dk", "da"], // 丹麦: 丹麦语
|
||||
"DO" => ["es-do", "es"], // 多米尼加共和国: 西班牙语
|
||||
"EC" => ["es-ec", "es"], // 厄瓜多尔: 西班牙语
|
||||
"EG" => ["ar-eg", "ar"], // 埃及: 阿拉伯语
|
||||
"SV" => ["es-sv", "es"], // 萨尔瓦多: 西班牙语
|
||||
"EE" => ["et-ee", "et"], // 爱沙尼亚: 爱沙尼亚语
|
||||
"ET" => ["am-et", "om-et", "ti-et", "am", "om", "ti"], // 埃塞俄比亚: 阿姆哈拉语, 奥罗莫语, 提格里尼亚语
|
||||
"FI" => ["fi-fi", "sv-fi", "fi", "sv"], // 芬兰: 芬兰语, 瑞典语
|
||||
"FR" => ["fr-fr", "fr"], // 法国: 法语
|
||||
"GE" => ["ka-ge", "ka"], // 格鲁吉亚: 格鲁吉亚语
|
||||
"DE" => ["de-de", "de"], // 德国: 德语
|
||||
"GR" => ["el-gr", "el"], // 希腊: 希腊语
|
||||
"GT" => ["es-gt", "es"], // 危地马拉: 西班牙语
|
||||
"HN" => ["es-hn", "es"], // 洪都拉斯: 西班牙语
|
||||
"HK" => ["zh-hk", "en-hk", "zh-tw", "zh", "en"], // 香港: 繁体中文, 英语
|
||||
"HU" => ["hu-hu", "hu"], // 匈牙利: 匈牙利语
|
||||
"IS" => ["is-is", "is"], // 冰岛: 冰岛语
|
||||
"IN" => ["hi-in", "en-in", "ta-in", "te-in", "bn-in", "hi", "en", "ta", "te", "bn"], // 印度: 印地语, 英语, 泰米尔语, 泰卢固语, 孟加拉语
|
||||
"ID" => ["id-id", "id"], // 印度尼西亚: 印度尼西亚语
|
||||
"IR" => ["fa-ir", "fa"], // 伊朗: 波斯语
|
||||
"IQ" => ["ar-iq", "ku-iq", "ar", "ku"], // 伊拉克: 阿拉伯语, 库尔德语
|
||||
"IE" => ["en-ie", "ga-ie", "en", "ga"], // 爱尔兰: 英语, 爱尔兰语
|
||||
"IL" => ["he-il", "ar-il", "en-il", "he", "ar", "en"], // 以色列: 希伯来语, 阿拉伯语, 英语
|
||||
"IT" => ["it-it", "de-it", "it", "de"], // 意大利: 意大利语, 德语
|
||||
"JM" => ["en-jm", "en"], // 牙买加: 英语
|
||||
"JP" => ["ja-jp", "ja"], // 日本: 日语
|
||||
"JO" => ["ar-jo", "ar"], // 约旦: 阿拉伯语
|
||||
"KZ" => ["kk-kz", "ru-kz", "kk", "ru"], // 哈萨克斯坦: 哈萨克语, 俄语
|
||||
"KE" => ["sw-ke", "en-ke", "sw", "en"], // 肯尼亚: 斯瓦希里语, 英语
|
||||
"KR" => ["ko-kr", "ko"], // 韩国: 韩语
|
||||
"KW" => ["ar-kw", "ar"], // 科威特: 阿拉伯语
|
||||
"LA" => ["lo-la", "lo"], // 老挝: 老挝语
|
||||
"LV" => ["lv-lv", "lv"], // 拉脱维亚: 拉脱维亚语
|
||||
"LB" => ["ar-lb", "fr-lb", "ar", "fr"], // 黎巴嫩: 阿拉伯语, 法语
|
||||
"LI" => ["de-li", "de"], // 列支敦士登: 德语
|
||||
"LT" => ["lt-lt", "lt"], // 立陶宛: 立陶宛语
|
||||
"LU" => ["fr-lu", "de-lu", "lb-lu", "fr", "de", "lb"], // 卢森堡: 法语, 德语, 卢森堡语
|
||||
"MO" => ["zh-mo", "pt-mo", "zh-hk", "zh", "pt"], // 澳门: 中文, 葡萄牙语
|
||||
"MY" => ["ms-my", "en-my", "zh-my", "ms", "en", "zh"], // 马来西亚: 马来语, 英语, 中文
|
||||
"MX" => ["es-mx", "es"], // 墨西哥: 西班牙语
|
||||
"MD" => ["ro-md", "ru-md", "ro", "ru"], // 摩尔多瓦: 罗马尼亚语, 俄语
|
||||
"MC" => ["fr-mc", "it-mc", "fr", "it"], // 摩纳哥: 法语, 意大利语
|
||||
"MN" => ["mn-mn", "mn"], // 蒙古: 蒙古语
|
||||
"MA" => ["ar-ma", "fr-ma", "ar", "fr"], // 摩洛哥: 阿拉伯语, 法语
|
||||
"NL" => ["nl-nl", "fy-nl", "nl", "fy"], // 荷兰: 荷兰语, 弗里斯语
|
||||
"NZ" => ["en-nz", "mi-nz", "en", "mi"], // 新西兰: 英语, 毛利语
|
||||
"NI" => ["es-ni", "es"], // 尼加拉瓜: 西班牙语
|
||||
"NG" => ["en-ng", "ha-ng", "ig-ng", "yo-ng", "en", "ha", "ig", "yo"], // 尼日利亚: 英语, 豪萨语, 伊博语, 约鲁巴语
|
||||
"NO" => ["nb-no", "nn-no", "se-no", "nb", "nn", "se"], // 挪威: 书面挪威语, 新挪威语, 萨米语
|
||||
"OM" => ["ar-om", "ar"], // 阿曼: 阿拉伯语
|
||||
"PK" => ["ur-pk", "en-pk", "pa-pk", "ur", "en", "pa"], // 巴基斯坦: 乌尔都语, 英语, 旁遮普语
|
||||
"PA" => ["es-pa", "es"], // 巴拿马: 西班牙语
|
||||
"PY" => ["es-py", "gn-py", "es", "gn"], // 巴拉圭: 西班牙语, 瓜拉尼语
|
||||
"PE" => ["es-pe", "qu-pe", "ay-pe", "es", "qu", "ay"], // 秘鲁: 西班牙语, 盖丘亚语, 艾马拉语
|
||||
"PH" => ["en-ph", "fil-ph", "en", "fil"], // 菲律宾: 英语, 菲律宾语
|
||||
"PL" => ["pl-pl", "pl"], // 波兰: 波兰语
|
||||
"PT" => ["pt-pt", "pt"], // 葡萄牙: 葡萄牙语
|
||||
"PR" => ["es-pr", "en-pr", "es", "en"], // 波多黎各: 西班牙语, 英语
|
||||
"QA" => ["ar-qa", "ar"], // 卡塔尔: 阿拉伯语
|
||||
"RO" => ["ro-ro", "ro"], // 罗马尼亚: 罗马尼亚语
|
||||
"RU" => ["ru-ru", "tt-ru", "ru", "tt"], // 俄罗斯: 俄语, 鞑靼语
|
||||
"SA" => ["ar-sa", "ar"], // 沙特阿拉伯: 阿拉伯语
|
||||
"RS" => ["sr-cyrl-rs", "sr-latn-rs", "sr"], // 塞尔维亚: 塞尔维亚语 (西里尔文, 拉丁文)
|
||||
"SG" => ["en-sg", "zh-sg", "ms-sg", "ta-sg", "en", "zh", "ms", "ta"], // 新加坡: 英语, 中文, 马来语, 泰米尔语
|
||||
"SK" => ["sk-sk", "sk"], // 斯洛伐克: 斯洛伐克语
|
||||
"SI" => ["sl-si", "sl"], // 斯洛文尼亚: 斯洛文尼亚语
|
||||
"ZA" => ["en-za", "af-za", "zu-za", "xh-za", "en", "af", "zu", "xh"], // 南非: 英语, 南非荷兰语, 祖鲁语, 科萨语
|
||||
"ES" => ["es-es", "ca-es", "gl-es", "eu-es", "es", "ca", "gl", "eu"], // 西班牙: 西班牙语, 加泰罗尼亚语, 加利西亚语, 巴斯克语
|
||||
"LK" => ["si-lk", "ta-lk", "si", "ta"], // 斯里兰卡: 僧伽罗语, 泰米尔语
|
||||
"SE" => ["sv-se", "sv"], // 瑞典: 瑞典语
|
||||
"CH" => ["de-ch", "fr-ch", "it-ch", "rm-ch", "de", "fr", "it", "rm"], // 瑞士: 德语, 法语, 意大利语, 罗曼什语
|
||||
"SY" => ["ar-sy", "ar"], // 叙利亚: 阿拉伯语
|
||||
"TW" => ["zh-tw", "zh"], // 台湾: 繁体中文
|
||||
"TH" => ["th-th", "th"], // 泰国: 泰语
|
||||
"TT" => ["en-tt", "en"], // 特立尼达和多巴哥: 英语
|
||||
"TN" => ["ar-tn", "fr-tn", "ar", "fr"], // 突尼斯: 阿拉伯语, 法语
|
||||
"TR" => ["tr-tr", "tr"], // 土耳其: 土耳其语
|
||||
"UA" => ["uk-ua", "ru-ua", "uk", "ru"], // 乌克兰: 乌克兰语, 俄语
|
||||
"AE" => ["ar-ae", "en-ae", "ar", "en"], // 阿拉伯联合酋长国: 阿拉伯语, 英语
|
||||
"GB" => ["en-gb", "cy-gb", "gd-gb", "en", "cy", "gd"], // 英国: 英语, 威尔士语, 苏格兰盖尔语
|
||||
"US" => ["en-us", "es-us", "en", "es"], // 美国: 英语, 西班牙语
|
||||
"UY" => ["es-uy", "es"], // 乌拉圭: 西班牙语
|
||||
"UZ" => ["uz-latn-uz", "ru-uz", "uz", "ru"], // 乌兹别克斯坦: 乌兹别克语 (拉丁文), 俄语
|
||||
"VE" => ["es-ve", "es"], // 委内瑞拉: 西班牙语
|
||||
"VN" => ["vi-vn", "vi"], // 越南: 越南语
|
||||
"YE" => ["ar-ye", "ar"], // 也门: 阿拉伯语
|
||||
"ZW" => ["en-zw", "sn-zw", "nd-zw", "en", "sn", "nd"], // 津巴布韦: 英语, 修纳语, 恩德贝勒语
|
||||
];
|
||||
Executable
+731
@@ -0,0 +1,731 @@
|
||||
<?php
|
||||
|
||||
$commonResolutions = [
|
||||
"iPhone 17 Pro Max" => "440×956@3",
|
||||
"iPhone 17 Air" => "420×912@3",
|
||||
"iPhone 16 Pro Max" => "440×956@3",
|
||||
"iPhone 16 Pro" => "402×874@3",
|
||||
"iPhone 16 Plus" => "430×932@3",
|
||||
"iPhone 16" => "393×852@3",
|
||||
"iPhone 15 Pro Max" => "430×932@3",
|
||||
"iPhone 15 Pro" => "393×852@3",
|
||||
"iPhone 15 Plus" => "430×932@3",
|
||||
"iPhone 15" => "393×852@3",
|
||||
"iPhone 14 Pro Max" => "430×932@3",
|
||||
"iPhone 14 Pro" => "393×852@3",
|
||||
"iPhone 14 Plus" => "428×926@3",
|
||||
"iPhone 14" => "390×844@3",
|
||||
"iPhone 13 Pro Max" => "428×926@3",
|
||||
"iPhone 13 Pro" => "390×844@3",
|
||||
"iPhone 13" => "390×844@3",
|
||||
"iPhone 13 mini" => "360×780@3",
|
||||
"iPhone 12 Pro Max" => "428×926@3",
|
||||
"iPhone 12 Pro" => "390×844@3",
|
||||
"iPhone 12" => "390×844@3",
|
||||
"iPhone 12 mini" => "360×780@3",
|
||||
"iPhone 11 Pro Max" => "414×896@3",
|
||||
"iPhone 11 Pro" => "375×812@3",
|
||||
"iPhone 11" => "414×896@2",
|
||||
"iPhone XR" => "414×896@2",
|
||||
"iPhone XS Max" => "414×896@3",
|
||||
"iPhone XS / X" => "375×812@3",
|
||||
"iPhone 8 Plus" => "414×736@3",
|
||||
"iPhone 8" => "375×667@2",
|
||||
"iPhone 7 Plus" => "414×736@3",
|
||||
"iPhone 7" => "375×667@2",
|
||||
"iPhone 6S Plus" => "414×736@3",
|
||||
"iPhone 6S / 6" => "375×667@2",
|
||||
"iPhone SE (第2、3代)" => "375×667@2",
|
||||
// ==================== iPad Pro 系列 ====================
|
||||
'iPad Pro 13" (M4, 2024)' => '1024×1366@2',
|
||||
'iPad Pro 11" (M4, 2024)' => '834×1194@2',
|
||||
'iPad Pro 12.9" (M2, 2022)' => '1024×1366@2',
|
||||
'iPad Pro 12.9" (M1, 2021)' => '1024×1366@2',
|
||||
'iPad Pro 11" (M2, 2022)' => '834×1194@2',
|
||||
'iPad Pro 11" (M1, 2021)' => '834×1194@2',
|
||||
'iPad Pro 12.9" (2020)' => '1024×1366@2',
|
||||
'iPad Pro 11" (2020)' => '834×1194@2',
|
||||
'iPad Pro 12.9" (2018)' => '1024×1366@2',
|
||||
'iPad Pro 11" (2018)' => '834×1194@2',
|
||||
'iPad Pro 10.5" (2017)' => '834×1112@2',
|
||||
'iPad Pro 9.7" (2016)' => '768×1024@2',
|
||||
'iPad Pro 12.9" (2015)' => '1024×1366@2',
|
||||
// ==================== iPad Air 系列 ====================
|
||||
'iPad Air 13" (M2, 2024)' => '1024×1366@2',
|
||||
'iPad Air 11" (M2, 2024)' => '820×1180@2',
|
||||
'iPad Air 10.9" (M1, 2022)' => '820×1180@2',
|
||||
'iPad Air 10.9" (2020)' => '820×1180@2',
|
||||
'iPad Air 10.5" (2019)' => '834×1112@2',
|
||||
'iPad Air 9.7" (2019)' => '768×1024@2',
|
||||
'iPad Air 2' => '768×1024@2',
|
||||
'iPad Air (1st)' => '768×1024@2',
|
||||
// ==================== 标准 iPad 系列 ====================
|
||||
'iPad 11" (A16, 2025)' => '820×1180@2',
|
||||
'iPad 10.9" (10th, 2022)' => '820×1180@2',
|
||||
'iPad 10.2" (9th, 2021)' => '810×1080@2',
|
||||
'iPad 10.2" (8th, 2020)' => '810×1080@2',
|
||||
'iPad 10.2" (7th, 2019)' => '810×1080@2',
|
||||
'iPad 9.7" (6th, 2018)' => '768×1024@2',
|
||||
'iPad 9.7" (5th, 2017)' => '768×1024@2',
|
||||
'iPad 4' => '768×1024@2',
|
||||
'iPad 3' => '768×1024@2',
|
||||
'iPad 2' => '768×1024@1',
|
||||
'iPad (1st)' => '768×1024@1',
|
||||
// ==================== iPad mini 系列 ====================
|
||||
'iPad mini 8.3" (A17 Pro, 2025)' => '744×1133@2',
|
||||
'iPad mini 8.3" (6th, 2021)' => '744×1133@2',
|
||||
'iPad mini 7.9" (5th, 2019)' => '768×1024@2',
|
||||
'iPad mini 4' => '768×1024@2',
|
||||
'iPad mini 3' => '768×1024@2',
|
||||
'iPad mini 2' => '768×1024@2',
|
||||
'iPad mini (1st)' => '768×1024@1',
|
||||
|
||||
// ==================== 三星 系列 ====================
|
||||
// --- Galaxy S 系列 ---
|
||||
"Galaxy S24" => '360×780@3',
|
||||
"Galaxy S24+" => '384×832@2.8125',
|
||||
"Galaxy S24 Ultra" => '384×824@3.75',
|
||||
"Galaxy S23" => '360×780@3',
|
||||
"Galaxy S23+" => '384×832@2.8125',
|
||||
"Galaxy S23 Ultra" => '384×824@3.75',
|
||||
"Galaxy S22" => '360×780@3',
|
||||
"Galaxy S22+" => '384×832@2.8125',
|
||||
"Galaxy S22 Ultra" => '384×824@3.75',
|
||||
"Galaxy S21 (FE)" => '360×800@3',
|
||||
"Galaxy S21+" => '384×854@2.8125',
|
||||
"Galaxy S21 Ultra" => '412×915@2.625',
|
||||
"Galaxy S21 " => '360×800@3',
|
||||
"Galaxy S20 (FE)" => '360×800@3',
|
||||
"Galaxy S20+" => '384×854@2.8125',
|
||||
"Galaxy S20 Ultra" => '412×915@2.625',
|
||||
"Galaxy S10" => '360×740@4',
|
||||
"Galaxy S10+" => '360×740@4',
|
||||
"Galaxy S9" => '360×740@4',
|
||||
"Galaxy S9+" => '412×846@3.5',
|
||||
"Galaxy S8" => '360×740@4',
|
||||
"Galaxy S8+" => '360×740@4',
|
||||
"Galaxy S7 (Edge)" => '360×640@4',
|
||||
"Galaxy S6 (Edge)" => '360×640@4',
|
||||
// --- Note 系列 ---
|
||||
"Galaxy Note 20" => '412×915@3',
|
||||
"Galaxy Note 10" => '412×869@3',
|
||||
"Galaxy Note 9" => '360×740@4',
|
||||
"Galaxy Note 8" => '360×740@4',
|
||||
"Galaxy Note 5" => '480×853@3',
|
||||
"Galaxy Note FE" => '360×740@3',
|
||||
// --- 折叠屏 ---
|
||||
"Galaxy Z Fold 5 (folded)" => '360×780@3',
|
||||
"Galaxy Z Fold 5 (unfolded)" => '1184×2236@3',
|
||||
"Galaxy Z Fold 4 (folded)" => '360×780@3',
|
||||
"Galaxy Z Fold 4 (unfolded)" => '1184×2236@3',
|
||||
"Galaxy Z Flip 5" => '360×800@3',
|
||||
"Galaxy Z Flip 4" => '412×1004@3',
|
||||
"Galaxy Z Flip 3" => '360×800@3',
|
||||
// --- A 系列 ---
|
||||
"Galaxy A72" => '412×915@3',
|
||||
"Galaxy A71" => '412×914@3',
|
||||
"Galaxy A51" => '412×914@2.625',
|
||||
"Galaxy A50" => '412×892@2.625',
|
||||
"Galaxy A32" => '412×915@3',
|
||||
"Galaxy A30" => '412×892@2.625',
|
||||
"Galaxy A14" => '412×910@2.5',
|
||||
"Galaxy A13" => '412×915@2.5',
|
||||
"Galaxy A12" => '412×915@2.5',
|
||||
"Galaxy A11" => '360×800@2.5',
|
||||
"Galaxy M33" => '412×915@2.5',
|
||||
"Galaxy M31" => '412×915@2.5',
|
||||
"Galaxy M21" => '412×915@2.5',
|
||||
"Galaxy F17" => '412×915@2.5',
|
||||
// --- 平板 ---
|
||||
"Galaxy Tab S9" => '800×1280@2.5',
|
||||
"Galaxy Tab S8" => '800×1280@2.5',
|
||||
"Galaxy Tab S7" => '800×1280@2',
|
||||
"Galaxy Tab A 10.1" => '800×1280@1.5',
|
||||
"Galaxy Tab 2 (10\")" => '800×1280@1',
|
||||
"Galaxy Tab 2 (7\")" => '600×1024@1.33',
|
||||
"Galaxy Tab A8 (2022)" => '1280×800@1.5',
|
||||
"Xiaomi 14" => '360×800@3',
|
||||
"Xiaomi 14 Pro" => '411×914@3.5',
|
||||
"Xiaomi 13" => '360×800@3',
|
||||
"Xiaomi 13 Pro" => '411×914@3.5',
|
||||
"Xiaomi 13 Ultra" => '411×914@3.5',
|
||||
"Xiaomi 12" => '360×800@3',
|
||||
"Xiaomi 12 Pro" => '411×914@3.5',
|
||||
"Xiaomi Mi 11" => '411×914@3.5',
|
||||
"Xiaomi Mi 11 Lite" => '411×914@2.625',
|
||||
"Xiaomi Mi 10 Pro" => '393x851@2.75',
|
||||
"Xiaomi Mi 8, Mi 8 Pro" => '393x817@2.75',
|
||||
"Xiaomi Mi 8 SE" => '393x816@2.75',
|
||||
"Xiaomi Mi 6" => '393x816@2.75',
|
||||
"Xiaomi Mi 3" => '360x640@3',
|
||||
"Redmi Note 13 Pro" => '444×986@2.75',
|
||||
"Redmi Note 13" => '411×914@2.625',
|
||||
"Redmi Note 12 Pro" => '411×914@2.625',
|
||||
"Redmi Note 11" => '432×960@2.5',
|
||||
"Redmi Note 10 Pro" => '432×960@2.5',
|
||||
"Redmi Note 9 Pro" => '393x873@2.75',
|
||||
"Redmi Note 9" => '393x851@2.75',
|
||||
"POCO F5" => '411×914@2.625',
|
||||
"POCO F4" => '411×914@2.625',
|
||||
"POCO X5 Pro" => '411×914@2.625',
|
||||
"POCO X4 Pro" => '432×960@2.5',
|
||||
"Xiaomi Pad 6" => '1440×900@2',
|
||||
"Xiaomi Pad 6 Pro" => '1440×900@2',
|
||||
"Xiaomi Pad 5" => '1280×800@2',
|
||||
"Redmi Pad" => '1000×600@2',
|
||||
// ----- Vivo -----
|
||||
'Vivo X100 Pro' => '420x933@3',
|
||||
'Vivo X100' => '420x933@3',
|
||||
'Vivo X90 Pro' => '420x933@3',
|
||||
'Vivo V30 Pro' => '420x933@3',
|
||||
'Vivo V30' => '393x873@2.75',
|
||||
'Vivo V29 Pro' => '393x873@2.75',
|
||||
'Vivo V29' => '420x933@3',
|
||||
'Vivo V27 Pro' => '393x873@2.75',
|
||||
'Vivo iQOO 12' => '480x1067@3',
|
||||
'Vivo iQOO 11' => '480x1067@3',
|
||||
'Vivo iQOO Z9' => '360x800@3',
|
||||
'Vivo T3' => '360x800@3',
|
||||
'Vivo T2 Pro 5G' => '360x800@3',
|
||||
'Vivo Y200e 5G' => '360x800@3',
|
||||
'Vivo Y100 5G' => '360x797@3',
|
||||
'Vivo Y27' => '360x796@3',
|
||||
'Vivo Y17s' => '360x806@2',
|
||||
'Vivo Y02t' => '360x800@2',
|
||||
'Vivo Pad 3 Pro' => '1032x1548@2',
|
||||
'Vivo Pad 2' => '1000x1400@2',
|
||||
'Vivo Pad Air' => '920x1400@2',
|
||||
"vivo Y20" => '385x854@1.875',
|
||||
"Vivo Y55s" => ' 360x640@2',
|
||||
// ----- Pixel -----
|
||||
"Pixel (2016)" => '412x732@2.6',
|
||||
"Pixel XL" => '412x732@3.5',
|
||||
"Pixel 2" => '412x732@2.6',
|
||||
"Pixel 2 XL" => '412x824@3.5',
|
||||
"Pixel 3" => '393x786@2.75',
|
||||
"Pixel 3 XL" => '412x846@3.5',
|
||||
"Pixel 3a" => '393x808@2.75',
|
||||
"Pixel 3a XL" => '412x824@2.625',
|
||||
"Pixel 4" => '393x830@2.75',
|
||||
"Pixel 4 XL" => '412x869@3.5',
|
||||
"Pixel 5" => '393x851@2.75',
|
||||
"Pixel 6" => '412x915@2.625',
|
||||
"Pixel 6 Pro" => '412x892@3.5',
|
||||
"Pixel 7" => '412x915@2.625',
|
||||
"Pixel 7 Pro" => '412x892@3.5',
|
||||
"Pixel 7a" => '412x915@2.625',
|
||||
"Pixel 8" => '412x915@2.625',
|
||||
"Pixel 8 Pro" => '448×998@3',
|
||||
// -- LG Series --
|
||||
'LG G8 ThinQ' => '412x869@3.5',
|
||||
'LG G7 ThinQ' => '412x846@3.5',
|
||||
'LG G6' => '360x720@4',
|
||||
'LG G5' => '412x732@3.5',
|
||||
'LG G4' => '360x640@4',
|
||||
'LG G3' => '360x640@4',
|
||||
'LG V60 ThinQ' => '412x915@2.625',
|
||||
'LG V50 ThinQ' => '412x869@3.5',
|
||||
'LG V40 ThinQ' => '412x869@3.5',
|
||||
'LG V30' => '412x824@3.5',
|
||||
'LG V20' => '412x732@3.5',
|
||||
'LG Wing' => '428x926@2.5',
|
||||
'LG Velvet 5G' => '412x915@2.625',
|
||||
'LG K51' => '412x914@2',
|
||||
'LG K40' => '360x720@2',
|
||||
'LG K30' => '360x640@2',
|
||||
'LG K20' => '360x640@2',
|
||||
'LG K10' => '360x640@2',
|
||||
'LG Stylo 6' => '412x915@2.625',
|
||||
'LG Stylo 5' => '412x846@2.625',
|
||||
'LG Stylo 4' => '412x824@2.625',
|
||||
'LG Nexus 5X' => '412x732@2.625',
|
||||
'LG Nexus 5' => '360x640@3',
|
||||
'LG Nexus 4' => '384x640@2',
|
||||
'LG G Pad 5 10.1' => '800x1280@1.5',
|
||||
'LG G Pad X 10.1' => '800x1280@1.5',
|
||||
'LG G Pad F 8' => '800x1280@1',
|
||||
'LG G Pad II 10.1' => '1280x800@1.5',
|
||||
// -- OPPO Series --
|
||||
'OPPO Find X7 Ultra' => '480x1056@3',
|
||||
'OPPO Find X7' => '421x927@3',
|
||||
'OPPO Find X6 Pro' => '480x1056@3',
|
||||
'OPPO Find X6' => '413x924@3',
|
||||
'OPPO Find X5 Pro' => '480x1072@3',
|
||||
'OPPO Find X5' => '393x873@2.75',
|
||||
'OPPO Find X3 Pro' => '480x1072@3',
|
||||
'OPPO Find X3' => '393x877@2.75',
|
||||
'OPPO Find X2 Pro' => '480x1056@3',
|
||||
'OPPO Find X2' => '393x873@2.75',
|
||||
'OPPO Find X' => '432x936@2.5',
|
||||
'OPPO Find 7' => '480x853@3',
|
||||
'OPPO Find N3' => '825x887@2.75',
|
||||
'OPPO Find N3 Flip' => '393x916@2.75',
|
||||
'OPPO Find N2' => '652x698@2.75',
|
||||
'OPPO Find N2 Flip' => '393x916@2.75',
|
||||
'OPPO Find N' => '652x698@2.75',
|
||||
'OPPO Reno12 Pro' => '451x1008@2.75',
|
||||
'OPPO Reno12' => '393x877@2.75',
|
||||
'OPPO Reno11 Pro' => '451x1008@2.75',
|
||||
'OPPO Reno11' => '393x877@2.75',
|
||||
'OPPO Reno10 Pro+' => '413x924@3',
|
||||
'OPPO Reno10 Pro' => '451x1008@2.75',
|
||||
'OPPO Reno10' => '393x877@2.75',
|
||||
'OPPO Reno9 Pro+' => '413x924@3',
|
||||
'OPPO Reno9 Pro' => '393x877@2.75',
|
||||
'OPPO Reno9' => '393x877@2.75',
|
||||
'OPPO Reno8 Pro' => '393x877@2.75',
|
||||
'OPPO Reno8 T' => '393x877@2.75',
|
||||
'OPPO Reno8' => '393x873@2.75',
|
||||
'OPPO Reno7 Pro' => '393x873@2.75',
|
||||
'OPPO Reno7' => '393x873@2.75',
|
||||
'OPPO Reno6 Pro' => '393x873@2.75',
|
||||
'OPPO Reno6' => '393x873@2.75',
|
||||
'OPPO Reno5 Pro' => '393x873@2.75',
|
||||
'OPPO Reno5' => '393x873@2.75',
|
||||
'OPPO Reno4 Pro' => '393x873@2.75',
|
||||
'OPPO Reno4' => '393x873@2.75',
|
||||
'OPPO Reno3 Pro' => '393x873@2.75',
|
||||
'OPPO Reno3' => '393x873@2.75',
|
||||
'OPPO Reno2' => '393x873@2.75',
|
||||
'OPPO Reno Z' => '393x851@2.75',
|
||||
'OPPO Reno' => '393x851@2.75',
|
||||
'OPPO F27 Pro+' => '393x877@2.75',
|
||||
'OPPO F25 Pro' => '432x965@2.5',
|
||||
'OPPO F23' => '540x1200@2',
|
||||
'OPPO F21 Pro' => '393x873@2.75',
|
||||
'OPPO F19 Pro+' => '393x873@2.75',
|
||||
'OPPO F19' => '393x873@2.75',
|
||||
'OPPO F17 Pro' => '393x873@2.75',
|
||||
'OPPO F15' => '393x873@2.75',
|
||||
'OPPO F11 Pro' => '393x851@2.75',
|
||||
'OPPO F9 (F9 Pro)' => '393x851@2.75',
|
||||
'OPPO F7' => '393x829@2.75',
|
||||
'OPPO F5' => '393x785@2.75',
|
||||
'OPPO F3 Plus' => '360x640@3',
|
||||
'OPPO F1s' => '360x640@2',
|
||||
'OPPO A98' => '540x1200@2',
|
||||
'OPPO A96' => '393x877@2.75',
|
||||
'OPPO A79' => '432x960@2.5',
|
||||
'OPPO A78' => '393x873@2.75',
|
||||
'OPPO A77s' => '360x806@2',
|
||||
'OPPO A60' => '360x802@2',
|
||||
'OPPO A58' => '540x1200@2',
|
||||
'OPPO A57' => '360x806@2',
|
||||
'OPPO A54' => '360x800@2',
|
||||
'OPPO A37' => '360x640@2',
|
||||
'OPPO A38' => '360x806@2',
|
||||
'OPPO A18' => '360x806@2',
|
||||
'OPPO A17' => '360x806@2',
|
||||
'OPPO A16' => '360x800@2',
|
||||
'OPPO A15' => '360x800@2',
|
||||
'OPPO K12' => '432x965@2.5',
|
||||
'OPPO K11' => '393x877@2.75',
|
||||
'OPPO K10 Pro' => '393x873@2.75',
|
||||
'OPPO K10' => '393x877@2.75',
|
||||
'OPPO K9' => '393x873@2.75',
|
||||
'OPPO K7x' => '393x873@2.75',
|
||||
'OPPO K5' => '393x851@2.75',
|
||||
'OPPO K3' => '393x851@2.75',
|
||||
'OPPO K1' => '393x851@2.75',
|
||||
'OPPO R17 Pro' => '432x936@2.5',
|
||||
'OPPO R17' => '432x936@2.5',
|
||||
'OPPO R15 Pro' => '393x829@2.75',
|
||||
'OPPO R15' => '393x829@2.75',
|
||||
'OPPO R11s Plus' => '393x785@2.75',
|
||||
'OPPO R11s' => '393x785@2.75',
|
||||
'OPPO R11' => '360x640@3',
|
||||
'OPPO R9s (F3 Plus)' => '360x640@3',
|
||||
'OPPO R9 (F1 Plus)' => '360x640@3',
|
||||
'OPPO R7s' => '360x640@3',
|
||||
'OPPO R7' => '360x640@3',
|
||||
'OPPO R5' => '360x640@3',
|
||||
'OPPO N3' => '360x640@3',
|
||||
'OPPO N1' => '432x768@2.5',
|
||||
'OPPO Pad 2' => '1000x1400@2',
|
||||
'OPPO Pad Neo' => '983x1376@1.75',
|
||||
'OPPO Pad Air2' => '983x1376@1.75',
|
||||
'OPPO Pad Air' => '800x1333@1.5',
|
||||
'OPPO Pad' => '800x1280@2',
|
||||
//-- TRANSSION --//
|
||||
'Tecno Phantom V Fold' => '810x1080@2.5',
|
||||
'Tecno Phantom X2 Pro' => '393x873@2.75',
|
||||
'Tecno Phantom X2' => '393x873@2.75',
|
||||
'Tecno Phantom X' => '393x873@2.75',
|
||||
'Tecno Camon 20 Premier' => '393x873@2.75',
|
||||
'Tecno Camon 20 Pro' => '393x873@2.75',
|
||||
'Tecno Camon 19 Pro' => '393x895@2.75',
|
||||
'Tecno Camon 18 Premier' => '393x873@2.75',
|
||||
'Tecno Camon 17 Pro' => '393x895@2.75',
|
||||
'Tecno Spark 10 Pro' => '393x895@2.75',
|
||||
'Tecno Spark 10 5G' => '360x800@2',
|
||||
'Tecno Spark Go 2023' => '360x806@2',
|
||||
'Tecno Spark 9 Pro' => '393x895@2.75',
|
||||
'Tecno Spark 8C' => '360x806@2',
|
||||
'Tecno Pova 5 Pro' => '393x895@2.75',
|
||||
'Tecno Pova 4' => '360x800@2',
|
||||
'Tecno Pova Neo 3' => '376x836@1.75',
|
||||
'Tecno Pova 3' => '393x895@2.75',
|
||||
'Tecno DroiPad 10 Pro II' => '1280x800@1',
|
||||
'Tecno Pad 4G (Tab P704a)' => '533x853@1.5',
|
||||
'Tecno Megabook T1 (15.6")' => '1536x864@1.25',
|
||||
'Tecno Megabook S1' => '1688x1055@1.5',
|
||||
'Infinix Zero 30 5G' => '393x873@2.75',
|
||||
'Infinix Zero Ultra' => '393x873@2.75',
|
||||
'Infinix Zero 20' => '393x873@2.75',
|
||||
'Infinix Zero X Pro' => '393x873@2.75',
|
||||
'Infinix Note 30 VIP' => '393x873@2.75',
|
||||
'Infinix Note 30 Pro' => '393x873@2.75',
|
||||
'Infinix Note 12 Pro 5G' => '393x873@2.75',
|
||||
'Infinix Note 11S' => '393x895@2.75',
|
||||
'Infinix Note 10 Pro' => '393x895@2.75',
|
||||
'Infinix Hot 30' => '393x895@2.75',
|
||||
'Infinix Hot 30i' => '360x800@2',
|
||||
'Infinix Hot 20S' => '393x895@2.75',
|
||||
'Infinix Hot 12 Play' => '371x824@1.94',
|
||||
'Infinix Hot 11S' => '393x895@2.75',
|
||||
'Infinix Smart 7' => '360x800@2',
|
||||
'Infinix Smart 6 Plus' => '360x820@2',
|
||||
'Infinix Smart 5' => '360x800@2',
|
||||
'Itel S23+' => '393x873@2.75',
|
||||
'Itel S23' => '360x800@2',
|
||||
'Itel S18' => '360x806@2',
|
||||
'Itel S17' => '360x806@2',
|
||||
'Itel P40' => '360x806@2',
|
||||
'Itel P38 Pro' => '360x800@2',
|
||||
'Itel P37' => '360x800@2',
|
||||
'Itel A60s' => '360x800@2',
|
||||
'Itel A49' => '360x800@2',
|
||||
'Itel A27' => '480x854@1',
|
||||
'Itel Vision 5' => '360x800@2',
|
||||
'Itel Vision 3' => '360x800@2',
|
||||
'Itel Vision 1 Pro' => '360x800@2',
|
||||
// ----- HUAWEI ------
|
||||
'HUAWEI P60 Pro' => '412x915@2.625',
|
||||
'HUAWEI P60 Art' => '412x915@2.625',
|
||||
'HUAWEI P60' => '412x915@2.625',
|
||||
'HUAWEI P50 Pro' => '412x915@2.625',
|
||||
'HUAWEI P50 Pocket' => '412x915@2.625',
|
||||
'HUAWEI P40 Pro+' => '412x915@3',
|
||||
'HUAWEI P40 Pro' => '412x915@3',
|
||||
'HUAWEI P40' => '360x800@3',
|
||||
'HUAWEI Mate X3' => '428x926@2.75', // Unfolded
|
||||
'HUAWEI Mate 50 Pro' => '390x844@3',
|
||||
'HUAWEI Mate 50' => '412x915@2.625',
|
||||
'HUAWEI Mate 40 Pro' => '428x926@3',
|
||||
'HUAWEI Mate 30 Pro' => '412x915@3',
|
||||
'HUAWEI nova 12 Ultra' => '412x915@2.625',
|
||||
'HUAWEI nova 11 Pro' => '428x926@2.75',
|
||||
'HUAWEI nova 10 Pro' => '393x851@2.75',
|
||||
'HUAWEI nova 9' => '393x851@2.75',
|
||||
'HUAWEI nova 8 Pro' => '393x851@3',
|
||||
'HUAWEI MatePad Pro 13.2' => '1440x960@2',
|
||||
'HUAWEI MatePad Pro 12.6' => '1280x800@2',
|
||||
'HUAWEI MatePad Pro 11' => '1280x800@2',
|
||||
'HUAWEI MatePad 11.5 S' => '1440x960@2',
|
||||
'HUAWEI MatePad 11 2023' => '1280x800@2',
|
||||
'HUAWEI MatePad Air' => '1440x960@2',
|
||||
// ----- SONY ------
|
||||
'Sony Xperia 1 VI' => '412x915@2.625',
|
||||
'Sony Xperia 1 V' => '411x960@4',
|
||||
'Sony Xperia 1 IV' => '411x960@4',
|
||||
'Sony Xperia 1 III' => '411x960@4',
|
||||
'Sony Xperia 1 II' => '411x960@4',
|
||||
'Sony Xperia 1' => '411x960@4',
|
||||
'Sony Xperia 5 V' => '360x840@3',
|
||||
'Sony Xperia 5 IV' => '360x840@3',
|
||||
'Sony Xperia 5 III' => '360x840@3',
|
||||
'Sony Xperia 5 II' => '360x840@3',
|
||||
'Sony Xperia 5' => '360x840@3',
|
||||
'Sony Xperia 10 VI' => '360x840@3',
|
||||
'Sony Xperia 10 V' => '360x840@3',
|
||||
'Sony Xperia 10 IV' => '360x840@3',
|
||||
'Sony Xperia 10 III' => '360x840@3',
|
||||
'Sony Xperia PRO-I' => '411x960@4',
|
||||
'Sony Xperia PRO' => '411x960@4',
|
||||
'Sony Xperia XZ3' => '412x823@3.5',
|
||||
'Sony Xperia XZ2 Premium' => '540x960@4',
|
||||
'Sony Xperia XZ2' => '360x720@3',
|
||||
'Sony Xperia XZ2 Compact' => '360x720@3',
|
||||
'Sony Xperia XZ1' => '360x640@3',
|
||||
'Sony Xperia XZ Premium' => '540x960@4',
|
||||
'Sony Xperia XZs' => '360x640@3',
|
||||
'Sony Xperia XZ' => '360x640@3',
|
||||
'Sony Xperia X Performance' => '360x640@3',
|
||||
'Sony Xperia XA Ultra' => '360x640@3',
|
||||
'Sony Xperia Z5 Premium' => '540x960@4',
|
||||
'Sony Xperia Z5' => '360x640@3',
|
||||
'Sony Xperia Z3+' => '360x640@3',
|
||||
'Sony Xperia Z3' => '360x640@3',
|
||||
'Sony Xperia Z2' => '360x640@3',
|
||||
'Sony Xperia Z1' => '360x640@3',
|
||||
'Sony Xperia Z' => '360x640@3',
|
||||
'Sony Ericsson Xperia Arc S' => '320x569@1.5',
|
||||
'Sony Xperia S' => '360x640@2',
|
||||
'Sony Xperia P' => '360x640@1.5',
|
||||
'Sony Xperia Ion' => '360x640@2',
|
||||
'Sony Xperia Z4 Tablet' => '1280x800@2',
|
||||
'Sony Xperia Z3 Tablet Compact' => '960x600@2',
|
||||
'Sony Xperia Z2 Tablet' => '960x600@2',
|
||||
'Sony Xperia Tablet Z' => '960x600@2',
|
||||
'Sony Tablet P' => '480x512@1',
|
||||
'Sony Tablet S' => '1280x800@1',
|
||||
// ---- SHARP -----
|
||||
'Aquos R9' => '412x891@2.625',
|
||||
'Aquos Wish 4' => '360x780@2',
|
||||
'Aquos R8 Pro' => '412x915@3.5',
|
||||
'Aquos R8' => '412x915@2.625',
|
||||
'Aquos Wish3' => '360x780@2',
|
||||
'Aquos R7s' => '360x780@3.5',
|
||||
'Aquos Sense7' => '412x915@2.625',
|
||||
'Aquos R7' => '360x780@3.5',
|
||||
'Aquos Wish2' => '393x851@1.875',
|
||||
'Aquos R6' => '360x780@3.5',
|
||||
'Aquos Zero6' => '412x915@2.625',
|
||||
'Aquos Sense6' => '412x915@2.625',
|
||||
'Aquos Sense4' => '360x760@3',
|
||||
'Aquos Sense5G' => '412x915@2.625',
|
||||
'Aquos R5G' => '360x720@4',
|
||||
'Aquos Zero2' => '360x780@3',
|
||||
'Aquos R3' => '360x689@4',
|
||||
'Aquos V' => '360x720@3',
|
||||
'Aquos S3' => '360x720@3',
|
||||
'Aquos S2' => '360x680@3',
|
||||
'Aquos R Compact' => '360x677@3',
|
||||
'Aquos Crystal' => '360x640@2',
|
||||
'Aquos Crystal 2' => '360x640@2',
|
||||
'Aquos Xx 304SH' => '360x640@3',
|
||||
'Aquos Phone Zeta SH-01F' => '360x640@3',
|
||||
'Aquos Phone Xx mini 303SH' => '360x640@2.5',
|
||||
'Sharp FX' => '240x400@1',
|
||||
'dtab d-41A' => '800x1280@2',
|
||||
'Mebius Pad TA-S10L-B' => '1280x800@2',
|
||||
'Aquos Pad SH-08E' => '960x600@2',
|
||||
'Aquos Pad SHT22' => '1280x800@1.5',
|
||||
'Galapagos EB-A71GJ-B' => '1024x600@1',
|
||||
// ----- MoTo ----
|
||||
'Motorola Razr 40 Ultra / Razr+ (2023)' => '1080x2640@2.625',
|
||||
'Motorola Razr 40 / Razr (2023)' => '1080x2640@2.625',
|
||||
'Motorola Razr (2022)' => '1080x2400@2.75',
|
||||
'Motorola Razr 5G' => '876x2142@2.75',
|
||||
'Motorola Razr (2019)' => '876x2142@3.5',
|
||||
'Motorola ThinkPhone' => '1080x2400@2.625',
|
||||
'Motorola Edge+ (2023)' => '1080x2400@2.75',
|
||||
'Motorola Edge (2023)' => '1080x2400@2.75',
|
||||
'Motorola Edge 40 Pro' => '1080x2400@2.75',
|
||||
'Motorola Edge 40 Neo' => '1080x2400@2.75',
|
||||
'Motorola Edge 40' => '1080x2400@2.75',
|
||||
'Motorola Edge+ (2022)' => '1080x2400@2.75',
|
||||
'Motorola Edge (2022)' => '1080x2400@2.75',
|
||||
'Motorola Edge 30 Ultra' => '1080x2400@2.75',
|
||||
'Motorola Edge 30 Fusion' => '1080x2400@2.75',
|
||||
'Motorola Edge 30 Neo' => '1080x2400@2.75',
|
||||
'Motorola Edge 30' => '1080x2400@2.75',
|
||||
'Motorola Edge (2021)' => '1080x2460@2.625',
|
||||
'Motorola Edge 20 Pro' => '1080x2400@2.5',
|
||||
'Motorola Edge 20' => '1080x2400@2.5',
|
||||
'Motorola Edge 20 Lite' => '1080x2400@2.75',
|
||||
'Motorola Edge+' => '1080x2340@2.625',
|
||||
'Motorola Edge' => '1080x2340@2.625',
|
||||
'Moto G Stylus 5G (2023)' => '1080x2400@2.625',
|
||||
'Moto G Power 5G (2023)' => '1080x2400@2.625',
|
||||
'Moto G (2023)' => '720x1600@1.75',
|
||||
'Moto G Play (2023)' => '720x1600@1.8125',
|
||||
'Moto G84 5G' => '1080x2400@2.75',
|
||||
'Moto G73' => '1080x2400@2.75',
|
||||
'Moto G54' => '1080x2400@2.75',
|
||||
'Moto G53' => '720x1600@2',
|
||||
'Moto G23' => '720x1600@2',
|
||||
'Moto G14' => '1080x2400@2.625',
|
||||
'Moto G200 5G' => '1080x2460@2.75',
|
||||
'Moto G100' => '1080x2520@2.75',
|
||||
'Moto G82' => '1080x2400@2.75',
|
||||
'Moto G72' => '1080x2400@2.625',
|
||||
'Moto G62 5G' => '1080x2400@2.75',
|
||||
'Moto G52' => '1080x2400@2.75',
|
||||
'Moto G42' => '1080x2400@2.75',
|
||||
'Moto G32' => '1080x2400@2.75',
|
||||
'Moto G22' => '720x1600@2',
|
||||
'Moto G Stylus (2022)' => '1080x2460@2.625',
|
||||
'Moto G Power (2022)' => '720x1600@2',
|
||||
'Moto G Pure' => '720x1600@2',
|
||||
'Moto G60S' => '1080x2460@2.75',
|
||||
'Moto G50' => '720x1600@2',
|
||||
'Moto G30' => '720x1600@2',
|
||||
'Moto G10 Power' => '720x1600@2',
|
||||
'Moto G9 Plus' => '1080x2400@2.75',
|
||||
'Moto G8 Power' => '1080x2300@2.75',
|
||||
'Moto E13' => '720x1600@2',
|
||||
'Moto E22s' => '720x1600@2',
|
||||
'Moto E32' => '720x1600@2',
|
||||
'Moto E40' => '720x1600@2.125',
|
||||
'Moto E30' => '720x1600@2',
|
||||
'Moto E20' => '720x1600@2',
|
||||
'Moto E7i Power' => '720x1600@2',
|
||||
'Motorola One 5G UW ace' => '1080x2400@2.75',
|
||||
'Motorola One 5G' => '1080x2520@2.75',
|
||||
'Motorola One Fusion+' => '1080x2340@2.75',
|
||||
'Motorola One Hyper' => '1080x2340@2.75',
|
||||
'Motorola One Action' => '1080x2520@3',
|
||||
'Motorola One Vision' => '1080x2520@3',
|
||||
'Motorola One Zoom' => '1080x2340@2.75',
|
||||
'Moto Z4' => '1080x2340@2.75',
|
||||
'Moto Z3' => '1080x2160@2.75',
|
||||
'Moto Z2 Force' => '1440x2560@4',
|
||||
'Moto Z Play' => '1080x1920@3',
|
||||
'Droid Turbo 2' => '1440x2560@4',
|
||||
'Droid Maxx 2' => '1080x1920@3',
|
||||
'Droid Turbo' => '1440x2560@4',
|
||||
'Moto Tab G70' => '1200x2000@2',
|
||||
'Moto Tab G62' => '1200x2000@2',
|
||||
'Moto Tab G20' => '800x1280@1.5',
|
||||
// One Plus
|
||||
'OnePlus 13' => '360x792@4',
|
||||
'OnePlus 13S' => '405x880@3',
|
||||
'OnePlus 13R' => '421x927@3',
|
||||
'OnePlus 12' => '360x792@4',
|
||||
'OnePlus 12R' => '421x927@3',
|
||||
'OnePlus 11' => '360x804@4',
|
||||
'OnePlus 11R' => '413x924@3',
|
||||
'OnePlus 10 Pro' => '360x804@4',
|
||||
'OnePlus 10T' => '360x804@3',
|
||||
'OnePlus 10R' => '360x804@3',
|
||||
'OnePlus 9 Pro' => '360x804@4',
|
||||
'OnePlus 9' => '360x800@3',
|
||||
'OnePlus 9R' => '360x800@3',
|
||||
'OnePlus 8T' => '360x800@3',
|
||||
'OnePlus 8 Pro' => '360x792@4',
|
||||
'OnePlus 8' => '360x800@3',
|
||||
'OnePlus 7T Pro' => '411x891@3.5',
|
||||
'OnePlus 7T' => '360x800@3',
|
||||
'OnePlus 7 Pro' => '411x891@3.5',
|
||||
'OnePlus 7' => '360x780@3',
|
||||
'OnePlus 6T' => '360x780@3',
|
||||
'OnePlus 6' => '360x760@3',
|
||||
'OnePlus 5t' => '360x760@3',
|
||||
'OnePlus Open' => '756x813@3',
|
||||
'OnePlus Nord 5' => '424x933@3',
|
||||
'OnePlus Nord 4' => '413x924@3',
|
||||
'OnePlus Nord 3' => '413x924@3',
|
||||
'OnePlus Nord 2T' => '360x800@3',
|
||||
'OnePlus Nord 2' => '360x800@3',
|
||||
'OnePlus Nord' => '360x800@3',
|
||||
'OnePlus Nord CE 4' => '360x804@3',
|
||||
'OnePlus Nord CE 3' => '360x804@3',
|
||||
'OnePlus Nord CE 3 Lite' => '393x873@2.75',
|
||||
'OnePlus Nord CE 2' => '360x800@3',
|
||||
'OnePlus Nord CE 2 Lite' => '360x804@3',
|
||||
'OnePlus Nord CE' => '360x800@3',
|
||||
'OnePlus Nord N30' => '393x873@2.75',
|
||||
'OnePlus Nord N20' => '360x800@3',
|
||||
'OnePlus Nord N10' => '393x873@2.75',
|
||||
'OnePlus Nord N300' => '360x806@2',
|
||||
'OnePlus Nord N200' => '393x873@2.75',
|
||||
'OnePlus Nord N100' => '360x800@2',
|
||||
'OnePlus Pad' => '1000x1400@2',
|
||||
'OnePlus Pad Go' => '860x1204@2',
|
||||
// Surface
|
||||
'Surface Duo 2' => '489×688@2.75',
|
||||
'Surface Duo' => '464×650@2.75',
|
||||
// Lenovo
|
||||
'Lenovo Tab P12 Pro' => '2560×1600@2',
|
||||
'Lenovo Tab P12' => '2944×1840@2',
|
||||
'Lenovo Tab P11 Gen 2' => '2000×1200@2',
|
||||
'Lenovo Yoga Tab 13' => '2160×1350@2',
|
||||
'Lenovo Tab M10 Plus Gen 3' => '2000×1200@2',
|
||||
'Lenovo Tab M9' => '1340×800@1.5',
|
||||
'Lenovo Tab Extreme' => '3000×1876@2.5',
|
||||
|
||||
// --- 笔记本 (默认 DPR=1) ---
|
||||
"Laptop" => '1920×1080',
|
||||
"Laptop 2" => '1280×800',
|
||||
"Laptop 3" => '1560×1040',
|
||||
"Laptop 4" => '1536x864',
|
||||
"Laptop 5" => '1536x960',
|
||||
"Laptop 6" => '2560x1600',
|
||||
"Laptop 7" => '1920x1080',
|
||||
"Laptop 8" => '1920x1200',
|
||||
"Laptop 9" => '1440×960',
|
||||
'Laptop 10' => '1920×1200',
|
||||
'Laptop 11' => '1536×864',
|
||||
'Laptop 12' => '1536×864',
|
||||
'Laptop 13' => '1366x768',
|
||||
'Laptop 14' => '1536×864',
|
||||
'Laptop 15' => '1920x1080',
|
||||
'Laptop 16' => '2080x1387',
|
||||
'Laptop 17' => '2080x1333',
|
||||
'Laptop 18' => '2520x1680',
|
||||
'Laptop 19' => '1280×720',
|
||||
'Laptop 20' => '1366×768',
|
||||
'Laptop 21' => '1600×900',
|
||||
'Laptop 22' => '1024×600',
|
||||
'Laptop 23' => '768×512',
|
||||
'Laptop 24' => '1620×1080',
|
||||
'Laptop 25' => '1500×1000',
|
||||
'Laptop 26' => '1200×800',
|
||||
'Laptop 27' => '1664×1109',
|
||||
'Laptop 28' => '1504×1003',
|
||||
'Laptop 29' => '1229×819',
|
||||
'Laptop 30' => '2250×1500',
|
||||
'Laptop 31' => '1440x960',
|
||||
'Laptop 32' => '1280x853',
|
||||
'Laptop 33' => '1368x912',
|
||||
'Laptop 34' => '2880x1800',
|
||||
'Laptop 35' => '1920x1200',
|
||||
'Laptop 36' => '2160x1350',
|
||||
'Laptop 37' => '3840x2400',
|
||||
|
||||
// --- 显示器 (桌面浏览器,一般 DPR=1) ---
|
||||
"PC (27\")" => '3840×2160',
|
||||
"PC (32\")" => '2560×1440',
|
||||
"PC (34\")" => '3440×1440',
|
||||
"PC (49\")" => '5120×1440',
|
||||
"PC (i9250)" => '360×640',
|
||||
"PC(4K)" => '2560×1600',
|
||||
"PC(2K显示器)" => '2560x1440',
|
||||
"PC(4K显示器)" => '5120×2880',
|
||||
"PC(Desktop 4K 1X Scale)" => '3840x2160',
|
||||
'UltraWide QHD' => '3440x1440',
|
||||
'4K UHD' => '3072x1728',
|
||||
'5K2K WUHD Monitor @ 100%' => '5120x2160',
|
||||
'5K2K WUHD Monitor @ 150%' => '3413x1440',
|
||||
'MACBOOK HD' => '2304×1440',
|
||||
'HUAWEI MateView 28.2' => '3840x2560', // 4K+
|
||||
'Sony BVM' => '4096x2160',
|
||||
'Sony PVM' => '3840x2160',
|
||||
'Sony SDM' => '1920x1200',
|
||||
'Sharp 8K' => '7680x4320',
|
||||
|
||||
// ======== MacBook Air 系列 ========
|
||||
'MacBook Air 13" (M4, 2025)' => '1280×832',
|
||||
'MacBook Air 15" (M4, 2025)' => '1440×932',
|
||||
'MacBook Air 13" (M2, 2022)' => '1280×832',
|
||||
'MacBook Air 15" (M2, 2023)' => '1440×932',
|
||||
'MacBook Air 13" (M1, 2020)' => '1280×800',
|
||||
// ======== MacBook Pro 系列 ========
|
||||
'MacBook Pro 14" (M4 Pro/Max, 2024)' => '1512×982',
|
||||
'MacBook Pro 16" (M4 Pro/Max, 2024)' => '1728×1117',
|
||||
'MacBook Pro 13" (M2, 2022)' => '1280×800',
|
||||
'MacBook Pro 14" (M1 Pro/Max, 2021)' => '1512×982',
|
||||
'MacBook Pro 16" (M1 Pro/Max, 2021)' => '1728×1117',
|
||||
'MacBook Pro 15" (Retina, 2012-2015)' => '1440×900',
|
||||
'MacBook Pro 13" (Retina, 2012-2015)' => '1280×800',
|
||||
// ======== iMac 系列 =======
|
||||
'iMac 24" (M4, 2024)' => '2240×1260',
|
||||
'iMac 27" (Retina 5K, 2014-2020)' => '2560×1440',
|
||||
'iMac 21.5" (Retina 4K, 2015-2019)' => '1920×1080',
|
||||
|
||||
// ----- Watch -----
|
||||
"Apple Watch Series (44mm)" => '224x184@2',
|
||||
"Apple Watch Series (40mm)" => '197x162@2',
|
||||
"Samsung Watch 1.2\" (42MM)" => '180x180@2',
|
||||
"Samsung Watch 1.3\" (46MM)" => '180x180@2',
|
||||
"Samsung Watch 3 1.2\" (41MM)" => '180x180@2',
|
||||
"Samsung Watch 3 1.4\" (45MM)" => '180x180@2',
|
||||
"Samsung Watch Active 1.2\" (40MM)" => '180x180@2',
|
||||
"Samsung Watch Active 1.4\" (44MM)" => '180x180@2',
|
||||
"Huawei Watch GT" => '227x227@2',
|
||||
"LG Watch W7" => '180x180@2',
|
||||
"Xiaomi Mi Watch 2020" => '227x227@2',
|
||||
"Xiaomi Mi Watch Revolve 2020" => '227x227@2',
|
||||
"Realme Watch 2020" => '160x160@2',
|
||||
];
|
||||
Executable
+1115
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Executable
+1984
File diff suppressed because it is too large
Load Diff
Executable
+257
@@ -0,0 +1,257 @@
|
||||
<?php
|
||||
|
||||
$unqiePixels = [
|
||||
'440×956@3',
|
||||
'420×912@3',
|
||||
'402×874@3',
|
||||
'430×932@3',
|
||||
'393×852@3',
|
||||
'428×926@3',
|
||||
'390×844@3',
|
||||
'360×780@3',
|
||||
'414×896@3',
|
||||
'375×812@3',
|
||||
'414×896@2',
|
||||
'414×736@3',
|
||||
'375×667@2',
|
||||
'1024×1366@2',
|
||||
'834×1194@2',
|
||||
'834×1112@2',
|
||||
'768×1024@2',
|
||||
'820×1180@2',
|
||||
'810×1080@2',
|
||||
'768×1024@1',
|
||||
'744×1133@2',
|
||||
'384×832@2.8125',
|
||||
'384×824@3.75',
|
||||
'360×800@3',
|
||||
'384×854@2.8125',
|
||||
'412×915@2.625',
|
||||
'360×740@4',
|
||||
'412×846@3.5',
|
||||
'360×640@4',
|
||||
'412×915@3',
|
||||
'412×869@3',
|
||||
'480×853@3',
|
||||
'360×740@3',
|
||||
'1184×2236@3',
|
||||
'412×1004@3',
|
||||
'412×914@3',
|
||||
'412×914@2.625',
|
||||
'412×892@2.625',
|
||||
'412×910@2.5',
|
||||
'412×915@2.5',
|
||||
'360×800@2.5',
|
||||
'800×1280@2.5',
|
||||
'800×1280@2',
|
||||
'800×1280@1.5',
|
||||
'800×1280@1',
|
||||
'600×1024@1.33',
|
||||
'1280×800@1.5',
|
||||
'411×914@3.5',
|
||||
'411×914@2.625',
|
||||
'393x851@2.75',
|
||||
'393x817@2.75',
|
||||
'393x816@2.75',
|
||||
'360x640@3',
|
||||
'444×986@2.75',
|
||||
'432×960@2.5',
|
||||
'393x873@2.75',
|
||||
'1440×900@2',
|
||||
'1280×800@2',
|
||||
'1000×600@2',
|
||||
'420x933@3',
|
||||
'480x1067@3',
|
||||
'360x800@3',
|
||||
'360x797@3',
|
||||
'360x796@3',
|
||||
'360x806@2',
|
||||
'360x800@2',
|
||||
'1032x1548@2',
|
||||
'1000x1400@2',
|
||||
'920x1400@2',
|
||||
'385x854@1.875',
|
||||
' 360x640@2',
|
||||
'412x732@2.6',
|
||||
'412x732@3.5',
|
||||
'412x824@3.5',
|
||||
'393x786@2.75',
|
||||
'412x846@3.5',
|
||||
'393x808@2.75',
|
||||
'412x824@2.625',
|
||||
'393x830@2.75',
|
||||
'412x869@3.5',
|
||||
'412x915@2.625',
|
||||
'412x892@3.5',
|
||||
'448×998@3',
|
||||
'360x720@4',
|
||||
'360x640@4',
|
||||
'428x926@2.5',
|
||||
'412x914@2',
|
||||
'360x720@2',
|
||||
'360x640@2',
|
||||
'412x846@2.625',
|
||||
'412x732@2.625',
|
||||
'384x640@2',
|
||||
'800x1280@1.5',
|
||||
'800x1280@1',
|
||||
'1280x800@1.5',
|
||||
'480x1056@3',
|
||||
'421x927@3',
|
||||
'413x924@3',
|
||||
'480x1072@3',
|
||||
'393x877@2.75',
|
||||
'432x936@2.5',
|
||||
'480x853@3',
|
||||
'825x887@2.75',
|
||||
'393x916@2.75',
|
||||
'652x698@2.75',
|
||||
'451x1008@2.75',
|
||||
'432x965@2.5',
|
||||
'540x1200@2',
|
||||
'393x829@2.75',
|
||||
'393x785@2.75',
|
||||
'432x960@2.5',
|
||||
'360x802@2',
|
||||
'432x768@2.5',
|
||||
'983x1376@1.75',
|
||||
'800x1333@1.5',
|
||||
'800x1280@2',
|
||||
'810x1080@2.5',
|
||||
'393x895@2.75',
|
||||
'376x836@1.75',
|
||||
'1280x800@1',
|
||||
'533x853@1.5',
|
||||
'1536x864@1.25',
|
||||
'1688x1055@1.5',
|
||||
'371x824@1.94',
|
||||
'360x820@2',
|
||||
'480x854@1',
|
||||
'412x915@3',
|
||||
'428x926@2.75',
|
||||
'390x844@3',
|
||||
'428x926@3',
|
||||
'393x851@3',
|
||||
'1440x960@2',
|
||||
'1280x800@2',
|
||||
'411x960@4',
|
||||
'360x840@3',
|
||||
'412x823@3.5',
|
||||
'540x960@4',
|
||||
'360x720@3',
|
||||
'320x569@1.5',
|
||||
'360x640@1.5',
|
||||
'960x600@2',
|
||||
'480x512@1',
|
||||
'412x891@2.625',
|
||||
'360x780@2',
|
||||
'412x915@3.5',
|
||||
'360x780@3.5',
|
||||
'393x851@1.875',
|
||||
'360x760@3',
|
||||
'360x780@3',
|
||||
'360x689@4',
|
||||
'360x680@3',
|
||||
'360x677@3',
|
||||
'360x640@2.5',
|
||||
'240x400@1',
|
||||
'1024x600@1',
|
||||
'1080x2640@2.625',
|
||||
'1080x2400@2.75',
|
||||
'876x2142@2.75',
|
||||
'876x2142@3.5',
|
||||
'1080x2400@2.625',
|
||||
'1080x2460@2.625',
|
||||
'1080x2400@2.5',
|
||||
'1080x2340@2.625',
|
||||
'720x1600@1.75',
|
||||
'720x1600@1.8125',
|
||||
'720x1600@2',
|
||||
'1080x2460@2.75',
|
||||
'1080x2520@2.75',
|
||||
'1080x2300@2.75',
|
||||
'720x1600@2.125',
|
||||
'1080x2340@2.75',
|
||||
'1080x2520@3',
|
||||
'1080x2160@2.75',
|
||||
'1440x2560@4',
|
||||
'1080x1920@3',
|
||||
'1200x2000@2',
|
||||
'360x792@4',
|
||||
'405x880@3',
|
||||
'360x804@4',
|
||||
'360x804@3',
|
||||
'411x891@3.5',
|
||||
'756x813@3',
|
||||
'424x933@3',
|
||||
'860x1204@2',
|
||||
'489×688@2.75',
|
||||
'464×650@2.75',
|
||||
'2560×1600@2',
|
||||
'2944×1840@2',
|
||||
'2000×1200@2',
|
||||
'2160×1350@2',
|
||||
'1340×800@1.5',
|
||||
'3000×1876@2.5',
|
||||
'1920×1080',
|
||||
'1280×800',
|
||||
'1560×1040',
|
||||
'1536x864',
|
||||
'1536x960',
|
||||
'2560x1600',
|
||||
'1920x1080',
|
||||
'1920x1200',
|
||||
'1440×960',
|
||||
'1920×1200',
|
||||
'1536×864',
|
||||
'1366x768',
|
||||
'2080x1387',
|
||||
'2080x1333',
|
||||
'2520x1680',
|
||||
'1280×720',
|
||||
'1366×768',
|
||||
'1600×900',
|
||||
'1024×600',
|
||||
'768×512',
|
||||
'1620×1080',
|
||||
'1500×1000',
|
||||
'1200×800',
|
||||
'1664×1109',
|
||||
'1504×1003',
|
||||
'1229×819',
|
||||
'2250×1500',
|
||||
'1440x960',
|
||||
'1280x853',
|
||||
'1368x912',
|
||||
'2880x1800',
|
||||
'2160x1350',
|
||||
'3840x2400',
|
||||
'3840×2160',
|
||||
'2560×1440',
|
||||
'3440×1440',
|
||||
'5120×1440',
|
||||
'360×640',
|
||||
'2560×1600',
|
||||
'2560x1440',
|
||||
'5120×2880',
|
||||
'3840x2160',
|
||||
'3440x1440',
|
||||
'3072x1728',
|
||||
'5120x2160',
|
||||
'3413x1440',
|
||||
'2304×1440',
|
||||
'3840x2560',
|
||||
'4096x2160',
|
||||
'7680x4320',
|
||||
'1280×832',
|
||||
'1440×932',
|
||||
'1512×982',
|
||||
'1728×1117',
|
||||
'1440×900',
|
||||
'2240×1260',
|
||||
'224x184@2',
|
||||
'197x162@2',
|
||||
'180x180@2',
|
||||
'227x227@2',
|
||||
'160x160@2',
|
||||
];
|
||||
Executable
+125
@@ -0,0 +1,125 @@
|
||||
|
||||
# Pull requests
|
||||
|
||||
This project does continuous integration with [Travis](https://travis-ci.org/WhichBrowser/Parser-PHP/) and [Coveralls](https://coveralls.io/github/WhichBrowser/Parser-PHP). This means that every pull request must have the proper PSR-2 code standards and working unit tests. Please make sure your pull request passes all tests before submitting it.
|
||||
|
||||
To test your coding style run:
|
||||
|
||||
```
|
||||
vendor/bin/phpcs --standard=PSR1,PSR2 src/
|
||||
```
|
||||
|
||||
Then try the PHPunit unit tests:
|
||||
|
||||
```
|
||||
vendor/bin/phpunit
|
||||
```
|
||||
|
||||
And finally to test the WhichBrowser analyser:
|
||||
|
||||
```
|
||||
php bin/runner.php check --show
|
||||
```
|
||||
|
||||
# Unit tests
|
||||
|
||||
This project uses both unit tests for the public API and it's own testing tool for testing if the analyser properly works.
|
||||
|
||||
If you contribute to the public API, please add revelant tests. The API currently has 100% code coverage and any PR should maintain this number. The tests can be found in the `tests/unit/Model/` directory and are checked using PHPunit. This should be fairly simple.
|
||||
|
||||
To run the unit tests:
|
||||
|
||||
```
|
||||
vendor/bin/phpunit
|
||||
```
|
||||
|
||||
The data for the analyser can be found in the `tests/data/` directories. These are Yaml files containing an entry for every single test that is executed. Currently these directories contain 5000 different tests resulting in almost 100% code coverage. Every entries contains a number of keys, which represent the different parameters of the Parser object and an extra key which contains the result. If you add a new test, you should not provide the result yourself, but instead just provide the parameters and let the testing framework generate the result.
|
||||
|
||||
A very simple test entry looks like this:
|
||||
|
||||
```
|
||||
-
|
||||
headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox)'
|
||||
|
||||
```
|
||||
|
||||
Once the results if generated by it will look like this:
|
||||
|
||||
```
|
||||
-
|
||||
headers: 'User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox)'
|
||||
result: { browser: { name: 'Internet Explorer', version: '9.0' }, engine: { name: Trident, version: '5.0' }, device: { type: gaming, subtype: console, manufacturer: Microsoft, model: 'Xbox 360' } }
|
||||
```
|
||||
|
||||
To run the tests:
|
||||
|
||||
```
|
||||
php bin/runner.php check --show
|
||||
```
|
||||
|
||||
And to rebase the tests to generate the new results:
|
||||
|
||||
```
|
||||
php bin/runner.php rebase
|
||||
```
|
||||
|
||||
# Data files
|
||||
|
||||
A large part of the device model information is maintained in the data files. You can find these files in the `data/` directory. The files are little more than just arrays with the model number as key and another array a the value for each entry. The value contains a manufacturer, a model name and optionally the device type. If no device type is provided we assume it is a mobile phone. The device types that you are allowed to use are defined in the `src/Contstants/DeviceType.php` file.
|
||||
|
||||
```
|
||||
DeviceModels::$ANDROID_MODELS = [
|
||||
'LG-L30L' => [ 'LG', 'F70' ]
|
||||
];
|
||||
```
|
||||
|
||||
In the example above, the model number is `LG-L30L`, the manufacturer is LG and the model name is F70. And because no device type is provided, it is a mobile phone.
|
||||
|
||||
Things can get a bit more complicated, because the key of the array can also be a regular expression. To mark this, the final character of the key must be an exclamation mark.
|
||||
|
||||
```
|
||||
DeviceModels::$ANDROID_MODELS = [
|
||||
'LG-H8(10|11|12|15|18|19)!' => [ 'LG', 'G4' ]
|
||||
];
|
||||
```
|
||||
|
||||
Because the G4 uses multiple model numbers, like LG-H810, LG-H811, LG-H812 and so on, we do not want to include a seperate line for every single permutation. So we match all different model numbers with just a single regular expression.
|
||||
|
||||
The actual regular expression that is executed will look like this: `/^LG-H8(10|11|12|15|18|19)/iu`.
|
||||
|
||||
As an optimalisation it is also possible to use subsets. One regular expression will be tested to see if the whole subset must be skipped or looked at. A subset is marked by two exclamation marks.
|
||||
|
||||
```
|
||||
DeviceModels::$ANDROID_MODELS = [
|
||||
'LG-F[0-9]{3,3}!!' => [
|
||||
'LG-F320!' => [ 'LG', 'G2' ],
|
||||
'LG-F340!' => [ 'LG', 'G Flex' ]
|
||||
]
|
||||
];
|
||||
```
|
||||
|
||||
And finally, it is also possible to use backreferences to match multiple models at the same time:
|
||||
|
||||
```
|
||||
DeviceModels::$ANDROID_MODELS = [
|
||||
'Aspire ([0-9]{4,4}[A-Z]?)!' => [ 'Acer', 'Aspire $1', DeviceType::DESKTOP ]
|
||||
];
|
||||
```
|
||||
|
||||
This will both match the "Aspire 5750G", the "Aspire 4738G" and many more similar models.
|
||||
|
||||
|
||||
On more thing you need to be aware of, all of the keys are not tested against the raw value extracted from the useragent string, but instead is pre-processed. The code for this can be found in the `DeviceModels::cleanup()` function in the `src/Data/DeviceModels.php` file.
|
||||
|
||||
Indices
|
||||
-------
|
||||
|
||||
In order to reduce the time needed for model lookups, WhichBrowser uses an index. These files are located in the `data/indices/` directory and are automatically generated by the `update-indices.php` script. This script will evaluate every single regular expression and will try to create a key for every single possible value that matches the regular expression. If the regular expression is too complicated or has too many possible values it will place it in a secondary list of *difficult* regular expressions.
|
||||
|
||||
After making a change to the data files you **need** to regenerate the indices, otherwise the new device model will not be picked up by WhichBrowser.
|
||||
|
||||
To update the indices of all relevant data files:
|
||||
|
||||
```
|
||||
php bin/update-indices.php --all
|
||||
```
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
Copyright (c) 2010-2017 Niels Leenheer
|
||||
|
||||
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.
|
||||
Executable
+521
@@ -0,0 +1,521 @@
|
||||
<img src="https://api.whichbrowser.net/whichbrowser.svg" width="400">
|
||||
|
||||
This is an extremely complicated and almost completely useless browser sniffing library. Useless because you shouldn't use browser sniffing. So stop right now and go read something about feature detecting instead. I'm serious. Go away. You'll thank me later.
|
||||
|
||||
|
||||
WhichBrowser/Parser-PHP
|
||||
=======================
|
||||
|
||||
The PHP version of WhichBrowser for use on a server. Fully compatible with PHP 7.0 or higher, including PHP 8.
|
||||
|
||||

|
||||
[](https://coveralls.io/github/WhichBrowser/Parser-PHP?branch=master)
|
||||
[](https://packagist.org/packages/whichbrowser/parser)
|
||||
[](https://packagist.org/packages/whichbrowser/parser)
|
||||
|
||||
[](https://twitter.com/whichbrowserlib)
|
||||
|
||||
Also available:
|
||||
|
||||
- [WhichBrowser/Parser-JavaScript](https://github.com/WhichBrowser/Parser-JavaScript)<br>
|
||||
A JavaScript version of WhichBrowser for use with Node.js on the server
|
||||
|
||||
- [WhichBrowser/Server](https://github.com/WhichBrowser/Server)<br>
|
||||
A server written in PHP that provides a JavaScript API for use in the browser
|
||||
|
||||
---
|
||||
|
||||
|
||||
About WhichBrowser
|
||||
------------------
|
||||
|
||||
**But why *almost completely useless* and not completely useless?**
|
||||
Well, there is always an exception to the rule. There are valid reasons to do browser sniffing: to improve the user experience or to gather intelligence about which browsers are used on your website. My website is html5test.com and I wanted to know which score belongs to which browser. And to do that you need a browser sniffing library.
|
||||
|
||||
**Why is it extremely complicated?**
|
||||
Because everybody lies. Seriously, there is not a single browser that is completely truthful. Almost all browsers say they are Netscape 5 and almost all WebKit browsers say they are based on Gecko. Even Internet Explorer 11 now no longer claims to be IE at all, but instead an unnamed browser that is like Gecko. And it gets worse. That is why it is complicated.
|
||||
|
||||
**What kind of information does it give?**
|
||||
You get a nice object which has information about the browser, rendering engine, os and device. It gives you names and versions and even device manufacturer and model. And WhichBrowser is pretty tenacious. It gives you info that others don't. For example:
|
||||
|
||||
JUC (Linux; U; 2.3.6; zh-cn; GT-I8150; 480*800) UCWEB8.7.4.225/145/800
|
||||
UC Browser 8.7 on a Samsung Galaxy W running Android 2.3.6
|
||||
|
||||
Android is never mentioned
|
||||
|
||||
Mozilla/5.0 (Series40; Nokia501/10.0.2; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.0.0.0.73
|
||||
Nokia Xpress 3.0.0 on a Nokia Asha 501 running Nokia Asha Platform
|
||||
|
||||
Despite the useragent header claiming to be a Series40 device, we know it's actually running the Asha Platform and we also know that OviBrowser has been renamed to Nokia Xpress.
|
||||
|
||||
Opera/9.80 (X11; Linux zvav; U; zh) Presto/2.8.119 Version/11.10
|
||||
Opera Mini on a Nokia 5230 running Series60 5.0
|
||||
|
||||
The useragent header looks like Opera 11.10 on Linux, but we know it's Opera Mini. We can even figure out the real operating system and device model from other headers.
|
||||
|
||||
|
||||
|
||||
Requirements
|
||||
-----------------
|
||||
|
||||
WhichBrowser requires with PHP 7.0 or higher and supports PHP 8. WhichBrowser is compatible with the PSR-4 autoloading standard and follows PSR-1 and PSR-2 coding style.
|
||||
|
||||
|
||||
How to install it
|
||||
-----------------
|
||||
|
||||
You can install WhichBrowser by using Composer - the standard package manager for PHP. The package is called `whichbrowser/parser`.
|
||||
|
||||
composer require whichbrowser/parser
|
||||
|
||||
You can easily update WhichBrowser by running a simple command.
|
||||
|
||||
composer update whichbrowser/parser
|
||||
|
||||
You should run this command as often as possible. You might even want to consider setting up a cron job for this purpose.
|
||||
|
||||
|
||||
|
||||
|
||||
How to use it
|
||||
-------------
|
||||
|
||||
The first step require the Composer autoloader:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
```
|
||||
|
||||
The second step is to create a new `WhichBrowser\Parser` object. This object will contain all the information the library could find about the browser. The object has a required parameter, either the headers send by the browser, or a useragent string. Using the headers is preferable, because it will allow a better detection, but if you have just the useragent string, this will also work.
|
||||
|
||||
For example:
|
||||
|
||||
```php
|
||||
$result = new WhichBrowser\Parser(getallheaders());
|
||||
```
|
||||
|
||||
or:
|
||||
|
||||
```php
|
||||
$result = new WhichBrowser\Parser($_SERVER['HTTP_USER_AGENT']);
|
||||
```
|
||||
|
||||
|
||||
The variable `$result` now contains an object which you can query for information. There are various ways to access the information.
|
||||
|
||||
|
||||
First of all, you can call to `toString()` function to get a human readable identification:
|
||||
|
||||
```php
|
||||
"You are using " . $result->toString();
|
||||
// You are using Chrome 27 on OS X Mountain Lion 10.8
|
||||
```
|
||||
|
||||
Another possiblity is to query the object:
|
||||
|
||||
```php
|
||||
$result->isType('desktop');
|
||||
// true
|
||||
|
||||
$result->isType('mobile', 'tablet', 'media', 'gaming:portable');
|
||||
// false
|
||||
|
||||
$result->isBrowser('Maxthon', '<', '4.0.5');
|
||||
// false
|
||||
|
||||
$result->isOs('iOS', '>=', '8');
|
||||
// false
|
||||
|
||||
$result->isOs('OS X');
|
||||
// true
|
||||
|
||||
$result->isEngine('Blink');
|
||||
// true
|
||||
```
|
||||
|
||||
You can also access these properties directly:
|
||||
|
||||
```php
|
||||
$result->browser->toString();
|
||||
// Chrome 27
|
||||
|
||||
$result->engine->toString();
|
||||
// Blink
|
||||
|
||||
$result->os->toString();
|
||||
// OS X Mountain Lion 10.8
|
||||
```
|
||||
|
||||
Or access parts of these properties directly:
|
||||
|
||||
```php
|
||||
$result->browser->name;
|
||||
// Chrome
|
||||
|
||||
$result->browser->name . ' ' . $result->browser->version->toString();
|
||||
// Chrome 27
|
||||
|
||||
$result->browser->version->value;
|
||||
// 27.0.1453.110
|
||||
|
||||
$result->engine->name;
|
||||
// Blink
|
||||
```
|
||||
|
||||
Finally you can also query versions directly:
|
||||
|
||||
```php
|
||||
$result->browser->version->is('>', 26);
|
||||
// true
|
||||
|
||||
$result->os->version->is('<', '10.7.4');
|
||||
// false
|
||||
```
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
It is possible to set additional options by passing an array as the second parameter when creating the `Parser` object.
|
||||
|
||||
### Disabling detection of bots
|
||||
|
||||
In some cases you may want to disable the detection of bots. This allows the bot the deliberately fool WhichBrowser, so you can pick up the identity of useragent what the bot tries to mimic. This is especially handy when you want to use WhichBrowser to switch between different variants of your website and want to make sure crawlers see the right variant of the website. For example, a bot that mimics a mobile device will see the mobile variant of you site.
|
||||
|
||||
```php
|
||||
$result = new WhichBrowser\Parser(getallheaders(), [ 'detectBots' => false ]);
|
||||
```
|
||||
|
||||
Enable result caching
|
||||
---------------------
|
||||
|
||||
WhichBrowser supports PSR-6 compatible cache adapters for caching results between requests. Using a cache is especially useful if you use WhichBrowser on every page of your website and a user visits multiple pages. During the first visit the headers will be parsed and the result will be cached. Upon further visits, the cached results will be used, which is much faster than having to parse the headers again and again.
|
||||
|
||||
There are adapters available for other types of caches, such as APC, Doctrine, Memcached, MongoDB, Redis and many more. The configuration of these adapters all differ from each other, but once configured, all you have to do is pass it as an option when creating the `Parser` object, or use the `setCache()` function to set it afterwards. WhichBrowser has been tested to work with the adapters provided by [PHP Cache](http://php-cache.readthedocs.org/en/latest/). For a list of other packages that provide adapters see [Packagist](https://packagist.org/providers/psr/cache-implementation).
|
||||
|
||||
For example, if you want to enable a memcached based cache you need to install an extra composer package:
|
||||
|
||||
composer require cache/memcached-adapter
|
||||
|
||||
And change the call to WhichBrowser/Parser as follows:
|
||||
|
||||
```php
|
||||
$client = new \Memcached();
|
||||
$client->addServer('localhost', 11211);
|
||||
|
||||
$pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client);
|
||||
|
||||
$result = new WhichBrowser\Parser(getallheaders(), [ 'cache' => $pool ]);
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```php
|
||||
$client = new \Memcached();
|
||||
$client->addServer('localhost', 11211);
|
||||
|
||||
$pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client);
|
||||
|
||||
$result = new WhichBrowser\Parser();
|
||||
$result->setCache($pool);
|
||||
$result->analyse(getallheaders());
|
||||
```
|
||||
|
||||
You can also specify after how many seconds a cached result should be discarded. The default value is 900 seconds or 15 minutes. If you think WhichBrowser uses too much memory for caching, you should lower this value. You can do this by setting the `cacheExpires` option or passing it as a second parameter to the `setCache()` function.
|
||||
|
||||
|
||||
API reference
|
||||
-------------
|
||||
|
||||
### The Parser object
|
||||
|
||||
After a new `WhichBrowser\Parser` object is created, it contains a number of properties and functions. All of these properties are guaranteed to be present.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `browser`
|
||||
an object that contains information about the browser itself
|
||||
* `engine`
|
||||
an object that contains information about the rendering engine
|
||||
* `os`
|
||||
an object that contains information about the operating system
|
||||
* `device`
|
||||
an object that contains information about the device
|
||||
|
||||
**Functions:**
|
||||
|
||||
`getType()`
|
||||
Returns the `type` and `subtype` property of the `device` object. If a subtype is present it is concatenated to the type and seperated by a semicolor, for example: `mobile:smart` or `gaming:portable`. If the subtype is not applicable, it just return the type, for example: `desktop` or `ereader`.
|
||||
|
||||
`isType($type [,$type [,$type [,$type]]])`
|
||||
If a single argument is used, the function returns `true` if the argument matches the `type` propery of `device` object. The argument can optionally also provide a subtype by concatenating it to the type and seperating it with a semicolon. It can use multiple arguments in which case the function returns `true` if one of the arguments matches. If none of the arguments matches, it returns `false`
|
||||
|
||||
`isMobile()`
|
||||
Return `true` if the browser is a mobile device, like a phone, tablet, ereader, camera, portable media player, watch or portable gaming console. Otherwise it returns `false`.
|
||||
|
||||
`isBrowser($name [, $comparison, $version])`
|
||||
Is used to query the `name` and `version` property of the `browser` object. The funcion can contain a single argument to a simple comparison based on `name`, or three arguments to compare both `name` and `version`. The first argument always contains the name of the browser. The second arguments is a string that can container either `<`, `<=`, `=`, `=>` or `>`. The third is an integer, float or string that contains the version. You can use versions like `10`, `10.7` or `'10.7.4'`. For more information about how version comparisons are performed, please see the `is()` function of the `Version` object.
|
||||
|
||||
`isEngine($name [, $comparison, $version])`
|
||||
Is used to query the `name` and `version` property of the `engine` object. This function works in exactly the same way as `isBrowser`.
|
||||
|
||||
`isOs($name [, $comparison, $version])`
|
||||
Is used to query the `name` and `version` property of the `os` object. This function works in exactly the same way as `isBrowser`.
|
||||
|
||||
`isDetected()`
|
||||
Is there actually some browser detected, or did we fail to detect anything?
|
||||
|
||||
`toString()`
|
||||
Get a human readable representation of the detected browser, including operating system and device information.
|
||||
|
||||
|
||||
### The browser object
|
||||
|
||||
An object of the `WhichBrowser\Model\Browser` class is used for the `browser` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `name`
|
||||
a string containing the name of the browser
|
||||
* `alias`
|
||||
a string containing an alternative name of the browser
|
||||
* `version`
|
||||
a version object containing information about the version of the browser
|
||||
* `stock`
|
||||
a boolean, true if the browser is the default browser of the operating system, false otherwise
|
||||
* `channel`
|
||||
a string containing the distribution channel, ie. 'Nightly' or 'Next'.
|
||||
* `mode`
|
||||
a string that can contain the operating mode of the browser, ie. 'proxy'.
|
||||
* `hidden`
|
||||
a boolean that is true if the browser does not have a name and is the default of the operating system.
|
||||
* `family`
|
||||
an object that contains information about to which family this browser belongs
|
||||
* `using`
|
||||
an object that contains information about to which kind of webview this browser uses
|
||||
|
||||
**Functions:**
|
||||
|
||||
`isFamily($name)`
|
||||
Does the family of this browser have this name, or does the browser itself have this name.
|
||||
|
||||
`isUsing($name)`
|
||||
Is the browser using a webview using with the provided name.
|
||||
|
||||
`getName()`
|
||||
Get the name of the browser
|
||||
|
||||
`getVersion()`
|
||||
Get the version of the browser
|
||||
|
||||
`toString()`
|
||||
Get a human readable representation of the detected browser
|
||||
|
||||
|
||||
### The engine object
|
||||
|
||||
An object of the `WhichBrowser\Model\Engine` class is used for the `engine` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `name`
|
||||
a string containing the name of the rendering engine
|
||||
* `version`
|
||||
a version object containing information about the version of the rendering engine
|
||||
|
||||
**Functions:**
|
||||
|
||||
`getName()`
|
||||
Get the name of the rendering engine
|
||||
|
||||
`getVersion()`
|
||||
Get the version of the rendering engine
|
||||
|
||||
`toString()`
|
||||
Get a human readable representation of the detected rendering engine
|
||||
|
||||
|
||||
### The os object
|
||||
|
||||
An object of the `WhichBrowser\Model\Os` class is used for the `os` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `name`
|
||||
a string containing the name of the operating system
|
||||
* `version`
|
||||
a version object containing information about the version of the operating system
|
||||
* `family`
|
||||
an object that contains information about to which family this operating system belongs
|
||||
|
||||
**Functions:**
|
||||
|
||||
`isFamily($name)`
|
||||
Does the family of this operating system have this name, or does the operating system itself have this name.
|
||||
|
||||
`getName()`
|
||||
Get the name of the operating system
|
||||
|
||||
`getVersion()`
|
||||
Get the version of the operating system
|
||||
|
||||
`toString()`
|
||||
Get a human readable representation of the detected operating system
|
||||
|
||||
|
||||
### The device object
|
||||
|
||||
An object of the `WhichBrowser\Model\Device` class is used for the `device` property of the main `WhichBrowser\Parser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `type`
|
||||
a string containing the type of the browser.
|
||||
* `subtype`
|
||||
a string containing the subtype of the browser.
|
||||
* `identified`
|
||||
a boolean that is true if the device has been positively identified.
|
||||
* `manufacturer`
|
||||
a string containing the manufacturer of the device, ie. 'Apple' or 'Samsung'.
|
||||
* `model`
|
||||
as string containing the model of the device, ie. 'iPhone' or 'Galaxy S4'.
|
||||
|
||||
The `type` property can contain any value from the following list:
|
||||
|
||||
* desktop
|
||||
* mobile
|
||||
* pda
|
||||
* dect
|
||||
* tablet
|
||||
* gaming
|
||||
* ereader
|
||||
* media
|
||||
* headset
|
||||
* watch
|
||||
* emulator
|
||||
* television
|
||||
* monitor
|
||||
* camera
|
||||
* printer
|
||||
* signage
|
||||
* whiteboard
|
||||
* devboard
|
||||
* inflight
|
||||
* appliance
|
||||
* gps
|
||||
* car
|
||||
* pos
|
||||
* bot
|
||||
* projector
|
||||
|
||||
If the `type` is "mobile", the `subtype` property can contain any value from the following list:
|
||||
|
||||
* feature
|
||||
* smart
|
||||
|
||||
If the `type` is "gaming", the `subtype` property can contain any value from the following list:
|
||||
|
||||
* console
|
||||
* portable
|
||||
|
||||
**Functions:**
|
||||
|
||||
`getManufacturer()`
|
||||
Get the name of the manufacturer
|
||||
|
||||
`getModel()`
|
||||
Get the name of the model
|
||||
|
||||
`toString()`
|
||||
Get a human readable representation of the detected device
|
||||
|
||||
|
||||
### The family object
|
||||
|
||||
An object of the `WhichBrowser\Model\Family` class is used for the `family` property of the `WhichBrowser\Model\Browser` and `WhichBrowser\Model\Os` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `name`
|
||||
a string containing the name of the family
|
||||
* `version`
|
||||
a version object containing information about the version of the family
|
||||
|
||||
**Functions:**
|
||||
|
||||
`getName()`
|
||||
Get the name of the family
|
||||
|
||||
`getVersion()`
|
||||
Get the version of the family
|
||||
|
||||
`toString()`
|
||||
Get a human readable representation of the family
|
||||
|
||||
|
||||
### The using object
|
||||
|
||||
An object of the `WhichBrowser\Model\Using` class is used for the `using` property of the `WhichBrowser\Model\Browser` object and contains a number of properties. If a property is not applicable in this situation it will be null or undefined.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `name`
|
||||
a string containing the name of the webview
|
||||
* `version`
|
||||
a version object containing information about the version of the webview
|
||||
|
||||
**Functions:**
|
||||
|
||||
`getName()`
|
||||
Get the name of the webview
|
||||
|
||||
`getVersion()`
|
||||
Get the version of the webview
|
||||
|
||||
`toString()`
|
||||
Get a human readable representation of the webview
|
||||
|
||||
|
||||
### The version object
|
||||
|
||||
An object of the `WhichBrowser\Model\Version` class is used for the `version` property of the `browser`, `engine` and `os` object and contains a number of properties and functions. If a property is not applicable in this situation it will be null or undefined.
|
||||
|
||||
**Properties:**
|
||||
|
||||
* `value`
|
||||
a string containing the original version number.
|
||||
* `alias`
|
||||
a string containing an alias for the version number, ie. 'XP' for Windows '5.1'.
|
||||
* `nickname`
|
||||
a string containing a nickname for the version number, ie. 'Mojave' for OS X '10.14'.
|
||||
* `details`
|
||||
an integer containing the number of digits of the version number that should be printed.
|
||||
|
||||
**Functions:**
|
||||
|
||||
`is($version)` or `is($comparison, $version)`
|
||||
Using this function it is easy to compare a version to another version. If you specify only one argument, this function will return if the versions are the same. You can also specify two arguments, in that case the first argument contains the comparison operator, such as `<`, `<=`, `=`, `=>` or `>`. The second argument is the version you want to compare it to. You can use versions like `10`, `10.7` or `'10.7.4'`, but be aware that `10` is not the same as `10.0`. For example if our OS version is `10.7.4`:
|
||||
|
||||
```php
|
||||
$result->os->version->is('10.7.4');
|
||||
// true
|
||||
|
||||
$result->os->version->is('10.7');
|
||||
// true
|
||||
|
||||
$result->os->version->is('10');
|
||||
// true
|
||||
|
||||
$result->os->version->is('10.0');
|
||||
// false
|
||||
|
||||
$result->os->version->is('>', '10');
|
||||
// false
|
||||
|
||||
$result->os->version->is('>', '10.7');
|
||||
// false
|
||||
|
||||
$result->os->version->is('>', '10.7.3');
|
||||
// true
|
||||
```
|
||||
Executable
+10
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
$standaloneAutoloader = __DIR__ . '/../vendor/autoload.php';
|
||||
$packageAutoloader = __DIR__ . '/../../../autoload.php';
|
||||
|
||||
if (file_exists($packageAutoloader)) {
|
||||
require_once $packageAutoloader;
|
||||
} else {
|
||||
require_once $standaloneAutoloader;
|
||||
}
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__ . '/bootstrap.php';
|
||||
|
||||
use WhichBrowser\Parser;
|
||||
|
||||
$command = 'exec';
|
||||
$options = [];
|
||||
$payload = [];
|
||||
|
||||
array_shift($argv);
|
||||
|
||||
if (count($argv)) {
|
||||
foreach ($argv as $argument) {
|
||||
if (in_array($argument, [ 'exec' ])) {
|
||||
$command = $argument;
|
||||
} elseif (substr($argument, 0, 2) == '--') {
|
||||
$options[] = substr($argument, 2);
|
||||
} else {
|
||||
$payload[] = $argument;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$payload = implode(' ', $payload);
|
||||
|
||||
|
||||
if ($command == 'exec') {
|
||||
if ($payload == '') {
|
||||
$payload = file_get_contents('php://stdin');
|
||||
}
|
||||
|
||||
if ($payload != '') {
|
||||
echo "\n\033[0;32mInput:\033[0;0m\n" . trim($payload) . "\n";
|
||||
|
||||
$result = new Parser(trim($payload));
|
||||
echo "\n\033[0;32mHuman readable:\033[0;0m\n" . $result->toString() . "\n";
|
||||
echo "\n\033[0;32mData:\033[0;0m\n";
|
||||
echo json_encode($result, JSON_PRETTY_PRINT);
|
||||
echo "\n\n";
|
||||
}
|
||||
}
|
||||
Executable
+103
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__ . '/bootstrap.php';
|
||||
|
||||
use WhichBrowser\Testrunner;
|
||||
use WhichBrowser\Tests;
|
||||
use SebastianBergmann\CodeCoverage\CodeCoverage;
|
||||
use SebastianBergmann\CodeCoverage\Report\Clover;
|
||||
|
||||
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
|
||||
// error was suppressed with the @-operator
|
||||
if (0 === error_reporting()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
|
||||
});
|
||||
|
||||
|
||||
|
||||
$all = false;
|
||||
$command = 'compare';
|
||||
$files = [];
|
||||
$options = [];
|
||||
|
||||
array_shift($argv);
|
||||
|
||||
if (count($argv)) {
|
||||
foreach ($argv as $argument) {
|
||||
if (in_array($argument, [ 'compare', 'check', 'rebase', 'list' ])) {
|
||||
$command = $argument;
|
||||
} elseif (substr($argument, 0, 2) == '--') {
|
||||
$options[] = substr($argument, 2);
|
||||
} else {
|
||||
if (fnmatch("*.yaml", $argument)) {
|
||||
$files[] = $argument;
|
||||
} else {
|
||||
$files = array_merge($files, Tests::getFromCategory($argument));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count($files) === 0) {
|
||||
$files = Tests::getAll();
|
||||
}
|
||||
|
||||
switch ($command) {
|
||||
case 'list':
|
||||
Testrunner::search($files);
|
||||
break;
|
||||
|
||||
case 'check':
|
||||
if (in_array('coverage', $options)) {
|
||||
$coverage = new CodeCoverage;
|
||||
$coverage->filter()->addDirectoryToWhitelist('src');
|
||||
$coverage->start('Testrunner');
|
||||
}
|
||||
|
||||
$result = Testrunner::compare($files, false);
|
||||
|
||||
if (in_array('coverage', $options)) {
|
||||
$coverage->stop();
|
||||
|
||||
$writer = new Clover;
|
||||
$writer->process($coverage, 'runner.xml');
|
||||
|
||||
echo "\nCoverage saved as runner.xml\n\n";
|
||||
}
|
||||
|
||||
if (!$result) {
|
||||
echo "\033[0;31mTestrunner failed, please fix or rebase before building or deploying!\033[0m\n\n";
|
||||
|
||||
if (in_array('show', $options)) {
|
||||
echo file_get_contents('runner.log') . "\n\n";
|
||||
echo "Done!\n\n";
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'compare':
|
||||
$result = Testrunner::compare($files, false);
|
||||
|
||||
if (!$result) {
|
||||
echo "\033[0;31mTestrunner failed, please look at runner.log for the details!\033[0m\n\n";
|
||||
|
||||
if (in_array('show', $options)) {
|
||||
echo file_get_contents('runner.log') . "\n\n";
|
||||
echo "Done!\n\n";
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'rebase':
|
||||
Testrunner::rebase($files, false);
|
||||
break;
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__ . '/bootstrap.php';
|
||||
|
||||
echo "Updating browser ids...\n";
|
||||
|
||||
$ids = json_decode(file_get_contents("https://api.whichbrowser.net/resources/browser-ids.json"));
|
||||
|
||||
$result = "";
|
||||
$result .= "<?php\n";
|
||||
$result .= "\n";
|
||||
$result .= "/* This file is automatically generated, do not edit manually! */\n";
|
||||
$result .= "\n";
|
||||
$result .= "namespace WhichBrowser\\Data;\n";
|
||||
$result .= "\n";
|
||||
$result .= "BrowserIds::\$ANDROID_BROWSERS = [\n";
|
||||
|
||||
foreach($ids as $key => $id) {
|
||||
$result .= " '" . addslashes(trim($id->browserId)) . "'" . str_repeat(" ", max(0, 100 - strlen($id->browserId)));
|
||||
$result .= "=> " . deviceString($id->browserName) . ",\n";
|
||||
}
|
||||
|
||||
$result .= "];\n";
|
||||
|
||||
file_put_contents(__DIR__ . '/../data/id-android.php', $result);
|
||||
|
||||
|
||||
function deviceString($s) {
|
||||
if (is_null($s) || $s == '') {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
return "'" . addslashes(trim($s)) . "'";
|
||||
}
|
||||
Executable
+58
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__ . '/bootstrap.php';
|
||||
include __DIR__ . '/../data/browsers-chrome.php';
|
||||
|
||||
echo "Updating chrome versions...\n";
|
||||
|
||||
$stable = [
|
||||
'desktop' => [],
|
||||
'mobile' => []
|
||||
];
|
||||
|
||||
|
||||
$omaha = explode("\n", file_get_contents("http://omahaproxy.appspot.com/history"));
|
||||
foreach ($omaha as $i => $line) {
|
||||
$items = explode(",", $line);
|
||||
|
||||
if ($items[0] == 'mac' && $items[1] == 'stable') {
|
||||
$stable['desktop'][] = implode('.', array_slice(explode('.', $items[2]), 0, 3));
|
||||
}
|
||||
|
||||
if ($items[0] == 'android' && $items[1] == 'stable') {
|
||||
$stable['mobile'][] = implode('.', array_slice(explode('.', $items[2]), 0, 3));
|
||||
}
|
||||
}
|
||||
|
||||
$stable['desktop'] = array_unique($stable['desktop']);
|
||||
$stable['mobile'] = array_unique($stable['mobile']);
|
||||
|
||||
sort($stable['desktop']);
|
||||
sort($stable['mobile']);
|
||||
|
||||
|
||||
foreach ($stable['desktop'] as $i => $version) {
|
||||
if (!isset(WhichBrowser\Data\Chrome::$DESKTOP[$version])) {
|
||||
WhichBrowser\Data\Chrome::$DESKTOP[$version] = 'stable';
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($stable['mobile'] as $i => $version) {
|
||||
if (!isset(WhichBrowser\Data\Chrome::$MOBILE[$version])) {
|
||||
WhichBrowser\Data\Chrome::$MOBILE[$version] = 'stable';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$result = "";
|
||||
$result .= "<?php\n\n";
|
||||
$result .= "namespace WhichBrowser\Data;\n\n";
|
||||
$result .= "Chrome::\$DESKTOP = [\n";
|
||||
foreach (WhichBrowser\Data\Chrome::$DESKTOP as $version => $channel) $result .= " '{$version}' => '{$channel}',\n";
|
||||
$result .= "];\n\n";
|
||||
$result .= "Chrome::\$MOBILE = [\n";
|
||||
foreach (WhichBrowser\Data\Chrome::$MOBILE as $version => $channel) $result .= " '{$version}' => '{$channel}',\n";
|
||||
$result .= "];\n";
|
||||
|
||||
|
||||
file_put_contents(__DIR__ . '/../data/browsers-chrome.php', $result);
|
||||
Executable
+199
@@ -0,0 +1,199 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__ . '/bootstrap.php';
|
||||
|
||||
use WhichBrowser\Data\DeviceModels;
|
||||
use ReverseRegex\Lexer;
|
||||
|
||||
$command = 'list';
|
||||
$types = [];
|
||||
$options = [];
|
||||
|
||||
array_shift($argv);
|
||||
|
||||
if (count($argv)) {
|
||||
foreach ($argv as $argument) {
|
||||
if (in_array($argument, [ 'list' ])) {
|
||||
$command = $argument;
|
||||
} elseif (substr($argument, 0, 2) == '--') {
|
||||
$options[] = substr($argument, 2);
|
||||
} else {
|
||||
$types[] = $argument;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (in_array('all', $options)) {
|
||||
$types = [
|
||||
'android', 'asha', 'bada', 'brew', 'feature', 'firefoxos',
|
||||
'kddi', 'palmos', 's30plus', 's40', 'symbian', 'tizen',
|
||||
'touchwiz', 'wm', 'wp'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
foreach ($types as $i => $type) {
|
||||
command($command, $type);
|
||||
}
|
||||
|
||||
|
||||
function command($command, $type) {
|
||||
switch($command) {
|
||||
case 'list':
|
||||
command_list($type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function command_list($type) {
|
||||
echo "Creating index for 'data/models-{$type}.php'...\n";
|
||||
|
||||
require_once __DIR__ . '/../data/models-' . $type . '.php';
|
||||
|
||||
$name = strtoupper($type) . '_MODELS';
|
||||
$list = DeviceModels::$$name;
|
||||
|
||||
$index = [];
|
||||
|
||||
foreach ($list as $key => $value) {
|
||||
|
||||
if (substr($key, -2) == '!!') {
|
||||
$keys = getKeysFromRegexp(substr($key, 0, -2));
|
||||
}
|
||||
elseif (substr($key, -1) == '!') {
|
||||
$keys = getKeysFromRegexp(substr($key, 0, -1));
|
||||
}
|
||||
else {
|
||||
$keys = [ substr(strtoupper($key), 0, 2) ];
|
||||
}
|
||||
|
||||
foreach ($keys as $k => $v) {
|
||||
if ($v == '**') {
|
||||
$v = '';
|
||||
}
|
||||
|
||||
if (!isset($index['@'.$v])) {
|
||||
$index['@'.$v] = [];
|
||||
}
|
||||
|
||||
$index['@'.$v][] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
ksort($index);
|
||||
|
||||
$file = "<" . "?php\n";
|
||||
$file .= "\n";
|
||||
$file .= "namespace WhichBrowser\\Data;\n";
|
||||
$file .= "\n";
|
||||
$file .= "DeviceModels::\$" . strtoupper($type) . "_INDEX = " . var_export($index, true) . ";\n";
|
||||
|
||||
file_put_contents(__DIR__ . '/../data/indices/models-' . $type . '.php', $file);
|
||||
}
|
||||
|
||||
function getKeysFromRegexp($regexp) {
|
||||
$lexer = new Lexer($regexp);
|
||||
$lexer->moveNext();
|
||||
|
||||
$keys = readKeysFromLexer($lexer);
|
||||
|
||||
return array_unique($keys);
|
||||
}
|
||||
|
||||
|
||||
function readKeysFromLexer($lexer) {
|
||||
$keys = [];
|
||||
|
||||
if ($lexer->isNextTokenAny([ Lexer::T_LITERAL_CHAR,Lexer::T_LITERAL_NUMERIC ])) {
|
||||
$current = strtoupper($lexer->lookahead['value']);
|
||||
|
||||
$lexer->moveNext();
|
||||
if ($lexer->isNextTokenAny([ Lexer::T_LITERAL_CHAR,Lexer::T_LITERAL_NUMERIC ])) {
|
||||
$keys[] = $current . strtoupper($lexer->lookahead['value']);
|
||||
}
|
||||
else {
|
||||
$keys[] = '**';
|
||||
}
|
||||
}
|
||||
|
||||
else if ($lexer->isNextToken(Lexer::T_GROUP_OPEN)) {
|
||||
$current = '';
|
||||
$active = true;
|
||||
|
||||
while ($lexer->moveNext()) {
|
||||
if ($lexer->isNextTokenAny([ Lexer::T_LITERAL_CHAR,Lexer::T_LITERAL_NUMERIC ])) {
|
||||
if ($active && strlen($current) < 2) {
|
||||
$current .= strtoupper($lexer->lookahead['value']);
|
||||
}
|
||||
}
|
||||
|
||||
else if ($lexer->isNextToken(Lexer::T_CHOICE_BAR)) {
|
||||
$keys[] = $current;
|
||||
$current = '';
|
||||
$active = true;
|
||||
}
|
||||
|
||||
else if ($lexer->isNextToken(Lexer::T_GROUP_OPEN)) {
|
||||
if ($lexer->moveNext()) {
|
||||
$more = readKeysFromLexer($lexer);
|
||||
|
||||
if (count($more)) {
|
||||
$keys = array_merge($keys, $more);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if ($lexer->isNextToken(Lexer::T_GROUP_CLOSE)) {
|
||||
if (strlen($current) == 2) {
|
||||
$keys[] = $current;
|
||||
} else {
|
||||
$keys[] = '**';
|
||||
}
|
||||
|
||||
$current = '';
|
||||
$active = true;
|
||||
break;
|
||||
}
|
||||
|
||||
else if ($lexer->isNextToken(Lexer::T_DOT)) {
|
||||
$keys[] = '**';
|
||||
$current = '';
|
||||
$active = false;
|
||||
break;
|
||||
}
|
||||
|
||||
else {
|
||||
$active = false;
|
||||
}
|
||||
}
|
||||
|
||||
while ($lexer->moveNext()) {
|
||||
if ($lexer->isNextToken(Lexer::T_QUANTIFIER_QUESTION)) {
|
||||
if ($lexer->moveNext()) {
|
||||
$more = readKeysFromLexer($lexer);
|
||||
|
||||
if (count($more)) {
|
||||
$keys = array_merge($keys, $more);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if ($lexer->isNextToken(Lexer::T_SET_OPEN)) {
|
||||
$keys[] = '**';
|
||||
}
|
||||
|
||||
else if ($lexer->isNextToken(Lexer::T_DOT)) {
|
||||
$keys[] = '**';
|
||||
}
|
||||
|
||||
return array_unique($keys);
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__ . '/bootstrap.php';
|
||||
|
||||
echo "Downloading...";
|
||||
|
||||
$profiles = json_decode(file_get_contents("https://api.whichbrowser.net/resources/profiles.json"));
|
||||
|
||||
$total = count($profiles);
|
||||
|
||||
$result = "";
|
||||
$result .= "<?php\n";
|
||||
$result .= "\n";
|
||||
$result .= "/* This file is automatically generated, do not edit manually! */\n";
|
||||
$result .= "\n";
|
||||
$result .= "namespace WhichBrowser\\Data;\n";
|
||||
$result .= "\n";
|
||||
$result .= "use WhichBrowser\\Constants\\DeviceType;\n";
|
||||
$result .= "\n";
|
||||
$result .= "DeviceProfiles::\$PROFILES = [\n";
|
||||
|
||||
foreach($profiles as $key => $profile) {
|
||||
$result .= " '" . addslashes(trim($profile->url)) . "'" . str_repeat(" ", max(0, 100 - strlen($profile->url)));
|
||||
$result .= "=> [ " . deviceString($profile->deviceManufacturer) . ", " . deviceString($profile->deviceModel);
|
||||
$result .= ", " . deviceString($profile->osName) . ", " . deviceType($profile->deviceType) . " ],\n";
|
||||
}
|
||||
|
||||
$result .= "];\n";
|
||||
|
||||
echo " and writing {$total} profiles...\n";
|
||||
file_put_contents(__DIR__ . '/../data/profiles.php', $result);
|
||||
|
||||
|
||||
function deviceString($s) {
|
||||
if (is_null($s) || $s == '') {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
return "'" . addslashes(trim($s)) . "'";
|
||||
}
|
||||
|
||||
function deviceType($type) {
|
||||
switch ($type) {
|
||||
case 'mobile': return 'DeviceType::MOBILE';
|
||||
case 'tablet': return 'DeviceType::TABLET';
|
||||
}
|
||||
}
|
||||
Executable
+118
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__ . '/bootstrap.php';
|
||||
|
||||
use WhichBrowser\Data\Applications;
|
||||
|
||||
$command = 'list';
|
||||
$types = [];
|
||||
$options = [];
|
||||
|
||||
array_shift($argv);
|
||||
|
||||
if (count($argv)) {
|
||||
foreach ($argv as $argument) {
|
||||
if (in_array($argument, [ 'list' ])) {
|
||||
$command = $argument;
|
||||
} elseif (substr($argument, 0, 2) == '--') {
|
||||
$options[] = substr($argument, 2);
|
||||
} else {
|
||||
$types[] = $argument;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (in_array('all', $options)) {
|
||||
$types = [
|
||||
'applications-bots',
|
||||
'applications-browsers',
|
||||
'applications-others'
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
foreach ($types as $i => $type) {
|
||||
command($command, $type);
|
||||
}
|
||||
|
||||
|
||||
function command($command, $type) {
|
||||
switch($command) {
|
||||
case 'list':
|
||||
command_list($type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function command_list($type) {
|
||||
echo "Creating regex for 'data/{$type}.php'...\n";
|
||||
|
||||
require_once __DIR__ . '/../data/' . $type . '.php';
|
||||
|
||||
if ($type == 'applications-bots') {
|
||||
$list = Applications::$BOTS;
|
||||
|
||||
$ids = [];
|
||||
|
||||
foreach ($list as $i => $bot) {
|
||||
$ids[] = $bot['id'];
|
||||
}
|
||||
|
||||
$ids = array_unique($ids);
|
||||
$regex = '/(' . implode('|', $ids) . ')/i';
|
||||
|
||||
$file = "<" . "?php\n";
|
||||
$file .= "\n";
|
||||
$file .= "namespace WhichBrowser\\Data;\n";
|
||||
$file .= "\n";
|
||||
$file .= "Applications::\$BOTS_REGEX = '" . $regex . "';\n";
|
||||
|
||||
file_put_contents(__DIR__ . '/../data/regexes/' . $type . '.php', $file);
|
||||
}
|
||||
|
||||
if ($type == 'applications-browsers') {
|
||||
$list = Applications::$BROWSERS;
|
||||
|
||||
$ids = [];
|
||||
|
||||
foreach ($list as $t => $l) {
|
||||
foreach ($l as $i => $item) {
|
||||
$ids[] = $item['id'];
|
||||
}
|
||||
}
|
||||
|
||||
$ids = array_unique($ids);
|
||||
$regex = '/(' . implode('|', $ids) . ')/i';
|
||||
|
||||
$file = "<" . "?php\n";
|
||||
$file .= "\n";
|
||||
$file .= "namespace WhichBrowser\\Data;\n";
|
||||
$file .= "\n";
|
||||
$file .= "Applications::\$BROWSERS_REGEX = '" . $regex . "';\n";
|
||||
|
||||
file_put_contents(__DIR__ . '/../data/regexes/' . $type . '.php', $file);
|
||||
}
|
||||
|
||||
if ($type == 'applications-others') {
|
||||
$list = Applications::$OTHERS;
|
||||
|
||||
$ids = [];
|
||||
|
||||
foreach ($list as $t => $l) {
|
||||
foreach ($l as $i => $item) {
|
||||
$ids[] = $item['id'];
|
||||
}
|
||||
}
|
||||
|
||||
$ids = array_unique($ids);
|
||||
$regex = '/(' . implode('|', $ids) . ')/i';
|
||||
|
||||
$file = "<" . "?php\n";
|
||||
$file .= "\n";
|
||||
$file .= "namespace WhichBrowser\\Data;\n";
|
||||
$file .= "\n";
|
||||
$file .= "Applications::\$OTHERS_REGEX = '" . $regex . "';\n";
|
||||
|
||||
file_put_contents(__DIR__ . '/../data/regexes/' . $type . '.php', $file);
|
||||
}
|
||||
}
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
spl_autoload_register(function ($class) {
|
||||
|
||||
// project-specific namespace prefix
|
||||
$prefix = 'WhichBrowser\\';
|
||||
|
||||
// base directory for the namespace prefix
|
||||
$base_dir = __DIR__ . '/src/';
|
||||
|
||||
// does the class use the namespace prefix?
|
||||
$len = strlen($prefix);
|
||||
if (strncmp($prefix, $class, $len) !== 0) {
|
||||
// no, move to the next registered autoloader
|
||||
return;
|
||||
}
|
||||
|
||||
// get the relative class name
|
||||
$relative_class = substr($class, $len);
|
||||
|
||||
// replace the namespace prefix with the base directory, replace namespace
|
||||
// separators with directory separators in the relative class name, append
|
||||
// with .php
|
||||
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
|
||||
|
||||
// if the file exists, require it
|
||||
if (file_exists($file)) {
|
||||
require $file;
|
||||
}
|
||||
});
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"name": "whichbrowser/parser",
|
||||
|
||||
"description": "Useragent sniffing library for PHP",
|
||||
"keywords": ["useragent","browser","sniffing", "ua"],
|
||||
"homepage": "http://whichbrowser.net",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Niels Leenheer",
|
||||
"email": "niels@leenheer.nl",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
|
||||
"require": {
|
||||
"php": ">=5.4.0",
|
||||
"psr/cache": "^1.0 || ^2.0 || ^3.0"
|
||||
},
|
||||
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"WhichBrowser\\": [ "src/" ]
|
||||
}
|
||||
},
|
||||
|
||||
"suggest": {
|
||||
"cache/array-adapter": "Allows testing of the caching functionality"
|
||||
},
|
||||
|
||||
"require-dev": {
|
||||
"symfony/yaml": "~3.4 || ~4.0",
|
||||
"phpunit/php-code-coverage": "^5.0 || ^7.0",
|
||||
"phpunit/phpunit": "^6.0 || ^8.0",
|
||||
"php-coveralls/php-coveralls": "^2.0",
|
||||
"icomefromthenet/reverse-regex" : "0.0.6.3",
|
||||
"squizlabs/php_codesniffer": "^3.5",
|
||||
"cache/array-adapter": "^1.1"
|
||||
},
|
||||
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"WhichBrowserTest\\": "tests/unit",
|
||||
"WhichBrowser\\": [ "tests/src/" ]
|
||||
},
|
||||
|
||||
"files": [ "tests/src/polyfills.php" ]
|
||||
}
|
||||
}
|
||||
+401
@@ -0,0 +1,401 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
Applications::$BOTS = [
|
||||
[ 'name' => '80legs', 'id' => '008', 'regexp' => '/(?:^|\s)008\/([0-9.]*)/u' ],
|
||||
[ 'name' => '360spider', 'id' => '360', 'regexp' => '/360Spider/u' ],
|
||||
[ 'name' => '360spider', 'id' => '360', 'regexp' => '/360spider-image/u' ],
|
||||
[ 'name' => 'A6 Indexer', 'id' => 'a6', 'regexp' => '/A6-Indexer(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Aboundex', 'id' => 'abound', 'regexp' => '/Aboundex\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Ad Muncher', 'id' => 'muncher', 'regexp' => '/Ad Muncher v([0-9.]*)/u' ],
|
||||
[ 'name' => 'Adaxas', 'id' => 'adaxas', 'regexp' => '/Adaxas Spider/u' ],
|
||||
[ 'name' => 'AddThis.com', 'id' => 'addthis', 'regexp' => '/AddThis.com/u' ],
|
||||
[ 'name' => 'ADmantX', 'id' => 'admantx', 'regexp' => '/ADmantX Platform Semantic Analyzer/u' ],
|
||||
[ 'name' => 'Adsbot', 'id' => 'adsbot', 'regexp' => '/Adsbot\/([0-9.]*)/u' ], // Not to be mixed up with Google Adsbot
|
||||
[ 'name' => 'Ahrefs Feeds Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\.Feeds v([0-9.]*)/u' ],
|
||||
[ 'name' => 'Ahrefs Site Audit Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsSiteAudit\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Ahrefs News Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\/([0-9.]*); News/u' ],
|
||||
[ 'name' => 'Ahrefs SA Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\/([0-9.]*); SA/u' ],
|
||||
[ 'name' => 'Ahrefs Bot', 'id' => 'ahrefs', 'regexp' => '/AhrefsBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Alexa', 'id' => 'archiver', 'regexp' => '/ia_archiver/u' ],
|
||||
[ 'name' => 'AltaVista', 'id' => 'altavista', 'regexp' => '/AltaVista Intranet V([0-9.]*)/u' ],
|
||||
[ 'name' => 'Analytics SEO', 'id' => 'curious', 'regexp' => '/Curious George - www.analyticsseo.com\/crawler/u' ],
|
||||
[ 'name' => 'Amazon CloudFront', 'id' => 'cloudfront', 'regexp' => '/Amazon CloudFront/u' ],
|
||||
[ 'name' => 'Amorank Spider', 'id' => 'amorank', 'regexp' => '/AmorankSpider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Apple Bot', 'id' => 'apple', 'regexp' => '/Applebot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Apple News Bot', 'id' => 'apple', 'regexp' => '/AppleNewsBot/u' ],
|
||||
[ 'name' => 'ArchiveBot', 'id' => 'archive', 'regexp' => '/ArchiveTeam ArchiveBot/u' ],
|
||||
[ 'name' => 'Archive.org', 'id' => 'archive', 'regexp' => '/archive.org_bot(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Archive.org', 'id' => 'archive', 'regexp' => '/special_archiver(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Ask Jeeves', 'id' => 'jeeves', 'regexp' => '/Ask Jeeves\/Teoma/u' ],
|
||||
[ 'name' => 'AstraSpider', 'id' => 'astra', 'regexp' => '/AstraSpider V([0-9.]*)/u' ],
|
||||
[ 'name' => 'Backlink-Check', 'id' => 'backlink', 'regexp' => '/Backlink-Ceck.de/u' ],
|
||||
[ 'name' => 'BacklinkCrawler', 'id' => 'backlink', 'regexp' => '/BacklinkCrawler/u' ],
|
||||
[ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/Baiduspider[\+ ]\([\+ ]/u' ],
|
||||
[ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/Baiduspider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/Baiduspider/u' ],
|
||||
[ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/baiduspider-mobile-gate/u' ],
|
||||
[ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/\+http:\/\/www.baidu.com\/search\/spider.html/u' ],
|
||||
[ 'name' => 'Baiduspider', 'id' => 'baidu', 'regexp' => '/BaiduImagespider/u' ],
|
||||
[ 'name' => 'Barkrowler', 'id' => 'barkrowler', 'regexp' => '/Barkrowler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'BazQux', 'id' => 'bazqux', 'regexp' => '/BazQux\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'bingbot', 'regexp' => '/bingbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/msnbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/msnbot-UDiscovery\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/msnbot-media\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/MsnBot-Media \/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/msnbot-NewsBlogs\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'msnbot', 'regexp' => '/MSNBOT_Mobile/u' ],
|
||||
[ 'name' => 'Bing', 'id' => 'msmobot', 'regexp' => '/MSMOBOT/u' ],
|
||||
[ 'name' => 'Bing Preview', 'id' => 'bing', 'regexp' => '/BingPreview\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Blex Bot', 'id' => 'blex', 'regexp' => '/BLEXBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Blex Test Bot', 'id' => 'blex', 'regexp' => '/BLEXBotTest\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'BlogBridge', 'id' => 'blogbridge', 'regexp' => '/BlogBridge ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Blogger Bot', 'id' => 'blogger', 'regexp' => '/blogger\.com\)/u' ],
|
||||
[ 'name' => 'Bloglines', 'id' => 'bloglines', 'regexp' => '/Bloglines\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Bloglovin', 'id' => 'bloglovin', 'regexp' => '/Bloglovin\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'BlogPulse', 'id' => 'blogpulse', 'regexp' => '/BlogPulse \(ISSpider-([0-9.]*)/u' ],
|
||||
[ 'name' => 'Blogram', 'id' => 'blogram', 'regexp' => '/BlogramCrawler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Blogtrottr', 'id' => 'blogtrot', 'regexp' => '/Blogtrottr\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Blogshares', 'id' => 'blogshares', 'regexp' => '/Blogshares/u' ],
|
||||
[ 'name' => 'BoardReader', 'id' => 'boardreader', 'regexp' => '/BoardReader\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'British Library', 'id' => 'lddc', 'regexp' => '/uk_lddc_bot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Browsershots', 'id' => 'browsershots', 'regexp' => '/Browsershots/u' ],
|
||||
[ 'name' => 'BUbiNG', 'id' => 'bubing', 'regexp' => '/BUbiNG/u' ],
|
||||
[ 'name' => 'Buck', 'id' => 'buck', 'regexp' => '/Buck\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'BuiltWith', 'id' => 'builtwith', 'regexp' => '/BuiltWith\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Butterfly', 'id' => 'butterfly', 'regexp' => '/Butterfly\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'BuzzSumo', 'id' => 'buzzsumo', 'regexp' => '/buzzsumo\.com/u' ],
|
||||
[ 'name' => 'Bytespider', 'id' => 'bytespider', 'regexp' => '/Bytespider/u' ],
|
||||
[ 'name' => 'CiteSeerX', 'id' => 'heritrix', 'regexp' => '/heritrix\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Clarabot', 'id' => 'clarabot', 'regexp' => '/Clarabot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Cliqzbot', 'id' => 'cliqz', 'regexp' => '/Cliqzbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Cloudflare Always Online', 'id' => 'cloudflare', 'regexp' => '/CloudFlare-AlwaysOnline\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Cloudflare AMP', 'id' => 'cloudflare', 'regexp' => '/Cloudflare-AMP\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Cloudflare Diagnostics', 'id' => 'cloudflare', 'regexp' => '/Cloudflare Diagnostics/u' ],
|
||||
[ 'name' => 'Cloudflare Diagnostics', 'id' => 'cloudflare', 'regexp' => '/Cloudflare-Diagnostics/u' ],
|
||||
[ 'name' => 'Cloudflare SpeedTest', 'id' => 'cloudflare', 'regexp' => '/Cloudflare SpeedTest\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Coccocbot Web', 'id' => 'coccoc', 'regexp' => '/coccocbot-web\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Coccocbot Image', 'id' => 'coccoc', 'regexp' => '/coccocbot-image\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Comodo', 'id' => 'comodo', 'regexp' => '/Comodo Spider ([0-9.]*)/u' ],
|
||||
[ 'name' => 'CommaFeed', 'id' => 'commafeed', 'regexp' => '/CommaFeed\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Common Crawl Bot', 'id' => 'cbot', 'regexp' => '/CCBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Common Crawl Research Bot', 'id' => 'cresearch', 'regexp' => '/CCResearchBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Data Hotel Watchdog', 'id' => 'watchdog', 'regexp' => '/Data-Hotel-Watchdog\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Datanyze', 'id' => 'datanyze', 'regexp' => '/Datanyze/u' ],
|
||||
[ 'name' => 'DataparkSearch', 'id' => 'datasearch', 'regexp' => '/DataparkSearch\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Dataprovider Bot', 'id' => 'dataprovider', 'regexp' => '/Dataprovider/u' ],
|
||||
[ 'name' => 'Daum', 'id' => 'daum', 'regexp' => '/Daum\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Daumoa', 'id' => 'daumoa', 'regexp' => '/Daumoa ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Digg', 'id' => 'digg', 'regexp' => '/Digg Deeper\/v([0-9.]*)/u' ],
|
||||
[ 'name' => 'Digg', 'id' => 'digg', 'regexp' => '/Digg\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'DomainCrawler', 'id' => 'domaincrawl', 'regexp' => '/DomainCrawler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Domain Stats Bot', 'id' => 'domainstats', 'regexp' => '/DomainStatsBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Discord', 'id' => 'discord', 'regexp' => '/Discordbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Domain Re-Animator', 'id' => 'domain', 'regexp' => '/Domain Re-Animator Bot/u' ],
|
||||
[ 'name' => 'DMCA', 'id' => 'dmca', 'regexp' => '/DMCA\.com Page Protection Crawling Service/u' ],
|
||||
[ 'name' => 'DuckDuckGo Bot', 'id' => 'duckduck', 'regexp' => '/DuckDuckBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'DuckDuckGo Https Bot', 'id' => 'duckduck', 'regexp' => '/DuckDuckBot-Https\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'DuckDuckGo Favicons Bot', 'id' => 'duckduck', 'regexp' => '/DuckDuckGo-Favicons-Bot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Embed PHP Library', 'id' => 'embed', 'regexp' => '/Embed PHP library/iu' ],
|
||||
[ 'name' => 'Evc-batch', 'id' => 'evc', 'regexp' => '/evc-batch\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Exabot Thumbnails', 'id' => 'exabot', 'regexp' => '/Exabot-Thumbnails/u' ],
|
||||
[ 'name' => 'ExactSeek', 'id' => 'exactseek', 'regexp' => '/ExactSeek Crawler/u' ],
|
||||
[ 'name' => 'Ezooms Crawler', 'id' => 'ezooms', 'regexp' => '/Ezooms\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Facebook', 'id' => 'facebook', 'regexp' => '/facebookplatform\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Facebook', 'id' => 'facebook', 'regexp' => '/facebookexternalhit\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Facebook', 'id' => 'facebook', 'regexp' => '/facebookscraper\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Facebook', 'id' => 'facebook', 'regexp' => '/FacebookSecurity\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'FAST Crawler', 'id' => 'fast', 'regexp' => '/FAST Crawler ([0-9.]*)/u' ],
|
||||
[ 'name' => 'FAST Crawler', 'id' => 'fast', 'regexp' => '/FastCrawler3/u' ],
|
||||
[ 'name' => 'FAST Enterprise Crawler', 'id' => 'fast', 'regexp' => '/FAST Enterprise Crawler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'FAST Enterprise Crawler', 'id' => 'fast', 'regexp' => '/FAST Enterprise Crawler ([0-9.]*)/u' ],
|
||||
[ 'name' => 'FAST Enterprise Crawler', 'id' => 'fast', 'regexp' => '/FAST EnterpriseCrawler ([0-9.]*)/u' ],
|
||||
[ 'name' => 'FAST MetaWeb Crawler', 'id' => 'fast', 'regexp' => '/FAST MetaWeb Crawler/u' ],
|
||||
[ 'name' => 'FAST mSEARCH Crawler', 'id' => 'fast', 'regexp' => '/FAST-mSEARCH Crawler ([0-9.]*)/u' ],
|
||||
[ 'name' => 'FAST Web Crawler', 'id' => 'fast', 'regexp' => '/FAST-WebCrawler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Flamingo Search', 'id' => 'flamingo', 'regexp' => '/Flamingo_SearchEngine/u' ],
|
||||
[ 'name' => 'Fastladder', 'id' => 'fastladder', 'regexp' => '/Fastladder FeedFetcher\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Feedbin', 'id' => 'feed', 'regexp' => '/Feedbin/u' ],
|
||||
[ 'name' => 'FeedWrangler', 'id' => 'wrangler', 'regexp' => '/Feed Wrangler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Feedly', 'id' => 'feed', 'regexp' => '/FeedlyApp\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Feedly', 'id' => 'feed', 'regexp' => '/FeedlyBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Feedly', 'id' => 'feed', 'regexp' => '/MetaFeedly\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Feedspot', 'id' => 'feed', 'regexp' => '/Feedspot/u' ],
|
||||
[ 'name' => 'FeedValidator', 'id' => 'validator', 'regexp' => '/FeedValidator\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'FeedZirra', 'id' => 'feed', 'regexp' => '/feedzirra/u' ],
|
||||
[ 'name' => 'Fever', 'id' => 'fever', 'regexp' => '/Fever\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Florienzh', 'id' => 'florienzh', 'regexp' => '/Florienzh\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Friendica', 'id' => 'friendica', 'regexp' => '/Friendica/u' ],
|
||||
[ 'name' => 'FTRF: Friendly Robot', 'id' => 'robot', 'regexp' => '/FTRF: Friendly robot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Genieo Web Filter', 'id' => 'genieo', 'regexp' => '/Genieo\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'GNIP', 'id' => 'fetchor', 'regexp' => '/UnwindFetchor\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Gocrawl', 'id' => 'google', 'regexp' => '/Googlebot \(gocrawl v([0-9.]*)\)/u' ],
|
||||
[ 'name' => 'Gofeed', 'id' => 'gofeed', 'regexp' => '/Gofeed\/([0-9.]+)/u' ],
|
||||
[ 'name' => 'GomezAgent', 'id' => 'gomez', 'regexp' => '/GomezAgent ([0-9.]+)/u' ],
|
||||
[ 'name' => 'Goo', 'id' => 'ichiro', 'regexp' => '/ichiro\/mobile goo/u' ],
|
||||
[ 'name' => 'Goo Blog Search', 'id' => 'gooblog', 'regexp' => '/gooblog\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Goo Blog Search', 'id' => 'gooblog', 'regexp' => '/gooblogsearch\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Goo RSS Reader', 'id' => 'goorss', 'regexp' => '/gooRSSreader([0-9.]*)/u' ],
|
||||
[ 'name' => 'Googlebot', 'id' => 'google', 'regexp' => '/Google[Bb]ot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Googlebot Mobile', 'id' => 'google', 'regexp' => '/Googlebot-Mobile\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Googlebot Image', 'id' => 'google', 'regexp' => '/Googlebot-Image\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Googlebot Video', 'id' => 'google', 'regexp' => '/Googlebot-Video\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Google Ads Bot', 'id' => 'google', 'regexp' => '/AdsBot-Google/u' ],
|
||||
[ 'name' => 'Google Adsense Snapshot', 'id' => 'google', 'regexp' => '/Adsense-Snapshot-Google/u' ],
|
||||
[ 'name' => 'Google App Engine', 'id' => 'google', 'regexp' => '/AppEngine-Google/u' ],
|
||||
[ 'name' => 'Google Web Preview', 'id' => 'google', 'regexp' => '/Google Web Preview/u' ],
|
||||
[ 'name' => 'Google Page Speed', 'id' => 'google', 'regexp' => '/Google Page Speed Insights/u' ],
|
||||
[ 'name' => 'Google Favicon', 'id' => 'google', 'regexp' => '/Google Favicon/u' ],
|
||||
[ 'name' => 'Google FeedBurner', 'id' => 'feed', 'regexp' => '/FeedBurner\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Google Feedfetcher', 'id' => 'google', 'regexp' => '/Feedfetcher-Google/iu' ],
|
||||
[ 'name' => 'Google Font Analysis', 'id' => 'google', 'regexp' => '/Google-FontAnalysis\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Google Sitemaps', 'id' => 'google', 'regexp' => '/Google-Sitemaps\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Google Site Verification', 'id' => 'google', 'regexp' => '/Google-Site-Verification\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Google Rich Snippets', 'id' => 'google', 'regexp' => '/Googlebot-richsnippets/u' ],
|
||||
[ 'name' => 'Google Mediapartners', 'id' => 'google', 'regexp' => '/Mediapartners-Google\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Google Mediapartners', 'id' => 'google', 'regexp' => '/Mediapartners-Google/u' ],
|
||||
[ 'name' => 'Google News', 'id' => 'google', 'regexp' => '/Googlebot-News/u' ],
|
||||
[ 'name' => 'Google Wireless Transcoder', 'id' => 'google', 'regexp' => '/Google Wireless Transcoder/u' ],
|
||||
[ 'name' => 'Google Play Newsstand', 'id' => 'google', 'regexp' => '/GoogleProducer/u' ],
|
||||
[ 'name' => 'Google YouTube Sample', 'id' => 'google', 'regexp' => '/Google-YouTubeSample\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Gowikibot', 'id' => 'gowiki', 'regexp' => '/Gowikibot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Grammarly', 'id' => 'grammarly', 'regexp' => '/Grammarly\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Grub', 'id' => 'grub', 'regexp' => '/grub-client-([0-9.]*)/u' ],
|
||||
[ 'name' => 'Hatena Antenna', 'id' => 'hatena', 'regexp' => '/Hatena Antenna\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Hatena Diary', 'id' => 'hatena', 'regexp' => '/Hatena Diary RSS Module/u' ],
|
||||
[ 'name' => 'Hatena Pagetitle', 'id' => 'hatena', 'regexp' => '/Hatena Pagetitle Agent\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'HeartRails Capture', 'id' => 'capture', 'regexp' => '/HeartRails_Capture\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Heureka Feed', 'id' => 'heureka', 'regexp' => '/Heurekabot-Feed/u' ],
|
||||
[ 'name' => 'HootSuite', 'id' => 'hootsuite', 'regexp' => '/Hootsuite-WebFeed\/([0-9\.]*)/u' ],
|
||||
[ 'name' => 'HootSuite', 'id' => 'hootsuite', 'regexp' => '/HootSuite Image proxy/u' ],
|
||||
[ 'name' => 'htdig', 'id' => 'htdig', 'regexp' => '/htdig\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'HTTPMon', 'id' => 'httpmon', 'regexp' => '/HTTPMon\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'HubPages', 'id' => 'hubpages', 'regexp' => '/HubPages V([0-9.]*)/u' ],
|
||||
[ 'name' => 'HubSpot Crawler', 'id' => 'hubspot', 'regexp' => '/hubspot\.com/u' ],
|
||||
[ 'name' => 'iAsk Spider', 'id' => 'spider', 'regexp' => '/iaskspider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'iAsk Spider', 'id' => 'spider', 'regexp' => '/iaskspider2/u' ],
|
||||
[ 'name' => 'Ichiro', 'id' => 'ichiro', 'regexp' => '/ichiro\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Internet Archive', 'id' => 'archive', 'regexp' => '/InternetArchive\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'IndeedBot', 'id' => 'indeed', 'regexp' => '/IndeedBot ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Iodc', 'id' => 'iodc', 'regexp' => '/iodc\.co\.uk/u' ],
|
||||
[ 'name' => 'Istellabot', 'id' => 'istellabot', 'regexp' => '/istellabot\/t\.([0-9.]*)/u' ],
|
||||
[ 'name' => 'JamesBOT', 'id' => 'crawler', 'regexp' => '/James BOT - WebCrawler/u' ],
|
||||
[ 'name' => 'Jayde', 'id' => 'crawler', 'regexp' => '/Jayde Crawler./u' ],
|
||||
[ 'name' => 'KakaoTalk Bot', 'id' => 'kakao', 'regexp' => '/kakaotalk-scrap\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Kouio', 'id' => 'kouio', 'regexp' => '/kouio.com/u' ],
|
||||
[ 'name' => 'Larbin', 'id' => 'larbin', 'regexp' => '/[Ll]arbin[\/_]([0-9.]*)/u' ],
|
||||
[ 'name' => 'LetsearchBot', 'id' => 'letsearch', 'regexp' => '/LetsearchBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Line Bot', 'id' => 'line', 'regexp' => '/Linespider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Linkedin Bot', 'id' => 'linkedin', 'regexp' => '/LinkedInBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Linkpad Bot', 'id' => 'linkpad', 'regexp' => '/LinkpadBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Linkdex Bot', 'id' => 'linkdex', 'regexp' => '/linkdexbot-mobile\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Linkdex Bot', 'id' => 'linkdex', 'regexp' => '/linkdex.com\/v([0-9.]*)/u' ],
|
||||
[ 'name' => 'Livedoor', 'id' => 'livedoor', 'regexp' => '/livedoor/u' ],
|
||||
[ 'name' => 'LookSeek', 'id' => 'seeker', 'regexp' => '/Seeker v\.([0-9.]*)/u' ],
|
||||
[ 'name' => 'LTX71', 'id' => 'ltx71', 'regexp' => '/ltx71/u' ],
|
||||
[ 'name' => 'Magpie RSS', 'id' => 'magpie', 'regexp' => '/MagpieRSS\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Majestic MJ12 Bot', 'id' => 'mj12bot', 'regexp' => '/MJ12bot\/v([0-9.]*)/u' ],
|
||||
[ 'name' => 'Majestic MJ12 Bot', 'id' => 'mj12bot', 'regexp' => '/mj12bot/u' ],
|
||||
[ 'name' => 'Mapian News Bot', 'id' => 'mapion', 'regexp' => '/mapion-news-bot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Mail.ru Bot', 'id' => 'mail\.ru', 'regexp' => '/Mail\.RU_Bot\/Img\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Mail.ru Bot', 'id' => 'mail\.ru', 'regexp' => '/Mail\.RU_Bot\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Medium Bot', 'id' => 'medium', 'regexp' => '/Mediumbot-MetaTagFetcher\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Medium Bot', 'id' => 'medium', 'regexp' => '/Mediumbot-ProxyFetcher\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Mega Index Bot', 'id' => 'megaindex', 'regexp' => '/MegaIndex\.ru\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Microsoft Social Streams', 'id' => 'socialstreams', 'regexp' => '/Microsoft MSN SocialStreams Bot/u' ],
|
||||
[ 'name' => 'Mixi', 'id' => 'mixi', 'regexp' => '/mixi-check\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Minds', 'id' => 'minds', 'regexp' => '/MindsMediaProxy\/([0-9\.]*)/u' ],
|
||||
[ 'name' => 'MnoGoSearch', 'id' => 'mnogo', 'regexp' => '/MnoGoSearch\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'MojeekBot', 'id' => 'mojeek', 'regexp' => '/MojeekBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Monitor.us', 'id' => 'monitor', 'regexp' => '/monitor.us/u' ],
|
||||
[ 'name' => 'Moz', 'id' => 'dotbot', 'regexp' => '/DotBot\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Moz', 'id' => 'rogerbot', 'regexp' => '/rogerbot\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Naver Yeti', 'id' => 'yeti', 'regexp' => '/Yeti\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'MxToolbox', 'id' => 'mxtoolbox', 'regexp' => '/MxToolbox\/([a-zA-Z0-9.]*)/u' ],
|
||||
[ 'name' => 'Netcraft Survey Agent Bot', 'id' => 'netcraft', 'regexp' => '/NetcraftSurveyAgent\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Netcraft Web Server Survey Bot', 'id' => 'netcraft', 'regexp' => '/Netcraft Web Server Survey/u' ],
|
||||
[ 'name' => 'Netcraft SSL Server Survey Bot', 'id' => 'netcraft', 'regexp' => '/Netcraft SSL Server Survey/u' ],
|
||||
[ 'name' => 'Netcraft Bot', 'id' => 'netcraft', 'regexp' => '/Netcraft/iu' ],
|
||||
[ 'name' => 'netEstate NE Crawler', 'id' => 'netestate', 'regexp' => '/netEstate NE Crawler/u' ],
|
||||
[ 'name' => 'Netvibes', 'id' => 'netvibes', 'regexp' => '/Netvibes/u' ],
|
||||
[ 'name' => 'NewsBlur', 'id' => 'newsblur', 'regexp' => '/NewsBlur Favicon Fetcher/u' ],
|
||||
[ 'name' => 'NewsBlur', 'id' => 'newsblur', 'regexp' => '/NewsBlur Feed Fetcher/u' ],
|
||||
[ 'name' => 'NewsBlur', 'id' => 'newsblur', 'regexp' => '/NewsBlur Feed Finder/u' ],
|
||||
[ 'name' => 'NewsBlur', 'id' => 'newsblur', 'regexp' => '/NewsBlur Page Fetcher/u' ],
|
||||
[ 'name' => 'NewsGator', 'id' => 'newsgator', 'regexp' => '/NewsGator\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'NewsGator', 'id' => 'newsgator', 'regexp' => '/NewsGatorOnline\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'NewsGator FetchLinks', 'id' => 'newsgator', 'regexp' => '/NewsGator FetchLinks extension\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Nimbostratus', 'id' => 'nimbostratus', 'regexp' => '/Nimbostratus-Bot\/v([0-9.]*)/u' ],
|
||||
[ 'name' => 'OdklBot', 'id' => 'odklbot', 'regexp' => '/OdklBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'OpenWebSpider', 'id' => 'spider', 'regexp' => '/OpenWebSpider v([0-9.]*)/u' ],
|
||||
[ 'name' => 'OrangeBot', 'id' => 'orange', 'regexp' => '/OrangeBot-Collector\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'OrangeBot', 'id' => 'orange', 'regexp' => '/OrangeBot-Mobile/u' ],
|
||||
[ 'name' => 'PagesInventory', 'id' => 'pages', 'regexp' => '/PagesInventory/u' ],
|
||||
[ 'name' => 'Petal Bot', 'id' => 'petal', 'regexp' => '/PetalBot/u' ],
|
||||
[ 'name' => 'Petal Bot', 'id' => 'aspiegel', 'regexp' => '/Aspiegel/u' ],
|
||||
[ 'name' => 'Picsearch Bot', 'id' => 'psbot', 'regexp' => '/psbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Picsearch Bot', 'id' => 'psbot', 'regexp' => '/psbot-page/u' ],
|
||||
[ 'name' => 'Picsearch Bot', 'id' => 'psbot', 'regexp' => '/psbot-image/u' ],
|
||||
[ 'name' => 'Pingdom', 'id' => 'pingdom', 'regexp' => '/Pingdom.com_bot_version_([0-9.]*)/u' ],
|
||||
[ 'name' => 'Pinterest', 'id' => 'pinterest', 'regexp' => '/Pinterest\/([0-9.]+)( \(+|$)/u' ],
|
||||
[ 'name' => 'Plurk Bot', 'id' => 'plurk', 'regexp' => '/PlurkBot\/([0-9\.]*)/u' ],
|
||||
[ 'name' => 'Pocket', 'id' => 'pocket', 'regexp' => '/PocketImageCache\/([0-9.]+)/u' ],
|
||||
[ 'name' => 'Pocket', 'id' => 'pocket', 'regexp' => '/PocketParser\/([0-9.]+)/u' ],
|
||||
[ 'name' => 'PostRank', 'id' => 'postrank', 'regexp' => '/PostRank\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'PowerMapper', 'id' => 'crawler', 'regexp' => '/CrawlerProcess \(http:\/\/www\.PowerMapper\.com\) \/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Radian 6', 'id' => 'feed', 'regexp' => '/R6_FeedFetcher/u' ],
|
||||
[ 'name' => 'Radian 6', 'id' => 'comment', 'regexp' => '/R6_CommentReader/u' ],
|
||||
[ 'name' => 'Reddit Bot', 'id' => 'reddit', 'regexp' => '/redditbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'RssBar', 'id' => 'rssbar', 'regexp' => '/RssBar\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'ROI Hunter', 'id' => 'hunter', 'regexp' => '/ROI Hunter/u' ],
|
||||
[ 'name' => 'QuerySeekerSpider', 'id' => 'spider', 'regexp' => '/QuerySeekerSpider(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Quora Link Preview', 'id' => 'quora', 'regexp' => '/Quora Link Preview\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'SafeSearch Microdata', 'id' => 'safesearch', 'regexp' => '/SafeSearch microdata crawler/u' ],
|
||||
[ 'name' => 'Scrapy', 'id' => 'scrapy', 'regexp' => '/Scrapy\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'ScreenerBot', 'id' => 'crawler', 'regexp' => '/ScreenerBot Crawler Beta ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Search Atlas Bot', 'id' => 'searchatlas', 'regexp' => '/SearchAtlas/iu' ],
|
||||
[ 'name' => 'Seekport Crawler', 'id' => 'seekport', 'regexp' => '/Seekport Crawler/u' ],
|
||||
[ 'name' => 'Semrush', 'id' => 'semrush', 'regexp' => '/SemrushBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Serp Stat', 'id' => 'serpstat', 'regexp' => '/serpstatbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'SEOkicks Bot', 'id' => 'seokicks', 'regexp' => '/SEOkicks/u' ],
|
||||
[ 'name' => 'Server Density', 'id' => 'monitor', 'regexp' => '/Server Density Service Monitoring/u' ],
|
||||
[ 'name' => 'Seznam bot', 'id' => 'seznam', 'regexp' => '/SeznamBot|SklikBot|Seznam screenshot-generator/u' ],
|
||||
[ 'name' => 'Seznam Email Proxy', 'id' => 'seznam', 'regexp' => '/SeznamEmailProxy/u' ],
|
||||
[ 'name' => 'Seznam Zbozi.cz', 'id' => 'seznam', 'regexp' => '/Seznam-Zbozi-robot/u' ],
|
||||
[ 'name' => 'ShopWiki', 'id' => 'shopwiki', 'regexp' => '/ShopWiki\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'SilverReader', 'id' => 'reader', 'regexp' => '/SilverReader\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'SimplePie', 'id' => 'simplepie', 'regexp' => '/SimplePie\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Site24x7', 'id' => 'site24', 'regexp' => '/Site24x7/u' ],
|
||||
[ 'name' => 'Skype Url Preview', 'id' => 'skype', 'regexp' => '/SkypeUriPreview Preview\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Slackbot Link Checker', 'id' => 'slack', 'regexp' => '/Slackbot-LinkExpanding ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Sogou Web Spider', 'id' => 'sogou', 'regexp' => '/sogou spider/u' ],
|
||||
[ 'name' => 'Sogou Web Spider', 'id' => 'sogou', 'regexp' => '/Sogou pic spider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Sogou Web Spider', 'id' => 'sogou', 'regexp' => '/Sogou inst spider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Sogou Web Spider', 'id' => 'sogou', 'regexp' => '/Sogou web spider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Sogou Mobile Spider', 'id' => 'sogou', 'regexp' => '/Sogou Mobile Spider([0-9.]*)/u' ],
|
||||
[ 'name' => 'Sophora Linkchecker', 'id' => 'sophora', 'regexp' => '/Sophora Linkchecker/u' ],
|
||||
[ 'name' => 'Soso Web Spider', 'id' => 'soso', 'regexp' => '/Sosospider\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Soso Web Spider', 'id' => 'soso', 'regexp' => '/Sosospider/u' ],
|
||||
[ 'name' => 'Soso Image Spider', 'id' => 'soso', 'regexp' => '/Sosoimagespider/u' ],
|
||||
[ 'name' => 'SpazioDati', 'id' => 'spaziodati', 'regexp' => '/spaziodati/u' ],
|
||||
[ 'name' => 'SPDYCheck', 'id' => 'spdycheck', 'regexp' => '/SPDYCheck SPDY Protocol Tester/iu' ],
|
||||
[ 'name' => 'Spinn3r', 'id' => 'spinn', 'regexp' => '/Spinn3r ([0-9.]*)/iu' ],
|
||||
[ 'name' => 'Spiderlytics', 'id' => 'spider', 'regexp' => '/Spiderlytics\/([0-9.]*)/iu' ],
|
||||
[ 'name' => 'Sputnik Favicon Bot', 'id' => 'sputnik', 'regexp' => '/SputnikFaviconBot\/([0-9.]*)/iu' ],
|
||||
[ 'name' => 'Sputnik Image Bot', 'id' => 'sputnik', 'regexp' => '/SputnikImageBot\/([0-9.]*)/iu' ],
|
||||
[ 'name' => 'Sputnik Bot', 'id' => 'sputnik', 'regexp' => '/SputnikBot\/([0-9.]*)/iu' ],
|
||||
[ 'name' => 'StatusCake Error Detector', 'id' => 'detector', 'regexp' => '/StatusCake Error Detector/iu' ],
|
||||
[ 'name' => 'Summify', 'id' => 'summify', 'regexp' => '/Summify\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'TelegramBot', 'id' => 'telegram', 'regexp' => '/TelegramBot/u' ],
|
||||
[ 'name' => 'Twisted PageGetter', 'id' => 'twisted', 'regexp' => '/Twisted PageGetter/u' ],
|
||||
[ 'name' => 'Twitterbot', 'id' => 'twitter', 'regexp' => '/Twitterbot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Tiny Tiny RSS', 'id' => 'tiny', 'regexp' => '/Tiny Tiny RSS\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'TinEye Bot', 'id' => 'tineye', 'regexp' => '/TinEye\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'TinEye Bot', 'id' => 'tineye', 'regexp' => '/TinEye-bot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'TLSProber', 'id' => 'tlsprober', 'regexp' => '/TLSProber\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'TrustedSite', 'id' => 'trustedsite', 'regexp' => '/TrustedSite/u' ],
|
||||
[ 'name' => 'Typhoeus', 'id' => 'typhoeus', 'regexp' => '/Typhoeus/u' ],
|
||||
[ 'name' => 'Vagabondo', 'id' => 'vagabondo', 'regexp' => '/Vagabondo\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'VelenPublicWebCrawler', 'id' => 'velen', 'regexp' => '/VelenPublicWebCrawler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'vkShare', 'id' => 'vkshare', 'regexp' => '/vkShare/u' ],
|
||||
[ 'name' => 'Voat', 'id' => 'voat', 'regexp' => '/Voat\.co OpenGraph Parser/u' ],
|
||||
[ 'name' => 'Voilabot', 'id' => 'voila', 'regexp' => '/Voila[Bb]ot/u' ],
|
||||
[ 'name' => 'VocusBot', 'id' => 'vocus', 'regexp' => '/VocusBot ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Vodafone mCrawler', 'id' => 'mcrawler', 'regexp' => '/Vodafone mCrawler/u' ],
|
||||
[ 'name' => 'VuhuvBot', 'id' => 'vuhuv', 'regexp' => '/vuhuvBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3Bot', 'id' => 'w3bot', 'regexp' => '/W3Bot ([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C CSS Validator', 'id' => 'jigsaw', 'regexp' => '/Jigsaw\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Internationalization Checker', 'id' => 'w3c', 'regexp' => '/W3C_I18n-Checker\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Line Mode', 'id' => 'w3c', 'regexp' => '/W3CLineMode\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Link Checker', 'id' => 'w3c', 'regexp' => '/W3C-checklink\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Markup Validator', 'id' => 'w3c', 'regexp' => '/W3C_Validator\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C MobileOK Checker', 'id' => 'w3c', 'regexp' => '/W3C-mobileOK\/DDC-([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Multipage Validator', 'id' => 'w3c', 'regexp' => '/W3C_Multipage_Validator\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Robot', 'id' => 'w3c', 'regexp' => '/W3CRobot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Unified Validator', 'id' => 'w3c', 'regexp' => '/W3C_Unicorn\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'W3C Validator.nu', 'id' => 'validator', 'regexp' => '/Validator.nu\//u' ],
|
||||
[ 'name' => 'Wappalyzer', 'id' => 'wappalyzer', 'regexp' => '/Wappalyzer/u' ],
|
||||
[ 'name' => 'Wayback Archive', 'id' => 'wayback', 'regexp' => '/waybackarchive.org\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'WebbCrawler', 'id' => 'crawler', 'regexp' => '/WebbCrawler ([0-9.]*)/u' ],
|
||||
[ 'name' => 'WebIndexer', 'id' => 'webindexer', 'regexp' => '/WebIndexer\//u' ],
|
||||
[ 'name' => 'WordPress', 'id' => 'wordpress', 'regexp' => '/WordPress\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'WordPress.com', 'id' => 'wordpress', 'regexp' => '/WordPress\.com; http/u' ],
|
||||
[ 'name' => 'WordPress Jetpack', 'id' => 'wordpress', 'regexp' => '/Jetpack by WordPress\.com/u' ],
|
||||
[ 'name' => 'WWW Mechanize', 'id' => 'mechanize', 'regexp' => '/WWW-Mechanize\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Xenu Link Sleuth', 'id' => 'xenu', 'regexp' => '/Xenu Link Sleuth\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Xerka WebBot', 'id' => 'xerka', 'regexp' => '/Xerka WebBot v([0-9.]*)/u' ],
|
||||
[ 'name' => 'XML Sitemaps Generator', 'id' => 'sitemap', 'regexp' => '/XML-Sitemaps\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'XMLSitemapGenerator', 'id' => 'sitemap', 'regexp' => '/XmlSitemapGenerator/u' ],
|
||||
[ 'name' => 'YaCy Bot', 'id' => 'yacy', 'regexp' => '/yacy(?:\/|\s|bot)/u' ],
|
||||
[ 'name' => 'Yandex Anti Virus', 'id' => 'yandex', 'regexp' => '/YandexAntivirus\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Blogs', 'id' => 'yandex', 'regexp' => '/YandexBlogs\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Bot', 'id' => 'yandex', 'regexp' => '/YandexBot\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Direct', 'id' => 'yandex', 'regexp' => '/YandexDirect\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Favicons', 'id' => 'yandex', 'regexp' => '/YandexFavicons\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Image Resizer', 'id' => 'yandex', 'regexp' => '/YandexImageResizer\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Images', 'id' => 'yandex', 'regexp' => '/YandexImages\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Metrika', 'id' => 'yandex', 'regexp' => '/YandexMetrika\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex News', 'id' => 'yandex', 'regexp' => '/YandexNews\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Newslinks', 'id' => 'yandex', 'regexp' => '/YandexNewslinks(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Yahoo! Ad Monitoring', 'id' => 'yahoo', 'regexp' => '/Yahoo Ad monitoring/u' ],
|
||||
[ 'name' => 'Yahoo! Blogs', 'id' => 'yahoo', 'regexp' => '/Yahoo-Blogs\/v([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Cache System', 'id' => 'yahoo', 'regexp' => '/YahooCacheSystem/u' ],
|
||||
[ 'name' => 'Yahoo! Feed Seeker', 'id' => 'yahoo', 'regexp' => '/YahooFeedSeeker\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Feed Seeker', 'id' => 'yahoo', 'regexp' => '/YahooFeedSeeker Testing\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Image', 'id' => 'yahoo', 'regexp' => '/Yahoo-MMCrawler\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Link Expander', 'id' => 'yahoo', 'regexp' => '/Yahoo:LinkExpander/u' ],
|
||||
[ 'name' => 'Yahoo! Link Preview', 'id' => 'yahoo', 'regexp' => '/Yahoo Link Preview/u' ],
|
||||
[ 'name' => 'Yahoo! Video', 'id' => 'yahoo', 'regexp' => '/Yahoo-MMAudVid\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Mindset', 'id' => 'yahoo', 'regexp' => '/Yahoo\! Mindset/u' ],
|
||||
[ 'name' => 'Yahoo! Product Search', 'id' => 'yahoo', 'regexp' => '/YahooSeeker\/ProductSearch([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Slurp', 'id' => 'yahoo', 'regexp' => '/Yahoo\! Slurp\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Slurp', 'id' => 'yahoo', 'regexp' => '/Yahoo\! Slurp/u' ],
|
||||
[ 'name' => 'Yahoo! Seeker', 'id' => 'yahoo', 'regexp' => '/YahooSeeker(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Yahoo! Seeker', 'id' => 'yahoo', 'regexp' => '/YahooSeeker-Testing\/v([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Seeker', 'id' => 'yahoo', 'regexp' => '/yahooseeker-jp-mobile/u' ],
|
||||
[ 'name' => 'Yahoo! Site Checker', 'id' => 'y\!j', 'regexp' => '/Y\!J SiteChecker/u' ],
|
||||
[ 'name' => 'Yahoo! Pipes', 'id' => 'yahoo', 'regexp' => '/Yahoo Pipes ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo! Video Search', 'id' => 'yahoo', 'regexp' => '/YahooVideoSearch/u' ],
|
||||
[ 'name' => 'Yahoo! Japan', 'id' => 'yahoo', 'regexp' => '/Yahoo\! Japan/u' ],
|
||||
[ 'name' => 'Yahoo! Japan', 'id' => 'y\!j', 'regexp' => '/(^|\(compatible; )Y\!J-/u' ],
|
||||
|
||||
[ 'name' => 'Inktomi Slurp', 'id' => 'slurp', 'regexp' => '/Slurp\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Inktomi Slurp', 'id' => 'slurp', 'regexp' => '/Slurp\.so\/([0-9.]*)/u' ],
|
||||
|
||||
[ 'name' => 'Yelp Spider', 'id' => 'yelp', 'regexp' => '/yelpspider-([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yioop Bot', 'id' => 'yioop', 'regexp' => '/YioopBot/u' ],
|
||||
[ 'name' => 'Yisou Spider', 'id' => 'yisou', 'regexp' => '/YisouSpider\/?([0-9.]*)/u' ],
|
||||
[ 'name' => 'Zgrab', 'id' => 'zgrab', 'regexp' => '/zgrab\//u' ],
|
||||
[ 'name' => 'ZmEu', 'id' => 'zmeu', 'regexp' => '/ZmEu/u' ],
|
||||
|
||||
/* Generic bots */
|
||||
[ 'name' => 'Apache Httpd', 'id' => 'httpclient', 'regexp' => '/Apache-HttpClient(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Apache Jakarta', 'id' => 'httpclient', 'regexp' => '/Jakarta Commons-HttpClient(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Apache Nutch', 'id' => 'nutch', 'regexp' => '/\/Nutch-([0-9.]*)/u' ],
|
||||
[ 'name' => 'Apache Nutch', 'id' => 'nutch', 'regexp' => '/Nutch(?:CVS|Org)\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Apache Synapse', 'id' => 'synapse', 'regexp' => '/compatible; Synapse/u' ],
|
||||
[ 'name' => 'Borland Delphi', 'id' => 'indy', 'regexp' => '/Indy Library/u' ],
|
||||
[ 'name' => 'Go Http Client', 'id' => 'go', 'regexp' => '/Go-http-client\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Go Http Client', 'id' => 'go', 'regexp' => '/go-httpclient v([0-9.]*)/u' ],
|
||||
[ 'name' => 'HttpUnit', 'id' => 'httpunit', 'regexp' => '/httpunit\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'OkHttp', 'id' => 'okhttp', 'regexp' => '/okhttp\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Node Fetch', 'id' => 'node', 'regexp' => '/node-fetch\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Wget', 'id' => 'wget', 'regexp' => '/Wget\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Curl', 'id' => 'curl', 'regexp' => '/^curl\/([0-9.]*)/u' ],
|
||||
|
||||
[ 'name' => 'Go', 'id' => 'package', 'regexp' => '/Go [0-9\.]+ package http/u' ],
|
||||
[ 'name' => 'Java', 'id' => 'java', 'regexp' => '/^Java\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Perl', 'id' => 'simple', 'regexp' => '/LWP::Simple\//u' ],
|
||||
[ 'name' => 'Perl', 'id' => 'libwww', 'regexp' => '/libwww-perl\//u' ],
|
||||
[ 'name' => 'Perl', 'id' => 'lwp', 'regexp' => '/lwp-trivial\//u' ],
|
||||
[ 'name' => 'Python', 'id' => 'urllib', 'regexp' => '/Python-urllib\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Python', 'id' => 'requests', 'regexp' => '/python-requests\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'PHP', 'id' => 'php', 'regexp' => '/ PHP\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'PHP', 'id' => 'php', 'regexp' => '/^PHP/u' ],
|
||||
[ 'name' => 'PHP', 'id' => 'pear', 'regexp' => '/PEAR HTTP_Request class/u' ],
|
||||
[ 'name' => 'PHP', 'id' => 'php', 'regexp' => '/CakePHP/u' ],
|
||||
[ 'name' => 'PHP', 'id' => 'zend', 'regexp' => '/Zend_Http_Client/u' ],
|
||||
[ 'name' => 'Ruby', 'id' => 'ruby', 'regexp' => '/^Ruby/u' ],
|
||||
];
|
||||
+371
@@ -0,0 +1,371 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
Applications::$BROWSERS = [
|
||||
|
||||
Constants\BrowserType::BROWSER => [
|
||||
|
||||
/* Desktop browsers */
|
||||
[ 'name' => '115 Browser', 'id' => '115', 'regexp' =>'/115Browser\/([0-9.]*)/u' ],
|
||||
[ 'name' => '115 Chrome', 'id' => '115', 'regexp' =>'/115Chrome\/([0-9.]*)/u' ],
|
||||
[ 'name' => '126 Browser', 'id' => '126', 'regexp' =>'/126BROWSER/u' ],
|
||||
[ 'name' => '2345 Explorer', 'id' => '2345', 'regexp' =>'/2345Explorer\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => '2345 Explorer', 'id' => '2345', 'regexp' =>'/2345Explorer v([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => '2345 Chrome', 'id' => '2345', 'regexp' =>'/2345chrome v([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => '37abc Browser', 'id' => '37abc', 'regexp' => '/ 37abc\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => '360 Extreme Explorer', 'id' => 'qihu', 'regexp' =>'/QIHU 360EE/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => '1st Browser', 'id' => '1stbrowser', 'regexp' => '/1stBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => '360 Safe Explorer', 'id' => 'qihu', 'regexp' =>'/QIHU 360SE/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => '7Star', 'id' => '7star', 'regexp' =>'/7Star\/([0-9.]*)/u' ], // see: http://www.qixing123.com
|
||||
[ 'name' => 'ABrowse', 'id' => 'abrowse', 'regexp' =>'/A[Bb]rowse ([0-9.]*)/u' ], // browser for the Syllable OS
|
||||
[ 'name' => 'Abrowser', 'id' => 'abrowse', 'regexp' =>'/Abrowser\/([0-9.]*)/u' ], // unbranded version of Firefox
|
||||
[ 'name' => 'Acorn Browse', 'id' => 'acorn', 'regexp' =>'/Acorn Browse ([0-9.]+)/u' ],
|
||||
[ 'name' => 'Acorn Browse', 'id' => 'acorn', 'regexp' =>'/Acorn Phoenix ([0-9.]+)/u' ],
|
||||
[ 'name' => 'Acoo Browser', 'id' => 'acoo', 'regexp' =>'/Acoo Browser/u' ],
|
||||
[ 'name' => 'Amigo Browser', 'id' => 'amigo', 'regexp' => '/ Amigo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://amigo.mail.ru/
|
||||
[ 'name' => 'AOL Desktop', 'id' => 'aol', 'regexp' =>'/AOL ([0-9.]*); AOLBuild/i' ],
|
||||
[ 'name' => 'AOL Browser', 'id' => 'america', 'regexp' =>'/America Online Browser (?:[0-9.]*); rev([0-9.]*);/i' ],
|
||||
[ 'name' => 'APUS Browser', 'id' => 'apus', 'regexp' => '/APUSBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.apusapps.com/en/browser/
|
||||
[ 'name' => 'Arachne', 'id' => 'arachne', 'regexp' =>'/xChaos_Arachne\/[0-9]\.([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: www.glennmcc.org
|
||||
[ 'name' => 'Arora', 'id' => 'arora', 'regexp' =>'/[Aa]rora\/([0-9.]*)/u' ], // see: www.arora-browser.org
|
||||
[ 'name' => 'AWeb', 'id' => 'aweb', 'regexp' =>'/Amiga-AWeb(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'AvantGo', 'id' => 'avant', 'regexp' =>'/AvantGo ([0-9.]+)/u' ],
|
||||
[ 'name' => 'Avant Browser', 'id' => 'avant', 'regexp' =>'/Avant Browser/u' ],
|
||||
[ 'name' => 'Avant Browser', 'id' => 'avant', 'regexp' =>'/Avant TriCore/u' ],
|
||||
[ 'name' => 'Avast SafeZone', 'id' => 'asw', 'regexp' =>'/ASW\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'AVG Secure Browser', 'id' => 'avg', 'regexp' =>'/ AVG\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.avg.com/secure-browser
|
||||
[ 'name' => 'Aviator', 'id' => 'aviator', 'regexp' =>'/Aviator\/([0-9.]*)/u', 'details' => 1 ], // see: https://github.com/WhiteHatSecurity/Aviator
|
||||
[ 'name' => 'Avira Scout', 'id' => 'avira', 'regexp' => '/AviraScout\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.avira.com/en/avira-scout
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'flyflow', 'regexp' =>'/FlyFlow\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'bdbrowser', 'regexp' =>'/bdbrowser\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'bdbrowser', 'regexp' =>'/bdbrowser_i18n\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Baidu Spark', 'id' => 'bdspark', 'regexp' =>'/BDSpark\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Basilisk', 'id' => 'basilisk', 'regexp' => '/ Basilisk\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://basilisk-browser.org/
|
||||
[ 'name' => 'Beamrise', 'id' => 'beamrise', 'regexp' =>'/Beamrise\/([0-9.]*)/u' ], // see: http://beamrise.com
|
||||
[ 'name' => 'Beonex', 'id' => 'beonex', 'regexp' =>'/Beonex\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.beonex.com/
|
||||
[ 'name' => 'Black Wren', 'id' => 'blackwren', 'regexp' =>'/BlackWren\/([0-9.]*)/u', 'details' => 2 ], // see: https://github.com/conmarap/jetbrowser
|
||||
[ 'name' => 'Black Hawk', 'id' => 'blackhawk', 'regexp' => '/BlackHawk\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.netgate.sk/blackhawk/help/welcome-to-blackhawk-web-browser.html
|
||||
[ 'name' => 'Bolt Browser', 'id' => 'bolt', 'regexp' => '/ Bolt\/([0-9.]*)/i', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.boltbrowser.com/
|
||||
[ 'name' => 'Blackbird', 'id' => 'blackbird', 'regexp' =>'/Blackbird\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.blackbirdbrowser.com/
|
||||
[ 'name' => 'Brave', 'id' => 'brave', 'regexp' =>'/brave\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Brisk Bard', 'id' => 'brisk', 'regexp' => '/BriskBard\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.briskbard.com/index.php?lang=en
|
||||
[ 'name' => 'BrowseX', 'id' => 'browsex', 'regexp' => '/BrowseX \(([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://dev.pdqi.com/fossil/browsex/doc/tip/index.html
|
||||
[ 'name' => 'Browzar', 'id' => 'browzar', 'regexp' => '/Browzar/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://browzar.com/
|
||||
[ 'name' => 'Byffox', 'id' => 'byffox', 'regexp' =>'/Byffox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Camino', 'id' => 'camino', 'regexp' =>'/Camino\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Canure', 'id' => 'canure', 'regexp' =>'/Canure\/([0-9.]*)/u', 'details' => 3 ], // see: http://canure.weebly.com/index.html
|
||||
[ 'name' => 'CCleaner Browser', 'id' => 'ccleaner', 'regexp' => '/CCleaner\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.ccleaner.com/ccleaner/browser
|
||||
[ 'name' => 'Cent Browser', 'id' => 'cent', 'regexp' => '/ Cent\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.centbrowser.com/
|
||||
[ 'name' => 'Charon', 'id' => 'charon', 'regexp' =>'/Charon/' ], // see: http://www.vitanuova.com/inferno/man/1/charon.html
|
||||
[ 'name' => 'Chedot', 'id' => 'chedot', 'regexp' => '/ Chedot\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://landing.chedot.com/
|
||||
[ 'name' => 'Cheshire', 'id' => 'cheshire', 'regexp' => '/ Cheshire\/([0-9.A-Z]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Chim Lac', 'id' => 'chimlac', 'regexp' => '/chimlac_browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://chimlac.com.vn/
|
||||
[ 'name' => 'Chimera', 'id' => 'chimera', 'regexp' => '/ Chimera\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'ChromePlus', 'id' => 'chromeplus', 'regexp' =>'/ChromePlus(?:\/([0-9.]*))?$/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Colibri', 'id' => 'colibri', 'regexp' => '/Colibri\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://colibri.opqr.co/
|
||||
[ 'name' => 'Columbus', 'id' => 'columbus', 'regexp' =>'/Columbus\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'CometBird', 'id' => 'cometbird', 'regexp' =>'/CometBird\/([0-9.]*)/u' ], // see: http://www.cometbird.com
|
||||
[ 'name' => 'Comodo Dragon', 'id' => 'comodo', 'regexp' =>'/Comodo_Dragon\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Comodo Dragon', 'id' => 'dragon', 'regexp' =>'/Dragon\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Comodo IceDragon', 'id' => 'dragon', 'regexp' =>'/IceDragon\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Conkeror', 'id' => 'conkeror', 'regexp' =>'/[Cc]onkeror\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Coc Coc', 'id' => 'coc', 'regexp' => '/coc_coc_browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://coccoc.com/en/
|
||||
[ 'name' => 'CoolNovo', 'id' => 'coolnovo', 'regexp' =>'/(?:CoolNovo|CoolNovoChromePlus)\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Corom Browser', 'id' => 'corom', 'regexp' => '/ CoRom\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://apkpure.com/corom-browser-for-android/com.coccoc.corom
|
||||
[ 'name' => 'Crazy Browser', 'id' => 'crazy', 'regexp' => '/Crazy Browser ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Crusta', 'id' => 'crusta', 'regexp' => '/ Crusta\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/Tarptaeya/Crusta
|
||||
[ 'name' => 'Cunaguaro', 'id' => 'cunaguaro', 'regexp' =>'/Cunaguaro\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Cyberdog', 'id' => 'cyberdog', 'regexp' =>'/Cyberdog\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Cyberfox', 'id' => 'cyberfox', 'regexp' =>'/Cyberfox\/([0-9.]*)/u', 'details' => 2 ], // see: https://cyberfox.8pecxstudios.com
|
||||
[ 'name' => 'Daedalus', 'id' => 'daedalus', 'regexp' =>'/Daedalus ([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Deg-degan', 'id' => 'degan', 'regexp' => '/Degdegan\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Demeter', 'id' => 'demeter', 'regexp' =>'/Demeter\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'DeskBrowse', 'id' => 'deskbrowse', 'regexp' =>'/DeskBrowse\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Diigo Browser', 'id' => 'diigo', 'regexp' => '/DiigoBrowser/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://apps.apple.com/us/app/diigo-annotator-for-safari/id933773981
|
||||
[ 'name' => 'Dillo', 'id' => 'dillo', 'regexp' =>'/Dillo\/([0-9.]*)/u' ], // see: http://www.dillo.org
|
||||
[ 'name' => 'DocZilla', 'id' => 'doczilla', 'regexp' =>'/DocZilla\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Doga Rhodonit', 'id' => 'rhodonit', 'regexp' =>'/DogaRhodonit/u' ],
|
||||
[ 'name' => 'DPlus Browser', 'id' => 'dplus', 'regexp' =>'/ DPlus ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Elements Browser', 'id' => 'elements', 'regexp' => '/Elements Browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'EudoraWeb', 'id' => 'eudoraweb', 'regexp' =>'/EudoraWeb ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Falkon', 'id' => 'falkon', 'regexp' => '/ Falkon\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.falkon.org/
|
||||
[ 'name' => 'FlameSky', 'id' => 'flamesky', 'regexp' => '/FlameSky\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/flameskyofficial/flamesky
|
||||
[ 'name' => 'Flock', 'id' => 'flock', 'regexp' =>'/Flock\/([0-9.]*)/u', 'details' => 3, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Framafox', 'id' => 'framafox', 'regexp' => '/Framafox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://framakey.org/telecharger/applications-portables-libres#internet
|
||||
[ 'name' => 'Freeu Browser', 'id' => 'freeu', 'regexp' => '/ Free[Uu]\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://play.google.com/store/apps/details?id=com.freeuvpn.android&hl=en
|
||||
[ 'name' => 'Galeon', 'id' => 'galeon', 'regexp' =>'/Galeon\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'GlobalMojo', 'id' => 'globalmojo', 'regexp' =>'/GlobalMojo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'GNOME Web', 'id' => 'epiphany', 'regexp' =>'/Epiphany\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'GreenBrowser', 'id' => 'greenbrowser', 'regexp' =>'/GreenBrowser/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Hola Browser', 'id' => 'hola', 'regexp' => '/ Hola\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://play.google.com/store/apps/details?id=org.hola&hl=en
|
||||
[ 'name' => 'Hydra Browser', 'id' => 'hydra', 'regexp' =>'/Hydra Browser/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'IBrowse', 'id' => 'ibrowse', 'regexp' =>'/IBrowse[\/ ]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'iCab', 'id' => 'icab', 'regexp' =>'/iCab(?: J)?[\/ ](?:Pre)?([0-9.]*)/u' ],
|
||||
[ 'name' => 'Iceape', 'id' => 'iceape', 'regexp' =>'/Iceape\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'IceCat', 'id' => 'icecat', 'regexp' =>'/IceCat[ \/]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.gnu.org/software/gnuzilla/
|
||||
[ 'name' => 'Icedove', 'id' => 'icedove', 'regexp' => '/ Icedove\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://wiki.debian.org/Icedove
|
||||
[ 'name' => 'Iceweasel', 'id' => 'iceweasel', 'regexp' =>'/Iceweasel\/([0-9.]*)/iu', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'iRider Browser', 'id' => 'irider', 'regexp' =>'/iRider ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Iridium', 'id' => 'iridium', 'regexp' =>'/Iridium\/([0-9.]*)/u', 'details' => 2 ], // see: http://www.srware.net/en/software_srware_iron.php
|
||||
[ 'name' => 'Iron', 'id' => 'iron', 'regexp' =>'/Iron\/([0-9.]*)/u', 'details' => 2 ], // see: http://www.srware.net/en/software_srware_iron.php
|
||||
[ 'name' => 'Kapiko', 'id' => 'kapiko', 'regexp' => '/ Kapiko\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://sites.google.com/site/kapikoproject/
|
||||
[ 'name' => 'Kazehakase', 'id' => 'kazehakase', 'regexp' =>'/Kazehakase\/([0-9.]*)/u' ], // see: http://kazehakase.osdn.jp
|
||||
[ 'name' => 'KChrome', 'id' => 'kchrome', 'regexp' =>'/KChrome\/([0-9.]*)/u', 'details' => 3 ], // see: http://www.kchrome.com
|
||||
[ 'name' => 'Kinza', 'id' => 'kinza', 'regexp' => '/ Kinza\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.kinza.jp/en/
|
||||
[ 'name' => 'KKMAN', 'id' => 'kkman', 'regexp' => '/ KKman([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.kkbox.com/kkman/
|
||||
[ 'name' => 'Klondike', 'id' => 'klondike', 'regexp' => '/Klondike\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Kylo', 'id' => 'kylo', 'regexp' => '/ Kylo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://kylo.tv/
|
||||
[ 'name' => 'K-Meleon', 'id' => 'meleon', 'regexp' =>'/K-Meleon\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://kmeleonbrowser.org
|
||||
[ 'name' => 'LBrowser', 'id' => 'lbrowser', 'regexp' =>'/LBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'LieBao', 'id' => 'lbbrowser', 'regexp' =>'/LBBROWSER/u' ], // see: http://www.liebao.cn
|
||||
[ 'name' => 'Light', 'id' => 'light', 'regexp' => '/ Light\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://en.wikipedia.org/wiki/Light_(web_browser)
|
||||
[ 'name' => 'Lobo', 'id' => 'lobo', 'regexp' =>'/Lobo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://sourceforge.net/projects/xamj/files/Lobo%20Browser/
|
||||
[ 'name' => 'Lolifox', 'id' => 'lolifox', 'regexp' => '/lolifox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://ja.wikipedia.org/wiki/Lolifox
|
||||
[ 'name' => 'Lovense', 'id' => 'lovense', 'regexp' => '/Lovense\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.lovense.com/cam-model/guides/pc-phone
|
||||
[ 'name' => 'Lunascape', 'id' => 'lunascape', 'regexp' =>'/ Lunascape[\/| ]([0-9.]*)/u', 'details' => 3 ], // see: http://www.lunascape.tv
|
||||
[ 'name' => 'Naenara', 'id' => 'naenara', 'regexp' =>'/NaenaraBrowser\/([0-9.]*)/u', 'details' => 2 ], // Firefox based browser used with Red Star OS
|
||||
[ 'name' => 'NetCaptor', 'id' => 'netcaptor', 'regexp' =>'/NetCaptor ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://en.wikipedia.org/wiki/NetCaptor
|
||||
[ 'name' => 'Madfox', 'id' => 'madfox', 'regexp' =>'/Madfox\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Maxthon', 'id' => 'mxbrowser', 'regexp' =>'/MxBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Maxthon', 'id' => 'mxbrowser', 'regexp' =>'/MxBrowser-iPhone\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Min Browser', 'id' => 'min', 'regexp' => '/ min\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://minbrowser.github.io/min/
|
||||
[ 'name' => 'Mini Browser', 'id' => 'mini', 'regexp' => '/ MiniBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://dmkho.tripod.com/mb/index.html
|
||||
[ 'name' => 'MixShark', 'id' => 'mixshark', 'regexp' =>'/MixShark\/([0-9.]*)/u' ], // see: http://terbaddo.free.fr/mixshark.php
|
||||
[ 'name' => 'mlbrowser', 'id' => 'mlbrowser', 'regexp' =>'/mlbrowser/u' ], // see: https://github.com/Topguy/mlbrowser
|
||||
[ 'name' => 'Mypal Browser', 'id' => 'mypal', 'regexp' => '/ Mypal\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/Feodor2/Mypal
|
||||
[ 'name' => 'Multi-Browser XP', 'id' => 'multixp', 'regexp' =>'/Multi-Browser ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'NetPositive', 'id' => 'netpositive', 'regexp' =>'/NetPositive\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Nichrome', 'id' => 'nichrome', 'regexp' => '/Nichrome\/self\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Origyn', 'id' => 'origyn', 'regexp' =>'/Origyn Web Browser/u' ],
|
||||
[ 'name' => 'Odyssey', 'id' => 'owb', 'regexp' =>'/OWB\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Open Live Writer', 'id' => 'live', 'regexp' =>'/Open Live Writer ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://openlivewriter.org/
|
||||
[ 'name' => 'Orange Browser', 'id' => 'juzi', 'regexp' =>'/JuziBrowser/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.123juzi.com/
|
||||
[ 'name' => 'Orca', 'id' => 'orca', 'regexp' =>'/Orca\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Oregano', 'id' => 'oregano', 'regexp' =>'/Oregano ([0-9.]*)/u' ], // see: http://www.xat.nl/en/riscos/sw/oregano/
|
||||
[ 'name' => 'Otter', 'id' => 'otter', 'regexp' =>'/Otter(?: Browser)?\/([0-9.]*)/u' ], // see: https://otter-browser.org
|
||||
[ 'name' => 'Pale Moon', 'id' => 'palemoon', 'regexp' =>'/Pale[mM]oon\/([0-9.]*)/u' ], // see: https://www.palemoon.org
|
||||
[ 'name' => 'Patriott Browser', 'id' => 'patriott', 'regexp' =>'/Patriott::Browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://madgroup.x10.mx/patriott1.php
|
||||
[ 'name' => 'Perk', 'id' => 'perk', 'regexp' =>'/ Perk\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.perk.com/
|
||||
[ 'name' => 'Polarity', 'id' => 'polarity', 'regexp' =>'/Polarity\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Privacy Browser', 'id' => 'privacy', 'regexp' => '/PrivacyBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.stoutner.com/privacy-browser/
|
||||
[ 'name' => 'Qihoo 360', 'id' => 'qihu', 'regexp' =>'/QIHU THEWORLD/u' ],
|
||||
[ 'name' => 'Qiyu Browser', 'id' => 'qiyu', 'regexp' => '/Qiyu\/([0-9.]*)/i', 'type' => Constants\DeviceType::DESKTOP ], // see: https://apps.apple.com/cn/app/qi-yu-liu-lan-qi/id959447103
|
||||
[ 'name' => 'QtWeb', 'id' => 'qtweb', 'regexp' =>'/QtWeb Internet Browser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Quick Look', 'id' => 'quicklook', 'regexp' => '/QuickLook\/([0-9.]*)/u' ], // see: https://en.wikipedia.org/wiki/Quick_Look
|
||||
[ 'name' => 'QupZilla', 'id' => 'qupzilla', 'regexp' =>'/QupZilla\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Qute Browser', 'id' => 'qute', 'regexp' => '/qutebrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/qutebrowser/qutebrowser
|
||||
[ 'name' => 'rekonq', 'id' => 'rekonq', 'regexp' =>'/rekonq(?:\/([0-9.]*))?/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Ryouko', 'id' => 'ryouko', 'regexp' =>'/Ryouko\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/foxhead128/ryouko
|
||||
[ 'name' => 'Sylera', 'id' => 'sylera', 'regexp' =>'/Sylera\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // Needs to be discovered before SeaMonkey Browser, see: https://ja.wikipedia.org/wiki/Sylera
|
||||
[ 'name' => 'SaaYaa Explorer', 'id' => 'saayaa', 'regexp' =>'/SaaYaa/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'SalamWeb', 'id' => 'salam', 'regexp' => '/SalamWeb\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://salamweb.com/
|
||||
[ 'name' => 'SalamWeb', 'id' => 'salam', 'regexp' => '/Salam Browser/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Shiira', 'id' => 'shiira', 'regexp' => '/Shiira/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Sielo Browser', 'id' => 'sielo', 'regexp' => '/ Sielo\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://github.com/SieloBrowser/sielo-legacy
|
||||
[ 'name' => 'SiteKiosk', 'id' => 'sitekiosk', 'regexp' => '/SiteKiosk ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.provisio.com/web/us/products/windows-kiosk-software-sitekiosk
|
||||
[ 'name' => 'Sleipnir', 'id' => 'sleipnir', 'regexp' =>'/Sleipnir\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Slimjet', 'id' => 'slimjet', 'regexp' => '/ Slimjet\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.slimjet.com/
|
||||
[ 'name' => 'Sogou Explorer', 'id' => 'metasr', 'regexp' =>'/SE 2.X MetaSr/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Sparrow', 'id' => 'sparrow', 'regexp' =>'/Sparrow\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Sputnik', 'id' => 'sputnik', 'regexp' => '/SputnikBrowser\/([0-9.]*)/u' ], // see: https://browser.sputnik.ru/
|
||||
[ 'name' => 'Stainless', 'id' => 'stainless', 'regexp' =>'/Stainless\/([0-9.]*)/u' ], // see: http://www.stainlessapp.com
|
||||
[ 'name' => 'Station Browser', 'id' => 'station', 'regexp' => '/ Station\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://getstation.com/
|
||||
[ 'name' => 'SunChrome', 'id' => 'sunchrome', 'regexp' =>'/SunChrome\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Sundance', 'id' => 'sundance', 'regexp' =>'/Sundance\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Sundial', 'id' => 'sundial', 'regexp' =>'/Sundial\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.sundialbrowser.com/
|
||||
[ 'name' => 'Superbird', 'id' => 'superbird', 'regexp' =>'/Super[Bb]ird\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Swiftweasel', 'id' => 'swiftweasel', 'regexp' =>'/Swiftweasel\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://swiftweasel.tuxfamily.org/
|
||||
[ 'name' => 'Swiftfox', 'id' => 'swiftfox', 'regexp' =>'/Swiftfox/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Swing Browser', 'id' => 'swing', 'regexp' =>'/Swing(?:\(And\))?\/([0-9.]*)/u', 'details' => 3 ], // see: http://swing-browser.com
|
||||
[ 'name' => 't-online.de', 'id' => 'to-browser', 'regexp' =>'/TO-Browser\/TOB([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.t-online.de/computer/browser/
|
||||
[ 'name' => 't-online.de', 'id' => 'to-browser', 'regexp' =>'/TO-Browser/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Tencent Traveler', 'id' => 'tencent', 'regexp' =>'/TencentTraveler ([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'TenFourFox', 'id' => 'tenfourfox', 'regexp' =>'/TenFourFox\//u' ],
|
||||
[ 'name' => 'The World', 'id' => 'theworld', 'regexp' =>'/TheWorld(?: ([0-9.]*))?/u' ],
|
||||
[ 'name' => 'Tulip Chain', 'id' => 'tulip', 'regexp' =>'/TulipChain\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://ostermiller.org/tulipchain/
|
||||
[ 'name' => 'Tungsten Browser', 'id' => 'tungsten', 'regexp' =>'/TungstenBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'UltraBrowser', 'id' => 'ultrab', 'regexp' =>'/UltraBrowser ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.ultrabrowser.com/
|
||||
[ 'name' => 'Usejump', 'id' => 'usejump', 'regexp' =>'/Usejump\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Vimprobable', 'id' => 'vimprobable', 'regexp' =>'/Vimprobable\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Vivaldi', 'id' => 'vivaldi', 'regexp' =>'/Vivaldi\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'VMware Workspace ONE', 'id' => 'airwatch', 'regexp' => '/Air[Ww]atch Browser v([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Vonkeror', 'id' => 'vonkeror', 'regexp' =>'/Vonkeror\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Voyager', 'id' => 'voyager', 'regexp' =>'/AmigaVoyager\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Waterfox', 'id' => 'waterfox', 'regexp' =>'/Waterfox\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Whale Browser', 'id' => 'whale', 'regexp' => '/ Whale\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://whale.naver.com/
|
||||
[ 'name' => 'WinWAP Browser', 'id' => 'winwap', 'regexp' => '/WinWAP\/([0-9]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://www.winwap.com/mobile_applications/winwap_browser.php
|
||||
[ 'name' => 'WinWAP Browser', 'id' => 'winwap', 'regexp' => '/WinWAP-SPBE\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Xvast', 'id' => 'xvast', 'regexp' =>'/Xvast\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.xvast.com/
|
||||
[ 'name' => 'Yandex Browser', 'id' => 'yabrowser', 'regexp' =>'/YaBrowser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Zvu Browser', 'id' => 'zvu', 'regexp' => '/ Zvu\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://zvu.com/
|
||||
[ 'name' => 'ZipZap', 'id' => 'zipzap', 'regexp' =>'/ZipZap ([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://www.zipzaphome.com/
|
||||
[ 'name' => 'Zombie.js', 'id' => 'zombie', 'regexp' =>'/Zombie\.js\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: http://zombie.js.org/
|
||||
|
||||
/* Mobile browsers */
|
||||
[ 'name' => '1Browser', 'id' => '1password', 'regexp' =>'/1Password\/([0-9.]*)/u' ],
|
||||
[ 'name' => '2345 Browser', 'id' => '2345', 'regexp' =>'/Mb2345Browser\/([0-9.]*)/u' ],
|
||||
[ 'name' => '3G Explorer', 'id' => '3g explorer', 'regexp' =>'/3G Explorer\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => '4G Explorer', 'id' => '4g explorer', 'regexp' =>'/4G Explorer\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Aloha Browser', 'id' => 'aloha', 'regexp' => '/AlohaBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://alohabrowser.com/
|
||||
[ 'name' => 'Atomic', 'id' => 'atomiclite', 'regexp' =>'/AtomicLite\/([0-9.]*)/u' ], // see: http://atomicwebbrowser.com
|
||||
[ 'name' => 'AU', 'id' => 'au', 'regexp' =>'/(?:^| )AU(?:.Browser)?\/([0-9.]+)/u' ],
|
||||
[ 'name' => 'Awakening', 'id' => 'awakening', 'regexp' =>'/Awakening Browser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'baidu', 'regexp' =>'/M?BaiduBrowser\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'bdmobile', 'regexp' =>'/BdMobile\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'bidu', 'regexp' =>'/BIDUBrowser[ \/]([0-9.]*)/u' ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'baidu', 'regexp' =>'/BaiduHD\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'baiduboxapp', 'regexp' =>'/baiduboxapp\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Baidu Browser', 'id' => 'browser', 'regexp' =>'/ browser\/([0-9.]*) \(; P1/i' ],
|
||||
[ 'name' => 'Blazer', 'id' => 'blazer', 'regexp' =>'/Blazer\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'CM Browser', 'id' => 'acheetahi', 'regexp' =>'/ACHEETAHI\//u' ],
|
||||
[ 'name' => 'Cornowser', 'id' => 'cornowser', 'regexp' =>'/Cornowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Cool Market', 'id' => 'coolmarket', 'regexp' =>'/CoolMarket\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'CuteBrowser', 'id' => 'cute', 'regexp' =>'/CuteBrowser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Digia @Web', 'id' => 'digia', 'regexp' =>'/Digia @Web\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Doris', 'id' => 'doris', 'regexp' =>'/Doris\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Dorothy', 'id' => 'doroty', 'regexp' =>'/Dorothy$/u' ],
|
||||
[ 'name' => 'Ecosia Browser', 'id' => 'ecosia', 'regexp' => '/Ecosia\sandroid@([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://play.google.com/store/apps/details?id=com.ecosia.android
|
||||
[ 'name' => 'Ecosia Browser', 'id' => 'ecosia', 'regexp' => '/Ecosia\sios@([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://apps.apple.com/us/app/ecosia/id670881887
|
||||
[ 'name' => 'EMOBILE Browser', 'id' => 'www browser', 'regexp' =>'/WWW Browser\/ver([0-9.]*)/u' ],
|
||||
[ 'name' => 'Epic Browser', 'id' => 'epic', 'regexp' => '/ Epic\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://en.wikipedia.org/wiki/Epic_(web_browser)
|
||||
[ 'name' => 'EUI Browser', 'id' => 'eui', 'regexp' =>'/EUI Browser\/[^0-9\s]*([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Go.Web', 'id' => 'go\.web', 'regexp' =>'/Go\.Web\/([0-9.]*)/u' ], // used on early Blackberry, by GoAmerica
|
||||
[ 'name' => 'Helium', 'id' => 'helium', 'regexp' =>'/HeliumMobileBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'HeyTap Browser', 'id' => 'heytap', 'regexp' => '/HeyTapBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Huohou Browser', 'id' => 'huohoubrowser', 'regexp' =>'/HuohouBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'iCab', 'id' => 'icab', 'regexp' =>'/iCabMobile\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'iLunascape', 'id' => 'lunascape', 'regexp' =>'/iLunascape\/([0-9.]*)/u', 'details' => 3 ], // see: http://www.lunascape.tv
|
||||
[ 'name' => 'InternetSurfboard', 'id' => 'surfboard', 'regexp' =>'/InternetSurfboard\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'iSurf', 'id' => 'isurf', 'regexp' =>'/iSurf version \/v([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Jig Browser', 'id' => 'jig browser', 'regexp' =>'/jig browser(?: web| core|9i?)?;? ?([0-9.]+)?/u', 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Jumanji', 'id' => 'jumanji', 'regexp' =>'/jumanji/u' ], // see: jumanji browser ubuntu
|
||||
[ 'name' => 'K.Browser', 'id' => 'tnsbrowser', 'regexp' => '/TNSBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://play.google.com/store/apps/details?id=com.tnsua.browser
|
||||
[ 'name' => 'Kiosk', 'id' => 'kiosk', 'regexp' =>'/Kiosk\/([0-9.]*)/u' ], // see: http://www.kioskbrowser.net
|
||||
[ 'name' => 'Kiwi Browser', 'id' => 'kiwi', 'regexp' => '/Kiwi Chrome\/([0-9.A-Z]*)/u' ], // see: https://kiwibrowser.com
|
||||
[ 'name' => 'LeBrowser', 'id' => 'lebrowser', 'regexp' =>'/LeBrowser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'LieBaoFast', 'id' => 'liebao', 'regexp' =>'/LieBaoFast\/([0-9.]*)/u' ], // see: http://www.liebao.cn
|
||||
[ 'name' => 'MaCross Mobile', 'id' => 'macross', 'regexp' =>'/MaCross\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Mammoth', 'id' => 'mammoth', 'regexp' =>'/Mammoth\/([0-9.]*)/u' ], // see: https://itunes.apple.com/cn/app/meng-ma-liu-lan-qi/id403760998?mt=8
|
||||
[ 'name' => 'mCent Browser', 'id' => 'mcent', 'regexp' =>'/mCent\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Mint Browser', 'id' => 'mint', 'regexp' => '/XiaoMi\/Mint Browser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: http://www.mintbrowser.com/
|
||||
[ 'name' => 'Mobicip', 'id' => 'mobicip', 'regexp' => '/ Mobicip\//u', 'type' => Constants\DeviceType::MOBILE ], // see: https://www.mobicip.com/
|
||||
[ 'name' => 'Motorola Internet Browser', 'id' => 'mib', 'regexp' =>'/MIB\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Motorola Internet Browser', 'id' => 'mib', 'regexp' =>'/MIB([0-9.]+)\//u' ],
|
||||
[ 'name' => 'Motorola Internet Browser', 'id' => 'cmcs', 'regexp' =>'/Browser\/CMCS([0-9.]*)/u' ],
|
||||
[ 'name' => 'Motorola WebKit', 'id' => 'motorola', 'regexp' =>'/MotorolaWebKit(?:\/([0-9.]*))?/u', 'details' => 3 ],
|
||||
[ 'name' => 'MultiZilla', 'id' => 'multizilla', 'regexp' => '/MultiZilla\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ], // see: https://sourceforge.net/projects/multizilla/
|
||||
[ 'name' => 'NetFront Life Browser', 'id' => 'netfrontlife', 'regexp' =>'/NetFrontLifeBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'OneBrowser', 'id' => 'onebrowser', 'regexp' =>'/OneBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'OnePlus Browser', 'id' => 'oneplus', 'regexp' => '/OnePlusBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://www.oneplus.com/
|
||||
[ 'name' => 'PocketLink', 'id' => 'plink', 'regexp' =>'/PLink ([0-9.]+)/iu', 'details' => 2 ],
|
||||
[ 'name' => 'Polaris', 'id' => 'polaris', 'regexp' =>'/Polaris[\/ ]v?([0-9.]*)/iu', 'details' => 2 ],
|
||||
[ 'name' => 'Polaris', 'id' => 'polaris', 'regexp' =>'/POLARIS([0-9.]+)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Pure Browser', 'id' => 'pure', 'regexp' =>'/PureBrowser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Openwave', 'id' => 'openwave', 'regexp' =>'/Open[Ww]ave\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Openwave', 'id' => 'openwave', 'regexp' =>'/Openwave Mobile Browser ([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Openwave', 'id' => 'openwave', 'regexp' =>'/Browser\/OpenWave([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Openwave', 'id' => 'up', 'regexp' =>'/UP\. ?Browser(?:\/([a-z0-9.]*))?/iu', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Openwave', 'id' => 'km', 'regexp' =>'/KM\.Browser\/([0-9.]+)/iu', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Openwave', 'id' => 'up', 'regexp' =>'/UP\/([0-9.]+)/u', 'details' => 2, 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Oppo Browser', 'id' => 'oppo', 'regexp' =>'/OppoBrowser\/([0-9.]+)/iu' ],
|
||||
[ 'name' => 'Quark Browser', 'id' => 'quark', 'regexp' =>'/Quark\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Realme Browser', 'id' => 'realme', 'regexp' =>'/RealmeBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
|
||||
|
||||
[ 'name' => 'SEMC Browser', 'id' => 'semc', 'regexp' =>'/SEMC-Browser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'STNC HitchHiker' , 'id' => 'stnc', 'regexp' =>'/STNC-WTL\/[0-9.]*/u' ],
|
||||
[ 'name' => 'Sogou Mobile', 'id' => 'sogou', 'regexp' =>'/SogouMobileBrowser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Swing Browser', 'id' => 'swing', 'regexp' =>'/Swing\(And\)\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Symphony', 'id' => 'symphony', 'regexp' =>'/Symphony ([0-9.]+)$/u' ],
|
||||
[ 'name' => 'Tenta Browser', 'id' => 'tenta', 'regexp' => '/ Tenta\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://play.google.com/store/apps/details?id=com.tenta.android&hl=en
|
||||
[ 'name' => 'TinY', 'id' => 'ucpro', 'regexp' =>'/ucpro\/([0-9.]+)/iu' ],
|
||||
[ 'name' => 'Vivo Browser', 'id' => 'vivo', 'regexp' =>'/VivoBrowser\/([0-9.]+)/iu' ],
|
||||
[ 'name' => 'WebLite', 'id' => 'weblite', 'regexp' =>'/WebLite\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'WK Browser', 'id' => 'wk', 'regexp' => '/wkbrowser ([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://github.com/keanulee/WKBrowser
|
||||
[ 'name' => 'Yaani Browser', 'id' => 'yaani', 'regexp' => '/YaaniBrowser\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ], // see: https://www.yaani.com.tr/
|
||||
|
||||
/* Television browsers */
|
||||
[ 'name' => 'AltiBrowser', 'id' => 'alti', 'regexp' =>'/AltiBrowser\/([0-9.]*)/i' ],
|
||||
[ 'name' => 'Aplix', 'id' => 'aplix', 'regexp' =>'/Aplix_SANYO_browser\/([0-9](?:.[0-9.]+)?)/u' ], // browser for the Sega Saturn
|
||||
[ 'name' => 'AwoX', 'id' => 'awox', 'regexp' =>'/AwoX(?:\/([0-9.]*))? Browser/i' ],
|
||||
[ 'name' => 'Isis', 'id' => 'browserserver', 'regexp' =>'/BrowserServer/u' ],
|
||||
[ 'name' => 'Isis', 'id' => 'isis', 'regexp' =>'/ISIS\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Netbox', 'id' => 'netbox', 'regexp' =>'/Netbox\/([0-9.]*)/u', 'type' => Constants\DeviceType::TELEVISION ],
|
||||
[ 'name' => 'Spyglass', 'id' => 'spyglass', 'regexp' =>'/Spyglass ([0-9.]+); OpenTV/u' ],
|
||||
[ 'name' => 'Oregan Browser', 'id' => 'oregan', 'regexp' =>'/OreganMediaBrowser(?:\/([0-9.]*))?/u', 'details' => 2 ],
|
||||
[ 'name' => 'Viera Browser', 'id' => 'viera', 'regexp' =>'/Viera\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Zetakey', 'id' => 'zetakey', 'regexp' =>'/Zetakey Webkit\/([0-9.]*)/u', 'type' => Constants\DeviceType::TELEVISION ],
|
||||
[ 'name' => 'Zetakey', 'id' => 'zetakey', 'regexp' =>'/Zetakey\/([0-9.]*)/u', 'type' => Constants\DeviceType::TELEVISION ],
|
||||
|
||||
/* Gaming browsers */
|
||||
[ 'name' => 'Aplix', 'id' => 'aplix', 'regexp' =>'/Aplix_SEGASATURN_browser\/([0-9](?:.[0-9.]+)?)/u' ], // browser for the Sega Saturn
|
||||
[ 'name' => 'Bunjalloo', 'id' => 'bunjalloo', 'regexp' =>'/Bunjalloo\/([0-9.]*)/u' ], // browser for the Nintento DS
|
||||
[ 'name' => 'Nintendo Web Framework', 'id' => 'nwf', 'regexp' =>'/NWF\/([0-9.]*)/u', 'details' => 2 ], // browser for the Sega Dreamcast
|
||||
[ 'name' => 'Nuanti Meta', 'id' => 'nuanti', 'regexp' =>'/Nuanti(?:Meta)?\/([0-9.]*)/u' ], // browser for the PlayStation
|
||||
|
||||
/* Other browsers */
|
||||
[ 'name' => 'Wear Internet Browser','id' => 'wib', 'regexp' =>'/WIB\/([0-9.]*)/u' ],
|
||||
|
||||
/* PDF renderers */
|
||||
[ 'name' => 'Prince', 'id' => 'prince', 'regexp' =>'/Prince\/([0-9.]*)/u' ],
|
||||
|
||||
/* Unsorted */
|
||||
[ 'name' => 'Demobrowser', 'id' => 'demobrowser', 'regexp' =>'/demobrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Dooble', 'id' => 'dooble', 'regexp' =>'/Dooble(?:\/([0-9.]*))?/u' ], // see: http://dooble.sourceforge.net
|
||||
[ 'name' => 'DWB', 'id' => 'dwb', 'regexp' =>'/dwb(?:-hg)?(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'EVM Browser', 'id' => 'evm', 'regexp' =>'/EVMBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'FireWeb', 'id' => 'fireweb', 'regexp' =>'/FireWeb\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Hive Explorer', 'id' => 'hive', 'regexp' =>'/HiveE/u' ],
|
||||
[ 'name' => 'Intermec Browser', 'id' => 'intermec', 'regexp' =>'/Intermec\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Phantom', 'id' => 'phantom', 'regexp' =>'/Phantom\/V([0-9.]*)/u' ],
|
||||
[ 'name' => 'QtCreator', 'id' => 'qt', 'regexp' =>'/QtCreator\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'QtQmlViewer', 'id' => 'qt', 'regexp' =>'/QtQmlViewer/u' ],
|
||||
[ 'name' => 'QtMiniBrowser', 'id' => 'qt', 'regexp' =>'/QtMiniBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'QtTestBrowser', 'id' => 'qt', 'regexp' =>'/QtTestBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Roccat', 'id' => 'roccat', 'regexp' =>'/Roccat\/([0-9]\.[0-9.]*)/u' ],
|
||||
[ 'name' => 'Raven for Mac', 'id' => 'raven', 'regexp' =>'/Raven for Mac\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'RockMelt', 'id' => 'rockmelt', 'regexp' =>'/RockMelt\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Scope', 'id' => 'scope', 'regexp' =>'/Scope\/([0-9.]*)/u', 'details' => 2 ], // see: http://www.programmer.co.jp/scope.shtml
|
||||
[ 'name' => 'SlimBoat', 'id' => 'slim', 'regexp' =>'/SlimBoat\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'SlimBrowser', 'id' => 'slim', 'regexp' =>'/SlimBrowser(?:\/([0-9.]*))?/u' ],
|
||||
[ 'name' => 'SMBrowser', 'id' => 'smbrowser', 'regexp' =>'/SMBrowser/u' ],
|
||||
[ 'name' => 'Snowshoe', 'id' => 'snowshoe', 'regexp' =>'/Snowshoe\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Sputnik', 'id' => 'sputnik', 'regexp' =>'/Sputnik\/([0-9.]*)/iu', 'details' => 3 ],
|
||||
[ 'name' => 'Surf', 'id' => 'surf', 'regexp' =>'/Surf\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Taobao Browser', 'id' => 'tao', 'regexp' =>'/TaoBrowser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'TaomeeBrowser', 'id' => 'tao', 'regexp' =>'/TaomeeBrowser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'TazWeb', 'id' => 'taz', 'regexp' =>'/TazWeb/u' ],
|
||||
[ 'name' => 'Uzbl', 'id' => 'uzbl', 'regexp' =>'/^Uzbl/u' ],
|
||||
[ 'name' => 'Villanova', 'id' => 'villanova', 'regexp' =>'/Villanova\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Vimb', 'id' => 'vimb', 'regexp' =>'/vimb\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'WADA Browser', 'id' => 'wada', 'regexp' =>'/WadaBrowser\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Wavelink Velocity', 'id' => 'wavelink', 'regexp' =>'/Wavelink Velocity Browser\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'WebRender', 'id' => 'webrender', 'regexp' =>'/WebRender/u' ],
|
||||
[ 'name' => 'Webster', 'id' => 'webster', 'regexp' =>'/Webster ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Wyzo', 'id' => 'wyzo', 'regexp' =>'/Wyzo\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Yelang', 'id' => 'yelang', 'regexp' =>'/Yelang\/([0-9.]*)/u', 'details' => 3 ], // see: wellgo.org
|
||||
[ 'name' => 'YRC Weblink', 'id' => 'yrcweb', 'regexp' =>'/YRCWeblink\/([0-9.]*)/u' ],
|
||||
[ 'name' => '冲浪浏览器', 'id' => 'surf', 'regexp' =>'/CMSurfClient-Android/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::BROWSER_TEXT => [
|
||||
[ 'name' => 'CERN LineMode', 'id' => 'linemode', 'regexp' =>'/CERN-LineMode\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Lynx', 'id' => 'lynx', 'regexp' =>'/Lynx\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Lynx', 'id' => 'lynx', 'regexp' =>'/Lynx \(textmode\)/u' ],
|
||||
[ 'name' => 'ELinks', 'id' => 'links', 'regexp' =>'/E[Ll]inks(?:\/| \()([0-9.]*[0-9])/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Links', 'id' => 'links', 'regexp' =>'/Links \(([0-9.]*)/u' ],
|
||||
[ 'name' => 'w3m', 'id' => 'w3m', 'regexp' =>'/w3m\/([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::UNKNOWN => [
|
||||
[ 'name' => 'PhantomJS', 'id' => 'phantom', 'regexp' =>'/PhantomJS\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Nimbus', 'id' => 'nimbus', 'regexp' =>'/Nimbus\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'McAfee Web Gateway', 'id' => 'Webwasher', 'regexp' =>'/Webwasher\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Open Sankoré', 'id' => 'sankore', 'regexp' =>'/Open-Sankore\/([0-9.]*)/u', 'type' => Constants\DeviceType::WHITEBOARD ],
|
||||
[ 'name' => 'Adapi', 'id' => 'adapi', 'regexp' =>'/ ADAPI\/([0-9.]*)/u', 'hidden' => true, 'type' => Constants\DeviceType::SIGNAGE ],
|
||||
[ 'name' => 'BrightSign', 'id' => 'brightsign', 'regexp' =>'/BrightSign\/([0-9.]*)/u', 'type' => Constants\DeviceType::SIGNAGE ],
|
||||
[ 'name' => 'Coship MMCP', 'id' => 'coship', 'regexp' =>'/Coship_MMCP_([0-9.]*)/u', 'type' => Constants\DeviceType::SIGNAGE ],
|
||||
]
|
||||
];
|
||||
+156
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
Applications::$OTHERS = [
|
||||
|
||||
Constants\BrowserType::APP_MEDIAPLAYER => [
|
||||
[ 'name' => 'iTunes', 'id' => 'itunes', 'regexp' =>'/iTunes\/(?:xaa.)?([0-9.]*)/u' ],
|
||||
[ 'name' => 'iTunes', 'id' => 'itunes', 'regexp' =>'/iTunes-AppleTV\//u' ],
|
||||
[ 'name' => 'QuickTime', 'id' => 'qt', 'regexp' =>'/\(qtver=([0-9.]*);/u' ],
|
||||
[ 'name' => 'Bluefish', 'id' => 'bluefish', 'regexp' =>'/bluefish ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Nightingale', 'id' => 'nightingale', 'regexp' =>'/Nightingale\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Songbird', 'id' => 'songbird', 'regexp' =>'/Songbird\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Stagefright', 'id' => 'stagefright', 'regexp' =>'/stagefright\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'SubStream', 'id' => 'substream', 'regexp' =>'/SubStream\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'VLC', 'id' => 'vlc', 'regexp' =>'/VLC media player - version ([0-9.]*)/u' ],
|
||||
[ 'name' => 'VLC', 'id' => 'vlc', 'regexp' =>'/VLC\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Windows Media Player', 'id' => 'windows-media', 'regexp' =>'/Windows-Media-Player\/([0-9.]*)/u', 'details' => 1 ],
|
||||
[ 'name' => 'CorePlayer', 'id' => 'coreplayer', 'regexp' =>'/CorePlayer\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'FlyCast', 'id' => 'flycast', 'regexp' =>'/FlyCast\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Boxee', 'id' => 'boxee', 'regexp' => '/Boxee(?:\/([0-9.]*))?/u', 'type' => Constants\DeviceType::TELEVISION ],
|
||||
[ 'name' => 'Kodi', 'id' => 'kodi', 'regexp' => '/^Kodi\/([0-9.]+)/u', 'details' => 2 ],
|
||||
[ 'name' => 'XBMC', 'id' => 'xbmc', 'regexp' => '/^XBMC\/(?:PRE-)?([0-9.]+)/u', 'details' => 2 ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_EMAIL => [
|
||||
[ 'name' => 'Lightning', 'id' => 'lightning', 'regexp' =>'/Lightning\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Thunderbird', 'id' => 'thunderbird', 'regexp' =>'/Thunderbird[\/ ]([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Microsoft Outlook', 'id' => 'outlook', 'regexp' =>'/Microsoft Outlook IMO, Build ([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Microsoft Outlook', 'id' => 'outlook', 'regexp' =>'/Microsoft Outlook ([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Microsoft Outlook Express', 'id' => 'outlook', 'regexp' =>'/Outlook-Express\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Lotus Notes', 'id' => 'lotus', 'regexp' =>'/Lotus-Notes\/([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Postbox', 'id' => 'postbox', 'regexp' =>'/Postbox[\/ ]([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'The Bat!', 'id' => 'bat', 'regexp' =>'/The Bat! ([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Yahoo Mail', 'id' => 'yahoo', 'regexp' =>'/YahooMobile\/1.0 \(mail; ([0-9.]+)\)/u', 'details' => 3 ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_NEWS => [
|
||||
[ 'name' => 'Daum', 'id' => 'daum', 'regexp' =>'/DaumApps\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Daum', 'id' => 'daum', 'regexp' =>'/daumcafe\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Flipboard', 'id' => 'flipboard', 'regexp' =>'/Flipboard\/([0-9.]+)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_FEEDREADER => [
|
||||
[ 'name' => 'Akregator', 'id' => 'akregator', 'regexp' =>'/Akregator\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Blogos', 'id' => 'blogos', 'regexp' =>'/Blogos\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Cococ', 'id' => 'cococ', 'regexp' =>'/cococ\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'FeedDemon', 'id' => 'feed', 'regexp' =>'/FeedDemon\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Feeddler', 'id' => 'feed', 'regexp' =>'/FeeddlerRSS[ \/]([0-9.]*)/u' ],
|
||||
[ 'name' => 'Feeddler Pro', 'id' => 'feed', 'regexp' =>'/FeeddlerPro\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Liferea', 'id' => 'liferea', 'regexp' =>'/Liferea\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'NewsBlur', 'id' => 'news', 'regexp' =>'/NewsBlur\/([0-9.]*)/u', 'type' => Constants\DeviceType::MOBILE ],
|
||||
[ 'name' => 'Newsbeuter', 'id' => 'news', 'regexp' =>'/newsbeuter\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'JetBrains Omea Reader','id' => 'jetbrains', 'regexp' =>'/JetBrains Omea Reader ([0-9.]*)/u' ],
|
||||
[ 'name' => 'RSS Bandit', 'id' => 'rss', 'regexp' =>'/RssBandit\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'RSS Junkie', 'id' => 'rss', 'regexp' =>'/RSS Junkie Daemon/u' ],
|
||||
[ 'name' => 'RSS Owl', 'id' => 'rss', 'regexp' =>'/RSSOwl\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Reeder', 'id' => 'reeder', 'regexp' =>'/Reeder\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'ReedKit', 'id' => 'reedkit', 'regexp' =>'/ReedKit\/([0-9.]*)/u', 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'Rome', 'id' => 'rome', 'regexp' =>'/Rome Client/u' ],
|
||||
[ 'name' => 'jsRSS++', 'id' => 'rss', 'regexp' =>'/jsRSS++\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Windows RSS Platorm', 'id' => 'rss', 'regexp' =>'/Windows-RSS-Platform\/([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_PODCAST => [
|
||||
[ 'name' => 'Ziepod', 'id' => 'ziepod', 'regexp' =>'/Ziepod\+? ([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_CHAT => [
|
||||
[ 'name' => 'Facebook Messenger', 'id' => 'messenger', 'regexp' =>'/FBAN\/MessengerForiOS/u' ],
|
||||
[ 'name' => 'Facebook Messenger', 'id' => 'messenger', 'regexp' =>'/FB_IAB\/MESSENGER/u' ],
|
||||
[ 'name' => 'KakaoTalk', 'id' => 'kakao', 'regexp' => '/KAKAOTALK ([0-9.]*)/u' ],
|
||||
[ 'name' => 'KakaoTalk', 'id' => 'kakao', 'regexp' => '/KAKAOTALK/u' ],
|
||||
[ 'name' => 'Kik', 'id' => 'kik', 'regexp' =>'/Kik\/([0-9.]*?)(\.0)?\.[0-9]{3,4}/u' ],
|
||||
[ 'name' => 'Line', 'id' => 'line', 'regexp' => '/ Line\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Slack', 'id' => 'slack', 'regexp' => '/ Slack_SSB\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Viber', 'id' => 'viber', 'regexp' => '/ Viber/u' ],
|
||||
[ 'name' => 'Viber', 'id' => 'viber', 'regexp' => '/Viber\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'WeChat', 'id' => 'messenger', 'regexp' =>'/MicroMessenger\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'WhatsApp', 'id' => 'whatsapp', 'regexp' =>'/WhatsApp\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Wire', 'id' => 'wire', 'regexp' =>'/Wire\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yahoo Messenger', 'id' => 'yahoo', 'regexp' =>'/YahooMobile\/1.0 \(im; ([0-9.]+)\)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Yammer', 'id' => 'yammer', 'regexp' =>'/Yammer\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Zalo', 'id' => 'zalo', 'regexp' => '/Zalo-win32-([0-9.]*)/u' ],
|
||||
[ 'name' => 'Zalo', 'id' => 'zalo', 'regexp' => '/ Zalo\/([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_SOCIAL => [
|
||||
[ 'name' => 'Facebook', 'id' => 'fbios', 'regexp' =>'/FBAN\/FBIOS/u' ],
|
||||
[ 'name' => 'Facebook', 'id' => 'fb4a', 'regexp' =>'/FBAN\/FB4A/u' ],
|
||||
[ 'name' => 'Facebook', 'id' => 'fb4a', 'regexp' =>'/FB_IAB\/FB4A/u' ],
|
||||
[ 'name' => 'Google+', 'id' => 'googleplus', 'regexp' =>'/com.google.GooglePlus/u' ],
|
||||
[ 'name' => 'Instagram', 'id' => 'instagram', 'regexp' =>'/Instagram ([0-9.]+)/u' ],
|
||||
[ 'name' => 'Pinterest', 'id' => 'pinterest', 'regexp' =>'/\[Pinterest\/(Android|iOS)\]/u' ],
|
||||
[ 'name' => 'Pinterest', 'id' => 'pinterest', 'regexp' =>'/Pinterest\/[0-9.]+/u' ],
|
||||
[ 'name' => 'Sina Weibo', 'id' => 'weibo', 'regexp' =>'/weibo__([0-9.]*)/u' ],
|
||||
[ 'name' => 'Tumblr', 'id' => 'tumblr', 'regexp' =>'/Tumblr\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Twitter', 'id' => 'twitter', 'regexp' =>'/TwitterAndroid/u' ],
|
||||
[ 'name' => 'Twitter', 'id' => 'twitter', 'regexp' =>'/Twitter for iPhone/u' ],
|
||||
[ 'name' => 'WordPress', 'id' => 'wp-android', 'regexp' =>'/wp-android\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yelp', 'id' => 'yelp', 'regexp' =>'/YelpApp\/([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_OFFICE => [
|
||||
[ 'name' => 'LibreOffice', 'id' => 'office', 'regexp' =>'/LibreOffice/u' ],
|
||||
[ 'name' => 'Microsoft Office', 'id' => 'office', 'regexp' =>'/MSOffice ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Microsoft Office', 'id' => 'office', 'regexp' =>'/Microsoft Office Mobile ?\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Microsoft Excel', 'id' => 'office', 'regexp' =>'/Microsoft Office Excel ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Microsoft OneNote', 'id' => 'office', 'regexp' =>'/Microsoft Office OneNote ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Microsoft PowerPoint', 'id' => 'office', 'regexp' =>'/Microsoft Office PowerPoint ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Microsoft Word', 'id' => 'office', 'regexp' =>'/Microsoft Office Word ([0-9.]*)/u' ],
|
||||
[ 'name' => 'OpenOffice', 'id' => 'office', 'regexp' =>'/OpenOffice\/([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_SEARCH => [
|
||||
[ 'name' => 'Bing Search', 'id' => 'bingweb', 'regexp' =>'/BingWeb\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Baidu Hao123', 'id' => 'hao123', 'regexp' =>'/hao123\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Google Search', 'id' => 'gsa', 'regexp' =>'/GSA\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'NAVER', 'id' => 'naver', 'regexp' =>'/NAVER\(inapp; search; [0-9]+; ([0-9.]*)\)/u' ],
|
||||
[ 'name' => 'Sogou Search', 'id' => 'sogousearch', 'regexp' =>'/SogouSearch Android(?:[0-9.]*) version([0-9.]*)/u' ],
|
||||
[ 'name' => 'Yandex Search', 'id' => 'yandex', 'regexp' =>'/YandexSearch\/([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_EDITOR => [
|
||||
[ 'name' => 'Atom', 'id' => 'atom', 'regexp' =>'/Atom\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Adobe GoLive', 'id' => 'golive', 'regexp' =>'/GoLive ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Brackets', 'id' => 'brackets', 'regexp' =>'/Brackets\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'iWeb', 'id' => 'iweb', 'regexp' =>'/(?:^| )iWeb\/([0-9])/u' ],
|
||||
[ 'name' => 'Microsoft FrontPage', 'id' => 'frontpage', 'regexp' =>'/MS ?FrontPage[ \/]([0-9.]*)/u', 'details' => 2, 'type' => Constants\DeviceType::DESKTOP ],
|
||||
[ 'name' => 'W3C Amaya', 'id' => 'amaya', 'regexp' =>'/amaya\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'IBM WebSphere Homepage Builder', 'id' => 'websphere', 'regexp' =>'/IBM WebSphere Homepage Builder V([0-9.]*)/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_DOWNLOAD => [
|
||||
[ 'name' => 'Download Manager', 'id' => 'download', 'regexp' =>'/AndroidDownloadManager\//u' ],
|
||||
[ 'name' => 'Tanso Download Manager', 'id' => 'tansodl', 'regexp' =>'/TansoDL/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP_GAME => [
|
||||
[ 'name' => 'EA Origin', 'id' => 'origin', 'regexp' =>'/Origin\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'SecondLife', 'id' => 'secondlife', 'regexp' =>'/SecondLife\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Valve Steam', 'id' => 'valve', 'regexp' =>'/Valve Steam/u' ],
|
||||
[ 'name' => 'Raptr', 'id' => 'raptr', 'regexp' =>'/Raptr/u' ],
|
||||
],
|
||||
|
||||
Constants\BrowserType::APP => [
|
||||
[ 'name' => 'AliPay', 'id' => 'alipay', 'regexp' =>'/AlipayClient\/([0-9.]*)/u', 'details' => 3 ],
|
||||
[ 'name' => 'Cooliris', 'id' => 'cooliris', 'regexp' =>'/Cooliris\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Google Earth', 'id' => 'google', 'regexp' =>'/Google Earth\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Google Desktop', 'id' => 'google', 'regexp' =>'/Google Desktop\/([0-9.]*)/u', 'details' => 2 ],
|
||||
[ 'name' => 'Leechcraft', 'id' => 'leechcraft', 'regexp' =>'/Leechcraft(?:\/([0-9.]*))?/u', 'details' => 2 ],
|
||||
[ 'name' => 'Lotus Expeditor', 'id' => 'expeditor', 'regexp' =>'/Gecko Expeditor ([0-9.]*)/u', 'details' => 3 ],
|
||||
]
|
||||
];
|
||||
+214
@@ -0,0 +1,214 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
Chrome::$DESKTOP = [
|
||||
'0.2.149' => 'beta',
|
||||
'0.3.154' => 'beta',
|
||||
'0.4.154' => 'beta',
|
||||
'1.0.154' => 'stable',
|
||||
'2.0.172' => 'stable',
|
||||
'3.0.195' => 'stable',
|
||||
'4.0.249' => 'stable',
|
||||
'4.1.249' => 'stable',
|
||||
'5.0.375' => 'stable',
|
||||
'6.0.472' => 'stable',
|
||||
'7.0.517' => 'stable',
|
||||
'8.0.552' => 'stable',
|
||||
'9.0.597' => 'stable',
|
||||
'10.0.648' => 'stable',
|
||||
'11.0.696' => 'stable',
|
||||
'12.0.742' => 'stable',
|
||||
'13.0.782' => 'stable',
|
||||
'14.0.835' => 'stable',
|
||||
'15.0.874' => 'stable',
|
||||
'16.0.912' => 'stable',
|
||||
'17.0.963' => 'stable',
|
||||
'18.0.1025' => 'stable',
|
||||
'19.0.1084' => 'stable',
|
||||
'20.0.1132' => 'stable',
|
||||
'21.0.1180' => 'stable',
|
||||
'22.0.1229' => 'stable',
|
||||
'23.0.1271' => 'stable',
|
||||
'24.0.1312' => 'stable',
|
||||
'25.0.1364' => 'stable',
|
||||
'26.0.1410' => 'stable',
|
||||
'27.0.1453' => 'stable',
|
||||
'28.0.1500' => 'stable',
|
||||
'29.0.1547' => 'stable',
|
||||
'30.0.1599' => 'stable',
|
||||
'31.0.1650' => 'stable',
|
||||
'32.0.1700' => 'stable',
|
||||
'33.0.1750' => 'stable',
|
||||
'34.0.1847' => 'stable',
|
||||
'35.0.1916' => 'stable',
|
||||
'36.0.1985' => 'stable',
|
||||
'37.0.2062' => 'stable',
|
||||
'38.0.2125' => 'stable',
|
||||
'39.0.2171' => 'stable',
|
||||
'40.0.2214' => 'stable',
|
||||
'41.0.2272' => 'stable',
|
||||
'42.0.2311' => 'stable',
|
||||
'43.0.2357' => 'stable',
|
||||
'44.0.2403' => 'stable',
|
||||
'45.0.2454' => 'stable',
|
||||
'46.0.2490' => 'stable',
|
||||
'47.0.2526' => 'stable',
|
||||
'48.0.2564' => 'stable',
|
||||
'49.0.2623' => 'stable',
|
||||
'50.0.2661' => 'stable',
|
||||
'51.0.2704' => 'stable',
|
||||
'52.0.2743' => 'stable',
|
||||
'53.0.2785' => 'stable',
|
||||
'54.0.2840' => 'stable',
|
||||
'55.0.2883' => 'stable',
|
||||
'56.0.2924' => 'stable',
|
||||
'57.0.2987' => 'stable',
|
||||
'58.0.3029' => 'stable',
|
||||
'59.0.3071' => 'stable',
|
||||
'60.0.3112' => 'stable',
|
||||
'61.0.3163' => 'stable',
|
||||
'62.0.3202' => 'stable',
|
||||
'63.0.3239' => 'stable',
|
||||
'64.0.3282' => 'stable',
|
||||
'65.0.3325' => 'stable',
|
||||
'66.0.3359' => 'stable',
|
||||
'67.0.3396' => 'stable',
|
||||
'68.0.3440' => 'stable',
|
||||
'69.0.3497' => 'stable',
|
||||
'72.0.3626' => 'stable',
|
||||
'73.0.3683' => 'stable',
|
||||
'74.0.3729' => 'stable',
|
||||
'75.0.3770' => 'stable',
|
||||
'76.0.3809' => 'stable',
|
||||
'77.0.3865' => 'stable',
|
||||
'78.0.3904' => 'stable',
|
||||
'79.0.3945' => 'stable',
|
||||
'80.0.3987' => 'stable',
|
||||
'81.0.4044' => 'stable',
|
||||
'83.0.4103' => 'stable',
|
||||
'84.0.4147' => 'stable',
|
||||
'85.0.4183' => 'stable',
|
||||
'86.0.4240' => 'stable',
|
||||
'87.0.4280' => 'stable',
|
||||
'88.0.4324' => 'stable',
|
||||
'89.0.4389' => 'stable',
|
||||
'90.0.4430' => 'stable',
|
||||
'91.0.4472' => 'stable',
|
||||
'92.0.4515' => 'stable',
|
||||
'93.0.4577' => 'stable',
|
||||
'94.0.4606' => 'stable',
|
||||
'95.0.4638' => 'stable',
|
||||
'96.0.4664' => 'stable',
|
||||
'97.0.4692' => 'stable',
|
||||
'98.0.4758' => 'stable',
|
||||
'99.0.4844' => 'stable',
|
||||
'100.0.4896' => 'stable',
|
||||
'101.0.4951' => 'stable',
|
||||
'102.0.5005' => 'stable',
|
||||
'103.0.5060' => 'stable',
|
||||
'104.0.5112' => 'stable',
|
||||
'105.0.5195' => 'stable',
|
||||
'106.0.5249' => 'stable',
|
||||
'107.0.5304' => 'stable',
|
||||
'108.0.5359' => 'stable',
|
||||
'109.0.5414' => 'stable',
|
||||
'110.0.5481' => 'stable',
|
||||
'111.0.5563' => 'stable',
|
||||
'112.0.5615' => 'stable',
|
||||
'113.0.5672' => 'stable',
|
||||
'114.0.5735' => 'stable',
|
||||
'115.0.5790' => 'stable'
|
||||
];
|
||||
|
||||
Chrome::$MOBILE = [
|
||||
'16.0.912' => 'beta',
|
||||
'18.0.1025' => 'stable',
|
||||
'25.0.1364' => 'stable',
|
||||
'27.0.1453' => 'stable',
|
||||
'29.0.1547' => 'stable',
|
||||
'30.0.1599' => 'stable',
|
||||
'31.0.1650' => 'stable',
|
||||
'32.0.1700' => 'stable',
|
||||
'33.0.1750' => 'stable',
|
||||
'34.0.1847' => 'stable',
|
||||
'35.0.1916' => 'stable',
|
||||
'36.0.1985' => 'stable',
|
||||
'37.0.2062' => 'stable',
|
||||
'38.0.2125' => 'stable',
|
||||
'39.0.2171' => 'stable',
|
||||
'40.0.2214' => 'stable',
|
||||
'41.0.2272' => 'stable',
|
||||
'42.0.2311' => 'stable',
|
||||
'43.0.2357' => 'stable',
|
||||
'44.0.2403' => 'stable',
|
||||
'45.0.2454' => 'stable',
|
||||
'46.0.2490' => 'stable',
|
||||
'47.0.2526' => 'stable',
|
||||
'48.0.2564' => 'stable',
|
||||
'49.0.2623' => 'stable',
|
||||
'50.0.2661' => 'stable',
|
||||
'51.0.2704' => 'stable',
|
||||
'52.0.2743' => 'stable',
|
||||
'53.0.2785' => 'stable',
|
||||
'54.0.2840' => 'stable',
|
||||
'55.0.2883' => 'stable',
|
||||
'56.0.2924' => 'stable',
|
||||
'57.0.2987' => 'stable',
|
||||
'58.0.3029' => 'stable',
|
||||
'59.0.3071' => 'stable',
|
||||
'60.0.3112' => 'stable',
|
||||
'61.0.3163' => 'stable',
|
||||
'62.0.3202' => 'stable',
|
||||
'63.0.3239' => 'stable',
|
||||
'64.0.3282' => 'stable',
|
||||
'65.0.3325' => 'stable',
|
||||
'66.0.3359' => 'stable',
|
||||
'67.0.3396' => 'stable',
|
||||
'68.0.3440' => 'stable',
|
||||
'69.0.3497' => 'stable',
|
||||
'70.0.3538' => 'stable',
|
||||
'71.0.3578' => 'stable',
|
||||
'72.0.3626' => 'stable',
|
||||
'73.0.3683' => 'stable',
|
||||
'74.0.3729' => 'stable',
|
||||
'75.0.3770' => 'stable',
|
||||
'76.0.3809' => 'stable',
|
||||
'77.0.3865' => 'stable',
|
||||
'78.0.3904' => 'stable',
|
||||
'79.0.3945' => 'stable',
|
||||
'80.0.3987' => 'stable',
|
||||
'83.0.4103' => 'stable',
|
||||
'84.0.4147' => 'stable',
|
||||
'85.0.4183' => 'stable',
|
||||
'86.0.4240' => 'stable',
|
||||
'87.0.4280' => 'stable',
|
||||
'88.0.4324' => 'stable',
|
||||
'89.0.4389' => 'stable',
|
||||
'90.0.4430' => 'stable',
|
||||
'91.0.4472' => 'stable',
|
||||
'92.0.4515' => 'stable',
|
||||
'93.0.4577' => 'stable',
|
||||
'94.0.4606' => 'stable',
|
||||
'95.0.4638' => 'stable',
|
||||
'96.0.4664' => 'stable',
|
||||
'97.0.4692' => 'stable',
|
||||
'98.0.4758' => 'stable',
|
||||
'99.0.4844' => 'stable',
|
||||
'100.0.4896' => 'stable',
|
||||
'101.0.4951' => 'stable',
|
||||
'102.0.5005' => 'stable',
|
||||
'103.0.5060' => 'stable',
|
||||
'104.0.5112' => 'stable',
|
||||
'105.0.5195' => 'stable',
|
||||
'106.0.5249' => 'stable',
|
||||
'107.0.5304' => 'stable',
|
||||
'108.0.5359' => 'stable',
|
||||
'109.0.5414' => 'stable',
|
||||
'110.0.5481' => 'stable',
|
||||
'111.0.5563' => 'stable',
|
||||
'112.0.5615' => 'stable',
|
||||
'113.0.5672' => 'stable',
|
||||
'114.0.5735' => 'stable',
|
||||
'115.0.5790' => 'stable'
|
||||
];
|
||||
Executable
+244
@@ -0,0 +1,244 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
BuildIds::$ANDROID_BUILDS = [
|
||||
'CUPCAKE' => '1.5',
|
||||
'DONUT' => '1.6',
|
||||
'ECLAIR' => '2.0',
|
||||
'FROYO' => '2.2',
|
||||
'GINGERBREAD' => '2.3',
|
||||
|
||||
'DRC83' => '1.6',
|
||||
'DRC92' => '1.6',
|
||||
'DRD08' => '1.6',
|
||||
'DRD20' => '1.6',
|
||||
'DMD64' => '1.6',
|
||||
'ESD20' => '2.0',
|
||||
'ESD56' => '2.0.1',
|
||||
'ERD79' => '2.1',
|
||||
'ERE27' => '2.1',
|
||||
'EPE54B' => '2.1',
|
||||
'ESE81' => '2.1',
|
||||
'EPF21B' => '2.1',
|
||||
'FRF85B' => '2.2',
|
||||
'FRF91' => '2.2',
|
||||
'FRG01B' => '2.2',
|
||||
'FRG22D' => '2.2',
|
||||
'FRG83' => '2.2.1',
|
||||
'FRG83D' => '2.2.1',
|
||||
'FRG83G' => '2.2.2',
|
||||
'FRK76' => '2.2.3',
|
||||
'FRK76C' => '2.2.3',
|
||||
'GRH55' => '2.3',
|
||||
'GRH78' => '2.3.1',
|
||||
'GRH78C' => '2.3.2',
|
||||
'GRI40' => '2.3.3',
|
||||
'GRI54' => '2.3.3',
|
||||
'GRJ06D' => '2.3.4',
|
||||
'GRJ22' => '2.3.4',
|
||||
'GRJ90' => '2.3.5',
|
||||
'GRK39C' => '2.3.6',
|
||||
'GRK39F' => '2.3.6',
|
||||
'GWK74' => '2.3.7',
|
||||
|
||||
'HRI39' => '3.0',
|
||||
'HRI66' => '3.0',
|
||||
'HWI69' => '3.0',
|
||||
'HRI83' => '3.0',
|
||||
'HMJ37' => '3.1',
|
||||
'HTJ85B' => '3.2',
|
||||
'HTK55D' => '3.2.1',
|
||||
'HTK75' => '3.2.1',
|
||||
'HTK75D' => '3.2.1',
|
||||
'HLK75C' => '3.2.2',
|
||||
'HLK75D' => '3.2.2',
|
||||
'HLK75F' => '3.2.4',
|
||||
'HLK75H' => '3.2.6',
|
||||
|
||||
'ITL41D' => '4.0.1',
|
||||
'ITL41E' => '4.0.1',
|
||||
'ITL41F' => '4.0.1',
|
||||
'ICL53F' => '4.0.2',
|
||||
'IML74K' => '4.0.3',
|
||||
'IML77' => '4.0.3',
|
||||
'IMM76' => '4.0.4',
|
||||
'IMM76D' => '4.0.4',
|
||||
'IMM76I' => '4.0.4',
|
||||
'IMM76K' => '4.0.4',
|
||||
'IMM76L' => '4.0.4',
|
||||
'JRO03C' => '4.1.1',
|
||||
'JRO03D' => '4.1.1',
|
||||
'JRO03E' => '4.1.1',
|
||||
'JRO03H' => '4.1.1',
|
||||
'JRO03L' => '4.1.1',
|
||||
'JRO03O' => '4.1.1',
|
||||
'JRO03R' => '4.1.1',
|
||||
'JRO03S' => '4.1.1',
|
||||
'JZO54K' => '4.1.2',
|
||||
'JZO54M' => '4.1.2',
|
||||
'JVP15S' => '4.2', // Interim build used by the Nexus 7
|
||||
'JOP40C' => '4.2',
|
||||
'JOP40D' => '4.2.1',
|
||||
'JOP40F' => '4.2.1',
|
||||
'JOP40G' => '4.2.1',
|
||||
'JDQ39' => '4.2.2',
|
||||
'JDQ39B' => '4.2.2',
|
||||
'JDQ39E' => '4.2.2',
|
||||
'JWR66L' => '4.3',
|
||||
'JWR66N' => '4.3',
|
||||
'JWR66N.S005' => '4.3', // Google Play Edition - Samsung Galaxy S4
|
||||
'JWR66V' => '4.3',
|
||||
'JWR66V.H10' => '4.3', // Google Play Edition - HTC One
|
||||
'JWR66V.S014' => '4.3', // Google Play Edition - Samsung Galaxy S4
|
||||
'JWR66Y' => '4.3',
|
||||
'JWR66Y.S003' => '4.3', // Google Play Edition - Samsung Galaxy S4
|
||||
'JSR78D' => '4.3',
|
||||
'JSS15J' => '4.3',
|
||||
'JSS15Q' => '4.3',
|
||||
'KRT16S' => '4.4',
|
||||
'KRT16M' => '4.4',
|
||||
'KOT49E' => '4.4.1',
|
||||
'KOT49H' => '4.4.2',
|
||||
'KVT49L' => '4.4.2',
|
||||
'KTU84L' => '4.4.3',
|
||||
'KTU84M' => '4.4.3',
|
||||
'KTU84P' => '4.4.4',
|
||||
|
||||
'LPV79' => ['value' => '5.0', 'alias' => 'L'],
|
||||
'LPV81C' => ['value' => '5.0', 'alias' => 'L'],
|
||||
'LPX13D' => ['value' => '5.0', 'alias' => 'L'],
|
||||
|
||||
'LRX21L' => '5.0',
|
||||
'LRX21M' => '5.0',
|
||||
'LRX21O' => '5.0',
|
||||
'LRX21P' => '5.0',
|
||||
'LRX21Q' => '5.0',
|
||||
'LRX21R' => '5.0',
|
||||
'LRX21T' => '5.0',
|
||||
'LRX21V' => '5.0',
|
||||
'LRX22C' => '5.0.1',
|
||||
'LRX22G' => '5.0.2',
|
||||
'LRX22L' => '5.0.2',
|
||||
'LGZ23.S3' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGZ23.S15' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGZ23.S37' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGZ23.S49' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGZ23.S55' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGZ23.S59' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGZ23.S61' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGZ23.S73' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGY70.S1' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGY75.S91' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGY75.S105' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGY75.S109' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGY75.S131' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGY75.S143' => '5.0.2', // Sony Bravia Android TV
|
||||
'LGY75.S147' => '5.0.2', // Sony Bravia Android TV
|
||||
'LMY47D' => '5.1',
|
||||
'LMY47E' => '5.1',
|
||||
'LMY47I' => '5.1',
|
||||
'LMY47M' => '5.1',
|
||||
'LMY47O' => '5.1',
|
||||
'LMY47V' => '5.1.1',
|
||||
'LMY47X' => '5.1.1',
|
||||
'LMY47Z' => '5.1.1',
|
||||
'LMY48B' => '5.1.1',
|
||||
'LMY48E.S1' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S39' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S63' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S81' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S89' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S91' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S117' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S127' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S143' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S153' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S155' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S167' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S185' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S191' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S195' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S197' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48E.S223' => '5.1.1', // Sony Bravia Android TV
|
||||
'LMY48B' => '5.1.1',
|
||||
'LMY48G' => '5.1.1',
|
||||
'LMY48I' => '5.1.1',
|
||||
'LMY48J' => '5.1.1',
|
||||
'LMY48M' => '5.1.1',
|
||||
'LMY48N' => '5.1.1',
|
||||
'LMY48P' => '5.1.1',
|
||||
'LMY48T' => '5.1.1',
|
||||
'LMY48U' => '5.1.1',
|
||||
'LMY48W' => '5.1.1',
|
||||
'LMY48X' => '5.1.1',
|
||||
'LMY48Y' => '5.1.1',
|
||||
'LMY48Z' => '5.1.1',
|
||||
'LMY49F' => '5.1.1',
|
||||
'LMY49G' => '5.1.1',
|
||||
'LMY49H' => '5.1.1',
|
||||
'LMY49I' => '5.1.1',
|
||||
'LMY49J' => '5.1.1',
|
||||
'LVY48C' => '5.1.1',
|
||||
'LVY48E' => '5.1.1',
|
||||
'LVY48F' => '5.1.1',
|
||||
'LVY48H' => '5.1.1',
|
||||
'LYZ28E' => '5.1.1',
|
||||
'LYZ28J' => '5.1.1',
|
||||
'LYZ28K' => '5.1.1',
|
||||
'LYZ28M' => '5.1.1',
|
||||
'LYZ28N' => '5.1.1',
|
||||
|
||||
'MPZ44Q' => ['value' => '6.0', 'alias' => 'M'],
|
||||
'MPZ79M' => ['value' => '6.0', 'alias' => 'M'],
|
||||
|
||||
'MRA58K' => '6.0',
|
||||
'MRA58N' => '6.0',
|
||||
'MRA58U' => '6.0',
|
||||
'MRA58V' => '6.0',
|
||||
'MRA58X' => '6.0',
|
||||
'MRA59B' => '6.0',
|
||||
'MDA89D' => '6.0',
|
||||
'MDA89E' => '6.0',
|
||||
'MDB08I' => '6.0',
|
||||
'MDB08K' => '6.0',
|
||||
'MDB08L' => '6.0',
|
||||
'MDB08M' => '6.0',
|
||||
'MMB29N' => '6.0',
|
||||
'MMB29K' => '6.0.1',
|
||||
'MMB29M' => '6.0.1',
|
||||
'MMB29O' => '6.0.1',
|
||||
'MMB29P' => '6.0.1',
|
||||
'MMB29S' => '6.0.1',
|
||||
'MMB29T' => '6.0.1',
|
||||
'MMB29Q' => '6.0.1',
|
||||
'MMB29R' => '6.0.1',
|
||||
'MMB29U' => '6.0.1',
|
||||
'MMB29V' => '6.0.1',
|
||||
'MMB29X' => '6.0.1',
|
||||
'MHC19I' => '6.0.1',
|
||||
'MHC19J' => '6.0.1',
|
||||
'MHC19Q' => '6.0.1',
|
||||
'MOB30D' => '6.0.1',
|
||||
'MOB30G' => '6.0.1',
|
||||
'MOB30H' => '6.0.1',
|
||||
'MOB30I' => '6.0.1',
|
||||
'MOB30J' => '6.0.1',
|
||||
'MTC19T' => '6.0.1',
|
||||
'MXB48J' => '6.0.1',
|
||||
'MXB48K' => '6.0.1',
|
||||
'MXB48T' => '6.0.1',
|
||||
'MXC14G' => '6.0.1',
|
||||
'MXC89F' => '6.0.1',
|
||||
'M5C14J' => '6.0.1',
|
||||
|
||||
'NPC56P' => ['value' => '7.0', 'alias' => 'N'],
|
||||
'NPC56W' => ['value' => '7.0', 'alias' => 'N'],
|
||||
'NPC56X' => ['value' => '7.0', 'alias' => 'N'],
|
||||
'NPC91K' => ['value' => '7.0', 'alias' => 'N'],
|
||||
'NPD35K' => ['value' => '7.0', 'alias' => 'N'],
|
||||
'NRD21D' => ['value' => '7.0', 'alias' => 'N'],
|
||||
'NRD28C' => ['value' => '7.0', 'alias' => 'N'],
|
||||
];
|
||||
|
||||
// Source: http://source.android.com/source/build-numbers.html
|
||||
Executable
+323
@@ -0,0 +1,323 @@
|
||||
<?php
|
||||
|
||||
/* This file is automatically generated, do not edit manually! */
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
BrowserIds::$ANDROID_BROWSERS = [
|
||||
'com.agilebits.onepassword' => '1Password',
|
||||
'com.browser2345' => '2345 Browser',
|
||||
'com.browser2345_ucc' => '2345 Browser',
|
||||
'com.browser2345hd' => '2345 Browser HD',
|
||||
'air.stage.web.view' => 'Adobe AIR',
|
||||
'air.stagewebview' => 'Adobe AIR',
|
||||
'air.StageWebViewBridgeTest.debug' => 'Adobe AIR',
|
||||
'air.StageWebViewVideo.debug' => 'Adobe AIR',
|
||||
'com.adobe.phonegap.app' => 'Adobe Phonegap',
|
||||
'com.adobe.reader' => 'Adobe Reader',
|
||||
'com.adobe.shadow.android' => 'Adobe Shadow',
|
||||
'com.airwatch.browser' => 'AirWatch Browser',
|
||||
'com.aliyun.mobile.browser' => 'Aliyun Browser',
|
||||
'net.adgjm.angel' => 'Angel Browser',
|
||||
'com.apc.browser' => 'APC',
|
||||
'com.apc.browser.standard' => 'APC',
|
||||
'com.apc.browser.standard6j8s' => 'APC',
|
||||
'com.apusapps.browser' => 'APUS Browser',
|
||||
'com.apusapps.browser.lark' => 'APUS Browser',
|
||||
'com.apusapps.browser.turbo' => 'APUS Browser',
|
||||
'com.asus.browser' => 'Asus Browser',
|
||||
'com.wAuroraWebBrowser' => 'Aurora Web Browser',
|
||||
'bdmobile.android.app' => 'Baidu Browser',
|
||||
'com.baidu.blink.testapp' => 'Baidu Browser',
|
||||
'com.baidu.blink.v38' => 'Baidu Browser',
|
||||
'com.baidu.browser.apps' => 'Baidu Browser',
|
||||
'com.baidu.browser.apps.lite' => 'Baidu Browser',
|
||||
'com.baidu.browser.apps_mr' => 'Baidu Browser',
|
||||
'com.baidu.browser.apps_neo' => 'Baidu Browser',
|
||||
'com.baidu.browser.apps_sj' => 'Baidu Browser',
|
||||
'com.baidu.browser.apps_yt' => 'Baidu Browser',
|
||||
'com.baidu.browser.app_bw' => 'Baidu Browser',
|
||||
'com.baidu.browser.blink.apps' => 'Baidu Browser',
|
||||
'com.baidu.browser.brower' => 'Baidu Browser',
|
||||
'com.baidu.browser.chrome' => 'Baidu Browser',
|
||||
'com.baidu.browser.inter' => 'Baidu Browser',
|
||||
'com.baidu.browser.inter.mini' => 'Baidu Browser',
|
||||
'com.baidu.browser.interyb' => 'Baidu Browser',
|
||||
'com.baidu.browser.lab' => 'Baidu Browser',
|
||||
'com.baidu.browser.pad' => 'Baidu Browser',
|
||||
'com.baidu.browserhd.inter' => 'Baidu Browser',
|
||||
'com.baidu.demo.webview' => 'Baidu Browser',
|
||||
'com.baidu.hi' => 'Baidu Browser',
|
||||
'com.baidu.searchbox' => 'Baidu Browser',
|
||||
'com.baidu.searchbox.pad' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_bbk' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_coolpad' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_gionee' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_hisense' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_htc' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_huawei' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_ktouch' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_lenovo' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_oppo' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_samsung' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_sj' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_sony' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_tianyi' => 'Baidu Browser',
|
||||
'com.baidu.searchbox_zte' => 'Baidu Browser',
|
||||
'com.baidu.zeustest' => 'Baidu Browser',
|
||||
'com.wBestBrowser' => 'Best Browser',
|
||||
'com.boatbrowser.free' => 'Boat Browser',
|
||||
'com.boatbrowser.tablet' => 'Boat Browser',
|
||||
'com.boatgo.browser' => 'Boat Browser Mini',
|
||||
'com.ericsson.research.mario' => 'Bowser',
|
||||
'com.dotsandlines.carbon' => 'Carbon',
|
||||
'app.chameleon_browser' => 'Chameleon browser',
|
||||
'com.coship.mmcp' => 'Coship MMCP',
|
||||
'com.coship.tvos.web' => 'Coship MMCP',
|
||||
'com.coship.webapp' => 'Coship MMCP',
|
||||
'net.daum.android.daum' => 'Daum',
|
||||
'com.phikod.deviceportinfo' => 'Device Info Android',
|
||||
'com.dolphin.browser.android.jp' => 'Dolphin',
|
||||
'com.dolphin.browser.id' => 'Dolphin',
|
||||
'com.dolphin.browser.pad' => 'Dolphin',
|
||||
'com.dolphin.browser.tuna' => 'Dolphin',
|
||||
'com.dolphin.web.browser.android' => 'Dolphin',
|
||||
'mobi.mgeek.TunnyBrowser' => 'Dolphin',
|
||||
'mobile.mgeek.TunnyBrowser' => 'Dolphin',
|
||||
'com.dolphin.browser.xf' => 'Dolphin (Fighter Edition)',
|
||||
'com.dolphin.browser.lab.cn' => 'Dolphin Beta',
|
||||
'com.dolphin.browser.lab.en' => 'Dolphin Beta',
|
||||
'com.dolphin.browser.express.web' => 'Dolphin Express',
|
||||
'com.dolphin.browser.express.web.beta' => 'Dolphin Express',
|
||||
'com.dolphin.browser' => 'Dolphin Mini',
|
||||
'com.dolphin.browser.cn' => 'Dolphin Mini',
|
||||
'com.dolphin.browser.zero' => 'Dolphin Zero',
|
||||
'com.duckduckgo.mobile.android' => 'DuckDuckGo',
|
||||
'easy.browser' => 'Easy Browser',
|
||||
'easy.browser.classic' => 'Easy Browser',
|
||||
'easy.browser.com' => 'Easy Browser',
|
||||
'it.blogspot.fedeveloper' => 'Emergency Browser',
|
||||
'com.easy.browser' => 'ES Browser',
|
||||
'org.espier.browser' => 'Espier Browser',
|
||||
'com.exsoul' => 'Exsoul Web Browser',
|
||||
'com.jv.falcon' => 'Falcon',
|
||||
'com.jv.falcon.pro' => 'Falcon Pro',
|
||||
'com.devhd.feedly' => 'Feedly',
|
||||
'com.firemonkeybrowser' => 'FireMonkey',
|
||||
'com.comespice.browser' => 'Flash Browser',
|
||||
'com.funnyeden.browser' => 'Flash Browser',
|
||||
'com.whattheapps.fbrowser' => 'Flash Browser',
|
||||
'flipboard.app' => 'Flipboard',
|
||||
'flipboard.cn' => 'Flipboard',
|
||||
'com.lwi.android.flapps' => 'Floating Apps',
|
||||
'com.lwi.android.flappsfull' => 'Floating Apps',
|
||||
'gpc.myweb.hinet.net.PopupWeb' => 'Floating Browser Flux',
|
||||
'com.fortune.browser' => 'Fortune Web Browser',
|
||||
'com.browser.frogbrowser' => 'Frog Browser',
|
||||
'com.crowbar.beaverbrowser' => 'Frost Browser',
|
||||
'com.crowbar.beaverlite' => 'Frost Browser',
|
||||
'galaxy.browser.gb.free' => 'Galaxy Browser',
|
||||
'galaxy.browser.gb.pro' => 'Galaxy Browser',
|
||||
'com.mybro.browsah' => 'Genie Browser',
|
||||
'com.noinnion.android.greader.reader' => 'gReader',
|
||||
'com.noinnion.android.greader.readerpro' => 'gReader Pro',
|
||||
'jp.ddo.pigsty.HabitBrowser' => 'Habit Browser',
|
||||
'jp.ddo.pigsty.Habit_Browser' => 'Habit Browser',
|
||||
'com.baidu.hao123' => 'Hao123',
|
||||
'com.baidu.hao123.chrome.browser' => 'Hao123',
|
||||
'com.baidu.hao123.global' => 'Hao123',
|
||||
'com.htc.browser' => 'HTC Sense Browser',
|
||||
'com.htc.sense.browser' => 'HTC Sense Browser',
|
||||
'com.huawei.android.browser' => 'Huawei Emotion Browser',
|
||||
'com.huawei.browser' => 'Huawei Emotion Browser',
|
||||
'jp.co.lunascape.android.ilunascape' => 'iLunascape 2',
|
||||
'nu.tommie.inbrowser' => 'InBrowser',
|
||||
'nu.tommie.inbrowser.beta' => 'InBrowser Beta',
|
||||
'com.infamous.browser' => 'Infamous Browser',
|
||||
'derek.iSurf' => 'iSurf',
|
||||
'com.jerky.browser' => 'Javelin Incognito Browser',
|
||||
'com.jerky.browser2' => 'Javelin Incognito Browser',
|
||||
'com.adsi.kioware.client.mobile.app' => 'KioWare Kiosk',
|
||||
'com.kroniapp.browse' => 'Kronia Browser',
|
||||
'com.web.browser.labaadibrowser' => 'Labaadi Browser',
|
||||
'com.vng.android.zingbrowser' => 'Laban',
|
||||
'com.lastpass.lpandroid' => 'LastPass',
|
||||
'com.lenovo.browser' => 'Lenovo Browser',
|
||||
'com.lenovo.lps.simple' => 'Lenovo Browser',
|
||||
'com.light.browser' => 'Light Browser',
|
||||
'acr.browser.barebones' => 'Lightning Browser',
|
||||
'acr.browser.butterfly' => 'Lightning Browser',
|
||||
'acr.browser.lightning' => 'Lightning Browser',
|
||||
'acr.browser.lightning2' => 'Lightning Browser',
|
||||
'acr.browser.lightningq16w' => 'Lightning Browser',
|
||||
'acr.browser.spartancompany' => 'Lightning Browser',
|
||||
'acr.browser.spartancompanypaid' => 'Lightning Browser',
|
||||
'acr.browser.thunder' => 'Lightning Browser',
|
||||
'com.MoNTE.Lime' => 'Lime',
|
||||
'com.alphonso.pulse' => 'LinkedIn Pulse',
|
||||
'com.logio.logos' => 'Logos Browser',
|
||||
'it.lombardo.Lombardo' => 'Lombardo',
|
||||
'com.powerpoint45.lucidbrowser' => 'Lucid Browser',
|
||||
'com.powerpoint45.lucidbrowserfree' => 'Lucid Browser',
|
||||
'com.fiberlink.maas360.android.securebrowser' => 'MaaS360 Browser',
|
||||
'com.mx.browser' => 'Maxthon',
|
||||
'com.mx.browser.appendix' => 'Maxthon',
|
||||
'com.mx.browser.fast' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000000000' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000001915' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000002422' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000003135' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000003415' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000004211' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000004981' => 'Maxthon',
|
||||
'com.mx.browser.free.mx100000005137' => 'Maxthon',
|
||||
'com.mx.browser.free.mx200000000239' => 'Maxthon',
|
||||
'com.mx.browser.free.mx200000006760' => 'Maxthon',
|
||||
'com.mx.browser.free.mx200000013070' => 'Maxthon',
|
||||
'com.mx.browser.free.mx200000014602' => 'Maxthon',
|
||||
'com.mx.browser.free.mx200000014853' => 'Maxthon',
|
||||
'com.mx.browser.hg' => 'Maxthon',
|
||||
'com.mx.browser.kids' => 'Maxthon',
|
||||
'com.mx.browser.mtk' => 'Maxthon',
|
||||
'com.mx.browser.tablet' => 'Maxthon',
|
||||
'jp.co.inos.c1Browser' => 'MDM Browser',
|
||||
'com.ilegendsoft.mercury' => 'Mercury',
|
||||
'com.dmkho.mbm' => 'MiniBrowser Mobile',
|
||||
'com.dmkho.mbmbeta' => 'MiniBrowser Mobile',
|
||||
'com.mseven.msecure' => 'mSecure',
|
||||
'com.visvanoid.secretbrowse' => 'My Internet',
|
||||
'com.fevdev.nakedbrowser' => 'Naked Browser',
|
||||
'com.fevdev.nakedbrowserNDM' => 'Naked Browser',
|
||||
'com.fevdev.nakedbrowserpro' => 'Naked Browser Pro',
|
||||
'com.nanobrowser' => 'Nano Browser',
|
||||
'com.bos.ebrowser' => 'Navegador eBrowser',
|
||||
'com.nhn.android.navercafe' => 'Naver',
|
||||
'com.nhn.android.naverdic' => 'Naver',
|
||||
'com.nhn.android.search' => 'Naver',
|
||||
'com.access_company.android.livebrowser' => 'NetFront Life Browser',
|
||||
'com.access_company.android.nflifebrowser.lite' => 'NetFront Life Browser',
|
||||
'com.access_company.android.nflifeconnect' => 'NetFront Life Connect',
|
||||
'com.jiubang.browser' => 'Next Browser',
|
||||
'com.ninesky.browser' => 'Ninesky',
|
||||
'com.ninesky.browsercn' => 'Ninesky',
|
||||
'com.ninesky.browserzh' => 'Ninesky',
|
||||
'com.ninesky.nqbrowsercn' => 'Ninesky',
|
||||
'com.ninesky.nsbrowser' => 'Ninesky',
|
||||
'com.ninesky.sebrowser' => 'Ninesky',
|
||||
'com.appsverse.privatebrowser' => 'Nova Private Browser',
|
||||
'com.browser.nowadvanced' => 'Now Browser',
|
||||
'com.browser.nowbasic' => 'Now Browser',
|
||||
'com.browser.nowpro' => 'Now Browser',
|
||||
'com.browser.nowpro412t' => 'Now Browser',
|
||||
'com.wNewVisionBrowser' => 'NVision Browser',
|
||||
'com.compal.android.browser' => 'Ocean Browser',
|
||||
'com.maskyn.oldbrowser' => 'Old But Gold Internet Browser',
|
||||
'com.tencent.ibibo.mtt' => 'One Browser',
|
||||
'info.guardianproject.browser' => 'Orweb',
|
||||
'com.oupeng.browser' => 'Oupeng Browser',
|
||||
'com.oupeng.browser.beta10' => 'Oupeng Browser',
|
||||
'com.oupeng.browser.turbobeta' => 'Oupeng Browser',
|
||||
'com.oupeng.browserpre.cmcc' => 'Oupeng Browser',
|
||||
'com.oupeng.mini.android' => 'Oupeng Browser',
|
||||
'com.oupeng.xbrowser' => 'Oupeng Browser',
|
||||
'com.oupeng.xbrowser.beta' => 'Oupeng Browser',
|
||||
'com.myboyfriendisageek.airbrowser' => 'OverSkreen',
|
||||
'com.panasonic.pavc.viera.vieraremote2' => 'Panasonic TV Remote',
|
||||
'com.wPcBrowser' => 'PC Browser Mini',
|
||||
'com.penguinbrowser.penguinbrowser' => 'Penguin browser',
|
||||
'com.appsverse.photon' => 'Photon Browser',
|
||||
'com.appsverse.photonamazon' => 'Photon Browser',
|
||||
'com.levelup.touiteur' => 'Plume',
|
||||
'com.ideashower.readitlater.pro' => 'Pocket',
|
||||
'com.gflam.portal' => 'Portal',
|
||||
'com.hat.privatebrowser' => 'Private Browser',
|
||||
'com.JamesBecwar.FreePrivateBrowser' => 'Private Browser',
|
||||
'com.JamesBecwar.PrivateBrowser' => 'Private Browser',
|
||||
'com.qihoa.browser' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.androidbrowser' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.appstore' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.browser' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.browsertest' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.express.browser' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.expressbrowser' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.haosou' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.padbrowser' => 'Qihoo 360 Browser',
|
||||
'com.qihoo.padbrowser7' => 'Qihoo 360 Browser',
|
||||
'com.qihoo360.mobilesafe' => 'Qihoo 360 Browser',
|
||||
'com.qihoo360.mobilesafe_meizu' => 'Qihoo 360 Browser',
|
||||
'com.qihoo360.mobilesafe_mtk6573' => 'Qihoo 360 Browser',
|
||||
'com.tencent.android.pad' => 'QQ Browser',
|
||||
'com.tencent.blink' => 'QQ Browser',
|
||||
'com.tencent.hd.qq' => 'QQ Browser',
|
||||
'com.tencent.internat.mtt' => 'QQ Browser',
|
||||
'com.tencent.international.mtt' => 'QQ Browser',
|
||||
'com.tencent.mobileqq' => 'QQ Browser',
|
||||
'com.tencent.mtt' => 'QQ Browser',
|
||||
'com.tencent.padbrowser' => 'QQ Browser',
|
||||
'appinventor.ai_progetto2003.SCAN' => 'QR Barcode Scanner',
|
||||
'com.rarster.QuantumBrowser' => 'QuantumBrowser',
|
||||
'net.virifi.android.quickbrowser' => 'Quick ICS Browser',
|
||||
'net.virifi.android.quickbrowserpro' => 'Quick ICS Browser',
|
||||
'com.bjy.quicklinkbrowser' => 'Quick Link Browser',
|
||||
'com.rapid.browser' => 'Rapid Browser Pro',
|
||||
'com.rapid.browser2' => 'Rapid Browser Pro',
|
||||
'com.andrewshu.android.reddit' => 'Reddit is fun',
|
||||
'com.andrewshu.android.redditdonation' => 'Reddit is fun',
|
||||
'reddit.news' => 'Reddit News',
|
||||
'com.laurencedawson.reddit_sync.dev' => 'Reddit Sync Dev',
|
||||
'com.laurencedawson.reddit_sync.pro' => 'Reddit Sync Pro',
|
||||
'org.quantumbadger.redreader' => 'RedReader',
|
||||
'de.bomhard.android.RetroBrowser' => 'RetroBrowser',
|
||||
'com.rocket.browser' => 'Rocket Browser',
|
||||
'com.springdesign.screenshare.browser.client' => 'ScreenShare',
|
||||
'com.springdesign.screenshare.browser.server' => 'ScreenShare',
|
||||
'com.shark.sharkbrowser' => 'Shark Browser',
|
||||
'com.sina.weibo' => 'Sina Weibo',
|
||||
'com.sina.weibog3' => 'Sina Weibo',
|
||||
'com.sithagi.sithbrowser' => 'Sith Browser',
|
||||
'com.skyfire.browser' => 'SkyFire',
|
||||
'com.skyfire.browser.toolbar' => 'SkyFire',
|
||||
'com.skyfire.consumer.browser' => 'Skyfire',
|
||||
'jp.co.fenrir.android.sleipnir' => 'Sleipnir',
|
||||
'jp.co.fenrir.android.sleipnir_black' => 'Sleipnir',
|
||||
'jp.co.fenrir.android.sleipnir_ngp' => 'Sleipnir',
|
||||
'jp.co.fenrir.android.sleipnir_test' => 'Sleipnir',
|
||||
'jp.gocro.smartnews.android' => 'SmartNews',
|
||||
'com.cmcc.sofabrowser' => 'Sofa Browser',
|
||||
'sogou.mobile.explorer' => 'Sogou Mobile',
|
||||
'com.solo.browser' => 'Solo',
|
||||
'com.sonymobile.smallbrowser' => 'Sony Small Browser',
|
||||
'com.speedy.browser' => 'Speedy Browser',
|
||||
'com.appestry.split_browser' => 'Split Browser',
|
||||
'com.appestry.split_browser_trial' => 'Split Browser',
|
||||
'com.stumbleupon.android.app' => 'StumbleUpon',
|
||||
'iron.web.jalepano.browser' => 'Super Fast Browser',
|
||||
'com.gears42.surefox' => 'SureFox',
|
||||
'com.mns.android.swing' => 'Swing Browser',
|
||||
'net.biniok.tampermonkey' => 'Tampermonkey',
|
||||
'com.tcl.browser' => 'TCL Browser',
|
||||
'com.thuban.browser' => 'Thuban Handset Browser',
|
||||
'org.tint' => 'Tint Browser',
|
||||
'com.twidroid' => 'UberSocial',
|
||||
'com.uc.browser' => 'UC Browser',
|
||||
'com.uc.browser.en2ly5' => 'UC Browser',
|
||||
'com.uc.browser.hd.x86' => 'UC Browser',
|
||||
'com.uc.browser.hdx3kg' => 'UC Browser',
|
||||
'com.UCMobile' => 'UC Browser',
|
||||
'com.UCMobile.labs' => 'UC Browser',
|
||||
'com.UCMobile.ucsdk' => 'UC Browser',
|
||||
'com.UCMobile295d' => 'UC Browser',
|
||||
'com.UCMobile2jm4' => 'UC Browser',
|
||||
'com.UCMobile9jpo' => 'UC Browser',
|
||||
'com.UCMobileodw6' => 'UC Browser',
|
||||
'com.uc.browser.hd' => 'UC Browser HD',
|
||||
'com.uc.browser.en' => 'UC Browser Mini',
|
||||
'com.tencent.mm' => 'WeChat',
|
||||
'sui.mRelease' => 'xScope Browser Pro',
|
||||
'jp.co.yahoo.android.ybrowser' => 'Yahoo! JAPAN',
|
||||
'jp.co.yahoo.android.yjtop' => 'Yahoo! JAPAN',
|
||||
'ru.yandex.shell' => 'Yandex Shell',
|
||||
'com.zetakey.browser' => 'Zetakey',
|
||||
'org.zirco' => 'Zirco Browser',
|
||||
'com.zte.browser' => 'ZTE Browser',
|
||||
];
|
||||
+9130
File diff suppressed because it is too large
Load Diff
+24
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$ASHA_INDEX = array (
|
||||
'@50' =>
|
||||
array (
|
||||
0 => 500,
|
||||
1 => 501,
|
||||
2 => '501s',
|
||||
3 => '501.1',
|
||||
4 => '501.2',
|
||||
5 => 502,
|
||||
6 => 503,
|
||||
7 => '503s',
|
||||
),
|
||||
'@AS' =>
|
||||
array (
|
||||
0 => 'Asha230SingleSIM',
|
||||
1 => 'Asha230DualSIM',
|
||||
2 => 'Asha500SingleSIM',
|
||||
3 => 'Asha500DualSIM',
|
||||
),
|
||||
);
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$BADA_INDEX = array (
|
||||
'@GT' =>
|
||||
array (
|
||||
0 => 'GT- ?S52(50|53)!',
|
||||
1 => 'GT-S53(30|33)!',
|
||||
2 => 'GT-S5380!',
|
||||
3 => 'GT-S57(50|53)!',
|
||||
4 => 'GT-S57(80)!',
|
||||
5 => 'GT-S72(30|33)!',
|
||||
6 => 'GT-S7250!',
|
||||
7 => 'GT-S8500!',
|
||||
8 => 'GT- ?S8530!',
|
||||
9 => 'GT- ?S8600!',
|
||||
),
|
||||
'@SC' =>
|
||||
array (
|
||||
0 => 'SCH-F859!',
|
||||
),
|
||||
'@SH' =>
|
||||
array (
|
||||
0 => 'SHW-M410',
|
||||
),
|
||||
);
|
||||
+180
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$BREW_INDEX = array (
|
||||
'@AX' =>
|
||||
array (
|
||||
0 => 'AX8575',
|
||||
),
|
||||
'@CD' =>
|
||||
array (
|
||||
0 => 'CDM8992',
|
||||
1 => 'CDM8999',
|
||||
),
|
||||
'@CO' =>
|
||||
array (
|
||||
0 => 'Coolpad D508',
|
||||
1 => 'Coolpad D510',
|
||||
2 => 'Coolpad E600',
|
||||
),
|
||||
'@E4' =>
|
||||
array (
|
||||
0 => 'E4255',
|
||||
),
|
||||
'@EX' =>
|
||||
array (
|
||||
0 => 'EX200!',
|
||||
),
|
||||
'@HS' =>
|
||||
array (
|
||||
0 => 'HS-E316!',
|
||||
),
|
||||
'@HU' =>
|
||||
array (
|
||||
0 => 'HUAWEI U526',
|
||||
1 => 'HUAWEI U528',
|
||||
2 => 'HUAWEI U2801!',
|
||||
3 => 'HUAWEI U5200!',
|
||||
4 => 'HUAWEI U5300!',
|
||||
5 => 'HUAWEI U5310!',
|
||||
6 => 'HUAWEI U6150!',
|
||||
),
|
||||
'@LG' =>
|
||||
array (
|
||||
0 => 'LG272',
|
||||
1 => 'LG510',
|
||||
2 => 'LGE AX840',
|
||||
3 => 'LGE LG700',
|
||||
4 => 'LGE LG840',
|
||||
5 => 'LGE UX700',
|
||||
6 => 'LGE UX840',
|
||||
7 => 'LGE VX11K',
|
||||
8 => 'LGE VX8575',
|
||||
9 => 'LGE VX9700',
|
||||
),
|
||||
'@LN' =>
|
||||
array (
|
||||
0 => 'LN240',
|
||||
1 => 'LN510',
|
||||
),
|
||||
'@LX' =>
|
||||
array (
|
||||
0 => 'LX610',
|
||||
),
|
||||
'@M2' =>
|
||||
array (
|
||||
0 => 'M260!',
|
||||
),
|
||||
'@M3' =>
|
||||
array (
|
||||
0 => 'M350!',
|
||||
1 => 'M370!',
|
||||
2 => 'M380!',
|
||||
3 => 'M390!',
|
||||
),
|
||||
'@M5' =>
|
||||
array (
|
||||
0 => 'M550!',
|
||||
1 => 'M560!',
|
||||
),
|
||||
'@NO' =>
|
||||
array (
|
||||
0 => 'NOKIA 7705',
|
||||
),
|
||||
'@P5' =>
|
||||
array (
|
||||
0 => 'P5000',
|
||||
),
|
||||
'@P6' =>
|
||||
array (
|
||||
0 => 'P6020',
|
||||
1 => 'P6030',
|
||||
),
|
||||
'@PA' =>
|
||||
array (
|
||||
0 => 'Pantech CDM8992!',
|
||||
1 => 'Pantech CDM8999!',
|
||||
2 => 'Pantech TXT8045!',
|
||||
),
|
||||
'@PL' =>
|
||||
array (
|
||||
0 => 'PLS M330',
|
||||
),
|
||||
'@S2' =>
|
||||
array (
|
||||
0 => 'S2151!',
|
||||
),
|
||||
'@SA' =>
|
||||
array (
|
||||
0 => 'sam-r631',
|
||||
1 => 'sam-r640',
|
||||
2 => 'sam-r900',
|
||||
),
|
||||
'@SC' =>
|
||||
array (
|
||||
0 => 'SCH-B309!',
|
||||
1 => 'SCH-F839',
|
||||
2 => 'SCH-M519!',
|
||||
3 => 'SCH-S559!',
|
||||
4 => 'SCH-S579!',
|
||||
5 => 'SCH-U380!',
|
||||
6 => 'SCH-U485',
|
||||
7 => 'SCH-U640!',
|
||||
8 => 'SCH-U660!',
|
||||
9 => 'SCH-U680!',
|
||||
10 => 'SCH-U750!',
|
||||
11 => 'SCH-U820!',
|
||||
12 => 'SCH-U960!',
|
||||
13 => 'SCH-W709!',
|
||||
14 => 'SCH-W799!',
|
||||
15 => 'SCP-3810',
|
||||
16 => 'SCP3810',
|
||||
17 => 'SCP-6750',
|
||||
18 => 'SCP6760',
|
||||
19 => 'SCP-6760',
|
||||
20 => 'SCP6780',
|
||||
),
|
||||
'@SG' =>
|
||||
array (
|
||||
0 => 'SGH-A937!',
|
||||
1 => 'SGH-A947!',
|
||||
),
|
||||
'@SM' =>
|
||||
array (
|
||||
0 => 'SM-B690V',
|
||||
),
|
||||
'@SP' =>
|
||||
array (
|
||||
0 => 'SPH M330',
|
||||
1 => 'SPH-M570',
|
||||
2 => 'Sprint M850',
|
||||
),
|
||||
'@TX' =>
|
||||
array (
|
||||
0 => 'TXT8045',
|
||||
),
|
||||
'@VN' =>
|
||||
array (
|
||||
0 => 'VN170!',
|
||||
1 => 'VN250!',
|
||||
2 => 'VN271!',
|
||||
3 => 'VN280!',
|
||||
4 => 'VN360!',
|
||||
5 => 'VN370!',
|
||||
6 => 'VN530',
|
||||
),
|
||||
'@VX' =>
|
||||
array (
|
||||
0 => 'VX5600!',
|
||||
1 => 'VX9200!',
|
||||
2 => 'VX9600!',
|
||||
3 => 'VX11000!',
|
||||
),
|
||||
'@ZT' =>
|
||||
array (
|
||||
0 => 'ZTE F-450!',
|
||||
1 => 'ZTE R516!',
|
||||
2 => 'ZTE R518!',
|
||||
),
|
||||
);
|
||||
+231
@@ -0,0 +1,231 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$FEATURE_INDEX = array (
|
||||
'@AM' =>
|
||||
array (
|
||||
0 => 'Amstrad Gamma',
|
||||
),
|
||||
'@BE' =>
|
||||
array (
|
||||
0 => 'Benefon Q',
|
||||
),
|
||||
'@CK' =>
|
||||
array (
|
||||
0 => 'CK13[ai]?$!',
|
||||
1 => 'CK15[ai]?$!',
|
||||
),
|
||||
'@CO' =>
|
||||
array (
|
||||
0 => 'COCOON',
|
||||
),
|
||||
'@EF' =>
|
||||
array (
|
||||
0 => 'EF71',
|
||||
),
|
||||
'@EX' =>
|
||||
array (
|
||||
0 => 'EX115',
|
||||
1 => 'EX118',
|
||||
2 => 'EX119',
|
||||
3 => 'EX128',
|
||||
4 => 'EX225',
|
||||
5 => 'EX226',
|
||||
6 => 'EX430',
|
||||
),
|
||||
'@F1' =>
|
||||
array (
|
||||
0 => 'F100[ai]?$!',
|
||||
),
|
||||
'@GM' =>
|
||||
array (
|
||||
0 => 'GM360',
|
||||
),
|
||||
'@GR' =>
|
||||
array (
|
||||
0 => 'GR700',
|
||||
),
|
||||
'@GS' =>
|
||||
array (
|
||||
0 => 'GS290',
|
||||
1 => 'GS500',
|
||||
),
|
||||
'@GT' =>
|
||||
array (
|
||||
0 => 'GT500!',
|
||||
1 => 'GT550',
|
||||
2 => 'GT-B2710',
|
||||
3 => 'GT-B3210',
|
||||
4 => 'GT-B3313',
|
||||
5 => 'GT-C3200',
|
||||
6 => 'GT-C3222',
|
||||
7 => 'GT-C3322',
|
||||
8 => 'GT-C3500',
|
||||
9 => 'GT-C5010!',
|
||||
10 => 'GT-E1282!',
|
||||
11 => 'GT-E2152',
|
||||
12 => 'GT-E2220',
|
||||
13 => 'GT-E2222',
|
||||
14 => 'GT-E2202',
|
||||
15 => 'GT-E2250',
|
||||
16 => 'GT-E2252',
|
||||
17 => 'GT-E3213',
|
||||
18 => 'GT-E3309I',
|
||||
19 => 'GT-M8910',
|
||||
20 => 'GT-S3332',
|
||||
21 => 'GT-S33(50|53)!',
|
||||
22 => 'GT-S35(70|72)!',
|
||||
23 => 'GT-S5229',
|
||||
24 => 'GT-S5270!',
|
||||
25 => 'GT-S5610!',
|
||||
26 => 'GT-I6410!',
|
||||
27 => 'GT-I8320!',
|
||||
28 => 'GT-I8330!',
|
||||
),
|
||||
'@J1' =>
|
||||
array (
|
||||
0 => 'J105[ai]?$!',
|
||||
1 => 'J108[ai]?$!',
|
||||
2 => 'J10(i2?)?$!',
|
||||
),
|
||||
'@J2' =>
|
||||
array (
|
||||
0 => 'J20[ai]?$!',
|
||||
),
|
||||
'@K6' =>
|
||||
array (
|
||||
0 => 'K612',
|
||||
),
|
||||
'@KC' =>
|
||||
array (
|
||||
0 => 'KC910i',
|
||||
),
|
||||
'@KP' =>
|
||||
array (
|
||||
0 => 'KP500!',
|
||||
1 => 'KP570!',
|
||||
),
|
||||
'@KU' =>
|
||||
array (
|
||||
0 => 'KU990i',
|
||||
),
|
||||
'@LG' =>
|
||||
array (
|
||||
0 => 'LG-KU380',
|
||||
1 => 'LG-KU580',
|
||||
2 => 'LG-KU990',
|
||||
),
|
||||
'@LI' =>
|
||||
array (
|
||||
0 => 'Lightpipe',
|
||||
),
|
||||
'@M3' =>
|
||||
array (
|
||||
0 => 'm3510c',
|
||||
),
|
||||
'@MO' =>
|
||||
array (
|
||||
0 => 'MOTOQA1',
|
||||
),
|
||||
'@P7' =>
|
||||
array (
|
||||
0 => 'P7000',
|
||||
),
|
||||
'@P9' =>
|
||||
array (
|
||||
0 => 'P9020',
|
||||
1 => 'P9050',
|
||||
),
|
||||
'@PL' =>
|
||||
array (
|
||||
0 => 'PLS6600KJ',
|
||||
),
|
||||
'@PM' =>
|
||||
array (
|
||||
0 => 'PM-8200',
|
||||
),
|
||||
'@S7' =>
|
||||
array (
|
||||
0 => 'S7350',
|
||||
),
|
||||
'@SA' =>
|
||||
array (
|
||||
0 => 'sam-r560',
|
||||
),
|
||||
'@SC' =>
|
||||
array (
|
||||
0 => 'SCP-5300',
|
||||
1 => 'SCP-5500',
|
||||
2 => 'SCP-6600',
|
||||
3 => 'SCH-W169',
|
||||
4 => 'SCH-W279',
|
||||
),
|
||||
'@SE' =>
|
||||
array (
|
||||
0 => 'Sendo Wap',
|
||||
),
|
||||
'@SG' =>
|
||||
array (
|
||||
0 => 'SGH-A667',
|
||||
1 => 'SGH-A697',
|
||||
2 => 'SGH-A877',
|
||||
3 => 'SGH-A927',
|
||||
4 => 'SGH-A997',
|
||||
5 => 'SGH-D880',
|
||||
6 => 'SGH-E250i',
|
||||
7 => 'SGH-E250V',
|
||||
8 => 'SGH-G600',
|
||||
9 => 'SGH-J700i',
|
||||
10 => 'SGH-J700V',
|
||||
11 => 'SGH-M200',
|
||||
12 => 'SGH-S150G',
|
||||
13 => 'SGH-S390G',
|
||||
14 => 'SGH-T189N',
|
||||
15 => 'SGHX660V',
|
||||
16 => 'SGH-Z107!',
|
||||
17 => 'SGH-Z130!',
|
||||
18 => 'SGH-Z500!',
|
||||
),
|
||||
'@SM' =>
|
||||
array (
|
||||
0 => 'SM-B313E',
|
||||
1 => 'SM-B350E',
|
||||
2 => 'SM-B360E',
|
||||
3 => 'SM-B780(A|W)!',
|
||||
),
|
||||
'@TE' =>
|
||||
array (
|
||||
0 => 'tecnot36',
|
||||
),
|
||||
'@U1' =>
|
||||
array (
|
||||
0 => 'U100[ai]?$!',
|
||||
1 => 'U10[ai]?$!',
|
||||
),
|
||||
'@VO' =>
|
||||
array (
|
||||
0 => 'Vodafone 575',
|
||||
),
|
||||
'@W1' =>
|
||||
array (
|
||||
0 => 'W100i?$!',
|
||||
1 => 'W150i?$!',
|
||||
),
|
||||
'@W2' =>
|
||||
array (
|
||||
0 => 'W20i?$!',
|
||||
),
|
||||
'@WI' =>
|
||||
array (
|
||||
0 => 'WIDETEL WCX150',
|
||||
),
|
||||
'@WT' =>
|
||||
array (
|
||||
0 => 'WT13i$!',
|
||||
),
|
||||
'@X5' =>
|
||||
array (
|
||||
0 => 'X5i$!',
|
||||
),
|
||||
);
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$FIREFOXOS_INDEX = array (
|
||||
'@' =>
|
||||
array (
|
||||
0 => '.LYF\\/.F30C!',
|
||||
1 => '.LYF\\/.F101K!',
|
||||
),
|
||||
'@AL' =>
|
||||
array (
|
||||
0 => 'ALCATEL ONE TOUCH FIRE',
|
||||
1 => 'ALCATEL ONE TOUCH 4012A',
|
||||
2 => 'ALCATEL ONE TOUCH 4012X',
|
||||
3 => 'ALCATELOneTouch4012A!',
|
||||
4 => 'ALCATELOneTouch4012X!',
|
||||
5 => 'ALCATELOneTouch4019A!',
|
||||
6 => 'ALCATELOneTouch4019X!',
|
||||
7 => 'ALCATELOneTouch4020D!',
|
||||
8 => 'ALCATELOneTouch4022!',
|
||||
9 => 'ALCATELOneTouch4023!',
|
||||
10 => 'ALCATELOneTouch6015X!',
|
||||
11 => 'ALCATEL4044[MNOTVW]!',
|
||||
12 => 'ALCATEL4044C!',
|
||||
),
|
||||
'@HU' =>
|
||||
array (
|
||||
0 => 'HUAWEI Ascend Y300-F1',
|
||||
1 => 'HUAWEIY300-F1',
|
||||
),
|
||||
'@LG' =>
|
||||
array (
|
||||
0 => 'LG-D3(00|01)!',
|
||||
1 => 'LGL25',
|
||||
),
|
||||
'@LY' =>
|
||||
array (
|
||||
0 => 'LYF\\/F30C!',
|
||||
1 => 'LYF\\/F41T!',
|
||||
2 => 'LYF\\/F50Y!',
|
||||
3 => 'LYF\\/F61F!',
|
||||
4 => 'LYF\\/F81E!',
|
||||
5 => 'LYF\\/F90M!',
|
||||
6 => 'LYF\\/F101K!',
|
||||
),
|
||||
'@MA' =>
|
||||
array (
|
||||
0 => 'madai',
|
||||
),
|
||||
'@ON' =>
|
||||
array (
|
||||
0 => 'OneTouch4019A',
|
||||
),
|
||||
'@OP' =>
|
||||
array (
|
||||
0 => 'OPEN',
|
||||
1 => 'OpenC',
|
||||
2 => 'Open C',
|
||||
3 => 'OPENC2',
|
||||
4 => 'OPEN2',
|
||||
),
|
||||
'@OR' =>
|
||||
array (
|
||||
0 => 'Orange KLIF',
|
||||
1 => 'Orange KLIFD',
|
||||
),
|
||||
'@ZT' =>
|
||||
array (
|
||||
0 => 'ZTEOPEN',
|
||||
),
|
||||
);
|
||||
+393
@@ -0,0 +1,393 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$KDDI_INDEX = array (
|
||||
'@CA' =>
|
||||
array (
|
||||
0 => 'CA11',
|
||||
1 => 'CA12',
|
||||
2 => 'CA13',
|
||||
3 => 'CA14',
|
||||
4 => 'CA21',
|
||||
5 => 'CA22',
|
||||
6 => 'CA23',
|
||||
7 => 'CA24',
|
||||
8 => 'CA25',
|
||||
9 => 'CA26',
|
||||
10 => 'CA27',
|
||||
11 => 'CA28',
|
||||
12 => 'CA31',
|
||||
13 => 'CA32',
|
||||
14 => 'CA33',
|
||||
15 => 'CA34',
|
||||
16 => 'CA35',
|
||||
17 => 'CA36',
|
||||
18 => 'CA37',
|
||||
19 => 'CA38',
|
||||
20 => 'CA39',
|
||||
21 => 'CA3A',
|
||||
22 => 'CA3B',
|
||||
23 => 'CA3C',
|
||||
24 => 'CA3D',
|
||||
25 => 'CA3E',
|
||||
26 => 'CA3F',
|
||||
27 => 'CA3G',
|
||||
28 => 'CA3H',
|
||||
29 => 'CA3I',
|
||||
30 => 'CA3J',
|
||||
31 => 'CA3K',
|
||||
),
|
||||
'@DN' =>
|
||||
array (
|
||||
0 => 'DN01',
|
||||
1 => 'DN11',
|
||||
),
|
||||
'@ER' =>
|
||||
array (
|
||||
0 => 'ERK0',
|
||||
),
|
||||
'@FJ' =>
|
||||
array (
|
||||
0 => 'FJ31',
|
||||
),
|
||||
'@HI' =>
|
||||
array (
|
||||
0 => 'HI01',
|
||||
1 => 'HI02',
|
||||
2 => 'HI11',
|
||||
3 => 'HI12',
|
||||
4 => 'HI13',
|
||||
5 => 'HI14',
|
||||
6 => 'HI21',
|
||||
7 => 'HI23',
|
||||
8 => 'HI24',
|
||||
9 => 'HI31',
|
||||
10 => 'HI32',
|
||||
11 => 'HI33',
|
||||
12 => 'HI34',
|
||||
13 => 'HI35',
|
||||
14 => 'HI36',
|
||||
15 => 'HI37',
|
||||
16 => 'HI38',
|
||||
17 => 'HI39',
|
||||
18 => 'HI3A',
|
||||
19 => 'HI3B',
|
||||
20 => 'HI3C',
|
||||
21 => 'HI3D',
|
||||
22 => 'HI3E',
|
||||
23 => 'HI3F',
|
||||
24 => 'HI3G',
|
||||
25 => 'HI3H',
|
||||
),
|
||||
'@KC' =>
|
||||
array (
|
||||
0 => 'KC3Q',
|
||||
1 => 'KC3S',
|
||||
2 => 'KC3V',
|
||||
3 => 'KC11',
|
||||
4 => 'KC12',
|
||||
5 => 'KC13',
|
||||
6 => 'KC14',
|
||||
7 => 'KC15',
|
||||
8 => 'KC21',
|
||||
9 => 'KC22',
|
||||
10 => 'KC23',
|
||||
11 => 'KC24',
|
||||
12 => 'KC25',
|
||||
13 => 'KC26',
|
||||
14 => 'KC27',
|
||||
15 => 'KC28',
|
||||
16 => 'KC29',
|
||||
17 => 'KC2A',
|
||||
18 => 'KC31',
|
||||
19 => 'KC32',
|
||||
20 => 'KC33',
|
||||
21 => 'KC34',
|
||||
22 => 'KC35',
|
||||
23 => 'KC36',
|
||||
24 => 'KC37',
|
||||
25 => 'KC38',
|
||||
26 => 'KC39',
|
||||
27 => 'KC3A',
|
||||
28 => 'KC3B',
|
||||
29 => 'KC3D',
|
||||
30 => 'KC3E',
|
||||
31 => 'KC3G',
|
||||
32 => 'KC3H',
|
||||
33 => 'KC3I',
|
||||
34 => 'KC3K',
|
||||
35 => 'KC3M',
|
||||
36 => 'KC3N',
|
||||
37 => 'KC3O',
|
||||
38 => 'KC3P',
|
||||
39 => 'KC3R',
|
||||
40 => 'KC3T',
|
||||
41 => 'KC3U',
|
||||
42 => 'KC3W',
|
||||
43 => 'KC3X',
|
||||
44 => 'KC3Y',
|
||||
45 => 'KC3Z',
|
||||
46 => 'KC41',
|
||||
47 => 'KC42',
|
||||
48 => 'KC43',
|
||||
49 => 'KC44',
|
||||
50 => 'KC45',
|
||||
51 => 'KC46',
|
||||
52 => 'KC47',
|
||||
53 => 'KC48',
|
||||
54 => 'KC4A',
|
||||
55 => 'KCC1',
|
||||
56 => 'KCC2',
|
||||
57 => 'KCI1',
|
||||
58 => 'KCI2',
|
||||
59 => 'KCT1',
|
||||
60 => 'KCT2',
|
||||
61 => 'KCT3',
|
||||
62 => 'KCT4',
|
||||
63 => 'KCT5',
|
||||
64 => 'KCT6',
|
||||
65 => 'KCT7',
|
||||
66 => 'KCT8',
|
||||
67 => 'KCT9',
|
||||
68 => 'KCTA',
|
||||
69 => 'KCTB',
|
||||
70 => 'KCTC',
|
||||
),
|
||||
'@MA' =>
|
||||
array (
|
||||
0 => 'MA11',
|
||||
1 => 'MA12',
|
||||
2 => 'MA13',
|
||||
3 => 'MA21',
|
||||
4 => 'MA31',
|
||||
5 => 'MA32',
|
||||
6 => 'MA33',
|
||||
7 => 'MA34',
|
||||
8 => 'MA35',
|
||||
9 => 'MAC1',
|
||||
10 => 'MAC2',
|
||||
11 => 'MAI1',
|
||||
12 => 'MAI2',
|
||||
13 => 'MAT1',
|
||||
14 => 'MAT2',
|
||||
15 => 'MAT3',
|
||||
),
|
||||
'@MI' =>
|
||||
array (
|
||||
0 => 'MIT1',
|
||||
),
|
||||
'@PT' =>
|
||||
array (
|
||||
0 => 'PT21',
|
||||
1 => 'PT23',
|
||||
2 => 'PT33',
|
||||
3 => 'PT34',
|
||||
4 => 'PT35',
|
||||
5 => 'PT36',
|
||||
),
|
||||
'@SA' =>
|
||||
array (
|
||||
0 => 'SA21',
|
||||
1 => 'SA22',
|
||||
2 => 'SA24',
|
||||
3 => 'SA25',
|
||||
4 => 'SA26',
|
||||
5 => 'SA27',
|
||||
6 => 'SA28',
|
||||
7 => 'SA29',
|
||||
8 => 'SA2A',
|
||||
9 => 'SA31',
|
||||
10 => 'SA32',
|
||||
11 => 'SA33',
|
||||
12 => 'SA34',
|
||||
13 => 'SA35',
|
||||
14 => 'SA36',
|
||||
15 => 'SA37',
|
||||
16 => 'SA38',
|
||||
17 => 'SA39',
|
||||
18 => 'SA3A',
|
||||
19 => 'SA3B',
|
||||
20 => 'SA3C',
|
||||
21 => 'SA3D',
|
||||
22 => 'SA3E',
|
||||
),
|
||||
'@SH' =>
|
||||
array (
|
||||
0 => 'SH31',
|
||||
1 => 'SH32',
|
||||
2 => 'SH33',
|
||||
3 => 'SH34',
|
||||
4 => 'SH35',
|
||||
5 => 'SH36',
|
||||
6 => 'SH37',
|
||||
7 => 'SH38',
|
||||
8 => 'SH39',
|
||||
9 => 'SH3A',
|
||||
10 => 'SH3B',
|
||||
11 => 'SH3C',
|
||||
12 => 'SH3D',
|
||||
13 => 'SH3E',
|
||||
14 => 'SH3F',
|
||||
15 => 'SH3G',
|
||||
16 => 'SH3H',
|
||||
17 => 'SH3I',
|
||||
18 => 'SH3J',
|
||||
19 => 'SH3K',
|
||||
20 => 'SH3L',
|
||||
),
|
||||
'@SN' =>
|
||||
array (
|
||||
0 => 'SN3K',
|
||||
1 => 'SN3T',
|
||||
2 => 'SN11',
|
||||
3 => 'SN13',
|
||||
4 => 'SN14',
|
||||
5 => 'SN15',
|
||||
6 => 'SN16',
|
||||
7 => 'SN17',
|
||||
8 => 'SN21',
|
||||
9 => 'SN22',
|
||||
10 => 'SN23',
|
||||
11 => 'SN24',
|
||||
12 => 'SN25',
|
||||
13 => 'SN26',
|
||||
14 => 'SN27',
|
||||
15 => 'SN28',
|
||||
16 => 'SN29',
|
||||
17 => 'SN31',
|
||||
18 => 'SN32',
|
||||
19 => 'SN33',
|
||||
20 => 'SN34',
|
||||
21 => 'SN35',
|
||||
22 => 'SN36',
|
||||
23 => 'SN37',
|
||||
24 => 'SN38',
|
||||
25 => 'SN39',
|
||||
26 => 'SN3A',
|
||||
27 => 'SN3B',
|
||||
28 => 'SN3C',
|
||||
29 => 'SN3D',
|
||||
30 => 'SN3E',
|
||||
31 => 'SN3F',
|
||||
32 => 'SN3G',
|
||||
33 => 'SN3H',
|
||||
34 => 'SN3I',
|
||||
35 => 'SN3J',
|
||||
36 => 'SN3L',
|
||||
37 => 'SN3M',
|
||||
38 => 'SN3N',
|
||||
39 => 'SN3O',
|
||||
40 => 'SN3P',
|
||||
41 => 'SN3Q',
|
||||
42 => 'SN3R',
|
||||
43 => 'SN3S',
|
||||
44 => 'SN3U',
|
||||
45 => 'SN3V',
|
||||
),
|
||||
'@ST' =>
|
||||
array (
|
||||
0 => 'ST22',
|
||||
1 => 'ST33',
|
||||
2 => 'ST11',
|
||||
3 => 'ST12',
|
||||
4 => 'ST13',
|
||||
5 => 'ST14',
|
||||
6 => 'ST21',
|
||||
7 => 'ST23',
|
||||
8 => 'ST24',
|
||||
9 => 'ST25',
|
||||
10 => 'ST26',
|
||||
11 => 'ST27',
|
||||
12 => 'ST28',
|
||||
13 => 'ST29',
|
||||
14 => 'ST2A',
|
||||
15 => 'ST2C',
|
||||
16 => 'ST2D',
|
||||
17 => 'ST31',
|
||||
18 => 'ST32',
|
||||
19 => 'ST34',
|
||||
),
|
||||
'@SY' =>
|
||||
array (
|
||||
0 => 'SY12',
|
||||
1 => 'SY13',
|
||||
2 => 'SY14',
|
||||
3 => 'SY15',
|
||||
4 => 'SYC1',
|
||||
5 => 'SYT1',
|
||||
6 => 'SYT2',
|
||||
7 => 'SYT3',
|
||||
8 => 'SYT4',
|
||||
9 => 'SY01',
|
||||
10 => 'SY02',
|
||||
11 => 'SY03',
|
||||
12 => 'SY11',
|
||||
),
|
||||
'@TS' =>
|
||||
array (
|
||||
0 => 'TS3Q',
|
||||
1 => 'TS3U',
|
||||
2 => 'TS3W',
|
||||
3 => 'TS01',
|
||||
4 => 'TS11',
|
||||
5 => 'TS12',
|
||||
6 => 'TS13',
|
||||
7 => 'TS14',
|
||||
8 => 'TS21',
|
||||
9 => 'TS22',
|
||||
10 => 'TS23',
|
||||
11 => 'TS24',
|
||||
12 => 'TS25',
|
||||
13 => 'TS26',
|
||||
14 => 'TS27',
|
||||
15 => 'TS28',
|
||||
16 => 'TS29',
|
||||
17 => 'TS2A',
|
||||
18 => 'TS2B',
|
||||
19 => 'TS2C',
|
||||
20 => 'TS2D',
|
||||
21 => 'TS2E',
|
||||
22 => 'TS31',
|
||||
23 => 'TS32',
|
||||
24 => 'TS33',
|
||||
25 => 'TS34',
|
||||
26 => 'TS35',
|
||||
27 => 'TS36',
|
||||
28 => 'TS37',
|
||||
29 => 'TS38',
|
||||
30 => 'TS39',
|
||||
31 => 'TS3A',
|
||||
32 => 'TS3B',
|
||||
33 => 'TS3C',
|
||||
34 => 'TS3D',
|
||||
35 => 'TS3E',
|
||||
36 => 'TS3G',
|
||||
37 => 'TS3H',
|
||||
38 => 'TS3I',
|
||||
39 => 'TS3J',
|
||||
40 => 'TS3K',
|
||||
41 => 'TS3L',
|
||||
42 => 'TS3M',
|
||||
43 => 'TS3N',
|
||||
44 => 'TS3O',
|
||||
45 => 'TS3P',
|
||||
46 => 'TS3R',
|
||||
47 => 'TS3S',
|
||||
48 => 'TS3T',
|
||||
49 => 'TS3V',
|
||||
50 => 'TS3X',
|
||||
51 => 'TS3Y',
|
||||
52 => 'TS3Z',
|
||||
53 => 'TS41',
|
||||
54 => 'TSC1',
|
||||
55 => 'TSI1',
|
||||
56 => 'TST1',
|
||||
57 => 'TST2',
|
||||
58 => 'TST3',
|
||||
59 => 'TST4',
|
||||
60 => 'TST5',
|
||||
61 => 'TST6',
|
||||
62 => 'TST7',
|
||||
),
|
||||
);
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$PALMOS_INDEX = array (
|
||||
'@AC' =>
|
||||
array (
|
||||
0 => 'acer-momo',
|
||||
1 => 'acer-coco',
|
||||
2 => 'Acea-MZ01',
|
||||
3 => 'Acea-PD01',
|
||||
),
|
||||
'@GR' =>
|
||||
array (
|
||||
0 => 'grmn-3200',
|
||||
1 => 'grmn-3600',
|
||||
2 => 'grmn-3700',
|
||||
),
|
||||
'@GS' =>
|
||||
array (
|
||||
0 => 'gsRl-zicn',
|
||||
1 => 'gsRl-zcn2',
|
||||
2 => 'gsRl-zcn5',
|
||||
),
|
||||
'@HS' =>
|
||||
array (
|
||||
0 => 'hspr-H101',
|
||||
1 => 'hspr-H102',
|
||||
),
|
||||
'@KW' =>
|
||||
array (
|
||||
0 => 'kwc.-7135',
|
||||
),
|
||||
'@PA' =>
|
||||
array (
|
||||
0 => 'Palm-D061',
|
||||
1 => 'Palm-D062',
|
||||
2 => 'Palm-TunX',
|
||||
3 => 'Palm-stuj',
|
||||
4 => 'Palm-hbbs',
|
||||
5 => 'Palm-trnd',
|
||||
6 => 'Palm-ecty',
|
||||
7 => 'Palm-lith',
|
||||
8 => 'Palm-sky1',
|
||||
9 => 'Palm-D053',
|
||||
10 => 'Palm-D052',
|
||||
11 => 'Palm-D060',
|
||||
12 => 'Palm-MT64',
|
||||
13 => 'Palm-Cct1',
|
||||
14 => 'Palm-Zir4',
|
||||
15 => 'Palm-Frg1',
|
||||
16 => 'Palm-Frg2',
|
||||
17 => 'Palm-Arz1',
|
||||
18 => 'Palm-TnT5',
|
||||
19 => 'Palm-atc1',
|
||||
20 => 'Palm-D050',
|
||||
21 => 'Palm-Cubs',
|
||||
22 => 'Palm-Zi21',
|
||||
23 => 'Palm-D051',
|
||||
24 => 'Palm-Zi22',
|
||||
25 => 'Palm-Zpth',
|
||||
26 => 'Palm-Zi72',
|
||||
),
|
||||
'@QC' =>
|
||||
array (
|
||||
0 => 'qcom-qc20',
|
||||
),
|
||||
'@SM' =>
|
||||
array (
|
||||
0 => 'smsn-phix',
|
||||
1 => 'smsn-Phx2',
|
||||
2 => 'smsn-blch',
|
||||
3 => 'smsn-BLFM',
|
||||
4 => 'smsn-glxy',
|
||||
),
|
||||
'@SO' =>
|
||||
array (
|
||||
0 => 'sony-ystn',
|
||||
1 => 'sony-ysmt',
|
||||
2 => 'sony-ysm2',
|
||||
3 => 'sony-nsca',
|
||||
4 => 'sony-nsc2',
|
||||
5 => 'sony-vnce',
|
||||
6 => 'sony-mdna',
|
||||
7 => 'sony-npls',
|
||||
8 => 'sony-rdwd',
|
||||
9 => 'sony-crdb',
|
||||
10 => 'sony-tldo',
|
||||
11 => 'sony-mdrd',
|
||||
12 => 'sony-grnd',
|
||||
13 => 'sony-frta',
|
||||
14 => 'sony-cocs',
|
||||
15 => 'sony-glps',
|
||||
16 => 'sony-mcnd',
|
||||
17 => 'sony-vrna',
|
||||
18 => 'sony-atom',
|
||||
19 => 'sony-goha',
|
||||
20 => 'sony-leia',
|
||||
21 => 'sony-hwai',
|
||||
22 => 'sony-goku',
|
||||
23 => 'sony-luke',
|
||||
24 => 'sony-amno',
|
||||
25 => 'sony-prmr',
|
||||
26 => 'sony-ancy',
|
||||
),
|
||||
'@TP' =>
|
||||
array (
|
||||
0 => 'Tpwv-Rdog',
|
||||
),
|
||||
'@TR' =>
|
||||
array (
|
||||
0 => 'trgp-trg1',
|
||||
1 => 'trgp-trg2',
|
||||
),
|
||||
);
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$S30PLUS_INDEX = array (
|
||||
'@21' =>
|
||||
array (
|
||||
0 => 215,
|
||||
),
|
||||
'@22' =>
|
||||
array (
|
||||
0 => 220,
|
||||
1 => 222,
|
||||
2 => 225,
|
||||
),
|
||||
'@23' =>
|
||||
array (
|
||||
0 => 230,
|
||||
),
|
||||
);
|
||||
+249
@@ -0,0 +1,249 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$S40_INDEX = array (
|
||||
'@10' =>
|
||||
array (
|
||||
0 => 109,
|
||||
),
|
||||
'@11' =>
|
||||
array (
|
||||
0 => 110,
|
||||
1 => 111,
|
||||
2 => '111.1',
|
||||
3 => 112,
|
||||
4 => 114,
|
||||
),
|
||||
'@16' =>
|
||||
array (
|
||||
0 => '1682c',
|
||||
),
|
||||
'@20' =>
|
||||
array (
|
||||
0 => 200,
|
||||
1 => 201,
|
||||
2 => 202,
|
||||
3 => 203,
|
||||
4 => 205,
|
||||
5 => '205.1',
|
||||
6 => '205.3',
|
||||
7 => 206,
|
||||
8 => '206.1',
|
||||
9 => 208,
|
||||
10 => '208.1',
|
||||
11 => '208.2',
|
||||
12 => '208.3',
|
||||
13 => '208.4',
|
||||
14 => 2055,
|
||||
15 => 2060,
|
||||
),
|
||||
'@21' =>
|
||||
array (
|
||||
0 => 210,
|
||||
1 => '210.2',
|
||||
2 => '210.3',
|
||||
3 => '210.4',
|
||||
4 => '210.5',
|
||||
),
|
||||
'@22' =>
|
||||
array (
|
||||
0 => '2220s!',
|
||||
),
|
||||
'@23' =>
|
||||
array (
|
||||
0 => '2320c!',
|
||||
1 => '2322c!',
|
||||
2 => '2323c!',
|
||||
3 => '2330c!',
|
||||
),
|
||||
'@26' =>
|
||||
array (
|
||||
0 => '2600c!',
|
||||
1 => '2680s!',
|
||||
2 => 2690,
|
||||
3 => 2692,
|
||||
),
|
||||
'@27' =>
|
||||
array (
|
||||
0 => '2700c!',
|
||||
1 => '2710c',
|
||||
2 => '2710c-2',
|
||||
3 => '2720a!',
|
||||
4 => '2730c!',
|
||||
),
|
||||
'@30' =>
|
||||
array (
|
||||
0 => 300,
|
||||
1 => 301,
|
||||
2 => '301.1',
|
||||
3 => 302,
|
||||
4 => 303,
|
||||
5 => 305,
|
||||
6 => 306,
|
||||
7 => 308,
|
||||
8 => 309,
|
||||
9 => 3020,
|
||||
),
|
||||
'@31' =>
|
||||
array (
|
||||
0 => 310,
|
||||
1 => 311,
|
||||
2 => '3109c',
|
||||
3 => '3110c',
|
||||
4 => '3120c',
|
||||
5 => '3120classic',
|
||||
),
|
||||
'@32' =>
|
||||
array (
|
||||
0 => '3208c',
|
||||
),
|
||||
'@35' =>
|
||||
array (
|
||||
0 => '3500c',
|
||||
1 => '3555b',
|
||||
),
|
||||
'@36' =>
|
||||
array (
|
||||
0 => '3600s',
|
||||
1 => '3610a',
|
||||
),
|
||||
'@37' =>
|
||||
array (
|
||||
0 => '3710fold',
|
||||
1 => '3720c',
|
||||
),
|
||||
'@50' =>
|
||||
array (
|
||||
0 => '5000!',
|
||||
),
|
||||
'@51' =>
|
||||
array (
|
||||
0 => 515,
|
||||
1 => '515.2',
|
||||
2 => '5130!',
|
||||
3 => '5130c!',
|
||||
4 => 5132,
|
||||
),
|
||||
'@52' =>
|
||||
array (
|
||||
0 => '5200!',
|
||||
1 => '5220!',
|
||||
),
|
||||
'@53' =>
|
||||
array (
|
||||
0 => '5300!',
|
||||
1 => '5310!',
|
||||
2 => 5330,
|
||||
3 => '5330-1d',
|
||||
),
|
||||
'@56' =>
|
||||
array (
|
||||
0 => '5610d!',
|
||||
),
|
||||
'@60' =>
|
||||
array (
|
||||
0 => '6070!',
|
||||
),
|
||||
'@62' =>
|
||||
array (
|
||||
0 => '6208c',
|
||||
1 => '6212c',
|
||||
2 => '6260s!',
|
||||
3 => '6230i!',
|
||||
4 => 6233,
|
||||
5 => 6234,
|
||||
6 => '6263!',
|
||||
7 => 6280,
|
||||
),
|
||||
'@63' =>
|
||||
array (
|
||||
0 => 6300,
|
||||
1 => '6300i',
|
||||
2 => 6301,
|
||||
3 => '6303c',
|
||||
4 => '6303classic',
|
||||
5 => '6303iclassic',
|
||||
6 => '6303ci',
|
||||
7 => 6350,
|
||||
),
|
||||
'@65' =>
|
||||
array (
|
||||
0 => '6500s!',
|
||||
),
|
||||
'@66' =>
|
||||
array (
|
||||
0 => '6600f!',
|
||||
1 => '6600s!',
|
||||
2 => '6600i!',
|
||||
),
|
||||
'@67' =>
|
||||
array (
|
||||
0 => '6700c!',
|
||||
1 => '6750c',
|
||||
),
|
||||
'@70' =>
|
||||
array (
|
||||
0 => '7070!',
|
||||
),
|
||||
'@71' =>
|
||||
array (
|
||||
0 => '7100s!',
|
||||
),
|
||||
'@72' =>
|
||||
array (
|
||||
0 => '7210s!',
|
||||
1 => '7210Supernova!',
|
||||
2 => '7230!',
|
||||
),
|
||||
'@73' =>
|
||||
array (
|
||||
0 => '7310c!',
|
||||
),
|
||||
'@75' =>
|
||||
array (
|
||||
0 => 7500,
|
||||
1 => '7510Supernova!',
|
||||
),
|
||||
'@76' =>
|
||||
array (
|
||||
0 => '7610Supernova!',
|
||||
),
|
||||
'@88' =>
|
||||
array (
|
||||
0 => '8800!',
|
||||
),
|
||||
'@C1' =>
|
||||
array (
|
||||
0 => 'C1-01!',
|
||||
1 => 'C1-02!',
|
||||
2 => 'C1-03!',
|
||||
),
|
||||
'@C2' =>
|
||||
array (
|
||||
0 => 'C2-00!',
|
||||
1 => 'C2-01!',
|
||||
2 => 'C2-02!',
|
||||
3 => 'C2-03!',
|
||||
4 => 'C2-05!',
|
||||
5 => 'C2-06!',
|
||||
),
|
||||
'@C3' =>
|
||||
array (
|
||||
0 => 'C3-00!',
|
||||
1 => 'C3-01!',
|
||||
),
|
||||
'@X2' =>
|
||||
array (
|
||||
0 => 'X2-00!',
|
||||
1 => 'X2-01!',
|
||||
2 => 'X2-02!',
|
||||
3 => 'X2-03!',
|
||||
4 => 'X2-05!',
|
||||
),
|
||||
'@X3' =>
|
||||
array (
|
||||
0 => 'X3-00!',
|
||||
1 => 'X3-02!',
|
||||
),
|
||||
);
|
||||
+344
@@ -0,0 +1,344 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$SYMBIAN_INDEX = array (
|
||||
'@' =>
|
||||
array (
|
||||
0 => '(?i)U1(a|i|iv)?$!',
|
||||
1 => '(?i)U5(a|i|iv)?$!',
|
||||
2 => '(?i)U8(a|i)?$!',
|
||||
),
|
||||
'@32' =>
|
||||
array (
|
||||
0 => 3230,
|
||||
1 => 3250,
|
||||
),
|
||||
'@36' =>
|
||||
array (
|
||||
0 => 3650,
|
||||
1 => 3660,
|
||||
),
|
||||
'@50' =>
|
||||
array (
|
||||
0 => 500,
|
||||
),
|
||||
'@52' =>
|
||||
array (
|
||||
0 => 5228,
|
||||
1 => '5233!',
|
||||
2 => '5230!',
|
||||
3 => 5232,
|
||||
4 => '5235!',
|
||||
5 => 5236,
|
||||
6 => 5238,
|
||||
7 => 5250,
|
||||
),
|
||||
'@53' =>
|
||||
array (
|
||||
0 => '5320!',
|
||||
),
|
||||
'@55' =>
|
||||
array (
|
||||
0 => '5500d!',
|
||||
1 => '5530!',
|
||||
),
|
||||
'@56' =>
|
||||
array (
|
||||
0 => '5630!',
|
||||
),
|
||||
'@57' =>
|
||||
array (
|
||||
0 => '5700!',
|
||||
1 => '5730!',
|
||||
),
|
||||
'@58' =>
|
||||
array (
|
||||
0 => '5800!',
|
||||
),
|
||||
'@60' =>
|
||||
array (
|
||||
0 => 600,
|
||||
1 => 603,
|
||||
),
|
||||
'@61' =>
|
||||
array (
|
||||
0 => '6110Navigator',
|
||||
1 => '6120c!',
|
||||
2 => '6121c!',
|
||||
3 => '6122c!',
|
||||
4 => '6124c',
|
||||
),
|
||||
'@62' =>
|
||||
array (
|
||||
0 => '6210 ?Navigator!',
|
||||
1 => '6220c!',
|
||||
2 => 6260,
|
||||
3 => '6290!',
|
||||
),
|
||||
'@66' =>
|
||||
array (
|
||||
0 => 6600,
|
||||
1 => 6630,
|
||||
2 => '6650d!',
|
||||
3 => 6670,
|
||||
4 => 6680,
|
||||
5 => 6681,
|
||||
),
|
||||
'@67' =>
|
||||
array (
|
||||
0 => '6700s',
|
||||
1 => '6700s-1c',
|
||||
2 => 6708,
|
||||
3 => '6710s',
|
||||
4 => '6720c!',
|
||||
5 => '6730c!',
|
||||
6 => '6760s!',
|
||||
7 => 6788,
|
||||
8 => '6788i',
|
||||
9 => '6790s-1b!',
|
||||
10 => '6790s-1c!',
|
||||
),
|
||||
'@70' =>
|
||||
array (
|
||||
0 => 700,
|
||||
1 => 701,
|
||||
2 => '702T',
|
||||
),
|
||||
'@76' =>
|
||||
array (
|
||||
0 => 7610,
|
||||
1 => 7650,
|
||||
2 => 7660,
|
||||
),
|
||||
'@80' =>
|
||||
array (
|
||||
0 => '801T',
|
||||
1 => 808,
|
||||
2 => '808PureView',
|
||||
3 => '808 PureView',
|
||||
),
|
||||
'@A1' =>
|
||||
array (
|
||||
0 => 'A1000',
|
||||
),
|
||||
'@A9' =>
|
||||
array (
|
||||
0 => 'A920',
|
||||
1 => 'A925',
|
||||
),
|
||||
'@BE' =>
|
||||
array (
|
||||
0 => 'BenQ P30',
|
||||
1 => 'BenQ P31',
|
||||
),
|
||||
'@C5' =>
|
||||
array (
|
||||
0 => 'C5-00!',
|
||||
1 => 'C5-01',
|
||||
2 => 'C5-03!',
|
||||
3 => 'C5-04',
|
||||
4 => 'C5-05',
|
||||
5 => 'C5-06',
|
||||
),
|
||||
'@C6' =>
|
||||
array (
|
||||
0 => 'C6-00!',
|
||||
1 => 'C6-01!',
|
||||
),
|
||||
'@C7' =>
|
||||
array (
|
||||
0 => 'C7-00!',
|
||||
),
|
||||
'@CO' =>
|
||||
array (
|
||||
0 => 'ConstellationT',
|
||||
1 => 'ConstellationQuest',
|
||||
),
|
||||
'@E-' =>
|
||||
array (
|
||||
0 => 'E-90-1',
|
||||
),
|
||||
'@E5' =>
|
||||
array (
|
||||
0 => 'E5-00!',
|
||||
1 => 'E50(-[1-9])?$!',
|
||||
2 => 'E51(-[1-9])?$!',
|
||||
3 => 'E52(-[1-9])?$!',
|
||||
4 => 'E55(-[1-9])?$!',
|
||||
),
|
||||
'@E6' =>
|
||||
array (
|
||||
0 => 'E6',
|
||||
1 => 'E6-00',
|
||||
2 => 'E60(-[1-9])?$!',
|
||||
3 => 'E61i!',
|
||||
4 => 'E61(-[1-9])?$!',
|
||||
5 => 'E62(-[1-9])?$!',
|
||||
6 => 'E63(-[1-9])?$!',
|
||||
7 => 'E65(-[1-9])?$!',
|
||||
8 => 'E66(-[1-9])?$!',
|
||||
),
|
||||
'@E7' =>
|
||||
array (
|
||||
0 => 'E7-00',
|
||||
1 => 'E70(-[1-9])?$!',
|
||||
2 => 'E71x',
|
||||
3 => 'E71(-[1-9])?$!',
|
||||
4 => 'E72(-[1-9])?$!',
|
||||
5 => 'E73(-[1-9])?$!',
|
||||
6 => 'E75(-[1-9])?$!',
|
||||
),
|
||||
'@E9' =>
|
||||
array (
|
||||
0 => 'E90(-[1-9])?$!',
|
||||
),
|
||||
'@G7' =>
|
||||
array (
|
||||
0 => 'G700',
|
||||
),
|
||||
'@G9' =>
|
||||
array (
|
||||
0 => 'G900',
|
||||
),
|
||||
'@I7' =>
|
||||
array (
|
||||
0 => 'I7710',
|
||||
),
|
||||
'@I8' =>
|
||||
array (
|
||||
0 => 'I8510',
|
||||
1 => 'I8910',
|
||||
),
|
||||
'@LG' =>
|
||||
array (
|
||||
0 => 'LG KS10',
|
||||
1 => 'LGKT610',
|
||||
2 => 'LGKT615',
|
||||
),
|
||||
'@M1' =>
|
||||
array (
|
||||
0 => 'M1000',
|
||||
),
|
||||
'@M6' =>
|
||||
array (
|
||||
0 => 'M600i',
|
||||
),
|
||||
'@N-' =>
|
||||
array (
|
||||
0 => 'N-Gage',
|
||||
1 => 'N-GageQD',
|
||||
),
|
||||
'@N5' =>
|
||||
array (
|
||||
0 => 'N5233!',
|
||||
),
|
||||
'@N7' =>
|
||||
array (
|
||||
0 => 'N70(-[1-9])?$!',
|
||||
1 => 'N71(-[1-9])?$!',
|
||||
2 => 'N72(-[1-9])?$!',
|
||||
3 => 'N73(-[1-9])?$!',
|
||||
4 => 'N75(-[1-9])?$!',
|
||||
5 => 'N76(-[1-9])?$!',
|
||||
6 => 'N77(-[1-9])?$!',
|
||||
7 => 'N78(-[1-9])?$!',
|
||||
8 => 'N79(-[1-9])?$!',
|
||||
),
|
||||
'@N8' =>
|
||||
array (
|
||||
0 => 'N8-00',
|
||||
1 => 'N80(-[1-9])?$!',
|
||||
2 => 'N81(-[1-9])?$!',
|
||||
3 => 'N82(-[1-9])?$!',
|
||||
4 => 'N85(-[1-9])?$!',
|
||||
5 => 'N86(-[1-9])?$!',
|
||||
6 => 'N86 ?8MP$!',
|
||||
),
|
||||
'@N9' =>
|
||||
array (
|
||||
0 => 'N90(-[1-9])?$!',
|
||||
1 => 'N91(-[1-9])?$!',
|
||||
2 => 'N92(-[1-9])?$!',
|
||||
3 => 'N93(-[1-9])?$!',
|
||||
4 => 'N93i',
|
||||
5 => 'N95(-[1-9])?$!',
|
||||
6 => 'N95[ -]8GB(-[1-9])?!',
|
||||
7 => 'N96(-[1-9])?$!',
|
||||
8 => 'N97(-[1-3])?$!',
|
||||
9 => 'N97i',
|
||||
10 => 'N97(-[4-5])?$!',
|
||||
11 => 'N97 ?mini!',
|
||||
),
|
||||
'@NO' =>
|
||||
array (
|
||||
0 => 'Nokia N81',
|
||||
1 => 'Nokia N81 8GB',
|
||||
),
|
||||
'@OR' =>
|
||||
array (
|
||||
0 => 'Oro',
|
||||
),
|
||||
'@P1' =>
|
||||
array (
|
||||
0 => 'P1i',
|
||||
),
|
||||
'@P9' =>
|
||||
array (
|
||||
0 => 'P910i',
|
||||
1 => 'P990i',
|
||||
),
|
||||
'@PA' =>
|
||||
array (
|
||||
0 => 'Panasonic-X700',
|
||||
1 => 'Panasonic-X800',
|
||||
),
|
||||
'@RI' =>
|
||||
array (
|
||||
0 => 'RIZR-Z8',
|
||||
1 => 'RIZR-Z10',
|
||||
),
|
||||
'@SG' =>
|
||||
array (
|
||||
0 => 'SGH-D720',
|
||||
1 => 'SGH-D728',
|
||||
2 => 'SGH-D730',
|
||||
3 => 'SGH-i400!',
|
||||
4 => 'SGH-i408!',
|
||||
5 => 'SGH-i450!',
|
||||
6 => 'SGH-i455!',
|
||||
7 => 'SGH-i458!',
|
||||
8 => 'SGH-i520!',
|
||||
9 => 'SGH-i550!',
|
||||
10 => 'SGH-i560!',
|
||||
11 => 'SGH-i568!',
|
||||
12 => 'SGH-i570!',
|
||||
13 => 'SGH-G810',
|
||||
),
|
||||
'@T7' =>
|
||||
array (
|
||||
0 => 'T7-00',
|
||||
),
|
||||
'@U' =>
|
||||
array (
|
||||
0 => 'U',
|
||||
),
|
||||
'@W9' =>
|
||||
array (
|
||||
0 => 'W950i',
|
||||
1 => 'W960i',
|
||||
),
|
||||
'@X5' =>
|
||||
array (
|
||||
0 => 'X5-00',
|
||||
1 => 'X5-01',
|
||||
),
|
||||
'@X6' =>
|
||||
array (
|
||||
0 => 'X6-00!',
|
||||
),
|
||||
'@X7' =>
|
||||
array (
|
||||
0 => 'X7-00!',
|
||||
),
|
||||
);
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$TIZEN_INDEX = array (
|
||||
'@AR' =>
|
||||
array (
|
||||
0 => '(ARMV7 )?SM-Z9005!',
|
||||
),
|
||||
'@BA' =>
|
||||
array (
|
||||
0 => 'Baltic',
|
||||
),
|
||||
'@EM' =>
|
||||
array (
|
||||
0 => 'Emulator',
|
||||
),
|
||||
'@FA' =>
|
||||
array (
|
||||
0 => 'FamilyHub',
|
||||
),
|
||||
'@GT' =>
|
||||
array (
|
||||
0 => 'GT-I8800!',
|
||||
1 => 'GT-I8805!',
|
||||
2 => 'GT-I9500!',
|
||||
),
|
||||
'@HA' =>
|
||||
array (
|
||||
0 => 'hawkp',
|
||||
),
|
||||
'@KI' =>
|
||||
array (
|
||||
0 => 'KIRAN',
|
||||
),
|
||||
'@MO' =>
|
||||
array (
|
||||
0 => 'Mobile-RD-PQ',
|
||||
1 => 'Mobile-Emulator',
|
||||
),
|
||||
'@NX' =>
|
||||
array (
|
||||
0 => 'NX300',
|
||||
),
|
||||
'@RF' =>
|
||||
array (
|
||||
0 => 'RF10M9995!',
|
||||
1 => 'RF23M8590!',
|
||||
2 => 'RF265BEAE!',
|
||||
3 => 'RF28M9580!',
|
||||
4 => 'RF56M9540!',
|
||||
5 => 'RF85K9993!',
|
||||
6 => 'RF85M95A2!',
|
||||
),
|
||||
'@RH' =>
|
||||
array (
|
||||
0 => 'RH81M8090!',
|
||||
),
|
||||
'@SC' =>
|
||||
array (
|
||||
0 => 'SC-03F',
|
||||
),
|
||||
'@SD' =>
|
||||
array (
|
||||
0 => 'sdk',
|
||||
),
|
||||
'@SE' =>
|
||||
array (
|
||||
0 => 'SEC SC-001',
|
||||
1 => 'SEC SC-03F',
|
||||
),
|
||||
'@SG' =>
|
||||
array (
|
||||
0 => 'SGH-N099',
|
||||
),
|
||||
'@SM' =>
|
||||
array (
|
||||
0 => 'SM-HIGGS',
|
||||
1 => '(ARMV7 )?SM-Z9005!',
|
||||
2 => 'SM-Z130!',
|
||||
3 => 'SM-Z200!',
|
||||
4 => 'SM-Z250!',
|
||||
5 => 'SM-Z300!',
|
||||
6 => 'SM-Z400!',
|
||||
7 => 'SM-Z500!',
|
||||
8 => 'SM-Z700!',
|
||||
9 => 'SM-Z900!',
|
||||
10 => 'SM-Z910!',
|
||||
11 => 'SM-G870F0',
|
||||
12 => 'SM-R360!',
|
||||
13 => 'SM-R600!',
|
||||
14 => 'SM-R720!',
|
||||
15 => 'SM-R730!',
|
||||
16 => 'SM-R732!',
|
||||
17 => 'SM-R735!',
|
||||
18 => 'SM-R750!',
|
||||
19 => 'SM-R760!',
|
||||
20 => 'SM-R765!',
|
||||
21 => 'SM-R770!',
|
||||
22 => 'SM-R805!',
|
||||
),
|
||||
'@TI' =>
|
||||
array (
|
||||
0 => 'TIZEN SM-Z130!',
|
||||
1 => 'TIZEN SM-Z300!',
|
||||
2 => 'TIZEN Emulator',
|
||||
),
|
||||
'@TM' =>
|
||||
array (
|
||||
0 => 'TM1',
|
||||
),
|
||||
'@XU' =>
|
||||
array (
|
||||
0 => 'xu3',
|
||||
),
|
||||
'@Z3' =>
|
||||
array (
|
||||
0 => 'Z3 Z910F',
|
||||
),
|
||||
);
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$TOUCHWIZ_INDEX = array (
|
||||
'@GT' =>
|
||||
array (
|
||||
0 => 'GT-B5310!',
|
||||
1 => 'GT-B3410',
|
||||
2 => 'GT-B7722',
|
||||
3 => 'GT-C3262',
|
||||
4 => 'GT-C33(00|03)!',
|
||||
5 => 'GT-C3312R',
|
||||
6 => 'GT-C3312!',
|
||||
7 => 'GT-C3330',
|
||||
8 => 'GT-C6712',
|
||||
9 => 'GT-E2652!',
|
||||
10 => 'GT-I6230!',
|
||||
11 => 'GT-I6712!',
|
||||
12 => 'GT-M3710',
|
||||
13 => 'GT-M5650',
|
||||
14 => 'GT-S3370!',
|
||||
15 => 'GT-S36(50|53)!',
|
||||
16 => 'GT-S3770!',
|
||||
17 => 'GT-S38(00|02)!',
|
||||
18 => 'GT-S3850',
|
||||
19 => 'GT-S5220',
|
||||
20 => 'GT-S5222R',
|
||||
21 => 'GT-S5222',
|
||||
22 => 'GT-S52(30|33)!',
|
||||
23 => 'GT-S5260P',
|
||||
24 => 'GT-S52(60|63)!',
|
||||
25 => 'GT-S5292R',
|
||||
26 => 'GT-S5292',
|
||||
27 => 'GT-S5560!',
|
||||
28 => 'GT-S5600',
|
||||
29 => 'GT-S5603',
|
||||
30 => 'GT-S5620!',
|
||||
31 => 'GT-S5680',
|
||||
32 => 'GT-S7550',
|
||||
33 => 'GT-S8000c',
|
||||
34 => 'GT-S8003',
|
||||
),
|
||||
'@S8' =>
|
||||
array (
|
||||
0 => 'S80(00|03)!',
|
||||
),
|
||||
'@SG' =>
|
||||
array (
|
||||
0 => 'SGH-A597',
|
||||
1 => 'SGH-F480',
|
||||
2 => 'SGH-F480I',
|
||||
3 => 'SGH-T528g',
|
||||
),
|
||||
);
|
||||
+535
@@ -0,0 +1,535 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$WM_INDEX = array (
|
||||
'@' =>
|
||||
array (
|
||||
0 => '.*T5555!',
|
||||
1 => '.*T8585!',
|
||||
2 => '.*S521!',
|
||||
3 => '.*T33(20|33|35)!',
|
||||
4 => '.*T5353!',
|
||||
5 => '.*P3700!',
|
||||
6 => '.*T82(82|83)!',
|
||||
7 => '.*T73(73|80)!',
|
||||
8 => '.*T7272!',
|
||||
9 => '.*T2223!',
|
||||
),
|
||||
'@-G' =>
|
||||
array (
|
||||
0 => '-GalaxyII',
|
||||
1 => '-GalaxyMini',
|
||||
),
|
||||
'@-P' =>
|
||||
array (
|
||||
0 => '-P525!',
|
||||
1 => '-P526!',
|
||||
2 => '-P527!',
|
||||
3 => '-P552w!',
|
||||
4 => '-P552!',
|
||||
5 => '-P565!',
|
||||
6 => '-P735!',
|
||||
),
|
||||
'@12' =>
|
||||
array (
|
||||
0 => 1210,
|
||||
),
|
||||
'@A3' =>
|
||||
array (
|
||||
0 => 'A3100',
|
||||
1 => 'A3300c',
|
||||
),
|
||||
'@A4' =>
|
||||
array (
|
||||
0 => 'A4500!',
|
||||
),
|
||||
'@AL' =>
|
||||
array (
|
||||
0 => 'Alltel HTC PPC6800',
|
||||
1 => 'Alltel HTC Touch',
|
||||
2 => 'Alltel HTC Touch Diamond',
|
||||
),
|
||||
'@AM' =>
|
||||
array (
|
||||
0 => 'Ameo!',
|
||||
),
|
||||
'@BI' =>
|
||||
array (
|
||||
0 => 'Bird T900',
|
||||
),
|
||||
'@C6' =>
|
||||
array (
|
||||
0 => 'C6625',
|
||||
),
|
||||
'@CH' =>
|
||||
array (
|
||||
0 => 'CHT 9100!',
|
||||
),
|
||||
'@CO' =>
|
||||
array (
|
||||
0 => 'Coolpad F800',
|
||||
),
|
||||
'@DA' =>
|
||||
array (
|
||||
0 => 'Datalogic Memor',
|
||||
),
|
||||
'@DO' =>
|
||||
array (
|
||||
0 => 'Dopod838Pro',
|
||||
1 => 'DopodD810',
|
||||
2 => 'dopod-S900c',
|
||||
3 => 'dopodT5588',
|
||||
4 => 'dopodT8388',
|
||||
5 => 'dopodT8588',
|
||||
),
|
||||
'@DX' =>
|
||||
array (
|
||||
0 => 'DX900',
|
||||
),
|
||||
'@E1' =>
|
||||
array (
|
||||
0 => 'E100',
|
||||
),
|
||||
'@ES' =>
|
||||
array (
|
||||
0 => 'ES405B!',
|
||||
),
|
||||
'@F9' =>
|
||||
array (
|
||||
0 => 'F900',
|
||||
),
|
||||
'@GA' =>
|
||||
array (
|
||||
0 => 'garmin-asus-Nuvifone-M10',
|
||||
),
|
||||
'@GI' =>
|
||||
array (
|
||||
0 => 'GIGABYTE-MS800',
|
||||
),
|
||||
'@GM' =>
|
||||
array (
|
||||
0 => 'GM730',
|
||||
1 => 'GM750Q',
|
||||
),
|
||||
'@GT' =>
|
||||
array (
|
||||
0 => 'GT-B5722',
|
||||
1 => 'GT-B6520',
|
||||
2 => 'GT-B7300',
|
||||
3 => 'GT-B7320!',
|
||||
4 => 'GT-B7330!',
|
||||
5 => 'GT-B7350',
|
||||
6 => 'GT-B7610',
|
||||
7 => 'GT-C6625',
|
||||
8 => 'GT-I8000!',
|
||||
),
|
||||
'@GW' =>
|
||||
array (
|
||||
0 => 'GW550',
|
||||
1 => 'GW825',
|
||||
),
|
||||
'@H-' =>
|
||||
array (
|
||||
0 => 'H-21',
|
||||
),
|
||||
'@HD' =>
|
||||
array (
|
||||
0 => '(HTC )?HD mini!',
|
||||
1 => '(HTC )?HD2!',
|
||||
),
|
||||
'@HP' =>
|
||||
array (
|
||||
0 => 'HP iPAQ 510',
|
||||
1 => 'HPiPAQ510!',
|
||||
2 => 'HPiPAQ610',
|
||||
3 => 'HPiPAQ910!',
|
||||
4 => 'HP iPAQ h6300',
|
||||
5 => 'HP iPAQ hw6500!',
|
||||
6 => 'HPiPAQhw6900!',
|
||||
7 => 'HPiPAQrw6800!',
|
||||
8 => 'HPiPAQrw6815!',
|
||||
9 => 'HPiPAQDataMessenger!',
|
||||
10 => 'HPiPAQVoiceMessenger!',
|
||||
11 => 'HPiPAQGlisten',
|
||||
12 => 'HP KB1',
|
||||
),
|
||||
'@HT' =>
|
||||
array (
|
||||
0 => 'HTC8500',
|
||||
1 => 'HTC P3300',
|
||||
2 => 'HTC love',
|
||||
3 => 'HTC P3350',
|
||||
4 => 'HTC P3400!',
|
||||
5 => 'HTC P3450!',
|
||||
6 => 'HTC HERALD',
|
||||
7 => 'HTC P6300',
|
||||
8 => 'HTC P6500',
|
||||
9 => 'HTC X7500',
|
||||
10 => 'HTC X7510',
|
||||
11 => '(HTC )?HD mini!',
|
||||
12 => '(HTC )?HD2!',
|
||||
13 => 'HTC T8290',
|
||||
14 => 'HTC MAX 4G',
|
||||
15 => 'HTC MTeoR',
|
||||
16 => 'HTC Prophet',
|
||||
17 => 'HTC Snap!',
|
||||
18 => 'HTC Maple S520',
|
||||
19 => 'HTC S620!',
|
||||
20 => 'HTC Excalibur',
|
||||
21 => 'HTC S630',
|
||||
22 => 'HTC S710',
|
||||
23 => 'HTC S730',
|
||||
24 => 'HTC S740',
|
||||
25 => 'HTC Touch',
|
||||
26 => 'HTC Elf',
|
||||
27 => 'HTC 6900',
|
||||
28 => 'HTC6900',
|
||||
29 => 'HTC6900-MR1',
|
||||
30 => 'HTC TouchDual',
|
||||
31 => 'HTC Touch 3G!',
|
||||
32 => 'HTC Jade',
|
||||
33 => 'HTC Mega!',
|
||||
34 => 'HTC Touch2!',
|
||||
35 => 'HTC Touch Cruise!',
|
||||
36 => 'HTC P3650',
|
||||
37 => 'HTC P3651',
|
||||
38 => 'HTC Polaris',
|
||||
39 => 'HTC Touch Diamond2!',
|
||||
40 => 'HTC Touch Diamond!',
|
||||
41 => 'HTC Diamond',
|
||||
42 => 'HTC P3701',
|
||||
43 => 'HTC P5500',
|
||||
44 => 'HTC P5310!',
|
||||
45 => 'HTC Touch HD2!',
|
||||
46 => 'HTC Touch HD!',
|
||||
47 => 'HTC Touch Pro2!',
|
||||
48 => 'HTC Touch Pro!',
|
||||
49 => 'HTC P4600',
|
||||
50 => 'HTC Raphael',
|
||||
51 => 'HTC Touch Viva!',
|
||||
52 => 'HTC Trinity',
|
||||
53 => 'HTC P3600',
|
||||
54 => 'HTC P3600i',
|
||||
55 => 'HTC v3600',
|
||||
56 => 'HTC TyTN II',
|
||||
57 => 'HTC Kaiser',
|
||||
58 => 'HTC TyTN!',
|
||||
59 => 'HTC Mercury',
|
||||
60 => 'HTC wizard',
|
||||
61 => 'HTCPPC6850!',
|
||||
62 => 'HTC VDA V',
|
||||
63 => 'HTC v1510',
|
||||
64 => 'HTC VPACompactIV',
|
||||
65 => 'HT01A',
|
||||
),
|
||||
'@I-' =>
|
||||
array (
|
||||
0 => 'i-mate JAMA',
|
||||
1 => 'i-mate JAMAQ',
|
||||
2 => 'i-mate JAMin',
|
||||
3 => 'i-mate JASJAM',
|
||||
4 => 'i-mate JAQ',
|
||||
5 => 'i-mate JAQ3',
|
||||
6 => 'i-mate K-JAM',
|
||||
7 => 'i-mate PDAL',
|
||||
8 => 'i-mate 6150',
|
||||
9 => 'i-mate 8150!',
|
||||
10 => 'i-mate 8502',
|
||||
11 => 'i-mate 9502!',
|
||||
),
|
||||
'@K-' =>
|
||||
array (
|
||||
0 => 'K-Touch W366!',
|
||||
),
|
||||
'@KD' =>
|
||||
array (
|
||||
0 => 'KDDI-HT01',
|
||||
),
|
||||
'@KY' =>
|
||||
array (
|
||||
0 => 'Kyocera-E4000',
|
||||
),
|
||||
'@LE' =>
|
||||
array (
|
||||
0 => 'Lenovo ET860',
|
||||
1 => 'LENOVO-ET980',
|
||||
),
|
||||
'@LG' =>
|
||||
array (
|
||||
0 => 'LG-GM730!',
|
||||
1 => 'LG-GM750!',
|
||||
2 => 'LG-GW550!',
|
||||
3 => 'LG-KS20',
|
||||
4 => 'LG-MS25',
|
||||
5 => 'LGE VS750',
|
||||
),
|
||||
'@M1' =>
|
||||
array (
|
||||
0 => 'M1i',
|
||||
),
|
||||
'@M5' =>
|
||||
array (
|
||||
0 => 'M530w!',
|
||||
),
|
||||
'@M9' =>
|
||||
array (
|
||||
0 => 'M930!',
|
||||
),
|
||||
'@MC' =>
|
||||
array (
|
||||
0 => 'MC45!',
|
||||
1 => 'MC659B!',
|
||||
),
|
||||
'@MD' =>
|
||||
array (
|
||||
0 => 'MDA III!',
|
||||
1 => 'MDA compact II!',
|
||||
2 => 'MDA compact!',
|
||||
3 => 'MDA Pro!',
|
||||
4 => 'MDA Touch!',
|
||||
5 => 'MDA Vario!',
|
||||
),
|
||||
'@NU' =>
|
||||
array (
|
||||
0 => 'Nuvifone-M10',
|
||||
1 => 'Nuvifone-M20',
|
||||
),
|
||||
'@O2' =>
|
||||
array (
|
||||
0 => 'o2 Xda comet',
|
||||
1 => 'O2 Xda 2mini',
|
||||
2 => 'O2 Xda 2s',
|
||||
),
|
||||
'@P3' =>
|
||||
array (
|
||||
0 => 'P3470!',
|
||||
1 => 'P3450',
|
||||
2 => 'P3650',
|
||||
3 => 'P3650t',
|
||||
4 => 'P3600!',
|
||||
),
|
||||
'@P4' =>
|
||||
array (
|
||||
0 => 'P400',
|
||||
1 => 'P4350!',
|
||||
2 => 'P4550',
|
||||
),
|
||||
'@P5' =>
|
||||
array (
|
||||
0 => 'P550',
|
||||
),
|
||||
'@P7' =>
|
||||
array (
|
||||
0 => 'P750',
|
||||
),
|
||||
'@PA' =>
|
||||
array (
|
||||
0 => 'Palm500!',
|
||||
1 => 'Palm750',
|
||||
2 => 'Palm850!',
|
||||
3 => 'Palm Treo850e',
|
||||
4 => 'PANTECH-C810',
|
||||
),
|
||||
'@PP' =>
|
||||
array (
|
||||
0 => 'PPC6850!',
|
||||
),
|
||||
'@Q-' =>
|
||||
array (
|
||||
0 => 'Q-UMTS',
|
||||
),
|
||||
'@Q8' =>
|
||||
array (
|
||||
0 => 'Q8',
|
||||
),
|
||||
'@Q9' =>
|
||||
array (
|
||||
0 => 'Q9',
|
||||
1 => 'Q9c!',
|
||||
2 => 'Q9m!',
|
||||
),
|
||||
'@S0' =>
|
||||
array (
|
||||
0 => 'S01SH',
|
||||
1 => 'S01SH2',
|
||||
),
|
||||
'@S1' =>
|
||||
array (
|
||||
0 => 'S11HT',
|
||||
1 => 'S12HT',
|
||||
),
|
||||
'@S2' =>
|
||||
array (
|
||||
0 => 'S200',
|
||||
1 => 'S21HT',
|
||||
2 => 'S22HT',
|
||||
),
|
||||
'@SC' =>
|
||||
array (
|
||||
0 => 'SCH-M490',
|
||||
1 => 'SCH-M710',
|
||||
2 => 'SCH-M715',
|
||||
3 => 'SCH-i220!',
|
||||
4 => 'SCH-i225!',
|
||||
5 => 'SCH-i760!',
|
||||
6 => 'SCH-i770!',
|
||||
7 => 'SCHI910!',
|
||||
8 => 'SCH-i920',
|
||||
9 => 'SC-01B',
|
||||
),
|
||||
'@SF' =>
|
||||
array (
|
||||
0 => 'SFR v3650!',
|
||||
),
|
||||
'@SG' =>
|
||||
array (
|
||||
0 => 'SGH-i600!',
|
||||
1 => 'SGH-i601!',
|
||||
2 => 'SGH-I607',
|
||||
3 => 'SGH-i608!',
|
||||
4 => 'SGH-I617',
|
||||
5 => 'SGH-I637',
|
||||
6 => 'SGH-i640!',
|
||||
7 => 'SGH-i718',
|
||||
8 => 'SGH-i718plus',
|
||||
9 => 'SGH-i728',
|
||||
10 => 'SGH-i780!',
|
||||
11 => 'SGH-i900!',
|
||||
12 => 'SGH-i908E',
|
||||
),
|
||||
'@SI' =>
|
||||
array (
|
||||
0 => 'SIE-SX66',
|
||||
1 => 'sigmarion3',
|
||||
),
|
||||
'@SP' =>
|
||||
array (
|
||||
0 => 'Sprint:MotoQ9c',
|
||||
1 => 'Sprint Treo850e',
|
||||
2 => 'SPH-M7200',
|
||||
3 => 'SPH-M7350',
|
||||
4 => 'SPH-M8400',
|
||||
5 => 'SPHI325!',
|
||||
6 => 'Spice D1100',
|
||||
7 => 'SPV E600',
|
||||
8 => 'SPV E650',
|
||||
9 => 'SPV M700',
|
||||
10 => 'SPV M2000',
|
||||
11 => 'SPV M3100',
|
||||
12 => 'Sprint S511',
|
||||
13 => 'Sprint:SPH-ip830w',
|
||||
14 => 'Sprint:PPC6600-1',
|
||||
15 => 'Sprint:PPC-6700',
|
||||
16 => 'Sprint:PPC6800',
|
||||
17 => 'Sprint PPC6850SP',
|
||||
18 => 'Sprint MP6850SP',
|
||||
19 => 'Sprint MP6900SP',
|
||||
20 => 'Sprint MP6950SP',
|
||||
),
|
||||
'@T-' =>
|
||||
array (
|
||||
0 => 'T-Mobile Atlas',
|
||||
1 => 'T-Mobile Dash',
|
||||
2 => 'T-Mobile LEO',
|
||||
3 => 'T-Mobile Cleopatra',
|
||||
4 => 'T-01A!',
|
||||
5 => 'T-01B!',
|
||||
),
|
||||
'@T5' =>
|
||||
array (
|
||||
0 => 'T5388',
|
||||
),
|
||||
'@T9' =>
|
||||
array (
|
||||
0 => 'T9188',
|
||||
1 => 'T9199',
|
||||
),
|
||||
'@TG' =>
|
||||
array (
|
||||
0 => '(Toshiba[- ])?TG01!',
|
||||
),
|
||||
'@TO' =>
|
||||
array (
|
||||
0 => '(Toshiba[- ])?TG01!',
|
||||
),
|
||||
'@TR' =>
|
||||
array (
|
||||
0 => 'Treo800w',
|
||||
),
|
||||
'@V1' =>
|
||||
array (
|
||||
0 => 'v1415',
|
||||
1 => 'v1240',
|
||||
2 => 'v1210',
|
||||
3 => 'v1640',
|
||||
),
|
||||
'@VE' =>
|
||||
array (
|
||||
0 => 'Velocity',
|
||||
),
|
||||
'@VI' =>
|
||||
array (
|
||||
0 => 'VIP12!',
|
||||
),
|
||||
'@VP' =>
|
||||
array (
|
||||
0 => 'VPA Touch',
|
||||
),
|
||||
'@W3' =>
|
||||
array (
|
||||
0 => 'W366',
|
||||
),
|
||||
'@WS' =>
|
||||
array (
|
||||
0 => 'WS003SH',
|
||||
1 => 'WS004SH',
|
||||
2 => 'WS007SH',
|
||||
3 => 'WS011SH',
|
||||
4 => 'WS020SH',
|
||||
5 => 'WS027SH',
|
||||
),
|
||||
'@X0' =>
|
||||
array (
|
||||
0 => 'X01T',
|
||||
1 => 'X02T!',
|
||||
2 => 'X01HT',
|
||||
3 => 'X02HT',
|
||||
4 => 'X03HT',
|
||||
5 => 'X04HT',
|
||||
6 => 'X05HT',
|
||||
7 => 'X01SC',
|
||||
),
|
||||
'@X1' =>
|
||||
array (
|
||||
0 => 'X1',
|
||||
1 => 'X1[ia]!',
|
||||
),
|
||||
'@X2' =>
|
||||
array (
|
||||
0 => 'X2',
|
||||
1 => 'X2[ia]!',
|
||||
),
|
||||
'@XD' =>
|
||||
array (
|
||||
0 => 'Xda diamond',
|
||||
1 => 'Xda neo',
|
||||
2 => 'Xda nova',
|
||||
3 => 'Xda orbit',
|
||||
4 => 'Xda terra',
|
||||
5 => 'Xda trion',
|
||||
),
|
||||
'@XV' =>
|
||||
array (
|
||||
0 => 'XV6175!',
|
||||
1 => 'XV6850!',
|
||||
2 => 'XV6875!',
|
||||
3 => 'XV6900',
|
||||
4 => 'XV6975',
|
||||
),
|
||||
'@ZT' =>
|
||||
array (
|
||||
0 => 'ZTE E N72',
|
||||
1 => 'ZTE E X70',
|
||||
),
|
||||
);
|
||||
+548
@@ -0,0 +1,548 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$WP_INDEX = array (
|
||||
'@' =>
|
||||
array (
|
||||
0 => '(HD7|.*T92(92|95|96))!',
|
||||
1 => '((7 )?Mozart|.*T86(97|98))!',
|
||||
2 => '(7 Pro|.*T75(75|76))!',
|
||||
3 => '.*T8788!',
|
||||
4 => '((7 )?Trophy|.*T8686)!',
|
||||
5 => '(Radar|.*C110e)!',
|
||||
6 => '.*X310e!',
|
||||
7 => '(Lumia ?|Nokia ?)?[0-9]{3,4}!!',
|
||||
),
|
||||
'@- ' =>
|
||||
array (
|
||||
0 => '- BUSH Windows Phone',
|
||||
1 => '- Lazer SMART WIND',
|
||||
),
|
||||
'@0P' =>
|
||||
array (
|
||||
0 => '0P6B140',
|
||||
1 => '0P6B180',
|
||||
),
|
||||
'@40' =>
|
||||
array (
|
||||
0 => '40 Cesium',
|
||||
),
|
||||
'@47' =>
|
||||
array (
|
||||
0 => 47,
|
||||
),
|
||||
'@4A' =>
|
||||
array (
|
||||
0 => '4Afrika',
|
||||
),
|
||||
'@69' =>
|
||||
array (
|
||||
0 => '6990LVW',
|
||||
),
|
||||
'@7 ' =>
|
||||
array (
|
||||
0 => '((7 )?Mozart|.*T86(97|98))!',
|
||||
1 => '7 HTC MOZART',
|
||||
2 => '(7 Pro|.*T75(75|76))!',
|
||||
3 => '7 Surround',
|
||||
4 => '((7 )?Trophy|.*T8686)!',
|
||||
),
|
||||
'@75' =>
|
||||
array (
|
||||
0 => '75eL0N',
|
||||
),
|
||||
'@8S' =>
|
||||
array (
|
||||
0 => '8S',
|
||||
1 => '8S by HTC',
|
||||
),
|
||||
'@8X' =>
|
||||
array (
|
||||
0 => '8X',
|
||||
1 => '8X by HTC',
|
||||
),
|
||||
'@;H' =>
|
||||
array (
|
||||
0 => ';HD2',
|
||||
),
|
||||
'@;P' =>
|
||||
array (
|
||||
0 => ';PD67100',
|
||||
),
|
||||
'@<M' =>
|
||||
array (
|
||||
0 => '<model>!',
|
||||
),
|
||||
'@A6' =>
|
||||
array (
|
||||
0 => 'A620(b|d|e|m|t)!',
|
||||
),
|
||||
'@AC' =>
|
||||
array (
|
||||
0 => 'AC50CE',
|
||||
1 => 'ACD U',
|
||||
2 => 'Accord',
|
||||
),
|
||||
'@AL' =>
|
||||
array (
|
||||
0 => 'Allegro',
|
||||
1 => 'Alpha Neon',
|
||||
2 => 'ALPHA PRIME 5',
|
||||
),
|
||||
'@AN' =>
|
||||
array (
|
||||
0 => 'Andi4L',
|
||||
1 => 'Android!',
|
||||
),
|
||||
'@AT' =>
|
||||
array (
|
||||
0 => 'Ativ S',
|
||||
1 => 'ATIV S Neo',
|
||||
),
|
||||
'@BI' =>
|
||||
array (
|
||||
0 => 'Billy 4',
|
||||
1 => 'Billy 4.7',
|
||||
),
|
||||
'@BP' =>
|
||||
array (
|
||||
0 => 'BP30.BM180',
|
||||
),
|
||||
'@C6' =>
|
||||
array (
|
||||
0 => 'C620(d|e|t)!',
|
||||
1 => 'C625(a|b)!',
|
||||
),
|
||||
'@CE' =>
|
||||
array (
|
||||
0 => 'CETUS',
|
||||
),
|
||||
'@CH' =>
|
||||
array (
|
||||
0 => 'CHERRY-MOBILE Alpha Luxe',
|
||||
),
|
||||
'@DO' =>
|
||||
array (
|
||||
0 => 'DolphinCT50',
|
||||
),
|
||||
'@E2' =>
|
||||
array (
|
||||
0 => 'E260T+',
|
||||
),
|
||||
'@E6' =>
|
||||
array (
|
||||
0 => 'E600',
|
||||
),
|
||||
'@ET' =>
|
||||
array (
|
||||
0 => 'Eternity',
|
||||
),
|
||||
'@FI' =>
|
||||
array (
|
||||
0 => 'FierceXL',
|
||||
),
|
||||
'@FO' =>
|
||||
array (
|
||||
0 => 'Focus i917!',
|
||||
1 => 'FOCUS S',
|
||||
),
|
||||
'@FT' =>
|
||||
array (
|
||||
0 => 'FTJ152E',
|
||||
1 => 'FTJ152F',
|
||||
),
|
||||
'@FZ' =>
|
||||
array (
|
||||
0 => 'FZ-E1',
|
||||
),
|
||||
'@GA' =>
|
||||
array (
|
||||
0 => 'Galaxy6',
|
||||
),
|
||||
'@GO' =>
|
||||
array (
|
||||
0 => 'Gold',
|
||||
),
|
||||
'@GT' =>
|
||||
array (
|
||||
0 => 'GT-[IS][0-9]{4,4}!!',
|
||||
),
|
||||
'@GW' =>
|
||||
array (
|
||||
0 => 'GW910',
|
||||
),
|
||||
'@H8' =>
|
||||
array (
|
||||
0 => 'H883G',
|
||||
),
|
||||
'@HA' =>
|
||||
array (
|
||||
0 => 'Harley Davidson',
|
||||
1 => 'Harley-Davidson',
|
||||
2 => 'Haden',
|
||||
),
|
||||
'@HD' =>
|
||||
array (
|
||||
0 => 'HD2',
|
||||
1 => 'HD2(Leo',
|
||||
2 => 'HD2 LEO',
|
||||
3 => '(HD7|.*T92(92|95|96))!',
|
||||
),
|
||||
'@HE' =>
|
||||
array (
|
||||
0 => 'HELSINKI',
|
||||
),
|
||||
'@HT' =>
|
||||
array (
|
||||
0 => 'HTC HD2',
|
||||
1 => 'HTC Mozart',
|
||||
2 => 'htc mpw6958',
|
||||
3 => 'htcmpw6958',
|
||||
4 => 'HTC 7 Trophy',
|
||||
5 => 'HTC Trophy',
|
||||
6 => 'HTC6690LVW',
|
||||
7 => 'HTC6990LVW',
|
||||
8 => 'HTC6990LVW 4G',
|
||||
9 => 'htc 8x',
|
||||
10 => 'HTCPO881',
|
||||
11 => 'HTC6995LVW',
|
||||
),
|
||||
'@HU' =>
|
||||
array (
|
||||
0 => 'HUAWEI Ascend W1!',
|
||||
1 => 'HUAWEI ?W1-(C00|U00|U34)!',
|
||||
2 => 'HUAWEI ?W2-(T00|T01|U00|U051)!',
|
||||
),
|
||||
'@I9' =>
|
||||
array (
|
||||
0 => 'I917',
|
||||
),
|
||||
'@ID' =>
|
||||
array (
|
||||
0 => 'IDOL 4 PRO',
|
||||
1 => 'IDOL 4S with Windows 10',
|
||||
2 => 'id[0-9]{3,3}!!',
|
||||
),
|
||||
'@IM' =>
|
||||
array (
|
||||
0 => 'Impera I',
|
||||
1 => 'Impera M',
|
||||
2 => 'Impera S',
|
||||
),
|
||||
'@IN' =>
|
||||
array (
|
||||
0 => 'InfoPath!',
|
||||
),
|
||||
'@IQ' =>
|
||||
array (
|
||||
0 => 'IQ400W',
|
||||
1 => 'IQ500W',
|
||||
),
|
||||
'@IR' =>
|
||||
array (
|
||||
0 => 'iris Win 1',
|
||||
),
|
||||
'@IS' =>
|
||||
array (
|
||||
0 => 'IS12T',
|
||||
),
|
||||
'@IX' =>
|
||||
array (
|
||||
0 => 'Ixion W 5',
|
||||
),
|
||||
'@LE' =>
|
||||
array (
|
||||
0 => 'LEO',
|
||||
),
|
||||
'@LG' =>
|
||||
array (
|
||||
0 => 'LG-E740!',
|
||||
1 => 'LG-E-?900!',
|
||||
2 => 'LG-E906',
|
||||
3 => 'LG-C900!',
|
||||
),
|
||||
'@LI' =>
|
||||
array (
|
||||
0 => 'Linux!',
|
||||
),
|
||||
'@LU' =>
|
||||
array (
|
||||
0 => '(Lumia ?|Nokia ?)?[0-9]{3,4}!!',
|
||||
),
|
||||
'@M1' =>
|
||||
array (
|
||||
0 => 'M1010',
|
||||
),
|
||||
'@M2' =>
|
||||
array (
|
||||
0 => 'M220!',
|
||||
),
|
||||
'@M3' =>
|
||||
array (
|
||||
0 => 'M310',
|
||||
),
|
||||
'@M5' =>
|
||||
array (
|
||||
0 => 'M5w',
|
||||
),
|
||||
'@MA' =>
|
||||
array (
|
||||
0 => 'Mazaa',
|
||||
),
|
||||
'@ME' =>
|
||||
array (
|
||||
0 => 'MegaFon SP-W1',
|
||||
),
|
||||
'@MI' =>
|
||||
array (
|
||||
0 => 'MICROMAX-W121',
|
||||
1 => 'MI4',
|
||||
2 => 'Microsoft!',
|
||||
),
|
||||
'@MO' =>
|
||||
array (
|
||||
0 => 'MOBILE Alpha Luxe',
|
||||
1 => 'MOBILE Alpha Style',
|
||||
2 => 'MOBILE Alpha View',
|
||||
3 => 'Mondrian',
|
||||
4 => '((7 )?Mozart|.*T86(97|98))!',
|
||||
5 => 'MouseComputer MADOSMA Q501',
|
||||
),
|
||||
'@MW' =>
|
||||
array (
|
||||
0 => 'MWP6885',
|
||||
1 => 'mwp6985',
|
||||
2 => 'MWP-47!',
|
||||
),
|
||||
'@N8' =>
|
||||
array (
|
||||
0 => 'N880e!',
|
||||
),
|
||||
'@NE' =>
|
||||
array (
|
||||
0 => 'NEO',
|
||||
),
|
||||
'@NO' =>
|
||||
array (
|
||||
0 => '(Lumia ?|Nokia ?)?[0-9]{3,4}!!',
|
||||
),
|
||||
'@OM' =>
|
||||
array (
|
||||
0 => 'Omega',
|
||||
1 => 'OM(NI|IN)A ?7!',
|
||||
2 => 'Omnia W',
|
||||
),
|
||||
'@ON' =>
|
||||
array (
|
||||
0 => 'ONE TOUCH 5040X',
|
||||
1 => 'ONIX AWP4-215',
|
||||
),
|
||||
'@PC' =>
|
||||
array (
|
||||
0 => 'PC93100',
|
||||
1 => 'PC40100',
|
||||
2 => 'PC40200',
|
||||
),
|
||||
'@PD' =>
|
||||
array (
|
||||
0 => 'PD67100',
|
||||
),
|
||||
'@PI' =>
|
||||
array (
|
||||
0 => 'PI39100',
|
||||
1 => 'PI86100',
|
||||
),
|
||||
'@PK' =>
|
||||
array (
|
||||
0 => 'PKT-407',
|
||||
),
|
||||
'@PM' =>
|
||||
array (
|
||||
0 => 'PM23300',
|
||||
),
|
||||
'@PR' =>
|
||||
array (
|
||||
0 => 'PRESTIGIO-PSP8500DUO',
|
||||
),
|
||||
'@PS' =>
|
||||
array (
|
||||
0 => 'PSP8400DUO',
|
||||
1 => 'PSP8500DUO',
|
||||
),
|
||||
'@QS' =>
|
||||
array (
|
||||
0 => 'QSMART STORM W408',
|
||||
1 => 'QSMART DREAM W473',
|
||||
2 => 'QSMART STORM W510',
|
||||
),
|
||||
'@QU' =>
|
||||
array (
|
||||
0 => 'Quantum',
|
||||
),
|
||||
'@RA' =>
|
||||
array (
|
||||
0 => '(Radar|.*C110e)!',
|
||||
),
|
||||
'@RI' =>
|
||||
array (
|
||||
0 => 'RIO U',
|
||||
),
|
||||
'@RM' =>
|
||||
array (
|
||||
0 => 'RM-[0-9]{3,4}!!',
|
||||
),
|
||||
'@S5' =>
|
||||
array (
|
||||
0 => 'S58',
|
||||
),
|
||||
'@S6' =>
|
||||
array (
|
||||
0 => 'S606',
|
||||
),
|
||||
'@SC' =>
|
||||
array (
|
||||
0 => 'Schubert!',
|
||||
1 => 'SCH-R860U',
|
||||
2 => 'SCH-I930',
|
||||
),
|
||||
'@SE' =>
|
||||
array (
|
||||
0 => 'SeaRay',
|
||||
1 => 'Semaphore',
|
||||
),
|
||||
'@SG' =>
|
||||
array (
|
||||
0 => 'SG 7',
|
||||
1 => 'SGH-[IT][0-9]{3,3}!!',
|
||||
),
|
||||
'@SM' =>
|
||||
array (
|
||||
0 => 'SM-W750V',
|
||||
),
|
||||
'@SO' =>
|
||||
array (
|
||||
0 => 'SOUL2',
|
||||
),
|
||||
'@SP' =>
|
||||
array (
|
||||
0 => 'Spark',
|
||||
1 => 'SPH-I800',
|
||||
),
|
||||
'@SU' =>
|
||||
array (
|
||||
0 => 'Surround',
|
||||
1 => 'Surface Phone',
|
||||
),
|
||||
'@T6' =>
|
||||
array (
|
||||
0 => 'T698',
|
||||
),
|
||||
'@TA' =>
|
||||
array (
|
||||
0 => 'Taylor',
|
||||
1 => 'Tania',
|
||||
),
|
||||
'@TC' =>
|
||||
array (
|
||||
0 => 'TC70',
|
||||
),
|
||||
'@TG' =>
|
||||
array (
|
||||
0 => 'TG01',
|
||||
),
|
||||
'@TH' =>
|
||||
array (
|
||||
0 => 'Thunder 340W',
|
||||
1 => 'Thunder 450W',
|
||||
),
|
||||
'@TI' =>
|
||||
array (
|
||||
0 => 'Titan',
|
||||
1 => 'Titanium Wind W4',
|
||||
),
|
||||
'@TO' =>
|
||||
array (
|
||||
0 => 'Touch-IT HD7',
|
||||
1 => 'Touch-IT Trophy',
|
||||
),
|
||||
'@TR' =>
|
||||
array (
|
||||
0 => '((7 )?Trophy|.*T8686)!',
|
||||
),
|
||||
'@TS' =>
|
||||
array (
|
||||
0 => 'TSUNAGI',
|
||||
),
|
||||
'@UL' =>
|
||||
array (
|
||||
0 => 'Ultimate',
|
||||
),
|
||||
'@US' =>
|
||||
array (
|
||||
0 => 'USCCHTC-PC93100',
|
||||
1 => 'USCCN859',
|
||||
),
|
||||
'@V9' =>
|
||||
array (
|
||||
0 => 'V965W',
|
||||
),
|
||||
'@VE' =>
|
||||
array (
|
||||
0 => 'Venue Pro',
|
||||
),
|
||||
'@VI' =>
|
||||
array (
|
||||
0 => 'Virtual!',
|
||||
),
|
||||
'@VW' =>
|
||||
array (
|
||||
0 => 'VW820',
|
||||
),
|
||||
'@W1' =>
|
||||
array (
|
||||
0 => 'W1i',
|
||||
1 => 'W10',
|
||||
2 => 'W1-(C00|U00|U34)!',
|
||||
3 => 'W121',
|
||||
),
|
||||
'@W2' =>
|
||||
array (
|
||||
0 => 'W2-(T00|T01|U00|U051)!',
|
||||
),
|
||||
'@W4' =>
|
||||
array (
|
||||
0 => 'W4',
|
||||
),
|
||||
'@WI' =>
|
||||
array (
|
||||
0 => 'WIN HD LTE',
|
||||
1 => 'WIN HD W510l',
|
||||
2 => 'WIN HD W510u',
|
||||
3 => 'WIN JR LTE',
|
||||
4 => 'WIN JR W410a',
|
||||
5 => 'WIN JR W410i',
|
||||
6 => 'WIN JR W410l',
|
||||
7 => 'WIN JR W410u',
|
||||
8 => 'WIN 400',
|
||||
9 => 'WINJOY',
|
||||
10 => 'WinWin',
|
||||
11 => 'Windows Phone 8X by HTC!',
|
||||
12 => 'WindowsPhone8Xby',
|
||||
13 => 'Windows Phone 8S by HTC!',
|
||||
14 => 'WindowsPhone8Sby',
|
||||
15 => 'Win1',
|
||||
16 => 'Win-Q900S',
|
||||
17 => 'Win Q1000',
|
||||
18 => 'WinQ1000',
|
||||
19 => 'Windows!',
|
||||
),
|
||||
'@WP' =>
|
||||
array (
|
||||
0 => 'WP 4.7',
|
||||
),
|
||||
'@XX' =>
|
||||
array (
|
||||
0 => 'XXX!',
|
||||
),
|
||||
);
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
Manufacturers::$GENERIC = [
|
||||
'LG Electronics' => 'LG',
|
||||
'LGE' => 'LG',
|
||||
'TOSHIBA' => 'Toshiba',
|
||||
'SAMSUNG' => 'Samsung',
|
||||
'SHARP' => 'Sharp',
|
||||
'SONY' => 'Sony',
|
||||
];
|
||||
|
||||
Manufacturers::$TELEVISION = [
|
||||
'ALDISUED' => 'Aldi',
|
||||
'BANGOLUFSEN' => 'Bang & Olufsen',
|
||||
'CHANGHONG' => 'Changhong',
|
||||
'changhong' => 'Changhong',
|
||||
'FINLUX' => 'Finlux',
|
||||
'HHW HAIER' => 'Haier',
|
||||
'HITACHI' => 'Hitachi',
|
||||
'HYUNDAI' => 'Hyundai',
|
||||
'inverto' => 'Inverto',
|
||||
'LOEWE' => 'Loewe',
|
||||
'MEDION' => 'Medion',
|
||||
'Nagra OpenTV' => 'NAGRA',
|
||||
'PANASONIC' => 'Panasonic',
|
||||
'Sagemcom_Broadband_SAS' => 'Sagemcom',
|
||||
'SERAPHIC' => 'Seraphic',
|
||||
'selevision' => 'Selevision',
|
||||
'smart' => 'Smart',
|
||||
'Sky_worth' => 'Skyworth',
|
||||
'TechnoTrend Goerler' => 'TechnoTrend',
|
||||
'TechnoTrend Goerler/Kathrein' => 'TechnoTrend',
|
||||
'TELEFUNKEN' => 'Telefunken',
|
||||
'THOM' => 'Thomson',
|
||||
'THOMSON' => 'Thomson',
|
||||
'tv2n' => 'TV2N',
|
||||
'VESTEL' => 'Vestel'
|
||||
];
|
||||
+19761
File diff suppressed because it is too large
Load Diff
Executable
+18
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$ASHA_MODELS = [
|
||||
'Asha230SingleSIM' => [ 'Nokia', 'Asha 230' ],
|
||||
'Asha230DualSIM' => [ 'Nokia', 'Asha 230' ],
|
||||
'500' => [ 'Nokia', 'Asha 500' ],
|
||||
'Asha500SingleSIM' => [ 'Nokia', 'Asha 500' ],
|
||||
'Asha500DualSIM' => [ 'Nokia', 'Asha 500' ],
|
||||
'501' => [ 'Nokia', 'Asha 501' ],
|
||||
'501s' => [ 'Nokia', 'Asha 501' ],
|
||||
'501.1' => [ 'Nokia', 'Asha 501' ],
|
||||
'501.2' => [ 'Nokia', 'Asha 501' ],
|
||||
'502' => [ 'Nokia', 'Asha 502' ],
|
||||
'503' => [ 'Nokia', 'Asha 503' ],
|
||||
'503s' => [ 'Nokia', 'Asha 503' ],
|
||||
];
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$BADA_MODELS = [
|
||||
'GT- ?S52(50|53)!' => [ 'Samsung', 'Wave 525' ],
|
||||
'GT-S53(30|33)!' => [ 'Samsung', 'Wave 533' ],
|
||||
'GT-S5380!' => [ 'Samsung', 'Wave Y' ],
|
||||
'GT-S57(50|53)!' => [ 'Samsung', 'Wave 575' ],
|
||||
'GT-S57(80)!' => [ 'Samsung', 'Wave 578' ],
|
||||
'GT-S72(30|33)!' => [ 'Samsung', 'Wave 723' ],
|
||||
'GT-S7250!' => [ 'Samsung', 'Wave M' ],
|
||||
'GT-S8500!' => [ 'Samsung', 'Wave' ],
|
||||
'SCH-F859!' => [ 'Samsung', 'Wave' ],
|
||||
'GT- ?S8530!' => [ 'Samsung', 'Wave II' ],
|
||||
'GT- ?S8600!' => [ 'Samsung', 'Wave 3' ],
|
||||
'SHW-M410' => [ 'Samsung', 'Wave 3' ]
|
||||
];
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$BLACKBERRY_MODELS = [
|
||||
'9000' => 'Bold',
|
||||
'9600' => 'Bold',
|
||||
'9650' => 'Bold',
|
||||
'9700' => 'Bold',
|
||||
'9780' => 'Bold',
|
||||
'9788' => 'Bold',
|
||||
'9790' => 'Bold',
|
||||
'9900' => 'Bold',
|
||||
'9930' => 'Bold',
|
||||
'8300' => 'Curve',
|
||||
'8310' => 'Curve',
|
||||
'8320' => 'Curve',
|
||||
'8330' => 'Curve',
|
||||
'8350i' => 'Curve',
|
||||
'8520' => 'Curve',
|
||||
'8530' => 'Curve',
|
||||
'8900' => 'Curve',
|
||||
'9220' => 'Curve',
|
||||
'9300' => 'Curve',
|
||||
'9310' => 'Curve',
|
||||
'9315' => 'Curve',
|
||||
'9320' => 'Curve',
|
||||
'9330' => 'Curve',
|
||||
'9350' => 'Curve',
|
||||
'9360' => 'Curve',
|
||||
'9370' => 'Curve',
|
||||
'9380' => 'Curve',
|
||||
'8100' => 'Pearl',
|
||||
'8110' => 'Pearl',
|
||||
'8120' => 'Pearl',
|
||||
'8130' => 'Pearl',
|
||||
'8220' => 'Pearl',
|
||||
'8230' => 'Pearl',
|
||||
'9100' => 'Pearl',
|
||||
'9105' => 'Pearl',
|
||||
'9500' => 'Storm',
|
||||
'9520' => 'Storm2',
|
||||
'9530' => 'Storm',
|
||||
'9550' => 'Storm',
|
||||
'9670' => 'Style',
|
||||
'9800' => 'Torch',
|
||||
'9810' => 'Torch',
|
||||
'9850' => 'Torch',
|
||||
'9860' => 'Torch',
|
||||
'9630' => 'Tour',
|
||||
'9981' => 'Porsche P'
|
||||
];
|
||||
Executable
+96
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$BREW_MODELS = [
|
||||
'Coolpad D508' => [ 'Coolpad', 'D508' ],
|
||||
'Coolpad D510' => [ 'Coolpad', 'D510' ],
|
||||
'Coolpad E600' => [ 'Coolpad', 'E600' ],
|
||||
'HUAWEI U526' => [ 'Huawei', 'U526' ],
|
||||
'HUAWEI U528' => [ 'Huawei', 'U528' ],
|
||||
'HUAWEI U2801!' => [ 'Huawei', 'U2801' ],
|
||||
'HUAWEI U5200!' => [ 'Huawei', 'U5200' ],
|
||||
'HUAWEI U5300!' => [ 'Huawei', 'U5300' ],
|
||||
'HUAWEI U5310!' => [ 'Huawei', 'U5310' ],
|
||||
'HUAWEI U6150!' => [ 'Huawei', 'U6150' ],
|
||||
'E4255' => [ 'Kyocera', 'DuraMax E4255' ],
|
||||
'S2151!' => [ 'Kyocera', 'Coast S2151' ],
|
||||
'EX200!' => [ 'Motorola', 'EX200' ],
|
||||
'NOKIA 7705' => [ 'Nokia', '7705 Twist' ],
|
||||
'M260!' => [ 'Samsung', 'Factor' ],
|
||||
'M350!' => [ 'Samsung', 'Seek' ],
|
||||
'M370!' => [ 'Samsung', 'M370' ],
|
||||
'M380!' => [ 'Samsung', 'Trender' ],
|
||||
'M390!' => [ 'Samsung', 'Array' ],
|
||||
'M550!' => [ 'Samsung', 'Exclaim' ],
|
||||
'M560!' => [ 'Samsung', 'Reclaim' ],
|
||||
'SGH-A937!' => [ 'Samsung', 'SCH-A937' ],
|
||||
'SGH-A947!' => [ 'Samsung', 'SCH-A947' ],
|
||||
'SCH-B309!' => [ 'Samsung', 'SCH-B309' ],
|
||||
'SCH-F839' => [ 'Samsung', 'SCH-F839' ],
|
||||
'SCH-M519!' => [ 'Samsung', 'Metro TV' ],
|
||||
'SCH-S559!' => [ 'Samsung', 'SCH-S559' ],
|
||||
'SCH-S579!' => [ 'Samsung', 'SCH-S579' ],
|
||||
'SCH-U380!' => [ 'Samsung', 'Brightside' ],
|
||||
'SCH-U485' => [ 'Samsung', 'Intensity III' ],
|
||||
'SCH-U640!' => [ 'Samsung', 'Convoy' ],
|
||||
'SCH-U660!' => [ 'Samsung', 'Convoy II' ],
|
||||
'SCH-U680!' => [ 'Samsung', 'Convoy 3' ],
|
||||
'SCH-U750!' => [ 'Samsung', 'Alias 2' ],
|
||||
'SCH-U820!' => [ 'Samsung', 'Reality' ],
|
||||
'SCH-U960!' => [ 'Samsung', 'Rogue' ],
|
||||
'SCH-W709!' => [ 'Samsung', 'SCH-W709' ],
|
||||
'SCH-W799!' => [ 'Samsung', 'SCH-W799' ],
|
||||
'sam-r631' => [ 'Samsung', 'Messenger Touch R631' ],
|
||||
'sam-r640' => [ 'Samsung', 'Character R640' ],
|
||||
'sam-r900' => [ 'Samsung', 'Craft R900' ],
|
||||
'SM-B690V' => [ 'Samsung', 'Convoy 4' ],
|
||||
'SPH M330' => [ 'Samsung', 'SPH-M330' ],
|
||||
'SPH-M570' => [ 'Samsung', 'Restore' ],
|
||||
'PLS M330' => [ 'Samsung', 'PLS-M330' ],
|
||||
'Sprint M850' => [ 'Samsung', 'Instinct HD' ],
|
||||
'SCP-3810' => [ 'Sanyo', 'SCP-3810' ],
|
||||
'SCP3810' => [ 'Sanyo', 'SCP-3810' ],
|
||||
'SCP-6750' => [ 'Sanyo', 'Katana Eclipse X' ],
|
||||
'SCP6760' => [ 'Sanyo', 'Incognito' ],
|
||||
'SCP-6760' => [ 'Sanyo', 'Incognito' ],
|
||||
'SCP6780' => [ 'Sanyo', 'Innuendo' ],
|
||||
'HS-E316!' => [ 'Hisense', 'E316' ],
|
||||
'VX5600!' => [ 'LG', 'Accolade' ],
|
||||
'VX9200!' => [ 'LG', 'Env3' ],
|
||||
'VX9600!' => [ 'LG', 'Versa' ],
|
||||
'VX11000!' => [ 'LG', 'Env Touch' ],
|
||||
'VN170!' => [ 'LG', 'Revere 3' ],
|
||||
'VN250!' => [ 'LG', 'Cosmos' ],
|
||||
'VN271!' => [ 'LG', 'Extravert' ],
|
||||
'VN280!' => [ 'LG', 'Extravert 2' ],
|
||||
'VN360!' => [ 'LG', 'Exalt' ],
|
||||
'VN370!' => [ 'LG', 'Exalt II' ],
|
||||
'VN530' => [ 'LG', 'Octane' ],
|
||||
'LG272' => [ 'LG', 'Rumor Reflex' ],
|
||||
'LG510' => [ 'LG', 'Rumor Touch' ],
|
||||
'LN240' => [ 'LG', 'Remarq' ],
|
||||
'LN510' => [ 'LG', 'Rumor Touch' ],
|
||||
'LX610' => [ 'LG', 'Lotus Elite' ],
|
||||
'AX8575' => [ 'LG', 'Chocolate Touch' ],
|
||||
'LGE AX840' => [ 'LG', 'Tritan' ],
|
||||
'LGE LG700' => [ 'LG', 'Bliss' ],
|
||||
'LGE LG840' => [ 'LG', 'Spyder II' ],
|
||||
'LGE UX700' => [ 'LG', 'Bliss' ],
|
||||
'LGE UX840' => [ 'LG', 'Tritan' ],
|
||||
'LGE VX11K' => [ 'LG', 'Env Touch' ],
|
||||
'LGE VX8575' => [ 'LG', 'Chocolate Touch' ],
|
||||
'LGE VX9700' => [ 'LG', 'Dare' ],
|
||||
'P5000' => [ 'Pantech', 'Link II' ],
|
||||
'P6020' => [ 'Pantech', 'Persuit II' ],
|
||||
'P6030' => [ 'Pantech', 'Reneu' ],
|
||||
'CDM8992' => [ 'Pantech', 'Hotshot' ],
|
||||
'CDM8999' => [ 'Pantech', 'Crux' ],
|
||||
'TXT8045' => [ 'Pantech', 'Jest 2' ],
|
||||
'Pantech CDM8992!' => [ 'Pantech', 'Hotshot' ],
|
||||
'Pantech CDM8999!' => [ 'Pantech', 'Crux' ],
|
||||
'Pantech TXT8045!' => [ 'Pantech', 'Jest 2' ],
|
||||
'ZTE F-450!' => [ 'ZTE', 'Adamant' ],
|
||||
'ZTE R516!' => [ 'ZTE', 'R516' ],
|
||||
'ZTE R518!' => [ 'ZTE', 'R518' ],
|
||||
];
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\DeviceType;
|
||||
|
||||
DeviceModels::$FEATURE_MODELS = [
|
||||
'Amstrad Gamma' => [ 'Amstrad', 'E-m@iler Plus', DeviceType::DESKTOP ],
|
||||
'Benefon Q' => [ 'Benefon', 'Q' ],
|
||||
'EF71' => [ 'BenQ-Siemens', 'EF71' ],
|
||||
'Lightpipe' => [ 'Kyocera', 'E1100 Neo' ],
|
||||
'K612' => [ 'Kyocera', 'K612 Strobe' ],
|
||||
'EX115' => [ 'Motorola', 'Starling EX115' ],
|
||||
'EX118' => [ 'Motorola', 'MOTOKEY XT EX118' ],
|
||||
'EX119' => [ 'Motorola', 'Brea EX119' ],
|
||||
'EX128' => [ 'Motorola', 'Kingfisher EX128' ],
|
||||
'EX225' => [ 'Motorola', 'MOTOKEY Social EX225' ],
|
||||
'EX226' => [ 'Motorola', 'MOTOKEY Social EX226' ],
|
||||
'EX430' => [ 'Motorola', 'MotoGo EX430' ],
|
||||
'MOTOQA1' => [ 'Motorola', 'Karma QA1' ],
|
||||
'KC910i' => [ 'LG', 'KC910i Renoir' ],
|
||||
'KP500!' => [ 'LG', 'KP500 Cookie' ],
|
||||
'KP570!' => [ 'LG', 'KP570 Cookie' ],
|
||||
'LG-KU380' => [ 'LG', 'KU380' ],
|
||||
'LG-KU580' => [ 'LG', 'KU580 Hero' ],
|
||||
'LG-KU990' => [ 'LG', 'KU990 Viewty' ],
|
||||
'KU990i' => [ 'LG', 'KU990 Viewty' ],
|
||||
'GM360' => [ 'LG', 'GM360 Viewty Snap' ],
|
||||
'GR700' => [ 'LG', 'GR700 Vu Plus' ],
|
||||
'GS290' => [ 'LG', 'GS290 Cookie Fresh' ],
|
||||
'GS500' => [ 'LG', 'GS500 Cookie Plus' ],
|
||||
'GT500!' => [ 'LG', 'GT500 Puccini' ],
|
||||
'GT550' => [ 'LG', 'GT550 Encore' ],
|
||||
'COCOON' => [ 'O2', 'Cocoon' ],
|
||||
'P7000' => [ 'Pantech', 'Impact' ],
|
||||
'P9020' => [ 'Pantech', 'Pursuit' ],
|
||||
'P9050' => [ 'Pantech', 'Laser' ],
|
||||
'PM-8200' => [ 'Sanyo', 'PM-8200' ],
|
||||
'SCP-5300' => [ 'Sanyo', 'SCP-5300' ],
|
||||
'SCP-5500' => [ 'Sanyo', 'VM4500' ],
|
||||
'SCP-6600' => [ 'Sanyo', 'Katana' ],
|
||||
'PLS6600KJ' => [ 'Sanyo', 'Katana' ],
|
||||
'GT-B2710' => [ 'Samsung', 'Xcover 271' ],
|
||||
'GT-B3210' => [ 'Samsung', 'Corby TXT' ],
|
||||
'GT-B3313' => [ 'Samsung', 'Corby Mate' ],
|
||||
'GT-C3200' => [ 'Samsung', 'Monte Bar' ],
|
||||
'GT-C3222' => [ 'Samsung', 'Ch@t 322' ],
|
||||
'GT-C3322' => [ 'Samsung', 'GT-C3322 Duos' ],
|
||||
'GT-C3500' => [ 'Samsung', 'Ch@t 350' ],
|
||||
'GT-C5010!' => [ 'Samsung', 'C5010 Squash' ],
|
||||
'GT-E1282!' => [ 'Samsung', 'Guru' ],
|
||||
'GT-E2152' => [ 'Samsung', 'GT-E2152 Duos' ],
|
||||
'GT-E2220' => [ 'Samsung', 'Ch@t 220' ],
|
||||
'GT-E2222' => [ 'Samsung', 'Ch@t 222' ],
|
||||
'GT-E2202' => [ 'Samsung', 'Metro' ],
|
||||
'GT-E2250' => [ 'Samsung', 'Utica' ],
|
||||
'GT-E2252' => [ 'Samsung', 'Metro 2252' ],
|
||||
'GT-E3213' => [ 'Samsung', 'E3213 Hero' ],
|
||||
'GT-E3309I' => [ 'Samsung', 'E3309 Manhattan' ],
|
||||
'm3510c' => [ 'Samsung', 'M3510' ],
|
||||
'GT-M8910' => [ 'Samsung', 'M8910 Pixon12' ],
|
||||
'GT-S3332' => [ 'Samsung', 'Ch@t 333' ],
|
||||
'GT-S33(50|53)!' => [ 'Samsung', 'Ch@t 335' ],
|
||||
'GT-S35(70|72)!' => [ 'Samsung', 'Ch@t 357' ],
|
||||
'GT-S5229' => [ 'Samsung', 'Tocco Lite 2' ],
|
||||
'GT-S5270!' => [ 'Samsung', 'Ch@t 527' ],
|
||||
'GT-S5610!' => [ 'Samsung', 'Primo' ],
|
||||
'SCH-W169' => [ 'Samsung', 'W169 Duos' ],
|
||||
'SCH-W279' => [ 'Samsung', 'Primo Duos' ],
|
||||
'SGH-A667' => [ 'Samsung', 'A667 Evergreen' ],
|
||||
'SGH-A697' => [ 'Samsung', 'A697 Sunburst' ],
|
||||
'SGH-A877' => [ 'Samsung', 'A877 Impression' ],
|
||||
'SGH-A927' => [ 'Samsung', 'A927 Flight II' ],
|
||||
'SGH-A997' => [ 'Samsung', 'Rugby III' ],
|
||||
'SGH-D880' => [ 'Samsung', 'D880 Duos' ],
|
||||
'SGH-E250i' => [ 'Samsung', 'E250' ],
|
||||
'SGH-E250V' => [ 'Samsung', 'E250' ],
|
||||
'SGH-G600' => [ 'Samsung', 'G600' ],
|
||||
'SGH-J700i' => [ 'Samsung', 'J700' ],
|
||||
'SGH-J700V' => [ 'Samsung', 'J700' ],
|
||||
'SGH-M200' => [ 'Samsung', 'M200' ],
|
||||
'SGH-S150G' => [ 'Samsung', 'S150 TracFone' ],
|
||||
'SGH-S390G' => [ 'Samsung', 'S390 TracFone' ],
|
||||
'SGH-T189N' => [ 'Samsung', 'Freeform M'],
|
||||
'SGHX660V' => [ 'Samsung', 'X660' ],
|
||||
'SGH-Z107!' => [ 'Samsung', 'Z107' ],
|
||||
'SGH-Z130!' => [ 'Samsung', 'Z130' ],
|
||||
'SGH-Z500!' => [ 'Samsung', 'Z500' ],
|
||||
'SM-B313E' => [ 'Samsung', 'Metro 313' ],
|
||||
'SM-B350E' => [ 'Samsung', 'Metro 350' ],
|
||||
'SM-B360E' => [ 'Samsung', 'Metro 360' ],
|
||||
'SM-B780(A|W)!' => [ 'Samsung', 'Rugby 4' ],
|
||||
'S7350' => [ 'Samsung', 'S7350 Ultra S' ],
|
||||
'sam-r560' => [ 'Samsung', 'Messenger II R560' ],
|
||||
'Sendo Wap' => [ 'Sendo', 'Z100' ],
|
||||
'CK13[ai]?$!' => [ 'Sony Ericsson', 'txt' ],
|
||||
'CK15[ai]?$!' => [ 'Sony Ericsson', 'txt Pro' ],
|
||||
'F100[ai]?$!' => [ 'Sony Ericsson', 'Jalou' ],
|
||||
'J105[ai]?$!' => [ 'Sony Ericsson', 'Naite' ],
|
||||
'J108[ai]?$!' => [ 'Sony Ericsson', 'Cedar' ],
|
||||
'J10(i2?)?$!' => [ 'Sony Ericsson', 'Elm' ],
|
||||
'J20[ai]?$!' => [ 'Sony Ericsson', 'Hazel' ],
|
||||
'U100[ai]?$!' => [ 'Sony Ericsson', 'Yari' ],
|
||||
'U10[ai]?$!' => [ 'Sony Ericsson', 'Aino' ],
|
||||
'W100i?$!' => [ 'Sony Ericsson', 'Spiro' ],
|
||||
'W150i?$!' => [ 'Sony Ericsson', 'Yendo' ],
|
||||
'W20i?$!' => [ 'Sony Ericsson', 'Zylo' ],
|
||||
'WT13i$!' => [ 'Sony Ericsson', 'Mix Walkman' ],
|
||||
'X5i$!' => [ 'Sony Ericsson', 'Xperia Pureness X5' ],
|
||||
'tecnot36' => [ 'Tecno', 'T36' ],
|
||||
'Vodafone 575' => [ 'Vodafone', '575' ],
|
||||
'GT-I6410!' => [ 'Vodafone', '360 M1' ],
|
||||
'GT-I8320!' => [ 'Vodafone', '360 H1' ],
|
||||
'GT-I8330!' => [ 'Vodafone', '360 H2' ],
|
||||
'WIDETEL WCX150' => [ 'Widetel', 'WCX150' ],
|
||||
];
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$FIREFOXOS_MODELS = [
|
||||
'ALCATEL ONE TOUCH FIRE' => [ 'Alcatel', 'One Touch Fire' ],
|
||||
'ALCATEL ONE TOUCH 4012A' => [ 'Alcatel', 'One Touch Fire' ],
|
||||
'ALCATEL ONE TOUCH 4012X' => [ 'Alcatel', 'One Touch Fire' ],
|
||||
'ALCATELOneTouch4012A!' => [ 'Alcatel', 'One Touch Fire' ],
|
||||
'ALCATELOneTouch4012X!' => [ 'Alcatel', 'One Touch Fire' ],
|
||||
'OneTouch4019A' => [ 'Alcatel', 'One Touch Fire C' ],
|
||||
'ALCATELOneTouch4019A!' => [ 'Alcatel', 'One Touch Fire C' ],
|
||||
'ALCATELOneTouch4019X!' => [ 'Alcatel', 'One Touch Fire C' ],
|
||||
'ALCATELOneTouch4020D!' => [ 'Alcatel', 'One Touch Fire C' ],
|
||||
'ALCATELOneTouch4022!' => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
|
||||
'ALCATELOneTouch4023!' => [ 'Alcatel', 'One Touch Pixi 3 (3.5)' ],
|
||||
'ALCATELOneTouch6015X!' => [ 'Alcatel', 'One Touch Fire E' ],
|
||||
'HUAWEI Ascend Y300-F1' => [ 'Huawei', 'Ascend Y300 F1' ],
|
||||
'HUAWEIY300-F1' => [ 'Huawei', 'Ascend Y300 F1' ],
|
||||
'LG-D3(00|01)!' => [ 'LG', 'Fireweb' ],
|
||||
'LGL25' => [ 'LG', 'Fx0' ],
|
||||
'madai' => [ 'LG', 'Fx0' ],
|
||||
'Orange KLIF' => [ 'Orange', 'Kilf' ],
|
||||
'Orange KLIFD' => [ 'Orange', 'Kilf' ],
|
||||
'OPEN' => [ 'ZTE', 'Open' ],
|
||||
'ZTEOPEN' => [ 'ZTE', 'Open' ],
|
||||
'OpenC' => [ 'ZTE', 'Open C' ],
|
||||
'Open C' => [ 'ZTE', 'Open C' ],
|
||||
'OPENC2' => [ 'ZTE', 'Open C2' ],
|
||||
'OPEN2' => [ 'ZTE', 'Open II' ],
|
||||
|
||||
'ALCATEL4044[MNOTVW]!' => [ 'Alcatel', 'Go Flip' ],
|
||||
'ALCATEL4044C!' => [ 'Alcatel', 'QUICKFLIP' ],
|
||||
'.LYF\/.F30C!' => [ 'Jio', 'JioPhone F30C' ],
|
||||
'.LYF\/.F101K!' => [ 'Jio', 'JioPhone F101K' ],
|
||||
'LYF\/F30C!' => [ 'Jio', 'JioPhone F30C' ],
|
||||
'LYF\/F41T!' => [ 'Jio', 'JioPhone F41T' ],
|
||||
'LYF\/F50Y!' => [ 'Jio', 'JioPhone F50Y' ],
|
||||
'LYF\/F61F!' => [ 'Jio', 'JioPhone F61F' ],
|
||||
'LYF\/F81E!' => [ 'Jio', 'JioPhone F81E' ],
|
||||
'LYF\/F90M!' => [ 'Jio', 'JioPhone F90M' ],
|
||||
'LYF\/F101K!' => [ 'Jio', 'JioPhone F101K' ],
|
||||
];
|
||||
Executable
+151
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\DeviceType;
|
||||
|
||||
DeviceModels::$IOS_MODELS = [
|
||||
|
||||
/* Generic names */
|
||||
'iPhone' => [ 'Apple', 'iPhone', DeviceType::MOBILE ],
|
||||
'iPhone 3G' => [ 'Apple', 'iPhone 3G', DeviceType::MOBILE ],
|
||||
'iPhone 3GS' => [ 'Apple', 'iPhone 3GS', DeviceType::MOBILE ],
|
||||
'iPhone 4' => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
|
||||
'iPhone 4S' => [ 'Apple', 'iPhone 4S', DeviceType::MOBILE ],
|
||||
'iPhone 5' => [ 'Apple', 'iPhone 5', DeviceType::MOBILE ],
|
||||
'iPhone 5c' => [ 'Apple', 'iPhone 5c', DeviceType::MOBILE ],
|
||||
'iPhone 5s' => [ 'Apple', 'iPhone 5s', DeviceType::MOBILE ],
|
||||
'iPhone 6' => [ 'Apple', 'iPhone 6', DeviceType::MOBILE ],
|
||||
'iPhone 6 Plus' => [ 'Apple', 'iPhone 6 Plus', DeviceType::MOBILE ],
|
||||
'iPod' => [ 'Apple', 'iPod touch', DeviceType::MEDIA ],
|
||||
'iPod touch' => [ 'Apple', 'iPod touch', DeviceType::MEDIA ],
|
||||
'iPad' => [ 'Apple', 'iPad', DeviceType::TABLET ],
|
||||
|
||||
/* Offical gestalt names */
|
||||
'iPhone1,1' => [ 'Apple', 'iPhone', DeviceType::MOBILE ],
|
||||
'iPhone1,2' => [ 'Apple', 'iPhone 3G', DeviceType::MOBILE ],
|
||||
'iPhone2,1' => [ 'Apple', 'iPhone 3GS', DeviceType::MOBILE ],
|
||||
'iPhone3,1' => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
|
||||
'iPhone3,2' => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
|
||||
'iPhone3,3' => [ 'Apple', 'iPhone 4', DeviceType::MOBILE ],
|
||||
'iPhone4,1' => [ 'Apple', 'iPhone 4S', DeviceType::MOBILE ],
|
||||
'iPhone5,1' => [ 'Apple', 'iPhone 5', DeviceType::MOBILE ],
|
||||
'iPhone5,2' => [ 'Apple', 'iPhone 5', DeviceType::MOBILE ],
|
||||
'iPhone5,3' => [ 'Apple', 'iPhone 5c', DeviceType::MOBILE ],
|
||||
'iPhone5,4' => [ 'Apple', 'iPhone 5c', DeviceType::MOBILE ],
|
||||
'iPhone6,1' => [ 'Apple', 'iPhone 5s', DeviceType::MOBILE ],
|
||||
'iPhone6,2' => [ 'Apple', 'iPhone 5s', DeviceType::MOBILE ],
|
||||
'iPhone7,1' => [ 'Apple', 'iPhone 6 Plus', DeviceType::MOBILE ],
|
||||
'iPhone7,2' => [ 'Apple', 'iPhone 6', DeviceType::MOBILE ],
|
||||
'iPhone8,1' => [ 'Apple', 'iPhone 6s', DeviceType::MOBILE ],
|
||||
'iPhone8,2' => [ 'Apple', 'iPhone 6s Plus', DeviceType::MOBILE ],
|
||||
'iPhone8,4' => [ 'Apple', 'iPhone SE', DeviceType::MOBILE ],
|
||||
'iPhone9,1' => [ 'Apple', 'iPhone 7', DeviceType::MOBILE ],
|
||||
'iPhone9,2' => [ 'Apple', 'iPhone 7 Plus', DeviceType::MOBILE ],
|
||||
'iPhone9,3' => [ 'Apple', 'iPhone 7', DeviceType::MOBILE ],
|
||||
'iPhone9,4' => [ 'Apple', 'iPhone 7 Plus', DeviceType::MOBILE ],
|
||||
'iPhone10,1' => [ 'Apple', 'iPhone 8', DeviceType::MOBILE ],
|
||||
'iPhone10,2' => [ 'Apple', 'iPhone 8 Plus', DeviceType::MOBILE ],
|
||||
'iPhone10,3' => [ 'Apple', 'iPhone X', DeviceType::MOBILE ],
|
||||
'iPhone10,4' => [ 'Apple', 'iPhone 8', DeviceType::MOBILE ],
|
||||
'iPhone10,5' => [ 'Apple', 'iPhone 8 Plus', DeviceType::MOBILE ],
|
||||
'iPhone10,6' => [ 'Apple', 'iPhone X', DeviceType::MOBILE ],
|
||||
'iPhone11,2' => [ 'Apple', 'iPhone XS', DeviceType::MOBILE ],
|
||||
'iPhone11,4' => [ 'Apple', 'iPhone XS Max', DeviceType::MOBILE ],
|
||||
'iPhone11,6' => [ 'Apple', 'iPhone XS Max', DeviceType::MOBILE ],
|
||||
'iPhone11,8' => [ 'Apple', 'iPhone XR', DeviceType::MOBILE ],
|
||||
'iPhone12,1' => [ 'Apple', 'iPhone 11', DeviceType::MOBILE ],
|
||||
'iPhone12,3' => [ 'Apple', 'iPhone 11 Pro', DeviceType::MOBILE ],
|
||||
'iPhone12,5' => [ 'Apple', 'iPhone 11 Pro Max', DeviceType::MOBILE ],
|
||||
'iPhone12,8' => [ 'Apple', 'iPhone SE (2nd gen)', DeviceType::MOBILE ],
|
||||
'iPhone13,1' => [ 'Apple', 'iPhone 12 Mini', DeviceType::MOBILE ],
|
||||
'iPhone13,2' => [ 'Apple', 'iPhone 12', DeviceType::MOBILE ],
|
||||
'iPhone13,3' => [ 'Apple', 'iPhone 12 Pro', DeviceType::MOBILE ],
|
||||
'iPhone13,4' => [ 'Apple', 'iPhone 12 Pro Max', DeviceType::MOBILE ],
|
||||
'iPhone14,2' => [ 'Apple', 'iPhone 13 Pro', DeviceType::MOBILE ],
|
||||
'iPhone14,3' => [ 'Apple', 'iPhone 13 Pro Max', DeviceType::MOBILE ],
|
||||
'iPhone14,4' => [ 'Apple', 'iPhone 13 Mini', DeviceType::MOBILE ],
|
||||
'iPhone14,5' => [ 'Apple', 'iPhone 13', DeviceType::MOBILE ],
|
||||
|
||||
'iPod1,1' => [ 'Apple', 'iPod touch', DeviceType::MEDIA ],
|
||||
'iPod2,1' => [ 'Apple', 'iPod touch (2nd gen)', DeviceType::MEDIA ],
|
||||
'iPod3,1' => [ 'Apple', 'iPod touch (3rd gen)', DeviceType::MEDIA ],
|
||||
'iPod4,1' => [ 'Apple', 'iPod touch (4th gen)', DeviceType::MEDIA ],
|
||||
'iPod5,1' => [ 'Apple', 'iPod touch (5th gen)', DeviceType::MEDIA ],
|
||||
'iPod7,1' => [ 'Apple', 'iPod touch (6th gen)', DeviceType::MEDIA ],
|
||||
'iPod9,1' => [ 'Apple', 'iPod touch (7th gen)', DeviceType::MEDIA ],
|
||||
'iPad1,1' => [ 'Apple', 'iPad', DeviceType::TABLET ],
|
||||
'iPad1,2' => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
|
||||
'iPad2,1' => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
|
||||
'iPad2,2' => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
|
||||
'iPad2,3' => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
|
||||
'iPad2,4' => [ 'Apple', 'iPad 2', DeviceType::TABLET ],
|
||||
'iPad2,5' => [ 'Apple', 'iPad mini', DeviceType::TABLET ],
|
||||
'iPad2,6' => [ 'Apple', 'iPad mini', DeviceType::TABLET ],
|
||||
'iPad2,7' => [ 'Apple', 'iPad mini', DeviceType::TABLET ],
|
||||
'iPad3,1' => [ 'Apple', 'iPad (3rd gen)', DeviceType::TABLET ],
|
||||
'iPad3,2' => [ 'Apple', 'iPad (3rd gen)', DeviceType::TABLET ],
|
||||
'iPad3,3' => [ 'Apple', 'iPad (3rd gen)', DeviceType::TABLET ],
|
||||
'iPad3,4' => [ 'Apple', 'iPad (4th gen)', DeviceType::TABLET ],
|
||||
'iPad3,5' => [ 'Apple', 'iPad (4th gen)', DeviceType::TABLET ],
|
||||
'iPad3,6' => [ 'Apple', 'iPad (4th gen)', DeviceType::TABLET ],
|
||||
'iPad4,1' => [ 'Apple', 'iPad Air', DeviceType::TABLET ],
|
||||
'iPad4,2' => [ 'Apple', 'iPad Air', DeviceType::TABLET ],
|
||||
'iPad4,3' => [ 'Apple', 'iPad Air', DeviceType::TABLET ],
|
||||
'iPad4,4' => [ 'Apple', 'iPad mini 2', DeviceType::TABLET ],
|
||||
'iPad4,5' => [ 'Apple', 'iPad mini 2', DeviceType::TABLET ],
|
||||
'iPad4,6' => [ 'Apple', 'iPad mini 2', DeviceType::TABLET ],
|
||||
'iPad4,7' => [ 'Apple', 'iPad mini 3', DeviceType::TABLET ],
|
||||
'iPad4,8' => [ 'Apple', 'iPad mini 3', DeviceType::TABLET ],
|
||||
'iPad4,9' => [ 'Apple', 'iPad mini 3', DeviceType::TABLET ],
|
||||
'iPad5,1' => [ 'Apple', 'iPad mini 4', DeviceType::TABLET ],
|
||||
'iPad5,2' => [ 'Apple', 'iPad mini 4', DeviceType::TABLET ],
|
||||
'iPad5,3' => [ 'Apple', 'iPad Air 2', DeviceType::TABLET ],
|
||||
'iPad5,4' => [ 'Apple', 'iPad Air 2', DeviceType::TABLET ],
|
||||
'iPad6,3' => [ 'Apple', 'iPad Pro (9.7″)', DeviceType::TABLET ],
|
||||
'iPad6,4' => [ 'Apple', 'iPad Pro (9.7″)', DeviceType::TABLET ],
|
||||
'iPad6,7' => [ 'Apple', 'iPad Pro (12.9″)', DeviceType::TABLET ],
|
||||
'iPad6,8' => [ 'Apple', 'iPad Pro (12.9″)', DeviceType::TABLET ],
|
||||
'iPad6,11' => [ 'Apple', 'iPad (5th gen)', DeviceType::TABLET ],
|
||||
'iPad6,12' => [ 'Apple', 'iPad (5th gen)', DeviceType::TABLET ],
|
||||
'iPad7,1' => [ 'Apple', 'iPad Pro (12.9″, 2nd gen)', DeviceType::TABLET ],
|
||||
'iPad7,2' => [ 'Apple', 'iPad Pro (12.9″, 2nd gen)', DeviceType::TABLET ],
|
||||
'iPad7,3' => [ 'Apple', 'iPad Pro (10.5″)', DeviceType::TABLET ],
|
||||
'iPad7,4' => [ 'Apple', 'iPad Pro (10.5″)', DeviceType::TABLET ],
|
||||
'iPad7,5' => [ 'Apple', 'iPad (9.7″, 6th gen)', DeviceType::TABLET ],
|
||||
'iPad7,6' => [ 'Apple', 'iPad (9.7″, 6th gen)', DeviceType::TABLET ],
|
||||
'iPad7,11' => [ 'Apple', 'iPad (10.2″, 7th gen)', DeviceType::TABLET ],
|
||||
'iPad7,12' => [ 'Apple', 'iPad (10.2″, 7th gen)', DeviceType::TABLET ],
|
||||
'iPad8,1' => [ 'Apple', 'iPad Pro (11.0″)', DeviceType::TABLET ],
|
||||
'iPad8,2' => [ 'Apple', 'iPad Pro (11.0″)', DeviceType::TABLET ],
|
||||
'iPad8,3' => [ 'Apple', 'iPad Pro (11.0″)', DeviceType::TABLET ],
|
||||
'iPad8,4' => [ 'Apple', 'iPad Pro (11.0″)', DeviceType::TABLET ],
|
||||
'iPad8,5' => [ 'Apple', 'iPad Pro (12.9″, 3rd gen)', DeviceType::TABLET ],
|
||||
'iPad8,6' => [ 'Apple', 'iPad Pro (12.9″, 3rd gen)', DeviceType::TABLET ],
|
||||
'iPad8,7' => [ 'Apple', 'iPad Pro (12.9″, 3rd gen)', DeviceType::TABLET ],
|
||||
'iPad8,8' => [ 'Apple', 'iPad Pro (12.9″, 3rd gen)', DeviceType::TABLET ],
|
||||
'iPad8,9' => [ 'Apple', 'iPad Pro (11.0″, 4th gen)', DeviceType::TABLET ],
|
||||
'iPad8,10' => [ 'Apple', 'iPad Pro (11.0″, 4th gen)', DeviceType::TABLET ],
|
||||
'iPad8,11' => [ 'Apple', 'iPad Pro (12.9″, 4th gen)', DeviceType::TABLET ],
|
||||
'iPad8,12' => [ 'Apple', 'iPad Pro (12.9″, 4th gen)', DeviceType::TABLET ],
|
||||
'iPad11,1' => [ 'Apple', 'iPad mini (5th gen)', DeviceType::TABLET ],
|
||||
'iPad11,2' => [ 'Apple', 'iPad mini (5th gen)', DeviceType::TABLET ],
|
||||
'iPad11,3' => [ 'Apple', 'iPad Air (3rd gen)', DeviceType::TABLET ],
|
||||
'iPad11,4' => [ 'Apple', 'iPad Air (3rd gen)', DeviceType::TABLET ],
|
||||
'iPad11,6' => [ 'Apple', 'iPad (8th gen)', DeviceType::TABLET ],
|
||||
'iPad11,7' => [ 'Apple', 'iPad (8th gen)', DeviceType::TABLET ],
|
||||
'iPad12,1' => [ 'Apple', 'iPad (9th gen)', DeviceType::TABLET ],
|
||||
'iPad12,2' => [ 'Apple', 'iPad (9th gen)', DeviceType::TABLET ],
|
||||
'iPad14,1' => [ 'Apple', 'iPad mini (6th gen)', DeviceType::TABLET ],
|
||||
'iPad14,2' => [ 'Apple', 'iPad mini (6th gen)', DeviceType::TABLET ],
|
||||
'iPad13,1' => [ 'Apple', 'iPad Air (4th gen)', DeviceType::TABLET ],
|
||||
'iPad13,2' => [ 'Apple', 'iPad Air (4th gen)', DeviceType::TABLET ],
|
||||
'iPad13,4' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ],
|
||||
'iPad13,5' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ],
|
||||
'iPad13,6' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ],
|
||||
'iPad13,7' => [ 'Apple', 'iPad Pro (11.0″, 5th gen)', DeviceType::TABLET ],
|
||||
'iPad13,8' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ],
|
||||
'iPad13,9' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ],
|
||||
'iPad13,10' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ],
|
||||
'iPad13,11' => [ 'Apple', 'iPad Pro (12.9″, 5th gen)', DeviceType::TABLET ],
|
||||
];
|
||||
Executable
+353
@@ -0,0 +1,353 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$KDDI_MODELS = [
|
||||
'KC3Q' => [ 'iida', 'misora' ], // KYX02 by Kyocera
|
||||
'KC3S' => [ 'iida', 'PRISMOID' ], // KYX03 by Kyocera
|
||||
'KC3V' => [ 'iida', 'lotta' ], // KYX04 by Kyocera
|
||||
'ST22' => [ 'iida', 'INFOBAR' ], // A5307ST by Sanyo
|
||||
'ST33' => [ 'iida', 'INFOBAR 2' ], // W55SA by Sanyo
|
||||
'SN3K' => [ 'iida', 'G9' ], // SOX01 by Sony Ericsson
|
||||
'SN3T' => [ 'iida', 'G11' ], // SOX02 by Sony Ericsson
|
||||
'TS3Q' => [ 'iida', 'PLY' ], // TSX04 by Toshiba
|
||||
'TS3U' => [ 'iida', 'LIGHT POOL' ], // by Toshiba
|
||||
'TS3W' => [ 'iida', 'X-RAY' ], // by Toshiba
|
||||
|
||||
'CA11' => [ 'Casio', 'C303CA' ],
|
||||
'CA12' => [ 'Casio', 'C311CA' ],
|
||||
'CA13' => [ 'Casio', 'C409CA' ],
|
||||
'CA14' => [ 'Casio', 'C452CA' ],
|
||||
'CA21' => [ 'Casio', 'A3012CA' ],
|
||||
'CA22' => [ 'Casio', 'A5302CA' ],
|
||||
'CA23' => [ 'Casio', 'A5401CA' ],
|
||||
'CA24' => [ 'Casio', 'A5403CA' ],
|
||||
'CA25' => [ 'Casio', 'A5406CA' ],
|
||||
'CA26' => [ 'Casio', 'A5407CA' ],
|
||||
'CA27' => [ 'Casio', 'A5512CA' ],
|
||||
'CA28' => [ 'Casio', 'GzOne Type-R A5513CA' ],
|
||||
'CA31' => [ 'Casio', 'W21CA' ],
|
||||
'CA32' => [ 'Casio', 'W31CA' ],
|
||||
'CA33' => [ 'Casio', 'W41CA' ],
|
||||
'CA34' => [ 'Casio', 'W42CA' ],
|
||||
'CA35' => [ 'Casio', 'W43CA' ],
|
||||
'CA36' => [ 'Casio', 'E03CA' ],
|
||||
'CA37' => [ 'Casio', 'W51CA' ],
|
||||
'CA38' => [ 'Casio', 'W52CA' ],
|
||||
'CA39' => [ 'Casio', 'W53CA' ],
|
||||
'CA3A' => [ 'Casio', 'W61CA' ],
|
||||
'CA3B' => [ 'Casio', 'W62CA' ],
|
||||
'CA3C' => [ 'Casio', 'W63CA' ],
|
||||
'CA3D' => [ 'Casio', 'CA001' ],
|
||||
'CA3E' => [ 'Casio', 'CA002' ],
|
||||
'CA3F' => [ 'Casio', 'CA003' ],
|
||||
'CA3G' => [ 'Casio', 'CA004' ],
|
||||
'CA3H' => [ 'Casio', 'CA005' ],
|
||||
'CA3I' => [ 'Casio', 'GzOne Type-X CAY01' ],
|
||||
'CA3J' => [ 'Casio', 'CA006' ],
|
||||
'CA3K' => [ 'Casio', 'CA007' ],
|
||||
'DN01' => [ 'Denso', 'C202DE' ],
|
||||
'DN11' => [ 'Denso', 'C402DE' ],
|
||||
'ERK0' => [ 'Ericsson', 'R280' ],
|
||||
'FJ31' => [ 'Fujitsu', 'F001' ],
|
||||
'HI01' => [ 'Hitachi', 'C201H' ],
|
||||
'HI02' => [ 'Hitachi', 'C201H' ],
|
||||
'HI11' => [ 'Hitachi', 'C302H' ],
|
||||
'HI12' => [ 'Hitachi', 'C309H' ],
|
||||
'HI13' => [ 'Hitachi', 'C407H' ],
|
||||
'HI14' => [ 'Hitachi', 'C451H' ],
|
||||
'HI21' => [ 'Hitachi', 'C3001H' ],
|
||||
'HI23' => [ 'Hitachi', 'A5303H' ],
|
||||
'HI24' => [ 'Hitachi', 'A5303H II' ],
|
||||
'HI31' => [ 'Hitachi', 'W11H' ],
|
||||
'HI32' => [ 'Hitachi', 'W21H' ],
|
||||
'HI33' => [ 'Hitachi', 'W22H' ],
|
||||
'HI34' => [ 'Hitachi', 'PENCK W31H' ],
|
||||
'HI35' => [ 'Hitachi', 'W32H' ],
|
||||
'HI36' => [ 'Hitachi', 'W41H' ],
|
||||
'HI37' => [ 'Hitachi', 'W42H' ],
|
||||
'HI38' => [ 'Hitachi', 'W43H' ],
|
||||
'HI39' => [ 'Hitachi', 'W51H' ],
|
||||
'HI3A' => [ 'Hitachi', 'W52H' ],
|
||||
'HI3B' => [ 'Hitachi', 'W53H' ],
|
||||
'HI3C' => [ 'Hitachi', 'W61H' ],
|
||||
'HI3D' => [ 'Hitachi', 'W62H' ],
|
||||
'HI3E' => [ 'Hitachi', 'W63H' ],
|
||||
'HI3F' => [ 'Hitachi', 'H001' ], // HI001
|
||||
'HI3G' => [ 'Hitachi', 'Mobile Hi-Vision CAM Wooo HIY01' ],
|
||||
'HI3H' => [ 'Hitachi', 'beskey HIY02' ],
|
||||
'KC11' => [ 'Kyocera', 'C307K' ],
|
||||
'KC12' => [ 'Kyocera', 'C313K' ],
|
||||
'KC13' => [ 'Kyocera', 'C414K' ],
|
||||
'KC14' => [ 'Kyocera', 'A1012K' ],
|
||||
'KC15' => [ 'Kyocera', 'A1013K' ],
|
||||
'KC21' => [ 'Kyocera', 'C3002K' ],
|
||||
'KC22' => [ 'Kyocera', 'A5305K' ],
|
||||
'KC23' => [ 'Kyocera', 'A1401K' ],
|
||||
'KC24' => [ 'Kyocera', 'A5502K' ],
|
||||
'KC25' => [ 'Kyocera', 'A5502K' ],
|
||||
'KC26' => [ 'Kyocera', 'A1403K' ],
|
||||
'KC27' => [ 'Kyocera', 'A5515K' ],
|
||||
'KC28' => [ 'Kyocera', 'A5521K' ],
|
||||
'KC29' => [ 'Kyocera', 'A5526K' ],
|
||||
'KC2A' => [ 'Kyocera', 'A5528K' ],
|
||||
'KC31' => [ 'Kyocera', 'W11K' ],
|
||||
'KC32' => [ 'Kyocera', 'W21K' ],
|
||||
'KC33' => [ 'Kyocera', 'W31K' ],
|
||||
'KC34' => [ 'Kyocera', 'W32K' ],
|
||||
'KC35' => [ 'Kyocera', 'W41K' ],
|
||||
'KC36' => [ 'Kyocera', 'W42K' ],
|
||||
'KC37' => [ 'Kyocera', 'W43K' ],
|
||||
'KC38' => [ 'Kyocera', 'W44K' ],
|
||||
'KC39' => [ 'Kyocera', 'W51K' ],
|
||||
'KC3A' => [ 'Kyocera', 'MEDIA SKIN W52K' ],
|
||||
'KC3B' => [ 'Kyocera', 'W53K/W64K' ],
|
||||
'KC3D' => [ 'Kyocera', 'W61K' ],
|
||||
'KC3E' => [ 'Kyocera', 'W44K II' ],
|
||||
'KC3G' => [ 'Kyocera', 'W62K' ],
|
||||
'KC3H' => [ 'Kyocera', 'W63K' ],
|
||||
'KC3I' => [ 'Kyocera', 'W65K' ],
|
||||
'KC3K' => [ 'Kyocera', 'W63K' ],
|
||||
'KC3M' => [ 'Kyocera', 'K001' ], // KY001
|
||||
'KC3N' => [ 'Kyocera', 'NS01' ], // KYX01
|
||||
'KC3O' => [ 'Kyocera', 'K002' ], // KY002
|
||||
'KC3P' => [ 'Kyocera', 'K003' ], // KY003
|
||||
'KC3R' => [ 'Kyocera', 'SA001' ],
|
||||
'KC3T' => [ 'Kyocera', 'E07K' ],
|
||||
'KC3U' => [ 'Kyocera', 'K004' ], // KY004
|
||||
'KC3W' => [ 'Kyocera', 'mamorino' ], // KYY01
|
||||
'KC3X' => [ 'Kyocera', 'SA002' ],
|
||||
'KC3Y' => [ 'Kyocera', 'K005' ], // KY005
|
||||
'KC3Z' => [ 'Kyocera', 'K006' ], // KY006
|
||||
'KC41' => [ 'Kyocera', 'K006' ],
|
||||
'KC42' => [ 'Kyocera', 'K007' ], // KY007
|
||||
'KC43' => [ 'Kyocera', 'K008' ], // KY008
|
||||
'KC44' => [ 'Kyocera', 'mamorino 2' ], // KYY02
|
||||
'KC45' => [ 'Kyocera', 'K010' ], // KY010
|
||||
'KC46' => [ 'Kyocera', 'K009' ], // KY009
|
||||
'KC47' => [ 'Kyocera', 'Mi-Look' ],
|
||||
'KC48' => [ 'Kyocera', 'E10K' ],
|
||||
'KC4A' => [ 'Kyocera', 'K011' ],
|
||||
'KCC1' => [ 'Kyocera', 'D303K' ],
|
||||
'KCC2' => [ 'Kyocera', 'D304K' ],
|
||||
'KCI1' => [ 'Kyocera', '703G' ],
|
||||
'KCI2' => [ 'Kyocera', '702G' ],
|
||||
'KCT1' => [ 'Kyocera', 'TK01' ],
|
||||
'KCT2' => [ 'Kyocera', 'TK02' ],
|
||||
'KCT3' => [ 'Kyocera', 'TK02' ],
|
||||
'KCT4' => [ 'Kyocera', 'TK03' ],
|
||||
'KCT5' => [ 'Kyocera', 'TK04' ],
|
||||
'KCT6' => [ 'Kyocera', 'TK05' ],
|
||||
'KCT7' => [ 'Kyocera', 'TK11' ],
|
||||
'KCT8' => [ 'Kyocera', 'TK12' ],
|
||||
'KCT9' => [ 'Kyocera', 'TK21' ],
|
||||
'KCTA' => [ 'Kyocera', 'TK22' ],
|
||||
'KCTB' => [ 'Kyocera', 'TK23' ],
|
||||
'KCTC' => [ 'Kyocera', 'TK31' ],
|
||||
'MA11' => [ 'Panasonic', 'C308P' ],
|
||||
'MA12' => [ 'Panasonic', 'C308P' ],
|
||||
'MA13' => [ 'Panasonic', 'C408P' ],
|
||||
'MA21' => [ 'Panasonic', 'C3003P' ],
|
||||
'MA31' => [ 'Panasonic', 'W51P' ],
|
||||
'MA32' => [ 'Panasonic', 'W52P' ],
|
||||
'MA33' => [ 'Panasonic', 'W61P' ],
|
||||
'MA34' => [ 'Panasonic', 'W62P' ],
|
||||
'MA35' => [ 'Panasonic', 'P001' ],
|
||||
'MAC1' => [ 'Panasonic', 'D305P' ],
|
||||
'MAC2' => [ 'Panasonic', 'D305P' ],
|
||||
'MAI1' => [ 'Panasonic', '704G' ],
|
||||
'MAI2' => [ 'Panasonic', '704G' ],
|
||||
'MAT1' => [ 'Panasonic', 'TP01' ],
|
||||
'MAT2' => [ 'Panasonic', 'TP01' ],
|
||||
'MAT3' => [ 'Panasonic', 'TP11' ],
|
||||
'MIT1' => [ 'Mitsubishi', 'TD11' ],
|
||||
'PT21' => [ 'Pantech', 'A1405PT' ],
|
||||
'PT23' => [ 'Pantech', 'A1407PT' ],
|
||||
'PT33' => [ 'Pantech', 'W61PT' ],
|
||||
'PT34' => [ 'Pantech', 'W62PT' ],
|
||||
'PT35' => [ 'Pantech', 'NS02' ],
|
||||
'PT36' => [ 'Pantech', 'PT002' ],
|
||||
'SA21' => [ 'Sanyo', 'A3011SA' ],
|
||||
'SA22' => [ 'Sanyo', 'A3015SA' ],
|
||||
'SA24' => [ 'Sanyo', 'A1302SA' ],
|
||||
'SA25' => [ 'Sanyo', 'A1303SA' ],
|
||||
'SA26' => [ 'Sanyo', 'A5503SA' ],
|
||||
'SA27' => [ 'Sanyo', 'A5505SA' ],
|
||||
'SA28' => [ 'Sanyo', 'A1305SA' ],
|
||||
'SA29' => [ 'Sanyo', 'A5522SA' ],
|
||||
'SA2A' => [ 'Sanyo', 'A5527SA' ],
|
||||
'SA31' => [ 'Sanyo', 'W21SA' ],
|
||||
'SA32' => [ 'Sanyo', 'W22SA' ],
|
||||
'SA33' => [ 'Sanyo', 'W31SA' ],
|
||||
'SA34' => [ 'Sanyo', 'W32SA' ],
|
||||
'SA35' => [ 'Sanyo', 'W33SA' ],
|
||||
'SA36' => [ 'Sanyo', 'W41SA' ],
|
||||
'SA37' => [ 'Sanyo', 'E02SA' ],
|
||||
'SA38' => [ 'Sanyo', 'W43SA' ],
|
||||
'SA39' => [ 'Sanyo', 'W51SA' ],
|
||||
'SA3A' => [ 'Sanyo', 'W52SA' ],
|
||||
'SA3B' => [ 'Sanyo', 'W54SA' ],
|
||||
'SA3C' => [ 'Sanyo', 'W61SA' ],
|
||||
'SA3D' => [ 'Sanyo', 'W63SA' ],
|
||||
'SA3E' => [ 'Sanyo', 'W64SA' ],
|
||||
'SY12' => [ 'Sanyo', 'C401SA' ],
|
||||
'SY13' => [ 'Sanyo', 'C405SA' ],
|
||||
'SY14' => [ 'Sanyo', 'C412SA' ],
|
||||
'SY15' => [ 'Sanyo', 'C1001SA' ],
|
||||
'SYC1' => [ 'Sanyo', 'D301SA' ],
|
||||
'SYT1' => [ 'Sanyo', 'TS01' ],
|
||||
'SYT2' => [ 'Sanyo', 'TS02' ],
|
||||
'SYT3' => [ 'Sanyo', 'TS11' ],
|
||||
'SYT4' => [ 'Sanyo', 'TS31' ],
|
||||
'SH31' => [ 'Sharp', 'W41SH' ],
|
||||
'SH32' => [ 'Sharp', 'W51SH' ],
|
||||
'SH33' => [ 'Sharp', 'W52SH' ],
|
||||
'SH34' => [ 'Sharp', 'W61SH' ],
|
||||
'SH35' => [ 'Sharp', 'W62SH' ],
|
||||
'SH36' => [ 'Sharp', 'URBANO W63SH' ],
|
||||
'SH37' => [ 'Sharp', 'W64SH' ],
|
||||
'SH38' => [ 'Sharp', 'SH001' ],
|
||||
'SH39' => [ 'Sharp', 'E05SH' ],
|
||||
'SH3A' => [ 'Sharp', 'E06SH' ],
|
||||
'SH3B' => [ 'Sharp', 'SH002' ],
|
||||
'SH3C' => [ 'Sharp', 'Sportio water beat SHY01' ],
|
||||
'SH3D' => [ 'Sharp', 'SH003' ],
|
||||
'SH3E' => [ 'Sharp', 'SH004' ],
|
||||
'SH3F' => [ 'Sharp', 'SH005' ],
|
||||
'SH3G' => [ 'Sharp', 'SH006' ],
|
||||
'SH3H' => [ 'Sharp', 'SH007' ],
|
||||
'SH3I' => [ 'Sharp', 'SH008' ],
|
||||
'SH3J' => [ 'Sharp', 'SH009' ],
|
||||
'SH3K' => [ 'Sharp', 'SH010' ],
|
||||
'SH3L' => [ 'Sharp', 'SH011' ],
|
||||
'SN11' => [ 'Sony', 'C305S' ],
|
||||
'SN13' => [ 'Sony', 'C406S' ],
|
||||
'SN14' => [ 'Sony', 'C404S' ],
|
||||
'SN15' => [ 'Sony', 'C413S' ],
|
||||
'SN16' => [ 'Sony', 'C413S' ],
|
||||
'SN17' => [ 'Sony Ericsson', 'C1002S' ],
|
||||
'SN21' => [ 'Sony Ericsson', 'A3014S' ],
|
||||
'SN22' => [ 'Sony Ericsson', 'A1101S' ],
|
||||
'SN23' => [ 'Sony Ericsson', 'A1301S' ],
|
||||
'SN24' => [ 'Sony Ericsson', 'A5402S' ],
|
||||
'SN25' => [ 'Sony Ericsson', 'A5404S' ],
|
||||
'SN26' => [ 'Sony Ericsson', 'A1402S' ],
|
||||
'SN27' => [ 'Sony Ericsson', 'A1402S II' ],
|
||||
'SN28' => [ 'Sony Ericsson', 'A1402S II' ],
|
||||
'SN29' => [ 'Sony Ericsson', 'A1404S' ],
|
||||
'SN31' => [ 'Sony Ericsson', 'W21S' ],
|
||||
'SN32' => [ 'Sony Ericsson', 'W31S' ],
|
||||
'SN33' => [ 'Sony Ericsson', 'W32S' ],
|
||||
'SN34' => [ 'Sony Ericsson', 'W41S' ],
|
||||
'SN35' => [ 'Sony Ericsson', 'EZ FeliCa W32S' ],
|
||||
'SN36' => [ 'Sony Ericsson', 'W42S' ],
|
||||
'SN37' => [ 'Sony Ericsson', 'W43S' ],
|
||||
'SN38' => [ 'Sony Ericsson', 'W44S' ],
|
||||
'SN39' => [ 'Sony Ericsson', 'W51S' ],
|
||||
'SN3A' => [ 'Sony Ericsson', 'W52S' ],
|
||||
'SN3B' => [ 'Sony Ericsson', 'W53S' ],
|
||||
'SN3C' => [ 'Sony Ericsson', 'W54S' ],
|
||||
'SN3D' => [ 'Sony Ericsson', 'W61S' ],
|
||||
'SN3E' => [ 'Sony Ericsson', 'W62S' ],
|
||||
'SN3F' => [ 'Sony Ericsson', 're W63S' ],
|
||||
'SN3G' => [ 'Sony Ericsson', 'W64S' ],
|
||||
'SN3H' => [ 'Sony Ericsson', 'Xmini W65S' ],
|
||||
'SN3I' => [ 'Sony Ericsson', 'Premier3 SOY01' ],
|
||||
'SN3J' => [ 'Sony Ericsson', 'S001' ],
|
||||
'SN3L' => [ 'Sony Ericsson', 'BRAVIA Phone U1 SOY02' ],
|
||||
'SN3M' => [ 'Sony Ericsson', 'S002' ],
|
||||
'SN3N' => [ 'Sony Ericsson', 'URBANO BARONE SOY03' ],
|
||||
'SN3O' => [ 'Sony Ericsson', 'S003' ],
|
||||
'SN3P' => [ 'Sony Ericsson', 'S004' ],
|
||||
'SN3Q' => [ 'Sony Ericsson', 'S005' ],
|
||||
'SN3R' => [ 'Sony Ericsson', 'URBANO MOND SOY04' ],
|
||||
'SN3S' => [ 'Sony Ericsson', 'S006' ],
|
||||
'SN3U' => [ 'Sony Ericsson', 'S007' ],
|
||||
'SN3V' => [ 'Sony Ericsson', 'URBANO AFFARE SOY05' ],
|
||||
'ST11' => [ 'Sanyo', 'C403ST' ],
|
||||
'ST12' => [ 'Sanyo', 'C411ST' ],
|
||||
'ST13' => [ 'Sanyo', 'A1011ST' ],
|
||||
'ST14' => [ 'Sanyo', 'A1014ST' ],
|
||||
'ST21' => [ 'Sanyo', 'A5306ST' ],
|
||||
'ST23' => [ 'Sanyo', 'A5405SA' ],
|
||||
'ST24' => [ 'Sanyo', 'A5507SA' ],
|
||||
'ST25' => [ 'Sanyo', 'talby A5508SA' ],
|
||||
'ST26' => [ 'Sanyo', 'Sweets A5510SA' ],
|
||||
'ST27' => [ 'Sanyo', 'A5514SA' ],
|
||||
'ST28' => [ 'Sanyo', 'A5518SA' ],
|
||||
'ST29' => [ 'Sanyo', 'Sweets pure A5519SA' ],
|
||||
'ST2A' => [ 'Sanyo', 'A5520SA' ],
|
||||
'ST2C' => [ 'Sanyo', 'Sweets cute A5524SA' ],
|
||||
'ST2D' => [ 'Sanyo', 'A5525SA' ],
|
||||
'ST31' => [ 'Sanyo', 'W42SA' ],
|
||||
'ST32' => [ 'Sanyo', 'W53SA' ],
|
||||
'ST34' => [ 'Sanyo', 'W62SA' ],
|
||||
'SY01' => [ 'Sanyo', 'SCP-4000' ],
|
||||
'SY02' => [ 'Sanyo', 'SCP-4500' ],
|
||||
'SY03' => [ 'Sanyo', 'SCP-5000' ],
|
||||
'SY11' => [ 'Sanyo', 'C304SA' ],
|
||||
'SY12' => [ 'Sanyo', 'C401SA' ],
|
||||
'SY13' => [ 'Sanyo', 'C405SA' ],
|
||||
'SY14' => [ 'Sanyo', 'C412SA' ],
|
||||
'SY15' => [ 'Sanyo', 'C1001SA' ],
|
||||
'TS01' => [ 'Toshiba', 'IS02' ],
|
||||
'TS11' => [ 'Toshiba', 'C301T' ],
|
||||
'TS12' => [ 'Toshiba', 'C310T' ],
|
||||
'TS13' => [ 'Toshiba', 'C410T' ],
|
||||
'TS14' => [ 'Toshiba', 'C415T' ],
|
||||
'TS21' => [ 'Toshiba', 'C5001T' ],
|
||||
'TS22' => [ 'Toshiba', 'A3013T' ],
|
||||
'TS23' => [ 'Toshiba', 'A5301T' ],
|
||||
'TS24' => [ 'Toshiba', 'A5304T' ],
|
||||
'TS25' => [ 'Toshiba', 'A1304T' ],
|
||||
'TS26' => [ 'Toshiba', 'A5501T' ],
|
||||
'TS27' => [ 'Toshiba', 'A5504T' ],
|
||||
'TS28' => [ 'Toshiba', 'A5506T' ],
|
||||
'TS29' => [ 'Toshiba', 'A5509T' ],
|
||||
'TS2A' => [ 'Toshiba', 'A5511T' ],
|
||||
'TS2B' => [ 'Toshiba', 'A5516T' ],
|
||||
'TS2C' => [ 'Toshiba', 'A5517T' ],
|
||||
'TS2D' => [ 'Toshiba', 'A5523T' ],
|
||||
'TS2E' => [ 'Toshiba', 'A5529T' ],
|
||||
'TS31' => [ 'Toshiba', 'W21T' ],
|
||||
'TS32' => [ 'Toshiba', 'W31T' ],
|
||||
'TS33' => [ 'Toshiba', 'W32T' ],
|
||||
'TS34' => [ 'Toshiba', 'W41T' ],
|
||||
'TS35' => [ 'Toshiba', 'neon W42T' ],
|
||||
'TS36' => [ 'Toshiba', 'W43T' ],
|
||||
'TS37' => [ 'Toshiba', 'W44T' ],
|
||||
'TS38' => [ 'Toshiba', 'W45T' ],
|
||||
'TS39' => [ 'Toshiba', 'DRAPE W46T' ],
|
||||
'TS3A' => [ 'Toshiba', 'W47T' ],
|
||||
'TS3B' => [ 'Toshiba', 'W51T' ],
|
||||
'TS3C' => [ 'Toshiba', 'W52T' ],
|
||||
'TS3D' => [ 'Toshiba', 'W53T' ],
|
||||
'TS3E' => [ 'Toshiba', 'W54T' ],
|
||||
'TS3G' => [ 'Toshiba', 'W55T' ],
|
||||
'TS3H' => [ 'Toshiba', 'W56T' ],
|
||||
'TS3I' => [ 'Toshiba', 'W61T' ],
|
||||
'TS3J' => [ 'Toshiba', 'W62T' ],
|
||||
'TS3K' => [ 'Toshiba', 'Sportio W63T' ],
|
||||
'TS3L' => [ 'Toshiba', 'W64T' ],
|
||||
'TS3M' => [ 'Toshiba', 'W65T' ],
|
||||
'TS3N' => [ 'Toshiba', 'T001' ],
|
||||
'TS3O' => [ 'Toshiba', 'biblio TSY01' ],
|
||||
'TS3P' => [ 'Toshiba', 'T002' ],
|
||||
'TS3R' => [ 'Toshiba', 'T003' ],
|
||||
'TS3S' => [ 'Toshiba', 'T004' ],
|
||||
'TS3T' => [ 'Toshiba', 'E08T' ],
|
||||
'TS3V' => [ 'Toshiba', 'T005' ],
|
||||
'TS3X' => [ 'Toshiba', 'T006' ],
|
||||
'TS3Y' => [ 'Toshiba', 'T008' ],
|
||||
'TS3Z' => [ 'Toshiba', 'T007' ],
|
||||
'TS41' => [ 'Toshiba', 'E09F' ],
|
||||
'TSC1' => [ 'Toshiba', 'D302T' ],
|
||||
'TSI1' => [ 'Toshiba', '701G' ],
|
||||
'TST1' => [ 'Toshiba', 'TT01' ],
|
||||
'TST2' => [ 'Toshiba', 'TT02' ],
|
||||
'TST3' => [ 'Toshiba', 'TT03' ],
|
||||
'TST4' => [ 'Toshiba', 'TT11' ],
|
||||
'TST5' => [ 'Toshiba', 'TT21' ],
|
||||
'TST6' => [ 'Toshiba', 'TT22' ],
|
||||
'TST7' => [ 'Toshiba', 'TT31' ],
|
||||
];
|
||||
Executable
+94
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\DeviceType;
|
||||
use WhichBrowser\Constants\DeviceSubType;
|
||||
|
||||
DeviceModels::$PALMOS_MODELS = [
|
||||
'Palm-D061' => [ 'Palm', 'Centro 685', DeviceType::MOBILE ],
|
||||
'Palm-D062' => [ 'Palm', 'Centro 690', DeviceType::MOBILE ],
|
||||
'Palm-TunX' => [ 'Palm', 'LifeDrive', DeviceType::PDA ],
|
||||
'Palm-stuj' => [ 'Palm', 'm125', DeviceType::PDA ],
|
||||
'Palm-hbbs' => [ 'Palm', 'm130', DeviceType::PDA ],
|
||||
'Palm-trnd' => [ 'Palm', 'm500', DeviceType::PDA ],
|
||||
'Palm-ecty' => [ 'Palm', 'm505', DeviceType::PDA ],
|
||||
'Palm-lith' => [ 'Palm', 'm515', DeviceType::PDA ],
|
||||
'Palm-sky1' => [ 'Palm', 'i705', DeviceType::PDA ],
|
||||
'hspr-H101' => [ 'Palm', 'Treo 600', DeviceType::MOBILE ],
|
||||
'hspr-H102' => [ 'Palm', 'Treo 650', DeviceType::MOBILE ],
|
||||
'Palm-D053' => [ 'Palm', 'Treo 680', DeviceType::MOBILE ],
|
||||
'Palm-D052' => [ 'Palm', 'Treo 700', DeviceType::MOBILE ],
|
||||
'Palm-D060' => [ 'Palm', 'Treo 755', DeviceType::MOBILE ],
|
||||
'Palm-MT64' => [ 'Palm', 'Tungsten C', DeviceType::PDA ],
|
||||
'Palm-Cct1' => [ 'Palm', 'Tungsten E', DeviceType::PDA ],
|
||||
'Palm-Zir4' => [ 'Palm', 'Tungsten E2', DeviceType::PDA ],
|
||||
'Palm-Frg1' => [ 'Palm', 'Tungsten T', DeviceType::PDA ],
|
||||
'Palm-Frg2' => [ 'Palm', 'Tungsten T2', DeviceType::PDA ],
|
||||
'Palm-Arz1' => [ 'Palm', 'Tungsten T3', DeviceType::PDA ],
|
||||
'Palm-TnT5' => [ 'Palm', 'Tungsten T5', DeviceType::PDA ],
|
||||
'Palm-atc1' => [ 'Palm', 'Tungsten W', DeviceType::PDA ],
|
||||
'Palm-D050' => [ 'Palm', 'TX', DeviceType::PDA ],
|
||||
'Palm-Cubs' => [ 'Palm', 'Zire', DeviceType::PDA ],
|
||||
'Palm-Zi21' => [ 'Palm', 'Zire 21', DeviceType::PDA ],
|
||||
'Palm-D051' => [ 'Palm', 'Zire 22', DeviceType::PDA ],
|
||||
'Palm-Zi22' => [ 'Palm', 'Zire 31', DeviceType::PDA ],
|
||||
'Palm-Zpth' => [ 'Palm', 'Zire 71', DeviceType::PDA ],
|
||||
'Palm-Zi72' => [ 'Palm', 'Zire 72', DeviceType::PDA ],
|
||||
|
||||
'sony-ystn' => [ 'Sony', 'CLIÉ PEG-N600C', DeviceType::PDA ],
|
||||
'sony-ysmt' => [ 'Sony', 'CLIÉ PEG-N700C', DeviceType::PDA ],
|
||||
'sony-ysm2' => [ 'Sony', 'CLIÉ PEG-N750C', DeviceType::PDA ],
|
||||
'sony-nsca' => [ 'Sony', 'CLIÉ PEG-S320', DeviceType::PDA ],
|
||||
'sony-nsc2' => [ 'Sony', 'CLIÉ PEG-S360', DeviceType::PDA ],
|
||||
'sony-vnce' => [ 'Sony', 'CLIÉ PEG-T400', DeviceType::PDA ],
|
||||
'sony-mdna' => [ 'Sony', 'CLIÉ PEG-T600C', DeviceType::PDA ],
|
||||
'sony-npls' => [ 'Sony', 'CLIÉ PEG-T650C', DeviceType::PDA ],
|
||||
'sony-rdwd' => [ 'Sony', 'CLIÉ PEG-NR70', DeviceType::PDA ],
|
||||
'sony-crdb' => [ 'Sony', 'CLIÉ PEG-NX60', DeviceType::PDA ],
|
||||
'sony-tldo' => [ 'Sony', 'CLIÉ PEG-NX73V', DeviceType::PDA ],
|
||||
'sony-mdrd' => [ 'Sony', 'CLIÉ PEG-NX80V', DeviceType::PDA ],
|
||||
'sony-grnd' => [ 'Sony', 'CLIÉ PEG-NZ90', DeviceType::PDA ],
|
||||
'sony-frta' => [ 'Sony', 'CLIÉ PEG-SL10', DeviceType::PDA ],
|
||||
'sony-cocs' => [ 'Sony', 'CLIÉ PEG-SL20', DeviceType::PDA ],
|
||||
'sony-glps' => [ 'Sony', 'CLIÉ PEG-SJ22', DeviceType::PDA ],
|
||||
'sony-mcnd' => [ 'Sony', 'CLIÉ PEG-SJ33', DeviceType::PDA ],
|
||||
'sony-vrna' => [ 'Sony', 'CLIÉ PEG-TG50', DeviceType::PDA ],
|
||||
'sony-atom' => [ 'Sony', 'CLIÉ PEG-TH55', DeviceType::PDA ],
|
||||
'sony-goha' => [ 'Sony', 'CLIÉ PEG-TJ25', DeviceType::PDA ],
|
||||
'sony-leia' => [ 'Sony', 'CLIÉ PEG-TJ27', DeviceType::PDA ],
|
||||
'sony-hwai' => [ 'Sony', 'CLIÉ PEG-TJ30', DeviceType::PDA ],
|
||||
'sony-goku' => [ 'Sony', 'CLIÉ PEG-TJ35', DeviceType::PDA ],
|
||||
'sony-luke' => [ 'Sony', 'CLIÉ PEG-TJ37', DeviceType::PDA ],
|
||||
'sony-amno' => [ 'Sony', 'CLIÉ PEG-UX40', DeviceType::PDA ],
|
||||
'sony-prmr' => [ 'Sony', 'CLIÉ PEG-UX50', DeviceType::PDA ],
|
||||
'sony-ancy' => [ 'Sony', 'CLIÉ PEG-VZ90', DeviceType::PDA ],
|
||||
|
||||
'smsn-phix' => [ 'Samsung', 'SPH-i300', DeviceType::MOBILE ],
|
||||
'smsn-Phx2' => [ 'Samsung', 'SPH-i330', DeviceType::MOBILE ],
|
||||
'smsn-blch' => [ 'Samsung', 'SPH-i500', DeviceType::MOBILE ],
|
||||
'smsn-BLFM' => [ 'Samsung', 'SPH-i530', DeviceType::MOBILE ],
|
||||
'smsn-glxy' => [ 'Samsung', 'SPH-i550', DeviceType::MOBILE ],
|
||||
|
||||
'grmn-3200' => [ 'Garmin', 'iQue 3200', DeviceType::GPS ],
|
||||
'grmn-3600' => [ 'Garmin', 'iQue 3600', DeviceType::GPS ],
|
||||
'grmn-3700' => [ 'Garmin', 'iQue 3600a', DeviceType::GPS ],
|
||||
|
||||
'trgp-trg1' => [ 'HandEra', 'TRG Pro', DeviceType::PDA ],
|
||||
'trgp-trg2' => [ 'HandEra', '330', DeviceType::PDA ],
|
||||
|
||||
'qcom-qc20' => [ 'Kyocera', 'QCP-6035', DeviceType::MOBILE ],
|
||||
'kwc.-7135' => [ 'Kyocera', 'QCP-7135', DeviceType::MOBILE ],
|
||||
|
||||
'Tpwv-Rdog' => [ 'Tapwave', 'Zodiac', [ DeviceType::GAMING, DeviceSubType::PORTABLE ] ],
|
||||
|
||||
'gsRl-zicn' => [ 'Group Sense', 'Xplore G18', DeviceType::MOBILE ],
|
||||
'gsRl-zcn2' => [ 'Group Sense', 'Xplore M28', DeviceType::MOBILE ],
|
||||
'gsRl-zcn5' => [ 'Group Sense', 'Xplore M68', DeviceType::MOBILE ],
|
||||
|
||||
'acer-momo' => [ 'Acer', 's10', DeviceType::PDA ],
|
||||
'acer-coco' => [ 'Acer', 's50', DeviceType::PDA ],
|
||||
|
||||
'Acea-MZ01' => [ 'Aceeca', 'Meazura MEZ1000', DeviceType::PDA ],
|
||||
'Acea-PD01' => [ 'Aceeca', 'PDA32', DeviceType::PDA ],
|
||||
];
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\Flag;
|
||||
|
||||
DeviceModels::$S30PLUS_MODELS = [
|
||||
'215' => [ 'Nokia', '215' ],
|
||||
'220' => [ 'Nokia', '220' ],
|
||||
'222' => [ 'Nokia', '222' ],
|
||||
'225' => [ 'Nokia', '225' ],
|
||||
'230' => [ 'Nokia', '230' ]
|
||||
];
|
||||
Executable
+135
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$S40_MODELS = [
|
||||
'C1-01!' => [ 'Nokia', 'C1-01' ],
|
||||
'C1-02!' => [ 'Nokia', 'C1-02' ],
|
||||
'C1-03!' => [ 'Nokia', 'C1-03' ],
|
||||
'C2-00!' => [ 'Nokia', 'C2-00' ],
|
||||
'C2-01!' => [ 'Nokia', 'C2-01' ],
|
||||
'C2-02!' => [ 'Nokia', 'C2-02' ],
|
||||
'C2-03!' => [ 'Nokia', 'C2-03' ],
|
||||
'C2-05!' => [ 'Nokia', 'C2-05' ],
|
||||
'C2-06!' => [ 'Nokia', 'C2-06' ],
|
||||
'C3-00!' => [ 'Nokia', 'C3-00' ],
|
||||
'C3-01!' => [ 'Nokia', 'C3-01' ],
|
||||
'X2-00!' => [ 'Nokia', 'X2-00' ],
|
||||
'X2-01!' => [ 'Nokia', 'X2-01' ],
|
||||
'X2-02!' => [ 'Nokia', 'X2-02' ],
|
||||
'X2-03!' => [ 'Nokia', 'X2-03' ],
|
||||
'X2-05!' => [ 'Nokia', 'X2-05' ],
|
||||
'X3-00!' => [ 'Nokia', 'X3-00' ],
|
||||
'X3-02!' => [ 'Nokia', 'X3-02' ],
|
||||
'109' => [ 'Nokia', '109' ],
|
||||
'110' => [ 'Nokia', '110' ],
|
||||
'111' => [ 'Nokia', '111' ],
|
||||
'111.1' => [ 'Nokia', '111' ],
|
||||
'112' => [ 'Nokia', '112' ],
|
||||
'114' => [ 'Nokia', '114' ],
|
||||
'200' => [ 'Nokia', 'Asha 200' ],
|
||||
'201' => [ 'Nokia', 'Asha 201' ],
|
||||
'202' => [ 'Nokia', 'Asha 202' ],
|
||||
'203' => [ 'Nokia', 'Asha 203' ],
|
||||
'205' => [ 'Nokia', 'Asha 205' ],
|
||||
'205.1' => [ 'Nokia', 'Asha 205' ],
|
||||
'205.3' => [ 'Nokia', 'Asha 205' ],
|
||||
'206' => [ 'Nokia', 'Asha 206' ],
|
||||
'206.1' => [ 'Nokia', 'Asha 206' ],
|
||||
'208' => [ 'Nokia', '208' ],
|
||||
'208.1' => [ 'Nokia', '208' ],
|
||||
'208.2' => [ 'Nokia', '208' ],
|
||||
'208.3' => [ 'Nokia', '208' ],
|
||||
'208.4' => [ 'Nokia', '208' ],
|
||||
'210' => [ 'Nokia', 'Asha 210' ],
|
||||
'210.2' => [ 'Nokia', 'Asha 210' ],
|
||||
'210.3' => [ 'Nokia', 'Asha 210' ],
|
||||
'210.4' => [ 'Nokia', 'Asha 210' ],
|
||||
'210.5' => [ 'Nokia', 'Asha 210' ],
|
||||
'300' => [ 'Nokia', 'Asha 300' ],
|
||||
'301' => [ 'Nokia', '301' ],
|
||||
'301.1' => [ 'Nokia', '301' ],
|
||||
'302' => [ 'Nokia', 'Asha 302' ],
|
||||
'303' => [ 'Nokia', 'Asha 303' ],
|
||||
'305' => [ 'Nokia', 'Asha 305' ],
|
||||
'306' => [ 'Nokia', 'Asha 306' ],
|
||||
'308' => [ 'Nokia', 'Asha 308' ],
|
||||
'309' => [ 'Nokia', 'Asha 309' ],
|
||||
'310' => [ 'Nokia', 'Asha 310' ],
|
||||
'311' => [ 'Nokia', 'Asha 311' ],
|
||||
'515' => [ 'Nokia', '515' ],
|
||||
'515.2' => [ 'Nokia', '515' ],
|
||||
'1682c' => [ 'Nokia', '1682 classic' ],
|
||||
'2055' => [ 'Nokia', 'Asha 2055' ],
|
||||
'2060' => [ 'Nokia', '2060' ], // Same as Asha 206
|
||||
'2220s!' => [ 'Nokia', '2220 slide' ],
|
||||
'2320c!' => [ 'Nokia', '2320 classic' ],
|
||||
'2322c!' => [ 'Nokia', '2322 classic' ],
|
||||
'2323c!' => [ 'Nokia', '2323 classic' ],
|
||||
'2330c!' => [ 'Nokia', '2330 classic' ],
|
||||
'2600c!' => [ 'Nokia', '2600 classic' ],
|
||||
'2680s!' => [ 'Nokia', '2680 slide' ],
|
||||
'2690' => [ 'Nokia', '2690' ],
|
||||
'2692' => [ 'Nokia', '2692' ],
|
||||
'2700c!' => [ 'Nokia', '2700 classic' ],
|
||||
'2710c' => [ 'Nokia', '2710' ],
|
||||
'2710c-2' => [ 'Nokia', '2710' ],
|
||||
'2720a!' => [ 'Nokia', '2720 fold' ],
|
||||
'2730c!' => [ 'Nokia', '2730 classic' ],
|
||||
'3020' => [ 'Nokia', '3020' ],
|
||||
'3109c' => [ 'Nokia', '3109 classic' ],
|
||||
'3110c' => [ 'Nokia', '3110 Evolve' ],
|
||||
'3120c' => [ 'Nokia', '3120 classic' ],
|
||||
'3120classic' => [ 'Nokia', '3120 classic' ],
|
||||
'3208c' => [ 'Nokia', '3208 classic' ],
|
||||
'3500c' => [ 'Nokia', '3500 classic' ],
|
||||
'3555b' => [ 'Nokia', '3555' ],
|
||||
'3600s' => [ 'Nokia', '3600 slide' ],
|
||||
'3610a' => [ 'Nokia', '3610 fold' ],
|
||||
'3710fold' => [ 'Nokia', '3710 fold' ],
|
||||
'3720c' => [ 'Nokia', '3720 classic' ],
|
||||
'5000!' => [ 'Nokia', '5000' ],
|
||||
'5130!' => [ 'Nokia', '5130 XpressMusic' ],
|
||||
'5130c!' => [ 'Nokia', '5130 classic' ],
|
||||
'5132' => [ 'Nokia', '5132 XpressMusic' ],
|
||||
'5200!' => [ 'Nokia', '5200' ],
|
||||
'5220!' => [ 'Nokia', '5220 XpressMusic' ],
|
||||
'5300!' => [ 'Nokia', '5300 XpressMusic' ],
|
||||
'5310!' => [ 'Nokia', '5310 XpressMusic' ],
|
||||
'5330' => [ 'Nokia', '5330 Mobile TV Edition' ],
|
||||
'5330-1d' => [ 'Nokia', '5330 Mobile TV Edition' ],
|
||||
'5610d!' => [ 'Nokia', '5610 XpressMusic' ],
|
||||
'6070!' => [ 'Nokia', '6070' ],
|
||||
'6208c' => [ 'Nokia', '6208 classic' ],
|
||||
'6212c' => [ 'Nokia', '6212 classic' ],
|
||||
'6260s!' => [ 'Nokia', '6260 slide' ],
|
||||
'6230i!' => [ 'Nokia', '6230i' ],
|
||||
'6233' => [ 'Nokia', '6233' ],
|
||||
'6234' => [ 'Nokia', '6234' ],
|
||||
'6263!' => [ 'Nokia', '6263' ],
|
||||
'6280' => [ 'Nokia', '6280' ],
|
||||
'6300' => [ 'Nokia', '6300' ],
|
||||
'6300i' => [ 'Nokia', '6300i' ],
|
||||
'6301' => [ 'Nokia', '6301' ],
|
||||
'6303c' => [ 'Nokia', '6303 classic' ],
|
||||
'6303classic' => [ 'Nokia', '6303 classic' ],
|
||||
'6303iclassic' => [ 'Nokia', '6303i classic' ],
|
||||
'6303ci' => [ 'Nokia', '6303i classic' ],
|
||||
'6350' => [ 'Nokia', '6350' ],
|
||||
'6500s!' => [ 'Nokia', '6500 slide' ],
|
||||
'6600f!' => [ 'Nokia', '6600 fold' ],
|
||||
'6600s!' => [ 'Nokia', '6600 slide' ],
|
||||
'6600i!' => [ 'Nokia', '6600i slide' ],
|
||||
'6700c!' => [ 'Nokia', '6700 classic' ],
|
||||
'6750c' => [ 'Nokia', '6750 Mural' ],
|
||||
'7070!' => [ 'Nokia', '7070 Prism' ],
|
||||
'7100s!' => [ 'Nokia', '7100 Supernova' ],
|
||||
'7210s!' => [ 'Nokia', '7210 Supernova' ],
|
||||
'7210Supernova!' => [ 'Nokia', '7210 Supernova' ],
|
||||
'7230!' => [ 'Nokia', '7230' ],
|
||||
'7310c!' => [ 'Nokia', '7310 Supernova' ],
|
||||
'7500' => [ 'Nokia', '7500 Prism' ],
|
||||
'7510Supernova!' => [ 'Nokia', '7510 Supernova' ],
|
||||
'7610Supernova!' => [ 'Nokia', '7610 Supernova' ],
|
||||
'8800!' => [ 'Nokia', '8800 Arte' ]
|
||||
];
|
||||
+182
@@ -0,0 +1,182 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\Flag;
|
||||
|
||||
DeviceModels::$SYMBIAN_MODELS = [
|
||||
'BenQ P30' => [ 'BenQ', 'P30', 'flag' => Flag::UIQ ],
|
||||
'BenQ P31' => [ 'BenQ', 'P31', 'flag' => Flag::UIQ ],
|
||||
'RIZR-Z8' => [ 'Motorola', 'RIZR Z8', 'flag' => Flag::UIQ ],
|
||||
'RIZR-Z10' => [ 'Motorola', 'RIZR Z10', 'flag' => Flag::UIQ ],
|
||||
'A920' => [ 'Motorola', 'A920', 'flag' => Flag::UIQ ],
|
||||
'A925' => [ 'Motorola', 'A925', 'flag' => Flag::UIQ ],
|
||||
'A1000' => [ 'Motorola', 'A1000', 'flag' => Flag::UIQ ],
|
||||
'M1000' => [ 'Motorola', 'M1000', 'flag' => Flag::UIQ, 'carrier' => 'DoCoMo' ],
|
||||
'G700' => [ 'Sony Ericsson', 'G700', 'flag' => Flag::UIQ ],
|
||||
'G900' => [ 'Sony Ericsson', 'G900', 'flag' => Flag::UIQ ],
|
||||
'M600i' => [ 'Sony Ericsson', 'M600', 'flag' => Flag::UIQ ],
|
||||
'P910i' => [ 'Sony Ericsson', 'P910', 'flag' => Flag::UIQ ],
|
||||
'P990i' => [ 'Sony Ericsson', 'P990', 'flag' => Flag::UIQ ],
|
||||
'P1i' => [ 'Sony Ericsson', 'P1', 'flag' => Flag::UIQ ],
|
||||
'W950i' => [ 'Sony Ericsson', 'W950', 'flag' => Flag::UIQ ],
|
||||
'W960i' => [ 'Sony Ericsson', 'W960', 'flag' => Flag::UIQ ],
|
||||
|
||||
'LG KS10' => [ 'LG', 'KS10 Joy', 'flag' => Flag::S60 ],
|
||||
'LGKT610' => [ 'LG', 'KT610', 'flag' => Flag::S60 ],
|
||||
'LGKT615' => [ 'LG', 'KT615', 'flag' => Flag::S60 ],
|
||||
'C5-00!' => [ 'Nokia', 'C5-00', 'flag' => Flag::S60 ],
|
||||
'C5-01' => [ 'Nokia', 'C5-01', 'flag' => Flag::S60 ],
|
||||
'C5-03!' => [ 'Nokia', 'C5-03', 'flag' => Flag::S60 ],
|
||||
'C5-04' => [ 'Nokia', 'C5-04', 'flag' => Flag::S60 ],
|
||||
'C5-05' => [ 'Nokia', 'C5-05', 'flag' => Flag::S60 ],
|
||||
'C5-06' => [ 'Nokia', 'C5-06', 'flag' => Flag::S60 ],
|
||||
'C6-00!' => [ 'Nokia', 'C6-00', 'flag' => Flag::S60 ],
|
||||
'C6-01!' => [ 'Nokia', 'C6-01', 'flag' => Flag::S60 ],
|
||||
'C7-00!' => [ 'Nokia', 'C7-00', 'flag' => Flag::S60 ],
|
||||
'E5-00!' => [ 'Nokia', 'E5-00', 'flag' => Flag::S60 ],
|
||||
'E6' => [ 'Nokia', 'E6-00', 'flag' => Flag::S60 ],
|
||||
'E6-00' => [ 'Nokia', 'E6-00', 'flag' => Flag::S60 ],
|
||||
'E7-00' => [ 'Nokia', 'E7-00', 'flag' => Flag::S60 ],
|
||||
'N8-00' => [ 'Nokia', 'N8-00', 'flag' => Flag::S60 ],
|
||||
'T7-00' => [ 'Nokia', 'T7-00', 'flag' => Flag::S60 ],
|
||||
'X5-00' => [ 'Nokia', 'X5-00', 'flag' => Flag::S60 ],
|
||||
'X5-01' => [ 'Nokia', 'X5-01', 'flag' => Flag::S60 ],
|
||||
'X6-00!' => [ 'Nokia', 'X6-00', 'flag' => Flag::S60 ],
|
||||
'X7-00!' => [ 'Nokia', 'X7-00', 'flag' => Flag::S60 ],
|
||||
'N-Gage' => [ 'Nokia', 'N-Gage', 'flag' => Flag::S60 ],
|
||||
'N-GageQD' => [ 'Nokia', 'N-Gage QD', 'flag' => Flag::S60 ],
|
||||
'E50(-[1-9])?$!' => [ 'Nokia', 'E50', 'flag' => Flag::S60 ],
|
||||
'E51(-[1-9])?$!' => [ 'Nokia', 'E51', 'flag' => Flag::S60 ],
|
||||
'E52(-[1-9])?$!' => [ 'Nokia', 'E52', 'flag' => Flag::S60 ],
|
||||
'E55(-[1-9])?$!' => [ 'Nokia', 'E55', 'flag' => Flag::S60 ],
|
||||
'E60(-[1-9])?$!' => [ 'Nokia', 'E60', 'flag' => Flag::S60 ],
|
||||
'E61i!' => [ 'Nokia', 'E61i', 'flag' => Flag::S60 ],
|
||||
'E61(-[1-9])?$!' => [ 'Nokia', 'E61', 'flag' => Flag::S60 ],
|
||||
'E62(-[1-9])?$!' => [ 'Nokia', 'E62', 'flag' => Flag::S60 ],
|
||||
'E63(-[1-9])?$!' => [ 'Nokia', 'E63', 'flag' => Flag::S60 ],
|
||||
'E65(-[1-9])?$!' => [ 'Nokia', 'E65', 'flag' => Flag::S60 ],
|
||||
'E66(-[1-9])?$!' => [ 'Nokia', 'E66', 'flag' => Flag::S60 ],
|
||||
'E70(-[1-9])?$!' => [ 'Nokia', 'E70', 'flag' => Flag::S60 ],
|
||||
'E71x' => [ 'Nokia', 'E71x', 'flag' => Flag::S60 ],
|
||||
'E71(-[1-9])?$!' => [ 'Nokia', 'E71', 'flag' => Flag::S60 ],
|
||||
'E72(-[1-9])?$!' => [ 'Nokia', 'E72', 'flag' => Flag::S60 ],
|
||||
'E73(-[1-9])?$!' => [ 'Nokia', 'E73 Mode', 'flag' => Flag::S60 ],
|
||||
'E75(-[1-9])?$!' => [ 'Nokia', 'E75', 'flag' => Flag::S60 ],
|
||||
'E90(-[1-9])?$!' => [ 'Nokia', 'E90 Communicator', 'flag' => Flag::S60 ],
|
||||
'E-90-1' => [ 'Nokia', 'E90 Communicator', 'flag' => Flag::S60 ],
|
||||
'N70(-[1-9])?$!' => [ 'Nokia', 'N70', 'flag' => Flag::S60 ],
|
||||
'N71(-[1-9])?$!' => [ 'Nokia', 'N71', 'flag' => Flag::S60 ],
|
||||
'N72(-[1-9])?$!' => [ 'Nokia', 'N72', 'flag' => Flag::S60 ],
|
||||
'N73(-[1-9])?$!' => [ 'Nokia', 'N73', 'flag' => Flag::S60 ],
|
||||
'N75(-[1-9])?$!' => [ 'Nokia', 'N75', 'flag' => Flag::S60 ],
|
||||
'N76(-[1-9])?$!' => [ 'Nokia', 'N76', 'flag' => Flag::S60 ],
|
||||
'N77(-[1-9])?$!' => [ 'Nokia', 'N77', 'flag' => Flag::S60 ],
|
||||
'N78(-[1-9])?$!' => [ 'Nokia', 'N78', 'flag' => Flag::S60 ],
|
||||
'N79(-[1-9])?$!' => [ 'Nokia', 'N79', 'flag' => Flag::S60 ],
|
||||
'N80(-[1-9])?$!' => [ 'Nokia', 'N80', 'flag' => Flag::S60 ],
|
||||
'N81(-[1-9])?$!' => [ 'Nokia', 'N81', 'flag' => Flag::S60 ],
|
||||
'Nokia N81' => [ 'Nokia', 'N81', 'flag' => Flag::S60 ],
|
||||
'Nokia N81 8GB' => [ 'Nokia', 'N81 8GB', 'flag' => Flag::S60 ],
|
||||
'N82(-[1-9])?$!' => [ 'Nokia', 'N82', 'flag' => Flag::S60 ],
|
||||
'N85(-[1-9])?$!' => [ 'Nokia', 'N85', 'flag' => Flag::S60 ],
|
||||
'N86(-[1-9])?$!' => [ 'Nokia', 'N86 8MP', 'flag' => Flag::S60 ],
|
||||
'N86 ?8MP$!' => [ 'Nokia', 'N86 8MP', 'flag' => Flag::S60 ],
|
||||
'N90(-[1-9])?$!' => [ 'Nokia', 'N90', 'flag' => Flag::S60 ],
|
||||
'N91(-[1-9])?$!' => [ 'Nokia', 'N91', 'flag' => Flag::S60 ],
|
||||
'N92(-[1-9])?$!' => [ 'Nokia', 'N92', 'flag' => Flag::S60 ],
|
||||
'N93(-[1-9])?$!' => [ 'Nokia', 'N93', 'flag' => Flag::S60 ],
|
||||
'N93i' => [ 'Nokia', 'N93i', 'flag' => Flag::S60 ],
|
||||
'N95(-[1-9])?$!' => [ 'Nokia', 'N95', 'flag' => Flag::S60 ],
|
||||
'N95[ -]8GB(-[1-9])?!' => [ 'Nokia', 'N95 8GB', 'flag' => Flag::S60 ],
|
||||
'N96(-[1-9])?$!' => [ 'Nokia', 'N96', 'flag' => Flag::S60 ],
|
||||
'N97(-[1-3])?$!' => [ 'Nokia', 'N97', 'flag' => Flag::S60 ],
|
||||
'N97i' => [ 'Nokia', 'N97', 'flag' => Flag::S60 ],
|
||||
'N97(-[4-5])?$!' => [ 'Nokia', 'N97 Mini', 'flag' => Flag::S60 ],
|
||||
'N97 ?mini!' => [ 'Nokia', 'N97 Mini', 'flag' => Flag::S60 ],
|
||||
'500' => [ 'Nokia', '500', 'flag' => Flag::S60 ],
|
||||
'600' => [ 'Nokia', '600', 'flag' => Flag::S60 ],
|
||||
'603' => [ 'Nokia', '603', 'flag' => Flag::S60 ],
|
||||
'700' => [ 'Nokia', '700', 'flag' => Flag::S60 ],
|
||||
'701' => [ 'Nokia', '701', 'flag' => Flag::S60 ],
|
||||
'702T' => [ 'Nokia', '702T', 'flag' => Flag::S60 ],
|
||||
'801T' => [ 'Nokia', '801T', 'flag' => Flag::S60 ],
|
||||
'808' => [ 'Nokia', '808 PureView', 'flag' => Flag::S60 ],
|
||||
'808PureView' => [ 'Nokia', '808 PureView', 'flag' => Flag::S60 ],
|
||||
'808 PureView' => [ 'Nokia', '808 PureView', 'flag' => Flag::S60 ],
|
||||
'3230' => [ 'Nokia', '3230', 'flag' => Flag::S60 ],
|
||||
'3250' => [ 'Nokia', '3250', 'flag' => Flag::S60 ],
|
||||
'3650' => [ 'Nokia', '3650', 'flag' => Flag::S60 ],
|
||||
'3660' => [ 'Nokia', '3660', 'flag' => Flag::S60 ],
|
||||
'5228' => [ 'Nokia', '5228', 'flag' => Flag::S60 ],
|
||||
'5233!' => [ 'Nokia', '5228', 'flag' => Flag::S60 ], // The 5233 is known as 5228
|
||||
'N5233!' => [ 'Nokia', '5228', 'flag' => Flag::S60 ], // The 5233 is known as 5228
|
||||
'5230!' => [ 'Nokia', '5230', 'flag' => Flag::S60 ],
|
||||
'5232' => [ 'Nokia', '5232', 'flag' => Flag::S60 ],
|
||||
'5235!' => [ 'Nokia', '5235 Ovi Music Unlimited', 'flag' => Flag::S60 ],
|
||||
'5236' => [ 'Nokia', '5236', 'flag' => Flag::S60 ],
|
||||
'5238' => [ 'Nokia', '5238', 'flag' => Flag::S60 ],
|
||||
'5250' => [ 'Nokia', '5250', 'flag' => Flag::S60 ],
|
||||
'5320!' => [ 'Nokia', '5320 XpressMusic', 'flag' => Flag::S60 ],
|
||||
'5500d!' => [ 'Nokia', '5500 Sport', 'flag' => Flag::S60 ],
|
||||
'5530!' => [ 'Nokia', '5530 XpressMusic', 'flag' => Flag::S60 ],
|
||||
'5630!' => [ 'Nokia', '5630 XpressMusic', 'flag' => Flag::S60 ],
|
||||
'5700!' => [ 'Nokia', '5700 XpressMusic', 'flag' => Flag::S60 ],
|
||||
'5730!' => [ 'Nokia', '5730 XpressMusic', 'flag' => Flag::S60 ],
|
||||
'5800!' => [ 'Nokia', '5800 XpressMusic', 'flag' => Flag::S60 ],
|
||||
'6110Navigator' => [ 'Nokia', '6110 Navigator', 'flag' => Flag::S60 ],
|
||||
'6120c!' => [ 'Nokia', '6120 classic', 'flag' => Flag::S60 ],
|
||||
'6121c!' => [ 'Nokia', '6121 classic', 'flag' => Flag::S60 ],
|
||||
'6122c!' => [ 'Nokia', '6124 classic', 'flag' => Flag::S60 ], // The 6122 is known as 6124
|
||||
'6124c' => [ 'Nokia', '6124 classic', 'flag' => Flag::S60 ],
|
||||
'6210 ?Navigator!' => [ 'Nokia', '6210 Navigator', 'flag' => Flag::S60 ],
|
||||
'6220c!' => [ 'Nokia', '6220 classic', 'flag' => Flag::S60 ],
|
||||
'6260' => [ 'Nokia', '6260', 'flag' => Flag::S60 ],
|
||||
'6290!' => [ 'Nokia', '6290', 'flag' => Flag::S60 ],
|
||||
'6600' => [ 'Nokia', '6600', 'flag' => Flag::S60 ],
|
||||
'6630' => [ 'Nokia', '6630', 'flag' => Flag::S60 ],
|
||||
'6650d!' => [ 'Nokia', '6650 fold', 'flag' => Flag::S60 ],
|
||||
'6670' => [ 'Nokia', '6670', 'flag' => Flag::S60 ],
|
||||
'6680' => [ 'Nokia', '6680', 'flag' => Flag::S60 ],
|
||||
'6681' => [ 'Nokia', '6681', 'flag' => Flag::S60 ],
|
||||
'6700s' => [ 'Nokia', '6700 slide', 'flag' => Flag::S60 ],
|
||||
'6700s-1c' => [ 'Nokia', '6700 slide', 'flag' => Flag::S60 ],
|
||||
'6708' => [ 'Nokia', '6708', 'flag' => Flag::UIQ ],
|
||||
'6710s' => [ 'Nokia', '6710 Navigator', 'flag' => Flag::S60 ],
|
||||
'6720c!' => [ 'Nokia', '6720 classic', 'flag' => Flag::S60 ],
|
||||
'6730c!' => [ 'Nokia', '6730 classic', 'flag' => Flag::S60 ],
|
||||
'6760s!' => [ 'Nokia', '6760 slide', 'flag' => Flag::S60 ],
|
||||
'6788' => [ 'Nokia', '6788', 'flag' => Flag::S60 ],
|
||||
'6788i' => [ 'Nokia', '6788i', 'flag' => Flag::S60 ],
|
||||
'6790s-1b!' => [ 'Nokia', '6790 Surge', 'flag' => Flag::S60 ],
|
||||
'6790s-1c!' => [ 'Nokia', '6790 slide', 'flag' => Flag::S60 ],
|
||||
'7610' => [ 'Nokia', '7610', 'flag' => Flag::S60 ],
|
||||
'7650' => [ 'Nokia', '7650', 'flag' => Flag::S60 ],
|
||||
'7660' => [ 'Nokia', '7660', 'flag' => Flag::S60 ],
|
||||
'Oro' => [ 'Nokia', 'Oro', 'flag' => Flag::S60 ],
|
||||
'Panasonic-X700' => [ 'Panasonic', 'X700', 'flag' => Flag::S60 ],
|
||||
'Panasonic-X800' => [ 'Panasonic', 'X800', 'flag' => Flag::S60 ],
|
||||
'I7710' => [ 'Samsung', 'GT-I7710', 'flag' => Flag::S60 ],
|
||||
'I8510' => [ 'Samsung', 'INNOV8', 'flag' => Flag::S60 ],
|
||||
'I8910' => [ 'Samsung', 'Omnia HD', 'flag' => Flag::S60 ],
|
||||
'SGH-D720' => [ 'Samsung', 'D720', 'flag' => Flag::S60 ],
|
||||
'SGH-D728' => [ 'Samsung', 'D728', 'flag' => Flag::S60 ],
|
||||
'SGH-D730' => [ 'Samsung', 'D730', 'flag' => Flag::S60 ],
|
||||
'SGH-i400!' => [ 'Samsung', 'i400', 'flag' => Flag::S60 ],
|
||||
'SGH-i408!' => [ 'Samsung', 'i408', 'flag' => Flag::S60 ],
|
||||
'SGH-i450!' => [ 'Samsung', 'i450', 'flag' => Flag::S60 ],
|
||||
'SGH-i455!' => [ 'Samsung', 'i455', 'flag' => Flag::S60 ],
|
||||
'SGH-i458!' => [ 'Samsung', 'i458', 'flag' => Flag::S60 ],
|
||||
'SGH-i520!' => [ 'Samsung', 'i520', 'flag' => Flag::S60 ],
|
||||
'SGH-i550!' => [ 'Samsung', 'i550', 'flag' => Flag::S60 ],
|
||||
'SGH-i560!' => [ 'Samsung', 'i560', 'flag' => Flag::S60 ],
|
||||
'SGH-i568!' => [ 'Samsung', 'i568', 'flag' => Flag::S60 ],
|
||||
'SGH-i570!' => [ 'Samsung', 'i570', 'flag' => Flag::S60 ],
|
||||
'SGH-G810' => [ 'Samsung', 'G810', 'flag' => Flag::S60 ],
|
||||
'U' => [ 'Sony Ericsson', 'Satio', 'flag' => Flag::S60 ],
|
||||
'(?i)U1(a|i|iv)?$!' => [ 'Sony Ericsson', 'Satio', 'flag' => Flag::S60 ],
|
||||
'(?i)U5(a|i|iv)?$!' => [ 'Sony Ericsson', 'Vivaz', 'flag' => Flag::S60 ],
|
||||
'(?i)U8(a|i)?$!' => [ 'Sony Ericsson', 'Vivaz Pro', 'flag' => Flag::S60 ],
|
||||
'ConstellationT' => [ 'Vertu', 'Constellation T', 'flag' => Flag::S60 ],
|
||||
'ConstellationQuest' => [ 'Vertu', 'Constellation Quest', 'flag' => Flag::S60 ],
|
||||
];
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\DeviceType;
|
||||
|
||||
DeviceModels::$TIZEN_MODELS = [
|
||||
'Baltic' => [ 'Samsung', '"Baltic"' ],
|
||||
'SM-HIGGS' => [ 'Samsung', '"Higgs"' ],
|
||||
'KIRAN' => [ 'Samsung', 'Z1' ],
|
||||
'GT-I8800!' => [ 'Samsung', '"Melius"' ],
|
||||
'GT-I8805!' => [ 'Samsung', '"Redwood"' ],
|
||||
'GT-I9500!' => [ 'Samsung', 'GT-I9500 prototype' ],
|
||||
'SGH-N099' => [ 'Samsung', 'SGH-N099 prototype' ],
|
||||
'(ARMV7 )?SM-Z9005!' => [ 'Samsung', 'SM-Z9005 prototype' ],
|
||||
'Mobile-RD-PQ' => [ 'Samsung', 'RD-PQ prototype' ],
|
||||
'TM1' => [ 'Samsung', 'TM1 prototype' ],
|
||||
'SM-Z130!' => [ 'Samsung', 'Z1' ],
|
||||
'TIZEN SM-Z130!' => [ 'Samsung', 'Z1' ],
|
||||
'SM-Z200!' => [ 'Samsung', 'Z2' ],
|
||||
'SM-Z250!' => [ 'Samsung', '"Pride"' ],
|
||||
'SM-Z300!' => [ 'Samsung', 'Z3' ],
|
||||
'TIZEN SM-Z300!' => [ 'Samsung', 'Z3' ],
|
||||
'SM-Z400!' => [ 'Samsung', 'Z4' ],
|
||||
'SM-Z500!' => [ 'Samsung', 'SM-Z500' ],
|
||||
'SM-Z700!' => [ 'Samsung', 'SM-Z700' ],
|
||||
'SM-Z900!' => [ 'Samsung', 'Z' ],
|
||||
'SM-Z910!' => [ 'Samsung', 'Z' ],
|
||||
'Z3 Z910F' => [ 'Samsung', 'Z' ],
|
||||
'SEC SC-001' => [ 'Samsung', 'SC-001 prototype' ],
|
||||
'SEC SC-03F' => [ 'Samsung', 'ZeQ' ], // Unreleased version for DoCoMo
|
||||
'SC-03F' => [ 'Samsung', 'ZeQ' ], // Unreleased version for DoCoMo
|
||||
|
||||
'SM-G870F0' => [ 'Samsung', 'Galaxy S5 Active' ],
|
||||
|
||||
'SM-R360!' => [ 'Samsung', 'Gear Fit2', DeviceType::WATCH ],
|
||||
'SM-R600!' => [ 'Samsung', 'Gear Sport', DeviceType::WATCH ],
|
||||
'SM-R720!' => [ 'Samsung', 'Gear S2', DeviceType::WATCH ],
|
||||
'SM-R730!' => [ 'Samsung', 'Gear S2', DeviceType::WATCH ],
|
||||
'SM-R732!' => [ 'Samsung', 'Gear S2 Classic', DeviceType::WATCH ],
|
||||
'SM-R735!' => [ 'Samsung', 'Gear S2 Classic', DeviceType::WATCH ],
|
||||
'SM-R750!' => [ 'Samsung', 'Gear S', DeviceType::WATCH ],
|
||||
'SM-R760!' => [ 'Samsung', 'Gear S3', DeviceType::WATCH ],
|
||||
'SM-R765!' => [ 'Samsung', 'Gear S3', DeviceType::WATCH ],
|
||||
'SM-R770!' => [ 'Samsung', 'Gear S3 Classic', DeviceType::WATCH ],
|
||||
'SM-R805!' => [ 'Samsung', 'Gear S4', DeviceType::WATCH ],
|
||||
|
||||
'NX300' => [ 'Samsung', 'NX300', DeviceType::CAMERA ],
|
||||
|
||||
'FamilyHub' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RF10M9995!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RF23M8590!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RF265BEAE!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RF28M9580!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RF56M9540!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RF85K9993!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RF85M95A2!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
'RH81M8090!' => [ 'Samsung', 'Family Hub', DeviceType::APPLIANCE ],
|
||||
|
||||
|
||||
'hawkp' => [ 'Samsung', '"Hawkp"', DeviceType::TELEVISION ],
|
||||
|
||||
'xu3' => [ 'Hardkernel', 'ODROID-XU3 developer board' ],
|
||||
|
||||
'sdk' => [ null, null, DeviceType::EMULATOR ],
|
||||
'Emulator' => [ null, null, DeviceType::EMULATOR ],
|
||||
'Mobile-Emulator' => [ null, null, DeviceType::EMULATOR ],
|
||||
'TIZEN Emulator' => [ null, null, DeviceType::EMULATOR ],
|
||||
];
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
DeviceModels::$TOUCHWIZ_MODELS = [
|
||||
'GT-B5310!' => [ 'Samsung', 'Corby Pro' ],
|
||||
'GT-B3410' => [ 'Samsung', 'Star Qwerty' ],
|
||||
'GT-B7722' => [ 'Samsung', 'Star Duos' ],
|
||||
'GT-C3262' => [ 'Samsung', 'Champ Neo Duos' ],
|
||||
'GT-C33(00|03)!' => [ 'Samsung', 'Champ' ],
|
||||
'GT-C3312R' => [ 'Samsung', 'Rex 60' ],
|
||||
'GT-C3312!' => [ 'Samsung', 'Champ Deluxe Duos' ],
|
||||
'GT-C3330' => [ 'Samsung', 'Champ 2' ],
|
||||
'GT-C6712' => [ 'Samsung', 'Star II Duos' ],
|
||||
'GT-E2652!' => [ 'Samsung', 'Champ Duos' ],
|
||||
'GT-I6230!' => [ 'Samsung', 'Star TV' ],
|
||||
'GT-I6712!' => [ 'Samsung', 'Duos TV' ],
|
||||
'GT-M3710' => [ 'Samsung', 'Corby Beat' ],
|
||||
'GT-M5650' => [ 'Samsung', 'Lindy' ],
|
||||
'GT-S3370!' => [ 'Samsung', 'Corby 3G' ],
|
||||
'GT-S36(50|53)!' => [ 'Samsung', 'Corby' ],
|
||||
'GT-S3770!' => [ 'Samsung', 'Champ 3G' ],
|
||||
'GT-S38(00|02)!' => [ 'Samsung', 'Rex 70' ],
|
||||
'GT-S3850' => [ 'Samsung', 'Corby II' ],
|
||||
'GT-S5220' => [ 'Samsung', 'Star 3' ],
|
||||
'GT-S5222R' => [ 'Samsung', 'Rex 80' ],
|
||||
'GT-S5222' => [ 'Samsung', 'Star 3 Duos' ],
|
||||
'GT-S52(30|33)!' => [ 'Samsung', 'Star' ],
|
||||
'GT-S5260P' => [ 'Samsung', 'Player City' ],
|
||||
'GT-S52(60|63)!' => [ 'Samsung', 'Star II' ],
|
||||
'GT-S5292R' => [ 'Samsung', 'Rex 90' ],
|
||||
'GT-S5292' => [ 'Samsung', 'Star Deluxe Duos' ],
|
||||
'GT-S5560!' => [ 'Samsung', 'Marvel' ],
|
||||
'GT-S5600' => [ 'Samsung', 'Preston' ],
|
||||
'GT-S5603' => [ 'Samsung', 'Star 3G' ],
|
||||
'GT-S5620!' => [ 'Samsung', 'Monte' ],
|
||||
'GT-S5680' => [ 'Samsung', 'GT-S5680' ],
|
||||
'GT-S7550' => [ 'Samsung', 'Blue Earth' ],
|
||||
'S80(00|03)!' => [ 'Samsung', 'Jet' ],
|
||||
'GT-S8000c' => [ 'Samsung', 'Jet' ],
|
||||
'GT-S8003' => [ 'Samsung', 'Jet' ],
|
||||
'SGH-A597' => [ 'Samsung', 'Eternity II' ],
|
||||
'SGH-F480' => [ 'Samsung', 'Tocco' ],
|
||||
'SGH-F480I' => [ 'Samsung', 'Tocco' ],
|
||||
'SGH-T528g' => [ 'Samsung', 'Straight Talk' ]
|
||||
];
|
||||
Executable
+323
@@ -0,0 +1,323 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\DeviceType;
|
||||
|
||||
DeviceModels::$WM_MODELS = [
|
||||
'DX900' => [ 'Acer', 'Tempo DX900' ],
|
||||
'E100' => [ 'Acer', 'beTouch E100' ],
|
||||
'F900' => [ 'Acer', 'Tempo F900' ],
|
||||
'S200' => [ 'Acer', 'neoTouch S200' ],
|
||||
'P400' => [ 'Acer', 'neoTouch P400' ],
|
||||
'-GalaxyII' => [ 'Asus', 'Galaxy II' ],
|
||||
'-GalaxyMini' => [ 'Asus', 'Galaxy Mini' ],
|
||||
'M530w!' => [ 'Asus', 'M530w' ],
|
||||
'M930!' => [ 'Asus', 'M930' ],
|
||||
'-P525!' => [ 'Asus', 'P525' ],
|
||||
'-P526!' => [ 'Asus', 'P526' ],
|
||||
'-P527!' => [ 'Asus', 'P527' ],
|
||||
'P550' => [ 'Asus', 'P550' ],
|
||||
'-P552w!' => [ 'Asus', 'P552w' ],
|
||||
'-P552!' => [ 'Asus', 'P552' ],
|
||||
'-P565!' => [ 'Asus', 'P565' ],
|
||||
'-P735!' => [ 'Asus', 'P735' ],
|
||||
'P750' => [ 'Asus', 'P750' ],
|
||||
'Bird T900' => [ 'Bird', 'T900' ],
|
||||
'Coolpad F800' => [ 'Coolpad', 'F800' ],
|
||||
'Datalogic Memor' => [ 'Datalogic', 'Memor' ],
|
||||
'Dopod838Pro' => [ 'Dopod', '838 Pro' ],
|
||||
'CHT 9100!' => [ 'Dopod', 'CHT 9100' ],
|
||||
'DopodD810' => [ 'Dopod', 'D810' ],
|
||||
'dopod-S900c' => [ 'Dopod', 'S900' ],
|
||||
'T5388' => [ 'Dopod', 'T5388' ],
|
||||
'dopodT5588' => [ 'Dopod', 'T5588' ],
|
||||
'dopodT8388' => [ 'Dopod', 'T8388' ],
|
||||
'dopodT8588' => [ 'Dopod', 'T8588' ],
|
||||
'garmin-asus-Nuvifone-M10' => [ 'Garmin-Asus', 'Nuvifone M10' ],
|
||||
'Nuvifone-M10' => [ 'Garmin-Asus', 'Nuvifone M10' ],
|
||||
'Nuvifone-M20' => [ 'Garmin-Asus', 'Nuvifone M20' ],
|
||||
'GIGABYTE-MS800' => [ 'Gigabyte', 'GSmart MS800' ],
|
||||
'HP iPAQ 510' => [ 'HP', 'iPAQ 510' ],
|
||||
'HPiPAQ510!' => [ 'HP', 'iPAQ 510' ],
|
||||
'HPiPAQ610' => [ 'HP', 'iPAQ 610' ],
|
||||
'HPiPAQ910!' => [ 'HP', 'iPAQ 910' ],
|
||||
'HP iPAQ h6300' => [ 'HP', 'iPAQ h6300' ],
|
||||
'HP iPAQ hw6500!' => [ 'HP', 'iPAQ hw6500' ],
|
||||
'HPiPAQhw6900!' => [ 'HP', 'iPAQ hw6900' ],
|
||||
'HPiPAQrw6800!' => [ 'HP', 'iPAQ rw6800' ],
|
||||
'HPiPAQrw6815!' => [ 'HP', 'iPAQ rw6815' ],
|
||||
'HPiPAQDataMessenger!' => [ 'HP', 'iPAQ Data Messenger' ],
|
||||
'HPiPAQVoiceMessenger!' => [ 'HP', 'iPAQ Voice Messenger' ],
|
||||
'HPiPAQGlisten' => [ 'HP', 'iPAQ Glisten' ],
|
||||
'HP KB1' => [ 'HP', 'iPAQ Glisten' ],
|
||||
'HTC8500' => [ 'HTC', '8500' ],
|
||||
'HTC P3300' => [ 'HTC', 'P3300' ],
|
||||
'HTC love' => [ 'HTC', 'P3350' ],
|
||||
'HTC P3350' => [ 'HTC', 'P3350' ],
|
||||
'HTC P3400!' => [ 'HTC', 'P3400' ],
|
||||
'HTC P3450!' => [ 'HTC', 'P3450' ],
|
||||
'P4350!' => [ 'HTC', 'P3450' ],
|
||||
'HTC HERALD' => [ 'HTC', 'P3450' ],
|
||||
'HTC P6300' => [ 'HTC', 'P6300' ],
|
||||
'HTC P6500' => [ 'HTC', 'P6500' ],
|
||||
'HTC X7500' => [ 'HTC', 'Advantage' ],
|
||||
'HTC X7510' => [ 'HTC', 'Advantage' ],
|
||||
'(HTC )?HD mini!' => [ 'HTC', 'HD mini' ],
|
||||
'.*T5555!' => [ 'HTC', 'HD mini' ],
|
||||
'(HTC )?HD2!' => [ 'HTC', 'HD2' ],
|
||||
'.*T8585!' => [ 'HTC', 'HD2' ],
|
||||
'HTC T8290' => [ 'HTC', 'MAX 4G' ],
|
||||
'HTC MAX 4G' => [ 'HTC', 'MAX 4G' ],
|
||||
'HTC MTeoR' => [ 'HTC', 'MTeoR' ],
|
||||
'P3470!' => [ 'HTC', 'Pharos' ],
|
||||
'HTC Prophet' => [ 'HTC', 'Prophet' ],
|
||||
'HTC Snap!' => [ 'HTC', 'S511 Snap' ],
|
||||
'.*S521!' => [ 'HTC', 'S511 Snap' ],
|
||||
'HTC Maple S520' => [ 'HTC', 'S520 Maple' ],
|
||||
'HTC S620!' => [ 'HTC', 'S620 Excalibur' ],
|
||||
'HTC Excalibur' => [ 'HTC', 'S620 Excalibur' ],
|
||||
'HTC S630' => [ 'HTC', 'S630 Cavelier' ],
|
||||
'HTC S710' => [ 'HTC', 'S710 Vox' ],
|
||||
'HTC S730' => [ 'HTC', 'S730 Wings' ],
|
||||
'HTC S740' => [ 'HTC', 'S740 Rose' ],
|
||||
'HTC Touch' => [ 'HTC', 'Touch' ],
|
||||
'HTC Elf' => [ 'HTC', 'Touch' ],
|
||||
'HTC 6900' => [ 'HTC', 'Touch' ],
|
||||
'HTC6900' => [ 'HTC', 'Touch' ],
|
||||
'HTC6900-MR1' => [ 'HTC', 'Touch' ],
|
||||
'P3450' => [ 'HTC', 'Touch' ],
|
||||
'HTC TouchDual' => [ 'HTC', 'Touch' ],
|
||||
'HTC Touch 3G!' => [ 'HTC', 'Touch 3G' ],
|
||||
'HTC Jade' => [ 'HTC', 'Touch 3G' ],
|
||||
'HTC Mega!' => [ 'HTC', 'Touch 2' ],
|
||||
'HTC Touch2!' => [ 'HTC', 'Touch 2' ],
|
||||
'.*T33(20|33|35)!' => [ 'HTC', 'Touch 2' ],
|
||||
'P3650' => [ 'HTC', 'Touch Cruise' ],
|
||||
'P3650t' => [ 'HTC', 'Touch Cruise' ],
|
||||
'HTC Touch Cruise!' => [ 'HTC', 'Touch Cruise' ],
|
||||
'HTC P3650' => [ 'HTC', 'Touch Cruise' ],
|
||||
'HTC P3651' => [ 'HTC', 'Touch Cruise' ],
|
||||
'HTC Polaris' => [ 'HTC', 'Touch Cruise' ],
|
||||
'HTC Touch Diamond2!' => [ 'HTC', 'Touch Diamond 2' ],
|
||||
'.*T5353!' => [ 'HTC', 'Touch Diamond 2' ],
|
||||
'HTC Touch Diamond!' => [ 'HTC', 'Touch Diamond' ],
|
||||
'.*P3700!' => [ 'HTC', 'Touch Diamond' ],
|
||||
'HTC Diamond' => [ 'HTC', 'Touch Diamond' ],
|
||||
'HTC P3701' => [ 'HTC', 'Touch Diamond' ],
|
||||
'HTC P5500' => [ 'HTC', 'Touch Dual' ],
|
||||
'HTC P5310!' => [ 'HTC', 'Touch Dual' ],
|
||||
'HTC Touch HD2!' => [ 'HTC', 'Touch HD2' ],
|
||||
'.*T8585!' => [ 'HTC', 'Touch HD2' ],
|
||||
'HTC Touch HD!' => [ 'HTC', 'Touch HD' ],
|
||||
'.*T82(82|83)!' => [ 'HTC', 'Touch HD' ],
|
||||
'HTC Touch Pro2!' => [ 'HTC', 'Touch Pro 2' ],
|
||||
'.*T73(73|80)!' => [ 'HTC', 'Touch Pro 2' ],
|
||||
'HTC Touch Pro!' => [ 'HTC', 'Touch Pro' ],
|
||||
'.*T7272!' => [ 'HTC', 'Touch Pro' ],
|
||||
'HTC P4600' => [ 'HTC', 'Touch Pro' ],
|
||||
'HTC Raphael' => [ 'HTC', 'Touch Pro' ],
|
||||
'HTC Touch Viva!' => [ 'HTC', 'Touch Viva' ],
|
||||
'.*T2223!' => [ 'HTC', 'Touch Viva' ],
|
||||
'P3600!' => [ 'HTC', 'Trinity' ],
|
||||
'HTC Trinity' => [ 'HTC', 'Trinity' ],
|
||||
'HTC P3600' => [ 'HTC', 'Trinity' ],
|
||||
'HTC P3600i' => [ 'HTC', 'Trinity' ],
|
||||
'HTC v3600' => [ 'HTC', 'Trinity' ],
|
||||
'HTC TyTN II' => [ 'HTC', 'TyTN II' ],
|
||||
'P4550' => [ 'HTC', 'TyTN II' ],
|
||||
'HTC Kaiser' => [ 'HTC', 'TyTN II' ],
|
||||
'HTC TyTN!' => [ 'HTC', 'TyTN' ],
|
||||
'HTC Mercury' => [ 'HTC', 'TyTN' ],
|
||||
'T9188' => [ 'HTC', 'T9188' ],
|
||||
'T9199' => [ 'HTC', 'T9199' ],
|
||||
'HTC wizard' => [ 'HTC', 'Wizard' ],
|
||||
'i-mate JAMA' => [ 'i-mate', 'JAMA' ],
|
||||
'i-mate JAMAQ' => [ 'i-mate', 'JAMAQ' ],
|
||||
'i-mate JAMin' => [ 'i-mate', 'JAMin' ],
|
||||
'i-mate JASJAM' => [ 'i-mate', 'JASJAM' ],
|
||||
'i-mate JAQ' => [ 'i-mate', 'JAQ' ],
|
||||
'i-mate JAQ3' => [ 'i-mate', 'JAQ3' ],
|
||||
'i-mate K-JAM' => [ 'i-mate', 'K-JAM' ],
|
||||
'i-mate PDAL' => [ 'i-mate', 'PDAL' ],
|
||||
'i-mate 6150' => [ 'i-mate', 'Ultimate 6150' ],
|
||||
'i-mate 8150!' => [ 'i-mate', 'Ultimate 8150' ],
|
||||
'i-mate 8502' => [ 'i-mate', 'Ultimate 8502' ],
|
||||
'i-mate 9502!' => [ 'i-mate', 'Ultimate 9502' ],
|
||||
'W366' => [ 'K-Touch', 'W366' ],
|
||||
'K-Touch W366!' => [ 'K-Touch', 'W366' ],
|
||||
'Kyocera-E4000' => [ 'Kyocera', 'Solo E4000' ],
|
||||
'Lenovo ET860' => [ 'Lenovo', 'ET860' ],
|
||||
'LENOVO-ET980' => [ 'Lenovo', 'ET980' ],
|
||||
'LG-GM730!' => [ 'LG', 'Eigen GM730' ],
|
||||
'GM730' => [ 'LG', 'Eigen GM730' ],
|
||||
'LG-GM750!' => [ 'LG', 'Layla GM750' ],
|
||||
'GM750Q' => [ 'LG', 'Layla GM750' ],
|
||||
'LG-GW550!' => [ 'LG', 'GW550' ],
|
||||
'GW550' => [ 'LG', 'GW550' ],
|
||||
'GW825' => [ 'LG', 'IQ GW825' ],
|
||||
'LG-KS20' => [ 'LG', 'KS20' ],
|
||||
'LG-MS25' => [ 'LG', 'MS25' ],
|
||||
'LGE VS750' => [ 'LG', 'Fathom VS750' ],
|
||||
'A3100' => [ 'Motorola', 'A3100' ],
|
||||
'A3300c' => [ 'Motorola', 'A3300c' ],
|
||||
'A4500!' => [ 'Motorola', 'A4500' ],
|
||||
'ES405B!' => [ 'Motorola', 'ES405 Enterprise Smartphone' ],
|
||||
'MC45!' => [ 'Motorola', 'MC45 Mobile Computer' ],
|
||||
'MC659B!' => [ 'Motorola', 'MC65 Wireless Rugged Mobile Computer' ],
|
||||
'Q-UMTS' => [ 'Motorola', 'Q' ],
|
||||
'Q8' => [ 'Motorola', 'MOTO Q8' ],
|
||||
'Q9' => [ 'Motorola', 'MOTO Q9' ],
|
||||
'Sprint:MotoQ9c' => [ 'Motorola', 'MOTO Q9c' ],
|
||||
'Q9c!' => [ 'Motorola', 'MOTO Q9c' ],
|
||||
'Q9m!' => [ 'Motorola', 'MOTO Q9m' ],
|
||||
'VIP12!' => [ 'Motorola', 'VIP 1200', DeviceType::TELEVISION ],
|
||||
'H-21' => [ 'Opticom', 'H-21' ],
|
||||
'Palm500!' => [ 'Palm', 'Treo 500v' ],
|
||||
'Palm750' => [ 'Palm', 'Treo 750' ],
|
||||
'Treo800w' => [ 'Palm', 'Treo 800w' ],
|
||||
'Palm850!' => [ 'Palm', 'Treo Pro' ],
|
||||
'Palm Treo850e' => [ 'Palm', 'Treo Pro' ],
|
||||
'Sprint Treo850e' => [ 'Palm', 'Treo Pro' ],
|
||||
'PANTECH-C810' => [ 'Pantech', 'Duo C810' ],
|
||||
'GT-B5722' => [ 'Samsung', 'B5722' ],
|
||||
'GT-B6520' => [ 'Samsung', 'B6520 OmniaPRO 5' ],
|
||||
'GT-B7300' => [ 'Samsung', 'B7300 OmniaLITE' ],
|
||||
'GT-B7320!' => [ 'Samsung', 'B7320 OmniaPRO' ],
|
||||
'GT-B7330!' => [ 'Samsung', 'B7330 OmniaPRO' ],
|
||||
'GT-B7350' => [ 'Samsung', 'B7350 OmniaPRO 4' ],
|
||||
'GT-B7610' => [ 'Samsung', 'B7610 OmniaPRO' ],
|
||||
'GT-C6625' => [ 'Samsung', 'C6625 Valencia' ],
|
||||
'C6625' => [ 'Samsung', 'C6625 Valencia' ],
|
||||
'GT-I8000!' => [ 'Samsung', 'I8000 Omnia II' ],
|
||||
'SCH-M490' => [ 'Samsung', 'M490 T*OMNIA' ],
|
||||
'SCH-M710' => [ 'Samsung', 'M710 T*OMNIA II' ],
|
||||
'SCH-M715' => [ 'Samsung', 'M715 T*OMNIA II' ],
|
||||
'SPH-M7200' => [ 'Samsung', 'M7200 OMNIA POP' ],
|
||||
'SPH-M7350' => [ 'Samsung', 'M7350 OZ OMNIA' ],
|
||||
'SPH-M8400' => [ 'Samsung', 'M8400 Show OMNIA' ],
|
||||
'SCH-i220!' => [ 'Samsung', 'i220 Code' ],
|
||||
'SCH-i225!' => [ 'Samsung', 'i225 Exec' ],
|
||||
'SPHI325!' => [ 'Samsung', 'i325 Ace' ],
|
||||
'SGH-i600!' => [ 'Samsung', 'i600' ],
|
||||
'SGH-i601!' => [ 'Samsung', 'i601' ],
|
||||
'SGH-I607' => [ 'Samsung', 'i607 BlackJack' ],
|
||||
'SGH-i608!' => [ 'Samsung', 'i608' ],
|
||||
'SGH-I617' => [ 'Samsung', 'i617 BlackJack II' ],
|
||||
'SGH-I637' => [ 'Samsung', 'i637 Jack' ],
|
||||
'SGH-i640!' => [ 'Samsung', 'i640' ],
|
||||
'SGH-i718' => [ 'Samsung', 'i718' ],
|
||||
'SGH-i718plus' => [ 'Samsung', 'i718 Plus' ],
|
||||
'SGH-i728' => [ 'Samsung', 'i728' ],
|
||||
'SCH-i760!' => [ 'Samsung', 'i760' ],
|
||||
'SCH-i770!' => [ 'Samsung', 'i770 Saga' ],
|
||||
'SGH-i780!' => [ 'Samsung', 'i780 Mirage' ],
|
||||
'SGH-i900!' => [ 'Samsung', 'i900 Omnia' ],
|
||||
'SGH-i908E' => [ 'Samsung', 'i908' ],
|
||||
'SCHI910!' => [ 'Samsung', 'i910 Omnia' ],
|
||||
'SCH-i920' => [ 'Samsung', 'i920 Omnia II' ],
|
||||
'SIE-SX66' => [ 'Siemens', 'SX66' ],
|
||||
'M1i' => [ 'Sony Ericsson', 'Aspen' ],
|
||||
'X1' => [ 'Sony Ericsson', 'Xperia X1' ],
|
||||
'X1[ia]!' => [ 'Sony Ericsson', 'Xperia X1' ],
|
||||
'X2' => [ 'Sony Ericsson', 'Xperia X2' ],
|
||||
'X2[ia]!' => [ 'Sony Ericsson', 'Xperia X2' ],
|
||||
'Spice D1100' => [ 'Spice', 'D1100' ],
|
||||
'(Toshiba[- ])?TG01!' => [ 'Toshiba', 'TG01' ],
|
||||
'Velocity' => [ 'Velocity', '111' ],
|
||||
'ZTE E N72' => [ 'ZTE', 'E N72' ],
|
||||
'ZTE E X70' => [ 'ZTE', 'E X70' ],
|
||||
|
||||
|
||||
|
||||
'sigmarion3' => [ 'NTT', 'sigmarionIII' ],
|
||||
|
||||
'o2 Xda comet' => [ 'O2', 'XDA Comet' ],
|
||||
'Xda diamond' => [ 'O2', 'XDA Diamond' ],
|
||||
'Xda neo' => [ 'O2', 'XDA Neo' ],
|
||||
'Xda nova' => [ 'O2', 'XDA Nova' ],
|
||||
'Xda orbit' => [ 'O2', 'XDA Orbit' ],
|
||||
'Xda terra' => [ 'O2', 'XDA Terra' ],
|
||||
'Xda trion' => [ 'O2', 'XDA Trion' ],
|
||||
'O2 Xda 2mini' => [ 'O2', 'XDA II mini' ],
|
||||
'O2 Xda 2s' => [ 'O2', 'XDA IIs' ],
|
||||
|
||||
'SPV E600' => [ 'Orange', 'SPV E600' ],
|
||||
'SPV E650' => [ 'Orange', 'SPV E650' ],
|
||||
'SPV M700' => [ 'Orange', 'SPV M700' ],
|
||||
'SPV M2000' => [ 'Orange', 'SPV M2000' ],
|
||||
'SPV M3100' => [ 'Orange', 'SPV M3100' ],
|
||||
|
||||
'Alltel HTC PPC6800' => [ 'Alltel', 'PPC6800' ],
|
||||
'Alltel HTC Touch' => [ 'HTC', 'Touch', 'carrier' => 'Alltel' ],
|
||||
'Alltel HTC Touch Diamond' => [ 'HTC', 'Touch Diamond', 'carrier' => 'Alltel' ],
|
||||
|
||||
'Sprint S511' => [ 'Sprint', 'Snap' ],
|
||||
'Sprint:SPH-ip830w' => [ 'Sprint', 'SPH-ip830w' ],
|
||||
'Sprint:PPC6600-1' => [ 'Sprint', 'PPC6600' ],
|
||||
'Sprint:PPC-6700' => [ 'Sprint', 'PPC6700' ],
|
||||
'Sprint:PPC6800' => [ 'Sprint', 'PPC6800' ],
|
||||
'Sprint PPC6850SP' => [ 'Sprint', 'PPC6850' ],
|
||||
'HTCPPC6850!' => [ 'Sprint', 'PPC6850' ],
|
||||
'PPC6850!' => [ 'Sprint', 'PPC6850' ],
|
||||
'Sprint MP6850SP' => [ 'Sprint', 'MP6850' ],
|
||||
'Sprint MP6900SP' => [ 'Sprint', 'MP6900' ],
|
||||
'Sprint MP6950SP' => [ 'Sprint', 'MP6950' ],
|
||||
|
||||
'Ameo!' => [ 'T-Mobile', 'Ameo' ],
|
||||
'T-Mobile Atlas' => [ 'T-Mobile', 'Atlas' ],
|
||||
'T-Mobile Dash' => [ 'T-Mobile', 'Dash' ],
|
||||
'T-Mobile LEO' => [ 'T-Mobile', 'Leo' ],
|
||||
'T-Mobile Cleopatra' => [ 'T-Mobile', 'Shadow II' ],
|
||||
'MDA III!' => [ 'T-Mobile', 'MDA III' ],
|
||||
'MDA compact II!' => [ 'T-Mobile', 'MDA Compact II' ],
|
||||
'MDA compact!' => [ 'T-Mobile', 'MDA Compact' ],
|
||||
'MDA Pro!' => [ 'T-Mobile', 'MDA Pro' ],
|
||||
'MDA Touch!' => [ 'T-Mobile', 'MDA Touch' ],
|
||||
'MDA Vario!' => [ 'T-Mobile', 'MDA Vario' ],
|
||||
|
||||
'XV6175!' => [ 'Verizon', 'Ozone XV6175' ],
|
||||
'XV6850!' => [ 'Verizon', 'Touch Pro XV6850' ],
|
||||
'XV6875!' => [ 'Verizon', 'Touch Pro2 XV6875' ],
|
||||
'XV6900' => [ 'Verizon', 'Touch XV6900' ],
|
||||
'XV6975' => [ 'Verizon', 'Imagio XV6975' ],
|
||||
|
||||
'SFR v3650!' => [ 'Vodafone', 'Polaris' ],
|
||||
'v1415' => [ 'Vodafone', 'Vox' ],
|
||||
'v1240' => [ 'Vodafone', 'VDA II' ],
|
||||
'1210' => [ 'Vodafone', 'VDA IV' ],
|
||||
'v1210' => [ 'Vodafone', 'VDA IV' ],
|
||||
'HTC VDA V' => [ 'Vodafone', 'VDA V' ],
|
||||
'v1640' => [ 'Vodafone', 'VPA IV' ],
|
||||
'VPA Touch' => [ 'Vodafone', 'VPA Touch' ],
|
||||
'HTC v1510' => [ 'Vodafone', 'VPA Compact GPS' ],
|
||||
'HTC VPACompactIV' => [ 'Vodafone', 'VPA Compact IV' ],
|
||||
|
||||
|
||||
|
||||
'WS003SH' => [ 'Sharp', 'W-ZERO3 WS003SH', 'carrier' => 'Willcom' ],
|
||||
'WS004SH' => [ 'Sharp', 'W-ZERO3 WS004SH', 'carrier' => 'Willcom' ],
|
||||
'WS007SH' => [ 'Sharp', 'W-ZERO3 [es] WS007SH', 'carrier' => 'Willcom' ],
|
||||
'WS011SH' => [ 'Sharp', 'Advanced / W-ZERO3 [es] WS011SH', 'carrier' => 'Willcom' ],
|
||||
'WS020SH' => [ 'Sharp', 'WILLCOM 03 WS020SH', 'carrier' => 'Willcom' ],
|
||||
'WS027SH' => [ 'Sharp', 'HYBRID W-ZERO3 WS027SH', 'carrier' => 'Willcom' ],
|
||||
'S01SH' => [ 'Sharp', 'EM·ONE S01SH', 'carrier' => 'EMOBILE' ],
|
||||
'S01SH2' => [ 'Sharp', 'EM·ONE alpha S01SH2', 'carrier' => 'EMOBILE' ],
|
||||
'T-01A!' => [ 'Toshiba', 'T-01A', 'carrier' => 'DoCoMo' ],
|
||||
'T-01B!' => [ 'Toshiba', 'dynapocket T-01B', 'carrier' => 'DoCoMo' ],
|
||||
'X01T' => [ 'Toshiba', 'G900 X01T', 'carrier' => 'Softbank' ],
|
||||
'X02T!' => [ 'Toshiba', 'dynapocket X02T', 'carrier' => 'Softbank' ],
|
||||
'KDDI-HT01' => [ 'HTC', 'TOUCH PRO HT-01A', 'carrier' => 'au' ],
|
||||
'HT01A' => [ 'HTC', 'TOUCH PRO HT-01A', 'carrier' => 'au' ],
|
||||
'S11HT' => [ 'HTC', 'EMONSTER S11HT', 'carrier' => 'EMOBILE' ],
|
||||
'S12HT' => [ 'HTC', 'EMONSTER lite S12HT', 'carrier' => 'EMOBILE' ],
|
||||
'S21HT' => [ 'HTC', 'Touch Diamond S21HT', 'carrier' => 'EMOBILE' ],
|
||||
'S22HT' => [ 'HTC', 'Dual Diamond S22HT', 'carrier' => 'EMOBILE' ],
|
||||
'X01HT' => [ 'HTC', 'TyTN X01HT', 'carrier' => 'Softbank' ],
|
||||
'X02HT' => [ 'HTC', 'S630 X02HT', 'carrier' => 'Softbank' ],
|
||||
'X03HT' => [ 'HTC', 'S730 X03HT', 'carrier' => 'Softbank' ],
|
||||
'X04HT' => [ 'HTC', 'TOUCH DIAMOND X04HT', 'carrier' => 'Softbank' ],
|
||||
'X05HT' => [ 'HTC', 'TOUCH PRO X05HT', 'carrier' => 'Softbank' ],
|
||||
'SC-01B' => [ 'Samsung', 'SC-01B', 'carrier' => 'DoCoMo' ],
|
||||
'X01SC' => [ 'Samsung', 'OMNIA Pro X01SC', 'carrier' => 'Softbank' ],
|
||||
];
|
||||
Executable
+333
@@ -0,0 +1,333 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
use WhichBrowser\Constants\DeviceType;
|
||||
|
||||
DeviceModels::$WP_MODELS = [
|
||||
'Allegro' => [ 'Acer', 'Allegro' ],
|
||||
'M310' => [ 'Acer', 'Allegro' ],
|
||||
'S58' => [ 'Acer', 'Jade Primo' ],
|
||||
'M220!' => [ 'Acer', 'Liquid' ],
|
||||
'FierceXL' => [ 'Alcatel', 'One Touch Fierce XL' ],
|
||||
'ONE TOUCH 5040X' => [ 'Alcatel', 'One Touch View' ],
|
||||
'IDOL 4 PRO' => [ 'Alcatel', 'Idol 4 Pro' ],
|
||||
'IDOL 4S with Windows 10' => [ 'Alcatel', 'Idol 4S' ],
|
||||
'Impera I' => [ 'Allview', 'Impera i' ],
|
||||
'Impera M' => [ 'Allview', 'Impera M' ],
|
||||
'Impera S' => [ 'Allview', 'Impera S' ],
|
||||
'W1i' => [ 'Allview', 'W1i' ],
|
||||
'40 Cesium' => [ 'Archos', '40 Cesium' ],
|
||||
'AC50CE' => [ 'Archos', '50 Cesium' ],
|
||||
'- BUSH Windows Phone' => [ 'Argos', 'BUSH Windows Phone' ],
|
||||
'Galaxy6' => [ 'Asus', 'Galaxy 6' ],
|
||||
'E600' => [ 'Asus', 'E600' ],
|
||||
'WIN HD LTE' => [ 'BLU', 'Win HD' ],
|
||||
'WIN HD W510l' => [ 'BLU', 'Win HD' ],
|
||||
'WIN HD W510u' => [ 'BLU', 'Win HD' ],
|
||||
'WIN JR LTE' => [ 'BLU', 'Win JR' ],
|
||||
'WIN JR W410a' => [ 'BLU', 'Win JR' ],
|
||||
'WIN JR W410i' => [ 'BLU', 'Win JR' ],
|
||||
'WIN JR W410l' => [ 'BLU', 'Win JR' ],
|
||||
'WIN JR W410u' => [ 'BLU', 'Win JR' ],
|
||||
'BP30.BM180' => [ 'Bluebird', 'Pidion' ],
|
||||
'WIN 400' => [ 'Celkon', 'Win 400' ],
|
||||
'Alpha Neon' => [ 'Cherry Mobile', 'Alpha Neon' ],
|
||||
'ALPHA PRIME 5' => [ 'Cherry Mobile', 'Alpha Prime 5' ],
|
||||
'MOBILE Alpha Luxe' => [ 'Cherry Mobile', 'Alpha Luxe' ],
|
||||
'CHERRY-MOBILE Alpha Luxe' => [ 'Cherry Mobile', 'Alpha Luxe' ],
|
||||
'MOBILE Alpha Style' => [ 'Cherry Mobile', 'Alpha Style' ],
|
||||
'MOBILE Alpha View' => [ 'Cherry Mobile', 'Alpha View' ],
|
||||
'PKT-407' => [ 'Condor', 'Griffe W1' ],
|
||||
'T698' => [ 'Cube', 'WP10', DeviceType::TABLET ],
|
||||
'Venue Pro' => [ 'Dell', 'Venue Pro' ],
|
||||
'Ixion W 5' => [ 'DEXP', 'Ixion W 5' ],
|
||||
'IQ400W' => [ 'Fly', 'IQ400W Era Windows' ],
|
||||
'IQ500W' => [ 'Fly', 'IQ500W Evo Windows' ],
|
||||
'FTJ152E' => [ 'Freetel', 'KATANA 01' ],
|
||||
'FTJ152F' => [ 'Freetel', 'KATANA 02' ],
|
||||
'IS12T' => [ 'Fujitsu Toshiba', 'IS12T' ],
|
||||
'W10' => [ 'GoMobile', 'W10' ],
|
||||
'WINJOY' => [ 'Highscreen', 'WinJoy' ],
|
||||
'WinWin' => [ 'Highscreen', 'WinWin' ],
|
||||
'E260T+' => [ 'Hisense', 'NANA' ],
|
||||
'SG 7' => [ 'HIWIKI', 'SG 7' ],
|
||||
'DolphinCT50' => [ 'Honeywell', 'Dolphin CT50' ],
|
||||
'75eL0N' => [ 'Honeywell', 'Dolphin 75e' ],
|
||||
'HELSINKI' => [ 'Honeywell', '"Helsinki"' ],
|
||||
'HD2' => [ 'HTC', 'HD2' ],
|
||||
';HD2' => [ 'HTC', 'HD2' ],
|
||||
'LEO' => [ 'HTC', 'HD2' ],
|
||||
'HD2(Leo' => [ 'HTC', 'HD2' ],
|
||||
'HD2 LEO' => [ 'HTC', 'HD2' ],
|
||||
'HTC HD2' => [ 'HTC', 'HD2' ],
|
||||
'(HD7|.*T92(92|95|96))!' => [ 'HTC', 'HD7' ],
|
||||
'Schubert!' => [ 'HTC', 'HD7' ],
|
||||
'Mondrian' => [ 'HTC', 'HD7' ],
|
||||
'Gold' => [ 'HTC', 'HD7' ],
|
||||
'Touch-IT HD7' => [ 'HTC', 'HD7' ],
|
||||
'((7 )?Mozart|.*T86(97|98))!' => [ 'HTC', '7 Mozart' ],
|
||||
'PD67100' => [ 'HTC', '7 Mozart' ],
|
||||
';PD67100' => [ 'HTC', '7 Mozart' ],
|
||||
'HTC Mozart' => [ 'HTC', '7 Mozart' ],
|
||||
'7 HTC MOZART' => [ 'HTC', '7 Mozart' ],
|
||||
'PC93100' => [ 'HTC', '7 Pro' ],
|
||||
'MWP6885' => [ 'HTC', '7 Pro' ],
|
||||
'(7 Pro|.*T75(75|76))!' => [ 'HTC', '7 Pro' ],
|
||||
'USCCHTC-PC93100' => [ 'HTC', '7 Pro' ],
|
||||
'Surround' => [ 'HTC', '7 Surround' ],
|
||||
'7 Surround' => [ 'HTC', '7 Surround' ],
|
||||
'.*T8788!' => [ 'HTC', '7 Surround' ],
|
||||
'((7 )?Trophy|.*T8686)!' => [ 'HTC', '7 Trophy' ],
|
||||
'mwp6985' => [ 'HTC', '7 Trophy' ],
|
||||
'htc mpw6958' => [ 'HTC', '7 Trophy' ],
|
||||
'htcmpw6958' => [ 'HTC', '7 Trophy' ],
|
||||
'PC40100' => [ 'HTC', '7 Trophy' ],
|
||||
'PC40200' => [ 'HTC', '7 Trophy' ],
|
||||
'Touch-IT Trophy' => [ 'HTC', '7 Trophy' ],
|
||||
'Spark' => [ 'HTC', '7 Trophy' ],
|
||||
'HTC 7 Trophy' => [ 'HTC', '7 Trophy' ],
|
||||
'HTC Trophy' => [ 'HTC', '7 Trophy' ],
|
||||
'(Radar|.*C110e)!' => [ 'HTC', 'Radar' ],
|
||||
'Omega' => [ 'HTC', 'Radar' ],
|
||||
'Mazaa' => [ 'HTC', 'Mazaa' ], // Never released
|
||||
'Titan' => [ 'HTC', 'Titan' ],
|
||||
'.*X310e!' => [ 'HTC', 'Titan' ],
|
||||
'PI39100' => [ 'HTC', 'Titan' ],
|
||||
'Eternity' => [ 'HTC', 'Titan' ],
|
||||
'Ultimate' => [ 'HTC', 'Titan' ],
|
||||
'PI86100' => [ 'HTC', 'Titan II' ],
|
||||
'8X' => [ 'HTC', '8X' ],
|
||||
'HTC6690LVW' => [ 'HTC', '8X' ],
|
||||
'HTC6990LVW' => [ 'HTC', '8X' ],
|
||||
'HTC6990LVW 4G' => [ 'HTC', '8X' ],
|
||||
'6990LVW' => [ 'HTC', '8X' ],
|
||||
'RIO U' => [ 'HTC', '8X' ],
|
||||
'ACD U' => [ 'HTC', '8X' ],
|
||||
'Accord' => [ 'HTC', '8X' ],
|
||||
'C620(d|e|t)!' => [ 'HTC', '8X' ],
|
||||
'C625(a|b)!' => [ 'HTC', '8X' ],
|
||||
'8X by HTC' => [ 'HTC', '8X' ],
|
||||
'Windows Phone 8X by HTC!' => [ 'HTC', '8X' ],
|
||||
'WindowsPhone8Xby' => [ 'HTC', '8X' ],
|
||||
'PM23300' => [ 'HTC', '8X' ],
|
||||
'htc 8x' => [ 'HTC', '8X' ],
|
||||
'A620(b|d|e|m|t)!' => [ 'HTC', '8S' ],
|
||||
'8S' => [ 'HTC', '8S' ],
|
||||
'8S by HTC' => [ 'HTC', '8S' ],
|
||||
'Windows Phone 8S by HTC!' => [ 'HTC', '8S' ],
|
||||
'WindowsPhone8Sby' => [ 'HTC', '8S' ],
|
||||
'HTCPO881' => [ 'HTC', '8XT' ],
|
||||
'HTC6995LVW' => [ 'HTC', 'One (M8) for Windows' ],
|
||||
'0P6B140' => [ 'HTC', 'One (M8) for Windows' ],
|
||||
'0P6B180' => [ 'HTC', 'One (M8) for Windows' ],
|
||||
'HUAWEI Ascend W1!' => [ 'Huawei', 'Ascend W1' ],
|
||||
'HUAWEI ?W1-(C00|U00|U34)!' => [ 'Huawei', 'Ascend W1' ],
|
||||
'W1-(C00|U00|U34)!' => [ 'Huawei', 'Ascend W1' ],
|
||||
'H883G' => [ 'Huawei', 'Ascend W1' ],
|
||||
'HUAWEI ?W2-(T00|T01|U00|U051)!' => [ 'Huawei', 'Ascend W2' ],
|
||||
'W2-(T00|T01|U00|U051)!' => [ 'Huawei', 'Ascend W2' ],
|
||||
'4Afrika' => [ 'Huawei', '4Afrika' ],
|
||||
'Andi4L' => [ 'iBall', 'Andi 4L Pulse' ],
|
||||
'M1010' => [ 'Ingram Micro', 'M1010' ],
|
||||
'Titanium Wind W4' => [ 'Karbonn', 'Titanium Wind W4' ],
|
||||
'W4' => [ 'Karbonn', 'Titanium Wind W4' ],
|
||||
'Thunder 340W' => [ 'KAZAM', 'Thunder 340W' ],
|
||||
'Thunder 450W' => [ 'KAZAM', 'Thunder 450W' ],
|
||||
'SOUL2' => [ 'Kruger&Matz', 'Soul 2' ],
|
||||
'iris Win 1' => [ 'Lava', 'Iris Win 1' ],
|
||||
'Win1' => [ 'Lava', 'Iris Win 1' ],
|
||||
'- Lazer SMART WIND' => [ 'Lazer', 'Smart Wind' ], // By Archos
|
||||
'GW910' => [ 'LG', 'Optimus 7' ],
|
||||
'LG-E740!' => [ 'LG', 'Miracle' ],
|
||||
'LG-E-?900!' => [ 'LG', 'Optimus 7' ],
|
||||
'LG-E906' => [ 'LG', 'Jil Sander' ],
|
||||
'LG-C900!' => [ 'LG', 'Optimus 7Q' ],
|
||||
'VW820' => [ 'LG', 'Lancet' ],
|
||||
'Quantum' => [ 'LG', 'Quantum' ],
|
||||
'Harley Davidson' => [ 'NGM', 'Harley Davidson' ],
|
||||
'Harley-Davidson' => [ 'NGM', 'Harley Davidson' ],
|
||||
'NEO' => [ 'NuAns', 'Neo' ],
|
||||
'MegaFon SP-W1' => [ 'Мегафон', 'SP-W1' ],
|
||||
'MWP-47!' => [ 'Miia', 'Windows Phone 4.7" iimotion' ],
|
||||
'W121' => [ 'Micromax', 'Canvas Win W121' ],
|
||||
'MICROMAX-W121' => [ 'Micromax', 'Canvas Win W121' ],
|
||||
'M5w' => [ 'Mint', 'M5 Windows' ],
|
||||
'TC70' => [ 'Motorola', 'TC70' ], // Motorola Solutions
|
||||
'MouseComputer MADOSMA Q501' => [ 'MouseComputer', 'MADOSMA Q501' ],
|
||||
|
||||
'(Lumia ?|Nokia ?)?[0-9]{3,4}!!' => [
|
||||
'Lumia 430!' => [ 'Microsoft', 'Lumia 430' ],
|
||||
'Lumia 435!' => [ 'Microsoft', 'Lumia 435' ],
|
||||
'(Lumia ?|Nokia ?)?505!' => [ 'Nokia', 'Lumia 505' ],
|
||||
'(Lumia ?|Nokia ?)?510!' => [ 'Nokia', 'Lumia 510' ],
|
||||
'(Lumia ?|Nokia ?)?520!' => [ 'Nokia', 'Lumia 520' ],
|
||||
'(Lumia ?|Nokia ?)?521!' => [ 'Nokia', 'Lumia 521' ],
|
||||
'(Lumia ?|Nokia ?)?525!' => [ 'Nokia', 'Lumia 525' ],
|
||||
'(Lumia ?|Nokia ?)?526!' => [ 'Nokia', 'Lumia 526' ],
|
||||
'(Lumia ?|Nokia ?)?530!' => [ 'Nokia', 'Lumia 530' ],
|
||||
'Lumia 532!' => [ 'Microsoft', 'Lumia 532' ],
|
||||
'Lumia 535!' => [ 'Microsoft', 'Lumia 535' ],
|
||||
'Lumia 540!' => [ 'Microsoft', 'Lumia 540' ],
|
||||
'Lumia 550!' => [ 'Microsoft', 'Lumia 550' ],
|
||||
'(Lumia ?|Nokia ?)?610!' => [ 'Nokia', 'Lumia 610' ],
|
||||
'(Lumia ?|Nokia ?)?620!' => [ 'Nokia', 'Lumia 620' ],
|
||||
'(Lumia ?|Nokia ?)?625!' => [ 'Nokia', 'Lumia 625' ],
|
||||
'(Lumia ?|Nokia ?)?630!' => [ 'Nokia', 'Lumia 630' ],
|
||||
'(Lumia ?|Nokia ?)?635!' => [ 'Nokia', 'Lumia 635' ],
|
||||
'(Lumia ?|Nokia ?)?636!' => [ 'Nokia', 'Lumia 636' ],
|
||||
'Lumia 638' => [ 'Nokia', 'Lumia 638' ],
|
||||
'(Lumia ?|Nokia ?)?640 XL!' => [ 'Microsoft', 'Lumia 640 XL' ],
|
||||
'(Lumia ?|Nokia ?)?640!' => [ 'Microsoft', 'Lumia 640' ],
|
||||
'Lumia 650!' => [ 'Microsoft', 'Lumia 650' ],
|
||||
'(Lumia ?|Nokia ?)?710!' => [ 'Nokia', 'Lumia 710' ],
|
||||
'(Lumia ?|Nokia ?)?719!' => [ 'Nokia', 'Lumia 719' ],
|
||||
'(Lumia ?|Nokia ?)?720!' => [ 'Nokia', 'Lumia 720' ],
|
||||
'Lumia 730!' => [ 'Nokia', 'Lumia 730' ],
|
||||
'Lumia 735!' => [ 'Nokia', 'Lumia 735' ],
|
||||
'(Lumia ?|Nokia ?)?800!' => [ 'Nokia', 'Lumia 800' ],
|
||||
'(Lumia ?|Nokia ?)?810!' => [ 'Nokia', 'Lumia 810' ],
|
||||
'(Lumia ?|Nokia ?)?820!' => [ 'Nokia', 'Lumia 820' ],
|
||||
'(Lumia ?|Nokia ?)?822!' => [ 'Nokia', 'Lumia 822' ],
|
||||
'(Lumia ?|Nokia ?)?830!' => [ 'Nokia', 'Lumia 830' ],
|
||||
'Lumia 850!' => [ 'Microsoft', 'Lumia 850' ],
|
||||
'(Lumia ?|Nokia ?)?900!' => [ 'Nokia', 'Lumia 900' ],
|
||||
'(Lumia ?|Nokia ?)?920!' => [ 'Nokia', 'Lumia 920' ],
|
||||
'(Lumia ?|Nokia ?)?925!' => [ 'Nokia', 'Lumia 925' ],
|
||||
'(Lumia ?|Nokia ?)?928!' => [ 'Nokia', 'Lumia 928' ],
|
||||
'(Lumia ?|Nokia ?)?929!' => [ 'Nokia', 'Lumia 929 Icon' ],
|
||||
'(Lumia ?|Nokia ?)?930!' => [ 'Nokia', 'Lumia 930' ],
|
||||
'Lumia 950 XL!' => [ 'Microsoft', 'Lumia 950 XL' ],
|
||||
'Lumia 950!' => [ 'Microsoft', 'Lumia 950' ],
|
||||
'(Lumia ?|Nokia ?)?909!' => [ 'Nokia', 'Lumia 1020' ], // 909 was the original name of the 1020
|
||||
'(Lumia ?|Nokia ?)?1020!' => [ 'Nokia', 'Lumia 1020' ],
|
||||
'(Lumia ?|Nokia ?)?1320!' => [ 'Nokia', 'Lumia 1320' ],
|
||||
'(Lumia ?|Nokia ?)?1520!' => [ 'Nokia', 'Lumia 1520' ],
|
||||
'Lumia 1530' => [ 'Microsoft', 'Lumia 1530' ],
|
||||
],
|
||||
|
||||
'RM-[0-9]{3,4}!!' => [
|
||||
'RM-1099!' => [ 'Microsoft', 'Lumia 430' ],
|
||||
'RM-10(68|69|70|71)!' => [ 'Microsoft', 'Lumia 435' ],
|
||||
'RM-1114!' => [ 'Microsoft', 'Lumia 435' ],
|
||||
'RM-9(13|14|15)!' => [ 'Nokia', 'Lumia 520' ],
|
||||
'RM-917!' => [ 'Nokia', 'Lumia 521' ],
|
||||
'RM-998!' => [ 'Nokia', 'Lumia 525' ],
|
||||
'RM-997!' => [ 'Nokia', 'Lumia 526' ],
|
||||
'RM-10(17|18|19|20)!' => [ 'Nokia', 'Lumia 530' ],
|
||||
'RM-10(31|32|34)!' => [ 'Microsoft', 'Lumia 532' ],
|
||||
'RM-1115!' => [ 'Microsoft', 'Lumia 532' ],
|
||||
'RM-10(89|90|91|92)!' => [ 'Microsoft', 'Lumia 535' ],
|
||||
'RM-1141!' => [ 'Microsoft', 'Lumia 540' ],
|
||||
'RM-1127!' => [ 'Microsoft', 'Lumia 550' ],
|
||||
'RM-846!' => [ 'Nokia', 'Lumia 620' ],
|
||||
'RM-9(41|42|43)!' => [ 'Nokia', 'Lumia 625' ],
|
||||
'RM-9(76|77|78|79)!' => [ 'Nokia', 'Lumia 630' ],
|
||||
'RM-9(74|75)!' => [ 'Nokia', 'Lumia 635' ],
|
||||
'RM-1078!' => [ 'Nokia', 'Lumia 635' ],
|
||||
'RM-1027!' => [ 'Nokia', 'Lumia 636' ],
|
||||
'RM-1010!' => [ 'Nokia', 'Lumia 638' ],
|
||||
'RM-10(72|74|75|77)!' => [ 'Microsoft', 'Lumia 640' ],
|
||||
'RM-11(09|13)!' => [ 'Microsoft', 'Lumia 640' ],
|
||||
'RM-10(63|64|65|66|67|73|96)!' => [ 'Microsoft', 'Lumia 640 XL' ],
|
||||
'RM-11(52|54)!' => [ 'Microsoft', 'Lumia 650' ],
|
||||
'RM-8(85|87)!' => [ 'Nokia', 'Lumia 720' ],
|
||||
'RM-1040!' => [ 'Nokia', 'Lumia 730' ],
|
||||
'RM-1038!' => [ 'Nokia', 'Lumia 735' ],
|
||||
'RM-878!' => [ 'Nokia', 'Lumia 810' ],
|
||||
'RM-8(24|25|26)!' => [ 'Nokia', 'Lumia 820' ],
|
||||
'RM-845!' => [ 'Nokia', 'Lumia 822' ],
|
||||
'RM-9(83|84|85)!' => [ 'Nokia', 'Lumia 830' ],
|
||||
'RM-8(20|21|22)!' => [ 'Nokia', 'Lumia 920' ],
|
||||
'RM-867!' => [ 'Nokia', 'Lumia 920' ],
|
||||
'RM-8(92|93)!' => [ 'Nokia', 'Lumia 925' ],
|
||||
'RM-910!' => [ 'Nokia', 'Lumia 925' ],
|
||||
'RM-955!' => [ 'Nokia', 'Lumia 925T' ],
|
||||
'RM-860!' => [ 'Nokia', 'Lumia 928' ],
|
||||
'RM-927!' => [ 'Nokia', 'Lumia 929 Icon' ],
|
||||
'RM-10(45|87)!' => [ 'Nokia', 'Lumia 930' ],
|
||||
'RM-11(04|18)!' => [ 'Microsoft', 'Lumia 950' ],
|
||||
'RM-1085!' => [ 'Microsoft', 'Lumia 950 XL' ],
|
||||
'RM-1116!' => [ 'Microsoft', 'Lumia 950 XL' ],
|
||||
'RM-8(75|76|77)!' => [ 'Nokia', 'Lumia 1020' ],
|
||||
'RM-9(94|95|96)!' => [ 'Nokia', 'Lumia 1320' ],
|
||||
'RM-9(37|38|39|40)!' => [ 'Nokia', 'Lumia 1520' ],
|
||||
],
|
||||
|
||||
'id[0-9]{3,3}!!' => [
|
||||
'id102!' => [ 'Nokia', 'Lumia 822' ],
|
||||
'id308!' => [ 'Nokia', 'Lumia 1520' ],
|
||||
'id313!' => [ 'Nokia', 'Lumia 635' ],
|
||||
'id316!' => [ 'Nokia', 'Lumia 530' ],
|
||||
],
|
||||
|
||||
'SeaRay' => [ 'Nokia', 'Lumia 800' ],
|
||||
'Semaphore' => [ 'Nokia', '"Juggernaut Semaphore"' ],
|
||||
'Surface Phone' => [ 'Microsoft', 'Surface Phone' ],
|
||||
'ONIX AWP4-215' => [ 'ONYX', 'AWP4-215' ],
|
||||
'QSMART STORM W408' => [ 'Q-Mobile', 'Q-Smart Storm W408' ],
|
||||
'QSMART DREAM W473' => [ 'Q-Mobile', 'Q-Smart Dream W473' ],
|
||||
'QSMART STORM W510' => [ 'Q-Mobile', 'Q-Smart Storm W510' ],
|
||||
'FZ-E1' => [ 'Panasonic', 'Toughpad FZ-E1' ],
|
||||
'PSP8400DUO' => [ 'Prestigio', 'MultiPhone 8400 Duo' ],
|
||||
'PSP8500DUO' => [ 'Prestigio', 'MultiPhone 8500 Duo' ],
|
||||
'PRESTIGIO-PSP8500DUO' => [ 'Prestigio', 'MultiPhone 8500 Duo' ],
|
||||
|
||||
'GT-[IS][0-9]{4,4}!!' => [
|
||||
'GT-I8350!' => [ 'Samsung', 'Omnia W' ],
|
||||
'GT-i8700' => [ 'Samsung', 'Omnia 7' ],
|
||||
'GT-I8710' => [ 'Samsung', 'Ativ S' ],
|
||||
'GT-I8750' => [ 'Samsung', 'Ativ S' ],
|
||||
'GT-S7530!' => [ 'Samsung', 'Omnia M' ],
|
||||
],
|
||||
|
||||
'SGH-[IT][0-9]{3,3}!!' => [
|
||||
'SGH-I187' => [ 'Samsung', 'Ativ S Neo' ],
|
||||
'SGH-i667' => [ 'Samsung', 'Focus 2' ],
|
||||
'SGH-i677' => [ 'Samsung', 'Focus Flash' ],
|
||||
'SGH-i707' => [ 'Samsung', 'Taylor' ], // Developer phone - never released
|
||||
'SGH-i917!' => [ 'Samsung', 'Focus' ],
|
||||
'SGH-i937!' => [ 'Samsung', 'Focus S' ],
|
||||
'SGH-T899M' => [ 'Samsung', 'Ativ S' ],
|
||||
],
|
||||
|
||||
'SM-W750V' => [ 'Samsung', 'Ativ SE' ],
|
||||
'SPH-I800' => [ 'Samsung', 'Ativ S Neo' ],
|
||||
'SCH-R860U' => [ 'Samsung', 'Ativ Odyssey' ],
|
||||
'SCH-I930' => [ 'Samsung', 'Ativ Odyssey' ],
|
||||
'Ativ S' => [ 'Samsung', 'Ativ S' ],
|
||||
'ATIV S Neo' => [ 'Samsung', 'Ativ S Neo' ],
|
||||
'CETUS' => [ 'Samsung', 'Focus' ],
|
||||
'I917' => [ 'Samsung', 'Focus' ],
|
||||
'Focus i917!' => [ 'Samsung', 'Focus' ],
|
||||
'FOCUS S' => [ 'Samsung', 'Focus S' ],
|
||||
'OM(NI|IN)A ?7!' => [ 'Samsung', 'Omnia 7' ],
|
||||
'Omnia W' => [ 'Samsung', 'Omnia W' ],
|
||||
'Haden' => [ 'Samsung', 'Omnia W' ],
|
||||
'Taylor' => [ 'Samsung', 'Taylor' ],
|
||||
'S606' => [ 'TCL', 'Horizon S606' ],
|
||||
'TSUNAGI' => [ 'Toshiba', 'Tsunagi' ],
|
||||
'TG01' => [ 'Toshiba', 'TG01' ],
|
||||
'WP 4.7' => [ 'Trekstor', 'WP 4.7' ],
|
||||
'MI4' => [ 'Xiaomi', 'Mi 4' ],
|
||||
'Win-Q900S' => [ 'XOLO', 'Win Q900s' ],
|
||||
'Win Q1000' => [ 'XOLO', 'Win Q1000' ],
|
||||
'WinQ1000' => [ 'XOLO', 'Win Q1000' ],
|
||||
'Billy 4' => [ 'Yezz', 'Billy 4' ],
|
||||
'Billy 4.7' => [ 'Yezz', 'Billy 4.7' ],
|
||||
'47' => [ 'Yezz', 'Monaco 47' ],
|
||||
'USCCN859' => [ 'ZTE', 'N859 Render' ],
|
||||
'N880e!' => [ 'ZTE', 'N880e' ],
|
||||
'V965W' => [ 'ZTE', 'V965W Tania' ],
|
||||
'Tania' => [ 'ZTE', 'V965W Tania' ],
|
||||
|
||||
|
||||
'Microsoft!' => [ null, null ],
|
||||
'Windows!' => [ null, null ],
|
||||
'Virtual!' => [ null, null ],
|
||||
'Android!' => [ null, null ],
|
||||
'Linux!' => [ null, null ],
|
||||
'<model>!' => [ null, null ],
|
||||
'XXX!' => [ null, null ],
|
||||
'InfoPath!' => [ null, null ],
|
||||
];
|
||||
Executable
+97
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
CFNetwork::$OSX = [
|
||||
'1.1' => [ 'value' => '10.2' ],
|
||||
'1.2.1' => [ 'value' => '10.3.2' ],
|
||||
'1.2.2' => [ 'value' => '10.3.9' ],
|
||||
'1.2.6' => [ 'value' => '10.3.9' ],
|
||||
'128' => [ 'value' => '10.4' ],
|
||||
'128.2' => [ 'value' => '10.4.2' ],
|
||||
'129.5' => [ 'value' => '10.4.3' ],
|
||||
'129.9' => [ 'value' => '10.4.4' ],
|
||||
'129.10' => [ 'value' => '10.4.4' ],
|
||||
'129.13' => [ 'value' => '10.4.6' ],
|
||||
'129.16' => [ 'value' => '10.4.7' ],
|
||||
'129.18' => [ 'value' => '10.4.8' ],
|
||||
'129.20' => [ 'value' => '10.4.9' ],
|
||||
'129.21' => [ 'value' => '10.4.10' ],
|
||||
'129.22' => [ 'value' => '10.4.11' ],
|
||||
'217' => [ 'value' => '10.5' ],
|
||||
'220' => [ 'value' => '10.5.1' ],
|
||||
'221.5' => [ 'value' => '10.5.2' ],
|
||||
'330' => [ 'value' => '10.5.3' ],
|
||||
'330.4' => [ 'value' => '10.5.4' ],
|
||||
'339.5' => [ 'value' => '10.5.5' ],
|
||||
'422.11' => [ 'value' => '10.5.6' ],
|
||||
'438.12' => [ 'value' => '10.5.7' ],
|
||||
'438.14' => [ 'value' => '10.5.8' ],
|
||||
'454.4' => [ 'value' => '10.6.0' ],
|
||||
'454.5' => [ 'value' => '10.6.2' ],
|
||||
'454.9.4' => [ 'value' => '10.6.3' ],
|
||||
'454.9.7' => [ 'value' => '10.6.4' ],
|
||||
'454.11.5' => [ 'value' => '10.6.5' ],
|
||||
'454.11.12' => [ 'value' => '10.6.7' ],
|
||||
'454.12.4' => [ 'value' => '10.6.8' ],
|
||||
'520.0.13' => [ 'value' => '10.7.1' ],
|
||||
'520.2.5' => [ 'value' => '10.7.2' ],
|
||||
'520.3.2' => [ 'value' => '10.7.3' ],
|
||||
'520.4.3' => [ 'value' => '10.7.4' ],
|
||||
'520.5.1' => [ 'value' => '10.7.5' ],
|
||||
'596.1' => [ 'value' => '10.8.1' ],
|
||||
'596.2.3' => [ 'value' => '10.8.2' ],
|
||||
'596.3.3' => [ 'value' => '10.8.3' ],
|
||||
'596.4.3' => [ 'value' => '10.8.4' ],
|
||||
'596.5' => [ 'value' => '10.8.5' ],
|
||||
'673.0.3' => [ 'value' => '10.9' ],
|
||||
'673.2.1' => [ 'value' => '10.9.2' ],
|
||||
'673.4' => [ 'value' => '10.9.3' ],
|
||||
'720.0.9' => [ 'value' => '10.10' ],
|
||||
'720.1.1' => [ 'value' => '10.10.1' ],
|
||||
'720.2.4' => [ 'value' => '10.10.2' ],
|
||||
'720.3.13' => [ 'value' => '10.10.3' ],
|
||||
'720.4.4' => [ 'value' => '10.10.4' ],
|
||||
'720.5.7' => [ 'value' => '10.10.5' ],
|
||||
'760.0.5' => [ 'value' => '10.11' ],
|
||||
'760.1.2' => [ 'value' => '10.11.1' ],
|
||||
'760.2.6' => [ 'value' => '10.11.2' ],
|
||||
'760.4.2' => [ 'value' => '10.11.4' ],
|
||||
'760.5' => [ 'value' => '10.11.4' ],
|
||||
'760.5.1' => [ 'value' => '10.11.5' ],
|
||||
];
|
||||
|
||||
CFNetwork::$IOS = [
|
||||
'459' => [ 'value' => '3.1.3' ],
|
||||
'467.12' => [ 'value' => '3.2' ],
|
||||
'485.2' => [ 'value' => '4.0' ],
|
||||
'485.10.2' => [ 'value' => '4.1' ],
|
||||
'485.12.7' => [ 'value' => '4.2.1' ],
|
||||
'485.12.30' => [ 'value' => '4.2.8' ],
|
||||
'485.13.9' => [ 'value' => '4.3' ],
|
||||
'548.0.3' => [ 'value' => '5.0' ],
|
||||
'548.0.4' => [ 'value' => '5.0.1' ],
|
||||
'548.1.4' => [ 'value' => '5.1' ],
|
||||
'602' => [ 'value' => '6.0' ],
|
||||
'609' => [ 'value' => '6.0' ],
|
||||
'609.1.4' => [ 'value' => '6.1.2' ],
|
||||
'671' => [ 'value' => '7.0' ],
|
||||
'672.0.2' => [ 'value' => '7.0' ],
|
||||
'672.0.8' => [ 'value' => '7.0.3' ],
|
||||
'672.1.13' => [ 'value' => '7.1' ],
|
||||
'672.1.14' => [ 'value' => '7.1.1' ],
|
||||
'672.1.15' => [ 'value' => '7.1.2' ],
|
||||
'711.0.6' => [ 'value' => '8.0' ],
|
||||
'711.1.12' => [ 'value' => '8.1' ],
|
||||
'711.1.16' => [ 'value' => '8.1.1' ],
|
||||
'711.2.23' => [ 'value' => '8.2' ],
|
||||
'711.3.18' => [ 'value' => '8.3' ],
|
||||
'711.4.6' => [ 'value' => '8.4' ],
|
||||
'711.5.6' => [ 'value' => '8.4.1' ],
|
||||
'758.0.2' => [ 'value' => '9.0' ],
|
||||
'758.1.6' => [ 'value' => '9.1' ],
|
||||
'758.2.7' => [ 'value' => '9.2' ],
|
||||
'758.2.8' => [ 'value' => '9.2' ],
|
||||
'758.3.15' => [ 'value' => '9.3' ],
|
||||
'758.4.3' => [ 'value' => '9.3.2' ],
|
||||
];
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
Darwin::$OSX = [
|
||||
'1' => [ 'value' =>'10.0' ],
|
||||
'5' => [ 'value' =>'10.1' ],
|
||||
'6' => [ 'value' =>'10.2' ],
|
||||
'7' => [ 'value' =>'10.3' ],
|
||||
'8' => [ 'value' =>'10.4' ],
|
||||
'9' => [ 'value' =>'10.5' ],
|
||||
'10' => [ 'value' =>'10.6' ],
|
||||
'11' => [ 'value' =>'10.7' ],
|
||||
'12' => [ 'value' =>'10.8' ],
|
||||
'13' => [ 'value' =>'10.9' ],
|
||||
'14' => [ 'value' =>'10.10' ],
|
||||
'15' => [ 'value' =>'10.11' ],
|
||||
'16' => [ 'value' =>'10.12' ],
|
||||
'17' => [ 'value' =>'10.13' ],
|
||||
'18' => [ 'value' =>'10.14' ],
|
||||
'19' => [ 'value' =>'10.15' ],
|
||||
'20' => [ 'value' =>'11' ],
|
||||
'21' => [ 'value' =>'12' ],
|
||||
'22' => [ 'value' =>'13' ],
|
||||
'23' => [ 'value' =>'14' ],
|
||||
];
|
||||
|
||||
Darwin::$IOS = [
|
||||
'9' => [ 'value' =>'1' ],
|
||||
'10' => [ 'value' =>'4' ],
|
||||
'11' => [ 'value' =>'5' ],
|
||||
'13' => [ 'value' =>'6' ],
|
||||
'14' => [ 'value' =>'7' ],
|
||||
'15' => [ 'value' =>'9' ],
|
||||
'16' => [ 'value' =>'10' ],
|
||||
'17' => [ 'value' =>'11' ],
|
||||
'18' => [ 'value' =>'12' ],
|
||||
'19' => [ 'value' =>'13' ],
|
||||
'20' => [ 'value' =>'14' ],
|
||||
'21' => [ 'value' =>'15' ],
|
||||
'22' => [ 'value' =>'16' ],
|
||||
'23' => [ 'value' =>'17' ],
|
||||
];
|
||||
Executable
+10044
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
Applications::$BOTS_REGEX = '/(008|360|a6|abound|muncher|adaxas|addthis|admantx|adsbot|ahrefs|archiver|altavista|curious|cloudfront|amorank|apple|archive|jeeves|astra|backlink|baidu|barkrowler|bazqux|bingbot|msnbot|msmobot|bing|blex|blogbridge|blogger|bloglines|bloglovin|blogpulse|blogram|blogtrot|blogshares|boardreader|lddc|browsershots|bubing|buck|builtwith|butterfly|buzzsumo|bytespider|heritrix|clarabot|cliqz|cloudflare|coccoc|comodo|commafeed|cbot|cresearch|watchdog|datanyze|datasearch|dataprovider|daum|daumoa|digg|domaincrawl|domainstats|discord|domain|dmca|duckduck|embed|evc|exabot|exactseek|ezooms|facebook|fast|flamingo|fastladder|feed|wrangler|validator|fever|florienzh|friendica|robot|genieo|fetchor|google|gofeed|gomez|ichiro|gooblog|goorss|gowiki|grammarly|grub|hatena|capture|heureka|hootsuite|htdig|httpmon|hubpages|hubspot|spider|indeed|iodc|istellabot|crawler|kakao|kouio|larbin|letsearch|line|linkedin|linkpad|linkdex|livedoor|seeker|ltx71|magpie|mj12bot|mapion|mail\.ru|medium|megaindex|socialstreams|mixi|minds|mnogo|mojeek|monitor|dotbot|rogerbot|yeti|mxtoolbox|netcraft|netestate|netvibes|newsblur|newsgator|nimbostratus|odklbot|orange|pages|petal|aspiegel|psbot|pingdom|pinterest|plurk|pocket|postrank|comment|reddit|rssbar|hunter|quora|safesearch|scrapy|searchatlas|seekport|semrush|serpstat|seokicks|seznam|shopwiki|reader|simplepie|site24|skype|slack|sogou|sophora|soso|spaziodati|spdycheck|spinn|sputnik|detector|summify|telegram|twisted|twitter|tiny|tineye|tlsprober|trustedsite|typhoeus|vagabondo|velen|vkshare|voat|voila|vocus|mcrawler|vuhuv|w3bot|jigsaw|w3c|wappalyzer|wayback|webindexer|wordpress|mechanize|xenu|xerka|sitemap|yacy|yandex|yahoo|y\!j|slurp|yelp|yioop|yisou|zgrab|zmeu|httpclient|nutch|synapse|indy|go|httpunit|okhttp|node|wget|curl|package|java|simple|libwww|lwp|urllib|requests|php|pear|zend|ruby)/i';
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
Applications::$BROWSERS_REGEX = '/(115|126|2345|37abc|qihu|1stbrowser|7star|abrowse|acorn|acoo|amigo|aol|america|apus|arachne|arora|aweb|avant|asw|avg|aviator|avira|flyflow|bdbrowser|bdspark|basilisk|beamrise|beonex|blackwren|blackhawk|bolt|blackbird|brave|brisk|browsex|browzar|byffox|camino|canure|ccleaner|cent|charon|chedot|cheshire|chimlac|chimera|chromeplus|colibri|columbus|cometbird|comodo|dragon|conkeror|coc|coolnovo|corom|crazy|crusta|cunaguaro|cyberdog|cyberfox|daedalus|degan|demeter|deskbrowse|diigo|dillo|doczilla|rhodonit|dplus|elements|eudoraweb|falkon|flamesky|flock|framafox|freeu|galeon|globalmojo|epiphany|greenbrowser|hola|hydra|ibrowse|icab|iceape|icecat|icedove|iceweasel|irider|iridium|iron|kapiko|kazehakase|kchrome|kinza|kkman|klondike|kylo|meleon|lbrowser|lbbrowser|light|lobo|lolifox|lovense|lunascape|naenara|netcaptor|madfox|mxbrowser|min|mini|mixshark|mlbrowser|mypal|multixp|netpositive|nichrome|origyn|owb|live|juzi|orca|oregano|otter|palemoon|patriott|perk|polarity|privacy|qiyu|qtweb|quicklook|qupzilla|qute|rekonq|ryouko|sylera|saayaa|salam|shiira|sielo|sitekiosk|sleipnir|slimjet|metasr|sparrow|sputnik|stainless|station|sunchrome|sundance|sundial|superbird|swiftweasel|swiftfox|swing|to-browser|tencent|tenfourfox|theworld|tulip|tungsten|ultrab|usejump|vimprobable|vivaldi|airwatch|vonkeror|voyager|waterfox|whale|winwap|xvast|yabrowser|zvu|zipzap|zombie|1password|3g explorer|4g explorer|aloha|atomiclite|au|awakening|baidu|bdmobile|bidu|baiduboxapp|browser|blazer|acheetahi|cornowser|coolmarket|cute|digia|doris|doroty|ecosia|www browser|epic|eui|go\.web|helium|heytap|huohoubrowser|surfboard|isurf|jig browser|jumanji|tnsbrowser|kiosk|kiwi|lebrowser|liebao|macross|mammoth|mcent|mint|mobicip|mib|cmcs|motorola|multizilla|netfrontlife|onebrowser|oneplus|plink|polaris|pure|openwave|up|km|oppo|quark|realme|semc|stnc|sogou|symphony|tenta|ucpro|vivo|weblite|wk|yaani|alti|aplix|awox|browserserver|isis|netbox|spyglass|oregan|viera|zetakey|bunjalloo|nwf|nuanti|wib|prince|demobrowser|dooble|dwb|evm|fireweb|hive|intermec|phantom|qt|roccat|raven|rockmelt|scope|slim|smbrowser|snowshoe|surf|tao|taz|uzbl|villanova|vimb|wada|wavelink|webrender|webster|wyzo|yelang|yrcweb|linemode|lynx|links|w3m|nimbus|Webwasher|sankore|adapi|brightsign|coship)/i';
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Data;
|
||||
|
||||
Applications::$OTHERS_REGEX = '/(itunes|qt|bluefish|nightingale|songbird|stagefright|substream|vlc|windows-media|coreplayer|flycast|boxee|kodi|xbmc|lightning|thunderbird|outlook|lotus|postbox|bat|yahoo|daum|flipboard|akregator|blogos|cococ|feed|liferea|news|jetbrains|rss|reeder|reedkit|rome|ziepod|messenger|kakao|kik|line|slack|viber|whatsapp|wire|yammer|zalo|fbios|fb4a|googleplus|instagram|pinterest|weibo|tumblr|twitter|wp-android|yelp|office|bingweb|hao123|gsa|naver|sogousearch|yandex|atom|golive|brackets|iweb|frontpage|amaya|websphere|download|tansodl|origin|secondlife|valve|raptr|alipay|cooliris|google|leechcraft|expeditor)/i';
|
||||
Executable
+48
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Model\Main;
|
||||
|
||||
class Analyser
|
||||
{
|
||||
use Analyser\Header, Analyser\Derive, Analyser\Corrections, Analyser\Camouflage;
|
||||
|
||||
private $data;
|
||||
|
||||
private $options;
|
||||
|
||||
private $headers = [];
|
||||
|
||||
public function __construct($headers, $options = [])
|
||||
{
|
||||
$this->headers = $headers;
|
||||
$this->options = (object) $options;
|
||||
}
|
||||
|
||||
public function setData(&$data)
|
||||
{
|
||||
$this->data =& $data;
|
||||
}
|
||||
|
||||
public function &getData()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
public function analyse()
|
||||
{
|
||||
if (!isset($this->data)) {
|
||||
$this->data = new Main();
|
||||
}
|
||||
|
||||
/* Start the actual analysing steps */
|
||||
|
||||
$this->analyseHeaders()
|
||||
->deriveInformation()
|
||||
->applyCorrections()
|
||||
->detectCamouflage()
|
||||
->deriveDeviceSubType();
|
||||
}
|
||||
}
|
||||
+308
@@ -0,0 +1,308 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Camouflage
|
||||
{
|
||||
private function &detectCamouflage()
|
||||
{
|
||||
if ($ua = $this->getHeader('User-Agent')) {
|
||||
$this
|
||||
->detectCamouflagedAndroidBrowser($ua)
|
||||
->detectCamouflagedAndroidAsusBrowser($ua)
|
||||
->detectCamouflagedAsSafari($ua)
|
||||
->detectCamouflagedAsChrome($ua);
|
||||
}
|
||||
|
||||
if (!empty($this->options->useragent)) {
|
||||
$this->detectCamouflagedUCBrowser($this->options->useragent);
|
||||
}
|
||||
|
||||
if (isset($this->options->engine)) {
|
||||
$this->detectCamouflagedBasedOnEngines();
|
||||
}
|
||||
|
||||
if (isset($this->options->features)) {
|
||||
$this->detectCamouflagedBasedOnFeatures();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function &detectCamouflagedAndroidBrowser($ua)
|
||||
{
|
||||
if (preg_match('/Mac OS X 10_6_3; ([^;]+); [a-z]{2}(?:-[a-z]{2})?\)/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Android Browser';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->mode = 'desktop';
|
||||
|
||||
$this->data->os->name = 'Android';
|
||||
$this->data->os->alias = null;
|
||||
$this->data->os->version = null;
|
||||
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = null;
|
||||
|
||||
$this->data->device->type = 'mobile';
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[1]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
|
||||
$this->data->features[] = 'foundDevice';
|
||||
}
|
||||
|
||||
if (preg_match('/Mac OS X 10_5_7; [^\/\);]+\/([^\/\);]+)\//u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Android Browser';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->mode = 'desktop';
|
||||
|
||||
$this->data->os->name = 'Android';
|
||||
$this->data->os->alias = null;
|
||||
$this->data->os->version = null;
|
||||
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = null;
|
||||
|
||||
$this->data->device->type = 'mobile';
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[1]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
|
||||
$this->data->features[] = 'foundDevice';
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function &detectCamouflagedAndroidAsusBrowser($ua)
|
||||
{
|
||||
if (preg_match('/Linux Ventana; [a-z]{2}(?:-[a-z]{2})?; (.+) Build/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Android Browser';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->channel = null;
|
||||
$this->data->browser->mode = 'desktop';
|
||||
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = null;
|
||||
|
||||
$this->data->features[] = 'foundDevice';
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function &detectCamouflagedAsSafari($ua)
|
||||
{
|
||||
if ($this->data->isBrowser('Safari') && !preg_match('/Darwin/u', $ua)) {
|
||||
if ($this->data->isOs('iOS') && !preg_match('/^Mozilla/u', $ua)) {
|
||||
$this->data->features[] = 'noMozillaPrefix';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if (!preg_match('/Version\/[0-9\.]+/u', $ua)) {
|
||||
$this->data->features[] = 'noVersion';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function &detectCamouflagedAsChrome($ua)
|
||||
{
|
||||
if ($this->data->isBrowser('Chrome')) {
|
||||
if (preg_match('/(?:Chrome|CrMo|CriOS)\//u', $ua)
|
||||
&& !preg_match('/(?:Chrome|CrMo|CriOS)\/([0-9]{1,3}\.[0-9]\.(0\.0|[0-9]{3,4}\.[0-9]+))/u', $ua)
|
||||
) {
|
||||
$this->data->features[] = 'wrongVersion';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function &detectCamouflagedUCBrowser($ua)
|
||||
{
|
||||
if ($ua == 'Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.2.3.4) Gecko/') {
|
||||
if (!$this->data->isBrowser('UC Browser')) {
|
||||
$this->data->browser->name = 'UC Browser';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->stock = false;
|
||||
}
|
||||
|
||||
if ($this->data->isOs('Windows')) {
|
||||
$this->data->os->reset();
|
||||
}
|
||||
|
||||
$this->data->engine->reset([ 'name' => 'Gecko' ]);
|
||||
$this->data->device->type = 'mobile';
|
||||
}
|
||||
|
||||
if ($this->data->isBrowser('Chrome')) {
|
||||
if (preg_match('/UBrowser\/?([0-9.]*)/u', $ua, $match)) {
|
||||
$this->data->browser->stock = false;
|
||||
$this->data->browser->name = 'UC Browser';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::BROWSER;
|
||||
unset($this->data->browser->channel);
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function &detectCamouflagedBasedOnEngines()
|
||||
{
|
||||
if (isset($this->data->engine->name) && $this->data->browser->mode != 'proxy') {
|
||||
/* If it claims not to be Trident, but it is probably Trident running camouflage mode */
|
||||
if ($this->options->engine & Constants\EngineType::TRIDENT) {
|
||||
$this->data->features[] = 'trident';
|
||||
|
||||
if ($this->data->engine->name && $this->data->engine->name != 'Trident') {
|
||||
$this->data->camouflage = !isset($this->data->browser->name) || ($this->data->browser->name != 'Maxthon' && $this->data->browser->name != 'Motorola WebKit');
|
||||
}
|
||||
}
|
||||
|
||||
/* If it claims not to be Opera, but it is probably Opera running camouflage mode */
|
||||
if ($this->options->engine & Constants\EngineType::PRESTO) {
|
||||
$this->data->features[] = 'presto';
|
||||
|
||||
if ($this->data->engine->name && $this->data->engine->name != 'Presto') {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* If it claims not to be Gecko, but it is probably Gecko running camouflage mode */
|
||||
if ($this->options->engine & Constants\EngineType::GECKO) {
|
||||
$this->data->features[] = 'gecko';
|
||||
|
||||
if ($this->data->engine->name && $this->data->engine->name != 'Gecko') {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* If it claims not to be Webkit, but it is probably Webkit running camouflage mode */
|
||||
if ($this->options->engine & Constants\EngineType::WEBKIT) {
|
||||
$this->data->features[] = 'webkit';
|
||||
|
||||
if ($this->data->engine->name && ($this->data->engine->name != 'Blink' && $this->data->engine->name != 'Webkit')) {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
/* IE 11 on mobile now supports Webkit APIs */
|
||||
if (isset($this->data->browser->name) && $this->data->browser->name == 'Mobile Internet Explorer'
|
||||
&& isset($this->data->browser->version) && $this->data->browser->version->toFloat() >= 11
|
||||
&& isset($this->data->os->name) && $this->data->os->name == 'Windows Phone'
|
||||
) {
|
||||
$this->data->camouflage = false;
|
||||
}
|
||||
|
||||
/* IE 11 Developer Preview now supports Webkit APIs */
|
||||
if (isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer'
|
||||
&& isset($this->data->browser->version) && $this->data->browser->version->toFloat() >= 11
|
||||
&& isset($this->data->os->name) && $this->data->os->name == 'Windows'
|
||||
) {
|
||||
$this->data->camouflage = false;
|
||||
}
|
||||
|
||||
/* EdgeHTML rendering engine also appears to be WebKit */
|
||||
if (isset($this->data->engine->name) && $this->data->engine->name == 'EdgeHTML') {
|
||||
$this->data->camouflage = false;
|
||||
}
|
||||
|
||||
/* Firefox 48+ support certain Webkit features */
|
||||
if ($this->options->engine & Constants\EngineType::GECKO) {
|
||||
$this->data->camouflage = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->options->engine & Constants\EngineType::CHROMIUM) {
|
||||
$this->data->features[] = 'chrome';
|
||||
|
||||
if ($this->data->engine->name && ($this->data->engine->name != 'EdgeHTML' && $this->data->engine->name != 'Blink' && $this->data->engine->name != 'Webkit')) {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* If it claims to be Safari and uses V8, it is probably an Android device running camouflage mode */
|
||||
if ($this->data->engine->name == 'Webkit' && $this->options->engine & Constants\EngineType::V8) {
|
||||
$this->data->features[] = 'v8';
|
||||
|
||||
if (isset($this->data->browser->name) && $this->data->browser->name == 'Safari') {
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function &detectCamouflagedBasedOnFeatures()
|
||||
{
|
||||
if (isset($this->data->browser->name) && isset($this->data->os->name)) {
|
||||
if ($this->data->os->name == 'iOS' && $this->data->browser->name != 'Opera Mini' && $this->data->browser->name != 'UC Browser' && isset($this->data->os->version)) {
|
||||
if ($this->data->os->version->toFloat() < 4.0 && $this->options->features & Constants\Feature::SANDBOX) {
|
||||
$this->data->features[] = 'foundSandbox';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if ($this->data->os->version->toFloat() < 4.2 && $this->options->features & Constants\Feature::WEBSOCKET) {
|
||||
$this->data->features[] = 'foundSockets';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if ($this->data->os->version->toFloat() < 5.0 && $this->options->features & Constants\Feature::WORKER) {
|
||||
$this->data->features[] = 'foundWorker';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->os->name != 'iOS' && $this->data->browser->name == 'Safari' && isset($this->data->browser->version)) {
|
||||
if ($this->data->browser->version->toFloat() < 4.0 && $this->options->features & Constants\Feature::APPCACHE) {
|
||||
$this->data->features[] = 'foundAppCache';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if ($this->data->browser->version->toFloat() < 4.1 && $this->options->features & Constants\Feature::HISTORY) {
|
||||
$this->data->features[] = 'foundHistory';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if ($this->data->browser->version->toFloat() < 5.1 && $this->options->features & Constants\Feature::FULLSCREEN) {
|
||||
$this->data->features[] = 'foundFullscreen';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
|
||||
if ($this->data->browser->version->toFloat() < 5.2 && $this->options->features & Constants\Feature::FILEREADER) {
|
||||
$this->data->features[] = 'foundFileReader';
|
||||
$this->data->camouflage = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Corrections
|
||||
{
|
||||
private function &applyCorrections()
|
||||
{
|
||||
if (isset($this->data->browser->name) && isset($this->data->browser->using)) {
|
||||
$this->hideBrowserBasedOnUsing();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && isset($this->data->os->name)) {
|
||||
$this->hideBrowserBasedOnOperatingSystem();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && $this->data->device->type == Constants\DeviceType::TELEVISION) {
|
||||
$this->hideBrowserOnDeviceTypeTelevision();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && $this->data->device->type == Constants\DeviceType::GAMING) {
|
||||
$this->hideBrowserOnDeviceTypeGaming();
|
||||
}
|
||||
|
||||
if ($this->data->device->type == Constants\DeviceType::TELEVISION) {
|
||||
$this->hideOsOnDeviceTypeTelevision();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && isset($this->data->engine->name)) {
|
||||
$this->fixMidoriEngineName();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && isset($this->data->engine->name)) {
|
||||
$this->fixNineSkyEngineName();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && isset($this->data->browser->family)) {
|
||||
$this->hideFamilyIfEqualToBrowser();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name) && isset($this->data->os->name) && isset($this->data->os->version)) {
|
||||
$this->hideOsVersionIfFixed();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
private function hideOsVersionIfFixed()
|
||||
{
|
||||
if ($this->data->os->name == 'OS X') {
|
||||
$name = $this->data->browser->name;
|
||||
|
||||
if (isset($this->data->browser->family)) {
|
||||
$name = $this->data->browser->family->name;
|
||||
}
|
||||
|
||||
if ($name == 'Chrome' && $this->data->os->version->value == "10.15.7") {
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
if ($name == 'Safari' && $this->data->os->version->value == "10.15.7") {
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
if ($name == 'Firefox' && $this->data->os->version->value == "10.15") {
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function hideFamilyIfEqualToBrowser()
|
||||
{
|
||||
if ($this->data->browser->name == $this->data->browser->family->name) {
|
||||
unset($this->data->browser->family);
|
||||
}
|
||||
}
|
||||
|
||||
private function fixMidoriEngineName()
|
||||
{
|
||||
if ($this->data->browser->name == 'Midori' && $this->data->engine->name != 'Webkit') {
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = null;
|
||||
}
|
||||
}
|
||||
|
||||
private function fixNineSkyEngineName()
|
||||
{
|
||||
if ($this->data->browser->name == 'NineSky' && $this->data->engine->name != 'Webkit') {
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = null;
|
||||
}
|
||||
}
|
||||
|
||||
private function hideBrowserBasedOnUsing()
|
||||
{
|
||||
if ($this->data->browser->name == 'Chrome') {
|
||||
if ($this->data->browser->isUsing('Electron') || $this->data->browser->isUsing('Qt')) {
|
||||
unset($this->data->browser->name);
|
||||
unset($this->data->browser->version);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function hideBrowserBasedOnOperatingSystem()
|
||||
{
|
||||
if ($this->data->os->name == 'Series60' && $this->data->browser->name == 'Internet Explorer') {
|
||||
$this->data->browser->reset();
|
||||
$this->data->engine->reset();
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'Series80' && $this->data->browser->name == 'Internet Explorer') {
|
||||
$this->data->browser->reset();
|
||||
$this->data->engine->reset();
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'Lindows' && $this->data->browser->name == 'Internet Explorer') {
|
||||
$this->data->browser->reset();
|
||||
$this->data->engine->reset();
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'Tizen' && $this->data->browser->name == 'Chrome') {
|
||||
$this->data->browser->reset([
|
||||
'family' => isset($this->data->browser->family) ? $this->data->browser->family : null
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'Ubuntu Touch' && $this->data->browser->name == 'Chromium') {
|
||||
$this->data->browser->reset([
|
||||
'family' => isset($this->data->browser->family) ? $this->data->browser->family : null
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'KaiOS' && $this->data->browser->name == 'Firefox Mobile') {
|
||||
$this->data->browser->reset([
|
||||
'family' => isset($this->data->browser->family) ? $this->data->browser->family : null
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
private function hideBrowserOnDeviceTypeGaming()
|
||||
{
|
||||
if (isset($this->data->device->model) && $this->data->device->model == 'PlayStation 2' && $this->data->browser->name == 'Internet Explorer') {
|
||||
$this->data->browser->reset();
|
||||
}
|
||||
}
|
||||
|
||||
private function hideBrowserOnDeviceTypeTelevision()
|
||||
{
|
||||
switch ($this->data->browser->name) {
|
||||
case 'Firefox':
|
||||
if (!$this->data->isOs('Firefox OS')) {
|
||||
unset($this->data->browser->name);
|
||||
unset($this->data->browser->version);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Internet Explorer':
|
||||
$valid = false;
|
||||
|
||||
if (isset($this->data->device->model) && in_array($this->data->device->model, [ 'WebTV' ])) {
|
||||
$valid = true;
|
||||
}
|
||||
|
||||
if (!$valid) {
|
||||
unset($this->data->browser->name);
|
||||
unset($this->data->browser->version);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'Chrome':
|
||||
case 'Chromium':
|
||||
$valid = false;
|
||||
|
||||
if (isset($this->data->os->name) && in_array($this->data->os->name, [ 'Google TV', 'Android' ])) {
|
||||
$valid = true;
|
||||
}
|
||||
if (isset($this->data->device->model) && in_array($this->data->device->model, [ 'Chromecast' ])) {
|
||||
$valid = true;
|
||||
}
|
||||
|
||||
if (!$valid) {
|
||||
unset($this->data->browser->name);
|
||||
unset($this->data->browser->version);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private function hideOsOnDeviceTypeTelevision()
|
||||
{
|
||||
if (isset($this->data->os->name) && !in_array($this->data->os->name, [ 'Aliyun OS', 'Tizen', 'Android', 'Android TV', 'FireOS', 'Google TV', 'Firefox OS', 'OpenTV', 'webOS' ])) {
|
||||
$this->data->os->reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
+506
@@ -0,0 +1,506 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Model\Family;
|
||||
use WhichBrowser\Model\Using;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Derive
|
||||
{
|
||||
private function &deriveInformation()
|
||||
{
|
||||
if (isset($this->data->device->flag)) {
|
||||
$this->deriveBasedOnDeviceFlag();
|
||||
}
|
||||
|
||||
if (isset($this->data->os->name)) {
|
||||
$this->deriveBasedOnOperatingSystem();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name)) {
|
||||
$this->deriveOperaDevices();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name)) {
|
||||
$this->deriveFirefoxOS();
|
||||
}
|
||||
|
||||
if (isset($this->data->browser->name)) {
|
||||
$this->deriveTrident();
|
||||
$this->deriveOperaRenderingEngine();
|
||||
$this->deriveOmniWebRenderingEngine();
|
||||
$this->deriveNetFrontRenderingEngine();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private function &deriveDeviceSubType()
|
||||
{
|
||||
if ($this->data->device->type == 'mobile' && empty($this->data->device->subtype)) {
|
||||
$this->data->device->subtype = 'feature';
|
||||
|
||||
if (in_array($this->data->os->getName(), [ 'Android', 'Bada', 'BlackBerry', 'BlackBerry OS', 'Firefox OS', 'iOS', 'iPhone OS', 'Kin OS', 'Maemo', 'MeeGo', 'Palm OS', 'Sailfish', 'Series60', 'Series80', 'Tizen', 'Ubuntu Touch', 'Windows Mobile', 'Windows Phone', 'webOS' ])) {
|
||||
$this->data->device->subtype = 'smart';
|
||||
}
|
||||
|
||||
if (isset($this->data->os->name) && in_array($this->data->os->name, [ 'Windows Phone' ])) {
|
||||
$this->data->device->subtype = 'smart';
|
||||
}
|
||||
|
||||
if (isset($this->data->os->family) && in_array($this->data->os->family->getName(), [ 'Android' ])) {
|
||||
$this->data->device->subtype = 'smart';
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
private function deriveOmniWebRenderingEngine()
|
||||
{
|
||||
if ($this->data->isBrowser('OmniWeb')) {
|
||||
$version = $this->data->browser->getVersion();
|
||||
|
||||
if ($version < 5) {
|
||||
$this->data->engine->reset();
|
||||
}
|
||||
|
||||
if ($version >= 5 && $version < 5.5 && !$this->data->isEngine('WebCore')) {
|
||||
$this->data->engine->reset([ 'name' => 'WebCore' ]);
|
||||
}
|
||||
|
||||
if ($version >= 5.5 && !$this->data->isEngine('WebKit')) {
|
||||
$this->data->engine->reset([ 'name' => 'WebKit' ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function deriveOperaRenderingEngine()
|
||||
{
|
||||
if ($this->data->isBrowser('Opera') || $this->data->isBrowser('Opera Mobile')) {
|
||||
$version = $this->data->browser->getVersion();
|
||||
|
||||
if ($version >= 3.5 && $version < 7 && !$this->data->isEngine('Electra')) {
|
||||
$this->data->engine->reset([ 'name' => 'Electra' ]);
|
||||
}
|
||||
|
||||
if ($version >= 7 && $version < 13 && !$this->data->isEngine('Presto')) {
|
||||
$this->data->engine->reset([ 'name' => 'Presto' ]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->isBrowser('Opera Mini') && !$this->data->isOs('iOS') && !$this->data->isEngine('Presto')) {
|
||||
$this->data->engine->reset([ 'name' => 'Presto' ]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function deriveNetFrontRenderingEngine()
|
||||
{
|
||||
if ($this->data->isBrowser('NetFront') && !$this->data->isEngine('NetFront')) {
|
||||
$this->data->engine->reset([ 'name' => 'NetFront' ]);
|
||||
}
|
||||
}
|
||||
|
||||
private function deriveTrident()
|
||||
{
|
||||
if ($this->data->isType('desktop') && $this->data->isBrowser('Internet Explorer') && !$this->data->engine->getName()) {
|
||||
if ($this->data->isBrowser('Internet Explorer', '>=', 4)) {
|
||||
$this->data->engine->set([ 'name' => 'Trident' ]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->isMobile() && $this->data->isBrowser('Mobile Internet Explorer') && !$this->data->engine->getName()) {
|
||||
if ($this->data->isBrowser('Mobile Internet Explorer', '=', 6)) {
|
||||
$this->data->engine->set([ 'name' => 'Trident' ]);
|
||||
}
|
||||
|
||||
if ($this->data->isBrowser('Mobile Internet Explorer', '=', 7)) {
|
||||
$this->data->engine->set([ 'name' => 'Trident', 'version' => new Version([ 'value' => '3.1' ]) ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function deriveFirefoxOS()
|
||||
{
|
||||
if (in_array($this->data->browser->name, [ 'Firefox Mobile', 'Servo Nightly Build' ]) && !isset($this->data->os->name)) {
|
||||
$this->data->os->name = 'Firefox OS';
|
||||
}
|
||||
|
||||
if (isset($this->data->os->name) && $this->data->os->name == 'Firefox OS' && $this->data->engine->name == 'Gecko') {
|
||||
switch ($this->data->engine->getVersion()) {
|
||||
case '18.0':
|
||||
$this->data->os->version = new Version([ 'value' => '1.0.1' ]);
|
||||
break;
|
||||
case '18.1':
|
||||
$this->data->os->version = new Version([ 'value' => '1.1' ]);
|
||||
break;
|
||||
case '26.0':
|
||||
$this->data->os->version = new Version([ 'value' => '1.2' ]);
|
||||
break;
|
||||
case '28.0':
|
||||
$this->data->os->version = new Version([ 'value' => '1.3' ]);
|
||||
break;
|
||||
case '30.0':
|
||||
$this->data->os->version = new Version([ 'value' => '1.4' ]);
|
||||
break;
|
||||
case '32.0':
|
||||
$this->data->os->version = new Version([ 'value' => '2.0' ]);
|
||||
break;
|
||||
case '34.0':
|
||||
$this->data->os->version = new Version([ 'value' => '2.1' ]);
|
||||
break;
|
||||
case '37.0':
|
||||
$this->data->os->version = new Version([ 'value' => '2.2' ]);
|
||||
break;
|
||||
case '44.0':
|
||||
$this->data->os->version = new Version([ 'value' => '2.5' ]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function deriveOperaDevices()
|
||||
{
|
||||
if ($this->data->browser->name == 'Opera' && $this->data->device->type == Constants\DeviceType::TELEVISION) {
|
||||
$this->data->browser->name = 'Opera Devices';
|
||||
$this->data->browser->version = null;
|
||||
|
||||
if ($this->data->engine->getName() == 'Presto') {
|
||||
$data = [
|
||||
'2.12' => '3.4',
|
||||
'2.11' => '3.3',
|
||||
'2.10' => '3.2',
|
||||
'2.9' => '3.1',
|
||||
'2.8' => '3.0',
|
||||
'2.7' => '2.9',
|
||||
'2.6' => '2.8',
|
||||
'2.4' => '10.3',
|
||||
'2.3' => '10',
|
||||
'2.2' => '9.7',
|
||||
'2.1' => '9.6'
|
||||
];
|
||||
|
||||
$key = implode('.', array_slice(explode('.', $this->data->engine->getVersion()), 0, 2));
|
||||
|
||||
if (isset($data[$key])) {
|
||||
$this->data->browser->version = new Version([ 'value' => $data[$key] ]);
|
||||
} else {
|
||||
unset($this->data->browser->version);
|
||||
}
|
||||
}
|
||||
|
||||
$this->data->os->reset();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function deriveBasedOnDeviceFlag()
|
||||
{
|
||||
$flag = $this->data->device->flag;
|
||||
|
||||
if ($flag == Constants\Flag::NOKIAX) {
|
||||
$this->data->os->name = 'Nokia X Platform';
|
||||
$this->data->os->family = new Family([ 'name' => 'Android' ]);
|
||||
|
||||
unset($this->data->os->version);
|
||||
unset($this->data->device->flag);
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::FIREOS) {
|
||||
$this->data->os->name = 'FireOS';
|
||||
$this->data->os->family = new Family([ 'name' => 'Android' ]);
|
||||
|
||||
if (isset($this->data->os->version) && isset($this->data->os->version->value)) {
|
||||
switch ($this->data->os->version->value) {
|
||||
case '2.3.3':
|
||||
case '2.3.4':
|
||||
$this->data->os->version = new Version([ 'value' => '1' ]);
|
||||
break;
|
||||
case '4.0.3':
|
||||
$this->data->os->version = new Version([ 'value' => '2' ]);
|
||||
break;
|
||||
case '4.2.2':
|
||||
$this->data->os->version = new Version([ 'value' => '3' ]);
|
||||
break;
|
||||
case '4.4.2':
|
||||
$this->data->os->version = new Version([ 'value' => '4' ]);
|
||||
break;
|
||||
case '4.4.3':
|
||||
$this->data->os->version = new Version([ 'value' => '4.5' ]);
|
||||
break;
|
||||
case '5.1.1':
|
||||
$this->data->os->version = new Version([ 'value' => '5' ]);
|
||||
break;
|
||||
default:
|
||||
unset($this->data->os->version);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->isBrowser('Chrome')) {
|
||||
$this->data->browser->reset();
|
||||
$this->data->browser->using = new Using([ 'name' => 'Amazon WebView' ]);
|
||||
}
|
||||
|
||||
if ($this->data->browser->isUsing('Chromium WebView')) {
|
||||
$this->data->browser->using = new Using([ 'name' => 'Amazon WebView' ]);
|
||||
}
|
||||
|
||||
unset($this->data->device->flag);
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::GOOGLETV) {
|
||||
$this->data->os->name = 'Google TV';
|
||||
$this->data->os->family = new Family([ 'name' => 'Android' ]);
|
||||
|
||||
unset($this->data->os->version);
|
||||
unset($this->data->device->flag);
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::ANDROIDTV) {
|
||||
$this->data->os->name = 'Android TV';
|
||||
$this->data->os->family = new Family([ 'name' => 'Android' ]);
|
||||
unset($this->data->device->flag);
|
||||
unset($this->data->device->series);
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::ANDROIDWEAR) {
|
||||
$this->data->os->name = 'Android Wear';
|
||||
$this->data->os->family = new Family([ 'name' => 'Android' ]);
|
||||
unset($this->data->os->version);
|
||||
unset($this->data->device->flag);
|
||||
|
||||
if ($this->data->browser->isUsing('Chrome Content Shell')) {
|
||||
$this->data->browser->name = 'Wear Internet Browser';
|
||||
$this->data->browser->using = null;
|
||||
}
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::GOOGLEGLASS) {
|
||||
$this->data->os->family = new Family([ 'name' => 'Android' ]);
|
||||
unset($this->data->os->name);
|
||||
unset($this->data->os->version);
|
||||
unset($this->data->device->flag);
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::UIQ) {
|
||||
unset($this->data->device->flag);
|
||||
|
||||
if (!$this->data->isOs('UIQ')) {
|
||||
$this->data->os->name = 'UIQ';
|
||||
unset($this->data->os->version);
|
||||
}
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::S60) {
|
||||
unset($this->data->device->flag);
|
||||
|
||||
if (!$this->data->isOs('Series60')) {
|
||||
$this->data->os->name = 'Series60';
|
||||
unset($this->data->os->version);
|
||||
}
|
||||
}
|
||||
|
||||
if ($flag == Constants\Flag::MOAPS) {
|
||||
unset($this->data->device->flag);
|
||||
$this->data->os->name = 'MOAP(S)';
|
||||
unset($this->data->os->version);
|
||||
}
|
||||
}
|
||||
|
||||
private function deriveBasedOnOperatingSystem()
|
||||
{
|
||||
/* Derive the default browser on Windows Mobile */
|
||||
|
||||
if ($this->data->os->name == 'Windows Mobile' && $this->data->isBrowser('Internet Explorer')) {
|
||||
$this->data->browser->name = 'Mobile Internet Explorer';
|
||||
}
|
||||
|
||||
/* Derive the default browser on Android */
|
||||
|
||||
if ($this->data->os->name == 'Android' && !isset($this->data->browser->using) && !isset($this->data->browser->name) && $this->data->browser->stock) {
|
||||
$this->data->browser->name = 'Android Browser';
|
||||
}
|
||||
|
||||
/* Derive the default browser on Google TV */
|
||||
|
||||
if ($this->data->os->name == 'Google TV' && !isset($this->data->browser->name) && $this->data->browser->stock) {
|
||||
$this->data->browser->name = 'Chrome';
|
||||
}
|
||||
|
||||
/* Derive the default browser on BlackBerry */
|
||||
|
||||
if ($this->data->os->name == 'BlackBerry' && !isset($this->data->browser->name) && $this->data->browser->stock) {
|
||||
$this->data->browser->name = 'BlackBerry Browser';
|
||||
$this->data->browser->hidden = true;
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'BlackBerry OS' && !isset($this->data->browser->name) && $this->data->browser->stock) {
|
||||
$this->data->browser->name = 'BlackBerry Browser';
|
||||
$this->data->browser->hidden = true;
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'BlackBerry Tablet OS' && !isset($this->data->browser->name) && $this->data->browser->stock) {
|
||||
$this->data->browser->name = 'BlackBerry Browser';
|
||||
$this->data->browser->hidden = true;
|
||||
}
|
||||
|
||||
/* Derive the default browser on Tizen */
|
||||
|
||||
if ($this->data->os->name == 'Tizen' && !isset($this->data->browser->name) && $this->data->browser->stock && in_array($this->data->device->type, [ Constants\DeviceType::MOBILE, Constants\DeviceType::APPLIANCE ])) {
|
||||
$this->data->browser->name = 'Samsung Browser';
|
||||
}
|
||||
|
||||
/* Derive the default browser on Aliyun OS */
|
||||
|
||||
if ($this->data->os->name == 'Aliyun OS' && !isset($this->data->browser->using) && !isset($this->data->browser->name) && $this->data->browser->stock) {
|
||||
$this->data->browser->name = 'Aliyun Browser';
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'Aliyun OS' && $this->data->browser->isUsing('Chrome Content Shell')) {
|
||||
$this->data->browser->name = 'Aliyun Browser';
|
||||
$this->data->browser->using = null;
|
||||
$this->data->browser->stock = true;
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'Aliyun OS' && $this->data->browser->stock) {
|
||||
$this->data->browser->hidden = true;
|
||||
}
|
||||
|
||||
/* Derive OS/2 nickname */
|
||||
|
||||
if ($this->data->os->name == 'OS/2') {
|
||||
if (!empty($this->data->os->version)) {
|
||||
if ($this->data->os->version->is('>', '2')) {
|
||||
$this->data->os->version->nickname = 'Warp';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Derive HP TouchPad based on webOS and tablet */
|
||||
|
||||
if ($this->data->os->name == 'webOS' && $this->data->device->type == Constants\DeviceType::TABLET) {
|
||||
$this->data->device->manufacturer = 'HP';
|
||||
$this->data->device->model = 'TouchPad';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
}
|
||||
|
||||
/* Derive Windows 10 Mobile edition */
|
||||
|
||||
if ($this->data->os->name == 'Windows Phone') {
|
||||
if (!empty($this->data->os->version)) {
|
||||
if ($this->data->os->version->is('=', '10')) {
|
||||
$this->data->os->alias = 'Windows';
|
||||
$this->data->os->edition = 'Mobile';
|
||||
$this->data->os->version->alias = '10';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Derive manufacturer and model based on MacOS or OS X */
|
||||
|
||||
if ($this->data->os->name == 'OS X' || $this->data->os->name == 'Mac OS') {
|
||||
if (empty($this->data->device->model)) {
|
||||
$this->data->device->manufacturer = 'Apple';
|
||||
$this->data->device->model = 'Macintosh';
|
||||
$this->data->device->identified |= Constants\Id::INFER;
|
||||
$this->data->device->hidden = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Derive manufacturer and model based on MacOS or OS X */
|
||||
|
||||
if ($this->data->os->name == 'iOS') {
|
||||
if (empty($this->data->device->model)) {
|
||||
$this->data->device->manufacturer = 'Apple';
|
||||
$this->data->device->identified |= Constants\Id::INFER;
|
||||
$this->data->device->hidden = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Derive iOS and OS X aliases */
|
||||
|
||||
if ($this->data->os->name == 'iOS') {
|
||||
if (!empty($this->data->os->version)) {
|
||||
if ($this->data->os->version->is('<', '4')) {
|
||||
$this->data->os->alias = 'iPhone OS';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->os->name == 'OS X') {
|
||||
if (!empty($this->data->os->version)) {
|
||||
if ($this->data->os->version->is('<', '10.7')) {
|
||||
$this->data->os->alias = 'Mac OS X';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('>=', '10.12')) {
|
||||
$this->data->os->alias = 'macOS';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.7')) {
|
||||
$this->data->os->version->nickname = 'Lion';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.8')) {
|
||||
$this->data->os->version->nickname = 'Mountain Lion';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.9')) {
|
||||
$this->data->os->version->nickname = 'Mavericks';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.10')) {
|
||||
$this->data->os->version->nickname = 'Yosemite';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.11')) {
|
||||
$this->data->os->version->nickname = 'El Capitan';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.12')) {
|
||||
$this->data->os->version->nickname = 'Sierra';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.13')) {
|
||||
$this->data->os->version->nickname = 'High Sierra';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.14')) {
|
||||
$this->data->os->version->nickname = 'Mojave';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('10.15')) {
|
||||
$this->data->os->version->nickname = 'Catalina';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('11')) {
|
||||
$this->data->os->version->nickname = 'Big Sur';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('12')) {
|
||||
$this->data->os->version->nickname = 'Monterey';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('13')) {
|
||||
$this->data->os->version->nickname = 'Ventura';
|
||||
}
|
||||
|
||||
if ($this->data->os->version->is('14')) {
|
||||
$this->data->os->version->nickname = 'Sonoma';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+150
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Parser;
|
||||
|
||||
trait Header
|
||||
{
|
||||
private function &analyseHeaders()
|
||||
{
|
||||
/* Analyse the main useragent header */
|
||||
|
||||
if ($header = $this->getHeader('User-Agent')) {
|
||||
$this->analyseUserAgent($header);
|
||||
}
|
||||
|
||||
|
||||
/* Analyse secondary useragent headers */
|
||||
|
||||
if ($header = $this->getHeader('X-Original-User-Agent')) {
|
||||
$this->additionalUserAgent($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('X-Device-User-Agent')) {
|
||||
$this->additionalUserAgent($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('Device-Stock-UA')) {
|
||||
$this->additionalUserAgent($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('X-OperaMini-Phone-UA')) {
|
||||
$this->additionalUserAgent($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('X-UCBrowser-Device-UA')) {
|
||||
$this->additionalUserAgent($header);
|
||||
}
|
||||
|
||||
|
||||
/* Analyse browser specific headers */
|
||||
|
||||
if ($header = $this->getHeader('X-OperaMini-Phone')) {
|
||||
$this->analyseOperaMiniPhone($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('X-UCBrowser-Phone-UA')) {
|
||||
$this->analyseOldUCUserAgent($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('X-UCBrowser-UA')) {
|
||||
$this->analyseNewUCUserAgent($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('X-Puffin-UA')) {
|
||||
$this->analysePuffinUserAgent($header);
|
||||
}
|
||||
|
||||
if ($header = $this->getHeader('Baidu-FlyFlow')) {
|
||||
$this->analyseBaiduHeader($header);
|
||||
}
|
||||
|
||||
|
||||
/* Analyse Android WebView browser ids */
|
||||
|
||||
if ($header = $this->getHeader('X-Requested-With')) {
|
||||
$this->analyseBrowserId($header);
|
||||
}
|
||||
|
||||
|
||||
/* Analyse WAP profile header */
|
||||
|
||||
if ($header = $this->getHeader('X-Wap-Profile')) {
|
||||
$this->analyseWapProfile($header);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function analyseUserAgent($header)
|
||||
{
|
||||
new Header\Useragent($header, $this->data, $this->options);
|
||||
}
|
||||
|
||||
private function analyseBaiduHeader($header)
|
||||
{
|
||||
new Header\Baidu($header, $this->data);
|
||||
}
|
||||
|
||||
private function analyseOperaMiniPhone($header)
|
||||
{
|
||||
new Header\OperaMini($header, $this->data);
|
||||
}
|
||||
|
||||
private function analyseBrowserId($header)
|
||||
{
|
||||
new Header\BrowserId($header, $this->data);
|
||||
}
|
||||
|
||||
private function analysePuffinUserAgent($header)
|
||||
{
|
||||
new Header\Puffin($header, $this->data);
|
||||
}
|
||||
|
||||
private function analyseNewUCUserAgent($header)
|
||||
{
|
||||
new Header\UCBrowserNew($header, $this->data);
|
||||
}
|
||||
|
||||
private function analyseOldUCUserAgent($header)
|
||||
{
|
||||
new Header\UCBrowserOld($header, $this->data);
|
||||
}
|
||||
|
||||
private function analyseWapProfile($header)
|
||||
{
|
||||
new Header\Wap($header, $this->data);
|
||||
}
|
||||
|
||||
|
||||
private function additionalUserAgent($ua)
|
||||
{
|
||||
$extra = new Parser($ua);
|
||||
|
||||
if ($extra->device->type != Constants\DeviceType::DESKTOP) {
|
||||
if (isset($extra->os->name)) {
|
||||
$this->data->os = $extra->os;
|
||||
}
|
||||
|
||||
if ($extra->device->identified) {
|
||||
$this->data->device = $extra->device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function getHeader($h)
|
||||
{
|
||||
/* Find the header that matches */
|
||||
foreach ($this->headers as $k => $v) {
|
||||
if (strtolower($h) == strtolower($k)) {
|
||||
/* And return the first 1024 bytes */
|
||||
return substr($v, 0, 1024);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
class Baidu
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($header, &$data)
|
||||
{
|
||||
$this->data =& $data;
|
||||
|
||||
if (!isset($this->data->browser->name) || $this->data->browser->name != 'Baidu Browser') {
|
||||
$this->data->browser->name = 'Baidu Browser';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->stock = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Model\Using;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
class BrowserId
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($header, &$data)
|
||||
{
|
||||
if ($header == 'XMLHttpRequest') {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->data =& $data;
|
||||
|
||||
/* The X-Requested-With header is send by the WebView, so our browser name is Chrome it is probably the Chromium WebView which is sometimes misidentified. */
|
||||
|
||||
if (isset($this->data->browser->name) && $this->data->browser->name == 'Chrome') {
|
||||
$version = $this->data->browser->getVersion();
|
||||
|
||||
$this->data->browser->reset();
|
||||
$this->data->browser->using = new Using([ 'name' => 'Chromium WebView', 'version' => new Version([ 'value' => explode('.', $version)[0] ]) ]);
|
||||
}
|
||||
|
||||
/* Detect the correct browser based on the header */
|
||||
|
||||
$browser = Data\BrowserIds::identify($header);
|
||||
if ($browser) {
|
||||
if (!isset($this->data->browser->name)) {
|
||||
$this->data->browser->name = $browser;
|
||||
} else {
|
||||
if (substr($this->data->browser->name, 0, strlen($browser)) != $browser) {
|
||||
$this->data->browser->name = $browser;
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->stock = false;
|
||||
} else {
|
||||
$this->data->browser->name = $browser;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* The X-Requested-With header is only send from Android devices */
|
||||
|
||||
if (!isset($this->data->os->name) || ($this->data->os->name != 'Android' && (!isset($this->data->os->family) || $this->data->os->family->getName() != 'Android'))) {
|
||||
$this->data->os->name = 'Android';
|
||||
$this->data->os->alias = null;
|
||||
$this->data->os->version = null;
|
||||
|
||||
$this->data->device->manufacturer = null;
|
||||
$this->data->device->model = null;
|
||||
$this->data->device->identified = Constants\Id::NONE;
|
||||
|
||||
if ($this->data->device->type != Constants\DeviceType::MOBILE && $this->data->device->type != Constants\DeviceType::TABLET) {
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
}
|
||||
}
|
||||
|
||||
/* The X-Requested-With header is send by the WebKit or Chromium Webview */
|
||||
|
||||
if (!isset($this->data->engine->name) || ($this->data->engine->name != 'Webkit' && $this->data->engine->name != 'Blink')) {
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
class OperaMini
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($header, &$data)
|
||||
{
|
||||
$this->data =& $data;
|
||||
|
||||
$parts = explode(' # ', $header);
|
||||
$manufacturer = isset($parts[0]) ? $parts[0] : '';
|
||||
$model = isset($parts[1]) ? $parts[1] : '';
|
||||
|
||||
if ($manufacturer != '?' && $model != '?') {
|
||||
if ($this->data->device->identified < Constants\Id::PATTERN) {
|
||||
if ($this->identifyBasedOnModel($model)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->data->device->manufacturer = $manufacturer;
|
||||
$this->data->device->model = $model;
|
||||
$this->data->device->identified = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function identifyBasedOnModel($model)
|
||||
{
|
||||
$device = Data\DeviceModels::identify('bada', $model);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'Bada') {
|
||||
$this->data->os->name = 'Bada';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$device = Data\DeviceModels::identify('blackberry', $model);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'BlackBerry OS') {
|
||||
$this->data->os->name = 'BlackBerry OS';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$device = Data\DeviceModels::identify('wm', $model);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'Windows Mobile') {
|
||||
$this->data->os->name = 'Windows Mobile';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
use WhichBrowser\Data;
|
||||
|
||||
class Puffin
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($header, &$data)
|
||||
{
|
||||
$this->data =& $data;
|
||||
|
||||
$parts = explode('/', $header);
|
||||
|
||||
if ($this->data->browser->name != 'Puffin') {
|
||||
$this->data->browser->name = 'Puffin';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->stock = false;
|
||||
}
|
||||
|
||||
$this->data->device->type = 'mobile';
|
||||
|
||||
if (count($parts) > 1 && $parts[0] == 'Android') {
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'Android') {
|
||||
$this->data->os->name = 'Android';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $parts[1]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
if (count($parts) > 1 && $parts[0] == 'iPhone OS') {
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'iOS') {
|
||||
$this->data->os->name = 'iOS';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
$device = Data\DeviceModels::identify('ios', $parts[1]);
|
||||
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+184
@@ -0,0 +1,184 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Model\Family;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
class UCBrowserNew
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($header, &$data)
|
||||
{
|
||||
$this->data =& $data;
|
||||
|
||||
if (preg_match('/pr\(UCBrowser/u', $header)) {
|
||||
if (!$this->data->isBrowser('UC Browser')) {
|
||||
$this->data->browser->name = 'UC Browser';
|
||||
$this->data->browser->stock = false;
|
||||
$this->data->browser->version = null;
|
||||
|
||||
if (preg_match('/pr\(UCBrowser(?:\/([0-9\.]+))/u', $header, $match)) {
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Find os */
|
||||
if (preg_match('/pf\(Java\)/u', $header)) {
|
||||
if (preg_match('/dv\(([^\)]*)\)/u', $header, $match)) {
|
||||
if ($this->identifyBasedOnModel($match[1])) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/pf\(Linux\)/u', $header) && preg_match('/ov\((?:Android )?([0-9\.]+)/u', $header, $match)) {
|
||||
$this->data->os->name = 'Android';
|
||||
$this->data->os->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
|
||||
if (preg_match('/pf\(Symbian\)/u', $header) && preg_match('/ov\(S60V([0-9])/u', $header, $match)) {
|
||||
if (!$this->data->isOs('Series60')) {
|
||||
$this->data->os->name = 'Series60';
|
||||
$this->data->os->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/pf\(Windows\)/u', $header) && preg_match('/ov\(wds ([0-9]+\.[0-9]+)/u', $header, $match)) {
|
||||
if (!$this->data->isOs('Windows Phone')) {
|
||||
$this->data->os->name = 'Windows Phone';
|
||||
|
||||
switch ($match[1]) {
|
||||
case '7.1':
|
||||
$this->data->os->version = new Version([ 'value' => '7.5' ]);
|
||||
break;
|
||||
case '8.0':
|
||||
$this->data->os->version = new Version([ 'value' => '8.0' ]);
|
||||
break;
|
||||
case '8.1':
|
||||
$this->data->os->version = new Version([ 'value' => '8.1' ]);
|
||||
break;
|
||||
case '10.0':
|
||||
$this->data->os->version = new Version([ 'value' => '10.0' ]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/pf\((?:42|44)\)/u', $header) && preg_match('/ov\((?:iPh OS )?(?:iOS )?([0-9\_]+)/u', $header, $match)) {
|
||||
if (!$this->data->isOs('iOS')) {
|
||||
$this->data->os->name = 'iOS';
|
||||
$this->data->os->version = new Version([ 'value' => str_replace('_', '.', $match[1]) ]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Find engine */
|
||||
if (preg_match('/re\(AppleWebKit\/([0-9\.]+)/u', $header, $match)) {
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
|
||||
/* Find device */
|
||||
if ($this->data->isOs('Android')) {
|
||||
if (preg_match('/dv\((.*)\)/uU', $header, $match)) {
|
||||
$match[1] = preg_replace("/\s+Build/u", '', $match[1]);
|
||||
$device = Data\DeviceModels::identify('android', $match[1]);
|
||||
|
||||
if ($device) {
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->isOs('Series60')) {
|
||||
if (preg_match('/dv\((?:Nokia)?([^\)]*)\)/iu', $header, $match)) {
|
||||
$device = Data\DeviceModels::identify('symbian', $match[1]);
|
||||
|
||||
if ($device) {
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->isOs('Windows Phone')) {
|
||||
if (preg_match('/dv\(([^\)]*)\)/u', $header, $match)) {
|
||||
$device = Data\DeviceModels::identify('wp', substr(strstr($match[1], ' '), 1));
|
||||
|
||||
if ($device) {
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->data->isOs('iOS')) {
|
||||
if (preg_match('/dv\(([^\)]*)\)/u', $header, $match)) {
|
||||
$device = Data\DeviceModels::identify('ios', $match[1]);
|
||||
|
||||
if ($device) {
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function identifyBasedOnModel($model)
|
||||
{
|
||||
$model = preg_replace('/^Nokia/iu', '', $model);
|
||||
|
||||
$device = Data\DeviceModels::identify('symbian', $model);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'Series60') {
|
||||
$this->data->os->name = 'Series60';
|
||||
$this->data->os->version = null;
|
||||
$this->data->os->family = new Family([ 'name' => 'Symbian' ]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$device = Data\DeviceModels::identify('s40', $model);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'Series40') {
|
||||
$this->data->os->name = 'Series40';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$device = Data\DeviceModels::identify('bada', $model);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'Bada') {
|
||||
$this->data->os->name = 'Bada';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$device = Data\DeviceModels::identify('touchwiz', $model);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
|
||||
if (!isset($this->data->os->name) || $this->data->os->name != 'Touchwiz') {
|
||||
$this->data->os->name = 'Touchwiz';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
use WhichBrowser\Parser;
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
class UCBrowserOld
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($header, &$data)
|
||||
{
|
||||
$this->data =& $data;
|
||||
|
||||
if ($this->data->device->type == Constants\DeviceType::DESKTOP) {
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$this->data->os->reset();
|
||||
}
|
||||
|
||||
if (!isset($this->data->browser->name) || $this->data->browser->name != 'UC Browser') {
|
||||
$this->data->browser->name = 'UC Browser';
|
||||
$this->data->browser->version = null;
|
||||
}
|
||||
|
||||
$this->data->browser->mode = 'proxy';
|
||||
$this->data->engine->reset([ 'name' => 'Gecko' ]);
|
||||
|
||||
$extra = new Parser([ 'headers' => [ 'User-Agent' => $header ]]);
|
||||
|
||||
if ($extra->device->type != Constants\DeviceType::DESKTOP) {
|
||||
if ($extra->os->getName() !== '' && ($this->data->os->getName() === '' || $extra->os->getVersion() !== '')) {
|
||||
$this->data->os = $extra->os;
|
||||
}
|
||||
if ($extra->device->identified) {
|
||||
$this->data->device = $extra->device;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
class Useragent
|
||||
{
|
||||
use Useragent\Os, Useragent\Device, Useragent\Browser, Useragent\Application, Useragent\Using, Useragent\Engine, Useragent\Bot;
|
||||
|
||||
private $data;
|
||||
|
||||
private $options;
|
||||
|
||||
public function __construct($header, &$data, &$options)
|
||||
{
|
||||
$this->data =& $data;
|
||||
$this->options =& $options;
|
||||
|
||||
/* Make sure we do not have a duplicate concatenated useragent string */
|
||||
|
||||
$header = preg_replace("/^(Mozilla\/[0-9]\.[0-9].{20,})\s+Mozilla\/[0-9]\.[0-9].*$/iu", '$1', $header);
|
||||
|
||||
/* Detect the basic information */
|
||||
|
||||
$this->detectOperatingSystem($header)
|
||||
->detectDevice($header)
|
||||
->detectBrowser($header)
|
||||
->detectApplication($header)
|
||||
->detectUsing($header)
|
||||
->detectEngine($header);
|
||||
|
||||
/* Detect bots */
|
||||
|
||||
if (!isset($this->options->detectBots) || $this->options->detectBots === true) {
|
||||
$this->detectBot($header);
|
||||
}
|
||||
|
||||
/* Refine some of the information */
|
||||
|
||||
$this->refineBrowser($header)
|
||||
->refineOperatingSystem($header);
|
||||
}
|
||||
|
||||
private function removeKnownPrefixes($ua)
|
||||
{
|
||||
$ua = preg_replace('/^OneBrowser\/[0-9.]+\//', '', $ua);
|
||||
$ua = preg_replace('/^MQQBrowser\/[0-9.]+\//', '', $ua);
|
||||
return $ua;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,497 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Model\Family;
|
||||
use WhichBrowser\Model\Using;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Application
|
||||
{
|
||||
private function &detectApplication($ua)
|
||||
{
|
||||
/* Detect applications */
|
||||
$this->detectSpecificApplications($ua);
|
||||
$this->detectRemainingApplications($ua);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function detectSpecificApplications($ua)
|
||||
{
|
||||
/* Sony Updatecenter */
|
||||
|
||||
if (preg_match('/^(.*) Build\/.* (?:com.sonyericsson.updatecenter|UpdateCenter)\/[A-Z0-9\.]+$/iu', $ua, $match)) {
|
||||
$this->data->browser->name = 'Sony Update Center';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android'
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[1];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[1]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Sony Select SDK */
|
||||
|
||||
if (preg_match('/Android [0-9\.]+; (.*) Sony\/.*SonySelectSDK\/([0-9\.]+)/iu', $ua, $match)) {
|
||||
$this->data->browser->reset();
|
||||
$this->data->browser->type = Constants\BrowserType::APP;
|
||||
$this->data->browser->using = new \WhichBrowser\Model\Using([
|
||||
'name' => 'Sony Select SDK',
|
||||
'version' => new Version([ 'value' => $match[2], 'details' => 2 ])
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[1];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[1]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Samsung Mediahub */
|
||||
|
||||
if (preg_match('/^Stamhub [^\/]+\/([^;]+);.*:([0-9\.]+)\/[^\/]+\/[^:]+:user\/release-keys$/iu', $ua, $match)) {
|
||||
$this->data->browser->name = 'Mediahub';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP_MEDIAPLAYER;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[2] ])
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[1];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[1]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* "Android Application" */
|
||||
|
||||
if (preg_match('/Android Application/iu', $ua)) {
|
||||
if (preg_match('/^(.+) Android Application \([0-9]+, .+ v[0-9\.]+\) - [a-z-]+ (.*) [a-z_-]+ - [0-9A-F]{8,8}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{12,12}$/iu', $ua, $match)) {
|
||||
$this->data->browser->name = $match[1];
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android'
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[2];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/^(.+) Android Application - (.*) Build\/(.+) - [0-9A-F]{8,8}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{4,4}-[0-9A-F]{12,12}$/iu', $ua, $match)) {
|
||||
$this->data->browser->name = $match[1];
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android'
|
||||
]);
|
||||
|
||||
$version = Data\BuildIds::identify($match[3]);
|
||||
if ($version) {
|
||||
$this->data->os->version = $version;
|
||||
}
|
||||
|
||||
$this->data->device->model = $match[2];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/^(.+) Android Application - [a-z-]+ (.*) [a-z_-]+$/iu', $ua, $match)) {
|
||||
$this->data->browser->name = $match[1];
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android'
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[2];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* AiMeiTuan */
|
||||
|
||||
if (preg_match('/^AiMeiTuan \/[^\-]+\-([0-9\.]+)\-(.*)\-[0-9]+x[0-9]+\-/iu', $ua, $match)) {
|
||||
$this->data->browser->name = 'AiMeiTuan';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[1] ])
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[2];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Instagram */
|
||||
|
||||
if (preg_match('/^Instagram ([0-9\.]+) Android (?:IC )?\([0-9]+\/([0-9\.]+); [0-9]+dpi; [0-9]+x[0-9]+; [^;]+; ([^;]*);/iu', $ua, $match)) {
|
||||
$this->data->browser->name = 'Instagram';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1] ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[2] ])
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[3];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[3]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Pinterest */
|
||||
|
||||
if (preg_match('/^Pinterest for Android( Tablet)?\/([0-9\.]+) \(([^;]+); ([0-9\.]+)\)/iu', $ua, $match)) {
|
||||
$this->data->browser->name = 'Pinterest';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[2] ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[4] ])
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[3];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = $match[1] == ' Tablet' ? Constants\DeviceType::TABLET : Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[3]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Dr. Web Anti-Virus */
|
||||
|
||||
if (preg_match('/Dr\.Web anti\-virus Light Version: ([0-9\.]+) Device model: (.*) Firmware version: ([0-9\.]+)/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Dr. Web Light';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_ANTIVIRUS;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[3] ])
|
||||
]);
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Google Earth */
|
||||
|
||||
if (preg_match('/GoogleEarth\/([0-9\.]+)\(Android;Android \((.+)\-[^\-]+\-user-([0-9\.]+)\);/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Google Earth';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[3] ])
|
||||
]);
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Groupon */
|
||||
|
||||
if (preg_match('/Groupon\/([0-9\.]+) \(Android ([0-9\.]+); [^\/]+ \/ [A-Z][a-z]+ ([^;]*);/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Groupon';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_SHOPPING;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[2] ])
|
||||
]);
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
$this->data->device->model = $match[3];
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[3]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Whatsapp */
|
||||
|
||||
if (preg_match('/WhatsApp\+?\/([0-9\.]+) (Android|S60Version|WP7)\/([0-9\.\_]+) Device\/([^\-]+)\-(.*)(?:-\([0-9]+\.[0-9]+\))?(?:\-H[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)?$/uU', $ua, $match)) {
|
||||
$this->data->browser->name = 'WhatsApp';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_CHAT;
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
$this->data->device->manufacturer = $match[4];
|
||||
$this->data->device->model = $match[5];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
|
||||
if ($match[2] == 'Android') {
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => str_replace('_', '.', $match[3]) ])
|
||||
]);
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[5]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
if ($match[2] == 'WP7') {
|
||||
$this->data->os->reset([
|
||||
'name' => 'Windows Phone',
|
||||
'version' => new Version([ 'value' => $match[3], 'details' => 2 ])
|
||||
]);
|
||||
|
||||
$device = Data\DeviceModels::identify('wp', $match[5]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
if ($match[2] == 'S60Version') {
|
||||
$this->data->os->reset([
|
||||
'name' => 'Series60',
|
||||
'version' => new Version([ 'value' => $match[3] ]),
|
||||
'family' => new Family([ 'name' => 'Symbian' ])
|
||||
]);
|
||||
|
||||
$device = Data\DeviceModels::identify('symbian', $match[5]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
if ($match[2] == 'WP7') {
|
||||
$this->data->os->reset([
|
||||
'name' => 'Windows Phone',
|
||||
'version' => new Version([ 'value' => $match[3], 'details' => 2 ])
|
||||
]);
|
||||
|
||||
$device = Data\DeviceModels::identify('wp', $match[5]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Yahoo */
|
||||
|
||||
if (preg_match('/YahooMobile(?:Messenger|Mail|Weather)\/1.0 \(Android (Messenger|Mail|Weather); ([0-9\.]+)\) \([^;]+; ?[^;]+; ?([^;]+); ?([0-9\.]+)\/[^\;\)\/]+\)/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Yahoo ' . $match[1];
|
||||
$this->data->browser->version = new Version([ 'value' => $match[2], 'details' => 3 ]);
|
||||
|
||||
switch ($match[1]) {
|
||||
case 'Messenger':
|
||||
$this->data->browser->type = Constants\BrowserType::APP_CHAT;
|
||||
break;
|
||||
case 'Mail':
|
||||
$this->data->browser->type = Constants\BrowserType::APP_EMAIL;
|
||||
break;
|
||||
case 'Weather':
|
||||
$this->data->browser->type = Constants\BrowserType::APP_NEWS;
|
||||
break;
|
||||
}
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[4] ])
|
||||
]);
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[3]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Yahoo Mobile App */
|
||||
|
||||
if (preg_match('/YahooJMobileApp\/[0-9\.]+ \(Android [a-z]+; ([0-9\.]+)\) \([^;]+; ?[^;]+; ?[^;]+; ?([^;]+); ?([0-9\.]+)\/[^\;\)\/]+\)/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'Yahoo Mobile';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_SEARCH;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[3] ])
|
||||
]);
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* ICQ */
|
||||
|
||||
if (preg_match('/ICQ_Android\/([0-9\.]+) \(Android; [0-9]+; ([0-9\.]+); [^;]+; ([^;]+);/u', $ua, $match)) {
|
||||
$this->data->browser->name = 'ICQ';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_CHAT;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[2] ])
|
||||
]);
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[3]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* Facebook for Android */
|
||||
|
||||
if (preg_match('/^\[FBAN\/(FB4A|PAAA);.*FBDV\/([^;]+);.*FBSV\/([0-9\.]+);/u', $ua, $match)) {
|
||||
if ($match[1] == 'FB4A') {
|
||||
$this->data->browser->name = 'Facebook';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
|
||||
}
|
||||
|
||||
if ($match[1] == 'PAAA') {
|
||||
$this->data->browser->name = 'Facebook Pages';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
|
||||
}
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[3] ])
|
||||
]);
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[2]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
/* VK */
|
||||
|
||||
if (preg_match('/^VKAndroidApp\/([0-9\.]+)-[0-9]+ \(Android ([^;]+); SDK [^;]+; [^;]+; [a-z]+ ([^;]+);/iu', $ua, $match)) {
|
||||
$this->data->browser->name = 'VK';
|
||||
$this->data->browser->version = new Version([ 'value' => $match[1], 'details' => 2 ]);
|
||||
$this->data->browser->type = Constants\BrowserType::APP_SOCIAL;
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $match[2] ])
|
||||
]);
|
||||
|
||||
$this->data->device->model = $match[3];
|
||||
$this->data->device->identified |= Constants\Id::PATTERN;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
|
||||
$device = Data\DeviceModels::identify('android', $match[3]);
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function detectRemainingApplications($ua)
|
||||
{
|
||||
if ($data = Data\Applications::identifyOther($ua)) {
|
||||
$this->data->browser->set($data['browser']);
|
||||
|
||||
if (!empty($data['device'])) {
|
||||
$this->data->device->set($data['device']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
|
||||
trait Bot
|
||||
{
|
||||
private function &detectBot($ua)
|
||||
{
|
||||
/* Detect bots based on url in the UA string */
|
||||
|
||||
if (preg_match('/\+https?:\/\//iu', $ua)) {
|
||||
$this->data->browser->reset();
|
||||
$this->data->os->reset();
|
||||
$this->data->engine->reset();
|
||||
$this->data->device->reset();
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::BOT;
|
||||
}
|
||||
|
||||
/* Detect bots based on common markers */
|
||||
|
||||
if (preg_match('/(?:Bot|Robot|Spider|Crawler)([\/\);]|$)/iu', $ua) && !preg_match('/CUBOT/iu', $ua)) {
|
||||
$this->data->browser->reset();
|
||||
$this->data->os->reset();
|
||||
$this->data->engine->reset();
|
||||
$this->data->device->reset();
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::BOT;
|
||||
}
|
||||
|
||||
/* Detect based on a predefined list or markers */
|
||||
|
||||
if ($bot = Data\Applications::identifyBot($ua)) {
|
||||
$this->data->browser = $bot;
|
||||
$this->data->os->reset();
|
||||
$this->data->engine->reset();
|
||||
$this->data->device->reset();
|
||||
|
||||
$this->data->device->type = Constants\DeviceType::BOT;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
+2516
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent;
|
||||
|
||||
trait Device
|
||||
{
|
||||
use Device\Appliance, Device\Cars, Device\Gps, Device\Gaming, Device\Ereader,
|
||||
Device\Mobile, Device\Media, Device\Television, Device\Signage,
|
||||
Device\Printer, Device\Tablet, Device\Phone, Device\Pda;
|
||||
|
||||
private function &detectDevice($ua)
|
||||
{
|
||||
$this->detectAppliance($ua);
|
||||
$this->detectCars($ua);
|
||||
$this->detectGps($ua);
|
||||
$this->detectEreader($ua);
|
||||
$this->detectGaming($ua);
|
||||
$this->detectTelevision($ua);
|
||||
$this->detectSignage($ua);
|
||||
$this->detectMedia($ua);
|
||||
$this->detectPda($ua);
|
||||
$this->detectPrinter($ua);
|
||||
$this->detectTablet($ua);
|
||||
$this->detectPhone($ua);
|
||||
$this->detectMobile($ua);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
trait Appliance
|
||||
{
|
||||
private function detectAppliance($ua)
|
||||
{
|
||||
$this->detectIOpener($ua);
|
||||
$this->detectWebLight($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Netpliance i-Opener */
|
||||
|
||||
private function detectIOpener($ua)
|
||||
{
|
||||
if (preg_match('/I-Opener [0-9.]+; Netpliance/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Netpliance',
|
||||
'model' => 'i-Opener',
|
||||
'type' => Constants\DeviceType::DESKTOP
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/* KOMATSU WebLight */
|
||||
|
||||
private function detectWebLight($ua)
|
||||
{
|
||||
if (preg_match('/KOMATSU.*WL\//u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'KOMATSU',
|
||||
'model' => 'WebLight',
|
||||
'type' => Constants\DeviceType::DESKTOP
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
trait Cars
|
||||
{
|
||||
private function detectCars($ua)
|
||||
{
|
||||
if (!preg_match('/Car/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->detectTesla($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Tesla S */
|
||||
|
||||
private function detectTesla($ua)
|
||||
{
|
||||
if (preg_match('/QtCarBrowser/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Tesla',
|
||||
'model' => 'Model S',
|
||||
'type' => Constants\DeviceType::CAR
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
trait Ereader
|
||||
{
|
||||
private function detectEreader($ua)
|
||||
{
|
||||
if (!preg_match('/(Kindle|Nook|Bookeen|Kobo|EBRD|PocketBook|Iriver)/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->detectKindle($ua);
|
||||
$this->detectNook($ua);
|
||||
$this->detectBookeen($ua);
|
||||
$this->detectKobo($ua);
|
||||
$this->detectSonyreader($ua);
|
||||
$this->detectPocketbook($ua);
|
||||
$this->detectIriver($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Amazon Kindle */
|
||||
|
||||
private function detectKindle($ua)
|
||||
{
|
||||
if (preg_match('/Kindle/u', $ua) && !preg_match('/Fire/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Amazon',
|
||||
'series' => 'Kindle',
|
||||
'type' => Constants\DeviceType::EREADER
|
||||
]);
|
||||
|
||||
if (preg_match('/Kindle SkipStone/u', $ua)) {
|
||||
$this->data->device->model = 'Kindle Touch or later';
|
||||
} elseif (preg_match('/Kindle\/3.0\+/u', $ua)) {
|
||||
$this->data->device->model = 'Kindle 3 or later';
|
||||
} elseif (preg_match('/Kindle\/3.0/u', $ua)) {
|
||||
$this->data->device->model = 'Kindle 3';
|
||||
} elseif (preg_match('/Kindle\/2.5/u', $ua)) {
|
||||
$this->data->device->model = 'Kindle 2';
|
||||
} elseif (preg_match('/Kindle\/2.0/u', $ua)) {
|
||||
$this->data->device->model = 'Kindle 2';
|
||||
} elseif (preg_match('/Kindle\/1.0/u', $ua)) {
|
||||
$this->data->device->model = 'Kindle 1';
|
||||
}
|
||||
|
||||
if (!empty($this->data->device->model)) {
|
||||
$this->data->device->generic = false;
|
||||
$this->data->device->series = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Barnes & Noble Nook */
|
||||
|
||||
private function detectNook($ua)
|
||||
{
|
||||
if (preg_match('/nook browser/u', $ua)) {
|
||||
$this->data->os->reset([ 'name' => 'Android' ]);
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Barnes & Noble',
|
||||
'series' => 'NOOK',
|
||||
'type' => Constants\DeviceType::EREADER
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Bookeen */
|
||||
|
||||
private function detectBookeen($ua)
|
||||
{
|
||||
if (preg_match('/bookeen\/cybook/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Bookeen',
|
||||
'series' => 'Cybook',
|
||||
'type' => Constants\DeviceType::EREADER
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Kobo */
|
||||
|
||||
private function detectKobo($ua)
|
||||
{
|
||||
if (preg_match('/Kobo (eReader|Touch)/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Kobo',
|
||||
'series' => 'eReader',
|
||||
'type' => Constants\DeviceType::EREADER
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sony Reader */
|
||||
|
||||
private function detectSonyreader($ua)
|
||||
{
|
||||
if (preg_match('/EBRD([0-9]+)/u', $ua, $match)) {
|
||||
$model = null;
|
||||
|
||||
switch ($match[1]) {
|
||||
case '1101':
|
||||
$model = 'PRS-T1';
|
||||
break;
|
||||
case '1102':
|
||||
$model = 'PRS-G1';
|
||||
break;
|
||||
case '1201':
|
||||
$model = 'PRS-T2';
|
||||
break;
|
||||
case '1301':
|
||||
$model = 'PRS-T3';
|
||||
break;
|
||||
}
|
||||
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => $model,
|
||||
'series' => 'Reader',
|
||||
'type' => Constants\DeviceType::EREADER
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* PocketBook */
|
||||
|
||||
private function detectPocketbook($ua)
|
||||
{
|
||||
if (preg_match('/PocketBook\/([0-9]+)/u', $ua, $match)) {
|
||||
$model = null;
|
||||
|
||||
switch ($match[1]) {
|
||||
case '515':
|
||||
$model = 'Mini';
|
||||
break;
|
||||
case '614':
|
||||
$model = 'Basic 2';
|
||||
break;
|
||||
case '622':
|
||||
$model = 'Touch';
|
||||
break;
|
||||
case '623':
|
||||
$model = 'Touch Lux';
|
||||
break;
|
||||
case '624':
|
||||
$model = 'Basic Touch';
|
||||
break;
|
||||
case '626':
|
||||
$model = 'Touch Lux 2';
|
||||
break;
|
||||
case '630':
|
||||
$model = 'Sense';
|
||||
break;
|
||||
case '631':
|
||||
$model = 'Touch HD';
|
||||
break;
|
||||
case '640':
|
||||
$model = 'Aqua';
|
||||
break;
|
||||
case '641':
|
||||
$model = 'Aqua 2';
|
||||
break;
|
||||
case '650':
|
||||
$model = 'Ultra';
|
||||
break;
|
||||
case '801':
|
||||
$model = 'Color Lux';
|
||||
break;
|
||||
case '840':
|
||||
$model = 'InkPad';
|
||||
break;
|
||||
}
|
||||
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'PocketBook',
|
||||
'model' => $model,
|
||||
'type' => Constants\DeviceType::EREADER
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* iRiver */
|
||||
|
||||
private function detectIriver($ua)
|
||||
{
|
||||
if (preg_match('/Iriver ;/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'iRiver',
|
||||
'series' => 'Story',
|
||||
'type' => Constants\DeviceType::EREADER
|
||||
]);
|
||||
|
||||
if (preg_match('/EB07/u', $ua)) {
|
||||
$this->data->device->model = 'Story HD EB07';
|
||||
$this->data->device->series = null;
|
||||
$this->data->device->generic = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,296 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Gaming
|
||||
{
|
||||
private function detectGaming($ua)
|
||||
{
|
||||
if (!preg_match('/(Nintendo|Nitro|PlayStation|PS[0-9]|Sega|Dreamcast|Xbox)/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->detectNintendo($ua);
|
||||
$this->detectPlaystation($ua);
|
||||
$this->detectXbox($ua);
|
||||
$this->detectSega($ua);
|
||||
}
|
||||
|
||||
/* Nintendo Wii and DS */
|
||||
|
||||
private function detectNintendo($ua)
|
||||
{
|
||||
/* Switch */
|
||||
|
||||
if (preg_match('/Nintendo Switch/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Nintendo',
|
||||
'model' => 'Switch',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* Wii */
|
||||
|
||||
if (preg_match('/Nintendo Wii/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Nintendo',
|
||||
'model' => 'Wii',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* Wii U */
|
||||
|
||||
if (preg_match('/Nintendo Wii ?U/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Nintendo',
|
||||
'model' => 'Wii U',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* DS */
|
||||
|
||||
if (preg_match('/Nintendo DS/u', $ua) || preg_match('/Nitro.*Opera/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Nintendo',
|
||||
'model' => 'DS',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::PORTABLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* DSi */
|
||||
|
||||
if (preg_match('/Nintendo DSi/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Nintendo',
|
||||
'model' => 'DSi',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::PORTABLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* 3DS */
|
||||
|
||||
if (preg_match('/Nintendo 3DS/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->os->identifyVersion('/Version\/([0-9.]*[0-9])/u', $ua);
|
||||
|
||||
$this->data->engine->set([
|
||||
'name' => 'WebKit'
|
||||
]);
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Nintendo',
|
||||
'model' => '3DS',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::PORTABLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* New 3DS */
|
||||
|
||||
if (preg_match('/New Nintendo 3DS/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->os->identifyVersion('/Version\/([0-9.]*[0-9])/u', $ua);
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Nintendo',
|
||||
'model' => 'New 3DS',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::PORTABLE
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sony PlayStation */
|
||||
|
||||
private function detectPlaystation($ua)
|
||||
{
|
||||
/* PlayStation Portable */
|
||||
|
||||
if (preg_match('/PlayStation Portable/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
|
||||
$this->data->engine->set([
|
||||
'name' => 'NetFront'
|
||||
]);
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => 'PlayStation Portable',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::PORTABLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* PlayStation Vita */
|
||||
|
||||
if (preg_match('/PlayStation Vita/ui', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->os->identifyVersion('/PlayStation Vita ([0-9.]*)/u', $ua);
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => 'PlayStation Vita',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::PORTABLE
|
||||
]);
|
||||
|
||||
if (preg_match('/VTE\//u', $ua)) {
|
||||
$this->data->device->model = 'PlayStation TV';
|
||||
$this->data->device->subtype = Constants\DeviceSubType::CONSOLE;
|
||||
}
|
||||
}
|
||||
|
||||
/* PlayStation 2 */
|
||||
|
||||
if (preg_match('/PlayStation2/ui', $ua) || preg_match('/\(PS2/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => 'PlayStation 2',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* PlayStation 3 */
|
||||
|
||||
if (preg_match('/PlayStation 3/ui', $ua) || preg_match('/\(PS3/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->os->identifyVersion('/PLAYSTATION 3;? ([0-9.]*)/u', $ua);
|
||||
|
||||
if (preg_match('/PLAYSTATION 3; [123]/', $ua)) {
|
||||
$this->data->engine->set([
|
||||
'name' => 'NetFront'
|
||||
]);
|
||||
}
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => 'PlayStation 3',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* PlayStation 4 */
|
||||
|
||||
if (preg_match('/PlayStation 4/ui', $ua) || preg_match('/\(PS4/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->os->identifyVersion('/PlayStation 4 ([0-9.]*)/u', $ua);
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => 'PlayStation 4',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* PlayStation 5 */
|
||||
|
||||
if (preg_match('/PlayStation 5/ui', $ua) || preg_match('/\(PS5/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->os->identifyVersion('/PlayStation 5 ([0-9.]*)/u', $ua);
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => 'PlayStation 5',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Microsoft Xbox */
|
||||
|
||||
private function detectXbox($ua)
|
||||
{
|
||||
/* Xbox One */
|
||||
if (preg_match('/Xbox One\)/u', $ua, $match)) {
|
||||
if ($this->data->isOs('Windows Phone', '=', '10')) {
|
||||
$this->data->os->name = 'Windows';
|
||||
$this->data->os->version->alias = '10';
|
||||
}
|
||||
|
||||
if (!$this->data->isOs('Windows', '=', '10')) {
|
||||
$this->data->os->reset();
|
||||
}
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Microsoft',
|
||||
'model' => 'Xbox One',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
|
||||
/* Xbox Series X */
|
||||
} elseif (preg_match('/Xbox Series X\)/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Microsoft',
|
||||
'model' => 'Xbox Series X',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
|
||||
/* Xbox 360 */
|
||||
} elseif (preg_match('/Xbox\)$/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Microsoft',
|
||||
'model' => 'Xbox 360',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sega */
|
||||
|
||||
private function detectSega($ua)
|
||||
{
|
||||
/* Sega Saturn */
|
||||
|
||||
if (preg_match('/SEGASATURN/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sega',
|
||||
'model' => 'Saturn',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
|
||||
/* Sega Dreamcast */
|
||||
|
||||
if (preg_match('/Dreamcast/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sega',
|
||||
'model' => 'Dreamcast',
|
||||
'type' => Constants\DeviceType::GAMING,
|
||||
'subtype' => Constants\DeviceSubType::CONSOLE
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
trait Gps
|
||||
{
|
||||
private function detectGps($ua)
|
||||
{
|
||||
if (!preg_match('/Nuvi/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->detectGarmin($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Garmin Nuvi */
|
||||
|
||||
private function detectGarmin($ua)
|
||||
{
|
||||
if (preg_match('/Nuvi/u', $ua) && preg_match('/Qtopia/u', $ua)) {
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Garmin',
|
||||
'model' => 'Nuvi',
|
||||
'type' => Constants\DeviceType::GPS
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Media
|
||||
{
|
||||
private function detectMedia($ua)
|
||||
{
|
||||
if (!preg_match('/(Archos|Zune|Walkman)/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->detectArchos($ua);
|
||||
$this->detectZune($ua);
|
||||
$this->detectWalkman($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Archos Generation 4, 5 and 6 */
|
||||
|
||||
private function detectArchos($ua)
|
||||
{
|
||||
/* Generation 4 */
|
||||
|
||||
if (preg_match('/Archos A([67]04)WIFI\//u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Archos',
|
||||
'model' => $match[1] . ' WiFi',
|
||||
'type' => Constants\DeviceType::MEDIA
|
||||
]);
|
||||
}
|
||||
|
||||
/* Generation 5 */
|
||||
|
||||
if (preg_match('/ARCHOS; GOGI; a([67]05f?);/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Archos',
|
||||
'model' => $match[1] . ' WiFi',
|
||||
'type' => Constants\DeviceType::MEDIA
|
||||
]);
|
||||
}
|
||||
|
||||
/* Generation 6 without Android */
|
||||
|
||||
if (preg_match('/ARCHOS; GOGI; G6-?(S|H|L|3GP);/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Archos',
|
||||
'type' => Constants\DeviceType::MEDIA
|
||||
]);
|
||||
|
||||
switch ($match[1]) {
|
||||
case '3GP':
|
||||
$this->data->device->model = '5 3G+';
|
||||
break;
|
||||
case 'S':
|
||||
case 'H':
|
||||
$this->data->device->model = '5';
|
||||
break;
|
||||
case 'L':
|
||||
$this->data->device->model = '7';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Generation 6 with Android */
|
||||
|
||||
if (preg_match('/ARCHOS; GOGI; A5[SH]; Version ([0-9]\.[0-9])/u', $ua, $match)) {
|
||||
$version = new Version([ 'value' => $match[1] ]);
|
||||
|
||||
$this->data->os->reset([
|
||||
'name' => 'Android',
|
||||
'version' => new Version([ 'value' => $version->is('<', '1.7') ? '1.5' : '1.6' ])
|
||||
]);
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Archos',
|
||||
'model' => '5',
|
||||
'type' => Constants\DeviceType::MEDIA
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Microsoft Zune */
|
||||
|
||||
private function detectZune($ua)
|
||||
{
|
||||
if (preg_match('/Microsoft ZuneHD/u', $ua)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Microsoft',
|
||||
'model' => 'Zune HD',
|
||||
'type' => Constants\DeviceType::MEDIA
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sony Walkman */
|
||||
|
||||
private function detectWalkman($ua)
|
||||
{
|
||||
if (preg_match('/Walkman\/(NW-[A-Z0-9]+)/u', $ua, $match)) {
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Sony',
|
||||
'model' => $match[1] . ' Walkman',
|
||||
'type' => Constants\DeviceType::MEDIA
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,290 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Model\Family;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Pda
|
||||
{
|
||||
private function detectPda($ua)
|
||||
{
|
||||
if (!preg_match('/(CASIO|Palm|Psion|pdQ|COM|airboard|sharp|pda|POCKET-E|OASYS|NTT\/PI)/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->detectCasio($ua);
|
||||
$this->detectPalm($ua);
|
||||
$this->detectPsion($ua);
|
||||
$this->detectSonyMylo($ua);
|
||||
$this->detectSonyAirboard($ua);
|
||||
$this->detectSharpZaurus($ua);
|
||||
$this->detectSharpShoin($ua);
|
||||
$this->detectPanasonicPocketE($ua);
|
||||
$this->detectFujitsuOasys($ua);
|
||||
$this->detectNttPetitWeb($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Casio */
|
||||
|
||||
private function detectCasio($ua)
|
||||
{
|
||||
if (preg_match('/Product\=CASIO\/([^\);]+)[\);]/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Casio';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
|
||||
if ($match[1] == 'CASSIOPEIA BE') {
|
||||
$this->data->device->model = 'Cassiopeia';
|
||||
}
|
||||
|
||||
if ($match[1] == 'PPP101') {
|
||||
$this->data->device->model = 'Pocket PostPet';
|
||||
$this->data->device->carrier = 'DoCoMo';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Palm */
|
||||
|
||||
private function detectPalm($ua)
|
||||
{
|
||||
if (preg_match('/PalmOS/iu', $ua, $match)) {
|
||||
$this->data->os->name = 'Palm OS';
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
|
||||
if (preg_match('/PalmOS ([0-9.]*)/iu', $ua, $match)) {
|
||||
$this->data->os->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
|
||||
if (preg_match('/; ([^;)]+)\)/u', $ua, $match)) {
|
||||
$device = Data\DeviceModels::identify('palmos', $match[1]);
|
||||
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/PalmOS\/([a-z]+)\/model ([^\/]+)\//iu', $ua, $match)) {
|
||||
$device = Data\DeviceModels::identify('palmos', $match[1] . '-' . $match[2]);
|
||||
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/Palm OS ([0-9.]*)/iu', $ua, $match)) {
|
||||
$this->data->os->name = 'Palm OS';
|
||||
$this->data->os->version = new Version([ 'value' => $match[1] ]);
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
}
|
||||
|
||||
if (preg_match('/PalmSource/u', $ua, $match)) {
|
||||
$this->data->os->name = 'Palm OS';
|
||||
$this->data->os->version = null;
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
|
||||
if (preg_match('/PalmSource\/([^;]+)/u', $ua, $match)) {
|
||||
$this->data->device->model = $match[1];
|
||||
$this->data->device->identified = Constants\Id::PATTERN;
|
||||
}
|
||||
|
||||
if (isset($this->data->device->model) && $this->data->device->model) {
|
||||
$device = Data\DeviceModels::identify('palmos', $this->data->device->model);
|
||||
|
||||
if ($device->identified) {
|
||||
$device->identified |= $this->data->device->identified;
|
||||
$this->data->device = $device;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Some model markers */
|
||||
|
||||
if (preg_match('/PalmPilot Pro/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Palm';
|
||||
$this->data->device->model = 'Pilot Professional';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
}
|
||||
|
||||
if (preg_match('/pdQbrowser/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Kyocera';
|
||||
$this->data->device->model = 'QCP-6035';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* PSION */
|
||||
|
||||
private function detectPsion($ua)
|
||||
{
|
||||
if (preg_match('/Psion Cpw\//iu', $ua, $match)) {
|
||||
$this->data->browser->name = 'WAP Browser';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::BROWSER;
|
||||
|
||||
$this->data->os->name = 'EPOC';
|
||||
$this->data->os->family = new Family([ 'name' => 'Symbian' ]);
|
||||
|
||||
$this->data->device->manufacturer = 'Psion';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
|
||||
if (preg_match('/\(([A-Z0-9]+)\)/u', $ua, $match)) {
|
||||
switch ($match[1]) {
|
||||
case 'S5':
|
||||
$this->data->device->model = 'Series 5mx';
|
||||
break;
|
||||
case 'S7':
|
||||
$this->data->device->model = 'Series 7';
|
||||
break;
|
||||
case 'RV':
|
||||
$this->data->device->model = 'Revo';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sony Mylo */
|
||||
|
||||
private function detectSonyMylo($ua)
|
||||
{
|
||||
if (preg_match('/SONY\/COM([0-9])/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Sony';
|
||||
$this->data->device->model = 'Mylo ' . $match[1];
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
|
||||
$this->data->os->reset();
|
||||
|
||||
if (preg_match('/Qt embedded/ui', $ua, $match)) {
|
||||
$this->data->os->name = 'Qtopia';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sony Airboard */
|
||||
|
||||
private function detectSonyAirboard($ua)
|
||||
{
|
||||
if (preg_match('/SONY\/airboard\/IDT-([A-Z0-9]+)/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Sony';
|
||||
$this->data->device->model = 'Airboard ' . $match[1];
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
}
|
||||
|
||||
if (preg_match('/LocationFreeTV; Airboard\/(LF-[A-Z0-9]+)/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Sony';
|
||||
$this->data->device->model = 'Airboard ' . $match[1];
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sharp Zaurus */
|
||||
|
||||
private function detectSharpZaurus($ua)
|
||||
{
|
||||
if (preg_match('/sharp pda browser\/([0-9\.]+)/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Sharp';
|
||||
$this->data->device->model = 'Zaurus';
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
|
||||
if (preg_match('/\(([A-Z0-9\-]+)\/[0-9\.]+\)/ui', $ua, $match)) {
|
||||
$this->data->device->model = 'Zaurus ' . $match[1];
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->generic = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/\(PDA; (SL-[A-Z][0-9]+)\/[0-9\.]/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Sharp';
|
||||
$this->data->device->model = 'Zaurus ' . $match[1];
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->generic = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Sharp Shoin (Word Processor) */
|
||||
|
||||
private function detectSharpShoin($ua)
|
||||
{
|
||||
if (preg_match('/sharp wd browser\/([0-9\.]+)/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Sharp';
|
||||
$this->data->device->model = 'Mobile Shoin';
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
|
||||
if (preg_match('/\(([A-Z0-9\-]+)\/[0-9\.]+\)/ui', $ua, $match)) {
|
||||
$this->data->device->model = 'Mobile Shoin ' . $match[1];
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->generic = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Panasonic POCKET・E */
|
||||
|
||||
private function detectPanasonicPocketE($ua)
|
||||
{
|
||||
if (preg_match('/Product\=Panasonic\/POCKET-E/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Panasonic';
|
||||
$this->data->device->model = 'POCKET・E';
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->generic = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Fujitsu OASYS */
|
||||
|
||||
private function detectFujitsuOasys($ua)
|
||||
{
|
||||
if (preg_match('/Fujitsu; OASYS/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'Fujitsu';
|
||||
$this->data->device->model = 'OASYS';
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->generic = false;
|
||||
|
||||
if (preg_match('/eNavigator/ui', $ua, $match)) {
|
||||
$this->data->browser->name = 'eNavigator';
|
||||
$this->data->browser->version = null;
|
||||
$this->data->browser->type = Constants\BrowserType::BROWSER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* PetitWeb */
|
||||
|
||||
private function detectNttPetitWeb($ua)
|
||||
{
|
||||
if (preg_match('/Product\=NTT\/(PI-[0-9]+)/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'NTT';
|
||||
$this->data->device->model = 'PetitWeb ' . $match[1];
|
||||
$this->data->device->type = Constants\DeviceType::PDA;
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->generic = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Phone
|
||||
{
|
||||
private function detectPhone($ua)
|
||||
{
|
||||
$this->detectNttTeless($ua);
|
||||
$this->detectSnom($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* NTT Teless */
|
||||
|
||||
private function detectNttTeless($ua)
|
||||
{
|
||||
if (preg_match('/Product\=NTT\/Teless/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'NTT';
|
||||
$this->data->device->model = 'Teless';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
$this->data->device->subtype = Constants\DeviceSubType::DESKTOP;
|
||||
}
|
||||
}
|
||||
|
||||
/* SNOM */
|
||||
|
||||
private function detectSnom($ua)
|
||||
{
|
||||
if (preg_match('/snom(.+)-SIP/ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'SNOM';
|
||||
$this->data->device->model = $match[1] . ' IP Telephone';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::MOBILE;
|
||||
$this->data->device->subtype = Constants\DeviceSubType::DESKTOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
trait Printer
|
||||
{
|
||||
private function detectPrinter($ua)
|
||||
{
|
||||
if (!preg_match('/(TASKalfa|CanonIJCL|IR-S|PrintSmart|EpsonHello)/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* TASKalfa */
|
||||
|
||||
if (preg_match('/TASKalfa ([0-9A-Z]+)/iu', $ua, $match)) {
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Kyocera',
|
||||
'model' => 'TASKalfa ' . $match[1],
|
||||
'type' => Constants\DeviceType::PRINTER
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/* Canon IJ */
|
||||
|
||||
if (preg_match('/CanonIJCL/iu', $ua, $match)) {
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Canon',
|
||||
'model' => 'IJ Printer',
|
||||
'type' => Constants\DeviceType::PRINTER
|
||||
]);
|
||||
}
|
||||
|
||||
/* Canon iR S */
|
||||
|
||||
if (preg_match('/IR-S/iu', $ua, $match)) {
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Canon',
|
||||
'model' => 'imageRUNNER',
|
||||
'type' => Constants\DeviceType::PRINTER
|
||||
]);
|
||||
}
|
||||
|
||||
/* HP Web PrintSmart */
|
||||
|
||||
if (preg_match('/HP Web PrintSmart/iu', $ua, $match)) {
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'HP',
|
||||
'model' => 'Web PrintSmart',
|
||||
'type' => Constants\DeviceType::PRINTER
|
||||
]);
|
||||
}
|
||||
|
||||
/* Epson Hello */
|
||||
|
||||
if (preg_match('/EpsonHello\//iu', $ua, $match)) {
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'Epson',
|
||||
'model' => 'Hello',
|
||||
'type' => Constants\DeviceType::PRINTER
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
|
||||
trait Signage
|
||||
{
|
||||
private function detectSignage($ua)
|
||||
{
|
||||
if (!preg_match('/(BrightSign|ADAPI)/ui', $ua)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* BrightSign */
|
||||
|
||||
if (preg_match('/BrightSign\/[0-9\.]+(?:-[a-z0-9\-]+)? \(([^\)]+)/u', $ua, $match)) {
|
||||
$this->data->os->reset();
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'BrightSign',
|
||||
'model' => $match[1],
|
||||
'type' => Constants\DeviceType::SIGNAGE
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/* Iadea */
|
||||
|
||||
if (preg_match('/ADAPI/u', $ua) && preg_match('/\(MODEL:([^\)]+)\)/u', $ua, $match)) {
|
||||
if (!$this->data->isOs('Android')) {
|
||||
$this->data->os->reset();
|
||||
}
|
||||
|
||||
$this->data->device->setIdentification([
|
||||
'manufacturer' => 'IAdea',
|
||||
'model' => $match[1],
|
||||
'type' => Constants\DeviceType::SIGNAGE
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent\Device;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Tablet
|
||||
{
|
||||
private function detectTablet($ua)
|
||||
{
|
||||
$this->detectWebTab($ua);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* WeTab */
|
||||
|
||||
private function detectWebTab($ua)
|
||||
{
|
||||
if (preg_match('/WeTab-Browser /ui', $ua, $match)) {
|
||||
$this->data->device->manufacturer = 'WeTab';
|
||||
$this->data->device->model = 'WeTab';
|
||||
$this->data->device->identified |= Constants\Id::MATCH_UA;
|
||||
$this->data->device->type = Constants\DeviceType::TABLET;
|
||||
|
||||
$this->data->browser->name = 'WebTab Browser';
|
||||
$this->data->browser->version = null;
|
||||
|
||||
$this->data->os->name = 'MeeGo';
|
||||
$this->data->os->version = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
+1258
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,185 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent;
|
||||
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Engine
|
||||
{
|
||||
private function &detectEngine($ua)
|
||||
{
|
||||
$this->detectWebkit($ua);
|
||||
$this->detectKHTML($ua);
|
||||
$this->detectGecko($ua);
|
||||
$this->detectServo($ua);
|
||||
$this->detectGoanna($ua);
|
||||
$this->detectPresto($ua);
|
||||
$this->detectTrident($ua);
|
||||
$this->detectEdgeHTMLUseragent($ua);
|
||||
$this->detectFlow($ua);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* WebKit */
|
||||
|
||||
private function detectWebkit($ua)
|
||||
{
|
||||
if (preg_match('/WebKit\/([0-9.]*)/iu', $ua, $match)) {
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
|
||||
if (preg_match('/(?:Chrome|Chromium)\/([0-9]*)/u', $ua, $match)) {
|
||||
if (intval($match[1]) >= 27) {
|
||||
$this->data->engine->reset([ 'name' => 'Blink' ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (preg_match('/Browser\/AppleWebKit\/?([0-9.]*)/iu', $ua, $match)) {
|
||||
$this->data->engine->name = 'Webkit';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
|
||||
if (preg_match('/AppleWebkit\(like Gecko\)/iu', $ua, $match)) {
|
||||
$this->data->engine->name = 'Webkit';
|
||||
}
|
||||
|
||||
if (preg_match('/CoralWebkit/iu', $ua, $match)) {
|
||||
$this->data->engine->version = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* KHTML */
|
||||
|
||||
private function detectKHTML($ua)
|
||||
{
|
||||
if (preg_match('/KHTML\/([0-9.]*)/u', $ua, $match)) {
|
||||
$this->data->engine->name = 'KHTML';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Gecko */
|
||||
|
||||
private function detectGecko($ua)
|
||||
{
|
||||
if (preg_match('/Gecko/u', $ua) && !preg_match('/like Gecko/iu', $ua)) {
|
||||
$this->data->engine->name = 'Gecko';
|
||||
|
||||
if (preg_match('/; rv:([^\);]+)[\);]/u', $ua, $match)) {
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1], 'details' => 3 ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Servo */
|
||||
|
||||
private function detectServo($ua)
|
||||
{
|
||||
if (preg_match('/Servo\/([0-9.]*)/u', $ua, $match)) {
|
||||
$this->data->engine->name = 'Servo';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Goanna */
|
||||
|
||||
private function detectGoanna($ua)
|
||||
{
|
||||
if (preg_match('/Goanna/u', $ua)) {
|
||||
$this->data->engine->name = 'Goanna';
|
||||
|
||||
if (preg_match('/Goanna\/([0-9]\.[0-9.]+)/u', $ua, $match)) {
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
|
||||
if (preg_match('/Goanna\/20[0-9]{6,6}/u', $ua) && preg_match('/; rv:([^\);]+)[\);]/u', $ua, $match)) {
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Presto */
|
||||
|
||||
private function detectPresto($ua)
|
||||
{
|
||||
if (preg_match('/Presto\/([0-9.]*)/u', $ua, $match)) {
|
||||
$this->data->engine->name = 'Presto';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Trident */
|
||||
|
||||
private function detectTrident($ua)
|
||||
{
|
||||
if (preg_match('/Trident\/([0-9.]*)/u', $ua, $match)) {
|
||||
$this->data->engine->name = 'Trident';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
|
||||
|
||||
if (isset($this->data->browser->version) && isset($this->data->browser->name) && $this->data->browser->name == 'Internet Explorer') {
|
||||
if ($this->data->engine->version->toNumber() >= 7 && $this->data->browser->version->toFloat() < 11) {
|
||||
$this->data->browser->version = new Version([ 'value' => '11.0' ]);
|
||||
$this->data->browser->mode = 'compat';
|
||||
}
|
||||
|
||||
if ($this->data->engine->version->toNumber() == 6 && $this->data->browser->version->toFloat() < 10) {
|
||||
$this->data->browser->version = new Version([ 'value' => '10.0' ]);
|
||||
$this->data->browser->mode = 'compat';
|
||||
}
|
||||
|
||||
if ($this->data->engine->version->toNumber() == 5 && $this->data->browser->version->toFloat() < 9) {
|
||||
$this->data->browser->version = new Version([ 'value' => '9.0' ]);
|
||||
$this->data->browser->mode = 'compat';
|
||||
}
|
||||
|
||||
if ($this->data->engine->version->toNumber() == 4 && $this->data->browser->version->toFloat() < 8) {
|
||||
$this->data->browser->version = new Version([ 'value' => '8.0' ]);
|
||||
$this->data->browser->mode = 'compat';
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($this->data->os->version) && isset($this->data->os->name) && $this->data->os->name == 'Windows Phone' && isset($this->data->browser->name) && $this->data->browser->name == 'Mobile Internet Explorer') {
|
||||
if ($this->data->engine->version->toNumber() == 7 && $this->data->os->version->toFloat() < 8.1) {
|
||||
$this->data->os->version = new Version([ 'value' => '8.1', 'details' => 2 ]);
|
||||
}
|
||||
|
||||
if ($this->data->engine->version->toNumber() == 5 && $this->data->os->version->toFloat() < 7.5) {
|
||||
$this->data->os->version = new Version([ 'value' => '7.5', 'details' => 2 ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* EdgeHTML */
|
||||
|
||||
private function detectEdgeHTMLUseragent($ua)
|
||||
{
|
||||
if (preg_match('/Edge\/([0-9.]*)/u', $ua, $match)) {
|
||||
$this->data->engine->name = 'EdgeHTML';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1], 'hidden' => true ]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Flow */
|
||||
|
||||
private function detectFlow($ua)
|
||||
{
|
||||
if (preg_match('/EkiohFlow\/([0-9.]*)/u', $ua, $match)) {
|
||||
$this->data->engine->name = 'EkiohFlow';
|
||||
$this->data->engine->version = new Version([ 'value' => $match[1] ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
+2470
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header\Useragent;
|
||||
|
||||
use WhichBrowser\Model\Version;
|
||||
|
||||
trait Using
|
||||
{
|
||||
private function &detectUsing($ua)
|
||||
{
|
||||
if (!preg_match('/(AdobeAIR|Awesomium|Embedded|bsalsa|Canvace|Ekioh|AtomShell|Electron|JavaFX|GFXe|luakit|Titanium|OpenWebKitSharp|Prism|Qt|Reqwireless|RhoSimulator|UWebKit|nw-tests|WebKit2)/ui', $ua)) {
|
||||
return $this;
|
||||
}
|
||||
|
||||
$items = [
|
||||
[ 'name' => 'AdobeAIR', 'regexp' => '/AdobeAIR\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Awesomium', 'regexp' => '/Awesomium\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Delphi Embedded Web Browser', 'regexp' => '/EmbeddedWB ([0-9.]*)/u' ],
|
||||
[ 'name' => 'Delphi Embedded Web Browser', 'regexp' => '/bsalsa\.com/u' ],
|
||||
[ 'name' => 'Delphi Embedded Web Browser', 'regexp' => '/Embedded Web Browser/u' ],
|
||||
[ 'name' => 'Canvace', 'regexp' => '/Canvace Standalone\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Ekioh', 'regexp' => '/Ekioh\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Electron', 'regexp' => '/AtomShell\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Electron', 'regexp' => '/Electron\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'JavaFX', 'regexp' => '/JavaFX\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'GFXe', 'regexp' => '/GFXe\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'LuaKit', 'regexp' => '/luakit/u' ],
|
||||
[ 'name' => 'Titanium', 'regexp' => '/Titanium\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'OpenWebKitSharp', 'regexp' => '/OpenWebKitSharp/u' ],
|
||||
[ 'name' => 'Prism', 'regexp' => '/Prism\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Qt', 'regexp' => '/Qt\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Qt', 'regexp' => '/QtWebEngine\/([4-9][0-9.]*)?/u' ],
|
||||
[ 'name' => 'Qt', 'regexp' => '/QtEmbedded/u' ],
|
||||
[ 'name' => 'Qt', 'regexp' => '/QtEmbedded.*Qt\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'ReqwirelessWeb', 'regexp' => '/ReqwirelessWeb\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'RhoSimulator', 'regexp' => '/RhoSimulator/u' ],
|
||||
[ 'name' => 'UWebKit', 'regexp' => '/UWebKit\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'Node-WebKit', 'regexp' => '/nw-tests\/([0-9.]*)/u' ],
|
||||
[ 'name' => 'WebKit2.NET', 'regexp' => '/WebKit2.NET/u' ],
|
||||
];
|
||||
|
||||
$count = count($items);
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
if (preg_match($items[$i]['regexp'], $ua, $match)) {
|
||||
$this->data->browser->using = new \WhichBrowser\Model\Using([
|
||||
'name' => $items[$i]['name']
|
||||
]);
|
||||
|
||||
if (isset($match[1]) && $match[1]) {
|
||||
$this->data->browser->using->version = new Version([ 'value' => $match[1], 'details' => isset($items[$i]['details']) ? $items[$i]['details'] : null ]);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser\Analyser\Header;
|
||||
|
||||
use WhichBrowser\Constants;
|
||||
use WhichBrowser\Data;
|
||||
|
||||
class Wap
|
||||
{
|
||||
private $data;
|
||||
|
||||
public function __construct($header, &$data)
|
||||
{
|
||||
$this->data =& $data;
|
||||
|
||||
$header = trim($header);
|
||||
|
||||
if ($header[0] == '"') {
|
||||
$header = explode(",", $header);
|
||||
$header = trim($header[0], '"');
|
||||
}
|
||||
|
||||
$result = Data\DeviceProfiles::identify($header);
|
||||
|
||||
if ($result) {
|
||||
$this->data->device->manufacturer = $result[0];
|
||||
$this->data->device->model = $result[1];
|
||||
$this->data->device->identified |= Constants\Id::MATCH_PROF;
|
||||
|
||||
if (!empty($result[2]) && (!isset($this->data->os->name) || $this->data->os->name != $result[2])) {
|
||||
$this->data->os->name = $result[2];
|
||||
$this->data->os->version = null;
|
||||
|
||||
$this->data->engine->name = null;
|
||||
$this->data->engine->version = null;
|
||||
}
|
||||
|
||||
if (isset($result[3])) {
|
||||
$this->data->device->type = $result[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+110
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
namespace WhichBrowser;
|
||||
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
|
||||
trait Cache
|
||||
{
|
||||
private $cache;
|
||||
private $expires;
|
||||
|
||||
/**
|
||||
* @var boolean $cached Was this result retrieve from the cache?
|
||||
*/
|
||||
|
||||
public $cached = false;
|
||||
|
||||
|
||||
/**
|
||||
* Enable caching of results
|
||||
*
|
||||
* @param object $cache An PSR-6 cache pool (an object that implements Psr\Cache\CacheItemPoolInterface)
|
||||
* @param int $expires Optional the number of seconds after which a cached item expires, default is 15 minutes
|
||||
*/
|
||||
|
||||
public function setCache($cache, $expires = 900)
|
||||
{
|
||||
$this->cache = $cache;
|
||||
$this->expires = $expires;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Apply cached data to the main Parser object
|
||||
*
|
||||
* @internal
|
||||
*
|
||||
* @param array $data An array with a key for every property it needs to apply
|
||||
*/
|
||||
|
||||
private function applyCachedData($data)
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
$this->$key = $value;
|
||||
}
|
||||
|
||||
$this->cached = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the data that can be cached from the main Parser object
|
||||
*
|
||||
* @internal
|
||||
*
|
||||
* @return array An array with a key for every property that will be cached
|
||||
*/
|
||||
|
||||
private function retrieveCachedData()
|
||||
{
|
||||
return [
|
||||
'browser' => $this->browser,
|
||||
'engine' => $this->engine,
|
||||
'os' => $this->os,
|
||||
'device' => $this->device,
|
||||
'camouflage' => $this->camouflage,
|
||||
'features' => $this->features
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the result from the cache, or analyse and store in the cache
|
||||
*
|
||||
* @internal
|
||||
*
|
||||
* @param array|string $headers An array with all of the headers or a string with just the User-Agent header
|
||||
*
|
||||
* @return boolean did we actually retrieve or analyse results
|
||||
*/
|
||||
|
||||
private function analyseWithCache($headers, $options = [])
|
||||
{
|
||||
if (isset($options['cache'])) {
|
||||
if (isset($options['cacheExpires'])) {
|
||||
$this->setCache($options['cache'], $options['cacheExpires']);
|
||||
} else {
|
||||
$this->setCache($options['cache']);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->cache instanceof CacheItemPoolInterface) {
|
||||
$item = $this->cache->getItem('whichbrowser_' . md5(serialize($headers)));
|
||||
|
||||
if ($item->isHit()) {
|
||||
$this->applyCachedData($item->get());
|
||||
} else {
|
||||
$analyser = new Analyser($headers, $options);
|
||||
$analyser->setdata($this);
|
||||
$analyser->analyse();
|
||||
|
||||
$item->set($this->retrieveCachedData());
|
||||
$item->expiresAfter($this->expires);
|
||||
$this->cache->save($item);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace WhichBrowser\Constants;
|
||||
|
||||
class BrowserType
|
||||
{
|
||||
const UNKNOWN = '';
|
||||
|
||||
const BROWSER = 'browser';
|
||||
const BROWSER_TEXT = 'browser:text';
|
||||
|
||||
const APP = 'app';
|
||||
const APP_EMAIL = 'app:email';
|
||||
const APP_GAME = 'app:game';
|
||||
const APP_MEDIAPLAYER = 'app:mediaplayer';
|
||||
const APP_FEEDREADER = 'app:feedreader';
|
||||
const APP_PODCAST = 'app:podcast';
|
||||
const APP_SOCIAL = 'app:social';
|
||||
const APP_OFFICE = 'app:office';
|
||||
const APP_EDITOR = 'app:editor';
|
||||
const APP_DOWNLOAD = 'app:download';
|
||||
const APP_SEARCH = 'app:search';
|
||||
const APP_NEWS = 'app:news';
|
||||
const APP_ANTIVIRUS = 'app:antivirus';
|
||||
const APP_SHOPPING = 'app:shopping';
|
||||
const APP_CHAT = 'app:chat';
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user