Basically, I want to check if a URL is playable or not (without actually playing it). i.e. given a URL I want to write an automation script to figure it out for me if it's playable or not. If you give a bad/invalid URL for windows media player to play a pop-up window shows us that it cannot be played. So I would want to catch that event.
I have found 2 ways to do this - 1) import win32com.client, win32api, sre, time data = file("webclips.txt") web_clips = data.readlines () shell = win32com.client.Dispatch("WScript.Shell") shell.Run("wmplayer.exe") shell.AppActivate("Windows Media Player") win32api.Sleep(100) print "Total :", len(web_clips) for webclip in web_clips: shell.SendKeys("^u", 0) shell.AppActivate("Open URL") shell.SendKeys("{DEL}") shell.SendKeys(webclip) shell.SendKeys("~") time.sleep(25) if shell.AppActivate("Windows Media Player"): webclip = webclip not_there.append(webclip) shell.SendKeys("~") print len(not_there) print "Not here: ", not_there ~ In this way I manually fire Windows media player and do the checking. But It's a brute force way of solving the problem (since for every URL I keep a time-out of 25 seconds). As a result it takes a lot of time.I had to look for a better solution. My second solution uses Windows much hyped ActiveX controls. 2) from win32com.client import Dispatch,DispatchWithEvents class WMPEvents: def OnVisible(self,evt): print "OnVisible changed:",evt def OnError(self,evt=None): print "OnError",evt def OnMediaError(self,evt=None): print "OnMediaError",evt def OnDisconnect(self,evt): print "OnDisconnect",evt def OnStatusChange(self): print "OnStatusChange" def OnDisconnect(self,evt): print "Disconnect",evt def OnBuffering(self,evt): print "OnBuffering changed:",evt def OnOpenStateChange(self,evt=None): print "OnOpenStateChange" ,evt mp = DispatchWithEvents("WMPlayer.OCX", WMPEvents) mp.settings.autoStart = True webclip_playlist = mp.newPlaylist('Web_Clips', "") raw_web_clips = [] data = file("webclips.txt") web_clips = data.readlines() for url in web_clips: tune = mp.newMedia(url) mp.currentPlaylist.appendItem(tune) mp.controls.playItem (tune) mp.controls.play() mp.controls.stop() raw_input("Press enter to stop playing") mp.controls.stop() mp.close() This solution is much faster. But still I'm not able to solve it. Initially I had planned to use the "OnOpenStateChange" event to detect if a given URL is in a state just about to be opened. That's good enough for me to declare that a URL can be played. But as written in MSDN, they suggest not to rely on state changes as a definitive way to find details. So, I had to find an alternative. There is an event called "OnBuffering", i.e. when a link is found and is just about to be buffered this event (Boolean value) is triggered. But it never seem to happen. I would be truly grateful if you can help in any way. -- http://mail.python.org/mailman/listinfo/python-list