iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

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

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

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

Day 01:系列介紹——一個下載工具,為什麼值得認真寫測試

前言:這種「小工具」有必要寫測試嗎? 「不就是一個爬蟲加下載器嗎?能跑就好,寫什麼測試?」 這大概是很多人對這類個人專案的第一反應。我自己也是這樣開始的:先求能...

2026-09-09 ‧ 由 recca0120 分享
DAY 2

Day 02:每個來源站的頁面結構都不一樣,抽象層要切在哪裡

前言:多支援一個來源站,就要多寫一份爬蟲嗎? 「反正每個網站長得不一樣,乾脆一個網站寫一支獨立的爬蟲程式,簡單暴力。」 這個想法短期最快,長期最痛。如果每個來源...

2026-09-10 ‧ 由 recca0120 分享
DAY 3

Day 03:用 Factory 依網址判斷該用哪個爬蟲,而不是到處寫 if-else

前言:呼叫端要知道「這個網址該用哪個爬蟲」嗎? 「呼叫端傳個網址進來,判斷一下網域是哪個站台,new 對應的爬蟲就好了吧?」 問題是:這個判斷邏輯只寫一次,很快...

2026-09-11 ‧ 由 recca0120 分享
DAY 4

Day 04:案例——字串裡包一段 JSON 的 M3U8 連結,怎麼解析比較不脆弱

前言:頁面裡的資料格式,不會照你希望的方式長 「網頁原始碼裡就是一段文字,用正規表達式撈出網址不就好了?」 理論上是。實務上,很多頁面會把設定資料用 JSON...

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

Day 05:項目編號解析裡的例外,不是每個項目標題都乖乖是數字

前言:「應該都是數字」這個假設,撐不了多久 「項目標題長得像『第 3 項』,正規表達式撈出數字轉成 int 就好了。」 這句話在資料乾淨的時候完全成立。但只要來...

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

Day 06:這層抽象值得嗎?三個來源 vs 十個來源,成本轉折點在哪

前言:只有一個來源站的時候,需要 Template Method 嗎? 前幾天講的 Template Method、Factory,聽起來都是「顯然正確」的設計...

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

Day 07:第一部回顧——爬蟲層的責任邊界,跟它不該負責的事

前言:爬蟲層到底該做到哪裡為止? 第一部這六天,講的都是「怎麼把爬蟲這一層設計得好維護」,但還沒明講一件事:爬蟲層的責任邊界劃在哪裡,超過這條線的事它不該碰。...

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

Day 08:M3U8 索引清單的基本結構,不只是一份 URL 清單

前言:「不就是一份片段網址清單」這個理解,缺了什麼? 第一次接觸 M3U8 的人,常見的理解是「打開看起來就是一堆網址列表,逐行下載就好」。這個理解在最簡單的情...

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

Day 09:Master playlist vs Media playlist——為什麼有時候要多繞一層

前言:「抓到清單」不代表「抓到片段列表」 昨天講的是最單純的情況:一份 M3U8 清單裡直接列著片段網址。但實務上常常打開一份 M3U8,裡面沒有任何 #EXT...

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

Day 10:AES-128 加密的片段,金鑰跟初始向量(IV)從哪裡來

前言:片段加密了,但金鑰藏在哪? 昨天解析出的 Media playlist,除了片段清單,有時候還會帶一個 #EXT-X-KEY 標籤,宣告這份清單的片段是加...

2026-09-18 ‧ 由 recca0120 分享