diff --git a/lib/RippingCluster/Config.class.php b/lib/RippingCluster/Config.class.php index 054b86b..88d6064 100644 --- a/lib/RippingCluster/Config.class.php +++ b/lib/RippingCluster/Config.class.php @@ -1,23 +1,86 @@ string) + */ private $databaseConfig = array(); + + /** + * Associative array of settings loaded from the database + * @var array(string=>array(string=>string)) + */ private $settings = array(); + /** + * Constructs a new instance of the Config class + * + * @param string $dbconfig Database configuration file contents + * @return RippingCluster_Config + */ public function __construct($dbconfig) { $this->dbconfig = $dbconfig; $this->parseDatabaseConfig(); } + /** + * Parses the contents of the database configuration file so that individual settings can be retrieved. + * + */ public function parseDatabaseConfig() { $this->databaseConfig = parse_ini_file($this->dbconfig); } + /** + * Returns the value of the named item from the database configuration file + * + * @param string $key Name of the setting to retrieve + */ public function getDatabase($key) { if (!isset($this->databaseConfig[$key])) { throw new RippingCluster_Exception_DatabaseConfigMissing($key); @@ -26,29 +89,55 @@ class RippingCluster_Config { return $this->databaseConfig[$key]; } + /** + * Sets the database instance used by this object + * + * @param RippingCluster_Database $database Database instance + */ public function setDatabase(RippingCluster_Database $database) { $this->database = $database; $this->preload(); } - public function preload() { + /** + * Loads the entire list of settings from the database + * + */ + private function preload() { if (!$this->database) { throw new RippingCluster_Exception_NoDatabaseConnection(); } - $this->settings = $this->database->selectAssoc('SELECT name,value FROM settings', 'name', 'value'); + $this->settings = $this->database->selectAssoc('SELECT name,type,value FROM settings', 'name', array('name', 'value', 'type')); } + /** + * Identifies whether the named setting exists + * + * @param string $key Name of the setting + * @return bool + */ public function exists($key) { return isset($this->settings[$key]); } + /** + * Fetches the value of the named setting + * + * @param string $key Name of the setting + */ public function get($key) { if (!isset($this->settings[$key])) { throw new RippingCluster_Exception_UnknownSetting($key); } - return $this->settings[$key]; + switch ($this->settings[$key]['type']) { + case TYPE_STRING_LIST: + return explode("\n", $this->settings[$key]['value']); + + default: + return $this->settings[$key]['value']; + } } }; diff --git a/lib/RippingCluster/Database.class.php b/lib/RippingCluster/Database.class.php index 9ff1b14..49f0b13 100644 --- a/lib/RippingCluster/Database.class.php +++ b/lib/RippingCluster/Database.class.php @@ -32,11 +32,20 @@ class RippingCluster_Database { $this->dbh = null; } - public function selectAssoc($sql, $key_col, $value_col) { + public function selectAssoc($sql, $key_col, $value_cols) { $results = array(); foreach ($this->dbh->query($sql) as $row) { - $results[$row[$key_col]] = $row[$value_col]; + if (is_array($value_cols)) { + $values = array(); + foreach ($value_cols as $value_col) { + $values[$value_col] = $row[$value_col]; + } + + $results[$row[$key_col]] = $values; + } else { + $results[$row[$key_col]] = $row[$value_col]; + } } return $results; diff --git a/lib/RippingCluster/Source/Plugin/Bluray.class.php b/lib/RippingCluster/Source/Plugin/Bluray.class.php index 5fa94a6..4ecfc27 100644 --- a/lib/RippingCluster/Source/Plugin/Bluray.class.php +++ b/lib/RippingCluster/Source/Plugin/Bluray.class.php @@ -13,17 +13,19 @@ class RippingCluster_Source_Plugin_Bluray extends RippingCluster_PluginBase impl */ public static function enumerate() { $config = RippingCluster_Main::instance()->config(); - $directory = $config->get('source.bluray.dir'); + $directories = $config->get('source.bluray.dir'); - if (!is_dir($directory)) { - throw new RippingCluster_Exception_InvalidSourceDirectory($directory); - } - - $sources = array(); - - $iterator = new RippingCluster_Utility_BlurayDirectoryIterator(new RippingCluster_Utility_VisibleFilesIterator(new DirectoryIterator($directory))); - foreach ($iterator as /** @var SplFileInfo */ $source_vts) { - $sources[] = self::load($source_vts->getPathname(), false); + foreach ($directories as $directory) { + if (!is_dir($directory)) { + throw new RippingCluster_Exception_InvalidSourceDirectory($directory); + } + + $sources = array(); + + $iterator = new RippingCluster_Utility_BlurayDirectoryIterator(new RippingCluster_Utility_VisibleFilesIterator(new DirectoryIterator($directory))); + foreach ($iterator as /** @var SplFileInfo */ $source_vts) { + $sources[] = self::load($source_vts->getPathname(), false); + } } return $sources; @@ -99,11 +101,14 @@ class RippingCluster_Source_Plugin_Bluray extends RippingCluster_PluginBase impl } $real_source_filename = realpath($source_filename); - $source_basedir = $config->get('source.bluray.dir'); - $real_source_basedir = realpath($source_basedir); - - if (substr($real_source_filename, 0, strlen($real_source_basedir)) != $real_source_basedir) { - return false; + // Check all of the source directories specified in the config + $source_directories = $config->get('source.bluray.dir'); + foreach ($source_directories as $source_basedir) { + $real_source_basedir = realpath($source_basedir); + + if (substr($real_source_filename, 0, strlen($real_source_basedir)) != $real_source_basedir) { + return false; + } } return true; diff --git a/lib/RippingCluster/Source/Plugin/HandBrake.class.php b/lib/RippingCluster/Source/Plugin/HandBrake.class.php index 3490ed0..d961023 100644 --- a/lib/RippingCluster/Source/Plugin/HandBrake.class.php +++ b/lib/RippingCluster/Source/Plugin/HandBrake.class.php @@ -23,17 +23,19 @@ class RippingCluster_Source_Plugin_HandBrake extends RippingCluster_PluginBase i */ public static function enumerate() { $config = RippingCluster_Main::instance()->config(); - $directory = $config->get('source.handbrake.dir'); + $directories = $config->get('source.handbrake.dir'); - if (!is_dir($directory)) { - throw new RippingCluster_Exception_InvalidSourceDirectory($directory); - } - - $sources = array(); - - $iterator = new RippingCluster_Utility_DvdDirectoryIterator(new RippingCluster_Utility_VisibleFilesIterator(new DirectoryIterator($directory))); - foreach ($iterator as /** @var SplFileInfo */ $source_vts) { - $sources[] = self::load($source_vts->getPathname(), false); + foreach ($directories as $directory) { + if (!is_dir($directory)) { + throw new RippingCluster_Exception_InvalidSourceDirectory($directory); + } + + $sources = array(); + + $iterator = new RippingCluster_Utility_DvdDirectoryIterator(new RippingCluster_Utility_VisibleFilesIterator(new DirectoryIterator($directory))); + foreach ($iterator as /** @var SplFileInfo */ $source_vts) { + $sources[] = self::load($source_vts->getPathname(), false); + } } return $sources; @@ -203,11 +205,14 @@ class RippingCluster_Source_Plugin_HandBrake extends RippingCluster_PluginBase i } $real_source_filename = realpath($source_filename); - $source_basedir = $config->get('source.handbrake.dir'); - $real_source_basedir = realpath($source_basedir); - - if (substr($real_source_filename, 0, strlen($real_source_basedir)) != $real_source_basedir) { - return false; + // Check all of the source directories specified in the config + $source_directories = $config->get('source.handbrake.dir'); + foreach ($source_directories as $source_basedir) { + $real_source_basedir = realpath($source_basedir); + + if (substr($real_source_filename, 0, strlen($real_source_basedir)) != $real_source_basedir) { + return false; + } } return true;