MediaWiki  master
ForeignAPIFile.php
Go to the documentation of this file.
1 <?php
25 
32 class ForeignAPIFile extends File {
34  private $mExists;
36  private $mInfo = [];
37 
38  protected $repoClass = ForeignAPIRepo::class;
39 
46  function __construct( $title, $repo, $info, $exists = false ) {
47  parent::__construct( $title, $repo );
48 
49  $this->mInfo = $info;
50  $this->mExists = $exists;
51 
52  $this->assertRepoDefined();
53  }
54 
60  static function newFromTitle( Title $title, $repo ) {
61  $data = $repo->fetchImageQuery( [
62  'titles' => 'File:' . $title->getDBkey(),
63  'iiprop' => self::getProps(),
64  'prop' => 'imageinfo',
65  'iimetadataversion' => MediaHandler::getMetadataVersion(),
66  // extmetadata is language-dependant, accessing the current language here
67  // would be problematic, so we just get them all
68  'iiextmetadatamultilang' => 1,
69  ] );
70 
71  $info = $repo->getImageInfo( $data );
72 
73  if ( $info ) {
74  $lastRedirect = isset( $data['query']['redirects'] )
75  ? count( $data['query']['redirects'] ) - 1
76  : -1;
77  if ( $lastRedirect >= 0 ) {
78  // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
79  $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] );
80  $img = new self( $newtitle, $repo, $info, true );
81  $img->redirectedFrom( $title->getDBkey() );
82  } else {
83  $img = new self( $title, $repo, $info, true );
84  }
85 
86  return $img;
87  } else {
88  return null;
89  }
90  }
91 
96  static function getProps() {
97  return 'timestamp|user|comment|url|size|sha1|metadata|mime|mediatype|extmetadata';
98  }
99 
100  // Dummy functions...
101 
105  public function exists() {
106  return $this->mExists;
107  }
108 
112  public function getPath() {
113  return false;
114  }
115 
121  function transform( $params, $flags = 0 ) {
122  if ( !$this->canRender() ) {
123  // show icon
124  return parent::transform( $params, $flags );
125  }
126 
127  // Note, the this->canRender() check above implies
128  // that we have a handler, and it can do makeParamString.
129  $otherParams = $this->handler->makeParamString( $params );
130  $width = $params['width'] ?? -1;
131  $height = $params['height'] ?? -1;
132 
133  $thumbUrl = $this->repo->getThumbUrlFromCache(
134  $this->getName(),
135  $width,
136  $height,
137  $otherParams
138  );
139  if ( $thumbUrl === false ) {
140  global $wgLang;
141 
142  return $this->repo->getThumbError(
143  $this->getName(),
144  $width,
145  $height,
146  $otherParams,
147  $wgLang->getCode()
148  );
149  }
150 
151  return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );
152  }
153 
154  // Info we can get from API...
155 
160  public function getWidth( $page = 1 ) {
161  return isset( $this->mInfo['width'] ) ? intval( $this->mInfo['width'] ) : 0;
162  }
163 
168  public function getHeight( $page = 1 ) {
169  return isset( $this->mInfo['height'] ) ? intval( $this->mInfo['height'] ) : 0;
170  }
171 
175  public function getMetadata() {
176  if ( isset( $this->mInfo['metadata'] ) ) {
177  return serialize( self::parseMetadata( $this->mInfo['metadata'] ) );
178  }
179 
180  return null;
181  }
182 
187  public function getExtendedMetadata() {
188  return $this->mInfo['extmetadata'] ?? null;
189  }
190 
195  public static function parseMetadata( $metadata ) {
196  if ( !is_array( $metadata ) ) {
197  return $metadata;
198  }
199  $ret = [];
200  foreach ( $metadata as $meta ) {
201  $ret[$meta['name']] = self::parseMetadata( $meta['value'] );
202  }
203 
204  return $ret;
205  }
206 
210  public function getSize() {
211  return isset( $this->mInfo['size'] ) ? intval( $this->mInfo['size'] ) : null;
212  }
213 
217  public function getUrl() {
218  return isset( $this->mInfo['url'] ) ? strval( $this->mInfo['url'] ) : null;
219  }
220 
228  public function getDescriptionShortUrl() {
229  if ( isset( $this->mInfo['descriptionshorturl'] ) ) {
230  return $this->mInfo['descriptionshorturl'];
231  } elseif ( isset( $this->mInfo['pageid'] ) ) {
232  $url = $this->repo->makeUrl( [ 'curid' => $this->mInfo['pageid'] ] );
233  if ( $url !== false ) {
234  return $url;
235  }
236  }
237  return null;
238  }
239 
244  public function getUser( $type = 'text' ) {
245  if ( $type == 'text' ) {
246  return isset( $this->mInfo['user'] ) ? strval( $this->mInfo['user'] ) : null;
247  } else {
248  return 0; // What makes sense here, for a remote user?
249  }
250  }
251 
257  public function getDescription( $audience = self::FOR_PUBLIC, User $user = null ) {
258  return isset( $this->mInfo['comment'] ) ? strval( $this->mInfo['comment'] ) : null;
259  }
260 
264  function getSha1() {
265  return isset( $this->mInfo['sha1'] )
266  ? Wikimedia\base_convert( strval( $this->mInfo['sha1'] ), 16, 36, 31 )
267  : null;
268  }
269 
273  function getTimestamp() {
274  return wfTimestamp( TS_MW,
275  isset( $this->mInfo['timestamp'] )
276  ? strval( $this->mInfo['timestamp'] )
277  : null
278  );
279  }
280 
284  function getMimeType() {
285  if ( !isset( $this->mInfo['mime'] ) ) {
286  $magic = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer();
287  $this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() );
288  }
289 
290  return $this->mInfo['mime'];
291  }
292 
296  function getMediaType() {
297  if ( isset( $this->mInfo['mediatype'] ) ) {
298  return $this->mInfo['mediatype'];
299  }
300  $magic = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer();
301 
302  return $magic->getMediaType( null, $this->getMimeType() );
303  }
304 
308  function getDescriptionUrl() {
309  return $this->mInfo['descriptionurl'] ?? false;
310  }
311 
317  function getThumbPath( $suffix = '' ) {
318  if ( !$this->repo->canCacheThumbs() ) {
319  return null;
320  }
321 
322  $path = $this->repo->getZonePath( 'thumb' ) . '/' . $this->getHashPath();
323  if ( $suffix ) {
324  $path .= $suffix . '/';
325  }
326  return $path;
327  }
328 
332  function getThumbnails() {
333  $dir = $this->getThumbPath( $this->getName() );
334  $iter = $this->repo->getBackend()->getFileList( [ 'dir' => $dir ] );
335 
336  $files = [];
337  if ( $iter ) {
338  foreach ( $iter as $file ) {
339  $files[] = $file;
340  }
341  }
342 
343  return $files;
344  }
345 
346  function purgeCache( $options = [] ) {
347  $this->purgeThumbnails( $options );
348  $this->purgeDescriptionPage();
349  }
350 
351  function purgeDescriptionPage() {
352  $services = MediaWikiServices::getInstance();
353  $url = $this->repo->getDescriptionRenderUrl(
354  $this->getName(), $services->getContentLanguage()->getCode() );
355  $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
356 
357  $services->getMainWANObjectCache()->delete( $key );
358  }
359 
363  function purgeThumbnails( $options = [] ) {
364  $key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() );
365  MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
366 
367  $files = $this->getThumbnails();
368  // Give media handler a chance to filter the purge list
369  $handler = $this->getHandler();
370  if ( $handler ) {
371  $handler->filterThumbnailPurgeList( $files, $options );
372  }
373 
374  $dir = $this->getThumbPath( $this->getName() );
375  $purgeList = [];
376  foreach ( $files as $file ) {
377  $purgeList[] = "{$dir}{$file}";
378  }
379 
380  # Delete the thumbnails
381  $this->repo->quickPurgeBatch( $purgeList );
382  # Clear out the thumbnail directory if empty
383  $this->repo->quickCleanDir( $dir );
384  }
385 
391  public function isTransformedLocally() {
392  return false;
393  }
394 }
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
Definition: router.php:42
purgeThumbnails( $options=[])
MediaHandler $handler
Definition: File.php:124
getDescription( $audience=self::FOR_PUBLIC, User $user=null)
serialize()
static getMetadataVersion()
Get metadata version.
getDescriptionShortUrl()
Get short description URL for a file based on the foreign API response, or if unavailable, the short URL is constructed from the foreign page ID.
canRender()
Checks if the output of transform() for this file is likely to be valid.
Definition: File.php:758
assertRepoDefined()
Assert that $this->repo is set to a valid FileRepo instance.
Definition: File.php:2284
getName()
Return the name of this file.
Definition: File.php:307
static getInstance()
Returns the global default instance of the top level service locator.
Title string bool $title
Definition: File.php:109
getHashPath()
Get the filename hash component of the directory including trailing slash, e.g.
Definition: File.php:1526
getHeight( $page=1)
The User object encapsulates all of the user-specific settings (user_id, name, rights, email address, options, last login time).
Definition: User.php:51
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Foreign file accessible through api.php requests.
static parseMetadata( $metadata)
$wgLang
Definition: Setup.php:857
getThumbPath( $suffix='')
Only useful if we&#39;re locally caching thumbs anyway...
getDBkey()
Get the main part with underscores.
Definition: Title.php:1016
isTransformedLocally()
The thumbnail is created on the foreign server and fetched over internet.
getHandler()
Get a MediaHandler instance for this file.
Definition: File.php:1390
static newFromTitle(Title $title, $repo)
static getProps()
Get the property string for iiprop and aiprop.
getUser( $type='text')
getWidth( $page=1)
getExtension()
Get the file extension, e.g.
Definition: File.php:321
purgeCache( $options=[])
FileRepo LocalRepo ForeignAPIRepo bool $repo
Some member variables can be lazy-initialised using __get().
Definition: File.php:106
string $url
The URL corresponding to one of the four basic zones.
Definition: File.php:127
filterThumbnailPurgeList(&$files, $options)
Remove files from the purge list.
__construct( $title, $repo, $info, $exists=false)
string $path
The storage path corresponding to one of the zones.
Definition: File.php:136
Implements some public methods and some protected utility functions which are required by multiple ch...
Definition: File.php:61
transform( $params, $flags=0)
return true
Definition: router.php:92
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:319