librarian.py

Go to the documentation of this file.
00001 #!/usr/bin/python
00002 
00003 import gtk,gtk.glade,gobject
00004 import os,time,tempfile
00005 
00006 from plai import utility
00007 from plai import config
00008 
00009 class Librarian:
00010         def __init__(self):
00011                 xml=gtk.glade.XML(config.gladelibrarianfname)
00012         
00013                 handlers={'on_AssistantWindow_prepare' : self._onPreparePage_onPreparePage,
00014                                   'on_AddFolder_clicked'           : self._onAddFolder_onAddFolder,
00015                                   'on_RemoveFolder_clicked'    : self._onRemoveFolder_onRemoveFolder,
00016                                   'on_AssistantWindow_close'   : self._onDone_onDone,
00017                                   'on_AssistantWindow_cancel'  : gtk.main_quit}
00018                                   
00019                 xml.signal_autoconnect(handlers)
00020                 
00021                 f=xml.get_widget
00022                 self._win_win                = f('AssistantWindow')             
00023                 self._progresspage_progresspage       = f('ProgressPage')
00024                 self._folderpage_folderpage         = f('FolderPage')
00025                 self._view_view               = f('FolderList')         
00026                 self._filelabel_filelabel          = f('FileLabel')
00027                 self._titlelabel_titlelabel         = f('TitleLabel')
00028                 self._artistlabel_artistlabel        = f('ArtistLabel')
00029                 self._albumlabel_albumlabel         = f('AlbumLabel')
00030                 self._durationlabel_durationlabel      = f('DurationLabel')
00031                 self._progresspage_progresspage       = f('ProgressPage')
00032                 self._bar_bar                = f('ProgressBar')
00033                 self._folderlist_folderlist         = f('FolderList')
00034                 self._launchplayertoggle_launchplayertoggle = f('LaunchPlayerToggle')
00035                 
00036                 self._CompletePage_CompletePage(xml.get_widget('WelcomePage'))
00037                 self._CompletePage_CompletePage(xml.get_widget('WarningPage'))
00038                 
00039                 self._store_store=gtk.ListStore(gobject.TYPE_STRING)
00040                 self._view_view.set_model(self._store_store)
00041                 self._view_view.insert_column_with_attributes(0,'Folders',gtk.CellRendererText(),text=0)
00042                 
00043                 self._pulse_pulse=True
00044                 self._numfiles_numfiles=-1
00045                 self._curfile_curfile=0
00046                 self._startedadding_startedadding=False
00047                 self._starttime_starttime=-999
00048                 (tempf,self._tempfname)=tempfile.mkstemp('.db','plaitemp')
00049                 os.close(tempf)
00050                 
00051         
00052         def _CompletePage(self,widget,done=True):
00053                 self._win_win.set_page_complete(widget,done)
00054                 
00055                 
00056         def _onTimer(self):
00057                 if not self._pulse_pulse: return False
00058                 self._bar_bar.pulse()
00059                 return True
00060                 
00061         
00062         def _StopPulsing(self,prog=0):
00063                 self._pulse_pulse=False
00064                 self._bar_bar.set_fraction(prog)
00065                 
00066         
00067         def _StartPulsing(self,txt=''):
00068                 self._bar_bar.set_pulse_step(.01)
00069                 self._bar_bar.set_text(txt)
00070                 gobject.timeout_add(30,self._onTimer_onTimer)
00071                 self._pulse_pulse=True
00072                 
00073 
00074         def _onPipe(self,f,cond):
00075                 if cond==gobject.IO_IN:
00076                         l=f.readline()[:-1]                     #strip newline at end
00077                         if l[-1]=='\x00': l=l[:-1]      #somehow these get in there (from wmas?) and gtk doesn't like them
00078                         l=unicode(l,'latin1')
00079                         self._HandlePipeText_HandlePipeText(l)
00080                         return True
00081                 if cond==gobject.IO_ERR:
00082                         utility.ReportError('IO Error','')
00083                         return False
00084                 if cond==gobject.IO_HUP:
00085                         if self._curfile_curfile!=self._numfiles_numfiles:
00086                                 utility.ReportError('Unexpected HUP',repr(self._curfile_curfile)+'/'+repr(self._numfiles_numfiles))
00087                         return False
00088                 utility.ReportError('Unknown condition','This should never happen')
00089                 return False
00090                 
00091         
00092         def _IncrementProgress(self):
00093                 self._curfile_curfile=self._curfile_curfile+1
00094                 frac=float(self._curfile_curfile)/self._numfiles_numfiles
00095                 self._bar_bar.set_fraction(frac)
00096                 elapsed=time.time()-self._starttime_starttime
00097                 remain=int(((self._numfiles_numfiles-self._curfile_curfile)/(self._curfile_curfile+.001))*elapsed)+1
00098                 self._bar_bar.set_text(utility.PrettyPrintTime(remain)+' remaining')            
00099                 
00100                 
00101         def _HandlePipeText(self,l):
00102                 def sw(txt,widget,func=None):
00103                         if l.startswith(txt):
00104                                 if widget: widget.set_text(l[len(txt):])
00105                                 if func: func()
00106                                 return True
00107                         return False
00108                                 
00109                 if sw('title - ', self._titlelabel_titlelabel) or \
00110                    sw('artist - ',self._artistlabel_artistlabel) or \
00111                    sw('album - ', self._albumlabel_albumlabel) or \
00112                    sw('fname - ', self._filelabel_filelabel,self._IncrementProgress_IncrementProgress): return
00113                 
00114                 if l.startswith('numfiles - '):
00115                         self._numfiles_numfiles=int(l[11:])
00116                         self._StopPulsing_StopPulsing(0)
00117                         self._starttime_starttime=time.time()
00118                 elif l.startswith('length - '):
00119                         dur=int(l[9:])
00120                         self._durationlabel_durationlabel.set_text(utility.PrettyPrintTime(dur) if dur!=-999 else '')
00121                 elif l.startswith('building onesongs table'):
00122                         self._StartPulsing_StartPulsing('Building index of single-song artists')
00123                 elif l.startswith('done'):
00124                         self._StopPulsing_StopPulsing(1)
00125                         to=config.sqlfname
00126                         os.system('cp '+to+' '+to+'LIBRARIANBACKUP')
00127                         os.system('cp '+self._tempfname+' '+to)
00128                         self._bar_bar.set_text('DONE - total time '+utility.PrettyPrintTime(int(time.time()-self._starttime_starttime)))
00129                         self._CompletePage_CompletePage(self._progresspage_progresspage)
00130 #                       self._win.set_current_page(self._win.get_current_page()+1)
00131                 else:
00132                         utility.ReportError('Unexpected text in pipe',l)
00133                         
00134                 
00135         def _onPreparePage(self,widget,page):
00136                 def addfolder(model,path,it,folders):
00137                         folders.append(model.get_value(it,0))
00138                                         
00139                 if page is self._progresspage_progresspage and not self._startedadding_startedadding:
00140                         self._startedadding_startedadding=True
00141                         cmd='plaibuildlib '+self._tempfname+' '
00142                         folders=[]
00143                         self._folderlist_folderlist.get_model().foreach(addfolder,folders)
00144                         for f in folders:
00145                                 cmd=cmd+'"'+f+'" '
00146                                 
00147                         # gobject.spawn_async ?
00148                         (w,r)=os.popen2(cmd)
00149                         gobject.io_add_watch(r,gobject.IO_IN | gobject.IO_ERR | gobject.IO_HUP, self._onPipe_onPipe)
00150 
00151                         self._StartPulsing_StartPulsing('Finding all the files')
00152                 
00153                 
00154         def _onAddFolder(self,widget):
00155                 dlg=gtk.FileChooserDialog('Choose folder(s) to add to collection',self._win_win,
00156                                                                   gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
00157                                                                   (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
00158                                                                    gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT))
00159                 dlg.set_select_multiple(True)
00160                 if dlg.run()==gtk.RESPONSE_ACCEPT:
00161                         dlg.hide()
00162                         for fname in dlg.get_filenames():
00163                                 self._store_store.append((fname,))
00164                         self._CompletePage_CompletePage(self._folderpage_folderpage)
00165                 else:
00166                         dlg.hide()
00167 
00168 
00169         def _onRemoveFolder(self,widget):
00170                 (model,it)=self._view_view.get_selection().get_selected()
00171                 model.remove(it)
00172                 if model.iter_n_children(None)==0:
00173                         self._CompletePage_CompletePage(self._folderpage_folderpage,False)              
00174                         
00175                         
00176         def _onDone(self,widget):
00177                 if self._launchplayertoggle_launchplayertoggle.get_active():
00178                         self._win_win.hide()
00179                         while gtk.events_pending(): gtk.main_iteration()
00180                         os.system('plai')
00181                 gtk.main_quit()
00182 
00183 

Generated on Mon Aug 6 21:24:19 2007 for plai by  doxygen 1.5.1