yt_ysk
本頁說明 yt_ysk 專案(本機路徑常見為 ysk_project):每天 20:45 自動執行的 Python Pipeline——從 YouTube 下載 YSK(楊世光)頻道字幕,經 Gemini 解析後產出投資訊號報告,並推送到 GitHub Pages。
系統概覽
整體流程由 schedule.csv 的 Queue 欄位串接;由 schedule_entry.py 在排程時間啟動,依序執行各 Step。任一步驟以非零結束碼失敗時,後續 Step 不執行。
主流程圖(Mermaid)
📐 主流程圖(點此展開)
flowchart TD SCH["schedule_entry.py 每日 20:45 啟動"] Q["schedule.csv Queue 欄位串接"] S1["Step1 ysk_entry.py 下載 YSK 字幕 .srt"] S2["Step2 quant_parser_ysk_gemini Gemini 解析 md"] S3["Step3 add_frontmatter Jekyll front matter"] S4["Step4 uti_git_push GitHub Pages"] OK["完成部署"] STOP["中斷 後續 Step 不執行"] SCH --> Q Q --> S1 S1 -->|exit 0| S2 S1 -->|exit 非0| STOP S2 -->|exit 0| S3 S2 -->|exit 非0| STOP S3 -->|exit 0| S4 S3 -->|exit 非0| STOP S4 -->|exit 0| OK S4 -->|exit 非0| STOP
流程摘要(文字):
schedule_entry.py(20:45 啟動)
└── Step 1: ysk_entry.py ← 下載 YSK YouTube 字幕(.srt)
└─ 成功 ─→ Step 2: quant_parser_ysk_gemini_entry.py ← Gemini AI 解析 → .md
└─ 成功 ─→ Step 3: add_frontmatter.py ← 加 Jekyll frontmatter
└─ 成功 ─→ Step 4: uti_git_push.py ← push GitHub Pages
Step 1:ysk_entry.py — 字幕下載
功能: 掃描 YSK(楊世光)YouTube 頻道,抓取最近 7 天新集數的繁體中文字幕(.srt)。
核心行為:
- 呼叫
MemberChannelArchiver,使用 yt-dlp + Chrome Cookie 下載字幕。 - 日期篩選: 預設只處理最近 7 天(減少無效掃描)。
- 若某集沒有字幕,建立
.empty.srt標記檔,下次自動跳過。 - 若 yt-dlp 版本過舊導致失敗,自動升級後重試一次(
_upgrade_ytdlp_once())。 - 若發生無法恢復的錯誤(bot、cookie 失效、重試後仍失敗),設定
hard_failure=True並以sys.exit(1)中斷後續 Queue。
輸出路徑(本機): /Volumes/2T_260130/py_in_2T/ysk_project/output_srt/
手動執行:
python ysk_entry.py # 預設:最近 7 天
python ysk_entry.py --days 14 # 最近 14 天
python ysk_entry.py --all # 全部(不限日期)
Step 2:quant_parser_ysk_gemini_entry.py — Gemini AI 解析
功能: 掃描 output_srt 目錄中的新 .srt 字幕,透過 Gemini 萃取投資訊號,產出每日 Markdown 報告。
核心行為:
- 掃描
output_srt,找出尚未處理過的.srt(已處理記錄於 CSV,不重複)。 - 呼叫 Google Gemini API(
gemini-2.5-flash),從逐字稿萃取 JSON 格式投資訊號。 - 萃取欄位: Date / Asset_Class / Target_Asset / TW_Mapping_Asset / Direction / Timeframe / Core_Logic / Entry_Signal / Stop_Loss。
- 訊號寫入
quant_parser_raw_gemini_info.csv(累積資料庫)。 - 每日報告輸出:
daily_report_gemini/daily_report_gemini_YYYYMMDD.md。
Gemini API 重試機制
- 最大重試 10 次,指數退避:5s → 10s → 20s → 40s → 80s → 160s(上限 160s)。
- 503(伺服器塞車)、429(速率限制)會自動等待重試。
- 429 時比對當日 API 使用量,判斷是「每分鐘 15 次 RPM 限速」或「單日 1500 次配額耗盡」;若配額耗盡可自動切換 Paid Key。
- 10 次全失敗則放棄,並寫入
⚠️ 無法提取有效邏輯警告。
週末自動週報(try_auto_weekly_summary())
- 每次執行時,若當天為週六或週日,自動觸發本週週報。
- 週報範圍: 本週一至本週五(週六/日觸發時仍視為同一週)。
- 以當週所有 daily 的 CSV 資料再次呼叫 Gemini 做週度摘要。
- 輸出:
summary_report_gemini/ysk_YYYYMMDD_YYYYMMDD_summary.txt(實際檔名依週一起訖日)。 - 冪等: 同一份週報檔若已存在則跳過,不重複產生。
Step 2 輸出檔案一覽
| 檔案 | 說明 |
|---|---|
quant_parser_raw_gemini_info.csv |
累積訊號資料庫(所有日期) |
daily_report_gemini/daily_report_gemini_YYYYMMDD.md |
每日投資訊號報告 |
summary_report_gemini/ysk_YYYYMMDD_YYYYMMDD_summary.txt |
每週摘要(週末自動產生) |
quant_parser_ysk_gemini_entry.log |
執行日誌 |
手動執行:
python quant_parser_ysk_gemini_entry.py # 正常巡邏(掃新 SRT)
python quant_parser_ysk_gemini_entry.py --update today # 強制重跑今天(清除舊紀錄再跑)
python quant_parser_ysk_gemini_entry.py --update 20260410 # 強制重跑指定日期
python quant_parser_ysk_gemini_entry.py --action get_result --date 20260410 # 只產報告
Step 3:add_frontmatter.py
為產出的 Markdown 加上 Jekyll front matter,以便本站與 GitHub Pages 正確渲染、分類。
Step 4:uti_git_push.py
將變更 push 至遠端,更新 GitHub Pages 內容。
週末自動週報流程(Mermaid)
📐 週末週報流程(點此展開)
flowchart TD
START["quant_parser_ysk_gemini_entry.py 執行"]
WD{"今天是否週六或週日?"}
SKIP1["否 跳過週報 正常巡邏"]
CALC["是 計算本週一至週五 YYYYMMDD"]
EXIST{"週報檔 summary_report_gemini 已存在?"}
SKIP2["存在 跳過 冪等"]
GEN["不存在 generate_daily_note mon-fri"]
CSV["讀取 CSV 本週訊號"]
GEM["呼叫 Gemini 週度摘要"]
OUT["寫入 ysk 起訖日 summary.txt"]
PATROL["繼續正常巡邏 掃今日新 SRT"]
START --> WD
WD -->|否| SKIP1
WD -->|是| CALC
CALC --> EXIST
EXIST -->|是| SKIP2
EXIST -->|否| GEN
GEN --> CSV --> GEM --> OUT
OUT --> PATROL
SKIP2 --> PATROL
SKIP1 --> PATROL
週末週報流程(文字)
quant_parser 執行時
├─ 判斷今天是否為週六(5) 或 週日(6)
│ 否 → 跳過,直接進入正常巡邏
│ 是 ↓
├─ 計算本週一到本週五的日期(YYYYMMDD)
├─ 檢查 summary_report_gemini/ysk_{mon}_{fri}_summary.txt 是否已存在
│ 存在 → 跳過(冪等)
│ 不存在 ↓
├─ 呼叫 generate_daily_note(f"{mon_str}-{fri_str}")
│ → 讀取 CSV 中本週所有訊號
│ → 呼叫 Gemini 做週度摘要分析
│ → 寫入 summary_report_gemini/ysk_YYYYMMDD_YYYYMMDD_summary.txt
└─ 繼續正常巡邏(掃今天的新 SRT)
常見問題與補救
| 狀況 | 可能原因 | 補救 |
|---|---|---|
出現 ⚠️ 無法提取有效邏輯 |
Gemini 503/429 重試 10 次仍全失敗 | 稍後手動執行 python quant_parser_ysk_gemini_entry.py |
有 .srt 但沒產出 .md |
某次 quant_parser 失敗,之後手動跑才成功 | 執行 python quant_parser_ysk_gemini_entry.py |
字幕下載失敗、hard_failure |
yt-dlp 過舊/Cookie 失效/IP 被擋 | 升級 yt-dlp、刪除對應 .empty.srt 後重跑(依你本機環境調整) |
| 週報沒產生 | 當天排程尚未跑到(未到 20:45) | 等待自動觸發,或手動執行 quant_parser_ysk_gemini_entry.py |
| 想強制重跑某天報告 | — | python quant_parser_ysk_gemini_entry.py --update 20260410 |
與本站之關係
Pipeline 推送後,日報與週報可對應到本儲存庫內 投資筆記 路徑(例如 investment/daily/、investment/weekly/ 下之 YSK/Gemini 相關檔案),實際目錄以你 repo 內 add_frontmatter.py 與 push 設定為準。
端到端總覽(yt_ysk):schedule.csv Queue 串接四步;任一步 exit ≠ 0 即中止。週末執行 quant_parser 時另可走週報分支(冪等、不重複產檔)。產出經 git push 更新 GitHub Pages。