[pLog-svn] r2431 - plog/branches/plog-1.0.2/class/gallery/dao

oscar at devel.plogworld.net oscar at devel.plogworld.net
Tue Aug 30 21:32:16 GMT 2005


Author: oscar
Date: 2005-08-30 21:32:15 +0000 (Tue, 30 Aug 2005)
New Revision: 2431

Modified:
   plog/branches/plog-1.0.2/class/gallery/dao/galleryresources.class.php
Log:
This is a merge of nick's work in mantis issue 650 (http://bugs.plogworld.net/view.php?id=650) with some of my own discoveries... Turns out that php has problems unserializing certain arrays (the output of getid3 is serialized into a database field, and later on unserialized whenever needed) and that caused WMA and ASF files not to display any information but more importantly, this solves the long-standing bug where images with EXIF tags could not be displayed. I would have never thought that these two issues could be related, but removing certain fields which are part of the EXIF tags automatically made all images display just fine... (in my opinion, this is a bug in php because unserialization errors shouldn't affect the rest of the script!)

I tried with an image taken with my girlfriend's Canon EOS 300D at 6mpx, full of EXIF metadata. Before the fix, it was not working. After the fix, it worked like a charm but I would appreciate it if somebody tested this a bit more (try first with a 1.0.1 version and then try with this new version)

Now GalleryResources::_filterMetadata takes care of extracting only the information that we really need from the metadata extracted by getid3, which is not so much anymore. As as side effect, the medata field from the plog_gallery_resources table won't grow too big anymore!

Modified: plog/branches/plog-1.0.2/class/gallery/dao/galleryresources.class.php
===================================================================
--- plog/branches/plog-1.0.2/class/gallery/dao/galleryresources.class.php	2005-08-30 19:09:04 UTC (rev 2430)
+++ plog/branches/plog-1.0.2/class/gallery/dao/galleryresources.class.php	2005-08-30 21:32:15 UTC (rev 2431)
@@ -63,7 +63,7 @@
 		"mpg" => GALLERY_RESOURCE_VIDEO,
 		"mpeg" => GALLERY_RESOURCE_VIDEO,
         "wmv" => GALLERY_RESOURCE_VIDEO,
-		"asf" => GALLERY_RESOURCE_VIDEO,
+		//"asf" => GALLERY_RESOURCE_VIDEO,
         "mov" => GALLERY_RESOURCE_VIDEO,
         "divx" => GALLERY_RESOURCE_VIDEO,
 		"rm" => GALLERY_RESOURCE_VIDEO,
@@ -276,23 +276,6 @@
 		}
 
 		/**
-		 * @private
-		 * finds out the right resource type for a given file upload 
-		 */
-		function getResourceType( $fileName )
-		{
-			// get the resource type
-			$fileParts = explode( ".", $fileName );
-			$fileExt = strtolower($fileParts[count($fileParts)-1]);
-			if( array_key_exists( $fileExt, $this->_extensionToType ))
-				$resourceType = $this->_extensionToType[ $fileExt ];
-			else
-				$resourceType = GALLERY_RESOURCE_UNKNOWN;
-			
-			return $resourceType;	
-		}
-
-		/**
 		 * Adds a row related to a resource to the database. You should usually use
 		 * GalleryResources::addResource() or GalleryResources::addResourceFromDisk(), which are more
 		 * suitable and will do most of the job for you.
@@ -417,7 +400,36 @@
 			$result = $resizer->generate( $outFile, $previewWidth, $previewHeight, $previewKeepAspectRatio );
 			
 			return $result;
-		}		
+		}
+		
+		/**
+		 * @private
+		 * @param fileName
+		 * @param metadata
+		 */
+		function _getResourceType( $fileName, &$metadata )
+		{
+  			// find out the right resource type based on the extension
+			// get the resource type
+			$fileParts = explode( ".", $fileName );
+			$fileExt = strtolower($fileParts[count($fileParts)-1]);
+			
+			//asf need special working
+			if ("asf" == $fileExt ){			 
+                if (!($metadata["audio"]["codec"]))                            
+                    $resourceType = GALLERY_RESOURCE_SOUND;
+                else 
+                    $resourceType = GALLERY_RESOURCE_VIDEO;
+             }           
+ 		     else {
+    			if( array_key_exists( $fileExt, $this->_extensionToType ))
+	   			     $resourceType = $this->_extensionToType[ $fileExt ];
+		  	   else
+				    $resourceType = GALLERY_RESOURCE_UNKNOWN;
+            }
+            
+            return( $resourceType );					
+		}
 
         /**
          * adds a resource to the database. This method requires a FileUpload parameter and it
@@ -462,18 +474,21 @@
             // get the metadata
             $getId3 = new GetID3();
             $metadata = $getId3->analyze( $upload->getTmpName());
-			
-			// find out the right resource type based on the extension
-			$resourceType = $this->getResourceType( $upload->getFileName());
-			
+            // nifty helper method from the getid3 package
+            getid3_lib::CopyTagsToComments($metadata);            
+            
+            $resourceType = $this->_getResourceType( $upload->getFileName(), $metadata );
+            
             // set the flags
             $flags = 0;
             if( $resourceType == GALLERY_RESOURCE_IMAGE )
                 $flags = $flags|GALLERY_RESOURCE_PREVIEW_AVAILABLE;
-			
+                
+            $info = $this->_filterMetadata( $metadata, $resourceType );               
+      		
             // add the record to the database
             $fileName = $upload->getFileName();
-			$resourceId = $this->addResourceToDatabase( $ownerId, $albumId, $description, $flags, $resourceType, $filePath, $fileName, $metadata );
+			$resourceId = $this->addResourceToDatabase( $ownerId, $albumId, $description, $flags, $resourceType, $filePath, $fileName, $info );
 			if( !$resourceId )
 				return false;
 			
@@ -504,6 +519,46 @@
         }
         
         /**
+         * @private
+         * Returns an array with only those bits of metadata as generate by getid3 that
+         * we'd like to keep, instead of one huge array
+         *
+         * @param metadata
+         * @param resourceType
+         */
+        function _filterMetadata( &$metadata, $resourceType ) 
+        {
+            $info = Array();
+            $info["md5_file"] = $metadata["md5_file"];
+            $info["md5_data"] = $metadata["md5_data"];
+            $info["filesize"]= $metadata["filesize"];
+            $info["fileformat"] = $metadata["fileformat"]; 
+            $info["comments"] = $metadata["comments"];
+                        
+            if($resourceType == GALLERY_RESOURCE_IMAGE){
+                $info["video"] = $metadata["video"];
+                $info["jpg"]["exif"]["FILE"] = $metadata["jpg"]["exif"]["FILE"];
+                $info["jpg"]["exif"]["COMPUTED"] = $metadata["jpg"]["exif"]["COMPUTED"];
+                $info["jpg"]["exif"]["IFD0"] = $metadata["jpg"]["exif"]["IFD0"];
+                $metadata["jpg"]["exif"]["EXIF"]["MakerNote"] = "";
+                $info["jpg"]["exif"]["EXIF"] = $metadata["jpg"]["exif"]["EXIF"];
+             }  
+             else  if($resourceType == GALLERY_RESOURCE_SOUND){
+                $info["audio"] = $metadata["audio"];
+                $info["playtime_string"] = $metadata["playtime_string"];
+                $info["playtime_seconds"] = $metadata["playtime_seconds"];
+             }   
+             else  if($resourceType == GALLERY_RESOURCE_VIDEO){
+                $info["video"] = $metadata["video"];
+                $info["audio"] = $metadata["audio"];
+                $info["playtime_seconds"] = $metadata["playtime_seconds"];                
+                $info["playtime_string"] = $metadata["playtime_string"];                
+             } 
+             
+             return( $info );            
+        }
+        
+        /**
          * adds a resource to the gallery when the resource is already stored on disk, instead of
          * it coming from an upload as it usually happens. This method is better than 
 		 * GalleryResources::addResource() when instead of dealing with uploaded files, the file
@@ -536,10 +591,12 @@
             // get the metadata
             $getId3 = new GetID3();
             $metadata = $getId3->analyze( $fullFilePath );
+            // nifty helper method from the getid3 package
+            getid3_lib::CopyTagsToComments($metadata);                      
     
-            // find out the right resource type based on the extension
-            $resourceType = $this->getResourceType( $fileName );
-    
+            $resourceType = $this->_getResourceType( $fullFilePath, $metadata );
+            $info = $this->_filterMetadata( $metadata, $resourceType );            		
+			    
             // set the flags
             $flags = 0;
             if( $resourceType == GALLERY_RESOURCE_IMAGE )
@@ -735,6 +792,7 @@
              // to which album this resource belongs
              $album = $this->albums->getAlbum( $row["album_id"], $row["owner_id"], false );
              $res->setAlbum( $album );
+              // print_r(unserialize($row["metadata"]));
 
              return $res;
         }




More information about the pLog-svn mailing list