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 '
+
+
+
' . $this->ExtractAnimeEpisodeInformation($anime) . '