So i have the code:
import glob,os import random path = 'C:\\Music\\' aw=[] for infile in glob.glob( os.path.join(path,'*.mp3') ): libr = infile.split('Downloaded',1) aw.append(infile) aww = -1 while 1: aww += 1 print len(aw),aww random.shuffle(aw) awww = aw[aww] os.startfile(awww) but all it does is go through all of the songs without stopping. I thought if I could find the length of the song that is currently playing, I could use the "time" module to keep going after the song is done with the (sleep) attribute. However, I couldn't find how to get the length of the song on windows. Does anyone know a solution to my probleme?
15 Answers
You can use mutagen to get the length of the song (see the tutorial):
from mutagen.mp3 import MP3 audio = MP3("example.mp3") print(audio.info.length) 3You can use FFMPEG libraries:
args=("ffprobe","-show_entries", "format=duration","-i",filename) popen = subprocess.Popen(args, stdout = subprocess.PIPE) popen.wait() output = popen.stdout.read() and the output will be:
[FORMAT] duration=228.200515 [/FORMAT] 2Newer versions of python-ffmpeg have a wrapper function for ffprobe. An example of getting the duration is like this:
import ffmpeg print(ffmpeg.probe('in.mp4')['format']['duration']) 2You can also get this using eyed3, if that's your flavor by doing:
import eyed3 duration = eyed3.load('path_to_your_file.mp3').info.time_secs Note however that this uses sampling to determine the length of the track. As a result, if it uses variable bit rate, the samples may not be representative of the whole, and the estimate may be off by a good degree (I've seen these estimates be off by more than 30% on court recordings).
I'm not sure that's much worse than other options, but it's something to remember if you have variable bit rates.
Maybe do the playing also within Python, i.e. don't use os.startfile, use some Python library to play the file.
I have recently written such a library/module, the musicplayer module (on PyPI). Here is a simple demo player which you can easily extend for your shuffle code.
Just do easy_install musicplayer. Then, here is some example code to get the length:
class Song: def __init__(self, fn): self.f = open(fn) def readPacket(self, bufSize): return self.f.read(bufSize) def seekRaw(self, offset, whence): self.f.seek(offset, whence) return self.f.tell() import musicplayer as mp songLenViaMetadata = mp.getMetadata(Song(filename)).get("duration", None) songLenViaAnalyzing = mp.calcReplayGain(Song(filename))[0] 0