From f328a47a6357c93c15e6bfe1875561c54b249f64 Mon Sep 17 00:00:00 2001 From: AbdullahM0hamed <25087116+AbdullahM0hamed@users.noreply.github.com> Date: Sun, 20 Sep 2020 17:21:20 +0100 Subject: [PATCH] Add AnimeSuge (#518) * Add AnimeSuge I will add backoff stuff to helpers some day Co-authored-by: Blatzar <46196380+Blatzar@users.noreply.github.com> --- README.md | 1 + anime_downloader/config.py | 7 +++ anime_downloader/extractors/init.py | 6 ++ anime_downloader/extractors/streamtape.py | 10 +++ anime_downloader/sites/animesuge.py | 76 +++++++++++++++++++++++ anime_downloader/sites/init.py | 1 + 6 files changed, 101 insertions(+) create mode 100644 anime_downloader/extractors/streamtape.py create mode 100644 anime_downloader/sites/animesuge.py diff --git a/README.md b/README.md index fd9c526..a70888c 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ Yeah. Me too! That's why this tool exists. - animeout - Animerush - Animesimple +- AnimeSuge - Animevibe - Animixplay - Anistream diff --git a/anime_downloader/config.py b/anime_downloader/config.py index 4ad86b2..31f0c89 100644 --- a/anime_downloader/config.py +++ b/anime_downloader/config.py @@ -176,6 +176,13 @@ DEFAULT_CONFIG = { }, 'animeonline360': { 'version': 'subbed' + }, + 'animesuge': { + 'version': 'subbed', + 'servers': [ + 'mp4upload', + 'streamtape' + ] } } } diff --git a/anime_downloader/extractors/init.py b/anime_downloader/extractors/init.py index c622b1b..1bb1bc2 100644 --- a/anime_downloader/extractors/init.py +++ b/anime_downloader/extractors/init.py @@ -144,6 +144,12 @@ ALL_EXTRACTORS = [ 'modulename': 'vudeo', 'regex': 'vudeo', 'class': 'Vudeo' + }, + { + 'sitename': 'streamtape', + 'modulename': 'streamtape', + 'regex': 'streamtape', + 'class': 'StreamTape' } ] diff --git a/anime_downloader/extractors/streamtape.py b/anime_downloader/extractors/streamtape.py new file mode 100644 index 0000000..6179c85 --- /dev/null +++ b/anime_downloader/extractors/streamtape.py @@ -0,0 +1,10 @@ +from anime_downloader.extractors.base_extractor import BaseExtractor +from anime_downloader.sites import helpers + + +class StreamTape(BaseExtractor): + def _get_data(self): + return { + 'stream_url': 'https:' + helpers.soupify(helpers.get(self.url)).select("div#videolink")[0].text, + 'referer': self.url + } diff --git a/anime_downloader/sites/animesuge.py b/anime_downloader/sites/animesuge.py new file mode 100644 index 0000000..a5425f8 --- /dev/null +++ b/anime_downloader/sites/animesuge.py @@ -0,0 +1,76 @@ +from anime_downloader.sites.anime import Anime, AnimeEpisode, SearchResult +from anime_downloader.sites import helpers + +import re +import json + + +class AnimeSuge(Anime, sitename="animesuge"): + sitename = "animesuge" + + @classmethod + def search(cls, query): + soup = helpers.soupify(helpers.get("https://animesuge.io/ajax/anime/search", params={"keyword": query}).json()['html']) + + search_results = [ + SearchResult( + title=x.find("div").text, + url="https://animesuge.io" + x.get('href') + ) + for x in soup.select("a:not(.more)") + ] + + return search_results + + def _scrape_episodes(self): + ep_url = "https://animesuge.io/ajax/anime/servers" + _id = re.search(r".*-(.*)", self.url).group(1) + + soup = helpers.soupify(helpers.get(ep_url, params={'id': _id})) + + return ['https://animesuge.io' + x.get('href') for x in soup.select('a:not(.more)')] + + def _scrape_metadata(self): + self.title = helpers.soupify(helpers.get(self.url)).find("h1").text + + +class AnimeSugeEpisode(AnimeEpisode, sitename='animesuge'): + def _get_sources(self): + # Get id and ep no. from url, e.g: https://animesuge.io/anime/naruto-xx8z/ep-190 -> xx8z, 190 + _id, ep_no = re.search(r".*\/anime\/.*-(.*?)\/.*-(\d+)$", self.url).group(1, 2) + + # Get sources json from html, e.g: + """ + 190""" + data_sources = json.loads(helpers.soupify(helpers.get("https://animesuge.io/ajax/anime/servers", + params={"id": _id, "episode": ep_no})).select(f"a[data-base='{ep_no}']")[0].get("data-sources")) + + # Only includes supported + # Unsupported ones {'28': 'openstream'} + id_source_map = {'35': 'mp4upload', '40': 'streamtape'} + + sources_list = [] + for key in id_source_map: + if key in data_sources.keys(): + _id = data_sources[key] + + for _ in range(3): + try: + link = helpers.get("https://animesuge.io/ajax/anime/episode", + params={"id": _id}).json()['url'] + break + # Makes it more consistent. + except HTTPError: + time.sleep(5) + continue + + server = id_source_map[key] + sources_list.append({ + 'extractor': server, + 'url': link, + 'server': server, + # This may not be true, can't see the info on page. + 'version': 'subbed' + }) + + return self.sort_sources(sources_list) diff --git a/anime_downloader/sites/init.py b/anime_downloader/sites/init.py index 692983f..04a214d 100644 --- a/anime_downloader/sites/init.py +++ b/anime_downloader/sites/init.py @@ -17,6 +17,7 @@ ALL_ANIME_SITES = [ ('animeout', 'animeout', 'AnimeOut'), ('animerush', 'animerush', 'AnimeRush'), ('animesimple', 'animesimple', 'AnimeSimple'), + ('animesuge', 'animesuge', 'AnimeSuge'), ('animevibe', 'animevibe', 'AnimeVibe'), ('animixplay', 'animixplay', 'AniMixPlay'), ('darkanime', 'darkanime', 'DarkAnime'),