Быстрый список Spotify для Unity

10

Как я могу добавить «быстрый список» Unity для Spotify (установленный с их веб-сайта), чтобы при щелчке правой кнопкой мыши по значку в доке я получал: «Далее, Предыдущий, Остановить, Играть» и т. Д.?

MarkovCh1
источник

Ответы:

5

spotify (собственный клиент linux)

Поскольку spotify включает индикатор для управления некоторыми из его функций, это позволяет нам использовать dbusдля отправки событий.

На ubuntuforums есть отличный скрипт, который охватывает это.

Сначала установите предварительное условие:

sudo apt-get install libnet-dbus-perl

Теперь скопируйте и вставьте скрипт в текстовый файл с именем spcmdи сохраните его в своей домашней папке.

Дайте ему права на выполнение:

chmod +x ~/spcmd

Давайте переместим это в более полезную папку:

mv ~/spcmd /usr/local/bin

Теперь давайте создадим быстрый список.

Сначала скопируйте файл рабочего стола spotify в вашу домашнюю папку:

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

Откройте файл, скопируйте и вставьте быстрый список в конец файла. Сохрани это.

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

конечный результат

введите описание изображения здесь

Quicklist

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;
}
свобода ископаемых
источник
5

Я думаю, что ответы, данные до сих пор, немного усложняют вещи. Никакого отдельного скрипта не требуется, соответствующие команды DBus могут быть отправлены напрямую через dbus-send. Просто убедитесь, что dbusпакет установлен и в командной строке введите следующие команды:

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

Отредактируйте файл следующим ~/.local/share/applications/spotify.desktopобразом:

[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;

И вы сделали.

Майкл Уайлд
источник
Это лучший ответ. Однако, когда я попытался сделать это вручную, я пропустил --print-reply=literal, и это не сработало. У вас есть объяснение? Я почти ничего не знаю о DBus.
Тамас Барта
Превосходный ответ :) Дополнительный вопрос, можно ли добавить кнопки «большой палец вверх» и «большой палец вниз» (те, которые есть в радио spotify :))?
Линус
2

spotify_cmd - это инструмент для управления запущенным экземпляром Spotify под Wine , он должен работать и на Windows, но не был протестирован.

Скачать spotifycmd . Копировать на рабочий стол. затем

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

Теперь используйте Exec=/usr/bin/spotifycmd/spotify_cmd.exe XXXXпри создании быстрого списка.

Вот XXXXэто playpause, next, prev, stop, voldown, volupи т.д.

для руководства по созданию быстрого списка посмотрите на мой ответ

Рахул Вирпара
источник
Этот ответ отлично !!!! У меня проблемы с работой spotify_cmd.exe. Возвращается Can not find spotify, is it running?в терминал. Это правильный путь, хотя!
Райан МакКлюр
Ой, есть родной путь?
MarkovCh1
@ Syzygy Я не нашел ни одного. :(
Рахул Вирпара
хммм - учитывая ошибку - может быть, вам нужно запустить версию spotify для windows под wine, чтобы эта работа на основе wine spotify_cmd работала.
fossfreedom
@fossfreedom ты прав. только что проверил источник. он включает windows.hв себя библиотеку, которая предоставляет Win32 API.
Рахул Вирпара
-1

Spotify будет иметь значок на панели. Просто нажмите на это, и вы получите игру, остановку, паузу, следующий и т. Д. (Не помню все). Не уверен, что это отвечает на ваш вопрос.

user66987
источник
2
Этот вопрос спрашивает, как добавить эту функциональность в иконку Spotify на панели запуска Unity.
Элия ​​Каган
Хорошо, только я неправильно понял его вопрос.
user66987