]> code.delx.au - notipod/blobdiff - NotiPod.py
Nearly done!
[notipod] / NotiPod.py
index 68bb1a11d1d15c20f109c4d0636bb7c9c2b111ca..610d4059353bc5aacd044bd70b4e0f197fe9baa3 100644 (file)
@@ -2,6 +2,8 @@
 # Copyright 2009 James Bunton <jamesbunton@fastmail.fm>
 # Licensed for distribution under the GPL version 2, check COPYING for details
 
+import logging
+
 import objc
 from Foundation import *
 from AppKit import *
@@ -25,6 +27,7 @@ class PlaylistModel(NSObject):
                        if playlist.parent is None:
                                self.root.append(playlist)
                self.outlineView.reloadData()
+               self.outlineView.expandItem_expandChildren_(None, True)
 
        def outlineView_child_ofItem_(self, _, childIndex, playlist):
                if playlist == None:
@@ -58,74 +61,53 @@ class PlaylistModel(NSObject):
 
                if col != "selected":
                        return
-               if v:
-                       NSApp.delegate().addPlaylist_(playlist.pid)
-               else:
-                       NSApp.delegate().delPlaylist_(playlist.pid)
+               NSApp.delegate().setPlaylist_selected_(playlist.pid, v)
 
 
-class NotiPodController(NSObject):
-       playlistModel = objc.IBOutlet()
-       folderPopup = objc.IBOutlet()
+class FolderModel(NSObject):
        window = objc.IBOutlet()
-       loadingSheet = objc.IBOutlet()
-
+       folderPopup = objc.IBOutlet()
 
        def awakeFromNib(self):
-               self.performSelectorInBackground_withObject_(self.loadLibrary, None)
-       
-       def finishLoading(self):
-               self.playlistModel.setPlaylists(self.library.get_playlists())
                self.folderPopup.addItemsWithTitles_(NSApp.delegate().folders())
+               self.folderPopup.selectItemAtIndex_(2)
 
-       def loadLibrary(self):
-               pool = NSAutoreleasePool.alloc().init()
-               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
-               self.library = libsyncitunes.ITunesLibrary.alloc().init()
-               self.loadingSheet.close()
-               self.performSelectorOnMainThread_withObject_waitUntilDone_(self.finishLoading, None, True)
-               del pool
+       @objc.IBAction
+       def doSelectFolder_(self, sender):
+               if self.folderPopup.indexOfSelectedItem() >= 2:
+                       NSApp.delegate().addFolder_(self.folderPopup.titleOfSelectedItem())
+                       return
+               panel = NSOpenPanel.openPanel()
+               panel.setCanChooseFiles_(False)
+               panel.setCanChooseDirectories_(True)
+               panel.setAllowsMultipleSelection_(False)
+               panel.beginSheetForDirectory_file_types_modalForWindow_modalDelegate_didEndSelector_contextInfo_(
+                       None, None, [], self.window, self, self.selectFolderEnd_returnCode_contextInfo_, None)
 
        @objc.signature("v@:@ii")
        def selectFolderEnd_returnCode_contextInfo_(self, panel, ret, _):
                if ret == NSOKButton:
                        assert len(panel.filenames()) == 1
                        folder = panel.filenames()[0]
-###                    NSApp.delegate().addFolder_(folder)
+                       NSApp.delegate().addFolder_(folder)
                        self.folderPopup.insertItemWithTitle_atIndex_(folder, 2)
                        self.folderPopup.selectItemAtIndex_(2)
 
-       @objc.IBAction
-       def doSelectFolder_(self, sender):
-               print "select folder"
-               try:
-                       folders = NSApp.delegate().folders()
-                       if len(folders) > 0:
-                               folder = folders[0]
-                       else:
-                               folder = None
-                       panel = NSOpenPanel.openPanel()
-                       panel.setCanChooseFiles_(False)
-                       panel.setCanChooseDirectories_(True)
-                       panel.setAllowsMultipleSelection_(False)
-                       panel.beginSheetForDirectory_file_types_modalForWindow_modalDelegate_didEndSelector_contextInfo_(folder, None, None, self.window, self, self.selectFolderEnd_returnCode_contextInfo_, None)
-               except:
-                       import traceback
-                       traceback.print_exc()
-
-       @objc.IBAction
-       def doSync_(self, sender):
-               print "hello me"
-
 
 class NotiPodAppDelegate(NSObject):
+       window = objc.IBOutlet()
+       playlistModel = objc.IBOutlet()
+       folderModel = objc.IBOutlet()
+       loadingSheet = objc.IBOutlet()
+
 
        # Delegate methods
        def applicationWillFinishLaunching_(self, _):
                pass
 
        def applicationDidFinishLaunching_(self, _):
-               pass
+               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
+               self.performSelectorInBackground_withObject_(self.loadFromThread, None)
 
        def applicationWillTerminate_(self, _):
                self.prefs().synchronize()
@@ -134,6 +116,33 @@ class NotiPodAppDelegate(NSObject):
                return True
 
 
+       def loadFromThread(self):
+               pool = NSAutoreleasePool.alloc().init()
+               self.library = libsyncitunes.ITunesLibrary.alloc().init()
+               self.performSelectorOnMainThread_withObject_waitUntilDone_(self.finishLoading, None, True)
+               del pool
+
+       def finishLoading(self):
+               self.playlistModel.setPlaylists(self.library.get_playlists())
+               NSApp.endSheet_(self.loadingSheet)
+               self.loadingSheet.close()
+
+       @objc.IBAction
+       def doSync_(self, sender):
+               folder = self.folders()[0]
+               playlists = [self.library.get_playlist_pid(pid) for pid in self.playlists()]
+
+               all_tracks = []
+               for playlist in playlists:
+                       print playlist.name, playlist.tracks
+                       all_tracks.extend(playlist.tracks)
+                       libsyncitunes.export_m3u(dry_run=True, dest=folder, path_prefix="",
+                                       playlist_name=playlist.name, files=playlist.tracks)
+
+               libsyncitunes.sync(dry_run=True,
+                       source=self.library.folder, dest=folder, files=all_tracks)
+
+
        # Public accessors
 
        def prefs(self):
@@ -154,20 +163,27 @@ class NotiPodAppDelegate(NSObject):
 
        def addFolder_(self, folder):
                folders = self.folders()
-               folders.append(folder)
+               while folder in folders:
+                       folders.remove(folder)
+               folders.insert(0, folder)
+               folders = folders[:10]
                self._saveArray("folders", folders)
 
-       def delPlaylist_(self, playlist):
+       def setPlaylist_selected_(self, playlist, selected):
                playlists = self.playlists()
-               playlists.remove(playlist)
-               self._saveArray("playlists", playlists)
-
-       def addPlaylist_(self, playlist):
-               playlists = self.playlists()
-               playlists.append(playlist)
-               self._saveArray("playlists", playlists)
+               if selected:
+                       playlists.append(playlist)
+               else:
+                       playlists.remove(playlist)
+               playlists = list(set(playlists))
+               self._saveArray("playlists", list(set(playlists)))
 
 
+def main():
+       logging.basicConfig(format="%(levelname)s: %(message)s")
+       logging.getLogger().setLevel(logging.DEBUG)
+       AppHelper.runEventLoop()
 
-AppHelper.runEventLoop()
+if __name__ == "__main__":
+       main()