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);
- }
|