iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

下載器不是寫完就能跑:一個 HLS 分段式串流工具的架構與測試修練 系列

不可控的外部依賴(第三方站點、網路、加密、檔案系統)不代表不能測、不能重構——關鍵是找到每種依賴各自的替身策略。這個系列會用一個真實運作的 HLS 分段式串流下載工具為案例,從爬蟲抽象層設計、協定與加密處理、非同步下載引擎,到怎麼測試滿是外部依賴的程式碼,一步步把「能跑就好」的工具變成「改了會有信心」的工具。

參賽天數 21 天 | 共 21 篇文章 | 2 人訂閱 訂閱系列文 RSS系列文
DAY 11

Day 11:案例——沒有實作規格定義的 IV 退路,會在什麼情況下出包

前言:昨天講的「規格退路」,我自己的程式碼有沒有做到? 昨天講完 RFC 8216 規格定義的「#EXT-X-KEY 沒帶 IV 屬性時,要用媒體序號推算」,回...

2026-09-19 ‧ 由 recca0120 分享
DAY 12

Day 12:每個片段各自重試,而不是整份清單重新下載一次

前言:下載失敗了,要重試「這一個片段」還是「整個流程」? 一份內容可能被切成幾十甚至上百個片段,如果整個下載流程用同一層 try/except 包起來,任何一個...

2026-09-20 ‧ 由 recca0120 分享
DAY 13

Day 13:斷點續傳——怎麼判斷「這個片段其實已經下載完了」

前言:程式中斷重跑,要從頭開始嗎? 下載到一半,程式因為任何原因中斷(手動停止、網路斷線、程式崩潰),重新執行時如果沒有任何判斷機制,最簡單的做法就是全部重新下...

2026-09-21 ‧ 由 recca0120 分享
DAY 14

Day 14:案例——合併時發現片段解析度不一致,混進了不該有的內容

前言:片段數量對了,合併出來的結果卻怪怪的 前幾天講的斷點續傳、局部重試,解決的都是「片段有沒有成功下載」;但即使所有片段都成功下載、數量也對,合併出來的結果還...

2026-09-22 ‧ 由 recca0120 分享
DAY 15

Day 15:第二部回顧——把一個串流協定拆解成可以逐步驗證的小問題

前言:這七天看似在講很多零散的細節 第二部從索引清單的基本結構,講到巢狀清單、加密金鑰、IV 的規格退路、再到片段規格一致性的驗證,看起來是七個各自獨立的技術細...

2026-09-23 ‧ 由 recca0120 分享
DAY 16

Day 16:為什麼要非同步——I/O bound 工作的線程池 vs asyncio

前言:下載幾十個片段,逐一循序下載不行嗎? 技術上完全可以,只是慢。如果每個片段的下載都要等前一個完成才開始下一個,總耗時大約是「單一片段耗時 × 片段數量」;...

2026-09-24 ‧ 由 recca0120 分享
DAY 17

Day 17:ThreadPoolExecutor 包 asyncio coroutine——一個混用兩種併發模型的權宜設計

前言:兩種併發模型可以混著用嗎? 昨天講完 asyncio 跟 ThreadPoolExecutor 各自適合的場景,今天要誠實檢視這個系列素材專案裡真實存在的...

2026-09-25 ‧ 由 recca0120 分享
DAY 18

Day 18:下載進度怎麼設計才不會變成一堆散落的 print

前言:進度顯示只是印個百分比,需要特別設計嗎? 單一個下載工作,print 一下進度確實夠用。但當有十個片段同時並行下載,每個片段各自 print 自己的進度,...

2026-09-26 ‧ 由 recca0120 分享
DAY 19

Day 19:失敗要退避重試,但退避策略怎麼選

前言:重試前要不要等待,等多久? Day 12 講過失敗要局部重試,但沒細講「重試前該等多久」。立刻重試聽起來反應最快,但如果失敗原因是對方暫時過載,立刻重試只...

2026-09-27 ‧ 由 recca0120 分享
DAY 20

Day 20:合併片段前,先確認片段真的湊齊了

前言:下載迴圈跑完,就代表可以合併了嗎? Day 12 講過每個片段各自重試、超過上限就記錄失敗並放棄。這代表下載迴圈跑完之後,不能直接假設「所有片段都成功了」...

2026-09-28 ‧ 由 recca0120 分享