X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Ffilerepo%2FForeignAPIRepo.php;h=da920e0836c2e6fd0d688efc4bdab88a0f3ec2d5;hb=20206755ee7a0ca3668d7d9b7582cd3414c353a6;hp=bd53686d120bb93cec9646baf1349e915daafe00;hpb=3f563718c7dee056ecbc1a683a340f213416fd71;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php index bd53686d12..da920e0836 100644 --- a/includes/filerepo/ForeignAPIRepo.php +++ b/includes/filerepo/ForeignAPIRepo.php @@ -19,38 +19,93 @@ */ class ForeignAPIRepo extends FileRepo { var $fileFactory = array( 'ForeignAPIFile', 'newFromTitle' ); - var $apiThumbCacheExpiry = 0; + var $apiThumbCacheExpiry = 86400; protected $mQueryCache = array(); - + protected $mFileExists = array(); + function __construct( $info ) { parent::__construct( $info ); $this->mApiBase = $info['apibase']; // http://commons.wikimedia.org/w/api.php + if( isset( $info['apiThumbCacheExpiry'] ) ) { + $this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry']; + } if( !$this->scriptDirUrl ) { // hack for description fetches $this->scriptDirUrl = dirname( $this->mApiBase ); } + // If we can cache thumbs we can guess sane defaults for these + if( $this->canCacheThumbs() && !$this->url ) { + global $wgLocalFileRepo; + $this->url = $wgLocalFileRepo['url']; + } + if( $this->canCacheThumbs() && !$this->thumbUrl ) { + $this->thumbUrl = $this->url . '/thumb'; + } + } + + /** + * Per docs in FileRepo, this needs to return false if we don't support versioned + * files. Well, we don't. + */ + function newFile( $title, $time = false ) { + if ( $time ) { + return false; + } + return parent::newFile( $title, $time ); } +/** + * No-ops + */ function storeBatch( $triplets, $flags = 0 ) { return false; } - function storeTemp( $originalName, $srcPath ) { return false; } + function append( $srcPath, $toAppendPath ){ + return false; + } function publishBatch( $triplets, $flags = 0 ) { return false; } function deleteBatch( $sourceDestPairs ) { return false; } + + + function fileExistsBatch( $files, $flags = 0 ) { + $results = array(); + foreach ( $files as $k => $f ) { + if ( isset( $this->mFileExists[$k] ) ) { + $results[$k] = true; + unset( $files[$k] ); + } elseif( self::isVirtualUrl( $f ) ) { + # TODO! FIXME! We need to be able to handle virtual + # URLs better, at least when we know they refer to the + # same repo. + $results[$k] = false; + unset( $files[$k] ); + } + } + + $results = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ), + 'prop' => 'imageinfo' ) ); + if( isset( $data['query']['pages'] ) ) { + $i = 0; + foreach( $files as $key => $file ) { + $results[$key] = $this->mFileExists[$key] = !isset( $data['query']['pages'][$i]['missing'] ); + $i++; + } + } + } function getFileProps( $virtualUrl ) { return false; } - + protected function queryImage( $query ) { $data = $this->fetchImageQuery( $query ); - + if( isset( $data['query']['pages'] ) ) { foreach( $data['query']['pages'] as $pageid => $info ) { if( isset( $info['imageinfo'][0] ) ) { @@ -60,24 +115,26 @@ class ForeignAPIRepo extends FileRepo { } return false; } - + protected function fetchImageQuery( $query ) { global $wgMemc; - + $url = $this->mApiBase . '?' . wfArrayToCgi( array_merge( $query, array( 'format' => 'json', - 'action' => 'query', - 'prop' => 'imageinfo' ) ) ); - + 'action' => 'query' ) ) ); + if( !isset( $this->mQueryCache[$url] ) ) { - $key = wfMemcKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) ); + $key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) ); $data = $wgMemc->get( $key ); if( !$data ) { $data = Http::get( $url ); + if ( !$data ) { + return null; + } $wgMemc->set( $key, $data, 3600 ); } @@ -87,21 +144,37 @@ class ForeignAPIRepo extends FileRepo { } $this->mQueryCache[$url] = $data; } - return json_decode( $this->mQueryCache[$url], true ); + return FormatJson::decode( $this->mQueryCache[$url], true ); } - + function getImageInfo( $title, $time = false ) { return $this->queryImage( array( 'titles' => 'Image:' . $title->getText(), - 'iiprop' => 'timestamp|user|comment|url|size|sha1|metadata|mime' ) ); + 'iiprop' => 'timestamp|user|comment|url|size|sha1|metadata|mime', + 'prop' => 'imageinfo' ) ); } - + + function findBySha1( $hash ) { + $results = $this->fetchImageQuery( array( + 'aisha1base36' => $hash, + 'aiprop' => 'timestamp|user|comment|url|size|sha1|metadata|mime', + 'list' => 'allimages', ) ); + $ret = array(); + if ( isset( $results['query']['allimages'] ) ) { + foreach ( $results['query']['allimages'] as $img ) { + $ret[] = new ForeignAPIFile( Title::makeTitle( NS_FILE, $img['name'] ), $this, $img ); + } + } + return $ret; + } + function getThumbUrl( $name, $width=-1, $height=-1 ) { $info = $this->queryImage( array( 'titles' => 'Image:' . $name, 'iiprop' => 'url', 'iiurlwidth' => $width, - 'iiurlheight' => $height ) ); + 'iiurlheight' => $height, + 'prop' => 'imageinfo' ) ); if( $info ) { wfDebug( __METHOD__ . " got remote thumb " . $info['thumburl'] . "\n" ); return $info['thumburl']; @@ -109,30 +182,60 @@ class ForeignAPIRepo extends FileRepo { return false; } } - + function getThumbUrlFromCache( $name, $width, $height ) { global $wgMemc, $wgUploadPath, $wgServer, $wgUploadDirectory; -; - - $key = wfMemcKey( 'ForeignAPIRepo', 'ThumbUrl', $name ); + + if ( !$this->canCacheThumbs() ) { + return $this->getThumbUrl( $name, $width, $height ); + } + + $key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $name ); if ( $thumbUrl = $wgMemc->get($key) ) { wfDebug("Got thumb from local cache. $thumbUrl \n"); return $thumbUrl; } else { $foreignUrl = $this->getThumbUrl( $name, $width, $height ); - $path = $this->apiThumbCacheDir . '/' . $this->name . '/' . - $name . '/'; + + // We need the same filename as the remote one :) + $fileName = rawurldecode( pathinfo( $foreignUrl, PATHINFO_BASENAME ) ); + $path = 'thumb/' . $this->getHashPath( $name ) . $name . "/"; if ( !is_dir($wgUploadDirectory . '/' . $path) ) { wfMkdirParents($wgUploadDirectory . '/' . $path); } - $localUrl = $wgServer . $wgUploadPath . '/' . $path . $width . 'px-' . $name; + $localUrl = $wgServer . $wgUploadPath . '/' . $path . $fileName; $thumb = Http::get( $foreignUrl ); # FIXME: Delete old thumbs that aren't being used. Maintenance script? - file_put_contents($wgUploadDirectory . '/' . $path . $width . 'px-' . $name, $thumb ); + if( !file_put_contents($wgUploadDirectory . '/' . $path . $fileName, $thumb ) ) { + wfDebug( __METHOD__ . " could not write to thumb path\n" ); + return $foreignUrl; + } $wgMemc->set( $key, $localUrl, $this->apiThumbCacheExpiry ); wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" ); return $localUrl; } } + + /** + * @see FileRepo::getZoneUrl() + */ + function getZoneUrl( $zone ) { + switch ( $zone ) { + case 'public': + return $this->url; + case 'thumb': + return $this->thumbUrl; + default: + return parent::getZoneUrl( $zone ); + } + } + + /** + * Are we locally caching the thumbnails? + * @return bool + */ + public function canCacheThumbs() { + return ( $this->apiThumbCacheExpiry > 0 ); + } }