En jaksanut odottaa että Spotify joskus lisäisi ominaisuuden sovellukseensa vaan päätin yrittää ratkaista ongelman itse. Minulla oli kolme ongelmaa ratkaistavana: 1. miten saada tieto kappaleen päättymisestä? 2. miten ohjata Spotify lopettamaan kappaleen toisto? ja 3. miten lisätä toiminto medianäppäimistöni stop-nappiin.
Tiesin aikaisemmin Spotifyn foorumilla käymäni keskustelun perusteella, että käyttämäni Spotifyn Linux työpöytä sovellus tarjoaa standardin Media Player Remote Interfacing Specification (MPRIS2) rajapinnan, jolla mediasoittimia voi hallita muilla ohjelmilla. Tämä rajapinta tarjoaa ratkaisun 1. ja 2. ongelmaan. Spotify ilmoittaa ko. rajapinnan kautta aina kun toistossa tapahtuu jokin muutos ja sen kautta pystyn käskemään toiston lopetuksen.
Lyhyen Googletuksen jälkeen löysin riittävät esimerkit MPRIS2 rajapinnan käyttöön Pythonilla ja kokosin alla olevan ohjelmalistauksen. Se avaa Spotifyn tarjoman rajapinnan ja jää kuuntelemaan siinä tapahtuvia muutoksia. Kun se havaitsee muutoksen lähettää se Spotifylle Stop-komennon ja pysäyttää toiston.
import dbus
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GLib
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
def properties_changed(self, *args, **kw):
player = dbus.SessionBus().get_object('org.mpris.MediaPlayer2.spotify', '/org/mpris/MediaPlayer2')
player.Stop(dbus_interface='org.mpris.MediaPlayer2.Player')
loop.quit()
bus.add_signal_receiver(properties_changed, dbus_interface="org.freedesktop.DBus.Properties",signal_name="PropertiesChanged" )
loop = GLib.MainLoop()
loop.run()
Tämä ohjelma on raaka ja pysäyttää Spotifyn toiston aina kun jokin muukin kuin Spotify generoi tarvittavan signaalin. Mutta toistaiseksi minun käytössä tätä ongelmaa ei ole tullut vastaan.
3. ongelman ratkaisuksi lisäsin KDE työpöytäympäristööni globaalin oikotien, joka aktivoituu kun työpöytäympäristö havaitsee Stop-napin painalluksesta syntyvän signaalin. Tämä oikotie käynnistää ylläolevan Python skriptin, joka jää odottamaan kappaleen vaihtumista ja sen vaihduttua lopettaa toiston ja lopettaa skriptin suorituksen.

