1. добавил в gitigove .env
2. /vmix - генерируется проект vMix с нужными линками для виртуальных машин
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
/__pycache__
|
||||
/TestJson
|
||||
/logs/*
|
||||
*.venv
|
||||
*.venv
|
||||
*.env
|
||||
120
get_data.py
120
get_data.py
@@ -1,22 +1,20 @@
|
||||
from fastapi import FastAPI
|
||||
from fastapi.responses import Response, HTMLResponse
|
||||
from fastapi import HTTPException
|
||||
from fastapi import Request
|
||||
from fastapi import FastAPI, HTTPException, Request
|
||||
from fastapi.responses import Response, HTMLResponse, FileResponse, StreamingResponse
|
||||
from typing import Dict, Any
|
||||
from contextlib import asynccontextmanager
|
||||
import requests
|
||||
import threading
|
||||
import time
|
||||
import queue
|
||||
import requests, uvicorn, json
|
||||
import threading, queue
|
||||
import argparse
|
||||
import uvicorn
|
||||
import os
|
||||
import pandas as pd
|
||||
import json
|
||||
from datetime import datetime, time as dtime, timedelta
|
||||
from fastapi.responses import Response
|
||||
import logging
|
||||
import logging.config
|
||||
import platform
|
||||
from dotenv import load_dotenv
|
||||
from pprint import pprint
|
||||
import nasio
|
||||
import io, os, platform, time
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser = argparse.ArgumentParser()
|
||||
@@ -30,10 +28,8 @@ MYHOST = platform.node()
|
||||
if not os.path.exists("logs"):
|
||||
os.makedirs("logs")
|
||||
|
||||
telegram_bot_token = "7639240596:AAH0YtdQoWZSC-_R_EW4wKAHHNLIA0F_ARY"
|
||||
# telegram_chat_id = 228977654
|
||||
# telegram_chat_id = -4803699526
|
||||
telegram_chat_id = -1003388354193
|
||||
telegram_bot_token = os.getenv("TELEGRAM_TOKEN")
|
||||
telegram_chat_id = os.getenv("TELEGRAM_CHAT_ID")
|
||||
log_config = {
|
||||
"version": 1,
|
||||
"handlers": {
|
||||
@@ -79,11 +75,19 @@ logging.config.dictConfig(log_config)
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.handlers[2].formatter.use_emoji = True
|
||||
|
||||
pprint(f"Локальный файл окружения ={load_dotenv(verbose=True)}")
|
||||
|
||||
LEAGUE = args.league
|
||||
TEAM = args.team
|
||||
LANG = args.lang
|
||||
HOST = "https://pro.russiabasket.org"
|
||||
HOST = os.getenv("API_BASE_URL")
|
||||
SYNO_PATH = f'{os.getenv("SYNO_PATH")}MATCH INFO.xlsx'
|
||||
SYNO_URL = os.getenv("SYNO_URL")
|
||||
SYNO_USERNAME = os.getenv("SYNO_USERNAME")
|
||||
SYNO_PASSWORD = os.getenv("SYNO_PASSWORD")
|
||||
SYNO_PATH_МVMIX = os.getenv("SYNO_PATH_МVMIX")
|
||||
|
||||
|
||||
STATUS = False
|
||||
GAME_ID = None
|
||||
SEASON = None
|
||||
@@ -2773,7 +2777,6 @@ async def play_by_play():
|
||||
team1_name = data["team1"]["name"]
|
||||
team2_name = data["team2"]["name"]
|
||||
|
||||
|
||||
team1_startnum = [
|
||||
i["startNum"]
|
||||
for i in next(
|
||||
@@ -2799,8 +2802,11 @@ async def play_by_play():
|
||||
last_event = data_pbp[-1]
|
||||
if "play" not in df_data_pbp:
|
||||
return maybe_clear_for_vmix([])
|
||||
|
||||
if "live-status" in latest_data and latest_data["live-status"]["data"] != "Not Found":
|
||||
|
||||
if (
|
||||
"live-status" in latest_data
|
||||
and latest_data["live-status"]["data"] != "Not Found"
|
||||
):
|
||||
json_quarter = latest_data["live-status"]["data"]["result"]["period"]
|
||||
json_second = latest_data["live-status"]["data"]["result"]["second"]
|
||||
else:
|
||||
@@ -2899,9 +2905,81 @@ async def play_by_play():
|
||||
return maybe_clear_for_vmix(payload)
|
||||
|
||||
|
||||
def change_vmix_datasource_urls(xml_data, new_base_url: str) -> bytes:
|
||||
"""
|
||||
Ищет все <datasource friendlyName="JSON"> и меняет <url> внутри на new_base_url + endpoint.
|
||||
"""
|
||||
|
||||
# 1. Приводим вход к bytes
|
||||
if isinstance(xml_data, (bytes, bytearray)):
|
||||
raw_bytes = bytes(xml_data)
|
||||
elif isinstance(xml_data, str):
|
||||
raw_bytes = xml_data.encode("utf-8")
|
||||
elif isinstance(xml_data, io.IOBase) or hasattr(xml_data, "read"):
|
||||
# nasio.load_bio, скорее всего, возвращает BytesIO
|
||||
raw_bytes = xml_data.read()
|
||||
try:
|
||||
xml_data.seek(0)
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
raise TypeError(f"Unsupported xml_data type: {type(xml_data)}")
|
||||
|
||||
# 2. Декодируем
|
||||
text = raw_bytes.decode("utf-8", errors="replace")
|
||||
|
||||
# 3. Парсим XML
|
||||
root = ET.fromstring(text)
|
||||
|
||||
# 4. Меняем URL
|
||||
for ds in root.findall(".//datasource[@friendlyName='JSON']"):
|
||||
for inst in ds.findall(".//instance"):
|
||||
url_tag = inst.find(".//state/xml/url")
|
||||
if url_tag is not None and url_tag.text:
|
||||
old_url = url_tag.text.strip()
|
||||
|
||||
# аккуратно выделяем endpoint
|
||||
# http://127.0.0.1:8000/team1 -> /team1
|
||||
after_scheme = old_url.split("://", 1)[-1]
|
||||
after_host = (
|
||||
after_scheme.split("/", 1)[-1] if "/" in after_scheme else ""
|
||||
)
|
||||
endpoint = "/" + after_host if after_host else ""
|
||||
|
||||
new_url = new_base_url.rstrip("/") + endpoint
|
||||
url_tag.text = new_url
|
||||
|
||||
# 5. Сериализуем обратно в bytes
|
||||
new_xml = ET.tostring(root, encoding="utf-8", method="xml")
|
||||
return new_xml
|
||||
|
||||
|
||||
@app.get("/vmix")
|
||||
async def vmix_project():
|
||||
pass
|
||||
vmix_bio = nasio.load_bio(
|
||||
user=SYNO_USERNAME,
|
||||
password=SYNO_PASSWORD,
|
||||
nas_ip=SYNO_URL,
|
||||
nas_port="443",
|
||||
path=SYNO_PATH_МVMIX,
|
||||
)
|
||||
system_name = platform.system()
|
||||
if system_name == "Windows":
|
||||
pass
|
||||
else:
|
||||
# ❗ На Linux/Synology/Docker — заменяем URL
|
||||
edited_vmix = change_vmix_datasource_urls(
|
||||
vmix_bio, f"https://{MYHOST}.tvstart.ru"
|
||||
)
|
||||
# 2. гарантируем, что это bytes
|
||||
if isinstance(edited_vmix, str):
|
||||
edited_vmix = edited_vmix.encode("utf-8")
|
||||
|
||||
return StreamingResponse(
|
||||
io.BytesIO(edited_vmix),
|
||||
media_type="application/octet-stream",
|
||||
headers={"Content-Disposition": f'attachment; filename="VTB_{MYHOST}.vmix"'},
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user