最近慢跑聽膩 MP3 耳機裡現存的百年歌單,加上近幾個月都跑六分半配速,聽快節奏歌曲蠻不搭的,想抓些 Podcast 來聽解悶。

把 Podcast 抓成 MP3 的事兩年前做過一次,當時是先找到有完整集數列表的網頁,寫 JavaScript 抓 DOM 轉成 URL 與標題清單,再用 C# 寫程式下載檔案,過程頗費功夫。兩年後重操舊業,該換個更省事的做法,好證明自己沒有馬齒徒長,虛度光陰。

我的構想是找到 Podcast 的 RSS,寫支 PowerShell 解析 XML,逐筆下載,搞定收工。

我找到 LISTEN NOTES 網站,有提供 Podcast 的 RSS:

Podcast 的 RSS 結構還蠻單純的,每一集是一個 <item>,標題在 <title>,MP3 URL 在 <enclosure> 的 url Attribute。

因為 XML 結構比預期簡單,我只花了 12 行 PowerShell 就完成一次將所有集數下載的 MP3 的小工具(並會自動略過已下載完成項目):

[xml]$xml = Get-Content rss.xml -Encoding UTF8
$list = $xml.SelectNodes("//item")
$index = 0
$list | ForEach-Object {
    $title = $_.SelectSingleNode("title").InnerText
    $fileName = [string]::Join("_", $title.Split([System.IO.Path]::GetInvalidFileNameChars())) + ".mp3"
    $index++
    if (!(Test-Path $fileName -PathType Leaf)) {
        Write-Progress -Activity "下載 $title... $($_.SelectSingleNode("enclosure").GetAttribute("length")) bytes" -PercentComplete ($index * 100 / $list.Count) -Status "$index / $($list.Count)"
        Invoke-WebRequest -Uri ($_.SelectSingleNode("enclosure").GetAttribute("url")) -OutFile $fileName
    }
}

大成功!

程式未經優化,下載速度不快(尤其是我沒停用 Invoke-WebRequest 進度顯示會拖慢速度,但看得到進度就不煩躁,很值得),但下載再快,也是要慢慢聽完,就先這樣囉。

PowerShell example to download MP3 files with Podcast RSS XML.


Comments

Be the first to post a comment

Post a comment