X-Git-Url: https://git.cweiske.de/playVideoOnDreamboxProxy.git/blobdiff_plain/e49228d52d2c0ef42444b20ffcd543241bdf485c..HEAD:/www/functions.php diff --git a/www/functions.php b/www/functions.php index 6ad1044..95694e7 100644 --- a/www/functions.php +++ b/www/functions.php @@ -2,11 +2,28 @@ function getPageUrl() { global $argv, $argc; + + $dryRun = false; if (php_sapi_name() == 'cli') { if ($argc < 2) { - errorInput('No URL given as command line parameter'); + errorInput( + "No URL given as command line parameter\n" + . "Usage:\n" + . " play.php [--dry-run|-n] " + ); + } + $options = []; + array_shift($argv);//remove script itself + foreach ($argv as $val) { + if ($val[0] == '-') { + $options[$val] = true; + } else { + $pageUrl = $val; + } + } + if (isset($options['--dry-run']) || isset($options['-n'])) { + $dryRun = true; } - $pageUrl = $argv[1]; } else if (!isset($_SERVER['CONTENT_TYPE'])) { errorInput('Content type header missing'); } else if ($_SERVER['CONTENT_TYPE'] == 'text/plain') { @@ -22,7 +39,7 @@ function getPageUrl() errorInput('Content type is not text/plain but ' . $_SERVER['CONTENT_TYPE']); } - $parts = parse_url($pageUrl); + $parts = parse_url($pageUrl ?? null); if ($parts === false) { errorInput('Invalid URL in POST data'); } else if (!isset($parts['scheme'])) { @@ -30,7 +47,7 @@ function getPageUrl() } else if ($parts['scheme'] !== 'http' && $parts['scheme'] !== 'https') { errorInput('Invalid URL in POST data: Non-HTTP scheme'); } - return $pageUrl; + return [$pageUrl, $dryRun]; } function getYoutubeDlJson($pageUrl, $youtubedlPath) @@ -89,17 +106,48 @@ function extractVideoUrlFromJson($json) errorOut('Cannot decode JSON: ' . json_last_error_msg()); } - $url = null; + $safeFormats = []; foreach ($data->formats as $format) { if (strpos($format->format, 'hls') !== false) { //dreambox 7080hd does not play hls files continue; } + if (strpos($format->format, 'vp9') !== false + || $format->vcodec == 'vp9' + ) { + //dreambox 7080hd does not play VP9 video streams + continue; + } + if (strtolower(substr($format->vcodec, 0, 6)) == 'avc1.6') { + //dreambox DM7080 does not play H.264 High Profile + continue; + } if ($format->protocol == 'http_dash_segments') { //split up into multiple small files continue; } + if ($format->ext == 'flv') { + //Internal data flow error + continue; + } + $safeFormats[] = $format; + } + + $url = null; + + //filter: best quality + usort($safeFormats, function ($a, $b) { + $a->acodec = $a->acodec ?? null; + $b->acodec = $b->acodec ?? null; + if ((($a->acodec != 'none') + ($b->acodec != 'none')) == 1) { + return ($b->acodec != 'none') - ($a->acodec != 'none'); + } + return ($b->quality ?? 0) - ($a->quality ?? 0); + }); + foreach ($safeFormats as $format) { + //echo $format->format . ' | ' . $format->vcodec . ' | ' . $format->acodec . "\n"; $url = $format->url; + break; } if ($url === null) {