aboutsummaryrefslogtreecommitdiffstats
path: root/apps/media/lib_scanner.php
diff options
context:
space:
mode:
authorRobin Appelman <icewind1991@gmail.com>2011-07-22 06:30:52 +0200
committerRobin Appelman <icewind1991@gmail.com>2011-07-22 06:30:52 +0200
commit38f1cffab39ae763f3929bcc37e6f8746f582083 (patch)
treea833cacb98acc372f40dda0c757904b4cba9c331 /apps/media/lib_scanner.php
parentf441059b015b01af1fcafcdeeef8727f19d0d2d5 (diff)
downloadnextcloud-server-38f1cffab39ae763f3929bcc37e6f8746f582083.tar.gz
nextcloud-server-38f1cffab39ae763f3929bcc37e6f8746f582083.zip
import media app
Diffstat (limited to 'apps/media/lib_scanner.php')
-rw-r--r--apps/media/lib_scanner.php120
1 files changed, 120 insertions, 0 deletions
diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php
new file mode 100644
index 00000000000..aa0ca94a43d
--- /dev/null
+++ b/apps/media/lib_scanner.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+* ownCloud - media plugin
+*
+* @author Robin Appelman
+* @copyright 2010 Robin Appelman icewind1991@gmail.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+require_once('getID3/getid3/getid3.php');
+
+//class for scanning directories for music
+class OC_MEDIA_SCANNER{
+ static private $getID3=false;
+
+ //these are used to store which artists and albums we found, it can save a lot of addArtist/addAlbum calls
+ static private $artists=array();
+ static private $albums=array();//stored as "$artist/$album" to allow albums with the same name from different artists
+
+ /**
+ * scan a folder for music
+ * @param string $path
+ * @return int the number of songs found
+ */
+ public static function scanFolder($path){
+ if (OC_FILESYSTEM::is_dir($path)) {
+ $songs=0;
+ if ($dh = OC_FILESYSTEM::opendir($path)) {
+ while (($filename = readdir($dh)) !== false) {
+ if($filename<>'.' and $filename<>'..' and substr($filename,0,1)!='.'){
+ $file=$path.'/'.$filename;
+ if(OC_FILESYSTEM::is_dir($file)){
+ $songs+=self::scanFolder($file);
+ }elseif(OC_FILESYSTEM::is_file($file)){
+ if(self::scanFile($file)){
+ $songs++;
+ }
+ }
+ }
+ }
+ }
+ }elseif(OC_FILESYSTEM::is_file($path)){
+ $songs=1;
+ self::scanFile($path);
+ }else{
+ $songs=0;
+ }
+ return $songs;
+ }
+
+ /**
+ * scan a file for music
+ * @param string $path
+ * @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'");
+ $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']);
+ if(!isset(self::$artists[$artist])){
+ $artistId=OC_MEDIA_COLLECTION::addArtist($artist);
+ self::$artists[$artist]=$artistId;
+ }else{
+ $artistId=self::$artists[$artist];
+ }
+ if(!isset(self::$albums[$artist.'/'.$album])){
+ $albumId=OC_MEDIA_COLLECTION::addAlbum($album,$artistId);
+ self::$albums[$artist.'/'.$album]=$albumId;
+ }else{
+ $albumId=self::$albums[$artist.'/'.$album];
+ }
+ $songId=OC_MEDIA_COLLECTION::addSong($title,$path,$artistId,$albumId,$length,$track,$size);
+ return !($title=='unkown' && $artist=='unkown' && $album=='unkown');
+ }
+} \ No newline at end of file