anime-downloader/anime_downloader/sites/animestar.py

64 lines
2.6 KiB
Python

import re
from urllib.parse import urlparse
from datetime import datetime
from requests import Request
from anime_downloader.sites.anime import Anime, AnimeEpisode, SearchResult
from anime_downloader.sites import helpers
from anime_downloader.const import get_random_header
_headers = get_random_header() | { 'X-Requested-By': 'animestar-web'}
class AnimeStar(Anime, sitename='animestar'):
sitename = 'animestar'
# Neither 720p nor 1080p are guaranteed, but they could happen
QUALITIES = ['360p', '480p', '540p', '720p', '1080p']
_real_getter = 'https://api.animestar.app/api/drama?id='
@classmethod
def search(cls, query):
return [
SearchResult(
title=i['name'],
url='https://animestar.app/show-details/deadbeef/'+i['_id'],
poster=i['image'],
meta={'genre': i['genre']},
meta_info={
'title_cleaned': re.sub(r'\(.*?\)', '', i['name']).strip()
})
for i in helpers.get('https://api.animestar.app/api/drama/search',
params={'q': query},
headers=_headers).json()
]
def _scrape_episodes(self):
return [
Request('GET', 'https://api.animestar.app/api/utility/get-stream-links',
params={'url': i['videoUrl'], 'server': 1}
).prepare().url
for i in sorted(helpers.get(self._real_getter+urlparse(self.url).path.split('/')[-1],
headers=_headers).json()['episodes'],
key=lambda i: i['number'])
]
def _scrape_metadata(self):
resp = helpers.get(self._real_getter+urlparse(self.url).path.split('/')[-1],
headers=_headers).json()
self.title = resp['name']
self.subbed = resp['audioType'] == 'SUB'
self.meta['names_alt'] = resp['altNames']
self.meta['year'] = resp['releaseYear']
self.meta['status'] = resp['tvStatus']
self.meta['genre'] = resp['genre']
self.meta['type'] = resp['type']
self.meta['story'] = resp['synopsis']
self.meta['views'] = resp['views']
self.meta['ctime'] = datetime.fromtimestamp(resp['createdAt']/1000).strftime('%Y-%m-%d %H:%M')
self.meta['mtime'] = datetime.fromtimestamp(resp['modifiedAt']/1000).strftime('%Y-%m-%d %H:%M')
class AnimeStarEpisode(AnimeEpisode, sitename='animestar'):
def _get_sources(self):
return [('no_extractor', helpers.get(self.url, headers=_headers).json()['url'])]