<?php
/////////////////////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org> //
// available at http://getid3.sourceforge.net //
// or http://www.getid3.org ///
/////////////////////////////////////////////////////////////////////////////////
/// //
// getid3.dirscan.php - tool for batch media file processing with getID3() //
// ///
/////////////////////////////////////////////////////////////////////////////////
/// //
// Directory Scanning and Caching cli tool by Karl G. Holz <newaeon�mac*com> //
// ///
/////////////////////////////////////////////////////////////////////////////////
/**
* 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>/getid3.dirscan.php
*
* or
*
* php <path to getid3 files>/getid3.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 getid3_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 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));
}
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() {
$a = explode (' ',microtime());
return(double) $a[0] + $a[1];
}
/**
*
* @param type $dir
* @param type $match search type name extentions, can be an array or csv list
* @param type $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;
// case 'dbm':
// if (!class_exists('getID3_cached_dbm')) {
// require_once(dirname(__FILE__)).'/extension.cache.dbm.php';
// } //i'll leave this for some one else
// die (" This has not be implimented, sorry for the inconvience");
// break;
default: die(" You have selected an Invalid cache type, only SQLite3, MySQL and dbm are valid \n");
}
$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=$argv[2];
}
}
echo " * Starting to scan directory: ".$dir."\n";
echo " * Using default media types: ".implode(',', $media)."\n";
getid3_dirscan::scan_files($dir, $media, $cache, $database);
} else {
echo "You must do this in the console";
}
?>
|