| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 | <?php//////////////////////////////////////////////////////////////////// getID3() by James Heinrich <info@getid3.org>               ////  available at https://github.com/JamesHeinrich/getID3       ////            or https://www.getid3.org                        ////            or http://getid3.sourceforge.net                 ////                                                             //// /demo/demo.dirscan.php - part of getID3()                   //// Directory Scanning and Caching CLI tool for batch media     ////   file processing with getID3()                             ////  by Karl G. Holz <newaeonØmac*com>                          ////                                                            ////////////////////////////////////////////////////////////////////die('For security reasons, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in demos/'.basename(__FILE__));/*** This is a directory scanning and caching cli tool for getID3().** use like so for the default sqlite3 database, which is hidden:** cd <path you want to start scanning from>* php <path to getid3 files>/demo.dirscan.php** or** php <path to getid3 files>/demo.dirscan.php <dir to scan> <file ext in csv list>** Supported Cache Types    (this extension)**   SQL Databases:**   cache_type*   -------------------------------------------------------------------*    mysql$cache='mysql';$database['host']='';$database['database']='';$database['username']='';$database['password']='';$database['table']='';*    sqlite3$cache='sqlite3';$database['table']='getid3_cache';$database['hide']=true;*/$dir      = $_SERVER['PWD'];$media    = array('mp4', 'm4v', 'mov', 'mp3', 'm4a', 'jpg', 'png', 'gif');$database = array();/*** configure the database bellow*/// sqlite3$cache             = 'sqlite3';$database['table'] = 'getid3_cache';$database['hide']  = true;/** * mysql$cache                = 'mysql';$database['host']     = '';$database['database'] = '';$database['username'] = '';$database['password'] = '';$database['table']    = '';*//*** id3 tags class file*/require_once(dirname(__FILE__).'/getid3.php');/*** dirscan scans all directories for files that match your selected filetypes into the cache database* this is useful for a lot of media files*** @package dirscan* @author Karl Holz**/class dirscan {	/**	* type_brace()  * Might not work on Solaris and other non GNU systems *	*	* Configures a filetype list for use with glob searches,	* will match uppercase or lowercase extensions only, no mixing	* @param string $dir directory to use	* @param mixed $search cvs list of extentions or an array	* @return string or null if checks fail	*/	private function type_brace($dir, $search=array()) {		$dir = str_replace(array('///', '//'), array('/', '/'), $dir);		if (!is_dir($dir)) {			return null;		}		if (!is_array($search)) {			$e = explode(',', $search);		} elseif (count($search) < 1) {			return null;		} else {			$e = $search;		}		$ext = array();		foreach ($e as $new) {			$ext[] = strtolower(trim($new));			$ext[] = strtoupper(trim($new));		}		$b = $dir.'/*.{'.implode(',', $ext).'}';		return $b;	}	/**	* this function will search 4 levels deep for directories	* will return null on failure	* @param string $root	* @return array return an array of dirs under root	* @todo figure out how to block tabo directories with ease	*/	private function getDirs($root) {		switch ($root) { // return null on tabo directories, add as needed -> case {dir to block }:   this is not perfect yet			case '/':			case '/var':			case '/etc':			case '/home':			case '/usr':			case '/root':			case '/private/etc':			case '/private/var':			case '/etc/apache2':			case '/home':			case '/tmp':			case '/var/log':				return null;				break;			default: // scan 4 directories deep				if (!is_dir($root)) {    				return null;				}				$dirs = array_merge(glob($root.'/*', GLOB_ONLYDIR), glob($root.'/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*/*/*', GLOB_ONLYDIR), glob($root.'/*/*/*/*/*/*/*', GLOB_ONLYDIR));				break;		}		if (count($dirs) < 1) {			$dirs = array($root);		}		return $dirs;	}	/**	*  file_check() check the number of file that are found that match the brace search	*	* @param string $search	* @return mixed	*/	private function file_check($search) {		$t = array();		$s = glob($search, GLOB_BRACE);		foreach ($s as $file) {			$t[] = str_replace(array('///', '//'), array('/', '/'), $file);		}		if (count($t) > 0) {			return $t;		}		return null;	}	function getTime() {		return microtime(true);		// old method for PHP < 5		//$a = explode(' ', microtime());		//return (double) $a[0] + $a[1];	}	/**	*	* @param string $dir	* @param mixed  $match  search type name extentions, can be an array or csv list	* @param string $cache caching extention, select one of sqlite3, mysql, dbm	* @param array  $opt database options,	*/	function scan_files($dir, $match, $cache='sqlite3', $opt=array('table'=>'getid3_cache', 'hide'=>true)) {		$Start = self::getTime();		switch ($cache) { // load the caching module			case 'sqlite3':				if (!class_exists('getID3_cached_sqlite3')) {					require_once(dirname(__FILE__)).'/extension.cache.sqlite3.php';				}				$id3 = new getID3_cached_sqlite3($opt['table'], $opt['hide']);				break;			case 'mysql':				if (!class_exists('getID3_cached_mysql')) {					require_once(dirname(__FILE__)).'/extension.cache.mysql.php';				}				$id3 = new getID3_cached_mysql($opt['host'], $opt['database'], $opt['username'], $opt['password'], $opt['table']);				break;		// I'll leave this for some one else			//case 'dbm':			//	if (!class_exists('getID3_cached_dbm')) {			//		require_once(dirname(__FILE__)).'/extension.cache.dbm.php';			//	}			//	die(' This has not be implemented, sorry for the inconvenience');			//	break;			default:				die(' You have selected an Invalid cache type, only "sqlite3" and "mysql" are valid'."\n");				break;		}		$count = array('dir'=>0, 'file'=>0);		$dirs = self::getDirs($dir);		if ($dirs !== null) {			foreach ($dirs as $d) {				echo ' Scanning: '.$d."\n";				$search = self::type_brace($d, $match);				if ($search !== null) {    				$files = self::file_check($search);					if ($files !== null) {						foreach ($files as $f) {							echo ' * Analyzing '.$f.' '."\n";							$id3->analyze($f);							$count['file']++;						}						$count['dir']++;					} else {						echo 'Failed to get files '."\n";					}				} else {					echo 'Failed to create match string '."\n";				}			}			echo '**************************************'."\n";			echo '* Finished Scanning your directories '."\n*\n";			echo '* Directories '.$count['dir']."\n";			echo '* Files '.$count['file']."\n";			$End = self::getTime();			$t = number_format(($End - $Start) / 60, 2);			echo '* Time taken to scan '.$dir.' '.$t.' min '."\n";			echo '**************************************'."\n";		} else {			echo ' failed to get directories '."\n";		}	}}if (PHP_SAPI === 'cli') {	if (count($argv) == 2) {		if (is_dir($argv[1])) {			$dir = $argv[1];		}		if (count(explode(',', $argv[2])) > 0) {			$media = $arg[2];		}	}	echo ' * Starting to scan directory: '.$dir."\n";	echo ' * Using default media types: '.implode(',', $media)."\n";	dirscan::scan_files($dir, $media, $cache, $database);}
 |