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

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

the fix for url was really bad

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