From 3c1b852e102aa97d8995c92a28f0b265a43947e2 Mon Sep 17 00:00:00 2001 From: Arjix <53124886+ArjixGamer@users.noreply.github.com> Date: Thu, 11 Mar 2021 11:18:05 +0200 Subject: [PATCH 1/5] added a poster image to the search results --- anime_downloader/sites/twistmoe.py | 1 + 1 file changed, 1 insertion(+) diff --git a/anime_downloader/sites/twistmoe.py b/anime_downloader/sites/twistmoe.py index 6e65ace..8e53205 100644 --- a/anime_downloader/sites/twistmoe.py +++ b/anime_downloader/sites/twistmoe.py @@ -55,6 +55,7 @@ class TwistMoe(Anime, sitename='twist.moe'): animes.append(SearchResult( title=anime['title'], url='https://twist.moe/a/' + anime['slug']['slug'] + '/', + poster=f"https://media.kitsu.io/anime/poster_images/{anime['hb_id']}/large.jpg" )) animes = [ani[0] for ani in process.extract(query, animes)] return animes From af572fdcccd26a8787163404f7c840327b9fec36 Mon Sep 17 00:00:00 2001 From: Arjix <53124886+ArjixWasTaken@users.noreply.github.com> Date: Thu, 24 Jun 2021 05:13:08 +0300 Subject: [PATCH 2/5] Update twistmoe.py --- anime_downloader/sites/twistmoe.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/anime_downloader/sites/twistmoe.py b/anime_downloader/sites/twistmoe.py index 8e53205..6a21dae 100644 --- a/anime_downloader/sites/twistmoe.py +++ b/anime_downloader/sites/twistmoe.py @@ -82,6 +82,28 @@ class TwistMoe(Anime, sitename='twist.moe'): return self._episode_urls + def _scrape_metadata(self): + slug = self.url.split('a/')[-1][:-1] + api_url = "https://api.twist.moe/api/anime/" + slug + res = helpers.get( + api_url, + headers={ + 'x-access-token': '0df14814b9e590a1f26d3071a4ed7974' + } + ).json() + if 'hb_id' in res: + kitsu_api_url = "https://kitsu.io/api/edge/anime/" + str(res['hb_id']) + kitsu_data = helpers.get(kitsu_api_url).json() + attributes = kitsu_data['data']['attributes'] + + self.meta['title'] = attributes['canonicalTitle'] + self.meta['year'] = attributes['startDate'].split('-')[0] + self.meta['airing_status'] = attributes['status'] + self.meta['poster'] = attributes['posterImage']['original'] + self.meta['cover'] = attributes['coverImage']['original'] + self.meta['total_eps'] = attributes['episodeCount'] + self.meta['desc'] = attributes['description'] + # From stackoverflow https://stackoverflow.com/questions/36762098/how-to-decrypt-password-from-javascript-cryptojs-aes-encryptpassword-passphras def pad(data): length = BLOCK_SIZE - (len(data) % BLOCK_SIZE) From 6114dde0ac93bbb568f7d184cc614968fc8fbc28 Mon Sep 17 00:00:00 2001 From: Arjix <53124886+ArjixWasTaken@users.noreply.github.com> Date: Thu, 24 Jun 2021 14:21:27 +0300 Subject: [PATCH 3/5] Update _4anime.py --- anime_downloader/sites/_4anime.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/anime_downloader/sites/_4anime.py b/anime_downloader/sites/_4anime.py index 81afb47..46b01a0 100644 --- a/anime_downloader/sites/_4anime.py +++ b/anime_downloader/sites/_4anime.py @@ -19,12 +19,13 @@ class Anime4(Anime, sitename='4anime'): "options": "qtranslate_lang=0&set_intitle=None&customset%5B%5D=anime" } soup = helpers.soupify(helpers.post( - "https://4anime.to/wp-admin/admin-ajax.php", data=data)).select('div.info > a') + "https://4anime.to/wp-admin/admin-ajax.php", data=data)).select('.item') search_results = [ SearchResult( - title=i.text, - url=i['href'] + title=i.select_one('.info > a').text, + url=i.select_one('.info > a').get('href', ''), + poster="https://4anime.to" + i.find('img').get('src', '') ) for i in soup ] @@ -41,6 +42,19 @@ class Anime4(Anime, sitename='4anime'): for i in soup.select('.detail > a'): if 'year' in i.get('href', ''): self.meta['year'] = int(i.text) if i.text.isnumeric() else None + elif 'status' in i.get('href', ''): + self.meta['airing_status'] = i.text.strip() + + desc_soup = soup.select_one("#description-mob") + if "READ MORE" in str(desc_soup): + desc = desc_soup.select('#fullcontent p') + self.meta['description'] = "\n".join([x.text for x in desc]) + else: + self.meta['description'] = desc_soup.select_one('p:nth-child(2)').text + + self.meta['poster'] = "https://4anime.to" + soup.select_one("#details > div.cover > img").get('src', '') + self.meta['total_eps'] = len(soup.select('ul.episodes.range.active > li > a')) + self.meta['cover'] = "https://4anime.to/static/Dr1FzAv.jpg" class Anime4Episode(AnimeEpisode, sitename='4anime'): From 9c92ad425d09f573bdfbdd64d886c30c6d5fa631 Mon Sep 17 00:00:00 2001 From: Arjix <53124886+ArjixWasTaken@users.noreply.github.com> Date: Thu, 24 Jun 2021 15:52:39 +0300 Subject: [PATCH 4/5] fixed tenshi.moe and added metadata --- anime_downloader/sites/tenshimoe.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/anime_downloader/sites/tenshimoe.py b/anime_downloader/sites/tenshimoe.py index 7644b5e..8e03f47 100644 --- a/anime_downloader/sites/tenshimoe.py +++ b/anime_downloader/sites/tenshimoe.py @@ -1,5 +1,6 @@ from anime_downloader.sites.anime import Anime, AnimeEpisode, SearchResult from anime_downloader.sites import helpers +import re class TenshiMoe(Anime, sitename='tenshi.moe'): @@ -23,19 +24,36 @@ class TenshiMoe(Anime, sitename='tenshi.moe'): def _scrape_episodes(self): soup = helpers.soupify(helpers.get(self.url)) eps = soup.select( - 'li[class^=episode] > a' + 'li[class*="episode"] > a' ) eps = [x['href'] for x in eps] return eps def _scrape_metadata(self): soup = helpers.soupify(helpers.get(self.url).text) - self.title = soup.title.text.split('—')[0].strip() + self.title = soup.select_one('span.value > span[title="English"]').parent.text.strip() + self.meta['year'] = int(re.findall(r"(\d{4})", soup.select_one('li.release-date .value').text)[0]) + self.meta['airing_status'] = soup.select_one('li.status > .value').text.strip() + self.meta['total_eps'] = int(soup.select_one('.entry-episodes > h2 > span').text.strip()) + self.meta['desc'] = soup.select_one('.entry-description > .card-body').text.strip() + self.meta['poster'] = soup.select_one('img.cover-image').get('src', '') + self.meta['cover'] = '' class TenshiMoeEpisode(AnimeEpisode, sitename='tenshi.moe'): + QUALITIES = ['360p', '480p', '720p', '1080p'] + def _get_sources(self): soup = helpers.soupify(helpers.get(self.url)) - # Might break with something other than mp4! - link = soup.find_all('source', type="video/mp4")[-1]['src'] - return [('no_extractor', link)] + soup = soup.select_one('.embed-responsive > iframe') + + mp4moe = helpers.soupify(helpers.get(soup.get('src'), referer=self.url)) + mp4moe = mp4moe.select_one('video#player') + qualities_ = [x.get("title") for x in mp4moe.select('source')] + sources = [ + ('no_extractor', x.get('src')) + for x in mp4moe.select('source') + ] + + if self.quality in qualities_: + return [sources[qualities_.index(self.quality)]] From e84cc01c44ab8f8fabae97cb9cb5fe6c571e5711 Mon Sep 17 00:00:00 2001 From: Arjix <53124886+ArjixWasTaken@users.noreply.github.com> Date: Thu, 24 Jun 2021 17:29:13 +0300 Subject: [PATCH 5/5] Update tenshimoe.py --- anime_downloader/sites/tenshimoe.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/anime_downloader/sites/tenshimoe.py b/anime_downloader/sites/tenshimoe.py index 8e03f47..8c71b59 100644 --- a/anime_downloader/sites/tenshimoe.py +++ b/anime_downloader/sites/tenshimoe.py @@ -10,13 +10,21 @@ class TenshiMoe(Anime, sitename='tenshi.moe'): @classmethod def search(cls, query): soup = helpers.soupify( - helpers.get('https://tenshi.moe/anime', params={'q': query})) - results = soup.select('ul.loop.anime-loop.list > li > a') + helpers.get( + 'https://tenshi.moe/anime', + params={'q': query}, + cookies={'loop-view': 'thumb'}, + cache=False + ) + ) + + results = soup.select('ul.thumb > li > a') return [ SearchResult( title=x['title'], url=x['href'], + poster=x.find('img')['src'] ) for x in results ]