Webページでいちいちボタンをおして再生するのは面倒なので、PCやMP3プレーヤーで連続再生できるよう全部ダウンロードする方法をお教えします。
このブログはエンジニアブログなのでツールはもちろん自作しました。今回はPythonでサクッとダウンロードするコードを紹介します。
人気のポッドキャスターは次の記事で紹介しています。自分の専門と近い人のを聴けば楽しめるはずです。
残念ですが、人気の Spotify はダウンロード禁止なので未対応です。しかたないのでストリームで1番組ずつ聴いてください。
RSSフィードから全MP3をダウンロードするコード
コメントと空行を除けばわずか20行程度のシンプルなコードです。
しかも実行テスト済で、400近いMP3ファイルのダウンロードに成功しています。Pythonはやはり便利ですね。
# PythonでRRSフィードから全MP3をダウンロードするプログラム 2023/11/06 Author:teru
import requests
from bs4 import BeautifulSoup
import os
import datetime
# ポッドキャストのRSSフィードのURLを指定(※ここは各自で修正)
url = 'https://feeds.rebuild.fm/rebuildfm'
# RSSフィードの取得
response = requests.get(url)
soup = BeautifulSoup(response.content, 'xml')
# MP3ファイルのURLと日付を取得してダウンロード
for item in soup.find_all('item'):
mp3_url = item.enclosure['url']
mp3_file = os.path.basename(mp3_url)
# URLの「?」以降を無視
mp3_file = mp3_file.split('?')[0]
# ファイルに使えない文字を削除
mp3_file = ''.join(c for c in mp3_file if c.isalnum() or c in ['-', '_'])
# ファイル名の先頭に日付追加
date_obj = datetime.datetime.strptime(item.pubDate.text, '%a, %d %b %Y %H:%M:%S %z')
mp3_file = date_obj.strftime('%y%m%d') + '-' + mp3_file
# mp3の前のドットが消えているので追加
mp3_file = mp3_file.replace('mp3', '.mp3')
# ファイル日付を取得
mp3_date = datetime.datetime.strptime(item.pubDate.text, '%a, %d %b %Y %H:%M:%S %z')
# 受信データをファイルに書き込む
response = requests.get(mp3_url)
with open(mp3_file, 'wb') as f:
f.write(response.content)
os.utime(mp3_file, (mp3_date.timestamp(), mp3_date.timestamp()))
# 保存ファイル名をコンソールに出力
print( 'download : ' + mp3_file)
print('処理終了、カレントフォルダに落としたファイルを移動しよう。')
今回のコードではRSSフィードのURLは自分で探してコードに直接書き込む仕様になっています。
一般的にRSSフィードが置かれている場所はよく知りませんが、私がたまたま落としてみたRebuildのRSSフィードは、Webページの一番下のRSSリンクにURLがありました。
ファイル日付の取得
ファイル名だけでファイルを管理すると、命名規則がバラバラでうまくソートできないことがあります。
そんなときでも日付を元のファイルから取得してファイル属性につけておけば、日付順にソートできて便利です。
元の日付が分かれば、リネームツールでファイル名の先頭に日付を付けてソートしたりもできます。
【注意】Spotifyなどの禁止サイトではダウンロードできない
例外的に運営者がダウンロード用の公式APIを公開していればできるかもしれません。
不要な記号などの削除
Rebuildの場合はURLに「?」が含まれているパターンがあってエラーが出ました。そこでエラーにならないように対処してあります。
簡単そうなコードに見えるでしょうが、3バージョン目まで改良してやっと実用レベルになりました。
コードの意味が分からない場合
自分で調べるのがエンジニアとしてのスキルアップのチャンスなので、調べてみてください。
あまり興味のない人は「次のコードが何をしているか説明して」などとチャットAIに聞くと教えてくれます。(あまりスキルアップできない気もしますが)
SSLエラー対策
例外が発生しました: SSLError ×
HTTPSConnectionPool(host='cache.rebuild.fm', port=443): Max retries exceeded with url: /podcast-ep376.mp3 (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1000)')))
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1000)
During handling of the above exception, another exception occurred:
urllib3.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1000)
2023年12月にVSCodeで今回のコード実行し、RebuildFMのRSSフィードを読み込もうとしたら、SSLのハンドシェイクエラーがでました。
SSL/TLSバージョンが変わったらしく、アクセスできなくなっていました。(※SSL/TLSは古いバージョンからの接続を拒否する仕様)
VSCodeのSSL/TLSのバージョンはOSに依存します。
探せば対処法がでありそうな気もしますが、下手にバージョンを変えて問題が起きても困るので、今回は対処しないことにしました。
他のサイトのRSSは読み込めるので、WindowsアップデートやRebuild側のアップデートで、いずれアクセスできるようになっているかもしれません。
今回は役に立たないエラー解説で申し訳ありません。コード自体は特に間違ってはいないはずなので、スルーでいいだろうという判断です。
本質的にはセキュリティ問題なので、インフラエンジニアを目指す人なら、自分で調べて対処してみるのもいいでしょう。
ちなみに、Rebuildの音声ダウンロードは、サイトから普通にできるので、手動でお願いします。
何年か前に古いPCでZoomを使おうとしたら、TLSエラーで接続できなかったことを思い出したよ。
Rebuildは最先端テック系ポットキャストって感じだから、すぐにアップグレードしてるのかもね。
逆にあえてデグレするメリットはないような気もするけど、古いバージョンじゃないと動かないアプリを動かすときなんかには、デグレする可能性もあるかも…
スルーしようと思ったものの、一応対処法を調べて試したら、またエラーがでました。(やはりスルーでいいか…)
例外が発生しました: OSError
Could not find a suitable TLS CA certificate bundle, invalid path: False
File "C:\pgm\python\vsc\downloader\podcast_downloader.py", line 73, in <module>
response = requests.get(mp3_url, verify='False')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: Could not find a suitable TLS CA certificate bundle, invalid path: False
コードの改善案
他のポッドキャストに対応
私がポッドキャストの全ダウンロードを思いついたのは今日のことでした。そのため他のポッドキャストがどんな仕様なのかは確認していません。
MP3のリンクを取り出すだけなので、他のRSSフィードからもダウンロードできるのではないかと思います。
ですが、何が起こるか分からないのがプログラムの世界です。そしてまた、その問題に対処できるのがエンジニアというものです。
問題が起きても冷静に対処して目的を達成していってください。
URLを引数として渡す
私はどうせVSCodeからしか実行しないので作っていませんが、RSSフィードのURLを外部から渡せるように、引数で受け渡すようにしてもいいです。
ファイルの先頭に日付を付ける【実装済】
MP3プレーヤーの多くはデフォルトではファイル名でソートします。そのためファイル名の先頭に日付を入れておけば、何もしなくても日付順に再生できて便利です。
今回のコードではリネームツールで付けられるようにファイル属性の日付を元のファイルの日付にしてあります。
MP3のタグからタイトルをつける
ファイル名に音声のタイトルがついていないことがあります。そんなときには自分でタグからトラック名などを取得してファイル名につけてもいいです。
普通はMP3自体にデータが入っているので、音楽アプリで再生すれば自動で表示されるはずです。
今回のコードではファイルは日付で管理する前提ですが、もっと細かく管理したいときに便利です。
これも勉強用に付けてもいいね。
個人的には、トーク番組は1回聴いたら終わりになるパターンが多いから作ってないけど。
ビットレートの変更
2023年現在、音楽関連のPythonライブラリは正しく動作しないので使えないようです。SaasのAPIなどは使えるようです。
ファイルサイズが大きく数も多くなるとストレージ容量を圧迫します。そこでファイルのビットレートを下げるとサイズダウンできるメリットがあります。
音楽ではなくトーク番組なら、32kなどの低ビットレートでも問題なく聴けます。
リアリティや臨場感は落ちるので、気になる人は128kなどのビットレートで聴いてもいいです。
ビットレートの変更はフリーツールでできるよ。
勉強的には作ってもいいけど、ヤグニ的には作らなくていいかもね。
まとめ:自作した方が早かった
MP3をダウンロードするツールはそれなりにあるので、最初は自作しないで済まそうと思っていました。
ところが、Webページの構造によっては全部ダウンロードできないパターンがあることが分かりました。
そこでどうすべきか調べたところRSSフィードにMP3のURLが全部書いてあることが分かり、今回のプログラムを作ることになりました。
既存のツールをダウンロードしてあれこれ試したのですが、それよりも自作したほうが早かったです。
自作すればカスタマイズも自由なので、ダウンロードなど少ない機能で実装できるものは積極的に自作していくのがおすすめです。
コメント