From 542cbb8b400d79d576e7871b25c16b1247771270 Mon Sep 17 00:00:00 2001 From: Brian Wolff Date: Thu, 19 Jun 2014 20:19:35 -0300 Subject: [PATCH] Do not require iiurlwidth when getting thumbnails. Some file types might not have a specific width/height. As an example, TimedMediaHandler can specify thumbnails that are "mid" sized instead of specific width. The requirement for iiurlwidth was breaking some edge cases with ForeignAPIRepo and TimedMediaHandler (Specificly with ?embedplayer=yes). Do not require a width, but also verify that thumbnail parameters are ok by running through normaliseParams (Formats that require a width make this function return false if none is specified). Change-Id: I8bb4c26db56c814ddfbd3e53ca98d05378c2a0bd --- RELEASE-NOTES-1.24 | 1 + includes/api/ApiQueryImageInfo.php | 49 +++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/RELEASE-NOTES-1.24 b/RELEASE-NOTES-1.24 index 79b8a49ff7..67b47bf48c 100644 --- a/RELEASE-NOTES-1.24 +++ b/RELEASE-NOTES-1.24 @@ -262,6 +262,7 @@ production. deprecated in favor of cmstarthexsortkey and cmendhexsortkey. * (bug 63326) Add blockedtimestamp field to output of blockinfo property for the list=allusers and list=users modules. +* prop=imageinfo no longer requires iiurlwidth to be set when using iiurlparam. === Action API internal changes in 1.24 === * Methods for handling continuation are added to ApiResult, so actions other diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php index 5cc1454046..b8f0890c77 100644 --- a/includes/api/ApiQueryImageInfo.php +++ b/includes/api/ApiQueryImageInfo.php @@ -237,9 +237,11 @@ class ApiQueryImageInfo extends ApiQueryBase { $scale = array(); $scale['height'] = $params['urlheight']; } else { - $scale = null; if ( $params['urlparam'] ) { - $this->dieUsage( "{$p}urlparam requires {$p}urlwidth", "urlparam_no_width" ); + // Audio files might not have a width/height. + $scale = array(); + } else { + $scale = null; } } @@ -256,6 +258,10 @@ class ApiQueryImageInfo extends ApiQueryBase { * @return array Array of parameters for transform. */ protected function mergeThumbParams( $image, $thumbParams, $otherParams ) { + if ( $thumbParams === null ) { + // No scaling requested + return null; + } if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) { // We want to limit only by height in this situation, so pass the // image's full width as the limiting width. But some file types @@ -269,6 +275,7 @@ class ApiQueryImageInfo extends ApiQueryBase { } if ( !$otherParams ) { + $this->checkParameterNormalise( $image, $thumbParams ); return $thumbParams; } $p = $this->getModulePrefix(); @@ -289,11 +296,11 @@ class ApiQueryImageInfo extends ApiQueryBase { // handlers. $this->setWarning( "Could not parse {$p}urlparam for " . $image->getName() . '. Using only width and height' ); - + $this->checkParameterNormalise( $image, $thumbParams ); return $thumbParams; } - if ( isset( $paramList['width'] ) ) { + if ( isset( $paramList['width'] ) && isset( $thumbParams['width'] ) ) { if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) { $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) " . "in favor of width value derived from {$p}urlwidth/{$p}urlheight " @@ -307,7 +314,33 @@ class ApiQueryImageInfo extends ApiQueryBase { } } - return $thumbParams + $paramList; + $finalParams = $thumbParams + $paramList; + $this->checkParameterNormalise( $image, $finalParams ); + return $finalParams; + } + + /** + * Verify that the final image parameters can be normalised. + * + * This doesn't use the normalised parameters, since $file->transform + * expects the pre-normalised parameters, but doing the normalisation + * allows us to catch certain error conditions early (such as missing + * required parameter). + * + * @param $image File + * @param $finalParams array List of parameters to transform image with + */ + protected function checkParameterNormalise( $image, $finalParams ) { + $h = $image->getHandler(); + if ( !$h ) { + return; + } + // Note: normaliseParams modifies the array in place, but we aren't interested + // in the actual normalised version, only if we can actually normalise them, + // so we use the functions scope to throw away the normalisations. + if ( !$h->normaliseParams( $image, $finalParams ) ) { + $this->dieUsage( "Could not normalise image parameters for " . $image->getName(), "urlparamnormal" ); + } } /** @@ -716,8 +749,10 @@ class ApiQueryImageInfo extends ApiQueryBase { 'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' ), 'urlheight' => "Similar to {$p}urlwidth.", - 'urlparam' => array( "A handler specific parameter string. For example, pdf's ", - "might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ), + 'urlparam' => array( + "A handler specific parameter string. For example, pdf's ", + "might use 'page15-100px'." + ), 'limit' => 'How many image revisions to return per image', 'start' => 'Timestamp to start listing from', 'end' => 'Timestamp to stop listing at', -- 2.20.1