From 64b7c54bc8ebd0a2354bb34fa617547c66291967 Mon Sep 17 00:00:00 2001 From: KamaleiZestri <38802353+KamaleiZestri@users.noreply.github.com> Date: Sun, 3 Oct 2021 15:35:31 -0500 Subject: [PATCH] [BakaUpdatesMangaReleasesBridge] Added option to display releases based on a user list (#2276) * [BakaUpdatesMangaReleasesBridge] Added option to display releases based on a user list --- bridges/BakaUpdatesMangaReleasesBridge.php | 149 ++++++++++++++++----- 1 file changed, 116 insertions(+), 33 deletions(-) diff --git a/bridges/BakaUpdatesMangaReleasesBridge.php b/bridges/BakaUpdatesMangaReleasesBridge.php index 27eca280..5a4db58b 100644 --- a/bridges/BakaUpdatesMangaReleasesBridge.php +++ b/bridges/BakaUpdatesMangaReleasesBridge.php @@ -3,23 +3,80 @@ class BakaUpdatesMangaReleasesBridge extends BridgeAbstract { const NAME = 'Baka Updates Manga Releases'; const URI = 'https://www.mangaupdates.com/'; const DESCRIPTION = 'Get the latest series releases'; - const MAINTAINER = 'fulmeek'; - const PARAMETERS = array(array( - 'series_id' => array( - 'name' => 'Series ID', - 'type' => 'number', - 'required' => true, - 'exampleValue' => '12345' + const MAINTAINER = 'fulmeek, KamaleiZestri'; + const PARAMETERS = array( + 'By series' => array( + 'series_id' => array( + 'name' => 'Series ID', + 'type' => 'number', + 'required' => true, + 'exampleValue' => '12345' + ) + ), + 'By list' => array( + 'list_id' => array( + 'name' => 'List ID and Type', + 'type' => 'text', + 'required' => true, + 'exampleValue' => '123456&list=read' + ) ) - )); + ); const LIMIT_COLS = 5; const LIMIT_ITEMS = 10; + const RELEASES_URL = 'https://www.mangaupdates.com/releases.html'; private $feedName = ''; public function collectData() { - $html = getSimpleHTMLDOM($this->getURI()) - or returnServerError('Series not found'); + if($this -> queriedContext == 'By series') + $this -> collectDataBySeries(); + else //queriedContext == 'By list' + $this -> collectDataByList(); + } + + public function getURI(){ + if($this -> queriedContext == 'By series') { + $series_id = $this->getInput('series_id'); + if (!empty($series_id)) { + return self::URI . 'releases.html?search=' . $series_id . '&stype=series'; + } + } else //queriedContext == 'By list' + return self::RELEASES_URL; + + return self::URI; + } + + public function getName(){ + if(!empty($this->feedName)) { + return $this->feedName . ' - ' . self::NAME; + } + return parent::getName(); + } + + private function getSanitizedHash($string) { + return hash('sha1', preg_replace('/[^a-zA-Z0-9\-\.]/', '', ucwords(strtolower($string)))); + } + + private function filterText($text) { + return rtrim($text, '* '); + } + + private function filterHTML($text) { + return $this->filterText(html_entity_decode($text)); + } + + private function findID($manga) { + // sometimes new series are on the release list that have no ID. just drop them. + if(@$this -> filterHTML($manga -> find('a', 0) -> href) != null) { + preg_match('/id=([0-9]*)/', $this -> filterHTML($manga -> find('a', 0) -> href), $match); + return $match[1]; + } else + return 0; + } + + private function collectDataBySeries() { + $html = getSimpleHTMLDOM($this->getURI()); // content is an unstructured pile of divs, ugly to parse $cols = $html->find('div#main_content div.row > div.text'); @@ -68,36 +125,62 @@ class BakaUpdatesMangaReleasesBridge extends BridgeAbstract { $item['title'] = implode(' ', $title); $item['uri'] = $this->getURI(); - $item['uid'] = $this->getSanitizedHash($item['title']); + $item['uid'] = $this->getSanitizedHash($item['title'] . $item['author']); $this->items[] = $item; } } - public function getURI(){ - $series_id = $this->getInput('series_id'); - if (!empty($series_id)) { - return self::URI . 'releases.html?search=' . $series_id . '&stype=series'; + private function collectDataByList() { + $this -> feedName = 'Releases'; + $list = array(); + + $releasesHTML = getSimpleHTMLDOM(self::RELEASES_URL); + + $list_id = $this -> getInput('list_id'); + $listHTML = getSimpleHTMLDOM('https://www.mangaupdates.com/mylist.html?id=' . $list_id); + + //get ids of the manga that the user follows, + $parts = $listHTML -> find('table#ptable tr > td.pl'); + foreach($parts as $part) { + $list[] = $this -> findID($part); } - return self::URI; - } - public function getName(){ - if(!empty($this->feedName)) { - return $this->feedName . ' - ' . self::NAME; + //similar to above, but the divs are in groups of 3. + $cols = $releasesHTML -> find('div#main_content div.row > div.pbreak'); + $rows = array_slice(array_chunk($cols, 3), 0); + + foreach($rows as $cols) { + //check if current manga is in user's list. + $id = $this -> findId($cols[0]); + if(!array_search($id, $list)) continue; + + $item = array(); + $title = array(); + + $item['content'] = ''; + + $objTitle = $cols[0]; + if ($objTitle) { + $title[] = $this->filterHTML($objTitle->plaintext); + $item['content'] .= '

Series: ' . $this->filterHTML($objTitle -> innertext) . '

'; + } + + $objVolChap = $cols[1]; + if ($objVolChap && !empty($objVolChap->plaintext)) + $title[] = $this -> filterHTML($objVolChap -> innertext); + + $objAuthor = $cols[2]; + if ($objAuthor && !empty($objAuthor->plaintext)) { + $item['author'] = $this->filterHTML($objAuthor -> plaintext); + $item['content'] .= '

Groups: ' . $this->filterHTML($objAuthor -> innertext) . '

'; + } + + $item['title'] = implode(' ', $title); + $item['uri'] = self::URI . 'releases.html?search=' . $id . '&stype=series'; + $item['uid'] = $this->getSanitizedHash($item['title'] . $item['author']); + + $this->items[] = $item; } - return parent::getName(); - } - - private function getSanitizedHash($string) { - return hash('sha1', preg_replace('/[^a-zA-Z0-9\-\.]/', '', ucwords(strtolower($string)))); - } - - private function filterText($text) { - return rtrim($text, '* '); - } - - private function filterHTML($text) { - return $this->filterText(html_entity_decode($text)); } }