В этом году я не покупал премиальные Spotify (пока?). Не знаю, только у меня такое или у всех так, но, похоже, меня почему-то засыпают рекламой. Я получаю 2–3 рекламы между каждыми 3–4 песнями. Они скучные, повторяющиеся и даже иногда на других языках. Я понимаю, что идея рекламы состоит в том, чтобы подтолкнуть людей платить, поэтому я думаю, что они успешны в этом отношении.
Примечание (от меня в будущем): я платный подписчик Spotify. Но все же есть смысл работать над подобными лайфхаками для развлечения и обучения!
Итак, давайте заставим Linux отключать звук при воспроизведении рекламы Spotify!
Понимание d-bus и MPRIS
Некоторый контекст, прежде чем я начну показывать, как я решил эту проблему. В Linux есть система шины сообщений, называемая d-bus. d-bus — это бесплатный стандарт рабочего стола, и он стоит за почти всем общением, которое происходит между программами.
Еще одна важная часть называется MPRIS. MPRIS расшифровывается как Спецификация удаленного интерфейса медиаплеера. Это стандартный интерфейс d-bus, целью которого является создание общего программного API для управления медиаплеерами (это прямо скопировано из спецификации). Это также спецификация freedesktop. Это красота спецификаций и бесплатный рабочий стол, все известные рабочие столы придерживаются этого стандарта, и он хорошо документирован.
Распознавание, когда Spotify воспроизводит рекламу
Все, что нам нужно сделать, это запустить небольшую функцию каждую секунду, чтобы проверить, какой носитель воспроизводится по имени. Если окажется, что это "Advertisement"
, то мы просто отключим звук источника звука. Я запускаю ALSA (Advanced Linux Sound Architecture) в фоновом режиме, и им можно управлять с помощью amixer. Скорее всего, ваша версия Linux тоже работает.
Важная команда для понимания находится во второй строке. Давайте разберем ее.
- Это отправляет команду на d-bus, запрашивая свойства mpris для Spotify. Это вернет набор значений, таких как идентификатор дорожки, длина, альбом, альбомАртист и т. д. Запустите эту команду при запуске Spotify, чтобы получить представление о том, какие данные доступны для нас. (ссылка)
- Также пересылаем stderr в /dev/null, используя
2>/dev/null
. «Правильный» способ сделать это — проверить, работает ли Spotify, и если да, пропинговать d-bus. Но это слишком много команд для чего-то, что выполняется каждую секунду. Поэтому всякий раз, когда Spotify не запущен, команда выдаст ошибку, и ошибка будет отправлена в пустоту. sed -n '/title/{n;p}'
Флаг -n подавляет весь вывод, который не напечатан явно.n
в цветочных скобках переходит на следующую строку иp
печатает ее явно.(ref)- На данный момент у нас останется
variant string "<media name>"
.cut
используется с разделителем (-d
) из"
, а первая (нулевая) часть вынимается с использованием-f
Теперь заголовок мультимедиа сравнивается со строкой "Advertisement"
(это то, что Spotify отправляет в MPRIS, если воспроизводится реклама). Если true, то мы отключаем звук с помощью amixer -q -D pulse sset Master mute
else unmute.
Наконец, нам нужно разместить его где-нибудь так, чтобы он запускался при запуске.
Не в
.bashrc
/.zshrc
, потому что они запускаются только при запуске оболочки. Чтобы он запускался при старте системы, этот триггер нужно поместить в .profile.
Давайте добавим цикл in.profile
для запуска функции каждую секунду.
Вот и все! Теперь всякий раз, когда Spotify воспроизводит рекламу, звук автоматически отключается.
Почему я вообще не могу отключить звук!?
Предыдущее решение работает, но это очень плохой вариант. Каждую секунду он проверяет, называется ли текущая воспроизводимая музыка «Реклама», и если да, то приглушает ее. Но проблема в том, что теперь звук нельзя отключить вручную. Поскольку каждый раз, когда звук отключается вручную, в следующую секунду запускается скрипт -› видит, что имя носителя не является Advertisement, и включает звук!
Таким образом, одна проверка работоспособности, которую нужно добавить, — это убедиться, что Spotify действительно работает, а затем проверить, является ли музыка, воспроизводимая Spotify, рекламой, и отключить ее. Давайте теперь посмотрим на модифицированную функцию.
Два логических значения: первое (IS_MUTE) проверяет, отключен ли звук, а второе (IS_SPOTIFY_AD) проверяет, называется ли имя текущей воспроизводимой песни Spotify «Реклама». Сначала проверьте, воспроизводится ли Spotify, позже, если он не отключен, и реклама Spotify, затем отключите звук, иначе включите звук. Это гарантирует, что когда Spotify не воспроизводится, отключение звука работает должным образом.
Но и с этим есть проблемы. Если Spotify приостановлен, а Firefox воспроизводит звук, отключение звука больше не работает должным образом. Вы также не можете отключить звук песни во время воспроизведения Spotify 😆
Идеальным способом было бы просто иметь дело со звуковым потоком Spotify и управлять им.
Решение
Вместо того, чтобы иметь дело со всей звуковой картой, теперь мы имеем дело только с входным приемником Spotify. Получите правильный идентификатор приемника импульсного аудиовхода и отключите его. Pulse Audio — это звуковой сервер, распространяемый на бесплатном рабочем столе.
Честно говоря, я понятия не имею, что за магия Perl заключается в команде, которая извлекает идентификатор приемника Spotify. Я просто скопировал его из stackoverflow и сделал grep | сократить, чтобы получить номер раковины. Позже, когда воспроизводится реклама, я использую pactl
для отключения входного звукового приемника. Кажется, это работает так, как ожидалось.
Bash с утилитами unix — убийственная комбинация, возможно, мне следует написать статью, объясняющую основы bash и некоторые полезные утилиты unix.
Первоначально опубликовано на https://bharatkalluri.com.