问题描述
我正在编写一个 JukeBox 程序,它根据组合键(A1、B2、C3 等)播放媒体。除了“media_player.next()”命令外,一切都按我期望的方式工作。
假设您要排队 3 首歌曲。如果你按下“y”键,它会像我期望的那样跳过这首歌。我的问题是,一旦播放到第 3 首歌曲,如果您再次点击“y”,它会回到第一首歌曲。我不想要那个。我希望“y”键带您在媒体列表中前进...如果这是媒体列表中的最后一首歌曲,请不要转到下一首歌曲。我怎么知道这是否是媒体列表中的最后一首歌曲,或者如何阻止 VLC 回到开头?
~/.local/lib/python3.5/site_packages/__pycache__
解决方法
正如我在评论中提到的,MediaListEndReached
似乎对我没有任何作用,因此运行 list
是解决问题的最简单方法,以下代码测试正在播放的项目的 list
位置并退出,如果 next
或 previous
命令试图越过列表的末尾。
您只需跟踪索引变量即可获得相同的结果。
您可能需要调整 mrl
的拆分以匹配列表中的条目。
import vlc
import time
## pinched from vlc for keyboard input
import termios
import tty
import sys
mymedia = ["vp.mp3","vp1.mp3","happy.mp3"]
def getch(): # getchar(),getc(stdin) #PYCHOK flake
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd,termios.TCSADRAIN,old)
return ch
## end pinched code
def jukebox():
player.play_item_at_index(0)
m = player.get_media_player()
print("Playing - ",m.get_media().get_mrl())
while True:
k = getch()
if k == "n": #Next
media = m.get_media()
if media.get_mrl().rsplit("/",1)[1] == mymedia[-1]: #Next requested but already at the end
break
player.next()
if k == "p": #Previous
media = m.get_media()
if media.get_mrl().rsplit("/",1)[1] == mymedia[0]: #Previous requested but already at the beginning
break
player.previous()
if k == " ": #Pause
player.pause()
if k == "q": #Quit
player.stop()
return True
time.sleep(0.1)
state = player.get_state()
print(state,m.get_media().get_mrl())
print("End of list")
vlc_instance = vlc.Instance('--no-xlib --quiet ') # no-xlib for linux and quiet don't complain
player = vlc_instance.media_list_player_new()
Media = vlc_instance.media_list_new(mymedia)
player.set_media_list(Media)
print("Welcome to Jukebox")
print("Options - space = Play/Pause,n = Next,p = Previous,q = Quit")
print("Media",mymedia)
jukebox()