[acfun] Re-format code to pass flake8

This commit is contained in:
johnsmith2077 2020-10-05 18:14:42 +08:00
parent cef5fe698a
commit 6bbb9d0ae8
1 changed files with 144 additions and 125 deletions

View File

@ -5,7 +5,6 @@ import json
from .common import InfoExtractor from .common import InfoExtractor
from ..compat import ( from ..compat import (
compat_cookiejar,
compat_urllib_parse_urlencode, compat_urllib_parse_urlencode,
compat_urllib_request, compat_urllib_request,
) )
@ -18,203 +17,223 @@ from ..utils import (
ExtractorError, ExtractorError,
) )
class BasicAcfunInfoExtractor(InfoExtractor): class BasicAcfunInfoExtractor(InfoExtractor):
_FAKE_HEADERS = { _FAKE_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # noqa "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", # noqa
'Accept-Charset': 'UTF-8,*;q=0.5', "Accept-Charset": "UTF-8,*;q=0.5",
'Accept-Encoding': 'gzip,deflate,sdch', "Accept-Encoding": "gzip,deflate,sdch",
'Accept-Language': 'en-US,en;q=0.8', "Accept-Language": "en-US,en;q=0.8",
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0', # noqa "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0", # noqa
} }
def _extract_formats(self, currentVideoInfo): def _extract_formats(self, currentVideoInfo):
durationMillis = currentVideoInfo.get('durationMillis') durationMillis = currentVideoInfo.get("durationMillis")
if 'ksPlayJson' in currentVideoInfo: if "ksPlayJson" in currentVideoInfo:
ksPlayJson = ksPlayJson = json.loads( currentVideoInfo['ksPlayJson'] ) ksPlayJson = ksPlayJson = json.loads(currentVideoInfo["ksPlayJson"])
representation = ksPlayJson.get('adaptationSet')[0].get('representation') representation = ksPlayJson.get("adaptationSet")[0].get("representation")
formats = [] formats = []
for stream in representation: for stream in representation:
size = float_or_none(durationMillis) * stream["avgBitrate"] / 8 size = float_or_none(durationMillis) * stream["avgBitrate"] / 8
stream_id = stream["qualityLabel"] formats += [
quality = stream["qualityType"] {
formats += [{ "url": stream["url"],
'url': stream["url"], "ext": "mp4",
'ext': 'mp4', "width": stream.get("width"),
'width': stream.get('width'), "height": stream.get("height"),
'height': stream.get('height'), "filesize": size,
'filesize': size, }
}] ]
formats = formats[::-1] formats = formats[::-1]
self._sort_formats(formats) self._sort_formats(formats)
return formats return formats
class AcfunIE(BasicAcfunInfoExtractor): class AcfunIE(BasicAcfunInfoExtractor):
_VALID_URL = r'https?://www\.acfun\.cn/v/ac(?P<id>[_\d]+)' _VALID_URL = r"https?://www\.acfun\.cn/v/ac(?P<id>[_\d]+)"
_TESTS = [ _TESTS = [
{ {
'url': 'https://www.acfun.cn/v/ac18184362', "url": "https://www.acfun.cn/v/ac18184362",
'info_dict': { "info_dict": {
'id': '18184362', "id": "18184362",
'ext': 'mp4', "ext": "mp4",
'duration': 192.042, "duration": 192.042,
'title': '【AC娘】魔性新单《极乐857》上线来和AC娘一起云蹦迪吧', "title": "【AC娘】魔性新单《极乐857》上线来和AC娘一起云蹦迪吧",
'uploader': 'AC娘本体', "uploader": "AC娘本体",
'uploader_id': 23682490 "uploader_id": 23682490,
} },
}, },
{ {
'url': 'https://www.acfun.cn/v/ac17532274_3', "url": "https://www.acfun.cn/v/ac17532274_3",
'info_dict': { "info_dict": {
'id': '17532274_3', "id": "17532274_3",
'ext': 'mp4', "ext": "mp4",
'duration': 233.770, "duration": 233.770,
'title': '【AC娘x竾颜音】【周六狂欢24小时】TRAP七夕恋歌落入本娘爱的陷阱 - TRAP 阿婵', "title": "【AC娘x竾颜音】【周六狂欢24小时】TRAP七夕恋歌落入本娘爱的陷阱 - TRAP 阿婵",
'uploader': 'AC娘本体', "uploader": "AC娘本体",
'uploader_id': 23682490 "uploader_id": 23682490,
} },
} },
] ]
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id, headers=self._FAKE_HEADERS) webpage = self._download_webpage(url, video_id, headers=self._FAKE_HEADERS)
json_text = self._html_search_regex(r'(?s)videoInfo\s*=\s*(\{.*?\});', webpage, 'json_text') json_text = self._html_search_regex(
r"(?s)videoInfo\s*=\s*(\{.*?\});", webpage, "json_text"
)
json_data = json.loads(json_text) json_data = json.loads(json_text)
title = json_data['title'] title = json_data["title"]
p_title = self._html_search_regex(r"<li\s[^<]*?class='[^']*active[^']*'.*?>(.*?)</li>", webpage, 'p_title', default=None) p_title = self._html_search_regex(
r"<li\s[^<]*?class='[^']*active[^']*'.*?>(.*?)</li>",
webpage,
"p_title",
default=None,
)
if p_title: if p_title:
title = '%s - %s' % (title, p_title) title = "%s - %s" % (title, p_title)
uploader = json_data.get('user').get('name') uploader = json_data.get("user").get("name")
uploader_id = json_data.get('user').get('id') uploader_id = json_data.get("user").get("id")
currentVideoInfo = json_data.get("currentVideoInfo")
durationMillis = currentVideoInfo.get("durationMillis")
duration = durationMillis / 1000
currentVideoInfo = json_data.get('currentVideoInfo')
durationMillis = currentVideoInfo.get('durationMillis')
duration = durationMillis / 1000
formats = self._extract_formats(currentVideoInfo) formats = self._extract_formats(currentVideoInfo)
return { return {
'id': video_id, "id": video_id,
'uploader_id': str_to_int(uploader_id), "uploader_id": str_to_int(uploader_id),
'title': title, "title": title,
'uploader': str_or_none(uploader), "uploader": str_or_none(uploader),
'duration': float_or_none(duration), "duration": float_or_none(duration),
'formats': formats "formats": formats,
} }
class AcfunBangumiIE(BasicAcfunInfoExtractor): class AcfunBangumiIE(BasicAcfunInfoExtractor):
_VALID_URL = r'https?://www\.acfun\.cn/bangumi/aa(?P<id>[_\d]+)' _VALID_URL = r"https?://www\.acfun\.cn/bangumi/aa(?P<id>[_\d]+)"
_TEST = { _TEST = {
'url': 'https://www.acfun.cn/bangumi/aa6002917_36188_1748679', "url": "https://www.acfun.cn/bangumi/aa6002917_36188_1748679",
'info_dict': { "info_dict": {
'id': '6002917_36188_1748679', "id": "6002917_36188_1748679",
'ext': 'mp4', "ext": "mp4",
'duration': 1437.076, "duration": 1437.076,
'title': '租借女友 第12话 告白和女友', "title": "租借女友 第12话 告白和女友",
} },
} }
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id, headers=self._FAKE_HEADERS) webpage = self._download_webpage(url, video_id, headers=self._FAKE_HEADERS)
json_text = self._html_search_regex(r'(?s)bangumiData\s*=\s*(\{.*?\});', webpage, 'json_text') json_text = self._html_search_regex(
r"(?s)bangumiData\s*=\s*(\{.*?\});", webpage, "json_text"
)
json_data = json.loads(json_text) json_data = json.loads(json_text)
title = json_data.get('showTitle') or json_data['bangumiTitle'] + " " + json_data['episodeName'] + " " + json_data['title'] title = (
json_data.get("showTitle")
or json_data["bangumiTitle"]
+ " "
+ json_data["episodeName"]
+ " "
+ json_data["title"]
)
currentVideoInfo = json_data.get('currentVideoInfo') currentVideoInfo = json_data.get("currentVideoInfo")
durationMillis = currentVideoInfo.get('durationMillis') durationMillis = currentVideoInfo.get("durationMillis")
duration = durationMillis / 1000 duration = durationMillis / 1000
formats = self._extract_formats(currentVideoInfo) formats = self._extract_formats(currentVideoInfo)
return { return {
'id': video_id, "id": video_id,
'title': title, "title": title,
'duration': float_or_none(duration), "duration": float_or_none(duration),
'formats': formats "formats": formats,
} }
class AcfunLiveIE(BasicAcfunInfoExtractor): class AcfunLiveIE(BasicAcfunInfoExtractor):
_VALID_URL = r'https?://live\.acfun\.cn/live/(?P<id>\d+)' _VALID_URL = r"https?://live\.acfun\.cn/live/(?P<id>\d+)"
_TEST = { _TEST = {
'url': 'https://live.acfun.cn/live/36782183', "url": "https://live.acfun.cn/live/36782183",
'only_matching': True, "only_matching": True,
'info_dict': { "info_dict": {
'id': '36782183', "id": "36782183",
'ext': 'mp4', "ext": "mp4",
# 'title': '看见兔兔就烦!', # 'title': '看见兔兔就烦!',
'is_live': True, "is_live": True,
} },
} }
def _real_extract(self, url): def _real_extract(self, url):
live_id = self._match_id(url) live_id = self._match_id(url)
self._FAKE_HEADERS.update({ self._FAKE_HEADERS.update({"Referer": url})
'Referer': url
})
# Firstly get _did cookie # Firstly get _did cookie
fisrt_req = sanitized_Request(url, headers=self._FAKE_HEADERS) fisrt_req = sanitized_Request(url, headers=self._FAKE_HEADERS)
first_res = compat_urllib_request.urlopen(fisrt_req) first_res = compat_urllib_request.urlopen(fisrt_req)
for header_name, header_value in first_res.info().items(): for header_name, header_value in first_res.info().items():
if header_name.lower() == 'set-cookie': if header_name.lower() == "set-cookie":
cookies = header_value cookies = header_value
if not cookies: if not cookies:
raise ExtractorError('Fail to fetch cookies') raise ExtractorError("Fail to fetch cookies")
cookies_dict = dict(c.strip(' ,').split('=', 1) for c in cookies.split(';')) cookies_dict = dict(c.strip(" ,").split("=", 1) for c in cookies.split(";"))
did_cookie = cookies_dict['_did'] did_cookie = cookies_dict["_did"]
self._FAKE_HEADERS.update({ self._FAKE_HEADERS.update({"Cookie": "_did=%s" % did_cookie})
'Cookie': '_did=%s' % did_cookie
})
# Login to get userId and acfun.api.visitor_st # Login to get userId and acfun.api.visitor_st
login_data = compat_urllib_parse_urlencode({'sid': 'acfun.api.visitor'}).encode('ascii') login_data = compat_urllib_parse_urlencode({"sid": "acfun.api.visitor"}).encode(
"ascii"
)
login_json = self._download_json( login_json = self._download_json(
'https://id.app.acfun.cn/rest/app/visitor/login', "https://id.app.acfun.cn/rest/app/visitor/login",
live_id, live_id,
data=login_data, data=login_data,
headers=self._FAKE_HEADERS) headers=self._FAKE_HEADERS,
)
streams_url = "https://api.kuaishouzt.com/rest/zt/live/web/startPlay?subBiz=mainApp&kpn=ACFUN_APP&kpf=PC_WEB&userId=%d&did=%s&acfun.api.visitor_st=%s" % ( streams_url = (
login_json['userId'], "https://api.kuaishouzt.com/rest/zt/live/web/startPlay?subBiz=mainApp&kpn=ACFUN_APP&kpf=PC_WEB&userId=%d&did=%s&acfun.api.visitor_st=%s"
did_cookie, login_json['acfun.api.visitor_st']) % (login_json["userId"], did_cookie, login_json["acfun.api.visitor_st"])
)
# Fetch stream lists # Fetch stream lists
fetch_streams_data = compat_urllib_parse_urlencode({ fetch_streams_data = compat_urllib_parse_urlencode(
'authorId': int_or_none(live_id), {"authorId": int_or_none(live_id), "pullStreamType": "FLV"}
'pullStreamType': 'FLV' ).encode("ascii")
}).encode('ascii')
streams_json = self._download_json( streams_json = self._download_json(
streams_url, streams_url, live_id, data=fetch_streams_data, headers=self._FAKE_HEADERS
live_id, )
data=fetch_streams_data,
headers=self._FAKE_HEADERS)
# print(streams_json) # print(streams_json)
title = streams_json['data']['caption'] title = streams_json["data"]["caption"]
streams_info = json.loads(streams_json['data']['videoPlayRes']) # streams info streams_info = json.loads(streams_json["data"]["videoPlayRes"]) # streams info
representation = streams_info['liveAdaptiveManifest'][0]['adaptationSet']['representation'] representation = streams_info["liveAdaptiveManifest"][0]["adaptationSet"][
"representation"
]
formats = [] formats = []
for stream in representation: for stream in representation:
quality = stream["qualityType"] formats += [
formats += [{ {
'url': stream["url"], "url": stream["url"],
'ext': 'mp4', "ext": "mp4",
'tbr': stream.get('bitrate'), "tbr": stream.get("bitrate"),
}] }
]
self._sort_formats(formats) self._sort_formats(formats)
return { return {
'id': live_id, "id": live_id,
'title': self._live_title(title), "title": self._live_title(title),
'formats': formats, "formats": formats,
'is_live': True "is_live": True,
} }