source: extensions/AMetaData/amd_root.class.inc.php @ 5183

Revision 5183, 7.3 KB checked in by grum, 10 years ago (diff)

database is partially filled during the install process, and fill database picture per picture each time a page is displayed (and until all the database is filled)

  • Property svn:executable set to *
Line 
1<?php
2/*
3 * -----------------------------------------------------------------------------
4 * Plugin Name: Advanced MetaData
5 * -----------------------------------------------------------------------------
6 * Author     : Grum
7 *   email    : grum@piwigo.org
8 *   website  : http://photos.grum.fr
9 *   PWG user : http://forum.piwigo.org/profile.php?id=3706
10 *
11 *   << May the Little SpaceFrog be with you ! >>
12 *
13 * -----------------------------------------------------------------------------
14 *
15 * See main.inc.php for release information
16 *
17 * AMD_install : classe to manage plugin install
18 * ---------------------------------------------------------------------------
19 */
20
21if (!defined('PHPWG_ROOT_PATH')) { die('Hacking attempt!'); }
22
23include_once(PHPWG_PLUGINS_PATH.'grum_plugins_classes-2/common_plugin.class.inc.php');
24include_once(PHPWG_PLUGINS_PATH.'grum_plugins_classes-2/css.class.inc.php');
25
26include_once('JpegMetaData/JpegMetaData.class.php');
27include_once(JPEG_METADATA_DIR."Common/L10n.class.php");
28
29class AMD_root extends common_plugin
30{
31  protected $css;   //the css object
32  protected $jpegMD;
33
34  public function __construct($prefixeTable, $filelocation)
35  {
36    $this->plugin_name="AMetaData";
37    $this->plugin_name_files="amd";
38    parent::__construct($prefixeTable, $filelocation);
39
40    $tableList=array('used_tags', 'images_tags', 'images', 'selected_tags', 'groups_names', 'groups');
41    $this->set_tables_list($tableList);
42
43    $this->css = new css(dirname($this->filelocation).'/'.$this->plugin_name_files.".css");
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
54
55  /* ---------------------------------------------------------------------------
56  common AIP & PIP functions
57  --------------------------------------------------------------------------- */
58
59  /* this function initialize var $my_config with default values */
60  public function init_config()
61  {
62    $this->my_config=array(
63      'amd_NumberOfItemsPerRequest' => 25,
64      'amd_GetListTags_OrderType' => "tag",
65      'amd_GetListTags_FilterType' => "magic",
66      'amd_GetListTags_ExcludeUnusedTag' => "y",
67      'amd_GetListTags_SelectedTagOnly' => "n",
68      'amd_GetListImages_OrderType' => "value",
69      'amd_FillDataBaseContinuously' => "y",
70      'amd_AllPicturesAreAnalyzed' => "n",
71    );
72  }
73
74  public function load_config()
75  {
76    parent::load_config();
77  }
78
79  public function init_events()
80  {
81    parent::init_events();
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
272
273} // amd_root  class
274
275
276
277?>
Note: See TracBrowser for help on using the repository browser.