]> source.dussan.org Git - nextcloud-server.git/commitdiff
make use of the command line tools id3info and mp3info for scanning music if they...
authorRobin Appelman <icewind1991@gmail.com>
Thu, 28 Jul 2011 18:10:58 +0000 (20:10 +0200)
committerRobin Appelman <icewind1991@gmail.com>
Thu, 28 Jul 2011 18:10:58 +0000 (20:10 +0200)
apps/media/lib_scanner.php
lib/filestorage.php
lib/helper.php

index aa0ca94a43d02d85ee89c6ddb4c88c34c5634b5b..296acbdbaa9666218e276777930e6da7b325e22f 100644 (file)
@@ -68,40 +68,79 @@ class OC_MEDIA_SCANNER{
         * @return boolean
         */
        public static function scanFile($path){
-               if(!self::$getID3){
-                       self::$getID3=@new getID3();
-               }
                $file=OC_FILESYSTEM::getLocalFile($path);
-               $data=@self::$getID3->analyze($file);
-               getid3_lib::CopyTagsToComments($data);
-               if(!isset($data['comments'])){
-                       error_log("error reading id3 tags in '$file'");
-                       return;
-               }
-               if(!isset($data['comments']['artist'])){
-                       error_log("error reading artist tag in '$file'");
-                       $artist='unknown';
-               }else{
-                       $artist=stripslashes($data['comments']['artist'][0]);
-                       $artist=utf8_encode($artist);
-               }
-               if(!isset($data['comments']['album'])){
-                       error_log("error reading album tag in '$file'");
-                       $album='unknown';
-               }else{
-                       $album=stripslashes($data['comments']['album'][0]);
-                       $album=utf8_encode($album);
-               }
-               if(!isset($data['comments']['title'])){
-                       error_log("error reading title tag in '$file'");
+               if(substr($path,-3)=='mp3' and OC_HELPER::canExecute("id3info") and OC_HELPER::canExecute("mp3info")){//use the command line tool id3info if possible
+                       $output=array();
+                       $size=filesize($file);
+                       $length=0;
                        $title='unknown';
+                       $album='unknown';
+                       $artist='unknown';
+                       $track=0;
+                       exec('id3info "'.$file.'"',$output);
+                       $data=array();
+                       foreach($output as $line) {
+                               switch(substr($line,0,3)){
+                                       case '***'://comments
+                                               break;
+                                       case '==='://tag information
+                                               $key=substr($line,4,4);
+                                               $value=substr($line,strpos($line,':')+2);
+                                               switch(strtolower($key)){
+                                                       case 'tit1':
+                                                       case 'tit2':
+                                                               $title=$value;
+                                                               break;
+                                                       case 'tpe1':
+                                                       case 'tpe2':
+                                                               $artist=$value;
+                                                               break;
+                                                       case 'talb':
+                                                               $album=$value;
+                                                               break;
+                                                       case 'trck':
+                                                               $track=$value;
+                                                               break;
+                                               }
+                                               break;
+                               }
+                       }
+                       $length=exec('mp3info -p "%S" "'.$file.'"');
                }else{
-                       $title=stripslashes($data['comments']['title'][0]);
-                       $title=utf8_encode($title);
+                       if(!self::$getID3){
+                               self::$getID3=@new getID3();
+                       }
+                       $data=@self::$getID3->analyze($file);
+                       getid3_lib::CopyTagsToComments($data);
+                       if(!isset($data['comments'])){
+                               error_log("error reading id3 tags in '$file'");
+                               return;
+                       }
+                       if(!isset($data['comments']['artist'])){
+                               error_log("error reading artist tag in '$file'");
+                               $artist='unknown';
+                       }else{
+                               $artist=stripslashes($data['comments']['artist'][0]);
+                               $artist=utf8_encode($artist);
+                       }
+                       if(!isset($data['comments']['album'])){
+                               error_log("error reading album tag in '$file'");
+                               $album='unknown';
+                       }else{
+                               $album=stripslashes($data['comments']['album'][0]);
+                               $album=utf8_encode($album);
+                       }
+                       if(!isset($data['comments']['title'])){
+                               error_log("error reading title tag in '$file'");
+                               $title='unknown';
+                       }else{
+                               $title=stripslashes($data['comments']['title'][0]);
+                               $title=utf8_encode($title);
+                       }
+                       $size=$data['filesize'];
+                       $track=(isset($data['comments']['track']))?$data['comments']['track'][0]:0;
+                       $length=round($data['playtime_seconds']);
                }
-               $size=$data['filesize'];
-               $track=(isset($data['comments']['track']))?$data['comments']['track'][0]:0;
-               $length=round($data['playtime_seconds']);
                if(!isset(self::$artists[$artist])){
                        $artistId=OC_MEDIA_COLLECTION::addArtist($artist);
                        self::$artists[$artist]=$artistId;
index 95e8c31eff294879a5db14841c5db65c1c38833b..601cf6f37fe833526d5c9416f56f9613d978df46 100644 (file)
@@ -200,7 +200,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
                        } else if (function_exists("mime_content_type")) {
                                // use mime magic extension if available
                                $mime_type = mime_content_type($this->datadir.$fspath);
-                       } else if (self::canExecute("file")) {
+                       } else if (OC_HELPER::canExecute("file")) {
                                // it looks like we have a 'file' command,
                                // lets see it it does have mime support
                                $fp = popen("file -i -b '{$this->datadir}$fspath' 2>/dev/null", "r");
@@ -223,62 +223,6 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
                }
        }
 
-       /**
-       * detect if a given program is found in the search PATH
-       *
-       * helper function used by _mimetype() to detect if the
-       * external 'file' utility is available
-       *
-       * @param  string  program name
-       * @param  string  optional search path, defaults to $PATH
-       * @return bool    true if executable program found in path
-       */
-       private function canExecute($name, $path = false)
-       {
-               // path defaults to PATH from environment if not set
-               if ($path === false) {
-                       $path = getenv("PATH");
-               }
-
-               // check method depends on operating system
-               if (!strncmp(PHP_OS, "WIN", 3)) {
-                       // on Windows an appropriate COM or EXE file needs to exist
-                       $exts = array(".exe", ".com");
-                       $check_fn = "file_exists";
-               } else {
-                       // anywhere else we look for an executable file of that name
-                       $exts = array("");
-                       $check_fn = "is_executable";
-               }
-
-        // Default check will be done with $path directories :
-        $dirs = explode(PATH_SEPARATOR, $path);
-
-               // WARNING : We have to check if open_basedir is enabled :
-               $obd = ini_get('open_basedir');
-
-               if($obd != "none")
-            $obd_values = explode(PATH_SEPARATOR, $obd);
-
-               if(count($obd_values) > 0)
-               {
-            // open_basedir is in effect !
-            // We need to check if the program is in one of these dirs :
-            $dirs = $obd_values;
-        }
-
-        foreach($dirs as $dir)
-        {
-            foreach($exts as $ext)
-            {
-                if($check_fn("$dir/$name".$ext))
-                    return true;
-            }
-        }
-
-               return false;
-       }
-
        public function toTmpFile($path){
                $tmpFolder=sys_get_temp_dir();
                $filename=tempnam($tmpFolder,'OC_TEMP_FILE_'.substr($path,strrpos($path,'.')));
index 96d5bfad826ac6b4f16fa533d85af66296e17902..1fbcc589d101fe602590db82e1f38ccb25fb2dfa 100755 (executable)
@@ -267,6 +267,51 @@ class OC_HELPER {
                if((isset($_REQUEST[$s]) && $_REQUEST[$s]==$v) || $v == $d)
                        print "checked=\"checked\" ";
        }
+
+       /**
+       * detect if a given program is found in the search PATH
+       *
+       * @param  string  program name
+       * @param  string  optional search path, defaults to $PATH
+       * @return bool    true if executable program found in path
+       */
+       public static function canExecute($name, $path = false){
+               // path defaults to PATH from environment if not set
+               if ($path === false) {
+                       $path = getenv("PATH");
+               }
+               // check method depends on operating system
+               if (!strncmp(PHP_OS, "WIN", 3)) {
+                       // on Windows an appropriate COM or EXE file needs to exist
+                       $exts = array(".exe", ".com");
+                       $check_fn = "file_exists";
+               } else {
+                       // anywhere else we look for an executable file of that name
+                       $exts = array("");
+                       $check_fn = "is_executable";
+               }
+               // Default check will be done with $path directories :
+               $dirs = explode(PATH_SEPARATOR, $path);
+               // WARNING : We have to check if open_basedir is enabled :
+               $obd = ini_get('open_basedir');
+               if($obd != "none")
+                       $obd_values = explode(PATH_SEPARATOR, $obd);
+               if(count($obd_values) > 0 and $obd_values[0])
+               {
+                       // open_basedir is in effect !
+                       // We need to check if the program is in one of these dirs :
+                       $dirs = $obd_values;
+               }
+               foreach($dirs as $dir)
+               {
+                       foreach($exts as $ext)
+                       {
+                               if($check_fn("$dir/$name".$ext))
+                                       return true;
+                       }
+               }
+               return false;
+       }
 }
 
 ?>