Changeset 5183


Ignore:
Timestamp:
03/18/10 23:47:11 (10 years ago)
Author:
grum
Message:

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)

Location:
extensions/AMetaData
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • extensions/AMetaData/admin/amd_metadata_database.tpl

    r5080 r5183  
    233233      <form class="formtable"> 
    234234        <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> 
    236236          <p>{'g003_warning_on_analyze_1'|@translate}</p> 
    237237          <p  style="font-weight:bold;">{'g003_warning_on_analyze_2'|@translate}</p> 
     
    271271      </form> 
    272272  </fieldset> 
     273 
    273274</div> 
    274275 
  • extensions/AMetaData/amd_aip.class.inc.php

    r5097 r5183  
    3333  protected $tabsheet; 
    3434  protected $ajax; 
    35   protected $jpegMD; 
    3635 
    3736  /** 
     
    4241   * @param String $filelocation 
    4342   */ 
    44   function __construct($prefixeTable, $filelocation) 
     43  public function __construct($prefixeTable, $filelocation) 
    4544  { 
    4645    parent::__construct($prefixeTable, $filelocation); 
     
    5756                          $this->page_link.'&amp;fAMD_tabsheet=help'); 
    5857    $this->ajax = new Ajax(); 
    59     $this->jpegMD=new JpegMetaData(); 
    60   } 
    61  
    62   function __destruct() 
     58  } 
     59 
     60  public function __destruct() 
    6361  { 
    6462    unset($this->tabsheet); 
    6563    unset($this->ajax); 
    66     unset($this->jpegMD); 
     64    parent::__destruct(); 
    6765  } 
    6866 
     
    681679 
    682680 
    683   /** 
    684    * this function analyze tags from a picture, and insert the result into the 
    685    * database 
    686    * 
    687    * NOTE : only implemented tags are analyzed and stored 
    688    * 
    689    * @param String $fileName : filename of picture to analyze 
    690    * @param Integer $imageId : id of image in piwigo's database 
    691    */ 
    692   protected function analyzeImageFile($fileName, $imageId) 
    693   { 
    694     /* 
    695      * the JpegMetaData object is instancied in the constructor 
    696      */ 
    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       else 
    712         $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 string 
    722          */ 
    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 analyzed 
    763    * 
    764    * @return Integer 
    765    */ 
    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   } 
    781681 
    782682 
     
    910810  private function ajax_amd_makeStatsConsolidation() 
    911811  { 
    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(); 
    919813  } 
    920814 
  • extensions/AMetaData/amd_install.class.inc.php

    r5040 r5183  
    2727    private $tablef; 
    2828 
    29     public function AMD_install($prefixeTable, $filelocation) 
     29    public function __construct($prefixeTable, $filelocation) 
    3030    { 
    3131      parent::__construct($prefixeTable, $filelocation); 
    3232      $this->tablef= new manage_tables($this->tables); 
     33    } 
     34 
     35    public function __destruct() 
     36    { 
     37      unset($this->tablef); 
     38      parent::__destruct(); 
    3339    } 
    3440 
     
    126132      pwg_query("DELETE FROM ".$this->tables['images_tags']); 
    127133      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'].")"); 
    128138      /* 
    129139       * fill the 'used_tags' table with default values 
     
    133143        $sql="INSERT INTO ".$this->tables['used_tags']." VALUES('', '".$key."', '".(($val['translatable'])?'y':'n')."', '".$val['name']."', 0);"; 
    134144        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(); 
    135205      } 
    136206 
  • extensions/AMetaData/amd_pip.class.inc.php

    r4909 r5183  
    6464    $path=dirname(dirname(dirname(__FILE__))); 
    6565    $filename=""; 
     66    $analyzed='n'; 
    6667 
    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'].";"; 
    6871    $result=pwg_query($sql); 
    6972    if($result) 
     
    7275      { 
    7376        $filename=$row['path']; 
     77        $analyzed=$row['analyzed']; 
    7478      } 
    7579      $filename=$path."/".$filename; 
    7680    } 
    7781 
    78     $JpegMD = new JpegMetaData( 
     82    $this->jpegMD->load( 
    7983      $filename, 
    8084      Array( 
     
    113117    $group=null; 
    114118 
    115     $picturesTags=$JpegMD->getTags(); 
     119    $picturesTags=$this->jpegMD->getTags(); 
    116120 
    117121    foreach($tagsList as $key => $val) 
     
    160164    } 
    161165 
    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    } 
    163181 
    164182    $template->assign('metadata', $metadata); 
  • extensions/AMetaData/amd_root.class.inc.php

    r5088 r5183  
    3030{ 
    3131  protected $css;   //the css object 
    32  
    33   function AMD_root($prefixeTable, $filelocation) 
     32  protected $jpegMD; 
     33 
     34  public function __construct($prefixeTable, $filelocation) 
    3435  { 
    3536    $this->plugin_name="AMetaData"; 
     
    4142 
    4243    $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 
    4454 
    4555  /* --------------------------------------------------------------------------- 
     
    5666      'amd_GetListTags_ExcludeUnusedTag' => "y", 
    5767      'amd_GetListTags_SelectedTagOnly' => "n", 
    58       'amd_GetListImages_OrderType' => "value" 
     68      'amd_GetListImages_OrderType' => "value", 
     69      'amd_FillDataBaseContinuously' => "y", 
     70      'amd_AllPicturesAreAnalyzed' => "n", 
    5971    ); 
    6072  } 
     
    6375  { 
    6476    parent::load_config(); 
    65     if(!$this->css->css_file_exists()) 
    66     { 
    67       $this->css->make_CSS($this->generate_CSS()); 
    68     } 
    6977  } 
    7078 
     
    7280  { 
    7381    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 
    130272 
    131273} // amd_root  class 
  • extensions/AMetaData/language/fr_FR/plugin.lang.php

    r5080 r5183  
    8484$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."; 
    8585 
     86$lang['g003_metadata_detail'] = "Domaine de valeurs pour la métadonnée"; 
     87 
     88$lang['g003_help'] = "Aide sur les métadonnées"; 
    8689 
    8790?> 
Note: See TracChangeset for help on using the changeset viewer.