У меня есть конфигуратор Conky, который получает вывод скрипта python:
#!/usr/bin/python
import subprocess
import sys
import getopt
def cmd_output(args, **kwds):
kwds.setdefault("stdout", subprocess.PIPE)
kwds.setdefault("stderr", subprocess.STDOUT)
p = subprocess.Popen(args, **kwds)
return p.communicate()[0]
def main(argv):
try:
# name = "org.mpris.MediaPlayer2.vlc" #get this from "qdbus | grep vlc" and change the 3 lines below
data = str(cmd_output("qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Metadata".split()))
status = str(cmd_output("qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlaybackStatus".split()))
current_seconds = int(cmd_output("qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Position".split()))/1000
except ValueError:
if not data:
print("No Song Playing")
sys.exit()
except:
print("VLC Not Running")
sys.exit()
status = status[:-1]
start = data.find("title:")
end = data.find("xesam:tracknumber:")
if end==-1:
end = data.find("xesam:url:")
title = data[start+7:end-1]
if len(title)>40:
title = "Unknown"
start = data.find("artist:")
end = data.find("xesam:title:")
artist = data[start+8:end-1]
if len(artist)>40:
artist = "Unknown"
start = data.find("album:")
end = data.find("xesam:artist:")
album = data[start+7:end-1]
if len(album)>40:
album = "Unknown"
start = data.find("vlc:length:")
end = data.find("vlc:publisher:")
length_seconds = int(data[start+11:end])/1000
current_seconds = int(current_seconds / 1000)
current_position_percent = str(int((float(current_seconds) / float(length_seconds))*100))
length = str(length_seconds/60).rjust(1,"0")+":"+str(length_seconds%60).rjust(2,"0")
current_position = str(int(current_seconds/60)).rjust(1,"0")+":"+str(int(current_seconds%60)).rjust(2,"0")
if len(argv) < 1:
print("Error: No arguments specified. Type -h for help.")
try:
opts, args = getopt.getopt(argv,"tarslcph")
except getopt.GetoptError:
print("Error: Unknown argument. Type -h for help.")
sys.exit(2)
for opt, arg in opts:
if opt == "-t":
print(title)
sys.exit()
elif opt == "-a":
print(album)
sys.exit()
elif opt == "-r":
print(artist)
sys.exit()
elif opt == "-s":
print(status)
sys.exit()
elif opt == "-l":
print(length)
sys.exit()
elif opt == "-c":
print(current_position)
sys.exit()
elif opt == "-p":
print(current_position_percent)
sys.exit()
else:
print("Provide at least one of the following arguments")
print("-t Display playing title")
print("-s Display playback status")
print("-l Display length of the file playing")
print("-c Display current position")
print("-p Display percent of elapsed time")
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])
Он отлично работает, если VLC работает, но не работает вообще, если это не так и просто использует время процессора. Как предотвратить ошибку с значением current_seconds, не предоставляющим действительный номер, когда VLC не открыт и не воспроизводится?
Вы пытались инкапсулировать место (ы), которое вы вызываете на этом скрипте (в вашем конфигурационном файле) с помощью if_running?
Из документации:
, если PROCESS работает, отображает все $ if_running и соответствующий $ endif. Это использует команду `` pidof '', поэтому поддерживается также -x-переключатель.
Например, вы могли бы попробовать его так: $(if_running vlc)<python script calls>$endif.
Вы пытались инкапсулировать место (ы), которое вы вызываете на этом скрипте (в вашем конфигурационном файле) с помощью if_running?
Из документации:
, если PROCESS работает, отображает все $ if_running и соответствующий $ endif. Это использует команду `` pidof '', поэтому поддерживается также -x-переключатель.
Например, вы могли бы попробовать его так: $(if_running vlc)<python script calls>$endif.