近几年因为B站的门槛越来越低,时常会看到一些让人眼前一亮的弹幕。直接举报拉黑这种做法显然已经太便宜了、、
网上大部分查询工具时效性已经过了或者有局限性,所以我打算自己写一款能通过视频、分P视频、番剧来查询弹幕发送者的工具,输入视频链接就能查询。
当然工具我已经放进了GITHUB,可前往https://github.com/cwuom/GetDanmuSender查看!
这里贴出程序运行结果:
注: 'xxx'是为了保护隐私,可直接去github上看
全部弹幕信息已构造完成,请输入关键字(你想要搜索的弹幕内容)来检索弹幕。 若要搜索全部弹幕,请先回车后再输入all来搜索
搜索弹幕> 别再回忆了,好水
检索到弹幕 -> 别再回忆了,好水 ...
按下回车进行midHash逆向操作(UID反推)。这可能需要一点时间.. 'n'取消
cracking -> 40357a2c
==========================
弹幕内容: 别再回忆了,好水
发送时间: 2022-11-25 17:35:33
字体大小: 18
弹幕类型: 普通弹幕
发送者UID: 503xxx7312
发送者主页连接: https://space.bilibili.com/503xxx312
==========================
所有UID反推成功,耗时1.03秒
注意事项👀
使用代理
若您在打开代理的环境下使用本程序,您需要注意以下几点(这里用Clash for Windows举例)
-
关闭系统代理模式(System Proxy),这可能会导致程序无法访问API
-
若您关闭了系统代理模式(System Proxy)无法正常上网,请尝试点亮小地球(Service Mode)
-
若还是无法正常联网,请通过Issues来阐述具体情况(除程序外的软件、网站访问情况或是代理规则等)
报错、闪退
-
若遇到这些问题,请先将程序闲置几个小时来排除风控的可能。若在闲置后问题依旧复发,请通过Issues告诉我复现方式(视频链接、网络环境、运行环境、操作系统等)。
-
若您用的是打包版本(exe),您可以通过在运行目录打开命令窗口后输入{软件名称}.exe来运行。在此环境下,报错后不会直接闪退而是会出现具体的报错内容。请将报错内容截图或以文字形式提供给我我才能更好的解决问题。
返回UID一定正确吗?
-
因为弹幕文件的mid是通过crc32校验得到的结果转为16进制数,一般无法逆向。但在查询后得知还是有类似的反推算法的,此算法作者也在文档中说明“Sometimes the results are inaccurate”,经过核实B站最新的16位mid以及超过10位以上的mid被加密后都无法正常反推出原有数据。但8、9位UID的返回结果基本正确。所以此程序只能保证大部分用户发送的弹幕中mid_hash逆向结果是正确的。若真的要查成分也需进一步核实,若因为此程序造成的误伤后果自负!
声明
-
一切开发皆在学习,请勿用于非法用途
如果做的可以的话麻烦点个STAR啦,谢谢
这里同样贴出源码:
main.py
# -*- coding: utf-8 -*-
import ctypes
import math
import inspect
import os
import random
import re
from threading import Thread
import requests
import time
import json
import keyboard
import bili_pb2
"""
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
B站弹幕解析,支持解析番剧/分P视频/普通视频的全部弹幕并反推发送者UID
如何使用?
1. 程序在运行时会检测cookies可用性。请不要使用代理,这可能会让你无法通过cookies验证
2. 直接复制视频/番剧URL回车执行解析操作...
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
bilibili@im-cwuom(uid:473400804)
follow to get more
"""
# 保证每一次运行headers都不一样
user_agent_list = [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/61.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
]
headers = {'User-Agent': random.choice(user_agent_list)}
crack_list = [] # 逆向mid后的弹幕数据
all_danmu = [] # 全部弹幕数据
tlist = [] # 存储逆向线程,用于提前终止逆向操作
STOP_FLAG = False # 终止标签
gf = 0 # 写入检索弹幕并逆向mid后的结果
# ==================== output-log ====================
# You must initialize logging, otherwise you'll not see debug output.
# http.client.HTTPConnection.debuglevel = 1
# logging.basicConfig(level=logging.DEBUG)
# logging.getLogger().setLevel(logging.DEBUG)
# requests_log = logging.getLogger("requests.packages.urllib3")
# requests_log.setLevel(logging.DEBUG)
# requests_log.propagate = True
# ==================== crc32-crack ====================
# from - https://github.com/Aruelius/crc32-crack
# DO NOT EDIT
CRCPOLYNOMIAL = 0xEDB88320
crctable = [0 for x in range(256)]
def create_table():
for i in range(256):
crcreg = i
for _ in range(8):
if (crcreg & 1) != 0:
crcreg = CRCPOLYNOMIAL ^ (crcreg >> 1)
else:
crcreg = crcreg >> 1
crctable[i] = crcreg
def crc32(string):
crcstart = 0xFFFFFFFF
for i in range(len(str(string))):
index = (crcstart ^ ord(str(string)[i])) & 255
crcstart = (crcstart >> 8) ^ crctable[index]
return crcstart
def crc32_last_index(string):
crcstart = 0xFFFFFFFF
for i in range(len(str(string))):
index = (crcstart ^ ord(str(string)[i])) & 255
crcstart = (crcstart >> 8) ^ crctable[index]
return index
def get_crc_index(t):
for i in range(256):
if crctable[i] >> 24 == t:
return i
return -1
def deep_check(i, index):
string = ""
hashcode = crc32(i)
tc = hashcode & 0xff ^ index[2]
if not (57 >= tc >= 48):
return [0]
string += str(tc - 48)
hashcode = crctable[index[2]] ^ (hashcode >> 8)
tc = hashcode & 0xff ^ index[1]
if not (57 >= tc >= 48):
return [0]
string += str(tc - 48)
hashcode = crctable[index[1]] ^ (hashcode >> 8)
tc = hashcode & 0xff ^ index[0]
if not (57 >= tc >= 48):
return [0]
string += str(tc - 48)
return [1, string]
def crack(danmu):
print(f"cracking -> {danmu['midHash']}")
index = [0 for _ in range(4)]
i = 0
ht = int(f"0x{danmu['midHash']}", 16) ^ 0xffffffff
for i in range(3, -1, -1):
index[3 - i] = get_crc_index(ht >> (i * 8))
snum = crctable[index[3 - i]]
ht ^= snum >> ((3 - i) * 8)
for i in range(100000000):
lastindex = crc32_last_index(i)
if lastindex == index[3]:
deepCheckData = deep_check(i, index)
if deepCheckData[0]:
break
if i == 100000000:
return -1
danmu['mid'] = f"{i}{deepCheckData[1]}"
crack_list.append(danmu)
# ==================== check-cookies ====================
def check_cookies():
"""
检测cookies的可用性
:return: cookies(dict)
"""
while True:
try:
f = open("cookies.txt", "r", encoding="utf-8")
cookies = f.read()
cookies = convert_cookies_to_dict(cookies)
try:
check_cookie = requests.get("https://api.bilibili.com/x/space/upstat?mid=1", cookies=cookies,
headers=headers).text
except:
output_log("E", "无法验证您的cookies.. 请检查您的网络设置,若您开启了代理请先关闭代理。")
break
if check_cookie == """{"code":0,"message":"0","ttl":1,"data":{}}""":
open("cookies.txt", "w+", encoding="utf-8")
print("校验失败,请检查cookies是否过期并及时更新您的cookies。")
continue
return cookies
except:
f = open("cookies.txt", "w+", encoding="utf-8")
cookies = input("cookies> ")
f.write(cookies)
def convert_cookies_to_dict(cookies):
"""
将输入的cookies转为可识别的字典类型
:param cookies: string
:return: cookies(dict)
"""
cookies = dict([l.split("=", 1) for l in cookies.split("; ")])
return cookies
# ==================== Get-Video-Info ====================
def get_info(bvid, cookies):
"""
获取视频基本信息
:param bvid: BV号(番剧、视频)
:param cookies: cookies(dict)
:return: 视频信息
"""
data = requests.get(f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}",
headers=headers,
cookies=cookies).text
data = json.loads(data)["data"]
video_num = data["videos"]
title = data["title"]
pub_time = time.strftime("%Y-%m-%d", time.localtime(data["pubdate"]))
desc = data["desc"]
danmuku = data["stat"]["danmaku"]
name = data["owner"]["name"]
cid = data["cid"]
duration = data["duration"]
dict_info = {"title": title, "pub_time": pub_time, "desc": desc,
"danmuku": danmuku, "name": name, "cid": cid, "duration": duration}
if int(video_num) == 1:
return dict_info
else:
while True:
try:
page = int(input("此视频为分P视频,请指定一个page\npage> "))
dict_info["cid"] = data["pages"][page - 1]["cid"]
dict_info["title"] = data["pages"][page - 1]["part"]
dict_info["duration"] = data["pages"][page - 1]["duration"]
return dict_info
except:
continue
def get_ep_key(url):
"""
获取番剧bvid
:param url:
:return: 番剧bvid
"""
header = {
"cookie": "_uuid=9D4E10FEF-4CE4-3FD7-CE107-4D1F438110A5229945infoc; buvid3=F94E7751-DA48-4F97-89C9-5A4EE9CF1AA4148817infoc; buvid_fp=F94E7751-DA48-4F97-89C9-5A4EE9CF1AA4148817infoc; video_page_version=v_old_home; blackside_state=1; rpdid=|(J~l|mlYku|0J'uYJ~~u)~)J; CURRENT_BLACKGAP=1; CURRENT_QUALITY=0; CURRENT_FNVAL=80; innersign=0; b_lsid=1FCBBAF8_17E38C696A6; bsource=search_360; PVID=1; buvid_fp_plain=F94E7751-DA48-4F97-89C9-5A4EE9CF1AA4148817infoc; SESSDATA=68181722%2C1657187087%2C2b3ad%2A11; bili_jct=0e3de1c40e32e00990ca7fb365a3350e; DedeUserID=2036429689; DedeUserID__ckMd5=f4d43c2865058f15; sid=ccvhr5mv; i-wanna-go-back=-1; b_ut=5; fingerprint3=a284a6f2bcfcdf907cfb890ae01472e1; fingerprint=bb4d7ec794b31153738097e6b58d32d4; fingerprint_s=03d24d5903476f4db97405b6daaf39c9; bp_video_offset_2036429689=612909923547040740; bp_t_offset_2036429689=612909923547040740",
"origin": "https://www.bilibili.com",
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'
}
resp = requests.get(url, headers=header)
# (?P<cid>.*?)
obj = re.compile(
r'"bvid":"(?P<bvid>.*?)","cid":(?P<cid>.*?),"cover":"(?P<cover>.*?)",(?P<b>.*?),"link":"(?P<link>.*?)",',
re.S)
result = obj.finditer(resp.text)
for it in result:
link = it.group("link")
if url.find(link) != -1:
bvid = it.group("bvid")
resp.close()
return bvid
def get_bvid(url):
"""
获取一般视频、分P视频的bvid
:param url: 视频地址
:return: 视频bvid
"""
bvid = re.search(r'(BV.*?).{10}', url)
return bvid.group(0)
def get_danmu(cid, segment_index, cookies):
"""
获取全部弹幕并累加到all_danmu
:param cid: oid
:param segment_index: 弹幕分包(6min为一包)
:param cookies: cookies(dict)
"""
global all_danmu
url = f'https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid={cid}&segment_index={segment_index}'
resp = requests.get(url, cookies=cookies, headers=headers)
data = resp.content
output_log("Getting", url)
danmaku_seg = bili_pb2.DmSegMobileReply()
danmaku_seg.ParseFromString(data)
mode_list = ["普通弹幕", "普通弹幕", "普通弹幕", "普通弹幕", "底部弹幕", "顶部弹幕", "逆向弹幕", "高级弹幕",
"代码弹幕", "BAS弹幕(仅限于特殊弹幕专包)"]
for danmu in danmaku_seg.elems:
ctime = time.localtime(danmu.ctime)
add = {"midHash": danmu.midHash, "content": danmu.content, "ctime": time.strftime("%Y-%m-%d %H:%M:%S", ctime),
"fontsize": danmu.fontsize, "mode": mode_list[danmu.mode], "id": danmu.idStr}
all_danmu.append(add)
# ==================== Tools ====================
def output_log(title, text):
"""
输出日志
:param title: 标题
:param text: 内容
"""
print(f"[{title}] {text}")
def print_long_line(t=1):
"""
输出分割线
:param t: 分割线样式
"""
if t == 1:
print("\n==========================\n")
elif t == 2:
print("==========================")
def _async_raise(tid, exctype):
"""
线程杀手,用于提前终止线程
:param tid: t.ident
:param exctype: SystemExit
"""
"""raises the exception, performs cleanup if needed"""
tid = ctypes.c_long(tid)
if not inspect.isclass(exctype):
exctype = type(exctype)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
def StopThread():
"""
终止所有逆向线程
"""
global tlist, STOP_FLAG
for t in tlist:
STOP_FLAG = True
try:
_async_raise(t.ident, SystemExit)
output_log("STOP", t)
except:
pass
def makedirs(folder):
"""
创建必要文件夹
:param folder: 文件夹名称
"""
if not os.path.exists(folder):
os.makedirs(folder)
def output(msg):
"""
输出结果并同步输出到文件中
:param msg: 内容
"""
global gf
print(msg)
gf.write(str(msg) + "\n")
def output_result(danmu):
"""
输出所有逆向后弹幕信息
:param danmu: 弹幕
"""
output("\n==========================")
output(f"弹幕内容: {danmu['content']}")
output(f"发送时间: {danmu['ctime']}")
output(f"字体大小: {danmu['fontsize']}")
output(f"弹幕类型: {danmu['mode']}")
output(f"发送者UID: {danmu['mid']}")
output(f"发送者主页连接: https://space.bilibili.com/{danmu['mid']}")
output("==========================")
def listToJson(lst):
"""
将列表转换为json格式,方便其他程序调用
:param lst: 列表
:return: json(string)
"""
str_json = json.dumps(lst, indent=2, ensure_ascii=False)
return str_json
# ==================================================
def main():
"""
主函数
"""
global crack_list, tlist, STOP_FLAG, gf, all_danmu
cookies = check_cookies()
while True:
url = input("bvid&url> ")
try:
bvid = get_bvid(url)
output_log("BVID", bvid)
break
except:
if input("[?] 无法匹配到该视频,你是否需要匹配番剧?(n/*)") == "n":
continue
try:
bvid = get_ep_key(url)
break
except:
output_log("E", "无法找到此番剧。")
continue
output_log("/", "获取视频/番剧基本信息...")
data = get_info(bvid, cookies)
cid = data["cid"]
title = data["title"]
danmuku = data["danmuku"]
desc = data["desc"]
pub_time = data["pub_time"]
duration = data["duration"]
print_long_line(2)
output_log("CID", cid)
output_log("标题", title)
output_log("弹幕库(?)", danmuku)
output_log("描述", desc)
output_log("视频时长", f"{duration}s")
output_log("发布时间", pub_time)
print_long_line(2)
if input("信息无误?(n/*)") == "n":
main()
output_log("/", "正在获取全部弹幕...")
start_time = time.time()
for i in range(math.ceil(duration / (60 * 6))):
get_danmu(cid, i + 1, cookies)
end_time = time.time()
print(f"弹幕获取完成,耗时{round(end_time - start_time, 2)}秒")
if len(all_danmu) == 0:
output_log("E", "此视频没有任何弹幕,请解析其它视频。")
main()
output_log("danmu_size", len(all_danmu))
f = open(f"DanmuJSON/danmu_list_{bvid}.json", "w", encoding="utf-8")
f.write(listToJson(all_danmu))
f.close()
print(
"\n\n全部弹幕信息已构造完成,请输入关键字(你想要搜索的弹幕内容)来检索弹幕。 若要搜索全部弹幕,请先回车后再输入all来搜索")
while True:
STOP_FLAG = False
crack_list = []
ftext = input("搜索弹幕> ")
if ftext == "":
print("你没有输入任何关键词,请输入关键词后检索!\n若需要检索全部弹幕,请输入'all'")
if input() != "all":
continue
flist = []
gf = open(f"outputs/{ftext}_{bvid}.txt", "a+", encoding="utf-8")
for danmu in all_danmu:
content = danmu["content"]
if content.find(ftext) != -1:
flist.append(danmu)
print(f"检索到弹幕 -> {content} ...")
if input("按下回车进行midHash逆向操作(UID反推)。这可能需要一点时间.. 'n'取消") == "n":
continue
start_time = time.time()
tlist = []
for danmu in flist:
if STOP_FLAG:
break
create_table()
t = Thread(target=crack, args=(danmu,))
t.start()
tlist.append(t)
for t in tlist:
t.join()
end_time = time.time()
for danmu in crack_list:
output_result(danmu)
print(f"所有UID反推成功,耗时{round(end_time - start_time, 2)}秒")
gf.close()
if input("回车继续检索,输入q退出...") == "q":
break
print_long_line()
if __name__ == '__main__':
keyboard.add_hotkey('`', StopThread)
print_long_line(2)
print("GetDanmuSender 1.0b - By cwuom\nbilibili> https://space.bilibili.com/473400804")
print_long_line(2)
makedirs("DanmuJSON")
makedirs("outputs")
main()
bili_pb2.py
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: my.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x08my.proto\x12 bilibili.community.service.dm.v1\"X\n\x0e\x42uzzwordConfig\x12\x46\n\x08keywords\x18\x01 \x03(\x0b\x32\x34.bilibili.community.service.dm.v1.BuzzwordShowConfig\"x\n\x12\x42uzzwordShowConfig\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\x05\x12\n\n\x02id\x18\x04 \x01(\x03\x12\x13\n\x0b\x62uzzword_id\x18\x05 \x01(\x03\x12\x13\n\x0bschema_type\x18\x06 \x01(\x05\"\xa1\x01\n\tCommandDm\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0b\n\x03mid\x18\x03 \x01(\t\x12\x0f\n\x07\x63ommand\x18\x04 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x05 \x01(\t\x12\x10\n\x08progress\x18\x06 \x01(\x05\x12\r\n\x05\x63time\x18\x07 \x01(\t\x12\r\n\x05mtime\x18\x08 \x01(\t\x12\r\n\x05\x65xtra\x18\t \x01(\t\x12\r\n\x05idStr\x18\n \x01(\t\"P\n\rDanmakuAIFlag\x12?\n\x08\x64m_flags\x18\x01 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuFlag\"\xd6\x01\n\x0b\x44\x61nmakuElem\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08progress\x18\x02 \x01(\x05\x12\x0c\n\x04mode\x18\x03 \x01(\x05\x12\x10\n\x08\x66ontsize\x18\x04 \x01(\x05\x12\r\n\x05\x63olor\x18\x05 \x01(\r\x12\x0f\n\x07midHash\x18\x06 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x07 \x01(\t\x12\r\n\x05\x63time\x18\x08 \x01(\x03\x12\x0e\n\x06weight\x18\t \x01(\x05\x12\x0e\n\x06\x61\x63tion\x18\n \x01(\t\x12\x0c\n\x04pool\x18\x0b \x01(\x05\x12\r\n\x05idStr\x18\x0c \x01(\t\x12\x0c\n\x04\x61ttr\x18\r \x01(\x05\")\n\x0b\x44\x61nmakuFlag\x12\x0c\n\x04\x64mid\x18\x01 \x01(\x03\x12\x0c\n\x04\x66lag\x18\x02 \x01(\r\"K\n\x11\x44\x61nmakuFlagConfig\x12\x10\n\x08rec_flag\x18\x01 \x01(\x05\x12\x10\n\x08rec_text\x18\x02 \x01(\t\x12\x12\n\nrec_switch\x18\x03 \x01(\x05\"\xcc\x04\n\x18\x44\x61nmuDefaultPlayerConfig\x12)\n!player_danmaku_use_default_config\x18\x01 \x01(\x08\x12,\n$player_danmaku_ai_recommended_switch\x18\x04 \x01(\x08\x12+\n#player_danmaku_ai_recommended_level\x18\x05 \x01(\x05\x12\x1f\n\x17player_danmaku_blocktop\x18\x06 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockscroll\x18\x07 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockbottom\x18\x08 \x01(\x08\x12$\n\x1cplayer_danmaku_blockcolorful\x18\t \x01(\x08\x12\"\n\x1aplayer_danmaku_blockrepeat\x18\n \x01(\x08\x12#\n\x1bplayer_danmaku_blockspecial\x18\x0b \x01(\x08\x12\x1e\n\x16player_danmaku_opacity\x18\x0c \x01(\x02\x12$\n\x1cplayer_danmaku_scalingfactor\x18\r \x01(\x02\x12\x1d\n\x15player_danmaku_domain\x18\x0e \x01(\x02\x12\x1c\n\x14player_danmaku_speed\x18\x0f \x01(\x05\x12$\n\x1cinline_player_danmaku_switch\x18\x10 \x01(\x08\x12)\n!player_danmaku_senior_mode_switch\x18\x11 \x01(\x05\"\xfe\x05\n\x11\x44\x61nmuPlayerConfig\x12\x1d\n\x15player_danmaku_switch\x18\x01 \x01(\x08\x12\"\n\x1aplayer_danmaku_switch_save\x18\x02 \x01(\x08\x12)\n!player_danmaku_use_default_config\x18\x03 \x01(\x08\x12,\n$player_danmaku_ai_recommended_switch\x18\x04 \x01(\x08\x12+\n#player_danmaku_ai_recommended_level\x18\x05 \x01(\x05\x12\x1f\n\x17player_danmaku_blocktop\x18\x06 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockscroll\x18\x07 \x01(\x08\x12\"\n\x1aplayer_danmaku_blockbottom\x18\x08 \x01(\x08\x12$\n\x1cplayer_danmaku_blockcolorful\x18\t \x01(\x08\x12\"\n\x1aplayer_danmaku_blockrepeat\x18\n \x01(\x08\x12#\n\x1bplayer_danmaku_blockspecial\x18\x0b \x01(\x08\x12\x1e\n\x16player_danmaku_opacity\x18\x0c \x01(\x02\x12$\n\x1cplayer_danmaku_scalingfactor\x18\r \x01(\x02\x12\x1d\n\x15player_danmaku_domain\x18\x0e \x01(\x02\x12\x1c\n\x14player_danmaku_speed\x18\x0f \x01(\x05\x12&\n\x1eplayer_danmaku_enableblocklist\x18\x10 \x01(\x08\x12$\n\x1cinline_player_danmaku_switch\x18\x11 \x01(\x08\x12$\n\x1cinline_player_danmaku_config\x18\x12 \x01(\x05\x12&\n\x1eplayer_danmaku_ios_switch_save\x18\x13 \x01(\x05\x12)\n!player_danmaku_senior_mode_switch\x18\x14 \x01(\x05\"K\n\x18\x44\x61nmuPlayerDynamicConfig\x12\x10\n\x08progress\x18\x01 \x01(\x05\x12\x1d\n\x15player_danmaku_domain\x18\x0e \x01(\x02\"\xb1\x02\n\x15\x44\x61nmuPlayerViewConfig\x12\x61\n\x1d\x64\x61nmuku_default_player_config\x18\x01 \x01(\x0b\x32:.bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig\x12R\n\x15\x64\x61nmuku_player_config\x18\x02 \x01(\x0b\x32\x33.bilibili.community.service.dm.v1.DanmuPlayerConfig\x12\x61\n\x1d\x64\x61nmuku_player_dynamic_config\x18\x03 \x03(\x0b\x32:.bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig\"\xab\x03\n\x14\x44\x61nmuWebPlayerConfig\x12\x11\n\tdm_switch\x18\x01 \x01(\x08\x12\x11\n\tai_switch\x18\x02 \x01(\x08\x12\x10\n\x08\x61i_level\x18\x03 \x01(\x05\x12\x10\n\x08\x62locktop\x18\x04 \x01(\x08\x12\x13\n\x0b\x62lockscroll\x18\x05 \x01(\x08\x12\x13\n\x0b\x62lockbottom\x18\x06 \x01(\x08\x12\x12\n\nblockcolor\x18\x07 \x01(\x08\x12\x14\n\x0c\x62lockspecial\x18\x08 \x01(\x08\x12\x14\n\x0cpreventshade\x18\t \x01(\x08\x12\r\n\x05\x64mask\x18\n \x01(\x08\x12\x0f\n\x07opacity\x18\x0b \x01(\x02\x12\x0e\n\x06\x64marea\x18\x0c \x01(\x05\x12\x11\n\tspeedplus\x18\r \x01(\x02\x12\x10\n\x08\x66ontsize\x18\x0e \x01(\x02\x12\x12\n\nscreensync\x18\x0f \x01(\x08\x12\x11\n\tspeedsync\x18\x10 \x01(\x08\x12\x12\n\nfontfamily\x18\x11 \x01(\t\x12\x0c\n\x04\x62old\x18\x12 \x01(\x08\x12\x12\n\nfontborder\x18\x13 \x01(\x05\x12\x11\n\tdraw_type\x18\x14 \x01(\t\x12\x1a\n\x12senior_mode_switch\x18\x15 \x01(\x05\"A\n\x0f\x44mExpoReportReq\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\r\n\x05spmid\x18\x04 \x01(\t\"\x11\n\x0f\x44mExpoReportRes\"\xfd\x0b\n\x11\x44mPlayerConfigReq\x12\n\n\x02ts\x18\x01 \x01(\x03\x12\x45\n\x06switch\x18\x02 \x01(\x0b\x32\x35.bilibili.community.service.dm.v1.PlayerDanmakuSwitch\x12N\n\x0bswitch_save\x18\x03 \x01(\x0b\x32\x39.bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave\x12[\n\x12use_default_config\x18\x04 \x01(\x0b\x32?.bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig\x12\x61\n\x15\x61i_recommended_switch\x18\x05 \x01(\x0b\x32\x42.bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch\x12_\n\x14\x61i_recommended_level\x18\x06 \x01(\x0b\x32\x41.bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel\x12I\n\x08\x62locktop\x18\x07 \x01(\x0b\x32\x37.bilibili.community.service.dm.v1.PlayerDanmakuBlocktop\x12O\n\x0b\x62lockscroll\x18\x08 \x01(\x0b\x32:.bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll\x12O\n\x0b\x62lockbottom\x18\t \x01(\x0b\x32:.bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom\x12S\n\rblockcolorful\x18\n \x01(\x0b\x32<.bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful\x12O\n\x0b\x62lockrepeat\x18\x0b \x01(\x0b\x32:.bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat\x12Q\n\x0c\x62lockspecial\x18\x0c \x01(\x0b\x32;.bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial\x12G\n\x07opacity\x18\r \x01(\x0b\x32\x36.bilibili.community.service.dm.v1.PlayerDanmakuOpacity\x12S\n\rscalingfactor\x18\x0e \x01(\x0b\x32<.bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor\x12\x45\n\x06\x64omain\x18\x0f \x01(\x0b\x32\x35.bilibili.community.service.dm.v1.PlayerDanmakuDomain\x12\x43\n\x05speed\x18\x10 \x01(\x0b\x32\x34.bilibili.community.service.dm.v1.PlayerDanmakuSpeed\x12W\n\x0f\x65nableblocklist\x18\x11 \x01(\x0b\x32>.bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist\x12^\n\x19inlinePlayerDanmakuSwitch\x18\x12 \x01(\x0b\x32;.bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch\x12[\n\x12senior_mode_switch\x18\x13 \x01(\x0b\x32?.bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch\"/\n\x0b\x44mSegConfig\x12\x11\n\tpage_size\x18\x01 \x01(\x03\x12\r\n\x05total\x18\x02 \x01(\x03\"\xa1\x01\n\x10\x44mSegMobileReply\x12<\n\x05\x65lems\x18\x01 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuElem\x12\r\n\x05state\x18\x02 \x01(\x05\x12@\n\x07\x61i_flag\x18\x03 \x01(\x0b\x32/.bilibili.community.service.dm.v1.DanmakuAIFlag\"g\n\x0e\x44mSegMobileReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x15\n\rsegment_index\x18\x04 \x01(\x03\x12\x16\n\x0eteenagers_mode\x18\x05 \x01(\x05\"]\n\rDmSegOttReply\x12\x0e\n\x06\x63losed\x18\x01 \x01(\x08\x12<\n\x05\x65lems\x18\x02 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuElem\"L\n\x0b\x44mSegOttReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x15\n\rsegment_index\x18\x04 \x01(\x03\"]\n\rDmSegSDKReply\x12\x0e\n\x06\x63losed\x18\x01 \x01(\x08\x12<\n\x05\x65lems\x18\x02 \x03(\x0b\x32-.bilibili.community.service.dm.v1.DanmakuElem\"L\n\x0b\x44mSegSDKReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\x15\n\rsegment_index\x18\x04 \x01(\x03\"\xc2\x05\n\x0b\x44mViewReply\x12\x0e\n\x06\x63losed\x18\x01 \x01(\x08\x12\x39\n\x04mask\x18\x02 \x01(\x0b\x32+.bilibili.community.service.dm.v1.VideoMask\x12\x41\n\x08subtitle\x18\x03 \x01(\x0b\x32/.bilibili.community.service.dm.v1.VideoSubtitle\x12\x13\n\x0bspecial_dms\x18\x04 \x03(\t\x12\x44\n\x07\x61i_flag\x18\x05 \x01(\x0b\x32\x33.bilibili.community.service.dm.v1.DanmakuFlagConfig\x12N\n\rplayer_config\x18\x06 \x01(\x0b\x32\x37.bilibili.community.service.dm.v1.DanmuPlayerViewConfig\x12\x16\n\x0esend_box_style\x18\x07 \x01(\x05\x12\r\n\x05\x61llow\x18\x08 \x01(\x08\x12\x11\n\tcheck_box\x18\t \x01(\t\x12\x1a\n\x12\x63heck_box_show_msg\x18\n \x01(\t\x12\x18\n\x10text_placeholder\x18\x0b \x01(\t\x12\x19\n\x11input_placeholder\x18\x0c \x01(\t\x12\x1d\n\x15report_filter_content\x18\r \x03(\t\x12\x41\n\x0b\x65xpo_report\x18\x0e \x01(\x0b\x32,.bilibili.community.service.dm.v1.ExpoReport\x12I\n\x0f\x62uzzword_config\x18\x0f \x01(\x0b\x32\x30.bilibili.community.service.dm.v1.BuzzwordConfig\x12\x42\n\x0b\x65xpressions\x18\x10 \x03(\x0b\x32-.bilibili.community.service.dm.v1.Expressions\"X\n\tDmViewReq\x12\x0b\n\x03pid\x18\x01 \x01(\x03\x12\x0b\n\x03oid\x18\x02 \x01(\x03\x12\x0c\n\x04type\x18\x03 \x01(\x05\x12\r\n\x05spmid\x18\x04 \x01(\t\x12\x14\n\x0cis_hard_boot\x18\x05 \x01(\x05\"\xec\x03\n\x0e\x44mWebViewReply\x12\r\n\x05state\x18\x01 \x01(\x05\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x11\n\ttext_side\x18\x03 \x01(\t\x12=\n\x06\x64m_sge\x18\x04 \x01(\x0b\x32-.bilibili.community.service.dm.v1.DmSegConfig\x12\x41\n\x04\x66lag\x18\x05 \x01(\x0b\x32\x33.bilibili.community.service.dm.v1.DanmakuFlagConfig\x12\x13\n\x0bspecial_dms\x18\x06 \x03(\t\x12\x11\n\tcheck_box\x18\x07 \x01(\x08\x12\r\n\x05\x63ount\x18\x08 \x01(\x03\x12?\n\ncommandDms\x18\t \x03(\x0b\x32+.bilibili.community.service.dm.v1.CommandDm\x12M\n\rplayer_config\x18\n \x01(\x0b\x32\x36.bilibili.community.service.dm.v1.DanmuWebPlayerConfig\x12\x1d\n\x15report_filter_content\x18\x0b \x03(\t\x12\x42\n\x0b\x65xpressions\x18\x0c \x03(\x0b\x32-.bilibili.community.service.dm.v1.Expressions\"*\n\nExpoReport\x12\x1c\n\x14should_report_at_end\x18\x01 \x01(\x08\"d\n\nExpression\x12\x0f\n\x07keyword\x18\x01 \x03(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x38\n\x06period\x18\x03 \x03(\x0b\x32(.bilibili.community.service.dm.v1.Period\"I\n\x0b\x45xpressions\x12:\n\x04\x64\x61ta\x18\x01 \x03(\x0b\x32,.bilibili.community.service.dm.v1.Expression\"$\n\x06Period\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\"*\n\x19InlinePlayerDanmakuSwitch\x12\r\n\x05value\x18\x01 \x01(\x08\"0\n\x1fPlayerDanmakuAiRecommendedLevel\x12\r\n\x05value\x18\x01 \x01(\x08\"1\n PlayerDanmakuAiRecommendedSwitch\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x18PlayerDanmakuBlockbottom\x12\r\n\x05value\x18\x01 \x01(\x08\"+\n\x1aPlayerDanmakuBlockcolorful\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x18PlayerDanmakuBlockrepeat\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x18PlayerDanmakuBlockscroll\x12\r\n\x05value\x18\x01 \x01(\x08\"*\n\x19PlayerDanmakuBlockspecial\x12\r\n\x05value\x18\x01 \x01(\x08\"&\n\x15PlayerDanmakuBlocktop\x12\r\n\x05value\x18\x01 \x01(\x08\"$\n\x13PlayerDanmakuDomain\x12\r\n\x05value\x18\x01 \x01(\x02\"-\n\x1cPlayerDanmakuEnableblocklist\x12\r\n\x05value\x18\x01 \x01(\x08\"%\n\x14PlayerDanmakuOpacity\x12\r\n\x05value\x18\x01 \x01(\x02\"+\n\x1aPlayerDanmakuScalingfactor\x12\r\n\x05value\x18\x01 \x01(\x02\".\n\x1dPlayerDanmakuSeniorModeSwitch\x12\r\n\x05value\x18\x01 \x01(\x05\"#\n\x12PlayerDanmakuSpeed\x12\r\n\x05value\x18\x01 \x01(\x05\"7\n\x13PlayerDanmakuSwitch\x12\r\n\x05value\x18\x01 \x01(\x08\x12\x11\n\tcanIgnore\x18\x02 \x01(\x08\"(\n\x17PlayerDanmakuSwitchSave\x12\r\n\x05value\x18\x01 \x01(\x08\".\n\x1dPlayerDanmakuUseDefaultConfig\x12\r\n\x05value\x18\x01 \x01(\x08\")\n\x08Response\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\xd8\x01\n\x0cSubtitleItem\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0e\n\x06id_str\x18\x02 \x01(\t\x12\x0b\n\x03lan\x18\x03 \x01(\t\x12\x0f\n\x07lan_doc\x18\x04 \x01(\t\x12\x14\n\x0csubtitle_url\x18\x05 \x01(\t\x12:\n\x06\x61uthor\x18\x06 \x01(\x0b\x32*.bilibili.community.service.dm.v1.UserInfo\x12<\n\x04type\x18\x07 \x01(\x0e\x32..bilibili.community.service.dm.v1.SubtitleType\"\\\n\x08UserInfo\x12\x0b\n\x03mid\x18\x01 \x01(\x03\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0b\n\x03sex\x18\x03 \x01(\t\x12\x0c\n\x04\x66\x61\x63\x65\x18\x04 \x01(\t\x12\x0c\n\x04sign\x18\x05 \x01(\t\x12\x0c\n\x04rank\x18\x06 \x01(\x05\"S\n\tVideoMask\x12\x0b\n\x03\x63id\x18\x01 \x01(\x03\x12\x0c\n\x04plat\x18\x02 \x01(\x05\x12\x0b\n\x03\x66ps\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x03\x12\x10\n\x08mask_url\x18\x05 \x01(\t\"o\n\rVideoSubtitle\x12\x0b\n\x03lan\x18\x01 \x01(\t\x12\x0e\n\x06lanDoc\x18\x02 \x01(\t\x12\x41\n\tsubtitles\x18\x03 \x03(\x0b\x32..bilibili.community.service.dm.v1.SubtitleItem*L\n\tDMAttrBit\x12\x14\n\x10\x44MAttrBitProtect\x10\x00\x12\x15\n\x11\x44MAttrBitFromLive\x10\x01\x12\x12\n\x0e\x44MAttrHighLike\x10\x02*\x1e\n\x0cSubtitleType\x12\x06\n\x02\x43\x43\x10\x00\x12\x06\n\x02\x41I\x10\x01\x32\xa0\x05\n\x02\x44M\x12s\n\x0b\x44mSegMobile\x12\x30.bilibili.community.service.dm.v1.DmSegMobileReq\x1a\x32.bilibili.community.service.dm.v1.DmSegMobileReply\x12\x64\n\x06\x44mView\x12+.bilibili.community.service.dm.v1.DmViewReq\x1a-.bilibili.community.service.dm.v1.DmViewReply\x12q\n\x0e\x44mPlayerConfig\x12\x33.bilibili.community.service.dm.v1.DmPlayerConfigReq\x1a*.bilibili.community.service.dm.v1.Response\x12j\n\x08\x44mSegOtt\x12-.bilibili.community.service.dm.v1.DmSegOttReq\x1a/.bilibili.community.service.dm.v1.DmSegOttReply\x12j\n\x08\x44mSegSDK\x12-.bilibili.community.service.dm.v1.DmSegSDKReq\x1a/.bilibili.community.service.dm.v1.DmSegSDKReply\x12t\n\x0c\x44mExpoReport\x12\x31.bilibili.community.service.dm.v1.DmExpoReportReq\x1a\x31.bilibili.community.service.dm.v1.DmExpoReportResb\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'my_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
_DMATTRBIT._serialized_start=8213
_DMATTRBIT._serialized_end=8289
_SUBTITLETYPE._serialized_start=8291
_SUBTITLETYPE._serialized_end=8321
_BUZZWORDCONFIG._serialized_start=46
_BUZZWORDCONFIG._serialized_end=134
_BUZZWORDSHOWCONFIG._serialized_start=136
_BUZZWORDSHOWCONFIG._serialized_end=256
_COMMANDDM._serialized_start=259
_COMMANDDM._serialized_end=420
_DANMAKUAIFLAG._serialized_start=422
_DANMAKUAIFLAG._serialized_end=502
_DANMAKUELEM._serialized_start=505
_DANMAKUELEM._serialized_end=719
_DANMAKUFLAG._serialized_start=721
_DANMAKUFLAG._serialized_end=762
_DANMAKUFLAGCONFIG._serialized_start=764
_DANMAKUFLAGCONFIG._serialized_end=839
_DANMUDEFAULTPLAYERCONFIG._serialized_start=842
_DANMUDEFAULTPLAYERCONFIG._serialized_end=1430
_DANMUPLAYERCONFIG._serialized_start=1433
_DANMUPLAYERCONFIG._serialized_end=2199
_DANMUPLAYERDYNAMICCONFIG._serialized_start=2201
_DANMUPLAYERDYNAMICCONFIG._serialized_end=2276
_DANMUPLAYERVIEWCONFIG._serialized_start=2279
_DANMUPLAYERVIEWCONFIG._serialized_end=2584
_DANMUWEBPLAYERCONFIG._serialized_start=2587
_DANMUWEBPLAYERCONFIG._serialized_end=3014
_DMEXPOREPORTREQ._serialized_start=3016
_DMEXPOREPORTREQ._serialized_end=3081
_DMEXPOREPORTRES._serialized_start=3083
_DMEXPOREPORTRES._serialized_end=3100
_DMPLAYERCONFIGREQ._serialized_start=3103
_DMPLAYERCONFIGREQ._serialized_end=4636
_DMSEGCONFIG._serialized_start=4638
_DMSEGCONFIG._serialized_end=4685
_DMSEGMOBILEREPLY._serialized_start=4688
_DMSEGMOBILEREPLY._serialized_end=4849
_DMSEGMOBILEREQ._serialized_start=4851
_DMSEGMOBILEREQ._serialized_end=4954
_DMSEGOTTREPLY._serialized_start=4956
_DMSEGOTTREPLY._serialized_end=5049
_DMSEGOTTREQ._serialized_start=5051
_DMSEGOTTREQ._serialized_end=5127
_DMSEGSDKREPLY._serialized_start=5129
_DMSEGSDKREPLY._serialized_end=5222
_DMSEGSDKREQ._serialized_start=5224
_DMSEGSDKREQ._serialized_end=5300
_DMVIEWREPLY._serialized_start=5303
_DMVIEWREPLY._serialized_end=6009
_DMVIEWREQ._serialized_start=6011
_DMVIEWREQ._serialized_end=6099
_DMWEBVIEWREPLY._serialized_start=6102
_DMWEBVIEWREPLY._serialized_end=6594
_EXPOREPORT._serialized_start=6596
_EXPOREPORT._serialized_end=6638
_EXPRESSION._serialized_start=6640
_EXPRESSION._serialized_end=6740
_EXPRESSIONS._serialized_start=6742
_EXPRESSIONS._serialized_end=6815
_PERIOD._serialized_start=6817
_PERIOD._serialized_end=6853
_INLINEPLAYERDANMAKUSWITCH._serialized_start=6855
_INLINEPLAYERDANMAKUSWITCH._serialized_end=6897
_PLAYERDANMAKUAIRECOMMENDEDLEVEL._serialized_start=6899
_PLAYERDANMAKUAIRECOMMENDEDLEVEL._serialized_end=6947
_PLAYERDANMAKUAIRECOMMENDEDSWITCH._serialized_start=6949
_PLAYERDANMAKUAIRECOMMENDEDSWITCH._serialized_end=6998
_PLAYERDANMAKUBLOCKBOTTOM._serialized_start=7000
_PLAYERDANMAKUBLOCKBOTTOM._serialized_end=7041
_PLAYERDANMAKUBLOCKCOLORFUL._serialized_start=7043
_PLAYERDANMAKUBLOCKCOLORFUL._serialized_end=7086
_PLAYERDANMAKUBLOCKREPEAT._serialized_start=7088
_PLAYERDANMAKUBLOCKREPEAT._serialized_end=7129
_PLAYERDANMAKUBLOCKSCROLL._serialized_start=7131
_PLAYERDANMAKUBLOCKSCROLL._serialized_end=7172
_PLAYERDANMAKUBLOCKSPECIAL._serialized_start=7174
_PLAYERDANMAKUBLOCKSPECIAL._serialized_end=7216
_PLAYERDANMAKUBLOCKTOP._serialized_start=7218
_PLAYERDANMAKUBLOCKTOP._serialized_end=7256
_PLAYERDANMAKUDOMAIN._serialized_start=7258
_PLAYERDANMAKUDOMAIN._serialized_end=7294
_PLAYERDANMAKUENABLEBLOCKLIST._serialized_start=7296
_PLAYERDANMAKUENABLEBLOCKLIST._serialized_end=7341
_PLAYERDANMAKUOPACITY._serialized_start=7343
_PLAYERDANMAKUOPACITY._serialized_end=7380
_PLAYERDANMAKUSCALINGFACTOR._serialized_start=7382
_PLAYERDANMAKUSCALINGFACTOR._serialized_end=7425
_PLAYERDANMAKUSENIORMODESWITCH._serialized_start=7427
_PLAYERDANMAKUSENIORMODESWITCH._serialized_end=7473
_PLAYERDANMAKUSPEED._serialized_start=7475
_PLAYERDANMAKUSPEED._serialized_end=7510
_PLAYERDANMAKUSWITCH._serialized_start=7512
_PLAYERDANMAKUSWITCH._serialized_end=7567
_PLAYERDANMAKUSWITCHSAVE._serialized_start=7569
_PLAYERDANMAKUSWITCHSAVE._serialized_end=7609
_PLAYERDANMAKUUSEDEFAULTCONFIG._serialized_start=7611
_PLAYERDANMAKUUSEDEFAULTCONFIG._serialized_end=7657
_RESPONSE._serialized_start=7659
_RESPONSE._serialized_end=7700
_SUBTITLEITEM._serialized_start=7703
_SUBTITLEITEM._serialized_end=7919
_USERINFO._serialized_start=7921
_USERINFO._serialized_end=8013
_VIDEOMASK._serialized_start=8015
_VIDEOMASK._serialized_end=8098
_VIDEOSUBTITLE._serialized_start=8100
_VIDEOSUBTITLE._serialized_end=8211
_DM._serialized_start=8324
_DM._serialized_end=8996
# @@protoc_insertion_point(module_scope)