Getting file path of current track from Python-VLC's MediaListPlayer

Question:

I’m using MediaListPlayer from the python-vlc library. I use the following code to create a list of all the songs in a directory and begin them playing as a playlist, so that once one song ends another begins.

import os
from vlc import MediaListPlayer

class Music:
    def __init__(self, path):
        self.path = path
        self.get_playlist()
        self.play()
    
    def get_songs(self):
        self.pathlist = []
        for file in os.listdir(self.path):
            if file.endswith('.mp3'):
                self.pathlist.append(os.path.join(self.path, file))

    def get_playlist(self):
        self.player = MediaListPlayer()

        inst = self.player.get_instance()
        playlist = inst.media_list_new()
        
        self.get_songs()
        
        for path in self.pathlist:
            song = inst.media_new(path)
            playlist.add_media(song)

        self.player.set_media_list(playlist)

    def play(self):
        self.player.play()

Music('path/to/music')

This works perfectly, and plays one song after the next. What I’m looking for is a way to get the file path of the current track. Something along the lines of self.player.get_current_track().
I’ve scoured the documentation, found here, and there seems to be no way to do this. Does anybody have a solution?

Asked By: MillerTime

||

Answers:

I’ve discovered an answer to this problem based on help I received on another thread here. I use the get_media() method of the MediaPlayer object to retrieve the current Media object. I then use the get_mrl() method of the current Media object to obtain a file path in the format 'file:///home/pi/Desktop/music/Radio%20Song.mp3'. The thread I’ve linked showed me how to convert this into a traditional file path, in the format '/home/pi/Desktop/music/Radio Song.mp3'. This is done by using the urllib module.

from urllib.request import url2pathname
from urllib.parse import urlparse
import os

from vlc import Media, MediaList, MediaListPlayer

class Music(object):
    def __init__(self, path):
        self.path = path
        self.player = MediaListPlayer()
        self.get_playlist()

    def get_playlist(self):
        self.playlist = MediaList()
        
        for file in os.listdir(self.path):
            if file.endswith('.mp3'):
                song = os.path.join(self.path, file)
                self.playlist.add_media(song)

        self.player.set_media_list(self.playlist)

    def item_at_index(self, idx):
        mrl = self.playlist.item_at_index(idx).get_mrl()
        return url2pathname(urlparse(mrl).path)
    
    def index_of_current_item(self):
        item = self.player.get_media_player().get_media()
        return self.playlist.index_of_item(item)
    
    def path_to_current_item(self):
        return self.item_at_index(self.index_of_current_item())

    def play(self):
        self.player.play()
        print(self.path_to_current_item())

music = Music('path/to/music')
music.play()
Answered By: MillerTime
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.