from flask import Flask, request, jsonify
SUBTITLE_HEADER = "subc"
EXAMPLE_SIGNATURE = "此处替换为客户调用StartSubtitle接口传入的signature即可"
def __init__(self, type: str, data: list):
def __init__(self, text: str, language: str, user_id: str, sequence: int, definite: bool, paragraph: bool):
self.language = language
self.sequence = sequence
self.definite = definite
self.paragraph = paragraph
def parse_subtitle_message(message: str) -> SubtitleMessage:
decoded_data = base64.b64decode(message)
raise ValueError(f"Base64 decoding failed: {e}")
if len(decoded_data) < 8:
raise ValueError("Data invalid: length is less than 8 bytes")
magic_number = decoded_data[:4].decode() # 前4个字节为 magic number
if magic_number != SUBTITLE_HEADER:
raise ValueError(f"Invalid magic number. Expected '{SUBTITLE_HEADER}', but got '{magic_number}'")
# 提取字幕消息长度(4字节,Big-endian)
length = struct.unpack(">I", decoded_data[4:8])[0]
if len(decoded_data) != length + 8:
raise ValueError(f"Size mismatch. Expected {length + 8}, but got {len(decoded_data)}")
subtitle_message_data = decoded_data[8:]
subtitle_message_dict = json.loads(subtitle_message_data)
raise ValueError(f"JSON parsing failed: {e}")
if subtitle_message_dict.get("type") != "subtitle":
raise ValueError(f"Invalid type. Expected 'subtitle', but got '{subtitle_message_dict.get('type')}'")
data_list = subtitle_message_dict.get("data", [])
subtitle_data_objects = [
language=item.get("language"),
user_id=item.get("userId"),
sequence=item.get("sequence"),
definite=item.get("definite"),
paragraph=item.get("paragraph")
return SubtitleMessage(type=subtitle_message_dict["type"], data=subtitle_data_objects)
@app.route("/", methods=["POST"])
request_data = request.get_json(force=True)
message = request_data.get("message")
signature = request_data.get("signature")
print(f"Request JSON parsing failed: {e}")
return jsonify({"error": "Invalid request format"}), 400
if signature != EXAMPLE_SIGNATURE:
print("Signature mismatch")
return jsonify({"error": "Unauthorized"}), 403
subtitle_message = parse_subtitle_message(message)
print("Parsed subtitle message:", subtitle_message)
for subtitle_data in subtitle_message.data:
print(f"[Subtitle] Text: {subtitle_data.text}, Language: {subtitle_data.language}, "
f"User ID: {subtitle_data.user_id}, Sequence: {subtitle_data.sequence}, "
f"Definite: {subtitle_data.definite}, Paragraph: {subtitle_data.paragraph}")
return jsonify({"status": "ok"}), 200
print(f"Subtitle message parsing failed: {e}")
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":