array(
'name' => 'News Feed',
'type' => 'list',
'title' => 'Feeds from Reuters U.S/International edition',
'values' => array(
'Aerospace and Defense' => 'aerospace',
'Business' => 'business',
'China' => 'china',
'Energy' => 'energy',
'Entertainment' => 'chan:8ym8q8dl',
'Environment' => 'chan:6u4f0jgs',
'Health' => 'chan:8hw7807a',
'Lifestyle' => 'life',
'Markets' => 'markets',
'Politics' => 'politics',
'Science' => 'science',
'Special Reports' => 'special-reports',
'Sports' => 'sports',
'Tech' => 'tech',
'Top News' => 'home/topnews',
'UK' => 'chan:61leiu7j',
'USA News' => 'us',
'Wire' => 'wire',
'World' => 'world',
)
)
)
);
/**
* Performs an HTTP request to the Reuters API and returns decoded JSON
* in the form of an associative array
* @param string $feed_uri Parameter string to the Reuters API
* @return array
*/
private function getJson($feed_uri)
{
$uri = "https://wireapi.reuters.com/v8$feed_uri";
$returned_data = getContents($uri);
return json_decode($returned_data, true);
}
/**
* Takes in data from Reuters Wire API and
* creates structured data in the form of a list
* of story information.
* @param array $data JSON collected from the Reuters Wire API
*/
private function processData($data)
{
/**
* Gets a list of wire items which are groups of templates
*/
$reuters_allowed_wireitems = array_filter(
$data, function ($wireitem) {
return in_array(
$wireitem['wireitem_type'],
self::ALLOWED_WIREITEM_TYPES
);
}
);
/*
* Gets a list of "Templates", which is data containing a story
*/
$reuters_wireitem_templates = array_reduce(
$reuters_allowed_wireitems,
function (array $carry, array $wireitem) {
$wireitem_templates = $wireitem['templates'];
return array_merge(
$carry,
array_filter(
$wireitem_templates, function (
array $template_data
) {
return in_array(
$template_data['type'],
self::ALLOWED_TEMPLATE_TYPES
);
}
)
);
},
array()
);
return $reuters_wireitem_templates;
}
private function getArticle($feed_uri)
{
// This will make another request to API to get full detail of article and author's name.
$rawData = $this->getJson($feed_uri);
$reuters_wireitems = $rawData['wireitems'];
$processedData = $this->processData($reuters_wireitems);
$first = reset($processedData);
$article_content = $first['story']['body_items'];
$authorlist = $first['story']['authors'];
$category = $first['story']['channel']['name'];
$image_list = $first['story']['images'];
$content_detail = array(
'content' => $this->handleArticleContent($article_content),
'author' => $this->handleAuthorName($authorlist),
'category' => $category,
'images' => $this->handleImage($image_list),
);
return $content_detail;
}
private function handleImage($images) {
$img_placeholder = '';
foreach($images as $image) { // Add more image to article.
$image_url = $image['url'];
$image_caption = $image['caption'];
$img = "";
$img_caption = "
$data
"; break; case 'heading': $description = $description . "'; foreach ($item_list as $item) { if($item['type'] == 'text') { $description = $description . $item['content']; } else { $description = $description . $item['symbol']; } } $description = $description . '
'; break; case 'p_table': $description = $description . $content['content']; break; } } return $description; } public function getName() { return $this->feedName; } public function collectData() { $reuters_feed_name = $this->getInput('feed'); if(strpos($reuters_feed_name, 'chan:') !== false) { // Now checking whether that feed has unique ID or not. $feed_uri = "/feed/rapp/us/wirefeed/$reuters_feed_name"; } else { $feed_uri = "/feed/rapp/us/tabbar/feeds/$reuters_feed_name"; } $data = $this->getJson($feed_uri); $reuters_wireitems = $data['wireitems']; $this->feedName = $data['wire_name'] . ' | Reuters'; $processedData = $this->processData($reuters_wireitems); // Merge all articles from Editor's Highlight section into existing array of templates. $top_section = reset($processedData); if ($top_section['type'] == 'headlines') { $top_section = array_shift($processedData); $articles = $top_section['headlines']; $processedData = array_merge($articles, $processedData); } foreach ($processedData as $story) { $item['uid'] = $story['story']['usn']; $article_uri = $story['template_action']['api_path']; $content_detail = $this->getArticle($article_uri); $description = $content_detail['content']; $author = $content_detail['author']; $images = $content_detail['images']; $item['categories'] = array($content_detail['category']); $item['author'] = $author; if (!(bool) $description) { $description = $story['story']['lede']; // Just in case the content doesn't have anything. } else { $item['content'] = "$description $images"; } $item['title'] = $story['story']['hed']; $item['timestamp'] = $story['story']['updated_at']; $item['uri'] = $story['template_action']['url']; $this->items[] = $item; } } }