2016-08-04 11:51:12 +02:00
|
|
|
<?php
|
|
|
|
class ShanaprojectBridge extends BridgeAbstract {
|
|
|
|
public function loadMetadatas() {
|
|
|
|
$this->maintainer = 'logmanoriginal';
|
2016-08-06 17:55:29 +02:00
|
|
|
$this->name = 'Shanaproject Bridge';
|
|
|
|
$this->uri = 'http://www.shanaproject.com';
|
2016-08-04 11:51:12 +02:00
|
|
|
$this->description = 'Returns a list of anime from the current Season Anime List';
|
2016-08-06 16:00:56 +02:00
|
|
|
$this->update = '2016-08-06';
|
2016-08-04 11:51:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Returns an html object for the Season Anime List (latest season)
|
2016-08-06 16:00:56 +02:00
|
|
|
private function LoadSeasonAnimeList(){
|
2016-08-04 11:51:12 +02:00
|
|
|
// First we need to find the URI to the latest season from the 'seasons' page searching for 'Season Anime List'
|
|
|
|
$html = $this->file_get_html($this->getURI() . '/seasons');
|
|
|
|
if(!$html)
|
|
|
|
$this->returnError('Could not load \'seasons\' page!', 404);
|
|
|
|
|
|
|
|
$season = $html->find('div.follows_menu/a', 1);
|
|
|
|
if(!$season)
|
|
|
|
$this->returnError('Could not find \'Season Anime List\'!', 404);
|
|
|
|
|
|
|
|
$html = $this->file_get_html($this->getURI() . $season->href);
|
|
|
|
if(!$html)
|
|
|
|
$this->returnError('Could not load \'Season Anime List\' from \'' . $season->innertext . '\'!');
|
|
|
|
|
|
|
|
return $html;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extracts the anime title
|
2016-08-06 16:00:56 +02:00
|
|
|
private function ExtractAnimeTitle($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
$title = $anime->find('a', 0);
|
|
|
|
if(!$title)
|
|
|
|
$this->returnError('Could not find anime title!', 404);
|
|
|
|
return trim($title->innertext);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extracts the anime URI
|
2016-08-06 16:00:56 +02:00
|
|
|
private function ExtractAnimeURI($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
$uri = $anime->find('a', 0);
|
|
|
|
if(!$uri)
|
|
|
|
$this->returnError('Could not find anime URI!', 404);
|
|
|
|
return $this->getURI() . $uri->href;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extracts the anime release date (timestamp)
|
2016-08-06 16:00:56 +02:00
|
|
|
private function ExtractAnimeTimestamp($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
$timestamp = $anime->find('span.header_info_block', 1);
|
|
|
|
if(!$timestamp)
|
|
|
|
$this->returnError('Could not find anime timestamp!', 404);
|
|
|
|
return strtotime($timestamp->innertext);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extracts the anime studio name (author)
|
2016-08-06 16:00:56 +02:00
|
|
|
private function ExtractAnimeAuthor($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
$author = $anime->find('span.header_info_block', 2);
|
|
|
|
if(!$author)
|
|
|
|
return; // Sometimes the studio is unknown, so leave empty
|
|
|
|
return trim($author->innertext);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extracts the episode information (x of y released)
|
2016-08-06 16:00:56 +02:00
|
|
|
private function ExtractAnimeEpisodeInformation($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
$episode = $anime->find('div.header_info_episode', 0);
|
|
|
|
if(!$episode)
|
|
|
|
$this->returnError('Could not find anime episode information!', 404);
|
|
|
|
return preg_replace('/\r|\n/', ' ', $episode->plaintext);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extracts the background image
|
2016-08-06 16:00:56 +02:00
|
|
|
private function ExtractAnimeBackgroundImage($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
// Getting the picture is a little bit tricky as it is part of the style.
|
|
|
|
// Luckily the style is part of the parent div :)
|
|
|
|
|
|
|
|
if(preg_match("/url\(\/\/([^\)]+)\)/i", $anime->parent->style, $matches))
|
|
|
|
return $matches[1];
|
|
|
|
|
|
|
|
$this->returnError('Could not extract background image!', 404);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Builds an URI to search for a specific anime (subber is left empty)
|
2016-08-06 16:00:56 +02:00
|
|
|
private function BuildAnimeSearchURI($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
return $this->getURI() . '/search/?title=' . urlencode($this->ExtractAnimeTitle($anime)) . '&subber=';
|
|
|
|
}
|
|
|
|
|
|
|
|
// Builds the content string for a given anime
|
2016-08-06 16:00:56 +02:00
|
|
|
private function BuildAnimeContent($anime){
|
2016-08-04 11:51:12 +02:00
|
|
|
// We'll use a template string to place our contents
|
|
|
|
return '<a href="' . $this->ExtractAnimeURI($anime) . '">
|
|
|
|
<img src="http://' . $this->ExtractAnimeBackgroundImage($anime) . '" alt="' . htmlspecialchars($this->ExtractAnimeTitle($anime)) . '" style="border: 1px solid black">
|
|
|
|
</a><br>
|
|
|
|
<p>' . $this->ExtractAnimeEpisodeInformation($anime) . '</p><br>
|
|
|
|
<p><a href="' . $this->BuildAnimeSearchURI($anime) . '">Search episodes</a></p>';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function collectData (array $param){
|
|
|
|
$html = $this->LoadSeasonAnimeList();
|
|
|
|
|
|
|
|
$animes = $html->find('div.header_display_box_info');
|
|
|
|
if(!$animes)
|
|
|
|
$this->returnError('Could not find anime headers!', 404);
|
|
|
|
|
|
|
|
foreach($animes as $anime){
|
|
|
|
$item = new \Item();
|
|
|
|
$item->title = $this->ExtractAnimeTitle($anime);
|
|
|
|
$item->author = $this->ExtractAnimeAuthor($anime);
|
|
|
|
$item->uri = $this->ExtractAnimeURI($anime);
|
|
|
|
$item->timestamp = $this->ExtractAnimeTimestamp($anime);
|
|
|
|
$item->content = $this->BuildAnimeContent($anime);
|
|
|
|
$this->items[] = $item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getName(){
|
2016-08-06 17:55:29 +02:00
|
|
|
return $this->name;
|
2016-08-04 11:51:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public function getURI(){
|
2016-08-06 17:55:29 +02:00
|
|
|
return $this->uri;
|
2016-08-04 11:51:12 +02:00
|
|
|
}
|
|
|
|
}
|