Coding4Fun - 12 行 PowerShell 搞定批次下載 Podcast MP3
0 |
最近慢跑聽膩 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