$params['width'] = $params['w'];
unset( $params['w'] );
}
+ if ( isset( $params['width'] ) && substr( $params['width'], -2 ) == 'px' ) {
+ // strip the px (pixel) suffix, if found
+ $params['width'] = substr( $width, 0, strlen( $width ) - 2 );
+ }
if ( isset( $params['p'] ) ) {
$params['page'] = $params['p'];
}
}
// Actually generate a new thumbnail
- list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName );
+ list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName, $thumbPath );
// Check for thumbnail generation errors...
$msg = wfMessage( 'thumbnail_error' );
* @param File $file
* @param array $params
* @param string $thumbName
+ * @param string $thumbPath
* @return array (MediaTransformOutput|bool, string|bool error message HTML)
*/
-function wfGenerateThumbnail( File $file, array $params, $thumbName ) {
+function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath ) {
global $wgMemc, $wgAttemptFailureEpoch;
$key = wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
'doWork' => function() use ( $file, $params ) {
return $file->transform( $params, File::RENDER_NOW );
},
- 'getCachedWork' => function() use ( $file, $params ) {
- return $file->transform( $params );
+ 'getCachedWork' => function() use ( $file, $params, $thumbPath ) {
+ // If the worker that finished made this thumbnail then use it.
+ // Otherwise, it probably made a different thumbnail for this file.
+ return $file->getRepo()->fileExists( $thumbPath )
+ ? $file->transform( $params, File::RENDER_NOW )
+ : false; // retry once more in exclusive mode
},
'fallback' => function() {
return wfMessage( 'generic-pool-error' )->parse();
* links to on file description pages and possibly parser output.
*
* $params is considered non-standard if they involve a non-standard
- * width or any parameter aside from width and page number. The number
- * of possible files with standard parameters is far less than that of all
- * possible combinations; rate-limiting for them can thus be more generious.
+ * width or any non-default parameters aside from width and page number.
+ * The number of possible files with standard parameters is far less than
+ * that of all combinations; rate-limiting for them can thus be more generious.
*
* @param File $file
* @param array $params
function wfThumbIsStandard( File $file, array $params ) {
global $wgThumbLimits, $wgImageLimits;
- if ( isset( $params['width'] ) ) {
- $widths = $wgThumbLimits;
+ $handler = $file->getHandler();
+ if ( !$handler || !isset( $params['width'] ) ) {
+ return false;
+ }
+
+ $basicParams = array();
+ if ( isset( $params['page'] ) ) {
+ $basicParams['page'] = $params['page'];
+ }
+
+ // Check if the width matches one of $wgThumbLimits
+ if ( in_array( $params['width'], $wgThumbLimits ) ) {
+ $normalParams = $basicParams + array( 'width' => $params['width'] );
+ // Append any default values to the map (e.g. "lossy", "lossless", ...)
+ $handler->normaliseParams( $file, $normalParams );
+ } else {
+ // If not, then check if the width matchs one of $wgImageLimits
+ $match = false;
foreach ( $wgImageLimits as $pair ) {
- $widths[] = $pair[0];
+ $normalParams = $basicParams + array( 'width' => $pair[0], 'height' => $pair[1] );
+ // Decide whether the thumbnail should be scaled on width or height.
+ // Also append any default values to the map (e.g. "lossy", "lossless", ...)
+ $handler->normaliseParams( $file, $normalParams );
+ // Check if this standard thumbnail size maps to the given width
+ if ( $normalParams['width'] == $params['width'] ) {
+ $match = true;
+ break;
+ }
}
- if ( !in_array( $params['width'], $widths ) ) {
- return false;
+ if ( !$match ) {
+ return false; // not standard for description pages
}
}
- $handler = $file->getHandler();
- if ( $handler ) {
- // Standard thumbnails use a standard width and any page number
- $normalParams = array( 'width' => $params['width'] );
- if ( isset( $params['page'] ) ) {
- $normalParams['page'] = $params['page'];
- }
- // Append any default values to the map (e.g. "lossy", "lossless", "seek"...)
- $handler->normaliseParams( $file, $normalParams );
- // Check that the given values for non-page, non-width, params are just defaults
- foreach ( $params as $key => $value ) {
- if ( !isset( $normalParams[$key] ) || $normalParams[$key] !== $value ) {
- return false;
- }
+ // Check that the given values for non-page, non-width, params are just defaults
+ foreach ( $params as $key => $value ) {
+ if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) {
+ return false;
}
}