MediaWiki  1.34.0
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 }
File\getExtension
getExtension()
Get the file extension, e.g.
Definition: File.php:321
ForeignAPIFile\getMimeType
getMimeType()
Definition: ForeignAPIFile.php:284
Title\newFromText
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:316
File\$repo
FileRepo LocalRepo ForeignAPIRepo bool $repo
Some member variables can be lazy-initialised using __get().
Definition: File.php:106
MediaWiki\MediaWikiServices
MediaWikiServices is the service locator for the application scope of MediaWiki.
Definition: MediaWikiServices.php:117
ForeignAPIFile\getThumbPath
getThumbPath( $suffix='')
Only useful if we're locally caching thumbs anyway...
Definition: ForeignAPIFile.php:317
MediaHandler\getMetadataVersion
static getMetadataVersion()
Get metadata version.
Definition: MediaHandler.php:141
MediaHandler\filterThumbnailPurgeList
filterThumbnailPurgeList(&$files, $options)
Remove files from the purge list.
Definition: MediaHandler.php:711
true
return true
Definition: router.php:92
ForeignAPIFile\newFromTitle
static newFromTitle(Title $title, $repo)
Definition: ForeignAPIFile.php:60
wfTimestamp
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Definition: GlobalFunctions.php:1869
ForeignAPIFile\exists
exists()
Definition: ForeignAPIFile.php:105
$file
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
Definition: router.php:42
ForeignAPIFile\isTransformedLocally
isTransformedLocally()
The thumbnail is created on the foreign server and fetched over internet.
Definition: ForeignAPIFile.php:391
serialize
serialize()
Definition: ApiMessageTrait.php:138
ForeignAPIFile\getUser
getUser( $type='text')
Definition: ForeignAPIFile.php:244
ForeignAPIFile\getMetadata
getMetadata()
Definition: ForeignAPIFile.php:175
File\$path
string $path
The storage path corresponding to one of the zones.
Definition: File.php:136
MediaWiki\MediaWikiServices\getInstance
static getInstance()
Returns the global default instance of the top level service locator.
Definition: MediaWikiServices.php:138
ForeignAPIFile\$mInfo
array $mInfo
Definition: ForeignAPIFile.php:36
ForeignAPIFile\getExtendedMetadata
getExtendedMetadata()
Definition: ForeignAPIFile.php:187
File
Implements some public methods and some protected utility functions which are required by multiple ch...
Definition: File.php:61
Title\getDBkey
getDBkey()
Get the main part with underscores.
Definition: Title.php:1013
ForeignAPIFile\purgeCache
purgeCache( $options=[])
Purge shared caches such as thumbnails and DB data caching STUB Overridden by LocalFile.
Definition: ForeignAPIFile.php:346
File\$url
string $url
The URL corresponding to one of the four basic zones.
Definition: File.php:127
ForeignAPIFile\getThumbnails
getThumbnails()
Definition: ForeignAPIFile.php:332
ForeignAPIFile\getDescriptionShortUrl
getDescriptionShortUrl()
Get short description URL for a file based on the foreign API response, or if unavailable,...
Definition: ForeignAPIFile.php:228
$wgLang
$wgLang
Definition: Setup.php:881
ForeignAPIFile\__construct
__construct( $title, $repo, $info, $exists=false)
Definition: ForeignAPIFile.php:46
ForeignAPIFile\getWidth
getWidth( $page=1)
Definition: ForeignAPIFile.php:160
ForeignAPIFile\getUrl
getUrl()
Definition: ForeignAPIFile.php:217
ForeignAPIFile\getDescriptionUrl
getDescriptionUrl()
Definition: ForeignAPIFile.php:308
ForeignAPIFile\getSize
getSize()
Definition: ForeignAPIFile.php:210
ForeignAPIFile\getDescription
getDescription( $audience=self::FOR_PUBLIC, User $user=null)
Definition: ForeignAPIFile.php:257
File\canRender
canRender()
Checks if the output of transform() for this file is likely to be valid.
Definition: File.php:758
ForeignAPIFile\getPath
getPath()
Definition: ForeignAPIFile.php:112
ForeignAPIFile\getTimestamp
getTimestamp()
Definition: ForeignAPIFile.php:273
File\$handler
MediaHandler $handler
Definition: File.php:124
File\$title
Title string bool $title
Definition: File.php:109
ForeignAPIFile\getMediaType
getMediaType()
Definition: ForeignAPIFile.php:296
ForeignAPIFile\getHeight
getHeight( $page=1)
Definition: ForeignAPIFile.php:168
File\getName
getName()
Return the name of this file.
Definition: File.php:307
ForeignAPIFile\transform
transform( $params, $flags=0)
Definition: ForeignAPIFile.php:121
ForeignAPIFile\purgeThumbnails
purgeThumbnails( $options=[])
Definition: ForeignAPIFile.php:363
Title
Represents a title within MediaWiki.
Definition: Title.php:42
File\assertRepoDefined
assertRepoDefined()
Assert that $this->repo is set to a valid FileRepo instance.
Definition: File.php:2284
ForeignAPIFile\getSha1
getSha1()
Definition: ForeignAPIFile.php:264
ForeignAPIFile\parseMetadata
static parseMetadata( $metadata)
Definition: ForeignAPIFile.php:195
ForeignAPIFile\getProps
static getProps()
Get the property string for iiprop and aiprop.
Definition: ForeignAPIFile.php:96
ForeignAPIFile\purgeDescriptionPage
purgeDescriptionPage()
Definition: ForeignAPIFile.php:351
File\getHandler
getHandler()
Get a MediaHandler instance for this file.
Definition: File.php:1390
ForeignAPIFile
Foreign file accessible through api.php requests.
Definition: ForeignAPIFile.php:32
ForeignAPIFile\$repoClass
$repoClass
Definition: ForeignAPIFile.php:38
User
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition: User.php:51
ForeignAPIFile\$mExists
bool $mExists
Definition: ForeignAPIFile.php:34
File\getHashPath
getHashPath()
Get the filename hash component of the directory including trailing slash, e.g.
Definition: File.php:1526
$type
$type
Definition: testCompression.php:48