mirror of
https://codeberg.org/polarisfm/youtube-dl
synced 2025-01-25 05:57:55 +01:00
[AnimeLab] Add 'shows' (playlists) support
This commit is contained in:
parent
12935a897f
commit
a3e2a31db0
@ -12,6 +12,8 @@ from ..utils import (
|
|||||||
|
|
||||||
from ..compat import compat_HTTPError
|
from ..compat import compat_HTTPError
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
class AnimeLabBaseIE(InfoExtractor):
|
class AnimeLabBaseIE(InfoExtractor):
|
||||||
_LOGIN_REQUIRED = True
|
_LOGIN_REQUIRED = True
|
||||||
@ -65,6 +67,10 @@ class AnimeLabBaseIE(InfoExtractor):
|
|||||||
def _real_initialize(self):
|
def _real_initialize(self):
|
||||||
self._login()
|
self._login()
|
||||||
|
|
||||||
|
def get_data_from_js(self, webpage, name, display_id):
|
||||||
|
data_str = self._search_regex(r'new\s+?%s\s*?\((.*?)\);' % name, webpage, 'AnimeLab %s' % name)
|
||||||
|
return self._parse_json(data_str, display_id)
|
||||||
|
|
||||||
def get_video_info(self, raw_data, webpage='', display_id=None):
|
def get_video_info(self, raw_data, webpage='', display_id=None):
|
||||||
video_id = str_or_none(raw_data['id'])
|
video_id = str_or_none(raw_data['id'])
|
||||||
if display_id is None:
|
if display_id is None:
|
||||||
@ -206,8 +212,7 @@ class AnimeLabIE(AnimeLabBaseIE):
|
|||||||
|
|
||||||
webpage = self._download_webpage(url, display_id, 'Downloading requested URL')
|
webpage = self._download_webpage(url, display_id, 'Downloading requested URL')
|
||||||
|
|
||||||
video_collection_str = self._search_regex(r'new\s+?VideoCollection\s*?\((.*?)\);', webpage, 'AnimeLab VideoCollection')
|
video_collection = self.get_data_from_js(webpage, 'VideoCollection', display_id)
|
||||||
video_collection = self._parse_json(video_collection_str, display_id)
|
|
||||||
position = int_or_none(self._search_regex(r'playlistPosition *?= *?(\d+)', webpage, 'Playlist Position'))
|
position = int_or_none(self._search_regex(r'playlistPosition *?= *?(\d+)', webpage, 'Playlist Position'))
|
||||||
|
|
||||||
raw_data = video_collection[position]['videoEntry']
|
raw_data = video_collection[position]['videoEntry']
|
||||||
@ -216,6 +221,65 @@ class AnimeLabIE(AnimeLabBaseIE):
|
|||||||
|
|
||||||
|
|
||||||
class AnimeLabShowsIE(AnimeLabBaseIE):
|
class AnimeLabShowsIE(AnimeLabBaseIE):
|
||||||
pass
|
_VALID_URL = r'https?://(?:www\.)?animelab\.com/shows/(?P<id>[^/]+)'
|
||||||
|
|
||||||
|
_TEST = {
|
||||||
|
'url': 'https://www.animelab.com/shows/attack-on-titan',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '45',
|
||||||
|
'title': 'Attack on Titan',
|
||||||
|
'description': 'md5:989d95a2677e9309368d5cf39ba91469',
|
||||||
|
},
|
||||||
|
'playlist_count': 37,
|
||||||
|
'skip': 'All AnimeLab content requires authentication',
|
||||||
|
}
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
_BASE_URL = 'http://www.animelab.com'
|
||||||
|
display_id = self._match_id(url)
|
||||||
|
|
||||||
|
webpage = self._download_webpage(url, display_id, 'Downloading requested URL')
|
||||||
|
|
||||||
|
show_data = self.get_data_from_js(webpage, 'Show', display_id)
|
||||||
|
|
||||||
|
show_id = str_or_none(show_data.get('id'))
|
||||||
|
title = show_data.get('name')
|
||||||
|
description = show_data.get('shortSynopsis') or show_data.get('longSynopsis')
|
||||||
|
|
||||||
|
season_strs = re.findall(r'new\s+?VideoEntryCollection\s*?\((.*?)\)', webpage)
|
||||||
|
seasons = []
|
||||||
|
for season_str in season_strs:
|
||||||
|
seasons.append(self._parse_json(season_str, display_id))
|
||||||
|
|
||||||
|
if not seasons:
|
||||||
|
raise ExtractorError('No seasons found!')
|
||||||
|
|
||||||
|
entries = []
|
||||||
|
for season in seasons:
|
||||||
|
get_data = urlencode_postdata({
|
||||||
|
'seasonId': season['params']['seasonId'],
|
||||||
|
'limit': 1000,
|
||||||
|
})
|
||||||
|
# despite using urlencode_postdata, we are sending a GET request
|
||||||
|
target_url = _BASE_URL + season['url'] + "?" + get_data.decode('utf-8')
|
||||||
|
response = self._download_webpage(
|
||||||
|
target_url,
|
||||||
|
None, 'Season id %s' % season['params']['seasonId'])
|
||||||
|
|
||||||
|
season_data = self._parse_json(response, display_id)
|
||||||
|
|
||||||
|
for video_data in season_data['list']:
|
||||||
|
entries.append(self.url_result(
|
||||||
|
_BASE_URL + '/player/' + video_data['slug'], 'AnimeLab',
|
||||||
|
video_data.get('id'), video_data.get('name')
|
||||||
|
))
|
||||||
|
|
||||||
|
return {
|
||||||
|
'_type': 'playlist',
|
||||||
|
'id': show_id,
|
||||||
|
'title': title,
|
||||||
|
'description': description,
|
||||||
|
'entries': entries,
|
||||||
|
}
|
||||||
|
|
||||||
# TODO implement myqueue
|
# TODO implement myqueue
|
||||||
|
@ -39,7 +39,10 @@ from .airmozilla import AirMozillaIE
|
|||||||
from .aljazeera import AlJazeeraIE
|
from .aljazeera import AlJazeeraIE
|
||||||
from .alphaporno import AlphaPornoIE
|
from .alphaporno import AlphaPornoIE
|
||||||
from .amcnetworks import AMCNetworksIE
|
from .amcnetworks import AMCNetworksIE
|
||||||
from .animelab import AnimeLabIE
|
from .animelab import (
|
||||||
|
AnimeLabIE,
|
||||||
|
AnimeLabShowsIE,
|
||||||
|
)
|
||||||
from .animeondemand import AnimeOnDemandIE
|
from .animeondemand import AnimeOnDemandIE
|
||||||
from .anitube import AnitubeIE
|
from .anitube import AnitubeIE
|
||||||
from .anvato import AnvatoIE
|
from .anvato import AnvatoIE
|
||||||
|
Loading…
Reference in New Issue
Block a user