[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/filerepo/file/ -> ForeignAPIFile.php (source)

   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  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1