錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

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

備考
  • スクリプト中5行目の「000000000track-id-here0000000000」はダミー文字列。これをtrackidの値に置き換える(trackidについては以下を参照)。
  • 確認していないが、12・18行目のbluezをalsaにすれば、有線接続のスピーカーで聴いている場合にミュートできるようになるはず
  • 2行目のdbus-monitorコマンドを実行しておくと、曲が開始されたときにメタデータが出力される。
    くだんの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に対処するための一時的な措置と考えている。

    金銭的な余裕がある場合は、素直に有料プランにすればこうした手間もなく、スマホアプリで楽曲を指定した再生もでき、曲をダウンロードしてスマホの通信容量を消費せずに再生(オフライン再生)できたり、外出先や移動中でも好みの楽曲が聴けるようになるのは大きなメリットなので、サブスク契約を検討したい。

    参照サイト