Changeset 5183
- Timestamp:
- Mar 18, 2010, 11:47:11 PM (14 years ago)
- Location:
- extensions/AMetaData
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/AMetaData/admin/amd_metadata_database.tpl
r5080 r5183 233 233 <form class="formtable"> 234 234 <div class="warning"> 235 <p style="font-weight:bold; font-size:+ 1;">{'g003_warning_on_analyze_0'|@translate}</p>235 <p style="font-weight:bold; font-size:+2;">{'g003_warning_on_analyze_0'|@translate}</p> 236 236 <p>{'g003_warning_on_analyze_1'|@translate}</p> 237 237 <p style="font-weight:bold;">{'g003_warning_on_analyze_2'|@translate}</p> … … 271 271 </form> 272 272 </fieldset> 273 273 274 </div> 274 275 -
extensions/AMetaData/amd_aip.class.inc.php
r5097 r5183 33 33 protected $tabsheet; 34 34 protected $ajax; 35 protected $jpegMD;36 35 37 36 /** … … 42 41 * @param String $filelocation 43 42 */ 44 function __construct($prefixeTable, $filelocation)43 public function __construct($prefixeTable, $filelocation) 45 44 { 46 45 parent::__construct($prefixeTable, $filelocation); … … 57 56 $this->page_link.'&fAMD_tabsheet=help'); 58 57 $this->ajax = new Ajax(); 59 $this->jpegMD=new JpegMetaData(); 60 } 61 62 function __destruct() 58 } 59 60 public function __destruct() 63 61 { 64 62 unset($this->tabsheet); 65 63 unset($this->ajax); 66 unset($this->jpegMD);64 parent::__destruct(); 67 65 } 68 66 … … 681 679 682 680 683 /**684 * this function analyze tags from a picture, and insert the result into the685 * database686 *687 * NOTE : only implemented tags are analyzed and stored688 *689 * @param String $fileName : filename of picture to analyze690 * @param Integer $imageId : id of image in piwigo's database691 */692 protected function analyzeImageFile($fileName, $imageId)693 {694 /*695 * the JpegMetaData object is instancied in the constructor696 */697 $this->jpegMD->load($fileName, Array(698 'filter' => JpegMetaData::TAGFILTER_IMPLEMENTED,699 'optimizeIptcDateTime' => true)700 );701 702 $sqlInsert="";703 $massInsert=array();704 $nbTags=0;705 foreach($this->jpegMD->getTags() as $key => $val)706 {707 $value=$val->getLabel();708 709 if($val->isTranslatable())710 $translatable="y";711 else712 $translatable="n";713 714 if($value instanceof DateTime)715 {716 $value=$value->format("Y-m-d H:i:s");717 }718 elseif(is_array($value))719 {720 /*721 * array values are stored in a serialized string722 */723 $value=serialize($value);724 }725 726 $sql="SELECT numId FROM ".$this->tables['used_tags']." WHERE tagId = '$key'";727 $result=pwg_query($sql);728 if($result)729 {730 $numId=-1;731 while($row=mysql_fetch_assoc($result))732 {733 $numId=$row['numId'];734 }735 736 if($numId>0)737 {738 $nbTags++;739 if($sqlInsert!="") $sqlInsert.=", ";740 $sqlInsert.="($imageId, '$numId', '".addslashes($value)."')";741 $massInsert[]="('$imageId', '$numId', '".addslashes($value)."') ";742 }743 }744 }745 746 $sql="REPLACE INTO ".$this->tables['images_tags']." (imageId, numId, value)747 VALUES ".implode(", ", $massInsert);748 pwg_query($sql);749 //mass_inserts($this->tables['images_tags'], array('imageId', 'numId', 'value'), $massInsert);750 751 $sql="UPDATE ".$this->tables['images']."752 SET analyzed = 'y', nbTags=".$nbTags."753 WHERE imageId=$imageId;";754 pwg_query($sql);755 756 757 return("$imageId=$nbTags;");758 }759 760 761 /**762 * returns the number of pictures analyzed763 *764 * @return Integer765 */766 protected function getNumOfPictures()767 {768 $numOfPictures=0;769 $sql="SELECT COUNT(imageId) FROM ".$this->tables['images']."770 WHERE analyzed='y';";771 $result=pwg_query($sql);772 if($result)773 {774 while($row=mysql_fetch_row($result))775 {776 $numOfPictures=$row[0];777 }778 }779 return($numOfPictures);780 }781 681 782 682 … … 910 810 private function ajax_amd_makeStatsConsolidation() 911 811 { 912 $sql="UPDATE ".$this->tables['used_tags']." ut, 913 (SELECT COUNT(imageId) AS nb, numId 914 FROM ".$this->tables['images_tags']." 915 GROUP BY numId) nb 916 SET ut.numOfImg = nb.nb 917 WHERE ut.numId = nb.numId;"; 918 pwg_query($sql); 812 $this->makeStatsConsolidation(); 919 813 } 920 814 -
extensions/AMetaData/amd_install.class.inc.php
r5040 r5183 27 27 private $tablef; 28 28 29 public function AMD_install($prefixeTable, $filelocation)29 public function __construct($prefixeTable, $filelocation) 30 30 { 31 31 parent::__construct($prefixeTable, $filelocation); 32 32 $this->tablef= new manage_tables($this->tables); 33 } 34 35 public function __destruct() 36 { 37 unset($this->tablef); 38 parent::__destruct(); 33 39 } 34 40 … … 126 132 pwg_query("DELETE FROM ".$this->tables['images_tags']); 127 133 pwg_query("UPDATE ".$this->tables['images']." SET analyzed='n', nbTags=0;"); 134 pwg_query("INSERT INTO ".$this->tables['images']." 135 SELECT id, 'n', 0 136 FROM ".IMAGES_TABLE." 137 WHERE id NOT IN (SELECT imageId FROM ".$this->tables['images'].")"); 128 138 /* 129 139 * fill the 'used_tags' table with default values … … 133 143 $sql="INSERT INTO ".$this->tables['used_tags']." VALUES('', '".$key."', '".(($val['translatable'])?'y':'n')."', '".$val['name']."', 0);"; 134 144 pwg_query($sql); 145 } 146 147 $listToAnalyze=Array(Array(), Array()); 148 /* 149 * select 25 pictures into the caddie 150 */ 151 $sql="SELECT ti.id, ti.path 152 FROM ".CADDIE_TABLE." tc 153 LEFT JOIN ".IMAGES_TABLE." ti ON ti.id = tc.element_id 154 ORDER BY RAND() LIMIT 25;"; 155 $result=pwg_query($sql); 156 if($result) 157 { 158 while($row=mysql_fetch_assoc($result)) 159 { 160 $listToAnalyze[0][]=$row; 161 $listToAnalyze[1][]=$row['id']; 162 } 163 } 164 /* 165 * if caddie is empty, of is have less than 25 pictures, select other 166 * pictures from the gallery 167 */ 168 if(count($listToAnalyze[0])<25) 169 { 170 if(count($listToAnalyze[0])>0) 171 { 172 $excludeList="WHERE ti.id NOT IN(".implode(",", $listToAnalyze[1]).") "; 173 } 174 else 175 { 176 $excludeList=""; 177 } 178 $sql="SELECT ti.id, ti.path 179 FROM ".IMAGES_TABLE." ti ".$excludeList." 180 ORDER BY RAND() LIMIT ".(25-count($listToAnalyze[0])).";"; 181 $result=pwg_query($sql); 182 if($result) 183 { 184 while($row=mysql_fetch_assoc($result)) 185 { 186 $listToAnalyze[0][]=$row; 187 } 188 } 189 } 190 191 /* 192 * analyze the 25 selected pictures 193 */ 194 if(count($listToAnalyze[0])>0) 195 { 196 // $path = path of piwigo's on the server filesystem 197 $path=dirname(dirname(dirname(__FILE__))); 198 199 foreach($listToAnalyze[0] as $val) 200 { 201 $this->analyzeImageFile($path."/".$val['path'], $val['id']); 202 } 203 204 $this->makeStatsConsolidation(); 135 205 } 136 206 -
extensions/AMetaData/amd_pip.class.inc.php
r4909 r5183 64 64 $path=dirname(dirname(dirname(__FILE__))); 65 65 $filename=""; 66 $analyzed='n'; 66 67 67 $sql="SELECT path FROM ".IMAGES_TABLE." WHERE id=".$page['image_id'].";"; 68 $sql="SELECT ti.path, tai.analyzed FROM ".IMAGES_TABLE." ti 69 LEFT JOIN ".$this->tables['images']." tai ON tai.imageId = ti.id 70 WHERE ti.id=".$page['image_id'].";"; 68 71 $result=pwg_query($sql); 69 72 if($result) … … 72 75 { 73 76 $filename=$row['path']; 77 $analyzed=$row['analyzed']; 74 78 } 75 79 $filename=$path."/".$filename; 76 80 } 77 81 78 $ JpegMD = new JpegMetaData(82 $this->jpegMD->load( 79 83 $filename, 80 84 Array( … … 113 117 $group=null; 114 118 115 $picturesTags=$ JpegMD->getTags();119 $picturesTags=$this->jpegMD->getTags(); 116 120 117 121 foreach($tagsList as $key => $val) … … 160 164 } 161 165 162 unset($JpegMD); 166 167 if($analyzed=='n' and 168 $this->my_config['amd_FillDataBaseContinuously']=='y' and 169 $this->my_config['amd_AllPicturesAreAnalyzed']=='n') 170 { 171 /* if picture is not analyzed, do analyze 172 * 173 * note : the $loaded parameter is set to true, in this case the function 174 * analyzeImageFile uses data from the $this->jpegMD object which 175 * have data already loaded => the picture is not analyzed twice, 176 * the function only do the database update 177 */ 178 $this->analyzeImageFile($filename, $page['image_id'], true); 179 $this->makeStatsConsolidation(); 180 } 163 181 164 182 $template->assign('metadata', $metadata); -
extensions/AMetaData/amd_root.class.inc.php
r5088 r5183 30 30 { 31 31 protected $css; //the css object 32 33 function AMD_root($prefixeTable, $filelocation) 32 protected $jpegMD; 33 34 public function __construct($prefixeTable, $filelocation) 34 35 { 35 36 $this->plugin_name="AMetaData"; … … 41 42 42 43 $this->css = new css(dirname($this->filelocation).'/'.$this->plugin_name_files.".css"); 43 } 44 $this->jpegMD=new JpegMetaData(); 45 } 46 47 public function __destruct() 48 { 49 unset($this->jpegMD); 50 unset($this->css); 51 //parent::__destruct(); 52 } 53 44 54 45 55 /* --------------------------------------------------------------------------- … … 56 66 'amd_GetListTags_ExcludeUnusedTag' => "y", 57 67 'amd_GetListTags_SelectedTagOnly' => "n", 58 'amd_GetListImages_OrderType' => "value" 68 'amd_GetListImages_OrderType' => "value", 69 'amd_FillDataBaseContinuously' => "y", 70 'amd_AllPicturesAreAnalyzed' => "n", 59 71 ); 60 72 } … … 63 75 { 64 76 parent::load_config(); 65 if(!$this->css->css_file_exists())66 {67 $this->css->make_CSS($this->generate_CSS());68 }69 77 } 70 78 … … 72 80 { 73 81 parent::init_events(); 74 } 75 76 /* 77 * generate the css code 78 */ 79 function generate_CSS() 80 { 81 $text = " 82 .formtable, .formtable P { text-align:left; display:block; } 83 .formtable tr { vertical-align:top; } 84 .littlefont { font-size:90%; } 85 .littlefont td { padding:1px; } 86 table.littlefont th { padding:3px; text-align:left;} 87 table.littlefont td { padding:1px 3px; } 88 #iprogressbar_contener { border:1px solid #606060; margin:0px; padding:0px; display:block; height:20px; } 89 #iprogressbar_bg { background:#606060; display:block; z-index:100; position:relative; height:20px; } 90 #iprogressbar_fg { color:#FF3363; width:100%; text-align:center; display: block; z-index:200; position:relative; top:-18px; } 91 #iHeaderListTags { width:100%; border:1px solid; border-collapse: collapse; margin-top:3px; } 92 #iListTags { width:100%; border:1px solid; height:280px; border-top:0px; overflow:auto;} 93 #iListImages { width:100%; border-bottom:1px solid; overflow:auto;} 94 #iListTagsNb, #iListImagesNb { width:99%; text-align:right; margin-bottom:8px; padding:2px; font-size:80%; } 95 #iListTags table, #iListImages table, table.listTags { width:100%; text-align:left; border-collapse: collapse; } 96 #iListTags table tr:hover { cursor:pointer; background:#303030; } 97 #iListImages table tr:hover, table.listTags tr:hover { background:#303030; cursor:default; } 98 #iHeaderListImages { width:100%; border-bottom:1px solid; } 99 .warning { color:#dd0000; border:1px solid #dd0000; margin-bottom:8px; margin-top:8px; padding:8px; } 100 .warning p { margin-top:0.5em; margin-bottom:0em; } 101 .warning ul { margin-top:0em; margin-bottom:0.5em; } 102 .pctBar { height:6px; background:#FF7700; } 103 li.groupItems { border:1px solid #666666; margin-bottom:5px; padding:0 5px; width:90%; cursor:move; padding:4px; } 104 div.addGroup { padding-left:40px; text-align:left; } 105 #iGroups { list-style: none; } 106 .ui-dialog { background: #222222; border:2px solid #FF3363; } 107 .ui-dialog-buttonpane { padding:4px; } 108 .ui-dialog-buttonpane button { margin-right:8px; } 109 .ui-dialog-titlebar { background:#111111; font-weight:bold; } 110 .ui-dialog-title-dialog { text-align: left; } 111 .ui-dialog-titlebar-close { float: right; } 112 .ui-dialog-content { overflow:auto; } 113 .ui-dialog-container { } 114 .ui-dialog-titlebar-close { display:none; } 115 .tagListOrder { list-style: none; padding:0px; margin-right:8px; margin-left:35px; } 116 .tagListOrder li { border:none; background:#333333; padding:1px; margin-bottom:2px; width:100%; } 117 .groupTags { padding-top:8px; } 118 .editGroupListButton { margin-left:8px; position:absolute; z-index:1000; } 119 table.tagListOrderItem { width:100%; border-collapse:collapse; } 120 .dialogForm { text-align:left; margin:8px; } 121 #ianalyzestatus { background: #333333; margin:8px; padding:8px; } 122 #ianalyzestatus ul { margin:0px; padding:0 0 0 20px; } 123 #iamd_nb_item_per_request_display { display:inline-block; width:70px; } 124 #iamd_nb_item_per_request_slider { display:inline-block; width:350px; } 125 #iDialogProgress { margin:16px 8px 8px; } 126 "; 127 128 return($text); 129 } 82 83 84 if(!isset($_REQUEST['ajaxfct']) and 85 $this->my_config['amd_FillDataBaseContinuously']=='y' and 86 $this->my_config['amd_AllPicturesAreAnalyzed']=='n') 87 { 88 /* do analyze for a random picture only if : 89 * - config is set to fill database continuously 90 * - we are not in an ajax call 91 */ 92 add_event_handler('init', array(&$this, 'doRandomAnalyze')); 93 } 94 } 95 96 97 /** 98 * returns the number of pictures analyzed 99 * 100 * @return Integer 101 */ 102 protected function getNumOfPictures() 103 { 104 $numOfPictures=0; 105 $sql="SELECT COUNT(imageId) FROM ".$this->tables['images']." 106 WHERE analyzed='y';"; 107 $result=pwg_query($sql); 108 if($result) 109 { 110 while($row=mysql_fetch_row($result)) 111 { 112 $numOfPictures=$row[0]; 113 } 114 } 115 return($numOfPictures); 116 } 117 118 119 /** 120 * this function randomly choose a picture in the list of pictures not 121 * analyzed, and analyze it 122 * 123 */ 124 public function doRandomAnalyze() 125 { 126 $sql="SELECT tai.imageId, ti.path FROM ".$this->tables['images']." tai 127 LEFT JOIN ".IMAGES_TABLE." ti ON tai.imageId = ti.id 128 WHERE tai.analyzed = 'n' 129 ORDER BY RAND() LIMIT 1;"; 130 $result=pwg_query($sql); 131 if($result) 132 { 133 // $path = path of piwigo's on the server filesystem 134 $path=dirname(dirname(dirname(__FILE__))); 135 136 while($row=mysql_fetch_assoc($result)) 137 { 138 $this->analyzeImageFile($path."/".$row['path'], $row['imageId']); 139 } 140 141 $this->makeStatsConsolidation(); 142 } 143 } 144 145 146 /** 147 * this function analyze tags from a picture, and insert the result into the 148 * database 149 * 150 * NOTE : only implemented tags are analyzed and stored 151 * 152 * @param String $fileName : filename of picture to analyze 153 * @param Integer $imageId : id of image in piwigo's database 154 * @param Boolean $loaded : default = false 155 * WARNING 156 * if $loaded is set to TRUE, the function assume 157 * that the metadata have been alreay loaded 158 * do not use the TRUE value if you are not sure 159 * of the consequences 160 */ 161 protected function analyzeImageFile($fileName, $imageId, $loaded=false) 162 { 163 /* 164 * the JpegMetaData object is instancied in the constructor 165 */ 166 if(!$loaded) 167 { 168 $this->jpegMD->load( 169 $fileName, 170 Array( 171 'filter' => JpegMetaData::TAGFILTER_IMPLEMENTED, 172 'optimizeIptcDateTime' => true, 173 'exif' => true, 174 'iptc' => true, 175 'xmp' => true 176 ) 177 ); 178 } 179 180 $sqlInsert=""; 181 $massInsert=array(); 182 $nbTags=0; 183 foreach($this->jpegMD->getTags() as $key => $val) 184 { 185 $value=$val->getLabel(); 186 187 if($val->isTranslatable()) 188 $translatable="y"; 189 else 190 $translatable="n"; 191 192 if($value instanceof DateTime) 193 { 194 $value=$value->format("Y-m-d H:i:s"); 195 } 196 elseif(is_array($value)) 197 { 198 /* 199 * array values are stored in a serialized string 200 */ 201 $value=serialize($value); 202 } 203 204 $sql="SELECT numId FROM ".$this->tables['used_tags']." WHERE tagId = '$key'"; 205 206 $result=pwg_query($sql); 207 if($result) 208 { 209 $numId=-1; 210 while($row=mysql_fetch_assoc($result)) 211 { 212 $numId=$row['numId']; 213 } 214 215 if($numId>0) 216 { 217 $nbTags++; 218 if($sqlInsert!="") $sqlInsert.=", "; 219 $sqlInsert.="($imageId, '$numId', '".addslashes($value)."')"; 220 $massInsert[]="('$imageId', '$numId', '".addslashes($value)."') "; 221 } 222 } 223 } 224 225 if(count($massInsert)>0) 226 { 227 $sql="REPLACE INTO ".$this->tables['images_tags']." (imageId, numId, value) VALUES ".implode(", ", $massInsert).";"; 228 pwg_query($sql); 229 } 230 //mass_inserts($this->tables['images_tags'], array('imageId', 'numId', 'value'), $massInsert); 231 232 $sql="UPDATE ".$this->tables['images']." 233 SET analyzed = 'y', nbTags=".$nbTags." 234 WHERE imageId=$imageId;"; 235 pwg_query($sql); 236 237 238 return("$imageId=$nbTags;"); 239 } 240 241 242 /** 243 * do some consolidations on database to optimize other requests 244 * 245 */ 246 protected function makeStatsConsolidation() 247 { 248 $sql="UPDATE ".$this->tables['used_tags']." ut, 249 (SELECT COUNT(imageId) AS nb, numId 250 FROM ".$this->tables['images_tags']." 251 GROUP BY numId) nb 252 SET ut.numOfImg = nb.nb 253 WHERE ut.numId = nb.numId;"; 254 pwg_query($sql); 255 256 257 $sql="SELECT COUNT(imageId) AS nb 258 FROM ".$this->tables['images']." 259 WHERE analyzed = 'n';"; 260 $result=pwg_query($sql); 261 if($result) 262 { 263 while($row=mysql_fetch_assoc($result)) 264 { 265 $this->my_config['amd_AllPicturesAreAnalyzed']=($row['nb']==0)?'y':'n'; 266 } 267 268 } 269 $this->save_config(); 270 } 271 130 272 131 273 } // amd_root class -
extensions/AMetaData/language/fr_FR/plugin.lang.php
r5080 r5183 84 84 $lang['g003_warning_on_analyze_3'] = "Il est fortement recommandé de remplir le panier avec une cinquantaine de photos représentatives de la galerie pour procéder au traitement."; 85 85 86 $lang['g003_metadata_detail'] = "Domaine de valeurs pour la métadonnée"; 87 88 $lang['g003_help'] = "Aide sur les métadonnées"; 86 89 87 90 ?>
Note: See TracChangeset
for help on using the changeset viewer.