В этом году я не покупал премиальные 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.