Файл: vendor/whichbrowser/parser/src/Analyser/Header/Useragent/Device/Television.php
Строк: 715
<?php
namespace WhichBrowserAnalyserHeaderUseragentDevice;
use WhichBrowserConstants;
use WhichBrowserData;
trait Television
{
private function detectTelevision($ua)
{
/* Detect the type based on some common markers */
$this->detectGenericTelevision($ua);
/* Try to parse some generic methods to store device information */
$this->detectGenericTelevisionModels($ua);
$this->detectGenericInettvBrowser($ua);
$this->detectGenericHbbTV($ua);
/* Look for specific manufacturers and models */
$this->detectPanasonicTelevision($ua);
$this->detectSharpTelevision($ua);
$this->detectSamsungTelevision($ua);
$this->detectSonyTelevision($ua);
$this->detectPhilipsTelevision($ua);
$this->detectLgTelevision($ua);
$this->detectToshibaTelevision($ua);
$this->detectSanyoTelevision($ua);
/* Try to detect set top boxes from various manufacturers */
$this->detectSettopboxes($ua);
/* Improve model names */
$this->improveModelsOnDeviceTypeTelevision();
}
/* Generic markers */
private function detectGenericTelevision($ua)
{
if (preg_match('/CE-HTML/u', $ua)) {
$this->data->device->type = ConstantsDeviceType::TELEVISION;
}
if (preg_match('/SmartTvA//u', $ua)) {
$this->data->device->type = ConstantsDeviceType::TELEVISION;
}
if (preg_match('/NETRANGEMMH/u', $ua)) {
$this->data->device->type = ConstantsDeviceType::TELEVISION;
}
}
/* Toshiba */
private function detectToshibaTelevision($ua)
{
if (preg_match('/Toshiba_?TP//u', $ua) || preg_match('/TSBNetTV ?//u', $ua)) {
$this->data->device->manufacturer = 'Toshiba';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
if (preg_match('/TOSHIBA;[^;]+;([A-Z]+[0-9]+[A-Z]+);/u', $ua, $match)) {
$this->data->device->manufacturer = 'Toshiba';
$this->data->device->model = $match[1];
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
}
/* LG */
private function detectLgTelevision($ua)
{
if (preg_match('/(LGSmartTV|LG smartTV)/u', $ua)) {
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
if (preg_match('/UPLUSTVBROWSER/u', $ua)) {
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'U+ tv';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
/* NetCast */
if (preg_match('/LG NetCast.(TV|Media)-([0-9]*)/u', $ua, $match)) {
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'NetCast ' . $match[1] . ' ' . $match[2];
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/LG Browser/[0-9.]+([^;]+; LGE; ([^;]+);/u', $ua, $match)) {
if (substr($match[1], 0, 6) != 'GLOBAL' && substr($match[1], 0, 7) != 'NETCAST') {
$this->data->device->model = $match[1];
}
}
}
/* NetCast */
if ($ua == "Mozilla/5.0 (X11; Linux; ko-KR) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+" ||
$ua == "Mozilla/5.0 (DirectFB; Linux; ko-KR) AppleWebKit/534.26 (KHTML, like Gecko) Version/5.0 Safari/534.26" ||
$ua == "Mozilla/5.0 (DirectFB; Linux; ko-KR) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+") {
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'NetCast TV 2012';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
/* NetCast or WebOS */
if (preg_match('/NetCast/u', $ua) && preg_match('/SmartTV/([0-9])/u', $ua, $match)) {
$this->data->device->manufacturer = 'LG';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (intval($match[1]) < 5) {
$this->data->device->series = 'NetCast TV';
} else {
$this->data->device->series = 'webOS TV';
$this->data->os->reset([
'name' => 'webOS',
'hidden' => true
]);
}
}
/* WebOS */
if (preg_match('/Web[O0]S/u', $ua) && preg_match('/Large Screen/u', $ua)) {
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'webOS TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->os->reset([
'name' => 'webOS',
'hidden' => true
]);
}
if (preg_match('/Web[O0]S; Linux/SmartTV/u', $ua)) {
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'webOS TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->os->reset([
'name' => 'webOS',
'hidden' => true
]);
}
if (preg_match('/webOS.TV-([0-9]+)/u', $ua, $match)) {
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'webOS TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/LG Browser/[0-9.]+(LGE; ([^;]+);/u', $ua, $match)) {
if (strtoupper(substr($match[1], 0, 5)) != 'WEBOS') {
$this->data->device->model = $match[1];
}
}
$this->data->os->reset([
'name' => 'webOS',
'hidden' => true
]);
}
if (preg_match('/PBRM//u', $ua)) {
$this->data->browser->name = "Pro:Centric";
$this->data->browser->version = null;
$this->data->device->manufacturer = 'LG';
$this->data->device->series = 'webOS TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/PBRM/[0-9.]+ ( ;LGE ;([^;]+) ;/u', $ua, $match)) {
if (strtoupper(substr($match[1], 0, 5)) != 'WEBOS') {
$this->data->device->model = $match[1];
}
}
$this->data->os->reset([
'name' => 'webOS',
'hidden' => true
]);
}
}
/* Philips */
private function detectPhilipsTelevision($ua)
{
if (preg_match('/NETTV//u', $ua)) {
$this->data->device->manufacturer = 'Philips';
$this->data->device->series = 'Net TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/AquosTV/u', $ua)) {
$this->data->device->manufacturer = 'Sharp';
$this->data->device->series = 'Aquos TV';
}
if (preg_match('/BANGOLUFSEN/u', $ua)) {
$this->data->device->manufacturer = 'Bang & Olufsen';
$this->data->device->series = 'Smart TV';
}
if (preg_match('/PHILIPS-AVM/u', $ua)) {
$this->data->device->series = 'Blu-ray Player';
}
}
if (preg_match('/PHILIPS_OLS_20[0-9]+/u', $ua)) {
$this->data->device->manufacturer = 'Philips';
$this->data->device->series = 'Net TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
}
/* Sony */
private function detectSonyTelevision($ua)
{
if (preg_match('/SonyCEBrowser/u', $ua)) {
$this->data->device->manufacturer = 'Sony';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/SonyCEBrowser/[0-9.]+ ((?:BDPlayer; |DTV[0-9]+/)?([^;_]+)/u', $ua, $match)) {
if ($match[1] != 'ModelName') {
$this->data->device->model = $match[1];
}
}
}
if (preg_match('/SonyDTV/u', $ua)) {
$this->data->device->manufacturer = 'Sony';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/(KDL-?[0-9]+[A-Z]+[0-9]+)/u', $ua, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
if (preg_match('/(XBR-?[0-9]+[A-Z]+[0-9]+)/u', $ua, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
}
if (preg_match('/SonyBDP/u', $ua)) {
$this->data->device->manufacturer = 'Sony';
$this->data->device->series = "Blu-ray Player";
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
if (preg_match('/SmartBD/u', $ua) && preg_match('/(BDP-[A-Z][0-9]+)/u', $ua, $match)) {
$this->data->device->manufacturer = 'Sony';
$this->data->device->model = $match[1];
$this->data->device->series = 'Blu-ray Player';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
if (preg_match('/s+([0-9]+)BRAVIA/u', $ua, $match)) {
$this->data->device->manufacturer = 'Sony';
$this->data->device->model = 'Bravia';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
}
/* Samsung */
private function detectSamsungTelevision($ua)
{
if (preg_match('/(SMART-TV;|SmartHub;)/u', $ua)) {
$this->data->device->manufacturer = 'Samsung';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/Linux/SmartTV+([0-9]*)/u', $ua, $match)) {
$this->data->device->series = 'Smart TV ' . $match[1];
} elseif (preg_match('/Maple([0-9]*)/u', $ua, $match)) {
$this->data->device->series = 'Smart TV ' . $match[1];
}
}
if (preg_match('/Maple_?([0-9][0-9][0-9][0-9])/u', $ua, $match)) {
$this->data->device->manufacturer = 'Samsung';
$this->data->device->series = 'Smart TV ' . $match[1];
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/Linux/(?:SmartTV)?+([0-9]{4,4})/u', $ua, $match)) {
$this->data->device->series = 'Smart TV ' . $match[1];
}
}
if (preg_match('/Maple ([0-9]+.[0-9]+).[0-9]+/u', $ua, $match)) {
$this->data->device->manufacturer = 'Samsung';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
switch ($match[1]) {
case '5.0':
$this->data->device->series = 'Smart TV 2009';
break;
case '5.1':
$this->data->device->series = 'Smart TV 2010';
break;
case '6.0':
$this->data->device->series = 'Smart TV 2011';
break;
}
}
if (preg_match('/Model/Samsung-(BD-[A-Z][0-9]+)/u', $ua, $match)) {
$this->data->device->manufacturer = 'Samsung';
$this->data->device->model = $match[1];
$this->data->device->series = 'Blu-ray Player';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
if (preg_match('/olleh tv;/u', $ua)) {
$this->data->device->manufacturer = 'Samsung';
$this->data->device->model = null;
$this->data->device->series = null;
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/(SMT-[A-Z0-9]+)/u', $ua, $match)) {
$this->data->device->model = $match[1];
$this->data->device->identifier = $match[1];
$this->data->device->generic = false;
}
if ($this->data->device->model == "SMT-E5015") {
$this->data->device->model = 'Olleh SkyLife Smart Settopbox';
}
}
}
/* Sanyo */
private function detectSanyoTelevision($ua)
{
if (preg_match('/Aplix_SANYO_browser/u', $ua)) {
$this->data->device->manufacturer = 'Sanyo';
$this->data->device->series = 'Internet TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
}
/* Sharp */
private function detectSharpTelevision($ua)
{
if (preg_match('/(AQUOSBrowser|AQUOS-(AS|DMP))/u', $ua)) {
$this->data->device->manufacturer = 'Sharp';
$this->data->device->series = 'Aquos TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/LC-([0-9]+[A-Z]+[0-9]+[A-Z]+)/u', $ua, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
}
}
/* Panasonic */
private function detectPanasonicTelevision($ua)
{
if (preg_match('/Viera/u', $ua)) {
$this->data->device->manufacturer = 'Panasonic';
$this->data->device->series = 'Viera';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/Panasonic.tv.(?:mid.|pro4.)?([0-9]+)/u', $ua, $match)) {
$this->data->device->series = 'Viera ' . $match[1];
}
if (preg_match('/(Panasonic, ([0-9]+),/u', $ua, $match)) {
$this->data->device->series = 'Viera ' . $match[1];
}
if (preg_match('/Viera; rv:34/u', $ua, $match)) {
$this->data->device->series = 'Viera 2015';
}
}
if (preg_match('/; Diga;/u', $ua)) {
$this->data->device->manufacturer = 'Panasonic';
$this->data->device->series = 'Diga';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
}
/* Various set top boxes */
private function detectSettopboxes($ua)
{
if (!preg_match('/(lacleTV|LOEWE|KreaTV|ADB|Mstar|TechniSat|Technicolor|Highway|CiscoBrowser|Sunniwell|Enseo|LocationFreeTV|Winbox|DuneHD|Roku|AppleTV|Apple TV|WebTV|OpenTV|MediStream)/ui', $ua)) {
return;
}
/* Orange La clé TV */
if (preg_match('/lacleTV//u', $ua)) {
$this->data->device->manufacturer = 'Orange';
$this->data->device->series = 'La clé TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
/* Loewe */
if (preg_match('/LOEWE/TV/u', $ua)) {
$this->data->device->manufacturer = 'Loewe';
$this->data->device->series = 'Smart TV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/((?:SL|ID)[0-9]+)/u', $ua, $match)) {
$this->data->device->model = $match[1];
}
}
/* KreaTV */
if (preg_match('/KreaTV/u', $ua)) {
$this->data->os->reset();
$this->data->device->series = 'KreaTV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
if (preg_match('/Motorola/u', $ua)) {
$this->data->device->manufacturer = 'Motorola';
}
}
/* ADB */
if (preg_match('/(ADB; ([^)]+))/u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'ADB';
$this->data->device->model = ($match[1] != 'Unknown' ? str_replace('ADB', '', $match[1]) . ' ' : '') . 'IPTV receiver';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* MStar */
if (preg_match('/Mstar;/u', $ua)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'MStar';
$this->data->device->model = 'PVR';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
/* TechniSat */
if (preg_match('/TechniSat ([^;]+);/u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'TechniSat';
$this->data->device->model = $match[1];
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* Technicolor */
if (preg_match('/Technicolor_([^;]+);/u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Technicolor';
$this->data->device->model = $match[1];
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* Cisco MediaHighway */
if (preg_match('/(Media-Highway Evolution|CiscoBrowser/CI)/u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Cisco';
$this->data->device->model = 'MediaHighway';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* Sunniwell */
if (preg_match('/Sunniwell/u', $ua) && preg_match('/Resolution/u', $ua)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Sunniwell';
$this->data->device->series = 'STB';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* Enseo */
if (preg_match('/Enseo/([A-Z0-9]+)/u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Enseo';
$this->data->device->model = $match[1];
$this->data->device->series = 'STB';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* Sony LocationFreeTV */
if (preg_match('/LocationFreeTV/([A-Z0-9-]+)/u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Sony';
$this->data->device->model = 'LocationFreeTV ' . $match[1];
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* Winbox Evo2 */
if (preg_match('/Winbox Evo2/u', $ua)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Winbox';
$this->data->device->model = 'Evo2';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* DuneHD */
if (preg_match('/DuneHD//u', $ua)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Dune HD';
$this->data->device->model = '';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
if (preg_match('/DuneHD/[0-9.]+ (([^;]+);/u', $ua, $match)) {
$this->data->device->model = $match[1];
}
}
/* Roku */
if (preg_match('/Roku(?:([0-9]+)[A-Z]+)?/DVP-(?:([0-9]+)[A-Z]+-)?[0-9.]+/u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Roku';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$models = [
'2000' => 'HD',
'2050' => 'XD',
'2100' => 'XDS',
'2400' => 'LT',
'2450' => 'LT',
'2500' => 'HD',
'2700' => 'LT',
'2710' => '1 SE',
'2720' => '2',
'3000' => '2 HD',
'3050' => '2 XD',
'3100' => '2 XS',
'3400' => 'Streaming Stick, MHL',
'3420' => 'Streaming Stick, MHL',
'3500' => 'Streaming Stick, HDMI',
'3600' => 'Streaming Stick',
'3700' => 'Express',
'3710' => 'Express+',
'3800' => 'Streaming Stick',
'3810' => 'Streaming Stick+',
'3900' => 'Express',
'3910' => 'Express+',
'3920' => 'Premiere',
'3921' => 'Premiere+',
'3930' => 'Express',
'3931' => 'Express+',
'4200' => '3',
'4210' => '2',
'4230' => '3',
'4400' => '4',
'4620' => 'Premiere',
'4630' => 'Premiere+',
'4640' => 'Ultra',
'4660' => 'Ultra',
'4661' => 'Ultra',
'4662' => 'Ultra LT',
'4670' => 'Ultra',
'4800' => 'Ultra',
];
if (!empty($match[1]) || !empty($match[2])) {
$model = !empty($match[1]) ? $match[1] : $match[2];
if (isset($models[$model])) {
$this->data->device->model = $models[$model];
$this->data->device->generic = false;
}
}
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
if (preg_match('/Roku/DVP-[0-9.]+ (([0-9A-Z]{2,2})[0-9]+./u', $ua, $match)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Roku';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$models = [
'02' => '2 XS',
'03' => 'LT',
'04' => '3',
'07' => 'LT',
'09' => 'Streaming Stick',
'29' => 'Ultra',
'30' => [ 'TCL', '4K Roku TV' ],
'51' => 'Express',
'AE' => 'Express',
];
if (!empty($match[1])) {
$model = $match[1];
if (isset($models[$model])) {
if (is_array($models[$model])) {
$this->data->device->manufacturer = $models[$model][0];
$this->data->device->model = $models[$model][1];
} else {
$this->data->device->model = $models[$model];
}
$this->data->device->generic = false;
}
}
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
if (preg_match('/(Roku/u', $ua)) {
$this->data->device->manufacturer = 'Roku';
$this->data->device->model = '';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
}
/* AppleTV */
if (preg_match('/Apple ?TV/u', $ua)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Apple';
$this->data->device->model = 'AppleTV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* WebTV */
if (preg_match('/WebTV/[0-9.]/u', $ua)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Microsoft';
$this->data->device->model = 'WebTV';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
/* MediStream */
if (preg_match('/MediStream/u', $ua)) {
$this->data->os->reset();
$this->data->device->manufacturer = 'Bewatec';
$this->data->device->model = 'MediStream';
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
}
}
/* Generic model information */
private function detectGenericTelevisionModels($ua)
{
if (preg_match('/(([^,(]+),s*([^,(]+),s*(?:[Ww]ired|[Ww]ireless))/u', $ua, $match)) {
$vendorName = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[1]);
$modelName = trim($match[2]);
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$this->data->device->identified |= ConstantsId::PATTERN;
if (!isset($this->data->device->series)) {
$this->data->device->series = 'Smart TV';
}
switch ($vendorName) {
case 'ARRIS':
$this->data->device->manufacturer = 'Arris';
$this->data->device->model = $modelName;
break;
case 'LG':
$this->data->device->manufacturer = 'LG';
switch ($modelName) {
case 'WEBOS1':
case 'webOS.TV':
$this->data->device->series = 'webOS TV';
break;
case 'NETCAST4':
case 'NetCast4.0':
case 'GLOBAL-PLAT4':
$this->data->device->series = 'NetCast TV 2013';
break;
default:
$this->data->device->model = $modelName;
break;
}
break;
case 'Google Fiber':
$this->data->device->manufacturer = $vendorName;
$this->data->device->model = 'TV Box';
break;
case 'Sagemcom':
$this->data->device->manufacturer = $vendorName;
$this->data->device->series = 'Settopbox';
if (preg_match('/^([A-Z]+[0-9]+)/ui', $modelName, $match)) {
$this->data->device->model = $match[1];
unset($this->data->device->series);
}
break;
case 'TiVo':
$this->data->device->manufacturer = 'TiVo';
$this->data->device->series = 'DVR';
break;
default:
$this->data->device->manufacturer = $vendorName;
if (!in_array($modelName, [ 'dvb' ])) {
$this->data->device->model = $modelName;
}
break;
}
}
}
/* InettvBrowser model information */
private function detectGenericInettvBrowser($ua)
{
if (preg_match('/(?:DTVNetBrowser|InettvBrowser|Hybridcast)/[0-9.]+[A-Z]? ?(/u', $ua, $match)) {
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$vendorName = null;
$modelName = null;
$found = false;
if (preg_match('/(?:DTVNetBrowser|InettvBrowser)/[0-9.]+[A-Z]? ?(([^;]*)s*;s*([^;]*)s*;/u', $ua, $match)) {
$vendorName = trim($match[1]);
$modelName = trim($match[2]);
$found = true;
}
if (preg_match('/Hybridcast/[0-9.]+ ?([^;]*;([^;]*)s*;s*([^;]*)s*;/u', $ua, $match)) {
$vendorName = trim($match[1]);
$modelName = trim($match[2]);
$found = true;
}
if ($found) {
$this->data->device->identified |= ConstantsId::PATTERN;
$data = [
'0003D5' => 'Advanced Communications',
'000024' => 'Connect AS',
'000087' => 'Hitachi',
'00A0B0' => 'I-O Data Device',
'00E091' => 'LG',
'0050C9' => 'Maspro Denkoh',
'002692' => 'Mitsubishi',
'38E08E' => 'Mitsubishi',
'008045' => 'Panasonic',
'00E036' => 'Pioneer',
'00E064' => 'Samsung',
'08001F' => 'Sharp',
'00014A' => 'Sony',
'000039' => 'Toshiba'
];
if (isset($data[$vendorName])) {
$this->data->device->manufacturer = $data[$vendorName];
if ($this->data->device->manufacturer == 'LG') {
switch ($modelName) {
case 'LGE2D2012M':
$this->data->device->series = 'NetCast TV 2012';
break;
case 'LGE3D2012M':
$this->data->device->series = 'NetCast TV 2012';
break;
case 'LGwebOSTV':
case 'webOSTV3_0':
$this->data->device->series = 'webOS TV';
break;
}
}
if ($this->data->device->manufacturer == 'Panasonic') {
if (substr($modelName, 0, 6) != 'PANATV') {
$this->data->device->model = $modelName;
}
}
}
if (!isset($this->data->device->series)) {
$this->data->device->series = 'Smart TV';
}
}
}
}
/* HbbTV model information */
private function detectGenericHbbTV($ua)
{
if (preg_match('/((HbbTV|OHTV|SmartTV)/[0-9.]+|CE-HTML)/iu', $ua)) {
$this->data->device->type = ConstantsDeviceType::TELEVISION;
$vendorName = null;
$modelName = null;
$found = false;
if (preg_match('/HbbTV/[0-9.]+;CE-HTML/[0-9.]+;([A-Z]+)s([^;]+);/iu', $ua, $match)) {
$vendorName = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[1]);
$modelName = trim($match[2]);
$found = true;
}
if (preg_match('/UID([a-f0-9:]+/([^/]+)/([^/]+)/[0-9a-z.]+)+CE-HTML/iu', $ua, $match)) {
$vendorName = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[2]);
$modelName = trim($match[1]);
$found = true;
}
if (preg_match('/(?:HbbTV|OHTV)/[0-9.]+ (([^;]*);s*([^;]*)s*;s*([^;]*)s*;/u', $ua, $match)) {
if (trim($match[1]) == "" || in_array(strtok($match[1], ' '), [ 'PVR', 'DL' ]) || strpos($match[1], '+') !== false) {
$vendorName = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[2]);
$modelName = trim($match[3]);
} else {
$vendorName = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[1]);
$modelName = trim($match[2]);
}
$found = true;
}
if (preg_match('/(?:^|s)SmartTV/[0-9.]+ (([^;]*)s*;s*([^;]*)s*;/u', $ua, $match)) {
$vendorName = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[1]);
$modelName = trim($match[2]);
$found = true;
}
if (in_array($vendorName, [ 'Access', 'ANT', 'EMSYS', 'Em-Sys', 'Ocean Blue Software', 'Opera', 'Opera Software', 'Seraphic', 'ST', 'Vendor' ])) {
$found = false;
}
if ($found) {
$this->data->device->identified |= ConstantsId::PATTERN;
switch ($vendorName) {
case 'LG':
$this->data->device->manufacturer = 'LG';
switch ($modelName) {
case 'NetCast 3.0':
case 'GLOBAL_PLAT3':
$this->data->device->series = 'NetCast TV 2012';
break;
case 'NetCast 4.0':
case 'GLOBAL-PLAT4':
$this->data->device->series = 'NetCast TV 2013';
break;
case 'WEBOS1':
case 'WEBOS2.0':
case 'WEBOS3':
$this->data->device->series = 'webOS TV';
break;
}
break;
case 'Samsung':
$this->data->device->manufacturer = 'Samsung';
switch ($modelName) {
case 'SmartTV2012':
$this->data->device->series = 'Smart TV 2012';
break;
case 'SmartTV2013':
$this->data->device->series = 'Smart TV 2013';
break;
case 'SmartTV2014':
$this->data->device->series = 'Smart TV 2014';
break;
case 'SmartTV2015':
$this->data->device->series = 'Smart TV 2015';
break;
case 'SmartTV2016':
$this->data->device->series = 'Smart TV 2016';
break;
case 'SmartTV2017':
$this->data->device->series = 'Smart TV 2017';
break;
case 'OTV-SMT-E5015':
$this->data->device->model = 'Olleh SkyLife Smart Settopbox';
unset($this->data->device->series);
break;
}
break;
case 'Panasonic':
$this->data->device->manufacturer = 'Panasonic';
switch ($modelName) {
case 'VIERA 2011':
$this->data->device->series = 'Viera 2011';
break;
case 'VIERA 2012':
$this->data->device->series = 'Viera 2012';
break;
case 'VIERA 2013':
$this->data->device->series = 'Viera 2013';
break;
case 'VIERA 2014':
$this->data->device->series = 'Viera 2014';
break;
case 'VIERA 2015':
case 'Viera2015.mid':
$this->data->device->series = 'Viera 2015';
break;
case 'VIERA 2016':
$this->data->device->series = 'Viera 2016';
break;
case 'VIERA 2017':
$this->data->device->series = 'Viera 2017';
break;
case 'SmartTV2018mid':
$this->data->device->series = 'Viera 2018';
break;
default:
$this->data->device->model = $modelName;
if (substr($modelName, 0, 4) == 'DIGA') {
$this->data->device->series = 'Diga';
$this->data->device->model = null;
}
break;
}
break;
case 'TV2N':
$this->data->device->manufacturer = 'TV2N';
switch ($modelName) {
case 'videoweb':
$this->data->device->model = 'Videoweb';
break;
}
break;
default:
if ($vendorName != '' && !in_array($vendorName, [ 'OEM', 'vendorName' ])) {
$this->data->device->manufacturer = $vendorName;
}
if ($modelName != '' && !in_array($modelName, [ 'dvb', 'modelName', 'undefined-model-name', 'N/A' ])) {
$this->data->device->model = $modelName;
}
break;
}
switch ($modelName) {
case 'hdr1000s':
$this->data->device->manufacturer = 'Humax';
$this->data->device->model = 'HDR-1000S';
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
break;
case 'hdr4000t':
$this->data->device->manufacturer = 'Humax';
$this->data->device->model = 'HDR-4000T';
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
break;
case 'hgs1000s':
$this->data->device->manufacturer = 'Humax';
$this->data->device->model = 'HGS-1000S';
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
break;
case 'hms1000s':
case 'hms1000sph2':
$this->data->device->manufacturer = 'Humax';
$this->data->device->model = 'HMS-1000S';
$this->data->device->identified |= ConstantsId::MATCH_UA;
$this->data->device->generic = false;
break;
}
}
}
if (preg_match('/HbbTV/[0-9.]+;CE-HTML/[0-9.]+;([^s;]+)s[^s;]+;/u', $ua, $match)) {
$this->data->device->manufacturer = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[1]);
if (!isset($this->data->device->series)) {
$this->data->device->series = 'Smart TV';
}
}
if (preg_match('/HbbTV/[0-9.]+;CE-HTML/[0-9.]+;Vendor/([^s;]+);/u', $ua, $match)) {
$this->data->device->manufacturer = DataManufacturers::identify(ConstantsDeviceType::TELEVISION, $match[1]);
if (!isset($this->data->device->series)) {
$this->data->device->series = 'Smart TV';
}
}
}
/* Try to reformat some of the detected generic models */
private function improveModelsOnDeviceTypeTelevision()
{
if ($this->data->device->type != ConstantsDeviceType::TELEVISION) {
return;
}
if (isset($this->data->device->model) && isset($this->data->device->manufacturer)) {
if ($this->data->device->manufacturer == 'Dune HD') {
if (preg_match('/tv([0-9]+[a-z]?)/u', $this->data->device->model, $match)) {
$this->data->device->model = 'TV-' . strtoupper($match[1]);
}
if ($this->data->device->model == 'connect') {
$this->data->device->model = 'Connect';
}
}
if ($this->data->device->manufacturer == 'Humax') {
$this->data->device->series = "Digital Receiver";
}
if ($this->data->device->manufacturer == 'Inverto') {
if (preg_match('/IDL[ -]?([0-9]+.*)/u', $this->data->device->model, $match)) {
$this->data->device->model = 'IDL ' . $match[1];
}
if (preg_match('/MBN([0-9]+)/u', $this->data->device->model, $match)) {
$this->data->device->model = 'MBN ' . $match[1];
}
}
if ($this->data->device->manufacturer == 'HyperPanel') {
$this->data->device->model = strtok(strtoupper($this->data->device->model), ' ');
}
if ($this->data->device->manufacturer == 'LG') {
if (preg_match('/(?:ATSC|DVB)-(.*)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
if (preg_match('/[0-9][0-9]([A-Z][A-Z][0-9][0-9][0-9][0-9A-Z])/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
if (preg_match('/Media/(.*)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
}
if ($this->data->device->manufacturer == 'Loewe') {
$this->data->device->series = 'Smart TV';
if (preg_match('/((?:ID|SL)[0-9]+)/u', $this->data->device->model, $match)) {
$this->data->device->model = 'Connect '. $match[1];
$this->data->device->generic = false;
}
}
if ($this->data->device->manufacturer == 'Philips') {
if (preg_match('/[0-9][0-9]([A-Z][A-Z][A-Z][0-9][0-9][0-9][0-9])/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
if (preg_match('/(MT[0-9]+)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->series = "Digital Receiver";
$this->data->device->generic = false;
}
if (preg_match('/(BDP[0-9]+)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->series = "Blu-ray Player";
$this->data->device->generic = false;
}
}
if ($this->data->device->manufacturer == 'Toshiba') {
if (preg_match('/DTV_(.*)/u', $this->data->device->model, $match)) {
$this->data->device->model = 'Regza ' . $match[1];
$this->data->device->generic = false;
}
if (preg_match('/[0-9][0-9]([A-Z][A-Z][0-9][0-9][0-9])/u', $this->data->device->model, $match)) {
$this->data->device->model = 'Regza ' . $match[1];
$this->data->device->generic = false;
}
if (preg_match('/[0-9][0-9](ZL[0-9])/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1] . ' Cevo';
$this->data->device->generic = false;
}
if (preg_match('/(BDX[0-9]+)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->series = "Blu-ray Player";
$this->data->device->generic = false;
}
}
if ($this->data->device->manufacturer == 'Selevision') {
$this->data->device->model = str_replace('Selevision ', '', $this->data->device->model);
}
if ($this->data->device->manufacturer == 'Sharp') {
if (preg_match('/[0-9][0-9]([A-Z]+[0-9]+[A-Z]+)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->generic = false;
}
}
if ($this->data->device->manufacturer == 'Sony') {
if (preg_match('/(BDP[0-9]+G)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->series = "Blu-ray Player";
$this->data->device->generic = false;
}
if (preg_match('/KDL?-?[0-9]*([A-Z]+[0-9]+)[A-Z]*/u', $this->data->device->model, $match)) {
$this->data->device->model = 'Bravia ' . $match[1];
$this->data->device->series = 'Smart TV';
$this->data->device->generic = false;
}
}
if ($this->data->device->manufacturer == 'Pioneer') {
if (preg_match('/(BDP-[0-9]+)/u', $this->data->device->model, $match)) {
$this->data->device->model = $match[1];
$this->data->device->series = "Blu-ray Player";
$this->data->device->generic = false;
}
}
}
}
}