applyOptions($options); $this->getEnv(); $this->validateOptions(); } /** * Throw an exception if some of the options are invalid. * * @throws Exception If youtube-dl is missing * @throws Exception If Python is missing * * @return void */ private function validateOptions() { /* We don't translate these exceptions because they usually occur before Slim can catch them so they will go to the logs. */ if (!is_file($this->youtubedl)) { throw new Exception("Can't find youtube-dl at ".$this->youtubedl); } elseif (!Video::checkCommand([$this->python, '--version'])) { throw new Exception("Can't find Python at ".$this->python); } } /** * Apply the provided options. * * @param array $options Options * * @return void */ private function applyOptions(array $options) { foreach ($options as $option => $value) { if (isset($this->$option) && isset($value)) { $this->$option = $value; } } } /** * Override options from environement variables. * Supported environment variables: CONVERT, PYTHON, AUDIO_BITRATE. * * @return void */ private function getEnv() { foreach (['CONVERT', 'PYTHON', 'AUDIO_BITRATE', 'STREAM'] as $var) { $env = getenv($var); if ($env) { $prop = lcfirst(str_replace('_', '', ucwords(strtolower($var), '_'))); $this->$prop = $env; } } } /** * Get Config singleton instance. * * @return Config */ public static function getInstance() { if (!isset(self::$instance)) { self::$instance = new self(); } return self::$instance; } /** * Set options from a YAML file. * * @param string $file Path to the YAML file */ public static function setFile($file) { if (is_file($file)) { $options = Yaml::parse(file_get_contents($file)); self::$instance = new self($options); } else { throw new Exception("Can't find config file at ".$file); } } /** * Manually set some options. * * @param array $options Options (see `config/config.example.yml` for available options) * @param bool $update True to update an existing instance */ public static function setOptions(array $options, $update = true) { if ($update) { $config = self::getInstance(); $config->applyOptions($options); $config->validateOptions(); } else { self::$instance = new self($options); } } /** * Destroy singleton instance. * * @return void */ public static function destroyInstance() { self::$instance = null; } }