Существует ли способ иметь какой-то файл nowplaying.txt, который содержит в настоящее время файл проигрывания от Rhythmbox?
Я заметил несколько плагинов тут и там для этого, но ни один из них не работает (они, кажется, устарели или просто являются не рабочими вообще, несмотря на попытку зафиксировать их тут и там).
Я кодировал маленькое приложение Java, которое удовлетворяет мои потребности (оно использует эти rhythmbox-client --print-playing
команда и пишет вывод в ~/.rbplay
. Команду называют и вывод, писавшийся каждые 3 секунды. Следующий код доступен под CC 0.
import java.awt.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
public class RBPlay
{
private JFrame frame;
private JLabel lblNewLabel;
private static RBPlay instance;
public static void main(String[] args) throws IOException, InterruptedException, InvocationTargetException
{
EventQueue.invokeAndWait(new Runnable()
{
public void run()
{
try
{
instance = new RBPlay();
instance.frame.setVisible(true);
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
File f = new File(System.getProperty("user.home"), ".rbplay");
f.createNewFile();
while(true)
{
Process p = Runtime.getRuntime().exec("rhythmbox-client --print-playing");
p.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while((line = br.readLine()) != null)
{
System.out.println(line);
FileWriter fw = new FileWriter(f);
fw.write(line);
fw.close();
instance.lblNewLabel.setText(line);
}
Thread.sleep(3000);
}
}
public RBPlay()
{
initialize();
}
private void initialize()
{
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
JLabel lblCurrentSong = new JLabel("Current song : ");
frame.getContentPane().add(lblCurrentSong, BorderLayout.WEST);
lblNewLabel = new JLabel("New label");
frame.getContentPane().add(lblNewLabel, BorderLayout.CENTER);
JLabel lblCloseThisWindow = new JLabel("Close this window to stop RBPlay");
frame.getContentPane().add(lblCloseThisWindow, BorderLayout.SOUTH);
frame.pack();
}
}
Примечание: этот код не оптимизирован вообще. Это - просто быстрая вещь, которую я записал, но эй, это работает!