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

Last change on this file since 25932 was 25932, checked in by mistic100, 10 years ago

update for Piwigo 2.6 + code cleaning + fix unable to cancel set during generation

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 download 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(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    // datas
406    $search = array('%id%', '%filename%', '%author%', '%dimensions%');
407    $replace = array($row['id'], $row['filename']);
408
409    $replace[2] = empty($row['author']) ? null : $row['author'];
410    $replace[3] = empty($filesize) ? null : $filesize['width'].'x'.$filesize['height'];
411
412    $filename = str_replace($search, $replace, $this->conf['file_pattern']);
413
414    // functions
415    $filename = preg_replace_callback('#\$escape\((.*?)\)#', create_function('$m', 'return str2url($m[1]);'),   $filename);
416    $filename = preg_replace_callback('#\$upper\((.*?)\)#',  create_function('$m', 'return str2upper($m[1]);'), $filename);
417    $filename = preg_replace_callback('#\$lower\((.*?)\)#',  create_function('$m', 'return str2lower($m[1]);'), $filename);
418    $filename = preg_replace_callback('#\$strpad\((.*?),(.*?),(.*?)\)#', create_function('$m', 'return str_pad($m[1],$m[2],$m[3],STR_PAD_LEFT);'), $filename);
419
420    // cleanup
421    $filename = preg_replace(
422      array('#_+#', '#-+#', '# +#', '#^([_\- ]+)#', '#([_\- ]+)$#'),
423      array('_', '-', ' ', null, null),
424      $filename
425      );
426
427    if (empty($filename) || $filename == $this->conf['file_pattern'])
428    {
429      $filename = $row['id'].'_'.$row['filename'];
430    }
431
432    $filename.= '.'.get_extension($row['path']);
433
434    return $filename;
435  }
436
437  /**
438   * createNextArchive
439   * @param: bool force all elements in one archive
440   * @return: string zip path or false
441   */
442  function createNextArchive($force_one_archive=false)
443  {
444    // set already downloaded (we should never be there !)
445    if ( $this->data['status'] == 'done' or $this->data['nb_images'] == 0 )
446    {
447      trigger_error('BatchDownloader::createNextArchive, the set is empty', E_USER_ERROR);
448    }
449
450    global $conf;
451
452    // first zip
453    if ($this->data['last_zip'] == 0)
454    {
455      $this->updateParam('status', 'download');
456
457      // limit number of elements
458      if ($this->data['nb_images'] > $this->conf['max_elements'])
459      {
460        $images_ids = array_slice(array_keys($this->images), 0, $this->conf['max_elements']);
461        $this->clearImages();
462        $this->addImages($images_ids);
463      }
464
465      $this->getEstimatedArchiveNumber(true);
466
467      $this->updateParam('date_creation', date('Y-m-d H:i:s'));
468
469      trigger_action('batchdownload_init_zip', $this->data, array_keys($this->images)); // triggered once for all
470    }
471
472    // get next images of the set
473    $images_to_add = array();
474    foreach ($this->images as $image_id => $zip_id)
475    {
476      if ($zip_id != 0) continue; // here are already added images
477      $images_to_add[] = $image_id;
478    }
479
480    if (count($images_to_add))
481    {
482      $query = '
483SELECT
484    id, name, file, path,
485    rotation, filesize, width, height,
486    author
487  FROM '.IMAGES_TABLE.'
488  WHERE id IN ('.implode(',', $images_to_add).')
489;';
490      $images_to_add = hash_from_query($query, 'id');
491
492      if ($this->data['size'] != 'original')
493      {
494        $query = '
495SELECT image_id, filesize, width, height
496  FROM '.IMAGE_SIZES_TABLE.'
497  WHERE image_id IN ('.implode(',', array_keys($images_to_add)).')
498    AND type = "'.$this->data['size'].'"
499;';
500        $filesizes = hash_from_query($query, 'image_id');
501      }
502
503      // open zip
504      $this->updateParam('last_zip', $this->data['last_zip']+1);
505      $zip_path = $this->getArchivePath();
506      $zip = new myZip($zip_path, $this->conf['force_pclzip']);
507
508      // add images until size limit is reach, or all images are added
509      $images_added = array();
510      $total_size = 0;
511      foreach ($images_to_add as $row)
512      {
513        if (!file_exists(PHPWG_ROOT_PATH.$row['path']))
514        {
515          $this->removeImages(array($row['id']));
516          continue;
517        }
518
519        if ($this->data['size'] == 'original')
520        {
521          $zip->addFile(PHPWG_ROOT_PATH.$row['path'], $this->getFilename($row, $row));
522          $total_size+= $row['filesize'];
523        }
524        else
525        {
526          $src_image = new SrcImage($row); // don't give representive_ext
527
528          // no-image files
529          if ($src_image->is_mimetype())
530          {
531            $zip->addFile(PHPWG_ROOT_PATH.$row['path'], $this->getFilename($row, array()));
532            $total_size+= $row['filesize'];
533          }
534          // images files
535          else
536          {
537            $derivative = new DerivativeImage($this->data['size'], $src_image);
538
539            $zip->addFile($derivative->get_path(), $this->getFilename($row, $filesizes[ $row['id'] ]));
540            $total_size+= $filesizes[ $row['id'] ]['filesize'];
541          }
542        }
543
544        $images_added[] = $row['id'];
545        $this->images[ $row['id'] ] = $this->data['last_zip'];
546
547        if ($total_size >= $this->conf['max_size']*1024 and !$force_one_archive) break;
548      }
549
550      $this->updateParam('total_size', $this->data['total_size'] + $total_size);
551
552      // archive comment
553      $comment = 'Generated on '.date('r').' with PHP '.PHP_VERSION.' by Piwigo Batch Downloader.';
554      $comment.= "\n".$conf['gallery_title'].' - '.get_absolute_root_url();
555      if (!empty($conf['batch_download_comment']))
556      {
557        $comment.= "\n\n".wordwrap(remove_accents($conf['batch_download_comment']), 60);
558      }
559      $zip->setArchiveComment($comment);
560
561      $zip->close();
562
563      // update database
564      $query = '
565UPDATE '.BATCH_DOWNLOAD_TIMAGES.'
566  SET zip = '.$this->data['last_zip'].'
567  WHERE
568    set_id = '.$this->data['id'].'
569    AND image_id IN('.implode(',', $images_added).')
570;';
571      pwg_query($query);
572
573      trigger_action('batchdownload_end_zip', $this->data, $images_added); // triggered for each zip
574
575      // all images added ?
576      if (count($images_to_add) == count($images_added))
577      {
578        if ($this->conf['one_archive']) $this->updateParam('status', 'done');
579        $done = true;
580
581        // over estimed
582        $this->updateParam('nb_zip', $this->data['last_zip']);
583      }
584
585      // under estimed
586      if (!isset($done) && $this->data['status'] != 'done' && $this->data['last_zip'] == $this->data['nb_zip'])
587      {
588        $this->updateParam('nb_zip', $this->data['last_zip']+1);
589      }
590
591      return $zip_path;
592    }
593    else
594    {
595      return false;
596    }
597  }
598
599  /**
600   * getEstimatedTotalSize
601   * @return: int
602   */
603  function getEstimatedTotalSize($force=false)
604  {
605    if ($this->data['status'] == 'done') return $this->data['total_size'];
606    if ($this->data['nb_images'] == 0) return 0;
607    if ( !empty($this->data['estimated_total_size']) and !$force ) return $this->data['estimated_total_size'];
608
609    $image_ids = array_slice(array_keys($this->images), 0, $this->conf['max_elements']);
610
611    if ($this->data['size'] == 'original')
612    {
613      $query = '
614SELECT SUM(filesize) AS total
615  FROM '.IMAGES_TABLE.'
616  WHERE id IN ('.implode(',', $image_ids).')
617;';
618    }
619    else
620    {
621      $query = '
622SELECT SUM(filesize) AS total
623  FROM '.IMAGE_SIZES_TABLE.'
624  WHERE image_id IN ('.implode(',', $image_ids).')
625;';
626    }
627
628    list($this->data['estimated_total_size']) = pwg_db_fetch_row(pwg_query($query));
629    return $this->data['estimated_total_size'];
630  }
631
632  /**
633   * getEstimatedArchiveNumber
634   * @return: int
635   */
636  function getEstimatedArchiveNumber($force=false)
637  {
638    if ($this->data['status'] == 'done') return $this->data['nb_zip'];
639    if ( !empty($this->data['nb_zip']) and !$force ) return $this->data['nb_zip'];
640
641    $this->updateParam('nb_zip', ceil( $this->getEstimatedTotalSize($force) / ($this->conf['max_size']*1024) ));
642    return $this->data['nb_zip'];
643  }
644
645  /**
646   * getDownloadList
647   * @return: string html
648   */
649  function getDownloadList($url='')
650  {
651    if ($this->data['nb_images'] == 0)
652    {
653      return '<b>'.l10n('No archive').'</b>';
654    }
655
656    $root_url = get_root_url();
657
658    $out = '';
659    for ($i=1; $i<=$this->getEstimatedArchiveNumber(); $i++)
660    {
661      $out.= '<li id="zip-'.$i.'">';
662
663      if ($this->data['status']=='done' or ($this->conf['one_archive'] and $i<$this->data['last_zip']+1))
664      {
665        $out.= '<img src="'.$root_url.BATCH_DOWNLOAD_PATH.'template/images/drive_error.png"> '.l10n('Archive #%d (already downloaded)', $i);
666      }
667      else if ($i==$this->data['last_zip']+1 or (!$this->conf['one_archive'] and $i<$this->data['last_zip']+1))
668      {
669          $out.= '<a href="'.add_url_params($url, array('set_id'=>$this->data['id'],'zip'=>$i)).'" rel="nofollow" style="font-weight:bold;"'
670            .(($i!=1 and $this->conf['one_archive']) ? ' onClick="return confirm(\''.addslashes(l10n('Starting download Archive #%d will destroy Archive #%d, be sure you finish the download. Continue ?', $i, $i-1)).'\');"' : null).
671            '><img src="'.$root_url.BATCH_DOWNLOAD_PATH.'template/images/drive_go.png"> '.l10n('Archive #%d (ready)', $i).'</a>';
672      }
673      else
674      {
675        $out.= '<img src="'.$root_url.BATCH_DOWNLOAD_PATH.'template/images/drive.png"> '.l10n('Archive #%d (pending)', $i);
676      }
677
678      $out.= '</li>';
679    }
680
681    return $out;
682  }
683
684  /**
685   * getArchivePath
686   * @param: int archive number
687   * @return: string
688   */
689  function getArchivePath($i=null)
690  {
691    if (!file_exists(BATCH_DOWNLOAD_LOCAL . 'u-' .$this->data['user_id']. '/'))
692    {
693      mkgetdir(BATCH_DOWNLOAD_LOCAL . 'u-' .$this->data['user_id']. '/');
694    }
695
696    if ($i === null) $i = $this->data['last_zip'];
697    $set = $this->getNames();
698
699    $path = BATCH_DOWNLOAD_LOCAL . 'u-'. $this->data['user_id'] . '/';
700    $path.= !empty($this->conf['archive_prefix']) ? $this->conf['archive_prefix'] . '_' : null;
701    $path.= $set['BASENAME'] . '_' . $this->data['size'] . '_';
702    $path.= $this->data['user_id'] . $this->data['id'];
703    $path.= '_part' . $i . '.zip';
704
705    return $path;
706  }
707
708  /**
709   * getNames
710   * @return: array
711   *    NAME, set name with HTML
712   *    sNAME, set name without HTML
713   *    BASENAME, set filename
714   *    COMMENT, set comment
715   */
716  function getNames()
717  {
718    switch ($this->data['type'])
719    {
720      // calendar
721      case 'calendar':
722      {
723        global $conf, $page;
724        $old_page = $page;
725
726        $fields = array(
727          'created' => l10n('Creation date'),
728          'posted' => l10n('Post date'),
729          );
730
731        $chronology = explode('-', $this->data['type_id']);
732        $page['chronology_field'] = $chronology[0];
733        $page['chronology_style'] = $chronology[1];
734        $page['chronology_view'] = $chronology[2];
735        $page['chronology_date'] = array_splice($chronology, 3);
736
737        if (!class_exists('Calendar'))
738        {
739          include_once(PHPWG_ROOT_PATH.'include/calendar_'. $page['chronology_style'] .'.class.php');
740        }
741        $calendar = new Calendar();
742        $calendar->initialize('');
743        $display_name = strip_tags($calendar->get_display_name());
744
745        $set['NAME'] = l10n('Calendar').': '.$fields[$page['chronology_field']].$display_name;
746        $set['sNAME'] = l10n('Calendar').': '.ltrim($display_name, $conf['level_separator']);
747        $set['BASENAME'] = 'calendar-'.$page['chronology_field'].'-'.implode('-',$page['chronology_date']);
748
749        $page = $old_page;
750        break;
751      }
752
753      // category
754      case 'category':
755      {
756        $category = get_cat_info($this->data['type_id']);
757        if ($category == null)
758        {
759          $set['NAME'] = l10n('Album').': #'.$this->data['type_id'].' (deleted)';
760          $set['BASENAME'] = 'album'.$this->data['type_id'];
761        }
762        else
763        {
764          $set['NAME'] = l10n('Album').': '.get_cat_display_name($category['upper_names']);
765          $set['sNAME'] = l10n('Album').': '.trigger_event('render_category_name', $category['name']);
766          $set['COMMENT'] = trigger_event('render_category_description', $category['comment']);
767
768          if (!empty($category['permalink']))
769          {
770            $set['BASENAME'] = 'album-'.$category['permalink'];
771          }
772          else if ( ($name = str2url($category['name'])) != null )
773          {
774            $set['BASENAME'] = 'album-'.$name;
775          }
776          else
777          {
778            $set['BASENAME'] = 'album'.$this->data['type_id'];
779          }
780        }
781        break;
782      }
783
784      // flat
785      case 'flat':
786      {
787        $set['NAME'] = l10n('Whole gallery');
788        $set['BASENAME'] = 'all-gallery';
789        break;
790      }
791
792      // tags
793      case 'tags':
794      {
795        $tags = find_tags(explode(',', $this->data['type_id']));
796        $set['NAME'] = l10n('Tags').': ';
797        $set['BASENAME'] = 'tags';
798
799        $first = true;
800        foreach ($tags as $tag)
801        {
802          if ($first) $first = false;
803          else $set['NAME'].= ', ';
804          $set['NAME'].=
805            '<a href="' . make_index_url(array('tags'=>array($tag))) . '">'
806            .trigger_event('render_tag_name', $tag['name'])
807            .'</a>';
808          $set['BASENAME'].= '-'.$tag['url_name'];
809        }
810        break;
811      }
812
813      // search
814      case 'search':
815      {
816        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'search', 'search'=>$this->data['type_id'])).'">'.l10n('Search').'</a>';
817        $set['BASENAME'] = 'search'.$this->data['type_id'];
818        break;
819      }
820
821      // favorites
822      case 'favorites':
823      {
824        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'favorites')).'">'.l10n('Your favorites').'</a>';
825        $set['BASENAME'] = 'favorites';
826        break;
827      }
828
829      // most_visited
830      case 'most_visited':
831      {
832        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'most_visited')).'">'.l10n('Most visited').'</a>';
833        $set['BASENAME'] = 'most-visited';
834        break;
835      }
836
837      // best_rated
838      case 'best_rated':
839      {
840        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'best_rated')).'">'.l10n('Best rated').'</a>';
841        $set['BASENAME'] = 'best-rated';
842        break;
843      }
844
845      // list
846      case 'list':
847      {
848        $set['NAME'] = l10n('Random');
849        $set['BASENAME'] = 'random';
850        break;
851      }
852
853      // recent_pics
854      case 'recent_pics':
855      {
856        $set['NAME'] = '<a href="'.make_index_url(array('section'=>'recent_pics')).'">'.l10n('Recent photos').'</a>';
857        $set['BASENAME'] = 'recent-pics';
858        break;
859      }
860
861      // collection
862      case 'collection':
863      {
864        try
865        {
866          if (!class_exists('UserCollection')) throw new Exception();
867          $UserCollection = new UserCollection($this->data['type_id']);
868          $infos = $UserCollection->getCollectionInfo();
869          $set['NAME'] = l10n('Collection').': <a href="'.$infos['U_PUBLIC'].'">'.$UserCollection->getParam('name').'</a>';
870
871          if ( ($name = str2url($UserCollection->getParam('name'))) != null)
872          {
873            $set['BASENAME'] = 'collection-'.$name;
874          }
875          else
876          {
877            $set['BASENAME'] = 'collection'.$this->data['type_id'];
878          }
879        }
880        catch (Exception $e)
881        {
882          $set['NAME'] = l10n('Collection').': #'.$this->data['type_id'].' (deleted)';
883          $set['BASENAME'] = 'collection'.$this->data['type_id'];
884        }
885        break;
886      }
887    }
888
889    if (!isset($set['sNAME']))    $set['sNAME'] = strip_tags($set['NAME']);
890    if (!isset($set['COMMENT']))  $set['COMMENT'] = null;
891    if (!isset($set['BASENAME'])) $set['BASENAME'] = $this->data['type'] . $this->data['type_id'];
892
893    return $set;
894  }
895
896  /**
897   * getSetInfo
898   * @return: array
899   */
900  function getSetInfo()
901  {
902    $set = array(
903      'NB_IMAGES' =>     $this->data['nb_images'],
904      'NB_ARCHIVES' =>   $this->data['status']=='new' ? l10n('Unknown') : $this->getEstimatedArchiveNumber(),
905      'STATUS' =>        $this->data['status']=='ready' ? 'new' : $this->data['status'],
906      'LAST_ZIP' =>      $this->data['last_zip'],
907      'TOTAL_SIZE' =>    $this->data['status']=='new' ? l10n('Unknown') : l10n('%d MB', ceil($this->getEstimatedTotalSize()/1024)),
908      'DATE_CREATION' => format_date($this->data['date_creation'], true),
909      'SIZE' =>          $this->data['size'],
910      );
911
912    if ($this->data['size'] != 'original')
913    {
914      $params = ImageStdParams::get_by_type($this->data['size']);
915      $set['SIZE_INFO'] = $params->sizing->ideal_size[0].' x '.$params->sizing->ideal_size[1];
916    }
917
918    return array_merge($set, $this->getNames());
919  }
920
921  /**
922   * delete
923   */
924  function delete()
925  {
926    $this->deleteArchives();
927    $this->clearImages();
928    pwg_query('DELETE FROM '.BATCH_DOWNLOAD_TSETS.' WHERE id = '.$this->data['id'].';');
929  }
930}
931
932
933/**
934 * small class implementing basic ZIP creation
935 * with ZipArchive or PclZip
936 */
937class myZip
938{
939  private $lib;
940  private $zip;
941
942  function __construct($zip_path, $pclzip=false)
943  {
944    if ( class_exists('ZipArchive') and !$pclzip )
945    {
946      $this->lib = 'zipa';
947
948      $this->zip = new ZipArchive;
949      if ($this->zip->open($zip_path, ZipArchive::CREATE) !== true)
950      {
951        trigger_error('BatchDownloader::createNextArchive, unable to open ZIP archive (ZipArchive)', E_USER_ERROR);
952      }
953    }
954    else
955    {
956      $this->lib = 'pcl';
957
958      require_once(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
959      $this->zip = new PclZip($zip_path);
960
961      // create a temporary file for archive creation
962      touch(BATCH_DOWNLOAD_LOCAL.'temp.txt');
963
964      if ($this->zip->create(BATCH_DOWNLOAD_LOCAL.'temp.txt', PCLZIP_OPT_REMOVE_ALL_PATH) == 0)
965      {
966        trigger_error('BatchDownloader::createNextArchive, unable to open ZIP archive (PclZip)', E_USER_ERROR);
967      }
968
969      unlink(BATCH_DOWNLOAD_LOCAL.'temp.txt');
970      $this->zip->delete(PCLZIP_OPT_BY_NAME, 'temp.txt');
971    }
972  }
973
974  function addFile($path, $filename)
975  {
976    if ($this->lib == 'zipa')
977    {
978      $this->zip->addFile($path, $filename);
979    }
980    else
981    {
982      $this->zip->add($path, PCLZIP_OPT_REMOVE_ALL_PATH);
983    }
984  }
985
986  function setArchiveComment($comment)
987  {
988    if ($this->lib == 'zipa')
989    {
990      $this->zip->setArchiveComment($comment);
991    }
992  }
993
994  function close()
995  {
996    if ($this->lib == 'zipa')
997    {
998      $this->zip->close();
999    }
1000  }
1001}
Note: See TracBrowser for help on using the repository browser.