From f8cb976e2cffc8a4f2413a7bed9a262acd85eedc Mon Sep 17 00:00:00 2001 From: logmanoriginal Date: Thu, 4 Aug 2016 11:51:12 +0200 Subject: [PATCH] Add bridge ShanaprojectBridge This bridge returns a list of anime from the current Season Anime List. Automatically switches to the next season upon release! --- bridges/ShanaprojectBridge.php | 124 +++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 bridges/ShanaprojectBridge.php diff --git a/bridges/ShanaprojectBridge.php b/bridges/ShanaprojectBridge.php new file mode 100644 index 00000000..64c33b6b --- /dev/null +++ b/bridges/ShanaprojectBridge.php @@ -0,0 +1,124 @@ +maintainer = 'logmanoriginal'; + $this->name = $this->getName(); + $this->uri = $this->getURI(); + $this->description = 'Returns a list of anime from the current Season Anime List'; + $this->update = '2016-08-04'; + } + + // Returns an html object for the Season Anime List (latest season) + function LoadSeasonAnimeList(){ + // 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 + function ExtractAnimeTitle($anime){ + $title = $anime->find('a', 0); + if(!$title) + $this->returnError('Could not find anime title!', 404); + return trim($title->innertext); + } + + // Extracts the anime URI + function ExtractAnimeURI($anime){ + $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) + function ExtractAnimeTimestamp($anime){ + $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) + function ExtractAnimeAuthor($anime){ + $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) + function ExtractAnimeEpisodeInformation($anime){ + $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 + function ExtractAnimeBackgroundImage($anime){ + // 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) + function BuildAnimeSearchURI($anime){ + return $this->getURI() . '/search/?title=' . urlencode($this->ExtractAnimeTitle($anime)) . '&subber='; + } + + // Builds the content string for a given anime + function BuildAnimeContent($anime){ + // We'll use a template string to place our contents + return ' + ' . htmlspecialchars($this->ExtractAnimeTitle($anime)) . ' +
+

' . $this->ExtractAnimeEpisodeInformation($anime) . '


+

Search episodes

'; + } + + 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(){ + return 'Shanaproject Bridge'; + } + + public function getURI(){ + return 'http://www.shanaproject.com'; + } + + public function getCacheDuration(){ + return 3600; // 1 hour + } +}