0

我正在编写一个基于组合键(A1、B2、C3 等)播放媒体的 Jukebox 程序。除了“media_player.next()”命令外,一切都按我期望的方式工作。

假设您排队 3 首歌曲。如果你按“y”键,它会像我预期的那样跳过这首歌。我的问题是,一旦它到达第三首歌曲,如果你再次按“y”,它会回到第一首歌曲。我不想要那个。我希望“y”键在媒体列表中带您前进……如果那是媒体列表中的最后一首歌曲,请不要转到下一首歌曲。我怎么知道这是否是媒体列表中的最后一首歌,或者你如何阻止 VLC 回到开头?

#!/usr/bin/env python3
#
import os, sys, csv, vlc, time, serial
from pynput.keyboard import Key, Listener
#
# Set Defaults
#
DefaultUSBPath="/media/pi"
#
# Declare variables
#
USBDrive = None
Action = None
Playlist = []
SelectionCount = []
Sel_char = None
#
# Find the USB Drive
#
USBDrive =  os.path.join(DefaultUSBPath, "USB30FD")
#
# Adding to playlist - Returns directory contents and adds to playlist
#
def addplaylist(track):
    list = None
    if os.path.isdir(os.path.join(USBDrive, track)):
        files = [f for f in os.listdir(os.path.join(USBDrive, track)) if os.path.isfile(os.path.join(USBDrive, track, f))]
        for f in files:
            if list is None:
                list = os.path.join(USBDrive, track, f)
            else:
                list = list + ";" + os.path.join(USBDrive, track, f)
    else:
        print ("Error(3) - Selection is invalid")
    if list is None:
        print ("Error(4) - Selection has no media")
    return list
#
# MediaPlayer function
#
def vlc_WhatsPlaying():
    pass
def vlc_SongStarted(event):
    print("Started")
    song = media_player.get_media_player().get_media().get_mrl() # return path of current playing media
    print(song)
    splittrack = song.split("/")
    track = splittrack[-2]
    print(track)
    return
    
def vlc_SongFinished(event):
    print("Finished")
    song = media_player.get_media_player().get_media().get_mrl() # return path of current playing media
    print(song)
    splittrack = song.split("/")
    track = splittrack[-2]
    #media_list.remove_index(0)
    #media_player.play_item_at_index(1)
    return
#
# Define keyboard actions
#
def on_press(key):
    global Action, player
    try:
        Sel_char = int(key.char)
    except:
        try:
            Sel_char = str(key.char)
            Sel_char = Sel_char.upper()
        except:
            Sel_char = None
    if Sel_char == "Z":
        return False
    elif Sel_char == "Y":
        print("Skip")
        media_player.next()
    elif type(Sel_char) == str:
        Action = Sel_char
    elif type(Sel_char) == int:
        Plist = None
        Action = Action + str(Sel_char)
        print("Action: " + Action)
        Plist = addplaylist(Action)
        if Plist is not None:
            if ";" in Plist:
                print(Plist)
                Plist = Plist.split(";")
                for p in Plist:
                    media_list.add_media(p)
            else:
                media_list.add_media(Plist)
            # find section in array and increase the count by one
            if not media_player.is_playing():
                media_player.play()
        else:
            print ("Error(4) - Selection has no media")
    else:
        pass
#
# Setting Up Media Player
#
# creating Instance class object
player = vlc.Instance('--no-xlib --quiet ') # no-xlib for linux and quiet don't complain
media_player = vlc.MediaListPlayer()  # creating a media player object
media_list = player.media_list_new()  # creating a new media list
media_player.set_media_list(media_list)  # setting media list to the media player
new = player.media_player_new()  # new media player instance
media_player.set_media_player(new)  # setting media player to it
media_events = new.event_manager()  # setting event handler
# setting up events
media_events.event_attach(vlc.EventType.MediaPlayerMediaChanged, vlc_SongStarted)
media_events.event_attach(vlc.EventType.MediaPlayerEndReached, vlc_SongFinished)

# Read keyboard input
#
print("Ready...")
with Listener(on_press=on_press) as listener:
    listener.join()
#
# Program is shutting down
#

print ("")
print ("Have a nice day!")
print ("")
sys.exit()
4

1 回答 1

0

正如我在评论中提到的MediaListEndReached那样,它似乎对我没有任何作用,因此以list最简单的方法解决问题的想法运行,以下代码测试list正在播放的项目的位置并退出,如果nextorprevious命令试图越过列表的末尾。
您只需跟踪索引变量即可获得相同的结果。
您可能需要调整拆分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()
于 2021-03-15T19:03:59.213 回答