1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
<?php
/**
* A foreign repository with a remote MediaWiki with an API thingy
* Very hacky and inefficient
* do not use except for testing :D
*
* Example config:
*
* $wgForeignFileRepos[] = array(
* 'class' => 'ForeignAPIRepo',
* 'name' => 'shared',
* 'apibase' => 'http://en.wikipedia.org/w/api.php',
* 'fetchDescription' => true, // Optional
* 'descriptionCacheExpiry' => 3600,
* );
*
* @ingroup FileRepo
*/
class ForeignAPIRepo extends FileRepo {
var $fileFactory = array( 'ForeignAPIFile', 'newFromTitle' );
protected $mQueryCache = array();
function __construct( $info ) {
parent::__construct( $info );
$this->mApiBase = $info['apibase']; // http://commons.wikimedia.org/w/api.php
if( !$this->scriptDirUrl ) {
// hack for description fetches
$this->scriptDirUrl = dirname( $this->mApiBase );
}
}
function storeBatch( $triplets, $flags = 0 ) {
return false;
}
function storeTemp( $originalName, $srcPath ) {
return false;
}
function publishBatch( $triplets, $flags = 0 ) {
return false;
}
function deleteBatch( $sourceDestPairs ) {
return false;
}
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] ) ) {
return $info['imageinfo'][0];
}
}
}
return false;
}
protected function fetchImageQuery( $query ) {
global $wgMemc;
$url = $this->mApiBase .
'?' .
wfArrayToCgi(
array_merge( $query,
array(
'format' => 'json',
'action' => 'query',
'prop' => 'imageinfo' ) ) );
if( !isset( $this->mQueryCache[$url] ) ) {
$key = wfMemcKey( 'ForeignAPIRepo', $url );
$data = $wgMemc->get( $key );
if( !$data ) {
$data = Http::get( $url );
$wgMemc->set( $key, $data, 3600 );
}
if( count( $this->mQueryCache ) > 100 ) {
// Keep the cache from growing infinitely
$this->mQueryCache = array();
}
$this->mQueryCache[$url] = $data;
}
return json_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' ) );
}
function getThumbUrl( $name, $width=-1, $height=-1 ) {
$info = $this->queryImage( array(
'titles' => 'Image:' . $name,
'iiprop' => 'url',
'iiurlwidth' => $width,
'iiurlheight' => $height ) );
if( $info ) {
return $info['thumburl'];
} else {
return false;
}
}
}
|