Lista rápida de Spotify para Unity

10

¿Cómo puedo agregar una "lista rápida" de Unity para Spotify (instalada desde su sitio web), de modo que cuando hago clic con el botón derecho en el ícono en mi dock, obtengo: "Siguiente, Anterior, Detener, Jugar" y así sucesivamente?

MarkovCh1
fuente

Respuestas:

5

spotify (cliente nativo de linux)

Dado que spotify incluye un indicador para controlar algunas de sus funciones, esto nos permite usarlo dbuspara enviar eventos.

Hay un gran script en ubuntuforums que cubre esto.

Primero instale un requisito previo:

sudo apt-get install libnet-dbus-perl

Ahora copie y pegue el script en un archivo de texto llamado spcmdy guárdelo en su carpeta de inicio.

Darle derechos de ejecución:

chmod +x ~/spcmd

Vamos a mover esto a una carpeta más útil:

mv ~/spcmd /usr/local/bin

Ahora, creemos una lista rápida.

Primero copie el archivo de escritorio de Spotify en su carpeta de inicio:

mkdir -p ~/.local/share/applications
cp /usr/share/applications/spotify.desktop ~/.local/share/applications

Abra el archivo y copie y pegue la lista rápida al final del archivo. Guárdalo

gedit ~/.local/share/applications/spotify.desktop

resultado final

ingrese la descripción de la imagen aquí

lista rápida

X-Ayatana-Desktop-Shortcuts=PlayPause;Next;Previous;Stop;

[PlayPause Shortcut Group]
Name=PlayPause
Exec=spcmd playpause
TargetEnvironment=Unity

[Next Shortcut Group]
Name=Next
Exec=spcmd next
TargetEnvironment=Unity

[Previous Shortcut Group]
Name=Previous
Exec=spcmd previous
TargetEnvironment=Unity

[Stop Shortcut Group]
Name=Stop
Exec=spcmd stop
TargetEnvironment=Unity

spcmd

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use File::Basename;
use Net::DBus;

# Figure out some dbus stuff
unless ( defined $ENV{'DBUS_SESSION_BUS_ADDRESS'} ) {
&set_DBUS_SESSION_BUS_ADDRESS;
#die "Don't know which dbus to attach to.\nMake sure environment variable DBUS_SESSION_BUS_ADDRESS is set.";
}
#my $bus = Net::DBus->find;
my $bus = Net::DBus->session;
my $spotify = $bus->get_service("org.mpris.MediaPlayer2.spotify");
my $player = $spotify->get_object("/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player");
my $application = $spotify->get_object("/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2");
my $getorset = $spotify->get_object("/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties");

# Handle command line argument
if (scalar @ARGV == 0) { &print_help; }
given ($ARGV[0]) {
# when ('play') { $player->Play(); } #Does not work for some reason.
when ('pause') { $player->Pause(); }
when ('playpause') { $player->PlayPause(); }
when ('next') { $player->Next(); }
when ('previous') { $player->Previous(); }
when ('stop') { $player->Stop(); }
when ('playstatus') { print $getorset->Get("org.mpris.MediaPlayer2.Player", "PlaybackStatus") . "\n"; }
when (m/\bspotify:(artist|album|track):[0-9a-zA-z]{22}\b/) { $player->OpenUri($_); }
when ('metadata-debug') { &print_debug_metadata; }
default { &print_help; }
}


# Print the help text
sub print_help {
print "USAGE: " . basename($0) . " {pause|playpause|next|previous|stop|playstatus|met adata-debug|<spotify URI>}\n\n";
print "\t" . "pause" . "\t\t" . "Causes spotify to pause current playback." . "\n";
print "\t" . "playpause" . "\t" . "Causes spotify to pause or play current playback." . "\n";
print "\t" . "next" . "\t\t" . "Goes to next song." . "\n";
print "\t" . "previous" . "\t" . "Goes to previous song." . "\n";
print "\t" . "stop" . "\t\t" . "Stops playback." . "\n";
print "\t" . "playstatus" . "\t" . "Prints current playstatus (Playing/Paused)." . "\n";
print "\t" . "<spotify URI>" . "\t" . "Starts playing supplied URI." . "\n";
print "\t" . "metadata-debug" . "\t" . "Shows available data on currently playing song." . "\n";
print "\t" . "\t\t" . "Fairly unformatted, thus \"debug\" data." . "\n";
print "\n";
print "EXAMPLES:\t" . basename($0) . " playpause" . "\n";
print "\t\t" . basename($0) . " spotify:track:5XXAq1r5r73ZyBS0XAiGw0" . "\n";

exit;
}

# Print some raw metadata
sub print_debug_metadata {
# Dereference the metadata hashref by copying it to a local hash
my %metadata = %{ $getorset->Get("org.mpris.MediaPlayer2.Player", "Metadata") };

# Print all metadata
print "Now Playing:\n";
for (keys %metadata) {
print $_ . ":\t" . $metadata{$_} . "\n" unless ($_ eq 'xesam:artist');
}

# Dereference the artist arrayref by copying it to local array
my @artistarray = @{ $metadata{'xesam:artist'} };

# Print all artists.
foreach my $artist (@artistarray) {
print "artist: \t" . $artist . "\n";
}
}

sub set_DBUS_SESSION_BUS_ADDRESS {
my $curruser = `whoami`; chomp $curruser;
my $procname = 'spotify';
my $pid = `pgrep -o -u $curruser $procname`; chomp $pid;
my $environ = '/proc/' . $pid . '/environ';
my $dbussession = `grep -z DBUS_SESSION_BUS_ADDRESS $environ`; $dbussession =~ s/^DBUS_SESSION_BUS_ADDRESS=//;

$ENV{'DBUS_SESSION_BUS_ADDRESS'} = $dbussession;
}
fossfreedom
fuente
5

Creo que las respuestas dadas hasta ahora son un poco complicadas. No se requiere un script por separado, los comandos DBus relevantes se pueden enviar directamente a través de dbus-send. Solo asegúrese de que el dbuspaquete esté instalado y en la línea de comando emita los siguientes comandos:

mkdir -p ~/.local/share/applications
cp /usr/share/applications/spotify.desktop ~/.local/share/applications/

Edite el archivo ~/.local/share/applications/spotify.desktoppara leer:

[Desktop Entry]
Name=Spotify
GenericName=Music Player
Comment=Listen to music using Spotify
Icon=spotify-client
Exec=spotify %U
TryExec=spotify
Terminal=false
Type=Application
Categories=Qt;Audio;Music;Player;AudioVideo
MimeType=x-scheme-handler/spotify
# ====> MODIFICATIONS START HERE <=====
Actions=PlayPause;Next;Previous

[Desktop Action PlayPause]
Name=Play/Pause
Exec=dbus-send --print-reply=literal --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
OnlyShowIn=Messaging Menu;Unity;

[Desktop Action Next]
Name=Next
Exec=dbus-send --print-reply=literal --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next
OnlyShowIn=Messaging Menu;Unity;

[Desktop Action Previous]
Name=Previous
Exec=dbus-send --print-reply=literal --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous
OnlyShowIn=Messaging Menu;Unity;

Y tu estas listo.

Michael Wild
fuente
Esta es la mejor respuesta. Sin embargo, cuando intenté hacerlo manualmente, fallé --print-reply=literaly no funcionó. ¿Tienes una explicación? No sé casi nada de DBus.
Tamás Barta
Excelente respuesta :) Pregunta adicional, ¿es posible agregar también el botón "pulgar hacia arriba" y "pulgar hacia abajo" (los que están en la radio spotify :))?
Linus
2

spotify_cmd es una herramienta para controlar una instancia en ejecución de Spotify en wine , también debería funcionar en Windows, pero no se ha probado.

Descargar spotifycmd . Copiar a escritorio. entonces

cd ~/Desktop/
tar -xvjf spotifycmd-0.5.tar.bz2 
sudo cp -r spotifycmd /usr/bin/

ahora se usa Exec=/usr/bin/spotifycmd/spotify_cmd.exe XXXXal crear una lista rápida.

Aquí XXXXes playpause, next, prev, stop, voldown, volup, etc.

para una guía para crear una lista rápida mira mi respuesta

Rahul Virpara
fuente
Esta respuesta es excelente !!!! Aunque tengo problemas con spotify_cmd.exe funcionando. Regresa Can not find spotify, is it running?en terminal. Sin embargo, esta es la pista correcta!
Ryan McClure
Oof, ¿hay una forma nativa?
MarkovCh1
@Syzygy No encontré uno. :(
Rahul Virpara
hmmm, dado el error, tal vez tengas que ejecutar la versión de Windows de Spotify debajo de Wine para que este Spotify_cmd basado en Wine funcione.
fossfreedom
@fossfreedom tienes razón. Acabo de comprobar la fuente. Incluye windows.huna biblioteca que proporciona API Win32.
Rahul Virpara
-1

Spotify tendrá un icono en el panel. Simplemente haga clic en eso y obtendrá reproducir, detener, pausar, siguiente, etc. (no recuerdo todo). No estoy seguro si eso responde a su pregunta.

usuario66987
fuente
2
Esta pregunta es cómo poner esa funcionalidad en el icono de Spotify en el iniciador de Unity también.
Eliah Kagan
Ok, solo yo que entendí mal su pregunta.
user66987