1. TanaRadio
  2. 370 日記 | RSSからプレイリス..
370 日記 | RSSからプレイリストを作る
2026-06-30 19:53

370 日記 | RSSからプレイリストを作る

spotify apple_podcasts

RSSからプレイリストを作って,それにより連続再生することができました(フェーズ5A完了)。

フェーズ5A 詳細マニュアル

RSS 1本から playlist.m3u を作る

0. 今回の目標

今回やることはこれだけです。

LISTENなどのRSSを1本用意する
↓
PythonでRSSを読む
↓
音声ファイルのURLを取り出す
↓
playlist.m3u を作る
↓
mpvで連続再生する

今回はまだ、以下はやりません。

複数RSS
棚選び
再生モード選び
LED
ロータリーエンコーダー
再生履歴

ここを欲張らないのが大事です。
まず「RSSから音声URLを取り出してmpvで鳴らす」だけ成功させます。

ステップ1:作業フォルダを作る

Raspberry Piでターミナルを開きます。

以下を入力します。

mkdir -p ~/tanaradio5
cd ~/tanaradio5

確認します。

pwd

次のように表示されればOKです。

/home/ユーザー名/tanaradio5

たとえばユーザー名が pi なら、

/home/pi/tanaradio5

です。

ステップ2:mpvが使えるか確認する

フェーズ4でmpvは使っているはずですが、念のため確認します。

mpv --version

mpvのバージョン情報が出ればOKです。

もし、

command not found

のように出たら、mpvを入れます。

sudo apt update
sudo apt install -y mpv

ステップ3:RSS URLを1本用意する

まずは、TanaRadioなど、公開RSSを1本使います。

作業フォルダ内に feed.txt を作ります。

nano feed.txt

開いたら、RSS URLを1行だけ貼り付けます。

例:

https://listen.style/p/xxxxx/rss

ここは、実際のTanaRadioのRSS URLに置き換えてください。

保存します。

Ctrl + O
Enter
Ctrl + X

確認します。

cat feed.txt

RSS URLが1行表示されればOKです。

ステップ4:Pythonスクリプトを作る

次に、RSSを読んで playlist.m3u を作るPythonファイルを作ります。

nano make_playlist_5a.py

次のコードをそのまま貼り付けます。

#!/usr/bin/env python3
import urllib.request
import xml.etree.ElementTree as ET
from pathlib import Path

FEED_FILE = "feed.txt"
PLAYLIST_FILE = "playlist.m3u"


def read_feed_url():
    path = Path(FEED_FILE)

    if not path.exists():
        raise FileNotFoundError(f"{FEED_FILE} が見つかりません。")

    url = path.read_text(encoding="utf-8").strip()

    if not url:
        raise ValueError(f"{FEED_FILE} にRSS URLが書かれていません。")

    return url


def download_rss(url):
    print(f"RSSを取得します: {url}")

    request = urllib.request.Request(
        url,
        headers={
            "User-Agent": "TanaRadio-Pi/5A"
        }
    )

    with urllib.request.urlopen(request, timeout=20) as response:
        return response.read()


def find_audio_url(item):
    # RSSのenclosureタグから音声URLを探す
    enclosure = item.find("enclosure")
    if enclosure is not None:
        audio_url = enclosure.attrib.get("url")
        if audio_url:
            return audio_url

    # 念のため、media:content 形式にも軽く対応する
    for child in item:
        if child.tag.endswith("content"):
            audio_url = child.attrib.get("url")
            if audio_url:
                return audio_url

    return None


def get_text(item, tag_name):
    element = item.find(tag_name)
    if element is not None and element.text:
        return element.text.strip()
    return ""


def make_playlist(rss_data):
    root = ET.fromstring(rss_data)

    channel = root.find("channel")
    if channel is None:
        raise ValueError("RSSのchannelが見つかりません。")

    items = channel.findall("item")

    if not items:
        raise ValueError("RSS内にitemが見つかりません。")

    playlist_lines = ["#EXTM3U"]
    count = 0

    for item in items:
        title = get_text(item, "title")
        audio_url = find_audio_url(item)

        if not audio_url:
            continue

        if title:
            playlist_lines.append(f"# {title}")

        playlist_lines.append(audio_url)
        count += 1

    if count == 0:
        raise ValueError("音声URLを1件も見つけられませんでした。")

    Path(PLAYLIST_FILE).write_text(
        "\n".join(playlist_lines) + "\n",
        encoding="utf-8"
    )

    print(f"{PLAYLIST_FILE} を作成しました。")
    print(f"音声URL数: {count} 件")


def main():
    try:
        feed_url = read_feed_url()
        rss_data = download_rss(feed_url)
        make_playlist(rss_data)
        print("完了しました。")
    except Exception as e:
        print("エラーが発生しました。")
        print(e)


if __name__ == "__main__":
    main()

保存します。

Ctrl + O
Enter
Ctrl + X

ステップ5:Pythonファイルを実行できるようにする

chmod +x make_playlist_5a.py

ステップ6:プレイリストを作る

実行します。

./make_playlist_5a.py

うまくいくと、たとえば次のように出ます。

RSSを取得します: https://listen.style/p/xxxxx/rss
playlist.m3u を作成しました。
音声URL数: 10 件
完了しました。

確認します。

ls

次の3つが見えればOKです。

feed.txt
make_playlist_5a.py
playlist.m3u

ステップ7:playlist.m3u の中身を確認する

head playlist.m3u

次のように、音声URLらしきものが出ていればOKです。

#EXTM3U
# エピソードタイトル
https://...
# エピソードタイトル
https://...

この段階で、RSSから音声URLを取り出すところは成功です。

ステップ8:mpvで再生する

いよいよ再生します。

mpv playlist.m3u

音が出れば成功です。

mpvの基本操作は次の通りです。

スペースキー:一時停止/再開
Enter:次へ
q:終了

もし音が出ない場合は、まず別の音声ファイルやYouTubeなどでRaspberry Piから音が出るか確認してください。
ここでの問題は、RSSではなく音声出力側の可能性があります。

ステップ9:成功条件

フェーズ5Aの成功条件は、次の3つです。

1. feed.txt にRSS URLを1本書けた
2. make_playlist_5a.py で playlist.m3u を作れた
3. mpv playlist.m3u で音声が再生できた

この3つができれば、フェーズ5Aは成功です。

よくあるエラー

1. feed.txt が見つかりません

原因:

作業フォルダが違う
feed.txt を作っていない

確認:

pwd
ls

~/tanaradio5 にいて、feed.txt があるか見ます。

2. 音声URLを1件も見つけられませんでした

原因としては、

RSS URLが間違っている
RSSが音声配信用ではない
RSSの形式が少し特殊
限定配信で取得できない

などが考えられます。

まずは公開RSSで試すのがよいです。

3. mpv playlist.m3u で音が出ない

原因は大きく3つです。

Raspberry Piの音声出力先が違う
USBスピーカーやBluetoothスピーカーが未接続
音量が小さい、またはミュート

確認:

mpv --volume=80 playlist.m3u

これで少し大きめの音量で再生できます。

今回はここで止めてよいです

5Aでは、ここまでで十分です。

RSSを読む
playlist.m3uを作る
mpvで鳴らす

これだけです。

次の5Bでは、このプレイリスト生成に、

過去3日分だけ
古い順

という条件を加えます。

でも今はまだ、そこへ行かなくて大丈夫です。
まずは「RSSがmpvで鳴る」。ここをきっちり成功させましょう。これはフェーズ5の土台です。

#声日記 #TanaRadoPi

サマリー

本エピソードでは、TanaRadio Piのフェーズ5Aとして、RSSフィードからプレイリストを作成し、mpvで連続再生する手順が実行されました。まず作業フォルダの作成、mpvの動作確認、RSS URLの準備を行い、次にPythonスクリプトでRSSを読み込み、音声ファイルのURLからplaylist.m3uを生成しました。スクリプト実行時に初期エラーが発生しましたが、ChatGPTの助けを借りて解決し、最終的にmpvでの音声再生に成功。これにより、フェーズ5Aの目標が達成されました。

導入とフェーズ5Aの目標設定
はい、今日は実家から自宅に戻ってきたのですけれども、
TanaRadio Piの機材をセットしまして、
フェーズ5Aをやってみたいと思います。
チャッピーに詳細マニュアルを作ってもらいましたので、
それに従ってやっていくんですが、
今日の目標、今回の目標というのは、
これだけだということで冒頭に書かれています。
最初にLISTENなどのRSSを1本用意して、
それをPythonでRSSを読む。
そこから音声ファイルのURLを取り出して、
playlist.m3uを作る。
そしてそれをmpvで連続再生するというところまで。
これが5Aの中身というやることですね。
まずここまで行きたいと思います。
作業環境の準備
ではステップ1。
Raspberry Piでターミナルを開いて、
ステップ1は作業フォルダを作るのですが、
ターミナルを開いて以下を入力ということで、
今もターミナルを開いていますので、
コマンドを入れます。
mkdirでtanaradio5というディレクトリを作りますね。
cd で
tanaradio5に移ります。
はい、移れました。
それで、確認ということで、
pwdというコマンドを入れますと、
/home/tana/tanaradio5と出まして、OKです。
では次ステップ2。
mpvが使えるか確認するということで、
ターミナルでmpv --versionと入れますと、
バージョンが出ましたので、
では次ステップ3。
rss urlを1本用意するということで、
ここではnanoで、
nanoというのはエディターですけど、
feed.txtというファイルを作りまして開きました。
ここに私のTanaRadioのRSSのURLを貼り付けます。
これはもうコピー&ペーストでいきます。
それで、なんか変なところを押してしまいましたね。
Ctrl-Cで
tanaradio
これで、RSSを今打ち込みましたので、
Ctrl-O Enter Ctrl-Xで保存しました。
では中身を確認するために、
catのfeed.txtで、
今のRSSのURLが出てきましたので、OKです。
Pythonスクリプトの作成
次はステップ4。
4番目はpythonのスクリプトを作るということで、
RSSを読んでplaylist.m3uというファイルを作る、
pythonのファイルを作ります。
またなので、pythonのファイルを作ります。
今ファイルを開いた状態になりましたので、
ここに、もうこのpythonのコードは長いので、
コピー&ペーストでいきます。
全体を反転させて、コピー。
それで、エディターの方へ行って、ペースト。
できました。
Ctrl-O Enter Ctrl-Xで保存です。
スクリプト実行とエラー対応
そうしましたら、今度はステップ5。
5番目はpythonファイルを実行できるようにするということで、
ターミナルで、
+xというオプションを付けて、
make_playlist_5a.pyという、
先ほど作ったファイルのモードを変えるということですね。
これで実行ができるようになったようです。
では、実行するのがステップの6ですので、
./make_playlist_5a.pyを入れて実行します。
色々問題が起こっているようです。
では、このエラーメッセージですね。
importコマンドが見つかりませんとか、
色々出ていますが、これを全部コピー&ペーストでChatGPTに渡したいと思います。
Raspberry Piの方のChatGPTに聞いた方がいいかな。
これは日本語にならないですね。全部ローマ字そのものですが。
以下のエラーが出ました。
ローマ字で入れまして、先ほどのエラーをここにペーストします。
これで送ってみますと何と言ってくるでしょうか。
このPythonのファイルが、Pythonではなくてシェルスクリプトとして実行されているという風に言っていますね。
応急処置ですが、次のコマンドを実行してください。
tanaradio5のホルダーにもう行っていますので、
python3というコマンドの後にmake_playlist_5a.pyで実行できるのではないかということですね。
Enterを押してみると、うまくいきましたね。
エラー修正と再実行
RSSを取得しますということで、playlist.m3uを作成しました。
音声URL数390完了しましたと出ましたね。
で出た後にmpvで再生ができると。
mpv playlist.m3uで音が出るか。
「今日は自宅から実家に来まして・・・」Ctrl-Cで今止めましたけれども、
最新のTanaRadioのエピソードの冒頭部分が聞けましたので、これはうまくいったと思います。
きちんと直す方法というのがありますので、これできちんと直したいと思います。
まずファイルの一行目を確認ということで、
head -n 5 make_playlist_5a.pyでimportからになっているんですね。
この最初の#!/url/bin/env python3というこの一行を入れてなかったんですね。
これがよくなかったようですので、これをnanoでまた追加すればいいんですね。
nanoでファイルを開きます。
はい、開きました。
そうしましたら、ファイルの一番上に先ほどの一行をコピー&ペーストで追加したいと思います。
コピーしてできました。
これで保存ですね。
Ctrl-O Enter Ctrl-X。
もう一度実行権限をつけるということで、さっきのchmodですかね。
chmodで実行権限を与える変更をして実行してみると。
また./make何々というのでファイルそのものを入れて実行しています。
先ほどpython3をつけて実行したのと同じ結果が出ました。
ということで、これをうまくいったんですね。
プレイリストの確認とmpvでの再生
ここまでできたらばいいのかな。
先ほどの問題が出たところでステップを飛ばしてしまいましたので。
もうプレイリストができましたので、プレイリストができているかどうか確認するためにlsというので、
当然ですけどプレイリストのファイルもできています。
中身を確認するということで、head playlist.m3uというので、
冒頭の5つのエピソードのタイトルとmp3ファイルのURLが出てきまして、これでOKですね。
ステップ7。プレイリスト.m3uの中身を確認するもうまくいきました。
これで再生するということですが、もう一回やってみます。
mpv playlist.m3u
これはまあいいんですけど、スペースキーで一時停止再開ができます。
スペースを押してみます。
止まりました。もう一回押すと、再開もうまくいっています。
では次は、エンターを押すと次へ行くそうなので、再生してから
このスペースキーとエンターキーでいろいろコントロールができることも確認しましたので、
これで最後。キーボードのqのキーを押して終了ですね。
終了できました。
フェーズ5Aの成功確認と今後の展望
では最後ステップ9が成功条件ですが、フェーズ5aの成功条件は次の3つです。
1.feed.txtにRSSURLを1本かけた。これできました。
2.make_playlist_5a.pyでplaylist.m3uを作れた。これもOKです。
3.mpv playlist.m3uで音声が再生できた。これもOKですので、
フェーズ5Aは成功したということですね。
今回のところはこれで終わりということですが、
次のフェーズ5Bでは、過去3日分だけ古い順で再生するという仕組みを作るようです。
それでは今回はこれで終わりです。それではまた。
19:53

コメント

スクロール