UbuntuでBluetooth経由で聴いているSpotifyの特定のCMをミュートする
不快なCMをミュートしたい
音楽ストリーミングサービスのSpotifyを、Linux用のPCクライアントアプリ(Spotify for Linux)を使ってBluetoothヘッドホンで聴いている。
ショートカットキーで再生/停止や曲送り、ミュートができるように設定したところ、好みでない曲をすぐスキップできたり、しつこく繰り返されて聞きたくないCMを素早くミュートすることができたりと快適になった。
そのように快適に利用していたが、だんだん特定のCMが不愉快になってきた。
そのCMは、ささやくような呼び掛け声から始まるのだが、この声がCMの開始と同時に、不意打ちのようにヘッドホンで聴いている耳元にささやきかけられるので、びっくりするとともにギョッとして不愉快になる。
そして悪いことにこのCMが一番多く流されてくるので、何度も何度も不快な不意打ちをされることになった。
しばらくは手動でミュートしていたが、この不意打ちが不愉快でたまらず精神衛生上好ましくないため、このCMが入りしだい音声をミュートにする方法を調査した。
OSはUbuntu 16.04で、前提としてbluezパッケージがインストールしてあり、Bluetooth経由で音楽を聴いていることが条件。
シェルスクリプトで対応
調べてみると、シェルスクリプトで対応する方法があるようだった。
参照サイトに挙げたページのスクリプトを改変して、以下のスクリプトを作成した。
#!/bin/bash dbus-monitor "type='signal',path='/org/mpris/MediaPlayer2',member='PropertiesChanged'" | while read -r line ; do # 広告文字列の有無を判定 if ! [[ ${line} == *'000000000track-id-here0000000000'* ]] then # 広告文字列なし # ミュートがオフでなければミュートを解除する if ! [[ ${mute} == '0' ]] then echo 'mute off' num=`pactl list sinks short | grep bluez`; pactl set-sink-mute ${num:0:2} 0 mute='0' fi else # 広告文字列あり echo 'mute on' num=`pactl list sinks short | grep bluez`; pactl set-sink-mute ${num:0:2} 1 mute='1' # 広告文字列が見つかったらループを抜ける break fi done # 広告が終わるまで待つ sleep 1.3 # このスクリプトを再実行する(無限ループ) exec $0
件のCM以外のCMについては通常通り音声が流れて構わないので、メタデータに含まれるtrackidというキーを使って件のCMだけをミュートする。
件のCMが流れた際のtrackidの値を確認しておき、5行目の広告文字列の有無の判定(「000000000track-id-here0000000000」の箇所)に指定した。
ミュートできない場合があり確認したところ、件のCMに振られているtrackidが一つだけではないのが原因だった。件のCMが流れた際のtrackidをしばらく確認したところ、2つのtrackidを使って広告が配信されているようなので、5行目の広告文字列の有無の判定を以下のように2つのtrackidを指定するよう変更したところ、問題なくミュートされるようになった。
if ! ([[ ${line} == *'000000000track-id1-here000000000'* ]] || [[ ${line} == *'000000000track-id2-here000000000'* ]])
まとめ
CMが嫌なら有料プランを契約しろという話だが、特定の広告が不愉快なだけなのでミュートで対応することにした。
あくまで、不愉快で耐えがたいCMに対処するための一時的な措置と考えている。
金銭的な余裕がある場合は、素直に有料プランにすればこうした手間もなく、スマホアプリで楽曲を指定した再生もでき、曲をダウンロードしてスマホの通信容量を消費せずに再生(オフライン再生)できたり、外出先や移動中でも好みの楽曲が聴けるようになるのは大きなメリットなので、サブスク契約を検討したい。
参照サイト
- Linux Spotify Ad Mute · GitHub
こちらのスクリプトを改変して使用した。そのまま使おうとしたが、条件判定のところのコマンドで、以下のように「そのようなインターフェイスが無い」とのエラーが出てしまうため、本文のスクリプトのようにdbus-monitorの出力で判定するようにした。dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify / org.freedesktop.MediaPlayer2.GetMetadata Error org.freedesktop.DBus.Error.UnknownMethod: No such interface 'org.freedesktop.MediaPlayer2' on object at path /
- Spotify - ArchWiki
SpotifyのLinuxクライアントについて情報が網羅されている。コマーシャルをミュートしたり、再生/停止などのグローバルホットキーを設定する方法などが助けになった。コマーシャルのミュートについては、スクリプトより手軽な方法としてhostsファイルへ記載する方法がある模様。
- PulseAudio - ArchWiki
PulseAudioの使い方。こちらからキーボードで音量調整する方法を知ることができた。