Spaces:
Running
Running
Upload 2 files
Browse files- app.py +19 -3
- tms_proxy.py +47 -0
app.py
CHANGED
|
@@ -25,6 +25,7 @@ from pathlib import Path
|
|
| 25 |
from cinema_api_client import fetch_canonical_movie_names as shared_fetch_canonical_movie_names
|
| 26 |
from historical_sessions import load_history_df, summarize_total_box_office_by_movies
|
| 27 |
from r2_config_sync import ensure_settings_file_from_r2, ensure_settings_file_synced, upload_settings_file_to_r2
|
|
|
|
| 28 |
# --- 新增:加载环境变量 ---
|
| 29 |
from dotenv import load_dotenv
|
| 30 |
load_dotenv() # 加载本地 .env 文件
|
|
@@ -2253,6 +2254,7 @@ def display_pdf(base64_pdf):
|
|
| 2253 |
@st.cache_data(show_spinner=False, ttl=600)
|
| 2254 |
def fetch_and_process_server_movies(priority_movie_titles=None):
|
| 2255 |
if priority_movie_titles is None: priority_movie_titles = []
|
|
|
|
| 2256 |
|
| 2257 |
# 获取环境变量
|
| 2258 |
app_secret = os.getenv("TMS_APP_SECRET")
|
|
@@ -2289,7 +2291,11 @@ def fetch_and_process_server_movies(priority_movie_titles=None):
|
|
| 2289 |
# 使用变量
|
| 2290 |
token_json_data = {'appId': 'hd', 'appSecret': app_secret, 'timeStamp': int(time.time() * 1000)}
|
| 2291 |
# 动态构建 URL
|
| 2292 |
-
token_url =
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2293 |
|
| 2294 |
response = requests.post(token_url, headers=token_headers, json=token_json_data, timeout=10)
|
| 2295 |
|
|
@@ -2324,8 +2330,18 @@ def fetch_and_process_server_movies(priority_movie_titles=None):
|
|
| 2324 |
list_json_data = {'THEATER_ID': theater_id, 'SOURCE': 'SERVER', 'ASSERT_TYPE': 2, 'PAGE_CAPACITY': 20,
|
| 2325 |
'PAGE_INDEX': page_index}
|
| 2326 |
|
| 2327 |
-
list_url =
|
| 2328 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2329 |
response.raise_for_status()
|
| 2330 |
movie_data = response.json()
|
| 2331 |
if movie_data.get("RSPCD") != "000000": raise Exception(f"获取影片列表失败: {movie_data.get('RSPMSG')}")
|
|
|
|
| 25 |
from cinema_api_client import fetch_canonical_movie_names as shared_fetch_canonical_movie_names
|
| 26 |
from historical_sessions import load_history_df, summarize_total_box_office_by_movies
|
| 27 |
from r2_config_sync import ensure_settings_file_from_r2, ensure_settings_file_synced, upload_settings_file_to_r2
|
| 28 |
+
from tms_proxy import build_tms_url, get_tms_proxy_base_url, tms_verify_ssl, with_tms_proxy_headers
|
| 29 |
# --- 新增:加载环境变量 ---
|
| 30 |
from dotenv import load_dotenv
|
| 31 |
load_dotenv() # 加载本地 .env 文件
|
|
|
|
| 2254 |
@st.cache_data(show_spinner=False, ttl=600)
|
| 2255 |
def fetch_and_process_server_movies(priority_movie_titles=None):
|
| 2256 |
if priority_movie_titles is None: priority_movie_titles = []
|
| 2257 |
+
tms_proxy_base_url = get_tms_proxy_base_url()
|
| 2258 |
|
| 2259 |
# 获取环境变量
|
| 2260 |
app_secret = os.getenv("TMS_APP_SECRET")
|
|
|
|
| 2291 |
# 使用变量
|
| 2292 |
token_json_data = {'appId': 'hd', 'appSecret': app_secret, 'timeStamp': int(time.time() * 1000)}
|
| 2293 |
# 动态构建 URL
|
| 2294 |
+
token_url = build_tms_url(
|
| 2295 |
+
f'https://tms.hengdianfilm.com/cinema-api/admin/generateToken?token=hd&murl=?token=hd&murl=ticket={ticket}',
|
| 2296 |
+
tms_proxy_base_url,
|
| 2297 |
+
)
|
| 2298 |
+
token_headers = with_tms_proxy_headers(token_headers, tms_proxy_base_url)
|
| 2299 |
|
| 2300 |
response = requests.post(token_url, headers=token_headers, json=token_json_data, timeout=10)
|
| 2301 |
|
|
|
|
| 2330 |
list_json_data = {'THEATER_ID': theater_id, 'SOURCE': 'SERVER', 'ASSERT_TYPE': 2, 'PAGE_CAPACITY': 20,
|
| 2331 |
'PAGE_INDEX': page_index}
|
| 2332 |
|
| 2333 |
+
list_url = build_tms_url(
|
| 2334 |
+
'https://tms.hengdianfilm.com/cinema-api/cinema/server/dcp/list',
|
| 2335 |
+
tms_proxy_base_url,
|
| 2336 |
+
)
|
| 2337 |
+
list_headers = with_tms_proxy_headers(list_headers, tms_proxy_base_url)
|
| 2338 |
+
response = requests.post(
|
| 2339 |
+
list_url,
|
| 2340 |
+
params=list_params,
|
| 2341 |
+
headers=list_headers,
|
| 2342 |
+
json=list_json_data,
|
| 2343 |
+
verify=tms_verify_ssl(default=False, proxy_url=tms_proxy_base_url),
|
| 2344 |
+
)
|
| 2345 |
response.raise_for_status()
|
| 2346 |
movie_data = response.json()
|
| 2347 |
if movie_data.get("RSPCD") != "000000": raise Exception(f"获取影片列表失败: {movie_data.get('RSPMSG')}")
|
tms_proxy.py
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from urllib.parse import urlparse
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
TMS_ORIGIN = "https://tms.hengdianfilm.com"
|
| 6 |
+
TMS_PROXY_URL_ENV = "TMS_CF_WORKER_URL"
|
| 7 |
+
TMS_PROXY_TOKEN_ENV = "TMS_CF_WORKER_TOKEN"
|
| 8 |
+
TMS_PROXY_TOKEN_HEADER = "X-TMS-Proxy-Token"
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
def get_tms_proxy_base_url(proxy_url=None):
|
| 12 |
+
raw = proxy_url if proxy_url is not None else os.getenv(TMS_PROXY_URL_ENV, "")
|
| 13 |
+
raw = str(raw or "").strip()
|
| 14 |
+
if not raw:
|
| 15 |
+
return ""
|
| 16 |
+
if "://" not in raw:
|
| 17 |
+
raw = f"https://{raw}"
|
| 18 |
+
return raw.rstrip("/")
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def build_tms_url(origin_url, proxy_url=None):
|
| 22 |
+
proxy_base_url = get_tms_proxy_base_url(proxy_url)
|
| 23 |
+
if not proxy_base_url:
|
| 24 |
+
return origin_url
|
| 25 |
+
|
| 26 |
+
parsed = urlparse(origin_url)
|
| 27 |
+
origin = f"{parsed.scheme}://{parsed.netloc}"
|
| 28 |
+
if origin != TMS_ORIGIN:
|
| 29 |
+
return origin_url
|
| 30 |
+
|
| 31 |
+
query = f"?{parsed.query}" if parsed.query else ""
|
| 32 |
+
return f"{proxy_base_url}{parsed.path}{query}"
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
def with_tms_proxy_headers(headers=None, proxy_url=None):
|
| 36 |
+
headers = dict(headers or {})
|
| 37 |
+
if get_tms_proxy_base_url(proxy_url):
|
| 38 |
+
proxy_token = os.getenv(TMS_PROXY_TOKEN_ENV, "").strip()
|
| 39 |
+
if proxy_token:
|
| 40 |
+
headers[TMS_PROXY_TOKEN_HEADER] = proxy_token
|
| 41 |
+
return headers
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
def tms_verify_ssl(default=False, proxy_url=None):
|
| 45 |
+
if get_tms_proxy_base_url(proxy_url):
|
| 46 |
+
return True
|
| 47 |
+
return default
|