Как произвести в настоящее время файл проигрывания к текстовому файлу в Rhythmbox?

Существует ли способ иметь какой-то файл nowplaying.txt, который содержит в настоящее время файл проигрывания от Rhythmbox?

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

1
задан 4 August 2016 в 16:40

1 ответ

Я кодировал маленькое приложение 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();
}

}

Примечание: этот код не оптимизирован вообще. Это - просто быстрая вещь, которую я записал, но эй, это работает!

0
ответ дан 28 September 2019 в 17:51

Другие вопросы по тегам:

Похожие вопросы: