增加优酷弹幕下载以及其他改进

This commit is contained in:
xhlove
2020-01-11 17:57:51 +08:00
parent 78083c2295
commit 11edd6dfad
10 changed files with 258 additions and 39 deletions

View File

@@ -3,7 +3,7 @@
'''
# 作者: weimo
# 创建日期: 2020-01-04 19:14:41
# 上次编辑时间: 2020-01-05 14:45:17
# 上次编辑时间 : 2020-01-11 17:23:32
# 一个人的命运啊,当然要靠自我奋斗,但是...
'''
@@ -14,7 +14,6 @@ from zlib import decompress
from xmltodict import parse
from basic.vars import iqiyiplayer
from basic.ass import check_content
from pfunc.dump_to_ass import check_file, write_one_video_subtitles
from pfunc.request_info import get_vinfos, get_vinfos_by_url, get_vinfo_by_tvid
@@ -48,7 +47,6 @@ def get_danmu_by_tvid(name, duration, tvid):
continue
# with open("raw_xml.json", "w", encoding="utf-8") as f:
# f.write(json.dumps(parse(raw_xml), ensure_ascii=False, indent=4))
contents = []
if entry.__class__ != list:
entry = [entry]
for comment in entry:
@@ -58,13 +56,8 @@ def get_danmu_by_tvid(name, duration, tvid):
if bulletInfo.__class__ != list:
bulletInfo = [bulletInfo]
for info in bulletInfo:
content = check_content(info["content"], contents)
if content is None:
continue
else:
contents.append(content)
color = [info["color"]]
comments.append([content, color, int(comment["int"])])
comments.append([info["content"], color, int(comment["int"])])
print("已下载{:.2f}%".format(index * timestamp * 100 / duration))
index += 1
comments = sorted(comments, key=lambda _: _[-1])
@@ -93,8 +86,8 @@ def main(args):
flag, file_path = check_file(name, skip=args.y)
if flag is False:
print("跳过{}".format(name))
return
continue
comments = get_danmu_by_tvid(name, duration, tvid)
write_one_video_subtitles(file_path, comments, args)
comments = write_one_video_subtitles(file_path, comments, args)
subtitles.update({file_path:comments})
return subtitles

View File

@@ -3,7 +3,7 @@
'''
# 作者: weimo
# 创建日期: 2020-01-04 19:14:37
# 上次编辑时间: 2020-01-05 14:47:36
# 上次编辑时间 : 2020-01-11 17:25:34
# 一个人的命运啊,当然要靠自我奋斗,但是...
'''
@@ -13,7 +13,6 @@ import json
import requests
from basic.vars import qqlive
from basic.ass import check_content
from pfunc.dump_to_ass import check_file, write_one_video_subtitles
from pfunc.request_info import get_all_vids_by_cid as get_vids
from pfunc.request_info import get_danmu_target_id_by_vid as get_target_id
@@ -80,13 +79,7 @@ def get_danmu_by_target_id(vid: str, duration: int, target_id, font="微软雅
# timestamp不变 再试一次
continue
danmu_count = danmu["count"]
contents = []
for comment in danmu["comments"]:
content = check_content(comment["content"], contents)
if content is None:
continue
else:
contents.append(content)
if comment["content_style"]:
style = json.loads(comment["content_style"])
if style.get("gradient_colors"):
@@ -97,7 +90,7 @@ def get_danmu_by_target_id(vid: str, duration: int, target_id, font="微软雅
color = ["ffffff"]
else:
color = ["ffffff"]
comments.append([content, color, comment["timepoint"]])
comments.append([comment["content"], color, comment["timepoint"]])
print("已下载{:.2f}%".format(params["timestamp"]*100/duration))
params["timestamp"] += 30
comments = sorted(comments, key=lambda _: _[-1])
@@ -157,8 +150,11 @@ def main(args):
vinfos = get_video_info_by_vid(vids)
subtitles = {}
for vinfo in vinfos:
comments, file_path = get_one_subtitle_by_vinfo(vinfo, args.font, args.font_size, args.y)
write_one_video_subtitles(file_path, comments, args)
infos = get_one_subtitle_by_vinfo(vinfo, args.font, args.font_size, args.y)
if infos is None:
continue
comments, file_path = infos
comments = write_one_video_subtitles(file_path, comments, args)
subtitles.update({file_path:comments})
return subtitles

141
sites/youku.py Normal file
View File

@@ -0,0 +1,141 @@
#!/usr/bin/env python3.7
# coding=utf-8
'''
# 作者: weimo
# 创建日期: 2020-01-05 14:52:21
# 上次编辑时间 : 2020-01-11 17:53:14
# 一个人的命运啊,当然要靠自我奋斗,但是...
'''
import re
import time
import json
import base64
import requests
from basic.vars import chrome
from pfunc.dump_to_ass import check_file, write_one_video_subtitles
from pfunc.cfunc import yk_msg_sign, yk_t_sign
from pfunc.request_info import get_vinfos_by_show_id, get_vinfos_by_video_id, get_vinfos_by_url_youku
def get_tk_enc():
"""
获取优酷的_m_h5_tk和_m_h5_tk_enc
"""
api_url = "https://acs.youku.com/h5/mtop.com.youku.aplatform.weakget/1.0/?jsv=2.5.1&appKey=24679788"
try:
r = requests.get(api_url, headers=chrome, timeout=5)
except Exception as e:
return
tk_enc = dict(r.cookies)
if tk_enc.get("_m_h5_tk_enc") and tk_enc.get("_m_h5_tk"):
return tk_enc
return
def get_cna():
api_url = "https://log.mmstat.com/eg.js"
try:
r = requests.get(api_url, headers=chrome, timeout=5)
except Exception as e:
return
cookies = dict(r.cookies)
if cookies.get("cna"):
return cookies["cna"]
return
def get_danmu_by_mat(vid, cna, mat: int, comments: list):
api_url = "https://acs.youku.com/h5/mopen.youku.danmu.list/1.0/"
tm = str(int(time.time() * 1000))
msg = {
"ctime": tm,
"ctype": 10004,
"cver": "v1.0",
"guid": cna,
"mat": mat,
"mcount": 1,
"pid": 0,
"sver": "3.1.0",
"type": 1,
"vid": vid}
msg_b64encode = base64.b64encode(json.dumps(msg, separators=(',', ':')).encode("utf-8")).decode("utf-8")
msg.update({"msg":msg_b64encode})
msg.update({"sign":yk_msg_sign(msg_b64encode)})
# 测试发现只要有Cookie的_m_h5_tk和_m_h5_tk_enc就行
tk_enc = get_tk_enc()
if tk_enc is None:
return
headers = {
"Content-Type":"application/x-www-form-urlencoded",
"Cookie":";".join([k + "=" + v for k, v in tk_enc.items()]),
"Referer": "https://v.youku.com"
}
headers.update(chrome)
t = str(int(time.time() * 1000))
data = json.dumps(msg, separators=(',', ':'))
params = {
"jsv":"2.5.6",
"appKey":"24679788",
"t":t,
"sign":yk_t_sign(tk_enc["_m_h5_tk"][:32], t, "24679788", data),
"api":"mopen.youku.danmu.list",
"v":"1.0",
"type":"originaljson",
"dataType":"jsonp",
"timeout":"20000",
"jsonpIncPrefix":"utility"
}
try:
r = requests.post(api_url, params=params, data={"data":data}, headers=headers, timeout=5).content.decode("utf-8")
except Exception as e:
print("youku danmu request failed.", e)
return "once again"
result = json.loads(json.loads(r)["data"]["result"])["data"]["result"]
for item in result:
comment = item["content"]
c_int = json.loads(item["propertis"])["color"]
if c_int.__class__ == str:
c_int = int(c_int)
color = hex(c_int)[2:].zfill(6)
timepoint = item["playat"] / 1000
comments.append([comment, [color], timepoint])
return comments
def main(args):
cna = get_cna()
if cna is None:
# 放前面 免得做无用功
return
isall = False
if args.series:
isall = True
vinfos = []
if args.url:
vi = get_vinfos_by_url_youku(args.url, isall=isall)
if vi:
vinfos += vi
if args.vid:
vi = get_vinfos_by_video_id(args.vid, isall=isall)
if vi:
vinfos += vi
subtitles = {}
for name, duration, video_id in vinfos:
print(name, "开始下载...")
flag, file_path = check_file(name, skip=args.y)
if flag is False:
print("跳过{}".format(name))
continue
max_mat = duration // 60 + 1
comments = []
for mat in range(max_mat):
result = get_danmu_by_mat(video_id, cna, mat + 1, comments)
if result is None:
continue
elif result == "once again":
# 可能改成while好点
result = get_danmu_by_mat(video_id, cna, mat + 1, comments)
if result is None:
continue
comments = result
print("已下载{}/{}".format(mat + 1, max_mat))
comments = write_one_video_subtitles(file_path, comments, args)
subtitles.update({file_path:comments})
return subtitles