132 lines
4.3 KiB
PHP
132 lines
4.3 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* RssBridgeTwitchApi
|
||
|
* Returns the newest broadcasts or highlights. Be aware that Twitch deletes broadcasts after
|
||
|
* 14 days: http://blog.twitch.tv/2014/08/important-reminder-past-broadcasts-removed-today/
|
||
|
*
|
||
|
* @name Twitch API Bridge
|
||
|
* @homepage https://www.twitch.tv
|
||
|
* @description Returns the newest broadcasts or highlights by channel name using the Twitch API (v3)
|
||
|
* @maintainer logmanoriginal
|
||
|
* @update 2015-07-14
|
||
|
* @use1(channel="Channel", broadcasts="true|false")
|
||
|
* @use2(channel="Channel", limit="Limit", broadcasts="true|false")
|
||
|
*
|
||
|
* Description for the API is available on GitHub: https://github.com/justintv/twitch-api
|
||
|
*/
|
||
|
|
||
|
define(TWITCH_LIMIT, 10); // The default limit
|
||
|
define(TWITCH_BROADCASTS, 'false'); // The default flag for broadcasts
|
||
|
|
||
|
class TwitchApiBridge extends BridgeAbstract{
|
||
|
|
||
|
// for use in the getName function!
|
||
|
private $channel;
|
||
|
|
||
|
public function collectData(array $param){
|
||
|
|
||
|
/* In accordance with API description:
|
||
|
* "When specifying a version for a request to the Twitch API, set the Accept HTTP header to the API version you prefer."
|
||
|
* Now we prefer v3 right now and need to build the context options. */
|
||
|
$opts = array('https' =>
|
||
|
array(
|
||
|
'method' => 'GET',
|
||
|
'header' => 'Accept: application/vnd.twitchtv.v3+json'
|
||
|
)
|
||
|
);
|
||
|
|
||
|
$context = stream_context_create($opts);
|
||
|
|
||
|
$channel = '';
|
||
|
$limit = TWITCH_LIMIT;
|
||
|
$broadcasts = TWITCH_BROADCASTS;
|
||
|
$requests = 1;
|
||
|
|
||
|
if(isset($param['channel'])) {
|
||
|
$channel = $param['channel'];
|
||
|
} else {
|
||
|
$this->returnError('You must specify a valid channel name! Received: &channel=' . $param['channel'], 400);
|
||
|
}
|
||
|
|
||
|
$this->channel = $channel;
|
||
|
|
||
|
if(isset($param['limit'])) {
|
||
|
try {
|
||
|
$limit = (int)$param['limit'];
|
||
|
} catch (Exception $e){
|
||
|
$this->returnError('The limit you specified is not valid! Received: &limit=' . $param['limit'] . ' Expected: &limit=<num> where <num> is any integer number.', 400);
|
||
|
}
|
||
|
} else {
|
||
|
$limit = TWITCH_LIMIT;
|
||
|
}
|
||
|
|
||
|
// The Twitch API allows a limit between 1 .. 100. Therefore any value below must be set to 1, any greater must result in multiple requests.
|
||
|
if($limit < 1) { $limit = 1; }
|
||
|
if($limit > 100) {
|
||
|
$requests = (int)($limit / 100);
|
||
|
if($limit % 100 != 0) { $requests++; }
|
||
|
}
|
||
|
|
||
|
if(isset($param['broadcasts']) && ($param['broadcasts'] == 'true' || $param['broadcasts'] == 'false')) {
|
||
|
$broadcasts = $param['broadcasts'];
|
||
|
} else {
|
||
|
$this->returnError('The value for broadcasts you specified is not valid! Received: &broadcasts=' . $param['broadcasts'] . ' Expected: &broadcasts=false or &broadcasts=true', 400);
|
||
|
}
|
||
|
|
||
|
// Build the initial request, see also: https://github.com/justintv/Twitch-API/blob/master/v3_resources/videos.md#get-channelschannelvideos
|
||
|
$request = '';
|
||
|
|
||
|
if($requests == 1) {
|
||
|
$request = 'https://api.twitch.tv/kraken/channels/' . $channel . '/videos?limit=' . $limit . '&broadcasts=' . $broadcasts;
|
||
|
} else {
|
||
|
$request = 'https://api.twitch.tv/kraken/channels/' . $channel . '/videos?limit=100&broadcasts=' . $broadcasts;
|
||
|
}
|
||
|
|
||
|
/* Finally we're ready to request data from the API. Each response provides information for the next request. */
|
||
|
for($i = 0; $i < $requests; $i++) {
|
||
|
$response = file_get_contents($request, false, $context);
|
||
|
|
||
|
if($response == false) {
|
||
|
$this->returnError('Request failed! Check if the channel name is valid!', 400);
|
||
|
}
|
||
|
|
||
|
$data = json_decode($response);
|
||
|
|
||
|
foreach($data->videos as $video) {
|
||
|
$item = new \Item();
|
||
|
$item->id = $video->_id;
|
||
|
$item->uri = $video->url;
|
||
|
$item->thumbnailUri = $video->preview;
|
||
|
$item->title = htmlspecialchars($video->title);
|
||
|
$item->timestamp = strtotime($video->recorded_at);
|
||
|
$item->content = '<a href="' . $item->uri . '"><img src="' . $item->thumbnailUri . '" /></a><br><a href="' . $item->uri . '">' . $item->title . '</a>';
|
||
|
$this->items[] = $item;
|
||
|
|
||
|
// Stop once the number of requested items is reached
|
||
|
if(count($this->items) >= $limit) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Get next request (if available)
|
||
|
if(isset($data->_links->next)) {
|
||
|
$request = $data->_links->next;
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function getName(){
|
||
|
return (!empty($this->channel) ? $this->channel . ' - ' : '') . 'Twitch API Bridge';
|
||
|
}
|
||
|
|
||
|
public function getURI(){
|
||
|
return 'https://www.twitch.tv';
|
||
|
}
|
||
|
|
||
|
public function getCacheDuration(){
|
||
|
return 10800; // 3 hours
|
||
|
}
|
||
|
}
|
||
|
?>
|