diff --git a/classes/Config.php b/classes/Config.php index 8cd612b..da91bd6 100644 --- a/classes/Config.php +++ b/classes/Config.php @@ -24,7 +24,7 @@ class Config * * @var string */ - public string $youtubedl = 'vendor/yt-dlp/yt-dlp/yt_dlp/__main__.py'; + public string $youtubedl = '/usr/bin/yt-dlp'; /** * python binary path. @@ -276,7 +276,9 @@ class Config public static function fromFile(string $file): Config { if (is_file($file)) { - return new self(Yaml::parse(strval(file_get_contents($file)))); + $yaml = Yaml::parse(strval(file_get_contents($file))); + assert(is_array($yaml)); + return new self($yaml); } else { throw new ConfigException("Can't find config file at " . $file); } diff --git a/classes/Controller/DownloadController.php b/classes/Controller/DownloadController.php index 35400e5..c1b43e0 100644 --- a/classes/Controller/DownloadController.php +++ b/classes/Controller/DownloadController.php @@ -278,8 +278,8 @@ class DownloadController extends BaseController $videoUrls = $this->video->getUrl(); } catch (EmptyUrlException $e) { /* - * If this happens it is probably a playlist - * so it will either be handled by getStream() or throw an exception anyway. + If this happens it is probably a playlist + so it will either be handled by getStream() or throw an exception anyway. */ $videoUrls = []; } @@ -327,7 +327,7 @@ class DownloadController extends BaseController $process = $this->downloader->getConvertedStream( $this->video, $request->getQueryParam('customBitrate'), - $request->getQueryParam('customFormat') + $request->getQueryParam('customFormat') ); $response = $response->withBody(new Stream($process)); } diff --git a/classes/Controller/FrontController.php b/classes/Controller/FrontController.php index fa0478b..1534b5c 100644 --- a/classes/Controller/FrontController.php +++ b/classes/Controller/FrontController.php @@ -13,6 +13,7 @@ use Alltube\Locale; use Alltube\Middleware\CspMiddleware; use Exception; use Graby\HttpClient\Plugin\ServerSideRequestForgeryProtection\Exception\InvalidURLException; +use GrumPHP\Util\Str; use Slim\Http\StatusCode; use Slim\Http\Uri; use stdClass; @@ -44,7 +45,12 @@ class FrontController extends BaseController { parent::__construct($container); - $this->view = $this->container->get('view'); + $view = $this->container->get('view'); + assert($view instanceof Smarty); + $this->view = $view; + + // Plugins + $this->view->registerPlugin('modifier', 'filter_var', 'filter_var'); } /** @@ -222,6 +228,28 @@ class FrontController extends BaseController } } + /* Fetch the thumbnail, if it exists, and add a data URI to the video object */ + if (isset($this->video->thumbnail) && $this->video->thumbnail !== '') { + /* Fetch the thumbnail */ + $thumbnailData = file_get_contents($this->video->thumbnail); + + if ($thumbnailData !== false) { + $thumbnailData = base64_encode($thumbnailData); + /* Guess the mime type */ + $thumbnailMime = 'image/jpeg'; + + if (strpos($this->video->thumbnail, '.png') !== false) { + $thumbnailMime = 'image/png'; + } elseif (strpos($this->video->thumbnail, '.gif') !== false) { + $thumbnailMime = 'image/gif'; + } elseif (strpos($this->video->thumbnail, '.webp') !== false) { + $thumbnailMime = 'image/webp'; + } + + $this->video->thumbnail = 'data:' . $thumbnailMime . ';base64,' . $thumbnailData; + } + } + $this->view->render( $response, $template, @@ -330,7 +358,11 @@ class FrontController extends BaseController $response = $cspMiddleware->applyHeader($response); if ($this->config->debug) { - $renderer = new HtmlErrorRenderer(true, null, null, $this->container->get('root_path')); + $projectDir = $this->container->get('root_path'); + + assert(is_string($projectDir) || is_null($projectDir)); + + $renderer = new HtmlErrorRenderer(true, null, null, $projectDir); $exception = $renderer->render($error); $response->getBody()->write($exception->getAsString()); diff --git a/classes/Middleware/CspMiddleware.php b/classes/Middleware/CspMiddleware.php index 8934e85..3ec5d6a 100644 --- a/classes/Middleware/CspMiddleware.php +++ b/classes/Middleware/CspMiddleware.php @@ -45,13 +45,13 @@ class CspMiddleware ->addDirective('base-uri', []) ->addDirective('frame-ancestors', []) ->addSource('form-action', '*') - ->addSource('img-src', '*'); + ->addSource('img-src', '*') + ->addSource('img-src', 'data:'); if ($this->config->debug) { // So maximebf/debugbar, symfony/debug and symfony/error-handler can work. $csp->setDirective('script-src', ['self' => true, 'unsafe-inline' => true]) - ->setDirective('style-src', ['self' => true, 'unsafe-inline' => true]) - ->addSource('img-src', 'data:'); + ->setDirective('style-src', ['self' => true, 'unsafe-inline' => true]); } return $csp->injectCSPHeader($response);