Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds detection for Telly brand, adds detection for Crow Browser, Frost, Private Internet Browser, Vewd Browser and improves detection for AVG Secure Browser, DuckDuckGo Privacy Browser, Iridium #7560

Merged
merged 14 commits into from
Jan 23, 2024
Merged
2 changes: 1 addition & 1 deletion DeviceDetector.php
Original file line number Diff line number Diff line change
Expand Up @@ -1052,7 +1052,7 @@ protected function parseDevice(): void
*/
if (\in_array($clientName, [
'Kylo', 'Espial TV Browser', 'LUJO TV Browser', 'LogicUI TV Browser', 'Open TV Browser', 'Seraphic Sraf',
'Opera Devices',
'Opera Devices', 'Crow Browser', 'Vewd Browser',
])
) {
$this->device = AbstractDeviceParser::DEVICE_TYPE_TV;
Expand Down
38 changes: 29 additions & 9 deletions Parser/Client/Browser.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ class Browser extends AbstractClientParser
'C5' => 'Chromium GOST',
'CY' => 'Cyberfox',
'CS' => 'Cheshire',
'RC' => 'Crow Browser',
'CT' => 'Crusta',
'CG' => 'Craving Explorer',
'CZ' => 'Crazy Browser',
Expand Down Expand Up @@ -240,6 +241,7 @@ class Browser extends AbstractClientParser
'F5' => 'Flyperlink',
'FU' => 'FreeU',
'F6' => 'Freedom Browser',
'FT' => 'Frost',
'F3' => 'Frost+',
'FI' => 'Fulldive',
'GA' => 'Galeon',
Expand Down Expand Up @@ -428,6 +430,7 @@ class Browser extends AbstractClientParser
'LY' => 'PolyBrowser',
'PI' => 'PrivacyWall',
'P4' => 'Privacy Explorer Fast Safe',
'P3' => 'Private Internet Browser',
'P2' => 'Pi Browser',
'P0' => 'PronHub Browser',
'PC' => 'PSI Secure Browser',
Expand Down Expand Up @@ -532,6 +535,7 @@ class Browser extends AbstractClientParser
'V0' => 'vBrowser',
'VA' => 'Vast Browser',
'VE' => 'Venus Browser',
'WD' => 'Vewd Browser',
'N0' => 'Nova Video Downloader Pro',
'VS' => 'Viasat Browser',
'VI' => 'Vivaldi',
Expand Down Expand Up @@ -616,7 +620,7 @@ class Browser extends AbstractClientParser
'XB', 'W1', 'HT', 'B8', 'F5', 'B9', 'WA', 'T0', 'HC',
'O6', 'P7', 'LJ', 'LC', 'O7', 'N2', 'A8', 'P8', 'RB',
'1W', 'EV', 'I9', 'V4', 'H4', '1T', 'M5', '0S', '0C',
'ZR', 'D6', 'F6',
'ZR', 'D6', 'F6', 'RC', 'WD', 'P3', 'FT',
],
'Firefox' => [
'AX', 'BI', 'BF', 'BH', 'BN', 'C0', 'CU', 'EI', 'F1',
Expand Down Expand Up @@ -656,7 +660,7 @@ class Browser extends AbstractClientParser
'DM', '1M', 'A7', 'XN', 'XT', 'XB', 'W1', 'HT', 'B7',
'B9', 'T0', 'I8', 'O6', 'P7', 'O8', '4B', 'A8', 'P8',
'1W', 'EV', 'Z0', 'I9', 'V4', 'H4', 'M5', '0S', '0C',
'ZR', 'D6', 'F6',
'ZR', 'D6', 'F6', 'P3', 'FT',
];

/**
Expand All @@ -665,7 +669,9 @@ class Browser extends AbstractClientParser
* @var array<string, array<string>>
*/
protected static $clientHintMapping = [
'Chrome' => ['Google Chrome'],
'Chrome' => ['Google Chrome'],
'Vewd Browser' => ['Vewd Core'],
'DuckDuckGo Privacy Browser' => ['DuckDuckGo'],
];

/**
Expand Down Expand Up @@ -807,9 +813,14 @@ public function parse(): ?array
$engine = '';
$engineVersion = '';

// If version from client hints report 2022 or 2022.04, then is the Iridium browser
// https://iridiumbrowser.de/news/2022/05/16/version-2022-04-released
if ('2021.12' === $version || '2022' === $version || '2022.04' === $version) {
// If the version reported from the client hints is YYYY or YYYY.MM (e.g., 2022 or 2022.04),
// then it is the Iridium browser
// https://iridiumbrowser.de/news/
if (0 === \strpos($version, '2020')
|| 0 === \strpos($version, '2021')
|| 0 === \strpos($version, '2022')
|| 0 === \strpos($version, '2023')
) {
$name = 'Iridium';
$short = 'I1';
$engine = $browserFromUserAgent['engine'];
Expand All @@ -820,6 +831,15 @@ public function parse(): ?array
$version = $browserFromUserAgent['version'];
}

if ('DuckDuckGo Privacy Browser' === $name) {
$version = '';
}

if ('Vewd Browser' === $name) {
$engine = $browserFromUserAgent['engine'] ?? '';
$engineVersion = $browserFromUserAgent['engine_version'] ?? '';
}

// If client hints report Chromium, but user agent detects a Chromium based browser, we favor this instead
if ('Chromium' === $name
&& !empty($browserFromUserAgent['name'])
Expand All @@ -836,7 +856,7 @@ public function parse(): ?array
$short = $browserFromUserAgent['short_name'];
}

// If useragent detects another browser, but the family matches, we use the detected engine from useragent
// If user agent detects another browser, but the family matches, we use the detected engine from user agent
if ($name !== $browserFromUserAgent['name']
&& self::getBrowserFamily($name) === self::getBrowserFamily($browserFromUserAgent['name'])
) {
Expand Down Expand Up @@ -943,7 +963,7 @@ protected function parseBrowserFromClientHints(): array
}
}

// If we detected a brand, that is not chromium, we will use it, otherwise we will look further
// If we detected a brand, that is not Chromium, we will use it, otherwise we will look further
if ('' !== $name && 'Chromium' !== $name) {
break;
}
Expand All @@ -960,7 +980,7 @@ protected function parseBrowserFromClientHints(): array
}

/**
* Returns the browser that can be detected from useragent
* Returns the browser that can be detected from user agent
*
* @return array
*
Expand Down
1 change: 1 addition & 0 deletions Parser/Device/AbstractDeviceParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -1545,6 +1545,7 @@ abstract class AbstractDeviceParser extends AbstractParser
'T2' => 'Telenor',
'TE' => 'Telit',
'65' => 'Telia',
'TLY' => 'Telly',
'TEL' => 'Telma',
'PW' => 'Telpo',
'TLS' => 'TeloSystems',
Expand Down
66 changes: 66 additions & 0 deletions Tests/Parser/Client/fixtures/browser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7860,3 +7860,69 @@
engine: Blink
engine_version: "104.0.0.0"
family: Chrome
-
user_agent: Mozilla/5.0 (Linux; NetCast; U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.128 Safari/537.36 SmartTV/10.0 Colt/2.0
client:
type: browser
name: Crow Browser
version: "94"
engine: Blink
engine_version: 94.0.4606.128
family: Chrome
headers:
Sec-CH-UA: '"Not.A/Brand";v="8", "Chromium";v="94", "CrowBrowser";v="94"'
-
user_agent: Mozilla/5.0 (Linux; Andr0id 11; TY55_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.56 Safari/537.36 OMI/4.24.3.23.StableAVB_Telly.1
client:
type: browser
name: Vewd Browser
version: "4.24"
engine: Blink
engine_version: 120.0.6099.56
family: Chrome
headers:
Sec-CH-UA: '"Not_A Brand";v="8", "Chromium";v="120", "Vewd Core";v="4.24"'
-
user_agent: Mozilla/5.0 (Linux; Android 13; rNRKFrVRTx; U; en) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.162 Mobile AT/1.0.0 Safari/537.36
client:
type: browser
name: AVG Secure Browser
version: 1.0.0
engine: Blink
engine_version: 113.0.5672.162
family: Chrome
headers:
Sec-CH-UA: '"AT";v="1.0.0", "Chromium";v="113", "Not-A.Brand";v="24"'
-
user_agent: 'Mozilla/5.0 (Linux; Android 12; moto g play - 2023 Build/S3SGS32.39-181-5; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/117.0.0.0 Mobile Safari/537.36'
client:
type: browser
name: Private Internet Browser
version: ""
engine: Blink
engine_version: 117.0.0.0
family: Chrome
headers:
http-x-requested-with: com.lechneralexander.privatebrowser
-
user_agent: Mozilla/5.0 (Linux; Android 13; SM-G781B Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.6099.230 Mobile Safari/537.36
client:
type: browser
name: Frost
version: ""
engine: Blink
engine_version: 120.0.6099.230
family: Chrome
headers:
http-x-requested-with: com.crowbar.beaverlite
-
user_agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.230 Mobile Safari/537.36
client:
type: browser
name: DuckDuckGo Privacy Browser
version: ""
engine: Blink
engine_version: 120.0.6099.230
family: Chrome
headers:
Sec-CH-UA: '"Not_A Brand";v="8.0.0.0", "Chromium";v="120.0.6099.230", "DuckDuckGo";v="120.0.6099.230"'
44 changes: 44 additions & 0 deletions Tests/fixtures/clienthints.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1106,3 +1106,47 @@
model: ""
os_family: Windows
browser_family: Chrome
-
user_agent: Mozilla/5.0 (Linux; NetCast; U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.128 Safari/537.36 SmartTV/10.0 Colt/2.0
headers:
Sec-CH-UA: '"Not.A/Brand";v="8", "Chromium";v="94", "CrowBrowser";v="94"'
Sec-CH-UA-Platform: 'Linux'
Sec-CH-UA-Mobile: '?0'
os:
name: GNU/Linux
version: ""
platform: ""
client:
type: browser
name: Crow Browser
version: "94"
engine: Blink
engine_version: 94.0.4606.128
device:
type: tv
brand: LG
model: NetCast
os_family: GNU/Linux
browser_family: Chrome
-
user_agent: Mozilla/5.0 (Linux; Andr0id 11; TY55_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.56 Safari/537.36 OMI/4.24.3.23.StableAVB_Telly.1
headers:
Sec-CH-UA: '"Not_A Brand";v="8", "Chromium";v="120", "Vewd Core";v="4.24"'
Sec-CH-UA-Platform: 'Android'
Sec-CH-UA-Mobile: '?0'
os:
name: Android TV
version: "11"
platform: ""
client:
type: browser
name: Vewd Browser
version: "4.24"
engine: Blink
engine_version: 120.0.6099.56
device:
type: tv
brand: Telly
model: TY55-1
os_family: Android
browser_family: Chrome
18 changes: 18 additions & 0 deletions Tests/fixtures/tv-3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1711,3 +1711,21 @@
model: Smart TV (2021)
os_family: Other Mobile
browser_family: Chrome
-
user_agent: Mozilla/5.0 (Linux; Andr0id 11; TY55_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.56 Safari/537.36 OMI/4.24.3.23.StableAVB_Telly.1
os:
name: Android TV
version: "11"
platform: ""
client:
type: browser
name: Opera Devices
version: 4.24.3.23
engine: Blink
engine_version: 120.0.6099.56
device:
type: tv
brand: Telly
model: TY55-1
os_family: Android
browser_family: Opera
7 changes: 6 additions & 1 deletion regexes/client/browsers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -850,14 +850,19 @@
name: 'Firefox Reality'
version: ''

# AVG Secure Browser (https://www.avg.com/en-us/secure-browser)
# AVG Secure Browser (https://www.avg.com/en-us/secure-browser | https://play.google.com/store/apps/details?id=com.avg.android.secure.browser)
- regex: 'AVG(?:/(\d+[\.\d]+))?'
name: 'AVG Secure Browser'
version: '$1'
engine:
default: 'WebKit'
versions:
28: 'Blink'
- regex: 'AT/(\d+[\.\d]+)'
name: 'AVG Secure Browser'
version: '$1'
engine:
default: 'Blink'

# START Internet Browser (https://play.google.com/store/apps/details?id=fyi.start.web.browser)
- regex: 'Start/(?:(\d+[\.\d]+))?'
Expand Down
2 changes: 2 additions & 0 deletions regexes/client/hints/browsers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
'com.zeesitech.bitchutebrowser': 'Bitchute Browser'
'nova.all.video.downloader': 'Nova Video Downloader Pro'
'tukidev.pronhubbrowser.tanpavpn': 'PronHub Browser'
'com.crowbar.beaverlite': 'Frost'
'com.crowbar.beaverbrowser': 'Frost+'
'com.lenovo.browser': 'Lenovo Browser'
'com.transsion.phoenix': 'Phoenix Browser'
Expand Down Expand Up @@ -225,3 +226,4 @@
'com.cavebrowser': 'Cave Browser'
'com.zordo.browser': 'Zordo Browser'
'freedom.theanarch.org.freedom': 'Freedom Browser'
'com.lechneralexander.privatebrowser': 'Private Internet Browser'
8 changes: 8 additions & 0 deletions regexes/device/mobiles.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24135,6 +24135,14 @@ Telit:
- regex: 'Telit[\-_]?([a-z0-9]+)'
model: '$1'

# Telly (https://www.telly.com/)
Telly:
regex: 'TY55_1'
device: 'tv'
models:
- regex: 'TY55_1'
model: 'TY55-1'

# Telma (https://www.telma.mg/)
Telma:
regex: 'Telma|(?:F1x4G|Feel_Plus)(?:[);/ ]|$)'
Expand Down
Loading