[ShanaprojectBridge] Add support for https and cleanup

This commit is contained in:
logmanoriginal 2019-07-02 20:45:31 +02:00
parent 73f4bc078e
commit 465cd8c768
1 changed files with 49 additions and 45 deletions

View File

@ -2,69 +2,90 @@
class ShanaprojectBridge extends BridgeAbstract { class ShanaprojectBridge extends BridgeAbstract {
const MAINTAINER = 'logmanoriginal'; const MAINTAINER = 'logmanoriginal';
const NAME = 'Shanaproject Bridge'; const NAME = 'Shanaproject Bridge';
const URI = 'http://www.shanaproject.com'; const URI = 'https://www.shanaproject.com';
const DESCRIPTION = 'Returns a list of anime from the current Season Anime List'; const DESCRIPTION = 'Returns a list of anime from the current Season Anime List';
public function collectData(){
$html = $this->loadSeasonAnimeList();
$animes = $html->find('div.header_display_box_info')
or returnServerError('Could not find anime headers!');
foreach($animes as $anime) {
$this->items[] = array(
'title' => $this->extractAnimeTitle($anime),
'author' => $this->extractAnimeTitle($anime),
'uri' => $this->extractAnimeUri($anime),
'timestamp' => $this->extractAnimeTimestamp($anime),
'content' => $this->buildAnimeContent($anime),
);
}
}
// Returns an html object for the Season Anime List (latest season) // Returns an html object for the Season Anime List (latest season)
private function loadSeasonAnimeList(){ private function loadSeasonAnimeList(){
// First we need to find the URI to the latest season from the
// 'seasons' page searching for 'Season Anime List'
$html = getSimpleHTMLDOM($this->getURI() . '/seasons');
if(!$html)
returnServerError('Could not load \'seasons\' page!');
$season = $html->find('div.follows_menu a', 1); $html = getSimpleHTMLDOM(self::URI . '/seasons')
if(!$season) or returnServerError('Could not load \'seasons\' page!');
returnServerError('Could not find \'Season Anime List\'!');
$html = getSimpleHTMLDOM($this->getURI() . $season->href); $html = defaultLinkTo($html, self::URI . '/seasons');
if(!$html)
returnServerError( $season = $html->find('div.follows_menu > a', 1)
or returnServerError('Could not find \'Season Anime List\'!');
$html = getSimpleHTMLDOM($season->href)
or returnServerError(
'Could not load \'Season Anime List\' from \'' 'Could not load \'Season Anime List\' from \''
. $season->innertext . $season->innertext
. '\'!' . '\'!'
); );
$html = defaultLinkTo($html, $season->href);
return $html; return $html;
} }
// Extracts the anime title // Extracts the anime title
private function extractAnimeTitle($anime){ private function extractAnimeTitle($anime){
$title = $anime->find('a', 0); $title = $anime->find('a', 0)
if(!$title) or returnServerError('Could not find anime title!');
returnServerError('Could not find anime title!');
return trim($title->innertext); return trim($title->innertext);
} }
// Extracts the anime URI // Extracts the anime URI
private function extractAnimeUri($anime){ private function extractAnimeUri($anime){
$uri = $anime->find('a', 0); $uri = $anime->find('a', 0)
if(!$uri) or returnServerError('Could not find anime URI!');
returnServerError('Could not find anime URI!'); return $uri->href;
return $this->getURI() . $uri->href;
} }
// Extracts the anime release date (timestamp) // Extracts the anime release date (timestamp)
private function extractAnimeTimestamp($anime){ private function extractAnimeTimestamp($anime){
$timestamp = $anime->find('span.header_info_block', 1); $timestamp = $anime->find('span.header_info_block', 1);
if(!$timestamp)
if(!$timestamp) {
return null; return null;
}
return strtotime($timestamp->innertext); return strtotime($timestamp->innertext);
} }
// Extracts the anime studio name (author) // Extracts the anime studio name (author)
private function extractAnimeAuthor($anime){ private function extractAnimeAuthor($anime){
$author = $anime->find('span.header_info_block', 2); $author = $anime->find('span.header_info_block', 2);
if(!$author)
return; // Sometimes the studio is unknown, so leave empty if(!$author) {
return null; // Sometimes the studio is unknown, so leave empty
}
return trim($author->innertext); return trim($author->innertext);
} }
// Extracts the episode information (x of y released) // Extracts the episode information (x of y released)
private function extractAnimeEpisodeInformation($anime){ private function extractAnimeEpisodeInformation($anime){
$episode = $anime->find('div.header_info_episode', 0); $episode = $anime->find('div.header_info_episode', 0)
if(!$episode) or returnServerError('Could not find anime episode information!');
returnServerError('Could not find anime episode information!');
return preg_replace('/\r|\n/', ' ', $episode->plaintext); return preg_replace('/\r|\n/', ' ', $episode->plaintext);
} }
@ -73,15 +94,16 @@ class ShanaprojectBridge extends BridgeAbstract {
// Getting the picture is a little bit tricky as it is part of the style. // Getting the picture is a little bit tricky as it is part of the style.
// Luckily the style is part of the parent div :) // Luckily the style is part of the parent div :)
if(preg_match('/url\(\/\/([^\)]+)\)/i', $anime->parent->style, $matches)) if(preg_match('/url\(\/\/([^\)]+)\)/i', $anime->parent->style, $matches)) {
return $matches[1]; return $matches[1];
}
returnServerError('Could not extract background image!'); returnServerError('Could not extract background image!');
} }
// Builds an URI to search for a specific anime (subber is left empty) // Builds an URI to search for a specific anime (subber is left empty)
private function buildAnimeSearchUri($anime){ private function buildAnimeSearchUri($anime){
return $this->getURI() return self::URI
. '/search/?title=' . '/search/?title='
. urlencode($this->extractAnimeTitle($anime)) . urlencode($this->extractAnimeTitle($anime))
. '&subber='; . '&subber=';
@ -102,22 +124,4 @@ class ShanaprojectBridge extends BridgeAbstract {
. $this->buildAnimeSearchUri($anime) . $this->buildAnimeSearchUri($anime)
. '">Search episodes</a></p>'; . '">Search episodes</a></p>';
} }
public function collectData(){
$html = $this->loadSeasonAnimeList();
$animes = $html->find('div.header_display_box_info');
if(!$animes)
returnServerError('Could not find anime headers!');
foreach($animes as $anime) {
$item = array();
$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;
}
}
} }