Доступ к экземпляру Clementine через D-Bus MPRIS в Java - PullRequest
2 голосов
/ 28 декабря 2011

Я использую Clementine в качестве музыкального плеера.

Им можно управлять с помощью команд D-Bus. В командной строке, используя qdbus, я могу:

  • Начало
  • Стоп
  • Пауза игрока
  • Принудительно пропустить песню в плейлисте
  • Проверьте длину списка воспроизведения
  • Проверьте текущую воспроизводимую дорожку в списке воспроизведения и его метаданные.

Я хочу сделать это в программе на Java. Я пытался заставить все работать, но почему-то я не понимаю этого и не могу найти пример кода, который мог бы использовать для своей программы.

Вот пример сеанса с использованием qdbus, чтобы дать вам представление об именах сервисов и так далее:

$ qdbus org.mpris.clementine /TrackList
method int org.freedesktop.MediaPlayer.AddTrack(QString, bool)
method void org.freedesktop.MediaPlayer.DelTrack(int)
method int org.freedesktop.MediaPlayer.GetCurrentTrack()
method int org.freedesktop.MediaPlayer.GetLength()
method QVariantMap org.freedesktop.MediaPlayer.GetMetadata(int)
method void org.freedesktop.MediaPlayer.PlayTrack(int)
method void org.freedesktop.MediaPlayer.SetLoop(bool)
method void org.freedesktop.MediaPlayer.SetRandom(bool)
signal void org.freedesktop.MediaPlayer.TrackListChange(int)
method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name)
method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name)
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value)
method QString org.freedesktop.DBus.Introspectable.Introspect()

$ qdbus org.mpris.clementine /TrackList GetLength
13

$ qdbus org.mpris.clementine /TrackList GetCurrentTrack
7

$ qdbus org.mpris.clementine /TrackList GetMetadata 7
album: On The Wires Of Our Nerves
artist: Add N To X
audio-bitrate: 224
audio-samplerate: 44100
genre: Other
location: /media/nas-media/Music/Add_N_to_X/On_The_Wires_Of_Our_Nerves/08-King_Wasp.ogg
mtime: 215000
time: 215
title: King Wasp
tracknumber: 8
year: 1998

Я пытаюсь создать программу, которая печатает только номер текущей воспроизводимой дорожки в списке воспроизведения. Я подумал, что сначала нужно создать интерфейс, поэтому я создал что-то вроде:

package my.package;

import org.freedesktop.dbus.DBusInterface;
import org.freedesktop.dbus.DBusInterfaceName;

@DBusInterfaceName("org.freedesktop.MediaPlayer")
public interface TrackList extends DBusInterface {
   int GetCurrentTrack();
}

Затем я использовал это в таком тесте:

DBusConnection dc  = DBusConnection.getConnection(DBusConnection.SESSION);
TrackList trackList = (TrackList) dc.getRemoteObject("org.mpris.clementine", "/TrackList");
int currentTrack = trackList.GetCurrentTrack();
System.out.println(currentTrack);

Но это выдает ошибку для второй строки: java.lang.ClassCastException: $Proxy6 cannot be cast to my.package.TrackList.

Я уверен, что делаю больше одной ошибки. Может ли кто-нибудь предоставить информацию о моем подходе?

1 Ответ

2 голосов
/ 30 декабря 2011

Не могу сейчас проверить это с Клементиной, но следующий подход с явным типом, указанным в вызове getRemoteObject, работает для QuodLibet:

package my.sample;

import org.freedesktop.dbus.DBusInterface;
import org.freedesktop.dbus.DBusInterfaceName;

@DBusInterfaceName("net.sacredchao.QuodLibet")
public interface Quodlibet extends DBusInterface {
    void Play();
    void Pause();
}

Призвание:

DBusConnection dc = DBusConnection.getConnection(DBusConnection.SESSION);
Quodlibet player = dc.getRemoteObject("net.sacredchao.QuodLibet",
    "/net/sacredchao/QuodLibet", Quodlibet.class);
player.Play();
Thread.sleep(3000, 0);
player.Pause();
dc.disconnect();
...