import gradio as gr import gspread import os import json from google.cloud import storage # 设置Google Sheets的默认值 DEFAULT_SHEET_URL = "https://docs.google.com/spreadsheets/d/161-2m7mDdEYWtMEjPeMFYlruJ6zvCZPyogns84AmVpw/edit#gid=1159223931" GCS_BUCKET_NAME = "video_ai_assistant" # 从环境变量获取GCS密钥 GCS_KEY_JSON = os.getenv("GOOGLE_APPLICATION_CREDENTIALS_JSON") GCS_KEY = json.loads(GCS_KEY_JSON) GCS_CLIENT = storage.Client.from_service_account_info(GCS_KEY) # 检查GCS中是否存在特定文件 def check_file_in_gcs(bucket_name, video_id, file_type): bucket = GCS_CLIENT.bucket(bucket_name) file_path = f"{video_id}/{video_id}_{file_type}.json" blob = bucket.blob(file_path) return blob.exists() def process_sheet_data(sheet_url, sheet_tab_name): gc = gspread.service_account_from_dict(GCS_KEY) sh = gc.open_by_url(sheet_url) worksheet = sh.worksheet(sheet_tab_name) data = worksheet.get_all_records() # 检查GCS中是否存在对应的文件 results = [] headers = ['subject', 'grade', '均一平台 標題', '均一平台 YouTube ID', '均一平台 YT Readable ID', 'cooc Youtube ID', 'transcript', 'questions', 'key_moments', 'summary', 'reading_passage', 'mind_map', 'yt_check_results', "cooc_check_results"] for row in data: video_ids_checked = set() # 用于存储已检查的ID yt_check_results = [] cooc_check_results = [] readable_id = row.get('均一平台 YT Readable ID', '') youtube_id = row.get('均一平台 YouTube ID', '') cooc_id = row.get('cooc Youtube ID', '') # 准备结果行 row_result = [ row.get('subject', ''), row.get('grade', ''), row.get('均一平台 標題', ''), youtube_id, readable_id, cooc_id ] # 檢查 readable_id for file_type in headers[6:-3]: # 跳过前面的ID和标题列以及最后的结果列 row_result.append(check_file_in_gcs(GCS_BUCKET_NAME, readable_id, file_type)) video_ids_checked.add(readable_id) # 檢查 youtube_id if youtube_id in video_ids_checked: yt_check_results = "NA" else: for file_type in headers[6:-3]: yt_check_result = check_file_in_gcs(GCS_BUCKET_NAME, youtube_id, file_type) yt_check_results.append(yt_check_result) video_ids_checked.add(youtube_id) # 檢查 cooc_id if cooc_id in video_ids_checked or not cooc_id: cooc_check_results = "NA" else: for file_type in headers[6:-3]: cooc_check_result = check_file_in_gcs(GCS_BUCKET_NAME, youtube_id, file_type) cooc_check_results.append(cooc_check_result) row_result.append(yt_check_results) row_result.append(cooc_check_results) results.append(row_result) print("=====================================") print(row_result) return results, headers def update_output_table(sheet_url, sheet_tab_name): data, headers = process_sheet_data(sheet_url, sheet_tab_name) return gr.update(value=data, headers=headers) with gr.Blocks() as app: with gr.Row(): sheet_url_input = gr.Textbox(label="Enter Google Sheet URL", value=DEFAULT_SHEET_URL) tab_name_input = gr.Textbox(label="Enter Google Sheet Tab Name", value="思考力訓練") submit_button = gr.Button("Submit") with gr.Row(): output_table = gr.Dataframe() submit_button.click( fn=update_output_table, inputs=[sheet_url_input, tab_name_input], outputs=[output_table] ) app.launch()