自分だけのストリーミング音楽サービスの構築
時間がある時はいつでも音楽を聴いています。歳を重ねるにつれて、音楽への依存度が増しています。通勤中、野菜を刻んでいる時、上の階のリフォーム工事の騒音を遮断している時、旅行中、高速電車に乗っている時、深夜に眠れない時、ゲームをしている時など、ほぼ常に何かを聴いています。「音楽は人を裏切らない。魂を癒す香油だ」という諺があります。
以前はNetEase Cloud Musicを使っていて、プロモーションで会員になったのですが、しょっちゅう表示されるスプラッシュスクリーンの広告に耐えられず、Soda Musicに乗り換えました。Soda MusicならDouyin(TikTok)で色々なマイナーな曲を簡単に見つけることができたのですが、最近は広告が大量に表示され、音楽を聴いている最中に短いドラマの広告まで表示されるようになりました。さらにひどいのは、おすすめもどれも同じで、信頼性が低いことです。
そこで、自分でストリーミング音楽サービスを作るというアイデアが再び浮かびました。 Soda Musicに切り替える前は、Polaris と付属のiOSクライアントを使っていましたが、iOSクライアントは後に消えてしまいました。
こうなってしまったので、別の解決策を見つける必要がありました。Navidrome + Amperfy + yt-dlp です。これは、予算重視の私のニーズを満たす、巧妙な組み合わせでした。
さて、早速始めましょう。
1. Raspberry PiにNavidromeを導入
長年の読者の方はご存知かもしれませんが、私は自宅でインターネット検閲を回避するためにRaspberry Piを使ってSing-boxを運用しています。自動プロキシを使用しており、iPhone、iPad、Firefoxなど、プロキシをサポートするデバイスで簡単に動作します。少なくとも私の経験では、様々なVPNを使うよりもはるかに高速です。信じてください!
Raspberry Piはルーターの隣に設置されており、常時電源がオンで消費電力はわずか数ワット、ストレージ容量は10GBと、Navidromeの導入に最適です。
Navidromeをインストールする際は、正しいバージョンを選択してください。私はnavidrome_0.58.5_linux_armv7.debを使用しました。これはarmv7です。お使いのRaspberry PiはMode Bなので、異なるアーキテクチャを混同しないでください。
私のようにRaspberry PiでDebianを実行している場合、以下のエラーが発生します。
1package architecture (armv7) does not match system (armhf)
解決策:
1sudo dpkg --add-architecture armv7
その後、インストールします。
1sudo apt install ./navidrome_0.58.5_linux_armv7.deb
私は公式のデフォルト設定を使用しています。これは妥当で標準化されていると思います。音楽ディレクトリは/opt/navidrome/musicなので、ここに音楽コレクションを置いてください。
1mephisto@raspberrypi:~ $ cat /etc/navidrome/navidrome.toml
2DataFolder = "/var/lib/navidrome"
3MusicFolder = "/opt/navidrome/music"
4
5mephisto@raspberrypi:~ $ systemctl cat navidrome.service
6# /etc/systemd/system/navidrome.service
7[Unit]
8Description=Your Personal Streaming Service
9ConditionFileIsExecutable=/usr/bin/navidrome
10
11After=remote-fs.target network.target
12
13[Service]
14StartLimitInterval=5
15StartLimitBurst=10
16ExecStart=/usr/bin/navidrome "service" "execute" "-c" "/etc/navidrome/navidrome.toml"
17WorkingDirectory=/var/lib/navidrome
18User=navidrome
19Restart=on-failure
20SuccessExitStatus=1 2 8 SIGKILL
21TimeoutStopSec=20
22RestartSec=120
23EnvironmentFile=-/etc/sysconfig/navidrome
24
25DevicePolicy=closed
26NoNewPrivileges=yes
27PrivateTmp=yes
28ProtectControlGroups=yes
29ProtectKernelModules=yes
30ProtectKernelTunables=yes
31RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
32RestrictNamespaces=yes
33RestrictRealtime=yes
34SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap
35ReadWritePaths=/var/lib/navidrome
36ProtectSystem=full
37
38[Install]
39WantedBy=multi-user.target
2. 音楽アプリ Amperfy
AppleユーザーはApple Storeで検索してダウンロードできます。無料です(Androidには類似アプリが多数ありますので、お好みのものを選んでください)。私は他のアプリと比較した結果、バグが見つからなかったため、このアプリを選びました。コードはオープンソースで、有料アプリや個人向けアプリと比べても遜色ありません。
ソースコードはこちらです:https://github.com/BLeeEZ/amperfy。以前使っていたPolarisよりもはるかに頻繁にアップデートされており、今後もアップデートが途絶えることはないでしょう。もちろん、他のアプリを選ぶこともできますが、それは個人の好みの問題です。
3. スマートフォンをストリーミングサービスに接続するには?
NavidromeとAmperfyの両方が利用可能です。接続方法は?とても簡単です。
同じイントラネット上にいる場合は、スクリーンショットをご覧ください。
HTTP サービスフィールドに、http://192.168.1.5:4533 のように入力します。
Navidrome サービスは起動後、ポート 4533 でリッスンします。ブラウザで初めてアクセスすると、Web ページにユーザー名とパスワードの作成手順が表示されます。とても簡単なので、実際に試してみればすぐに理解できるでしょう。
これで最後のステップを除いて準備は完了です。実は、さらに最適化することも可能です。例えば、自宅や外出先から Raspberry Pi 上のサービスにアクセスするにはどうすればいいでしょうか?これについては後ほど説明します。
4. 音楽の入手
音楽は現在著作権で保護されているため、この部分は非常にデリケートです。各自が独自の方法を持っているとしか言えません。例えば、合法的に入手する手段をお持ちの場合、私は技術的な解決策を検証しているだけで、法的責任は一切負いません。
これは、著作権フリーの音楽をダウンロードしていることを前提としています。ゲーム「0 A.D.」のサウンドトラックを例に挙げます。
1➜ yt-dlp -x --cookies-from-browser firefox --proxy 192.168.1.5:1081 --no-check-certificate "https://www.youtube.com/watch?v=kUqhZTaxP50"
2Extracting cookies from firefox
3Extracted 1356 cookies from firefox
4[youtube] Extracting URL: https://www.youtube.com/watch?v=kUqhZTaxP50
5[youtube] kUqhZTaxP50: Downloading webpage
6[youtube] kUqhZTaxP50: Downloading tv downgraded player API JSON
7[youtube] kUqhZTaxP50: Downloading web safari player API JSON
8[youtube] kUqhZTaxP50: Downloading player b2515611-main
9[youtube] [jsc:deno] Solving JS challenges using deno
10WARNING: [youtube] [jsc] Remote components challenge solver script (deno) and NPM package (deno) were skipped. These may be required to solve JS challenges. You can enable these downloads with --remote-components ejs:github (recommended) or --remote-components ejs:npm , respectively. For more information and alternatives, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
11WARNING: [youtube] kUqhZTaxP50: n challenge solving failed: Some formats may be missing. Ensure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
12[youtube] kUqhZTaxP50: Downloading m3u8 information
13[info] kUqhZTaxP50: Downloading 1 format(s): 96
14[download] Sleeping 4.00 seconds as required by the site...
15[hlsnative] Downloading m3u8 manifest
16[hlsnative] Total fragments: 31
17[download] Destination: Ammon-Ra - 0 A.D Soundtrack [kUqhZTaxP50].mp4
18[download] 100% of 7.17MiB in 00:00:20 at 364.43KiB/s
19[FixupM3u8] Fixing MPEG-TS in MP4 container of "Ammon-Ra - 0 A.D Soundtrack [kUqhZTaxP50].mp4"
20[ExtractAudio] Destination: Ammon-Ra - 0 A.D Soundtrack [kUqhZTaxP50].m4a
21Deleting original file Ammon-Ra - 0 A.D Soundtrack [kUqhZTaxP50].mp4 (pass -k to keep)
22➜ ls -al Ammon-Ra\ -\ 0\ A.D\ Soundtrack\ \[kUqhZTaxP50\].m4a
23-rw-r--r-- 1 mephisto mephisto 2542396 Nov 21 19:32 'Ammon-Ra - 0 A.D Soundtrack [kUqhZTaxP50].m4a'
このコマンドを実行すると、拡張子が .m4a の音楽ファイルが生成されます。パラメータを指定することで、他の形式も取得できます。デフォルトの m4a ファイルで問題ないようです。火力発電、水力発電、原子力発電の区別がつきたくないというなら、私よりあなたの方が優れていると認めます😊。
主要コンポーネント: yt-dlp -x --cookies-from-browser firefox --proxy 192.168.1.5:1081 --no-check-certificate
proxy 192.168.1.5:1081 はインターネット検閲を回避するために使用されます。中国本土の人々は幸運です。そこで技術を学ぶことができるのですから。
その他のパラメータはオンラインで見つけました。そうでなければダウンロードは不可能だったでしょう。ブラウザからクッキーを取得し、証明書を無視するには、ある程度の時間と試行錯誤が必要でした。
これで音楽ソースの問題は解決しました。繰り返しますが、著作権フリーの音楽のみをダウンロードすることをお勧めします!yt-dlp は非常に強力で使いやすいという強い印象を受けました。
5. パブリックインターネットからのアクセス方法
最後に、外出先から自宅のRaspberry PiでNavidromeサービスにアクセスしたいという方もいるかもしれません。
これは単にネットワークとリソースの問題です。私の解決策は以下の通りですが、すべての方に適しているとは限りません。
私はドメイン名と基本的な海外ウェブホスティングプランを持っているので、frpを使えば簡単に問題を解決できます。トラフィックパスは以下のとおりです。
外出先で音楽を聴いている手 -> スマートフォン📱 -> パブリックドメイン名/IPアドレスを持つホスト (Frps) -> Raspberry Pi (Frpc) -> Navidrome -> 保存した曲
Frpsサーバーの例(パブリックIPアドレスを持つホストで実行):
1root@tokyo:~# cat /etc/frp/frps.toml
2bindPort = 8888
3vhostHTTPPort = 8088
4auth.method = "token"
5auth.token = "your_token"
Frpcクライアントの例(Raspberry Piで実行):
1mephisto@raspberrypi:~ $ cat /etc/frp/frpc.toml
2serverAddr = "your_vps_server_public_ip"
3serverPort = 8888
4auth.method = "token"
5auth.token = "your_token"
6
7[[proxies]]
8name = "navidrome"
9type = "http"
10localIP = "127.0.0.1"
11localPort = 4533
12customDomains = ["navidrome.xxx.com"]
ここではドメイン名でアクセスしています。https://navidrome.xxx.com は Amperfy が使用するアドレスです。ドメイン名の方が覚えやすく、IP アドレスは変更されるため、パブリック IP アドレスのみを使用することもできます。
vhostHTTPPort = 8088 は Caddy 用です。
1navidrome.xxx.com {
2
3reverse_proxy localhost:8088
4
5}
この方法だと、クライアント側でポート番号を入力する必要がなくなり、より高速で便利になります。
ドメイン名をお持ちでない場合は、パブリックIPアドレス:ポート番号による方法もご利用いただけます。
6. まとめ
この手頃な価格のストリーミング音楽サービスは、ある程度の柔軟性を提供し、インターネットに接続できる環境であれば、いつでもどこでも音楽を聴くことができます。自宅で聴くだけであれば、実質的に費用はかかりません(ドメイン名やパブリックIPアドレスなどは必要ありません)。音楽を整理する時間を少し取るだけで済みます。
また、音楽をコンピューターにダウンロードし、rsyncを使ってRaspberry Piに同期し、操作しやすいようにコンピューターをモニターに接続しました。
パブリックインターネットアクセスを有効にする際は、常にネットワークセキュリティに注意してください。操作内容を理解し、Navidromeには強力なパスワードを設定し、Raspberry Piに重要なデータを保存しないように注意してください。脆弱性があった場合の対策として、Caddyレイヤーに保護を追加することも選択肢の1つですが、保護を追加した後でもAmperfyが正常に接続できるかどうかはテストしていません。今のところは、これが解決策です。
著作権に関する声明:
- 出典のないコンテンツはすべてオリジナルです。、無断転載はご遠慮ください(転載後にレイアウトが崩れたり、内容が制御不能になったり、継続的に更新できない等の理由から)。
- このブログのコンテンツを非営利目的で解釈したい場合は、(読者の便宜のため)「オリジナル ソース」または「参照リンク」の形式でこのサイトの関連 Web ページ アドレスを提供してください。
このシリーズの投稿:
- MangoHud パフォーマンスモニタリング
- スタンドアロンウィンドウマネージャーにおける画面録画問題のトラブルシューティング
- Arch LinuxでBluetoothデバイスにスムーズに接続する方法
- Git と Ansible を使った設定ファイルの管理
- Arch Linux SSL VPNクライアント設定
- Linux でネットワーク設定の変更を保存できない問題の解決方法
- labwc 環境で wlogout を有効にする
- Atuin ZFS における遅延問題の解決
- Wayland 環境における自動壁紙切り替え
- SuperTuxKart トライアル