3 * Foreign file accessible through api.php requests.
10 * Foreign file accessible through api.php requests.
11 * Very hacky and inefficient, do not use :D
15 class ForeignAPIFile extends File {
19 function __construct( $title, $repo, $info, $exists = false ) {
20 parent::__construct( $title, $repo );
22 $this->mExists = $exists;
28 * @param $repo ForeignApiRepo
29 * @return ForeignAPIFile|null
31 static function newFromTitle( $title, $repo ) {
32 $data = $repo->fetchImageQuery( array(
33 'titles' => 'File:' . $title->getDBKey(),
34 'iiprop' => self::getProps(),
35 'prop' => 'imageinfo' ) );
37 $info = $repo->getImageInfo( $data );
40 $lastRedirect = isset( $data['query']['redirects'] )
41 ? count( $data['query']['redirects'] ) - 1
43 if( $lastRedirect >= 0 ) {
44 $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to']);
45 $img = new ForeignAPIFile( $newtitle, $repo, $info, true );
47 $img->redirectedFrom( $title->getDBkey() );
50 $img = new ForeignAPIFile( $title, $repo, $info, true );
59 * Get the property string for iiprop and aiprop
61 static function getProps() {
62 return 'timestamp|user|comment|url|size|sha1|metadata|mime';
66 public function exists() {
67 return $this->mExists;
70 public function getPath() {
74 function transform( $params, $flags = 0 ) {
75 if( !$this->canRender() ) {
77 return parent::transform( $params, $flags );
79 $thumbUrl = $this->repo->getThumbUrlFromCache(
81 isset( $params['width'] ) ? $params['width'] : -1,
82 isset( $params['height'] ) ? $params['height'] : -1 );
83 return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );
86 // Info we can get from API...
87 public function getWidth( $page = 1 ) {
88 return intval( @$this->mInfo['width'] );
91 public function getHeight( $page = 1 ) {
92 return intval( @$this->mInfo['height'] );
95 public function getMetadata() {
96 if ( isset( $this->mInfo['metadata'] ) ) {
97 return serialize( self::parseMetadata( $this->mInfo['metadata'] ) );
102 public static function parseMetadata( $metadata ) {
103 if( !is_array( $metadata ) ) {
107 foreach( $metadata as $meta ) {
108 $ret[ $meta['name'] ] = self::parseMetadata( $meta['value'] );
113 public function getSize() {
114 return isset( $this->mInfo['size'] ) ? intval( $this->mInfo['size'] ) : null;
117 public function getUrl() {
118 return isset( $this->mInfo['url'] ) ? strval( $this->mInfo['url'] ) : null;
121 public function getUser( $method='text' ) {
122 return isset( $this->mInfo['user'] ) ? strval( $this->mInfo['user'] ) : null;
125 public function getDescription() {
126 return isset( $this->mInfo['comment'] ) ? strval( $this->mInfo['comment'] ) : null;
130 return isset( $this->mInfo['sha1'] ) ?
131 wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 ) :
135 function getTimestamp() {
136 return wfTimestamp( TS_MW,
137 isset( $this->mInfo['timestamp'] ) ?
138 strval( $this->mInfo['timestamp'] ) :
143 function getMimeType() {
144 if( !isset( $this->mInfo['mime'] ) ) {
145 $magic = MimeMagic::singleton();
146 $this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() );
148 return $this->mInfo['mime'];
151 /// @todo Fixme: may guess wrong on file types that can be eg audio or video
152 function getMediaType() {
153 $magic = MimeMagic::singleton();
154 return $magic->getMediaType( null, $this->getMimeType() );
157 function getDescriptionUrl() {
158 return isset( $this->mInfo['descriptionurl'] )
159 ? $this->mInfo['descriptionurl']
164 * Only useful if we're locally caching thumbs anyway...
166 function getThumbPath( $suffix = '' ) {
167 if ( $this->repo->canCacheThumbs() ) {
168 $path = $this->repo->getZonePath('thumb') . '/' . $this->getHashPath( $this->getName() );
170 $path = $path . $suffix . '/';
178 function getThumbnails() {
180 $dir = $this->getThumbPath( $this->getName() );
181 if ( is_dir( $dir ) ) {
182 $handle = opendir( $dir );
184 while ( false !== ( $file = readdir($handle) ) ) {
185 if ( $file{0} != '.' ) {
195 function purgeCache() {
196 $this->purgeThumbnails();
197 $this->purgeDescriptionPage();
200 function purgeDescriptionPage() {
201 global $wgMemc, $wgContLang;
202 $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
203 $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5($url) );
204 $wgMemc->delete( $key );
207 function purgeThumbnails() {
209 $key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() );
210 $wgMemc->delete( $key );
211 $files = $this->getThumbnails();
212 $dir = $this->getThumbPath( $this->getName() );
213 foreach ( $files as $file ) {
214 unlink( $dir . $file );
216 if ( is_dir( $dir ) ) {
217 rmdir( $dir ); // Might have already gone away, spews errors if we don't.