[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Foreign file accessible through api.php requests. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup FileAbstraction 22 */ 23 24 /** 25 * Foreign file accessible through api.php requests. 26 * Very hacky and inefficient, do not use :D 27 * 28 * @ingroup FileAbstraction 29 */ 30 class ForeignAPIFile extends File { 31 private $mExists; 32 33 protected $repoClass = 'ForeignApiRepo'; 34 35 /** 36 * @param Title|string|bool $title 37 * @param ForeignApiRepo $repo 38 * @param array $info 39 * @param bool $exists 40 */ 41 function __construct( $title, $repo, $info, $exists = false ) { 42 parent::__construct( $title, $repo ); 43 44 $this->mInfo = $info; 45 $this->mExists = $exists; 46 47 $this->assertRepoDefined(); 48 } 49 50 /** 51 * @param Title $title 52 * @param ForeignApiRepo $repo 53 * @return ForeignAPIFile|null 54 */ 55 static function newFromTitle( Title $title, $repo ) { 56 $data = $repo->fetchImageQuery( array( 57 'titles' => 'File:' . $title->getDBkey(), 58 'iiprop' => self::getProps(), 59 'prop' => 'imageinfo', 60 'iimetadataversion' => MediaHandler::getMetadataVersion(), 61 // extmetadata is language-dependant, accessing the current language here 62 // would be problematic, so we just get them all 63 'iiextmetadatamultilang' => 1, 64 ) ); 65 66 $info = $repo->getImageInfo( $data ); 67 68 if ( $info ) { 69 $lastRedirect = isset( $data['query']['redirects'] ) 70 ? count( $data['query']['redirects'] ) - 1 71 : -1; 72 if ( $lastRedirect >= 0 ) { 73 $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] ); 74 $img = new self( $newtitle, $repo, $info, true ); 75 if ( $img ) { 76 $img->redirectedFrom( $title->getDBkey() ); 77 } 78 } else { 79 $img = new self( $title, $repo, $info, true ); 80 } 81 82 return $img; 83 } else { 84 return null; 85 } 86 } 87 88 /** 89 * Get the property string for iiprop and aiprop 90 * @return string 91 */ 92 static function getProps() { 93 return 'timestamp|user|comment|url|size|sha1|metadata|mime|mediatype|extmetadata'; 94 } 95 96 // Dummy functions... 97 98 /** 99 * @return bool 100 */ 101 public function exists() { 102 return $this->mExists; 103 } 104 105 /** 106 * @return bool 107 */ 108 public function getPath() { 109 return false; 110 } 111 112 /** 113 * @param array $params 114 * @param int $flags 115 * @return bool|MediaTransformOutput 116 */ 117 function transform( $params, $flags = 0 ) { 118 if ( !$this->canRender() ) { 119 // show icon 120 return parent::transform( $params, $flags ); 121 } 122 123 // Note, the this->canRender() check above implies 124 // that we have a handler, and it can do makeParamString. 125 $otherParams = $this->handler->makeParamString( $params ); 126 $width = isset( $params['width'] ) ? $params['width'] : -1; 127 $height = isset( $params['height'] ) ? $params['height'] : -1; 128 129 $thumbUrl = $this->repo->getThumbUrlFromCache( 130 $this->getName(), 131 $width, 132 $height, 133 $otherParams 134 ); 135 if ( $thumbUrl === false ) { 136 global $wgLang; 137 138 return $this->repo->getThumbError( 139 $this->getName(), 140 $width, 141 $height, 142 $otherParams, 143 $wgLang->getCode() 144 ); 145 } 146 147 return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params ); 148 } 149 150 // Info we can get from API... 151 152 /** 153 * @param int $page 154 * @return int|number 155 */ 156 public function getWidth( $page = 1 ) { 157 return isset( $this->mInfo['width'] ) ? intval( $this->mInfo['width'] ) : 0; 158 } 159 160 /** 161 * @param int $page 162 * @return int 163 */ 164 public function getHeight( $page = 1 ) { 165 return isset( $this->mInfo['height'] ) ? intval( $this->mInfo['height'] ) : 0; 166 } 167 168 /** 169 * @return bool|null|string 170 */ 171 public function getMetadata() { 172 if ( isset( $this->mInfo['metadata'] ) ) { 173 return serialize( self::parseMetadata( $this->mInfo['metadata'] ) ); 174 } 175 176 return null; 177 } 178 179 /** 180 * @return array|null Extended metadata (see imageinfo API for format) or 181 * null on error 182 */ 183 public function getExtendedMetadata() { 184 if ( isset( $this->mInfo['extmetadata'] ) ) { 185 return $this->mInfo['extmetadata']; 186 } 187 188 return null; 189 } 190 191 /** 192 * @param array $metadata 193 * @return array 194 */ 195 public static function parseMetadata( $metadata ) { 196 if ( !is_array( $metadata ) ) { 197 return $metadata; 198 } 199 $ret = array(); 200 foreach ( $metadata as $meta ) { 201 $ret[$meta['name']] = self::parseMetadata( $meta['value'] ); 202 } 203 204 return $ret; 205 } 206 207 /** 208 * @return bool|int|null 209 */ 210 public function getSize() { 211 return isset( $this->mInfo['size'] ) ? intval( $this->mInfo['size'] ) : null; 212 } 213 214 /** 215 * @return null|string 216 */ 217 public function getUrl() { 218 return isset( $this->mInfo['url'] ) ? strval( $this->mInfo['url'] ) : null; 219 } 220 221 /** 222 * @param string $method 223 * @return int|null|string 224 */ 225 public function getUser( $method = 'text' ) { 226 return isset( $this->mInfo['user'] ) ? strval( $this->mInfo['user'] ) : null; 227 } 228 229 /** 230 * @param int $audience 231 * @param User $user 232 * @return null|string 233 */ 234 public function getDescription( $audience = self::FOR_PUBLIC, User $user = null ) { 235 return isset( $this->mInfo['comment'] ) ? strval( $this->mInfo['comment'] ) : null; 236 } 237 238 /** 239 * @return null|string 240 */ 241 function getSha1() { 242 return isset( $this->mInfo['sha1'] ) 243 ? wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 ) 244 : null; 245 } 246 247 /** 248 * @return bool|string 249 */ 250 function getTimestamp() { 251 return wfTimestamp( TS_MW, 252 isset( $this->mInfo['timestamp'] ) 253 ? strval( $this->mInfo['timestamp'] ) 254 : null 255 ); 256 } 257 258 /** 259 * @return string 260 */ 261 function getMimeType() { 262 if ( !isset( $this->mInfo['mime'] ) ) { 263 $magic = MimeMagic::singleton(); 264 $this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() ); 265 } 266 267 return $this->mInfo['mime']; 268 } 269 270 /** 271 * @return int|string 272 */ 273 function getMediaType() { 274 if ( isset( $this->mInfo['mediatype'] ) ) { 275 return $this->mInfo['mediatype']; 276 } 277 $magic = MimeMagic::singleton(); 278 279 return $magic->getMediaType( null, $this->getMimeType() ); 280 } 281 282 /** 283 * @return bool|string 284 */ 285 function getDescriptionUrl() { 286 return isset( $this->mInfo['descriptionurl'] ) 287 ? $this->mInfo['descriptionurl'] 288 : false; 289 } 290 291 /** 292 * Only useful if we're locally caching thumbs anyway... 293 * @param string $suffix 294 * @return null|string 295 */ 296 function getThumbPath( $suffix = '' ) { 297 if ( $this->repo->canCacheThumbs() ) { 298 $path = $this->repo->getZonePath( 'thumb' ) . '/' . $this->getHashPath( $this->getName() ); 299 if ( $suffix ) { 300 $path = $path . $suffix . '/'; 301 } 302 303 return $path; 304 } else { 305 return null; 306 } 307 } 308 309 /** 310 * @return array 311 */ 312 function getThumbnails() { 313 $dir = $this->getThumbPath( $this->getName() ); 314 $iter = $this->repo->getBackend()->getFileList( array( 'dir' => $dir ) ); 315 316 $files = array(); 317 foreach ( $iter as $file ) { 318 $files[] = $file; 319 } 320 321 return $files; 322 } 323 324 /** 325 * @see File::purgeCache() 326 */ 327 function purgeCache( $options = array() ) { 328 $this->purgeThumbnails( $options ); 329 $this->purgeDescriptionPage(); 330 } 331 332 function purgeDescriptionPage() { 333 global $wgMemc, $wgContLang; 334 335 $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() ); 336 $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) ); 337 338 $wgMemc->delete( $key ); 339 } 340 341 /** 342 * @param array $options 343 */ 344 function purgeThumbnails( $options = array() ) { 345 global $wgMemc; 346 347 $key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() ); 348 $wgMemc->delete( $key ); 349 350 $files = $this->getThumbnails(); 351 // Give media handler a chance to filter the purge list 352 $handler = $this->getHandler(); 353 if ( $handler ) { 354 $handler->filterThumbnailPurgeList( $files, $options ); 355 } 356 357 $dir = $this->getThumbPath( $this->getName() ); 358 $purgeList = array(); 359 foreach ( $files as $file ) { 360 $purgeList[] = "{$dir}{$file}"; 361 } 362 363 # Delete the thumbnails 364 $this->repo->quickPurgeBatch( $purgeList ); 365 # Clear out the thumbnail directory if empty 366 $this->repo->quickCleanDir( $dir ); 367 } 368 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |