anime-downloader/anime_downloader/sites/yify.py

76 lines
2.6 KiB
Python

import logging
import re
from anime_downloader.sites.anime import Anime, AnimeEpisode, SearchResult
from anime_downloader.sites import helpers
logger = logging.getLogger(__name__)
class Yify(Anime, sitename='yify'):
sitename = 'yify'
url = f'https://{sitename}.mx/search'
@classmethod
def search(cls, query):
search_results = helpers.soupify(helpers.get(cls.url, params={'keyword': query})).select('div.ml-item > a')
return [
SearchResult(
title=i.get('title'),
url=i.get('href') + '/watching.html')
for i in search_results
]
def _scrape_episodes(self):
soup = helpers.soupify(helpers.get(self.url))
regex = r'id:.*?\"([0-9]*?)\"'
movie_id = re.search(regex, str(soup)).group(1)
load_episodes = f'https://yify.mx/ajax/v2_get_episodes/{movie_id}'
elements = helpers.soupify(helpers.get(load_episodes)).select('div.les-content > a')
# Doesn't really return urls, rather ID:s. This is to prevent loading all episodes with separate
# requests if the user only wants one episode
return [i.get('episode-id', '') for i in elements]
def _scrape_metadata(self):
soup = helpers.soupify(helpers.get(self.url))
self.title = soup.select('title')[0].text.replace('Full Movie Free Yify', '')
class YifyEpisode(AnimeEpisode, sitename='yify'):
def _get_sources(self):
if not self.url:
return ''
load_embed = 'https://yify.mx/ajax/load_embed/{}'
embed = helpers.get(load_embed.format(self.url)).json()
logger.debug('Embed: {}'.format(embed))
embed_url = embed['embed_url']
episode_id = embed_url.split('#')[-1]
load_embed = f'https://yify.mx/ajax/load_embed_url/{episode_id}'
episode_info = helpers.get(load_embed).json()
logger.debug(episode_info)
url = episode_info['url']
api_id = re.search(r'id=([^&]*)', url).group(1)
api = f'https://watch.yify.mx/api/?id={api_id}'
sources = helpers.get(api).json()
logger.debug(sources)
sources_list = []
extractors = {
'yify.mx/embed/': ['yify', 'yify'],
'vidcloud9.com/': ['vidstream', 'vidstream']
}
for i in sources:
for j in extractors:
if j in i['link']:
sources_list.append({
'extractor': extractors[j][0],
'url': i['link'],
'server': extractors[j][1],
'version': 'subbed'
})
return self.sort_sources(sources_list)