source: extensions/BatchDownloader/include/BatchDownloader.class.php @ 23772

Last change on this file since 23772 was 23772, checked in by mistic100, 11 years ago

apply array_keys before sending batchdownload_init_zip

File size: 27.1 KB
Line 
1<?php
2defined('BATCH_DOWNLOAD_PATH') or die('Hacking attempt!');
3
4class BatchDownloader
5{
6  private $conf;
7  private $data;
8  private $images;
9 
10  /**
11   * __construct
12   * @param: mixed set id (##|'new')
13   * @param: array images
14   * @param: string set type (calendar,category,flat,tags,search,favorites,most_visited,best_rated,list,recent_pics,collection)
15   * @param: mixed set type id (for calendar,category,tags,search,collection)
16   * @param: string size to download
17   */
18  function __construct($set_id, $images=array(), $type=null, $type_id=null, $size='original')
19  {
20    global $user, $conf;
21   
22    $this->conf = $conf['batch_download'];
23    $this->data = array(
24      'id' => 0,
25      'user_id' => $user['id'],
26      'date_creation' => '0000-00-00 00:00:00',
27      'type' => null,
28      'type_id' => null,
29      'size' => 'original',
30      'nb_zip' => 0,
31      'last_zip' => 0,
32      'nb_images' => 0,
33      'total_size' => 0,
34      'status' => 'new',
35      'estimated_total_size' => 0, // not in db
36      );
37    $this->images = array();
38   
39    // load specific set
40    if (preg_match('#^[0-9]+$#', $set_id))
41    {
42      $query = '
43SELECT *
44  FROM '.BATCH_DOWNLOAD_TSETS.'
45  WHERE id = '.$set_id.'
46    '.(!is_admin() ? 'AND user_id = '.$this->data['user_id'] : null).'
47;';
48      $result = pwg_query($query);
49     
50      if (pwg_db_num_rows($result))
51      {
52        $this->data = array_merge(
53          $this->data,
54          pwg_db_fetch_assoc($result)
55          );
56       
57        // make sure all pictures of the set exist
58        $query = '
59DELETE FROM '.BATCH_DOWNLOAD_TIMAGES.'
60  WHERE image_id NOT IN (
61    SELECT id FROM '.IMAGES_TABLE.'
62    )
63;';
64        pwg_query($query);
65     
66        $query = '
67SELECT *
68  FROM '.BATCH_DOWNLOAD_TIMAGES.'
69  WHERE set_id = '.$this->data['id'].'
70;';
71        $this->images = simple_hash_from_query($query, 'image_id', 'zip');
72       
73        if ( $this->data['status'] != 'done' and count($this->images) != $this->data['nb_images'] )
74        {
75          $this->updateParam('nb_images', count($this->images));
76        }
77      }
78      else
79      {
80        throw new Exception(l10n('Invalid dowload set'));
81      }
82    }
83    // create a new set
84    else if ($set_id == 'new')
85    {
86      if ($size != 'original')
87      {
88        $types = array_keys(ImageStdParams::get_defined_type_map());
89        if (!in_array($size, $types))
90        {
91          throw new Exception(sprintf(l10n('Invalid size %s'), $size));
92        }
93      }
94 
95      $this->data['type'] = $type;
96      $this->data['type_id'] = $type_id;
97      $this->data['size'] = $size;
98     
99      $query = '
100INSERT INTO '.BATCH_DOWNLOAD_TSETS.'(
101    user_id,
102    date_creation,
103    type,
104    type_id,
105    size,
106    nb_zip,
107    last_zip,
108    nb_images,
109    total_size,
110    status
111  )
112  VALUES(
113    '.$this->data['user_id'].',
114    NOW(),
115    "'.$this->data['type'].'",
116    "'.$this->data['type_id'].'",
117    "'.$this->data['size'].'",
118    0,
119    0,
120    0,
121    0,
122    "new"
123  )
124;';
125      pwg_query($query);
126      $this->data['id'] = pwg_db_insert_id();
127     
128      $date = pwg_query('SELECT FROM_UNIXTIME(NOW());');
129      list($this->data['date_creation']) = pwg_db_fetch_row($date);
130     
131      if (!empty($images))
132      {
133        $this->addImages($images);
134      }
135    }
136    else
137    {
138      trigger_error('BatchDownloader::__construct, invalid input parameter', E_USER_ERROR);
139    }
140  }
141 
142  /**
143   * updateParam
144   * @param: string param name
145   * @param: mixed param value
146   */
147  function updateParam($name, $value)
148  {
149    $this->data[$name] = $value;
150    pwg_query('UPDATE '.BATCH_DOWNLOAD_TSETS.' SET '.$name.' = "'.$value.'" WHERE id = '.$this->data['id'].';');
151  }
152 
153  /**
154   * getParam
155   * @param: string param name
156   * @return: mixed param value
157   */
158  function getParam($name)
159  {
160    return $this->data[$name];
161  }
162 
163  /**
164   * getImages
165   * @return: array(image_id => zip_idx)
166   */
167  function getImages()
168  {
169    return $this->images;
170  }
171 
172  /**
173   * isInSet
174   * @param: int image id
175   * @return: bool
176   */
177  function isInSet($image_id)
178  {
179    return array_key_exists($image_id, $this->images);
180  }
181 
182  /**
183   * removeImages
184   * @param: array image ids
185   */
186  function removeImages($image_ids)
187  {
188    if (empty($image_ids) or !is_array($image_ids)) return;
189   
190    foreach ($image_ids as $image_id)
191    {
192      unset($this->images[ $image_id ]);
193    }
194   
195    $query = '
196DELETE FROM '.BATCH_DOWNLOAD_TIMAGES.'
197  WHERE
198    set_id = '.$this->data['id'].'
199    AND image_id IN('.implode(',', $image_ids).')
200;';
201    pwg_query($query);
202   
203    $this->updateParam('nb_images', count($this->images));
204  }
205 
206  /**
207   * addImages
208   * @param: array image ids
209   */
210  function addImages($image_ids)
211  {
212    if (empty($image_ids) or !is_array($image_ids)) return;
213   
214    $query = '
215SELECT id, file
216  FROM '.IMAGES_TABLE.'
217  WHERE id IN('.implode(',', array_unique($image_ids)).')
218;';
219    $images = simple_hash_from_query($query, 'id', 'file');
220   
221    $inserts = array();
222   
223    foreach ($images as $image_id => $file)
224    {
225      if ($this->isInSet($image_id)) continue;
226      if (!in_array(get_extension($file), $this->conf['allowed_ext'])) continue;
227     
228      $this->images[ $image_id ] = 0;
229      $inserts[] = array(
230        'set_id' => $this->data['id'],
231        'image_id' => $image_id,
232        'zip' => 0,
233        );
234    }
235   
236    if (count($inserts))
237    {
238      mass_inserts(
239        BATCH_DOWNLOAD_TIMAGES,
240        array('set_id','image_id','zip'),
241        $inserts
242        );
243    }
244     
245    $this->updateParam('nb_images', count($this->images));
246  }
247 
248  /**
249   * clearImages
250   */
251  function clearImages()
252  {
253    $this->images = array();
254   
255    $query = '
256DELETE FROM '.BATCH_DOWNLOAD_TIMAGES.'
257  WHERE set_id = '.$this->data['id'].'
258;';
259    pwg_query($query);
260  }
261 
262  /**
263   * getMissingDerivatives
264   * @param: bool update, if true, update IMAGE_SIZES with FS datas
265   * @return: array of i.php urls
266   */
267  function getMissingDerivatives($update=false)
268  {
269    if ($this->data['size'] == 'original')
270    {
271      return array();
272    }
273   
274    $uid = '&b='.time();
275   
276    $params = ImageStdParams::get_by_type($this->data['size']);
277    $last_mod_time = $params->last_mod_time;
278   
279    $image_ids = array_keys($this->images);
280    $to_update = $urls = $inserts = array();
281   
282    global $conf;
283    $conf['old_question_mark_in_urls'] = $conf['question_mark_in_urls'];
284    $conf['old_php_extension_in_urls'] = $conf['php_extension_in_urls'];
285    $conf['old_derivative_url_style'] = $conf['derivative_url_style'];
286    $conf['question_mark_in_urls'] = $conf['php_extension_in_urls'] = true;
287    $conf['derivative_url_style'] = 2;
288   
289    // images which we need to update stats
290    if ($update)
291    {
292      $query = '
293SELECT image_id, filemtime
294  FROM '.IMAGE_SIZES_TABLE.'
295  WHERE image_id IN('.implode(',', $image_ids).')
296    AND type = "'.$this->data['size'].'"
297;';
298      $registered = array_from_query($query, 'image_id', 'filemtime');
299     
300      $to_update = array_filter($registered, create_function('$t', 'return $t<'.$last_mod_time.';'));
301      $to_update = array_merge($to_update, array_diff($image_ids, $registered));
302    }
303   
304    $query = '
305SELECT id, path, width, height, rotation
306  FROM '.IMAGES_TABLE.'
307  WHERE id IN('.implode(',', $image_ids).')
308  ORDER BY id DESC
309;';
310
311    $result = pwg_query($query);
312    while ($row = pwg_db_fetch_assoc($result))
313    {
314      $src_image = new SrcImage($row); // don't give representive_ext
315     
316      // no-image files
317      if ($src_image->is_mimetype())
318      {
319        if ($update && in_array($row['id'], $to_update))
320        {         
321          $inserts[ $row['id'] ] = array(
322            'image_id' => $row['id'],
323            'type' => $this->data['size'],
324            'width' => 0,
325            'height' => 0,
326            'filesize' => filesize(PHPWG_ROOT_PATH.$row['path'])/1024,
327            'filemtime' => filemtime(PHPWG_ROOT_PATH.$row['path']),
328            );
329        }
330      }
331      // images files
332      else
333      {
334        $derivative = new DerivativeImage($this->data['size'], $src_image);
335       
336        $filemtime = @filemtime($derivative->get_path());
337        $src_mtime = @filemtime(PHPWG_ROOT_PATH.$row['path']);
338        if ($src_mtime===false) continue;
339       
340        if ($filemtime===false || $filemtime<$last_mod_time || $filemtime<$src_mtime)
341        {
342          $urls[] = $derivative->get_url().$uid;
343        }
344        else if ($update && in_array($row['id'], $to_update))
345        {
346          $imagesize = getimagesize($derivative->get_path());
347         
348          $inserts[ $row['id'] ] = array(
349            'image_id' => $row['id'],
350            'type' => $this->data['size'],
351            'width' => $imagesize[0],
352            'height' => $imagesize[1],
353            'filesize' => filesize($derivative->get_path())/1024,
354            'filemtime' => $filemtime,
355            );
356        }
357      }
358    }
359   
360    if (!empty($inserts))
361    {
362      $query = '
363DELETE FROM '.IMAGE_SIZES_TABLE.'
364  WHERE image_id IN('.implode(',', array_keys($inserts)).')
365;';
366      pwg_query($query);
367     
368      mass_inserts(
369        IMAGE_SIZES_TABLE,
370        array('image_id','type','width','height','filesize','filemtime'),
371        $inserts
372        );
373    }
374   
375    $conf['question_mark_in_urls'] = $conf['old_question_mark_in_urls'];
376    $conf['php_extension_in_urls'] = $conf['old_php_extension_in_urls'];
377    $conf['derivative_url_style'] = $conf['old_derivative_url_style'];
378   
379    return $urls;
380  }
381 
382  /**
383   * deleteArchives
384   */
385  function deleteArchives()
386  {
387    $zip_path = glob($this->getArchivePath('*'));
388   
389    if (is_array($zip_path))
390    {
391      foreach ($zip_path as $file)
392      {
393        unlink($file);
394      }
395    }
396  }
397 
398  /**
399   * getFilename
400   */
401  function getFilename($row, $filesize=array())
402  {
403    $row['filename'] = stripslashes(get_filename_wo_extension($row['file']));
404   
405    $search = array('%id%', '%filename%', '%author%', '%dimensions%');
406    $replace = array($row['id'], $row['filename']);
407   
408    $replace[2] = empty($row['author']) ? null : $row['author'];
409    $replace[3] = empty($filesize) ? null : $filesize['width'].'x'.$filesize['height'];
410   
411    $filename = str_replace($search, $replace, $this->conf['file_pattern']);
412    $filename = preg_replace(
413      array('#_+#', '#-+#', '# +#', '#^([_\- ]+)#', '#([_\- ]+)$#'),
414      array('_', '-', ' ', null, null),
415      $filename
416      );
417   
418    if (empty($filename) || $filename == $this->conf['file_pattern'])
419    {
420      $filename = $row['id'].'_'.$row['filename'];
421    }
422   
423    $filename.= '.'.get_extension($row['path']);
424   
425    return $filename;
426  }
427 
428  /**
429   * createNextArchive
430   * @param: bool force all elements in one archive
431   * @return: string zip path or false
432   */
433  function createNextArchive($force_one_archive=false)
434  {
435    // set already downloaded (we should never be there !)
436    if ( $this->data['status'] == 'done' or $this->data['nb_images'] == 0 )
437    {
438      trigger_error('BatchDownloader::createNextArchive, the set is empty', E_USER_ERROR);
439    }
440   
441    global $conf;
442   
443    // first zip
444    if ($this->data['last_zip'] == 0)
445    {
446      $this->updateParam('status', 'download');
447     
448      // limit number of elements
449      if ($this->data['nb_images'] > $this->conf['max_elements'])
450      {
451        $images_ids = array_slice(array_keys($this->images), 0, $this->conf['max_elements']);
452        $this->clearImages();
453        $this->addImages($images_ids);
454      }
455     
456      $this->getEstimatedArchiveNumber(true);
457     
458      $this->updateParam('date_creation', date('Y-m-d H:i:s'));
459     
460      trigger_action('batchdownload_init_zip', $this->data, array_keys($this->images));
461    }
462   
463    // get next images of the set
464    $images_to_add = array();
465    foreach ($this->images as $image_id => $zip_id)
466    {
467      if ($zip_id != 0) continue; // here are already added images
468      array_push($images_to_add, $image_id);
469    }
470   
471    if (count($images_to_add))
472    {
473      $query = '
474SELECT
475    id, name, file, path,
476    rotation, filesize, width, height,
477    author
478  FROM '.IMAGES_TABLE.'
479  WHERE id IN ('.implode(',', $images_to_add).')
480;';
481      $images_to_add = hash_from_query($query, 'id');
482     
483      if ($this->data['size'] != 'original')
484      {
485        $query = '
486SELECT image_id, filesize, width, height
487  FROM '.IMAGE_SIZES_TABLE.'
488  WHERE image_id IN ('.implode(',', array_keys($images_to_add)).')
489    AND type = "'.$this->data['size'].'"
490;';
491        $filesizes = hash_from_query($query, 'image_id');
492      }
493     
494      // open zip
495      $this->updateParam('last_zip', $this->data['last_zip']+1);
496      $zip_path = $this->getArchivePath();
497      $zip = new myZip($zip_path, $this->conf['force_pclzip']);
498     
499      // add images until size limit is reach, or all images are added
500      $images_added = array();
501      $total_size = 0;
502      foreach ($images_to_add as $row)
503      {
504        if (!file_exists(PHPWG_ROOT_PATH.$row['path']))
505        {
506          $this->removeImages(array($row['id']));
507          continue;
508        }
509       
510        if ($this->data['size'] == 'original')
511        {
512          $zip->addFile(PHPWG_ROOT_PATH.$row['path'], $this->getFilename($row, $row));
513          $total_size+= $row['filesize'];
514        }
515        else
516        {
517          $src_image = new SrcImage($row); // don't give representive_ext
518         
519          // no-image files
520          if ($src_image->is_mimetype())
521          {
522            $zip->addFile(PHPWG_ROOT_PATH.$row['path'], $this->getFilename($row, array()));
523            $total_size+= $row['filesize'];
524          }
525          // images files
526          else
527          {
528            $derivative = new DerivativeImage($this->data['size'], $src_image);
529           
530            $zip->addFile($derivative->get_path(), $this->getFilename($row, $filesizes[ $row['id'] ]));
531            $total_size+= $filesizes[ $row['id'] ]['filesize'];
532          }
533        }
534       
535        array_push($images_added, $row['id']);
536        $this->images[ $row['id'] ] = $this->data['last_zip'];
537       
538        if ($total_size >= $this->conf['max_size']*1024 and !$force_one_archive) break;
539      }
540     
541      $this->updateParam('total_size', $this->data['total_size'] + $total_size);
542     
543      // archive comment
544      $comment = 'Generated on '.date('r').' with PHP '.PHP_VERSION.' by Piwigo Batch Downloader.';
545      $comment.= "\n".$conf['gallery_title'].' - '.get_absolute_root_url();
546      if (!empty($conf['batch_download_comment']))
547      {
548        $comment.= "\n\n".wordwrap(remove_accents($conf['batch_download_comment']), 60);
549      }
550      $zip->setArchiveComment($comment);
551     
552      $zip->close();
553     
554      // update database
555      $query = '
556UPDATE '.BATCH_DOWNLOAD_TIMAGES.'
557  SET zip = '.$this->data['last_zip'].'
558  WHERE
559    set_id = '.$this->data['id'].'
560    AND image_id IN('.implode(',', $images_added).')
561;';
562      pwg_query($query);
563     
564      // all images added ?
565      if (count($images_to_add) == count($images_added))
566      {
567        if ($this->conf['one_archive']) $this->updateParam('status', 'done');
568        $done = true;
569       
570        // over estimed
571        $this->updateParam('nb_zip', $this->data['last_zip']);
572      }
573     
574      // under estimed
575      if (!isset($done) && $this->data['status'] != 'done' && $this->data['last_zip'] == $this->data['nb_zip'])
576      {
577        $this->updateParam('nb_zip', $this->data['last_zip']+1);
578      }
579     
580      return $zip_path;
581    }
582    else
583    {
584      return false;
585    }
586  }
587 
588  /**
589   * getEstimatedTotalSize
590   * @return: int
591   */
592  function getEstimatedTotalSize($force=false)
593  {
594    if ($this->data['status'] == 'done') return $this->data['total_size'];
595    if ($this->data['nb_images'] == 0) return 0;
596    if ( !empty($this->data['estimated_total_size']) and !$force ) return $this->data['estimated_total_size'];
597   
598    $image_ids = array_slice(array_keys($this->images), 0, $this->conf['max_elements']);
599   
600    if ($this->data['size'] == 'original')
601    {
602      $query = '
603SELECT SUM(filesize) AS total
604  FROM '.IMAGES_TABLE.'
605  WHERE id IN ('.implode(',', $image_ids).')
606;';
607    }
608    else
609    {
610      $query = '
611SELECT SUM(filesize) AS total
612  FROM '.IMAGE_SIZES_TABLE.'
613  WHERE image_id IN ('.implode(',', $image_ids).')
614;';
615    }
616   
617    list($this->data['estimated_total_size']) = pwg_db_fetch_row(pwg_query($query));
618    return $this->data['estimated_total_size'];
619  }
620 
621  /**
622   * getEstimatedArchiveNumber
623   * @return: int
624   */
625  function getEstimatedArchiveNumber($force=false)
626  {
627    if ($this->data['status'] == 'done') return $this->data['nb_zip'];
628    if ( !empty($this->data['nb_zip']) and !$force ) return $this->data['nb_zip'];
629   
630    $this->updateParam('nb_zip', ceil( $this->getEstimatedTotalSize($force) / ($this->conf['max_size']*1024) ));
631    return $this->data['nb_zip'];
632  }
633 
634  /**
635   * getDownloadList
636   * @return: string html
637   */
638  function getDownloadList($url='')
639  {
640    if ($this->data['nb_images'] == 0)
641    {
642      return '<b>'.l10n('No archive').'</b>';
643    }
644   
645    $root_url = get_root_url();
646   
647    $out = '';
648    for ($i=1; $i<=$this->getEstimatedArchiveNumber(); $i++)
649    {
650      $out.= '<li id="zip-'.$i.'">';
651     
652      if ($this->data['status']=='done' or ($this->conf['one_archive'] and $i<$this->data['last_zip']+1))
653      {
654        $out.= '<img src="'.$root_url.BATCH_DOWNLOAD_PATH.'template/images/drive_error.png"> '.sprintf(l10n('Archive #%d (already downloaded)'), $i);
655      }
656      else if ($i==$this->data['last_zip']+1 or (!$this->conf['one_archive'] and $i<$this->data['last_zip']+1))
657      {
658          $out.= '<a href="'.add_url_params($url, array('set_id'=>$this->data['id'],'zip'=>$i)).'" rel="nofollow" style="font-weight:bold;"' 
659            .(($i!=1 and $this->conf['one_archive']) ? ' onClick="return confirm(\''.addslashes(sprintf(l10n('Starting download Archive #%d will destroy Archive #%d, be sure you finish the download. Continue ?'), $i, $i-1)).'\');"' : null).
660            '><img src="'.$root_url.BATCH_DOWNLOAD_PATH.'template/images/drive_go.png"> '.sprintf(l10n('Archive #%d (ready)'), $i).'</a>';
661      }
662      else
663      {
664        $out.= '<img src="'.$root_url.BATCH_DOWNLOAD_PATH.'template/images/drive.png"> '.sprintf(l10n('Archive #%d (pending)'), $i);
665      }
666     
667      $out.= '</li>';
668    }
669   
670    return $out;
671  }
672 
673  /**
674   * getArchivePath
675   * @param: int archive number
676   * @return: string
677   */
678  function getArchivePath($i=null)
679  {
680    if (!file_exists(BATCH_DOWNLOAD_LOCAL . 'u-' .$this->data['user_id']. '/'))
681    {
682      mkgetdir(BATCH_DOWNLOAD_LOCAL . 'u-' .$this->data['user_id']. '/');
683    }
684   
685    if ($i === null) $i = $this->data['last_zip'];
686    $set = $this->getNames();
687   
688    $path = BATCH_DOWNLOAD_LOCAL . 'u-'. $this->data['user_id'] . '/';
689    $path.= !empty($this->conf['archive_prefix']) ? $this->conf['archive_prefix'] . '_' : null;
690    $path.= $set['BASENAME'] . '_' . $this->data['size'] . '_';
691    $path.= $this->data['user_id'] . $this->data['id'];
692    $path.= '_part' . $i . '.zip';
693   
694    return $path;
695  }
696 
697  /**
698   * getNames
699   * @return: array
700   *    NAME, set name with HTML
701   *    sNAME, set name without HTML
702   *    BASENAME, set filename
703   *    COMMENT, set comment
704   */
705  function getNames()
706  {   
707    switch ($this->data['type'])
708    {
709      // calendar
710      case 'calendar':
711      {
712        global $conf, $page;
713        $old_page = $page;
714       
715        $fields = array(
716          'created' => l10n('Creation date'),
717          'posted' => l10n('Post date'),
718          );
719       
720        $chronology = explode('-', $this->data['type_id']);
721        $page['chronology_field'] = $chronology[0];
722        $page['chronology_style'] = $chronology[1];
723        $page['chronology_view'] = $chronology[2];
724        $page['chronology_date'] = array_splice($chronology, 3);
725       
726        if (!class_exists('Calendar'))
727        {
728          include_once(PHPWG_ROOT_PATH.'include/calendar_'. $page['chronology_style'] .'.class.php');
729        }
730        $calendar = new Calendar();
731        $calendar->initialize('');
732        $display_name = strip_tags($calendar->get_display_name());
733       
734        $set['NAME'] = l10n('Calendar').': '.$fields[$page['chronology_field']].$display_name;
735        $set['sNAME'] = l10n('Calendar').': '.ltrim($display_name, $conf['level_separator']);
736        $set['BASENAME'] = 'calendar-'.$page['chronology_field'].'-'.implode('-',$page['chronology_date']);
737       
738        $page = $old_page;
739        break;
740      }
741     
742      // category
743      case 'category':
744      {
745        $category = get_cat_info($this->data['type_id']);
746        if ($category == null)
747        {
748          $set['NAME'] = l10n('Album').': #'.$this->data['type_id'].' (deleted)';
749          $set['BASENAME'] = 'album'.$this->data['type_id'];
750        }
751        else
752        {
753          $set['NAME'] = l10n('Album').': '.get_cat_display_name($category['upper_names']);
754          $set['sNAME'] = l10n('Album').': '.trigger_event('render_category_name', $category['name']);
755          $set['COMMENT'] = trigger_event('render_category_description', $category['comment']);
756         
757          if (!empty($category['permalink']))
758          {
759            $set['BASENAME'] = 'album-'.$category['permalink'];
760          }
761          else if ( ($name = str2url($category['name'])) != null )
762          {
763            $set['BASENAME'] = 'album-'.$name;
764          }
765          else
766          {
767            $set['BASENAME'] = 'album'.$this->data['type_id'];
768          }
769        }
770        break;
771      }
772     
773      // flat
774      case 'flat':
775      {
776        $set['NAME'] = l10n('Whole gallery');
777        $set['BASENAME'] = 'all-gallery';
778        break;
779      }
780     
781      // tags
782      case 'tags':
783      {
784        $tags = find_tags(explode(',', $this->data['type_id']));
785        $set['NAME'] = l10n('Tags').': ';
786        $set['BASENAME'] = 'tags';
787       
788        $first = true;
789        foreach ($tags as $tag)
790        {
791          if ($first) $first = false;
792          else $set['NAME'].= ', ';
793          $set['NAME'].=
794            '<a href="' . make_index_url(array('tags'=>array($tag))) . '">'
795            .trigger_event('render_tag_name', $tag['name'])
796            .'</a>';
797          $set['BASENAME'].= '-'.$tag['url_name'];
798        }
799        break;
800      }
801     
802      // search
803      case 'search':
804      {
805        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'search', 'search'=>$this->data['type_id'])).'">'.l10n('Search').'</a>';
806        $set['BASENAME'] = 'search'.$this->data['type_id'];
807        break;
808      }
809     
810      // favorites
811      case 'favorites':
812      {
813        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'favorites')).'">'.l10n('Your favorites').'</a>';
814        $set['BASENAME'] = 'favorites';
815        break;
816      }
817     
818      // most_visited
819      case 'most_visited':
820      {
821        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'most_visited')).'">'.l10n('Most visited').'</a>';
822        $set['BASENAME'] = 'most-visited';
823        break;
824      }
825     
826      // best_rated
827      case 'best_rated':
828      {
829        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'best_rated')).'">'.l10n('Best rated').'</a>';
830        $set['BASENAME'] = 'best-rated';
831        break;
832      }
833     
834      // list
835      case 'list':
836      {
837        $set['NAME'] = l10n('Random');
838        $set['BASENAME'] = 'random';
839        break;
840      }
841     
842      // recent_pics
843      case 'recent_pics':
844      {
845        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'recent_pics')).'">'.l10n('Recent photos').'</a>';
846        $set['BASENAME'] = 'recent-pics';
847        break;
848      }
849     
850      // collection
851      case 'collection':
852      {
853        try
854        {
855          if (!class_exists('UserCollection')) throw new Exception();
856          $UserCollection = new UserCollection($this->data['type_id']);
857          $infos = $UserCollection->getCollectionInfo();
858          $set['NAME'] = l10n('Collection').': <a href="'.$infos['U_PUBLIC'].'">'.$UserCollection->getParam('name').'</a>';
859         
860          if ( ($name = str2url($UserCollection->getParam('name'))) != null)
861          {
862            $set['BASENAME'] = 'collection-'.$name;
863          }
864          else
865          {
866            $set['BASENAME'] = 'collection'.$this->data['type_id'];
867          }
868        }
869        catch (Exception $e)
870        {
871          $set['NAME'] = l10n('Collection').': #'.$this->data['type_id'].' (deleted)';
872          $set['BASENAME'] = 'collection'.$this->data['type_id'];
873        }
874        break;
875      }
876    }
877   
878    if (!isset($set['sNAME']))    $set['sNAME'] = strip_tags($set['NAME']);
879    if (!isset($set['COMMENT']))  $set['COMMENT'] = null;
880    if (!isset($set['BASENAME'])) $set['BASENAME'] = $this->data['type'] . $this->data['type_id'];
881   
882    return $set;
883  }
884 
885  /**
886   * getSetInfo
887   * @return: array
888   */
889  function getSetInfo()
890  {   
891    $set = array(
892      'NB_IMAGES' =>     $this->data['nb_images'],
893      'NB_ARCHIVES' =>   $this->data['status']=='new' ? l10n('Unknown') : $this->getEstimatedArchiveNumber(),
894      'STATUS' =>        $this->data['status']=='ready' ? 'new' : $this->data['status'],
895      'LAST_ZIP' =>      $this->data['last_zip'],
896      'TOTAL_SIZE' =>    $this->data['status']=='new' ? l10n('Unknown') : sprintf(l10n('%d MB'), ceil($this->getEstimatedTotalSize()/1024)),
897      'DATE_CREATION' => format_date($this->data['date_creation'], true),
898      'SIZE' =>          $this->data['size'],
899      );
900     
901    if ($this->data['size'] != 'original')
902    {
903      $params = ImageStdParams::get_by_type($this->data['size']);
904      $set['SIZE_INFO'] = $params->sizing->ideal_size[0].' x '.$params->sizing->ideal_size[1];
905    }
906   
907    return array_merge($set, $this->getNames());
908  }
909 
910  /**
911   * delete
912   */
913  function delete()
914  {
915    $this->deleteArchives();
916    $this->clearImages();
917    pwg_query('DELETE FROM '.BATCH_DOWNLOAD_TSETS.' WHERE id = '.$this->data['id'].';');
918  }
919}
920
921
922/**
923 * small class implementing basic ZIP creation
924 * with ZipArchive or PclZip
925 */
926class myZip
927{
928  private $lib;
929  private $zip;
930 
931  function __construct($zip_path, $pclzip=false)
932  {
933    if ( class_exists('ZipArchive') and !$pclzip )
934    {
935      $this->lib = 'zipa';
936     
937      $this->zip = new ZipArchive;
938      if ($this->zip->open($zip_path, ZipArchive::CREATE) !== true)
939      {
940        trigger_error('BatchDownloader::createNextArchive, unable to open ZIP archive (ZipArchive)', E_USER_ERROR);
941      }
942    }
943    else
944    {
945      $this->lib = 'pcl';
946     
947      require_once(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
948      $this->zip = new PclZip($zip_path);
949     
950      // create a temporary file for archive creation
951      touch(BATCH_DOWNLOAD_LOCAL.'temp.txt');
952     
953      if ($this->zip->create(BATCH_DOWNLOAD_LOCAL.'temp.txt', PCLZIP_OPT_REMOVE_ALL_PATH) == 0)
954      {
955        trigger_error('BatchDownloader::createNextArchive, unable to open ZIP archive (PclZip)', E_USER_ERROR);
956      }
957     
958      unlink(BATCH_DOWNLOAD_LOCAL.'temp.txt');
959      $this->zip->delete(PCLZIP_OPT_BY_NAME, 'temp.txt');
960    }
961  }
962 
963  function addFile($path, $filename)
964  {
965    if ($this->lib == 'zipa')
966    {
967      $this->zip->addFile($path, $filename);
968    }
969    else
970    {
971      $this->zip->add($path, PCLZIP_OPT_REMOVE_ALL_PATH);
972    }
973  }
974 
975  function setArchiveComment($comment)
976  {
977    if ($this->lib == 'zipa')
978    {
979      $this->zip->setArchiveComment($comment);
980    }
981  }
982 
983  function close()
984  {
985    if ($this->lib == 'zipa')
986    {
987      $this->zip->close();
988    }
989  }
990}
991
992?>
Note: See TracBrowser for help on using the repository browser.