Changeset 12865

Show
Ignore:
Timestamp:
01/08/12 20:25:52 (3 years ago)
Author:
rvelices
Message:

feature 2548 multisize - added a page to build missing derivatives

  • browser driven, chained ws calls to retrieve urls, visual feedback of progress through slideshow
Location:
trunk
Files:
3 added
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/admin/include/functions.php

    r12855 r12865  
    201201    $files[] = get_element_path($row); 
    202202 
    203     
    204203    if (!empty($row['representative_ext'])) 
    205204    { 
    206       $pi = pathinfo($row['path']); 
    207       $file_wo_ext = get_filename_wo_extension($pi['basename']); 
    208205      $files[] = original_to_representative( $files[0], $row['representative_ext']); 
    209206    } 
  • trunk/admin/include/image.class.php

    r12851 r12865  
    705705                imagecopy($cut, $ioverlay, 0, 0, 0, 0, $ow, $oh); 
    706706                imagecopymerge($this->image, $cut, $x, $y, 0, 0, $ow, $oh, $opacity); 
     707    imagedestroy($cut); 
    707708    return true; 
    708709  } 
  • trunk/admin/themes/default/template/derivatives.tpl

    r12851 r12865  
    2323{/literal}{/html_head} 
    2424 
     25<p><a href="admin.php?page=derivatives_build">Build missing derivatives</a></p> 
    2526<form method="post" id="derviativesForm"> 
    2627<fieldset> 
  • trunk/i.php

    r12851 r12865  
    109109  { 
    110110    $req = $_SERVER["QUERY_STRING"]; 
     111    if ($pos=strpos($req, '&')) 
     112    { 
     113      $req = substr($req, 0, $pos); 
     114    } 
    111115    /*foreach (array_keys($_GET) as $keynum => $key) 
    112116    { 
     
    168172    try 
    169173    { 
    170       $page['derivative_params'] = DerivativeParams::from_url_tokens($deriv); 
     174      $params = $page['derivative_params'] = DerivativeParams::from_url_tokens($deriv); 
    171175    } 
    172176    catch (Exception $e) 
    173177    { 
    174178      ierror($e->getMessage(), 400); 
     179    } 
     180    if ($params->sizing->ideal_size[0] < 20 or $params->sizing->ideal_size[1] < 20) 
     181    { 
     182      ierror('Invalid size', 400); 
     183    } 
     184    if ($params->sizing->max_crop < 0 or $params->sizing->max_crop > 1) 
     185    { 
     186      ierror('Invalid crop', 400); 
    175187    } 
    176188  } 
     
    225237 
    226238$params = $page['derivative_params']; 
    227 if ($params->sizing->ideal_size[0] < 20 or $params->sizing->ideal_size[1] < 20) 
    228 { 
    229   ierror('Invalid size', 400); 
    230 } 
    231 if ($params->sizing->max_crop < 0 or $params->sizing->max_crop > 1) 
    232 { 
    233   ierror('Invalid crop', 400); 
    234 } 
    235239 
    236240$src_mtime = @filemtime($page['src_path']); 
     
    251255$expires=false; 
    252256$now = time(); 
    253 if ( $now > (max($src_mtime, $params->last_mod_time) + 24*3600) ) 
     257if ( isset($_GET['b']) ) 
     258{ 
     259  $expires = $now + 100; 
     260  header("Cache-control: no-store, max-age=100"); 
     261} 
     262elseif ( $now > (max($src_mtime, $params->last_mod_time) + 24*3600) ) 
    254263{// somehow arbitrary - if derivative params or src didn't change for the last 24 hours, we send an expire header for several days 
    255264  $expires = $now + 10*24*3600; 
     
    268277} 
    269278 
     279if (!mkgetdir(dirname($page['derivative_path']))) 
     280{ 
     281  ierror("dir create error", 500); 
     282} 
    270283 
    271284include_once(PHPWG_ROOT_PATH . 'admin/include/image.class.php'); 
     
    275288 
    276289$image = new pwg_image($page['src_path']); 
    277  
    278 if (!mkgetdir(dirname($page['derivative_path']))) 
    279 { 
    280   ierror("dir create error", 500); 
    281 } 
    282290 
    283291$changes = 0; 
     
    326334    { 
    327335      // todo 
     336      $pad = $wm_size[0] + max(30, round($wm_size[0]/4)); 
     337      for($i=-$wm->xrepeat; $i<=$wm->xrepeat; $i++) 
     338      { 
     339        if (!$i) continue; 
     340        $x2 = $x + $i * $pad; 
     341        if ($x2>=0 && $x2+$wm_size[0]<$d_size[0]) 
     342          if (!$image->compose($wm_image, $x2, $y, $wm->opacity)) 
     343            break; 
     344      } 
    328345    } 
    329346  } 
  • trunk/include/derivative.inc.php

    r12855 r12865  
    220220  } 
    221221 
     222  function get_path() 
     223  { 
     224    return PHPWG_ROOT_PATH.$this->rel_path; 
     225  } 
     226 
    222227  function get_url() 
    223228  { 
  • trunk/include/ws_functions.inc.php

    r12855 r12865  
    9393    $clauses[] = $tbl_name.'width/'.$tbl_name.'height<='.$params['f_max_ratio']; 
    9494  } 
    95   if ( $params['f_with_thumbnail'] ) 
    96   { 
    97     $clauses[] = $tbl_name.'tn_ext IS NOT NULL'; 
     95  if (is_numeric($params['f_max_level']) ) 
     96  { 
     97    $clauses[] = $tbl_name.'level <= '.$params['f_max_level']; 
    9898  } 
    9999  return $clauses; 
     
    148148{ 
    149149  $ret = array(); 
    150    
     150 
    151151  $src_image = new SrcImage($image_row); 
    152152 
     
    156156    $ret['element_url'] = get_element_url($image_row); 
    157157  } 
    158    
     158 
    159159  $derivatives = DerivativeImage::get_all($src_image); 
    160160  $derivatives_arr = array(); 
     
    178178    'id','element_url', 'file','width','height','hit','date_available','date_creation' 
    179179    ); 
     180} 
     181 
     182function ws_getMissingDerivatives($params, &$service) 
     183{ 
     184  if (!is_admin()) 
     185  { 
     186    return new PwgError(403, 'Forbidden'); 
     187  } 
     188 
     189  if ( empty($params['types']) ) 
     190  { 
     191    $types = array_keys(ImageStdParams::get_defined_type_map()); 
     192  } 
     193  else 
     194  { 
     195    $types = array_intersect(array_keys(ImageStdParams::get_defined_type_map()), $params['types']); 
     196    if (count($types)==0) 
     197    { 
     198      return new PwgError(WS_ERR_INVALID_PARAM, "Invalid types"); 
     199    } 
     200  } 
     201 
     202  if ( ($max_urls = intval($params['max_urls'])) <= 0) 
     203  { 
     204    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid max_urls"); 
     205  } 
     206 
     207  list($max_id, $image_count) = pwg_db_fetch_row( pwg_query('SELECT MAX(id)+1, COUNT(*) FROM '.IMAGES_TABLE) ); 
     208  $start_id = intval($params['prev_page']); 
     209  if ($start_id<=0) 
     210  { 
     211    $start_id = $max_id; 
     212  } 
     213 
     214  $uid = '&b='.time(); 
     215  global $conf; 
     216  $conf['question_mark_in_urls'] = $conf['php_extension_in_urls'] = true; 
     217  $conf['derivative_url_style']=2; //script 
     218 
     219  $qlimit = min(5000, ceil(max($image_count/500, $max_urls/count($types)))); 
     220  $where_clauses = ws_std_image_sql_filter( $params, '' ); 
     221  $where_clauses[] = 'id<start_id'; 
     222 
     223  $query_model = 'SELECT id, path, representative_ext, width, height 
     224  FROM '.IMAGES_TABLE.' 
     225  WHERE '.implode(' AND ', $where_clauses).' 
     226  ORDER BY id DESC 
     227  LIMIT '.$qlimit; 
     228 
     229  $urls=array(); 
     230  do 
     231  { 
     232    $result = pwg_query( str_replace('start_id', $start_id, $query_model)); 
     233    $is_last = pwg_db_num_rows($result) < $qlimit; 
     234    while ($row=pwg_db_fetch_assoc($result)) 
     235    { 
     236      $start_id = $row['id']; 
     237      $src_image = new SrcImage($row); 
     238      if ($src_image->is_mimetype()) 
     239        continue; 
     240      foreach($types as $type) 
     241      { 
     242        $derivative = new DerivativeImage($type, $src_image); 
     243        if ($type != $derivative->get_type()) 
     244          continue; 
     245        if (@filemtime($derivative->get_path())===false) 
     246        { 
     247          $urls[] = $derivative->get_url().$uid; 
     248        } 
     249      } 
     250      if (count($urls)>=$max_urls && !$is_last) 
     251        break; 
     252    } 
     253    if ($is_last) 
     254    { 
     255      $start_id = 0; 
     256    } 
     257  }while (count($urls)<$max_urls && $start_id); 
     258 
     259  $ret = array(); 
     260  if ($start_id) 
     261  { 
     262    $ret['next_page']=$start_id; 
     263  } 
     264  $ret['urls']=$urls; 
     265  return $ret; 
    180266} 
    181267 
     
    515601  $user_representative_updates_for = array(); 
    516602  // management of the album thumbnail -- stops here 
    517    
     603 
    518604  $cats = array(); 
    519605  while ($row = pwg_db_fetch_assoc($result)) 
     
    553639 
    554640    // management of the album thumbnail -- starts here 
    555     //  
     641    // 
    556642    // on branch 2.3, the algorithm is duplicated from 
    557643    // include/category_cats, but we should use a common code for Piwigo 2.4 
     
    604690      } 
    605691    } 
    606      
     692 
    607693    if (isset($image_id)) 
    608694    { 
     
    611697        $user_representative_updates_for[ $user['id'].'#'.$row['id'] ] = $image_id; 
    612698      } 
    613      
     699 
    614700      $row['representative_picture_id'] = $image_id; 
    615701      array_push($image_ids, $image_id); 
     
    651737        // * register it at user_representative_picture_id 
    652738        // * set it as the representative_picture_id for the category 
    653          
     739 
    654740        foreach ($categories as &$category) 
    655741        { 
     
    658744            // searching a random representant among elements in sub-categories 
    659745            $image_id = get_random_image_in_category($category); 
    660              
     746 
    661747            if (isset($image_id) and !in_array($image_id, $image_ids)) 
    662748            { 
    663749              array_push($new_image_ids, $image_id); 
    664750            } 
    665              
     751 
    666752            if ($conf['representative_cache_on_level']) 
    667753            { 
    668754              $user_representative_updates_for[ $user['id'].'#'.$category['id'] ] = $image_id; 
    669755            } 
    670              
     756 
    671757            $category['representative_picture_id'] = $image_id; 
    672758          } 
     
    675761      } 
    676762    } 
    677      
     763 
    678764    if (count($new_image_ids) > 0) 
    679765    { 
     
    697783  { 
    698784    $updates = array(); 
    699    
     785 
    700786    foreach ($user_representative_updates_for as $user_cat => $image_id) 
    701787    { 
    702788      list($user_id, $cat_id) = explode('#', $user_cat); 
    703      
     789 
    704790      array_push( 
    705791        $updates, 
     
    736822    unset($cat['count_categories']); 
    737823  } 
    738   unset($cat);   
     824  unset($cat); 
    739825  // management of the album thumbnail -- stops here 
    740826 
     
    15311617  // check dumped thumbnail md5 
    15321618  $dumped_md5 = md5_file($file_path); 
    1533   if ($dumped_md5 != $file_sum)  
     1619  if ($dumped_md5 != $file_sum) 
    15341620  { 
    15351621    return new PwgError(500, '[add_file] '.$type.' transfer failed'); 
     
    16661752  { 
    16671753    ws_logfile('[pwg.images.add] resize activated'); 
    1668      
     1754 
    16691755    // temporary file path 
    16701756    $type = 'file'; 
    16711757    $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-'.$type; 
    1672      
     1758 
    16731759    merge_chunks($file_path, $params['original_sum'], $type); 
    16741760    chmod($file_path, 0644); 
    16751761 
    16761762    include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); 
    1677      
     1763 
    16781764    $image_id = add_uploaded_file( 
    16791765      $file_path, 
     
    17041790    $filename_wo_ext = $date_string.'-'.$random_string; 
    17051791    $file_path = $upload_dir.'/'.$filename_wo_ext.'.jpg'; 
    1706      
     1792 
    17071793    // add files 
    17081794    $file_infos  = add_file($file_path, 'file',  $params['original_sum'], $params['file_sum']); 
    17091795    $thumb_infos = add_file($file_path, 'thumb', $params['original_sum'], $params['thumbnail_sum']); 
    1710      
     1796 
    17111797    if (isset($params['high_sum'])) 
    17121798    { 
     
    17631849    } 
    17641850  } 
    1765    
     1851 
    17661852  if (count(array_keys($update)) > 0) 
    17671853  { 
     
    17741860 
    17751861  $url_params = array('image_id' => $image_id); 
    1776    
     1862 
    17771863  // let's add links between the image and the categories 
    17781864  if (isset($params['categories'])) 
     
    17821868    if (preg_match('/^\d+/', $params['categories'], $matches)) { 
    17831869      $category_id = $matches[0]; 
    1784      
     1870 
    17851871      $query = ' 
    17861872SELECT id, name, permalink 
     
    17901876      $result = pwg_query($query); 
    17911877      $category = pwg_db_fetch_assoc($result); 
    1792        
     1878 
    17931879      $url_params['section'] = 'categories'; 
    17941880      $url_params['category'] = $category; 
     
    19582044    return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid user_id'); 
    19592045  } 
    1960    
     2046 
    19612047  $query = ' 
    19622048DELETE FROM '.RATE_TABLE.' 
    19632049  WHERE user_id='.$user_id; 
    1964    
     2050 
    19652051  if (!empty($params['anonymous_id'])) 
    19662052  { 
    19672053    $query .= ' AND anonymous_id=\''.$params['anonymous_id'].'\''; 
    19682054  } 
    1969    
     2055 
    19702056  $changes = pwg_db_changes(pwg_query($query)); 
    19712057  if ($changes) 
     
    32753361    return new PwgError(403, "image can't be resized"); 
    32763362  } 
    3277    
     3363 
    32783364  $hd_path = get_high_path($image); 
    32793365 
     
    32853371      $hd_dir = dirname($hd_path); 
    32863372      prepare_directory($hd_dir); 
    3287        
     3373 
    32883374      rename($image_path, $hd_path); 
    32893375      $hd_infos = pwg_image_infos($hd_path); 
  • trunk/themes/default/template/picture_content.tpl

    r12855 r12865  
    3333} 
    3434{/literal}{/footer_script} 
    35 <a id="derivativeSwitchLink" onclick="toggleDerivativeSwitchBox()" style="cursor:pointer">{$current.selected_derivative->get_type()|@translate}</a> 
     35<a id="derivativeSwitchLink" href="javascript:toggleDerivativeSwitchBox()">{$current.selected_derivative->get_type()|@translate}</a> 
    3636<div id="derivativeSwitchBox" onclick="toggleDerivativeSwitchBox()" style="display:none"> 
    3737{foreach from=$current.unique_derivatives item=derivative key=derivative_type} 
     
    3939{/foreach} 
    4040{if isset($U_ORIGINAL)} 
    41 <a  href="javascript:phpWGOpenWindow('{$U_ORIGINAL}','xxx','scrollbars=yes,toolbar=no,status=no,resizable=yes')" title="{'Click on the photo to see it in high definition'|@translate}">{'original'|@translate}</a> 
     41<a href="javascript:phpWGOpenWindow('{$U_ORIGINAL}','xxx','scrollbars=yes,toolbar=no,status=no,resizable=yes')" title="{'Click on the photo to see it in high definition'|@translate}">{'original'|@translate}</a> 
    4242{/if} 
    4343</div> 
  • trunk/ws.php

    r12730 r12865  
    7070        'f_min_ratio' => array( 'default'=> null ), 
    7171        'f_max_ratio' => array( 'default'=> null ), 
    72         'f_with_thumbnail' => array( 'default'=> false ), 
     72        'f_max_level' => array( 'default'=> null ), 
    7373      ), 
    7474      'Returns elements for the corresponding categories. 
     
    8686      ), 
    8787      'retrieves a list of categories (tree_output option only compatible with json/php output format' ); 
     88 
     89  $service->addMethod('pwg.getMissingDerivatives', 'ws_getMissingDerivatives', 
     90      array( 
     91        'types' => array( 'default'=>array(), 'flags'=>WS_PARAM_FORCE_ARRAY), 
     92        'max_urls' => array( 'default' => 200 ), 
     93        'prev_page' => array( 'default'=> null), 
     94        'f_min_rate' => array( 'default'=> null ), 
     95        'f_max_rate' => array( 'default'=> null ), 
     96        'f_min_hit' => array( 'default'=> null ), 
     97        'f_max_hit' => array( 'default'=> null ), 
     98        'f_min_date_available' => array( 'default'=> null ), 
     99        'f_max_date_available' => array( 'default'=> null ), 
     100        'f_min_date_created' => array( 'default'=> null ), 
     101        'f_max_date_created' => array( 'default'=> null ), 
     102        'f_min_ratio' => array( 'default'=> null ), 
     103        'f_max_ratio' => array( 'default'=> null ), 
     104        'f_max_level' => array( 'default'=> null ), 
     105      ), 
     106      'retrieves a list of derivatives to build' ); 
    88107 
    89108  $service->addMethod('pwg.images.addComment', 'ws_images_addComment', 
     
    130149        'f_min_ratio' => array( 'default'=> null ), 
    131150        'f_max_ratio' => array( 'default'=> null ), 
    132         'f_with_thumbnail' => array( 'default'=> false ), 
     151        'f_max_level' => array( 'default'=> null ), 
    133152      ), 
    134153      'Returns elements for the corresponding query search.' 
     
    193212        'f_min_ratio' => array( 'default'=> null ), 
    194213        'f_max_ratio' => array( 'default'=> null ), 
    195         'f_with_thumbnail' => array( 'default'=> false ), 
     214        'f_max_level' => array( 'default'=> null ), 
    196215      ), 
    197216      'Returns elements for the corresponding tags. Note that tag_id, tag_url_name, tag_name an be arrays. Fill at least one of them. '