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.conf
を ssh
と一緒に作成する
country=US ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="My Home" psk="yNLVb9V4JG" }
Tera Term で Raspberry Pi に SSH 接続
ホスト: 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 --
参考リンク
Creating a Podcast Feed from a YouTube Playlist | Ben Congdon