# Copyright (c) 2004-5 Marek Hnilica. All rights reserved. # Module that generates PLS and M3U playlists. # Distributed under GPL version 2, or (at your option) later import wx import os,os.path import treateogg,treatempeg class GenerateDialog(wx.Dialog): def __init__(self,parent,MP3list=[],OGGlist=[],WMAlist=[]): wx.Dialog.__init__(self,parent,wx.ID_ANY,'Playlist generator',size=(100,100)) P=wx.Panel(self,-1) text=wx.StaticText(P,-1,'Which file types include to playlist?',pos=(10,10)) self.ChBox=wx.CheckListBox(P,wx.NewId(),(10,text.GetPosition()[1]+text.GetSize()[1]+10),(-1,-1),['mp3','ogg']) self.ChBox.SetSize((self.ChBox.GetSize()[0],self.ChBox.GetSize()[1]+5)) self.ChBox.Check(0) self.ChBox.Check(1) self.m3uButton=wx.Button(P,wx.NewId(),'Generate m3u',wx.Point(self.ChBox.GetSize()[0]+20,self.ChBox.GetPosition()[1]),wx.Size(-1,-1)) self.plsButton=wx.Button(P,wx.NewId(),'Generate pls',pos=(self.ChBox.GetSize()[0]+20,self.m3uButton.GetSize()[1]+self.m3uButton.GetPosition()[1]+5),size=(self.m3uButton.GetSize())) cancelButton=wx.Button(P,wx.ID_CLOSE,pos=(self.ChBox.GetSize()[0]+20,self.plsButton.GetSize()[1]+self.plsButton.GetPosition()[1]+5),size=(self.plsButton.GetSize())) self.SetSize((self.m3uButton.GetSize()[0]+self.m3uButton.GetPosition()[0]+20,cancelButton.GetPosition()[1]+cancelButton.GetSize()[1]+20)) self.CentreOnParent() wx.EVT_BUTTON(self,cancelButton.GetId(),self.CloseMe) wx.EVT_BUTTON(self,self.m3uButton.GetId(),self.Generate) wx.EVT_BUTTON(self,self.plsButton.GetId(),self.Generate) def UnableWrite(self,parent): Message=wx.MessageDialog(parent,'Unable to write to selected directory','Error',wx.ICON_WARNING) Message.ShowModal() Message.Destroy() def GenerateM3U(self,filename): ToWrite=['#EXTM3U'] for i in self.TrackList: ToWrite.append('\n#EXTINF:'+str(i[1])+','+i[0]+'\n'+os.path.abspath(i[0])) try: file=open(filename,'w') file.writelines(ToWrite) except IOError: self.UnableWrite(self) def GeneratePLS(self,filename): ToWrite=['[playlist]\n'] for i in range(len(self.TrackList)): ToWrite.append('File'+str(i+1)+'='+os.path.abspath(self.TrackList[i][0])+'\n') ToWrite.append('Length'+str(i+1)+'='+str(self.TrackList[i][1])+'\n') ToWrite.append('NumberOfEntries='+str(len(self.TrackList))+'\n') ToWrite.append('Version=2\n') try: file=open(filename,'w') file.writelines(ToWrite) except IOError: self.UnableWrite(self) def GetNamesAndTime(self,Args): return Args[0],Args[8] def GetMP3files(self): if self.ChBox.IsChecked(0): Files=treatempeg.GetTag('.') Args=[] for i in Files[0]: Args.append(self.GetNamesAndTime(i)) return Args else: return [] def GetOGGfiles(self): if self.ChBox.IsChecked(1): Args=[] Files=treateogg.ReadTag('.') for i in Files[0]: Args.append(self.GetNamesAndTime(i)) return Args else: return [] def ShowFileDiag(self,parent): dlg = wx.FileDialog(parent, "Choose a file", os.getcwd(), "",self.wildcard,wx.SAVE) if dlg.ShowModal() == wx.ID_OK: filename=dlg.GetPath() if self.wildcard=='m3u |*.m3u' and filename[-3:]!='m3u': filename+='.m3u' if self.wildcard=='pls |*.pls' and filename[-3:]!='pls': filename+='.pls' else: filename='' dlg.Destroy() return filename def Generate(self,evt): self.TrackList=self.GetOGGfiles()+self.GetMP3files() self.TrackList.sort() if not self.TrackList==[]: if evt.GetId()==self.m3uButton.GetId(): self.wildcard='m3u |*.m3u' try: filename=self.ShowFileDiag(self) if not filename=='': self.GenerateM3U(filename) except IndexError: pass elif evt.GetId()==self.plsButton.GetId(): self.wildcard='pls |*.pls' try: filename=self.ShowFileDiag(self) if not filename=='': self.GeneratePLS(filename) except IndexError: pass self.Close() else: MsgDiag=wx.MessageDialog(self,'Playlist would not contain any single file - not creating','Empty playlist',wx.OK) MsgDiag.ShowModal() MsgDiag.Destroy() def CloseMe(self,junk): self.Close() def PlaylistGenerator(parent): GD=GenerateDialog(parent) GD.ShowModal() GD.Destroy()