近几年因为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 Threadimport requests
import time
import json
import keyboardimport 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 EDITCRCPOLYNOMIAL = 0xEDB88320
crctable = [0 for x in range(256)]def create_table():for i in range(256):crcreg = ifor _ in range(8):if (crcreg & 1) != 0:crcreg = CRCPOLYNOMIAL ^ (crcreg >> 1)else:crcreg = crcreg >> 1crctable[i] = crcregdef crc32(string):crcstart = 0xFFFFFFFFfor i in range(len(str(string))):index = (crcstart ^ ord(str(string)[i])) & 255crcstart = (crcstart >> 8) ^ crctable[index]return crcstartdef crc32_last_index(string):crcstart = 0xFFFFFFFFfor i in range(len(str(string))):index = (crcstart ^ ord(str(string)[i])) & 255crcstart = (crcstart >> 8) ^ crctable[index]return indexdef get_crc_index(t):for i in range(256):if crctable[i] >> 24 == t:return ireturn -1def 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 = 0ht = int(f"0x{danmu['midHash']}", 16) ^ 0xfffffffffor 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]:breakif i == 100000000:return -1danmu['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).textexcept:output_log("E", "无法验证您的cookies.. 请检查您的网络设置,若您开启了代理请先关闭代理。")breakif check_cookie == """{"code":0,"message":"0","ttl":1,"data":{}}""":open("cookies.txt", "w+", encoding="utf-8")print("校验失败,请检查cookies是否过期并及时更新您的cookies。")continuereturn cookiesexcept: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).textdata = 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_infoelse: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_infoexcept:continuedef 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 bviddef 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_danmuurl = 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.contentoutput_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_FLAGfor t in tlist:STOP_FLAG = Truetry:_async_raise(t.ident, SystemExit)output_log("STOP", t)except:passdef makedirs(folder):"""创建必要文件夹:param folder: 文件夹名称"""if not os.path.exists(folder):os.makedirs(folder)def output(msg):"""输出结果并同步输出到文件中:param msg: 内容"""global gfprint(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_danmucookies = check_cookies()while True:url = input("bvid&url> ")try:bvid = get_bvid(url)output_log("BVID", bvid)breakexcept:if input("[?] 无法匹配到该视频,你是否需要匹配番剧?(n/*)") == "n":continuetry:bvid = get_ep_key(url)breakexcept:output_log("E", "无法找到此番剧。")continueoutput_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 = Falsecrack_list = []ftext = input("搜索弹幕> ")if ftext == "":print("你没有输入任何关键词,请输入关键词后检索!\n若需要检索全部弹幕,请输入'all'")if input() != "all":continueflist = []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":continuestart_time = time.time()tlist = []for danmu in flist:if STOP_FLAG:breakcreate_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":breakprint_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)