YouTubeのプレイリストからPodcastのフィードを作成

YouTube で Listen Later プレイリスト作成して URL をコピー

https://www.youtube.com/view_all_playlists で作成

https://www.youtube.com/playlist?list=yzyVrL2gQesngUUgRcMmbEnru7H7jpPXda

Raspberry Pi の準備

Raspberry Pi Imager をインストールして起動。SD Card Formatterでフォーマットした SD カードをパソコンに挿して Imager で Raspberry Pi OS 32-bitを選択して書き込む

microSDカードのドライブを開いて、ドライブ直下に空の ssh ファイルを作成して SSH を有効化する

Wi-Fi接続する場合は wpa_supplicant.confssh と一緒に作成する

country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="My Home"
    psk="yNLVb9V4JG"
}

Tera Term で Raspberry PiSSH 接続

ホスト: raspberrypi.locale ユーザー名: pi パスフレーズraspberry

ターミナルで sudo raspi-config を叩いて、Interface Options→VNC に☑

ディスプレイなしのラズパイに VNC 接続する際に解像度を設定しておかないと Raspberry Pi 4 のデスクトップが見えないので sudo raspi-config から

Display Options → Resolution → DMT Mode 85 1280x720 60Hz 16:9 を選択

再起動して VNC Viewerで接続して Update Software やっとく

Docker のインストール

curl -sSL https://get.docker.com | sh

PodSync用のフォルダを作成

mkdir -p ~/podsync/config ~/podsync/data

YouTube API の取得

https://console.developers.google.com/project でプロジェクトを作成

プロジェクトを開いて YouTube Data API v3 を有効したら認証情報を作成する

使用する API: YouTube Data API v3
API を呼び出す場所: ウェブブラウザ (JavaScript)
アクセスするデータの種類: 一般公開データ

PodSyncの設定

~/podsync/config/config.toml

[server]
port = 8080
data_dir = "/app/data"

[tokens]
# The API token you created
youtube = "ZSXKKp3gwpewP3Ga2GAVCGYDL6NGUKXQ9cZVCra"

[feeds]
  [feeds.listen_later]
  # The playlist you created earlier
  url = "https://www.youtube.com/playlist?list=yzyVrL2gQesngUUgRcMmbEnru7H7jpPXda"
  # The number of episodes to query each update
  page_size = 25
  # How often query for updates, examples: "60m", "4h", "2h45m"
  update_period = "10m"
  quality = "low"
  format = "audio"

Podsync の Dockerイメージをクローンしてビルド

git clone https://github.com/pblgomez/PodSync-Armv6-Docker podsync-docker
cd podsync-docker
sudo ./build.sh

$MACHTYPE の返り値が違うっぽいので

pi@raspberrypi:~ $ echo $MACHTYPE
arm-unknown-linux-gnueabihf

build.sh を書き換え

if [[ ${MACHTYPE} =~ "aarch64" ]]; then
  echo "aarch64"
  LatestRelease=$(curl -s https://github.com/mxpv/podsync/releases/ | grep -e 'href.*arm64' -m 1 | cut -f2 -d \")
elif [[ ${MACHTYPE} =~ "arm-unknown-linux-gnueabihf" ]]; then
  echo "x86_64"
  LatestRelease=$(curl -s https://github.com/mxpv/podsync/releases/ | grep -e 'href.*armv6' -m 1 | cut -f2 -d \")
fi

Alpine 3.13は musl ライブラリが新しくなって 32-bit 環境下では設定を葬らないといけないらしくめんどくさいのでバージョンを下げてビルド

/home/pi/podsync-docker/Dockerfile

FROM alpine:3.12
Successfully built 14ad32de3545
Successfully tagged local/podsync:latest

めでたく Podsync Docker イメージが構築できたので Podsync docker コンテナを起動

docker run -d \
    --name='Podsync' \
    --net='bridge' \
    -e 'PODSYNC_CONFIG_PATH'='/app/config/config.toml' \
    -v ~/podsync/data/:'/app/data':'rw' \
    -v ~/podsync/config/:'/app/config':'rw' \
   'local/podsync'

Docker を sudo なしで実行するには pi ユーザーを docker グループに追加しておく

sudo gpasswd -a pi docker

docker daemonの再起動

sudo service docker restart

systemd で起動時に Podsync を実行する

Podsync コンテナのサービスエントリを作成

sudo nano /etc/systemd/system/docker-podsync.service

設定はこんな感じ

[Unit]
Description=Podsync Container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a Podsync
ExecStop=/usr/bin/docker stop -t 2 Podsync

[Install]
WantedBy=graphical.target

WantedBy は現在のシステムモードを下記で調べてその値を設定

systemctl get-default

systemd をリロードして新しいサービスを登録

sudo systemctl daemon-reload
sudo systemctl start docker-podsync.service
sudo systemctl enable docker-podsync.service
sudo reboot

起動を確認

systemctl status docker-podsync

S3でのフィードのホスティング

ホームネットワーク上のものをオープンなインターネットに公開したくないので、Podsync フィードとファイルをクラウドストレージプロバイダ(S3)に同期

これをやることでどこからでも最新のポッドキャストフィードを取得可能

AWSの設定

AWS はその昔アカウントだけ取得して放置していたので設定するところからはじめる

住所の更新とクレジットカード情報の登録を余儀なくされる

認証時に電話がかかってくるのでキーパッドで4桁の数字+#を入力

S3でバケットを作成

バケット名: lifeline-balsa-oilskin-denounce

☐パブリックアクセスをすべて ブロック

☑ 現在の設定により、このバケットバケット内のオブジェクトが公開される可能性があることを承認します。

AWS アクセスキーの作成

AIMでグループを作成

グループ名: Admin

ポリシー名:

☑ AdministratorAccess

☑ AmazonEC2FullAccess

☑ AmazonS3FullAccess

☑ AmazonRDSFullAccess

ユーザの作成

ユーザを追加

ユーザ名: username

☑ プログラムによるアクセス

アクセス許可の設定

☑ Admin

rclone のインストール

curl https://rclone.org/install.sh | sudo bash

次に、選択したクラウドストレージプロバイダでrcloneを設定します(ここではS3のチュートリアルを紹介します)。

rclone config

こんな感じに

[s3]
type = s3
provider = AWS
env_auth = false
access_key_id = 4KNBJD3RLKXKZQK58JVR
secret_access_key = BU8NT3QGWZLCKFQ9LGK4RHCJUTXUV5Q5DBZ5UV94
region = ap-southeast-1
location_constraint = ap-southeast-1
acl = public-read

~/podsync/config/config.toml にホスト名を設定。ポッドキャストRSSフィードが、localhostではなくS3バケット内のファイルになる。

[server]
port = 8080
data_dir = "/app/data"
hostname = "https://lifeline-balsa-oilskin-denounce.s3.amazonaws.com"

Podsyncのdockerコンテナをdocker restart Podsyncで再起動し、フィードの更新が完了するのを待ちます。

sudo docker restart Podsync

crontab -eを実行し、以下のエントリを追加します。これで、rcloneを実行して、PodsyncからMP3とRSSフィードをストレージバケットにアップロードできます。

rclone sync /home/pi/podsync/data/ s3:lifeline-balsa-oilskin-denounce --include "*.{xml,mp3}"

すべてが正しくアップロードされていれば、次のURLをお使いのPodcastプレーヤーに読み込み、Podsyncがダウンロードしたすべてのエピソードを見ることができます。

https://lifeline-balsa-oilskin-denounce.s3.amazonaws.com/listen_later.xml

crontab -eを実行し、以下のエントリを追加

*/30 * * * * /usr/bin/rclone sync /home/pi/podsync/data/ s3:lifeline-balsa-oilskin-denounce --include "*.{xml,mp3}"

ファイルの定期削除

sudo nano /etc/rc.local

ファイルの最後にexit 0とあるので、その手前に起動時に実行したいコマンドを書く

find /home/pi/podsync/data/listen_later/ -type f -printf "%A+\t%p\n" | sort -r | cut -f2 | tail -n +20 | xargs --no-run-if-empty rm --

f:id:akifumi-ichiki:20210510114548p:plain
Overcastで購読したとこスクショ

参考リンク
Creating a Podcast Feed from a YouTube Playlist | Ben Congdon