]> code.delx.au - notipod/blobdiff - notipod_gui.py
Use uuid4
[notipod] / notipod_gui.py
index 52b4456faa633bb910a0a68b0f9b6835fd39857c..57e352b77c96b4c64807fbeaa390fd6ae02d1b1c 100644 (file)
@@ -122,6 +122,10 @@ class NotiPodController(NSObject):
        loadingLabel = objc.IBOutlet()
        loadingIndicator = objc.IBOutlet()
 
+       advancedSheet = objc.IBOutlet()
+       advancedSyncFolder = objc.IBOutlet()
+       advancedPathPrefix = objc.IBOutlet()
+
        previewWindow = objc.IBOutlet()
        previewText = objc.IBOutlet()
 
@@ -143,13 +147,9 @@ class NotiPodController(NSObject):
                for target in self.targets:
                        folders.append(target["folder"])
                self.folderModel.loadFolders_(folders)
-               
+
                self.library = libnotipod.ITunesLibrary.alloc().init()
-               def finish():
-                       self.playlistModel.setPlaylists(self.library.get_playlists())
-               def fail():
-                       sys.exit(0)
-               self.runGenerator(lambda: self.library.load_(None), finish, fail)
+               self.loadLibrary_(self)
 
        def applicationWillTerminate_(self, _):
                self.prefs().synchronize()
@@ -157,6 +157,10 @@ class NotiPodController(NSObject):
        def applicationShouldTerminateAfterLastWindowClosed_(self, _):
                return True
 
+       def windowDidBecomeKey_(self, _):
+               if self.library.needs_reload():
+                       self.loadLibrary_(self)
+
 
        # Utility methods
        def runGenerator(self, func, finish, fail):
@@ -191,11 +195,42 @@ class NotiPodController(NSObject):
                if finish:
                        finish()
 
+
+       @objc.IBAction
+       def loadLibrary_(self, sender):
+               if self.runningGenerator:
+                       return
+
+               def finish():
+                       self.playlistModel.setPlaylists(self.library.get_playlists())
+               def fail():
+                       NSRunAlertPanel("Error!", "Unable to load iTunes library! Exiting...", "Ok", None, None)
+                       sys.exit(0)
+               self.runGenerator(lambda: self.library.load_(None), finish, fail)
+
+       @objc.IBAction
+       def showAdvancedOptions_(self, sender):
+               if self.runningGenerator:
+                       return
+               target = self.getCurrentTarget()
+               self.advancedSyncFolder.setStringValue_(target["folder"])
+               self.advancedPathPrefix.setStringValue_(target["path_prefix"])
+               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.advancedSheet, self.window, None, None, None)
+
+       @objc.IBAction
+       def finishAdvancedOptions_(self, sender):
+               target = self.getCurrentTarget()
+               target["folder"] = self.advancedSyncFolder.stringValue()
+               target["path_prefix"] = self.advancedPathPrefix.stringValue()
+               self._savePrefs()
+               NSApp.endSheet_(self.advancedSheet)
+               self.advancedSheet.orderOut_(self)
+
        @objc.IBAction
        def doCancel_(self, sender):
                self.runningGenerator = False
 
-       def getDestFolder(self):
+       def getCheckTarget(self):
                target = self.getCurrentTarget()
                if not target:
                        NSRunAlertPanel("Error!", "You must choose a folder first!", "Ok", None, None)
@@ -204,13 +239,15 @@ class NotiPodController(NSObject):
                if not os.path.isdir(folder.encode("utf-8")):
                        NSRunAlertPanel("Error!", "Destination " + folder + " does not exist, try mounting it first?", "Ok", None, None)
                        return
-               return folder
+               target["folder"] = folder
+               target["path_prefix"] = target["path_prefix"].encode("utf-8")
+               return target
 
        def doPreviewThread(self):
                yield "Calculating changes..."
 
-               folder = self.getDestFolder()
-               if not folder:
+               target = self.getCheckTarget()
+               if not target:
                        return
 
                all_tracks = set()
@@ -226,7 +263,7 @@ class NotiPodController(NSObject):
                gen = libnotipod.sync(
                        dry_run=True,
                        source=self.library.folder,
-                       dest=folder, 
+                       dest=target["folder"],
                        files_to_copy=all_filenames,
                )
                self.previewResult = "\n".join(gen)
@@ -245,8 +282,8 @@ class NotiPodController(NSObject):
 
        @objc.IBAction
        def doSync_(self, sender):
-               folder = self.getDestFolder()
-               if not folder:
+               target = self.getCheckTarget()
+               if not target:
                        return
 
                all_tracks = set()
@@ -275,8 +312,13 @@ class NotiPodController(NSObject):
                                        tracks.append(self.library.get_track_filename(trackID))
                        if playlist_id not in orig_playlists and len(tracks) < 10:
                                continue
-                       libnotipod.export_m3u(dry_run=False, dest=folder, path_prefix="",
-                                       playlist_name=playlist.name, files=tracks)
+                       libnotipod.export_m3u(
+                               dry_run=False,
+                               dest=target["folder"],
+                               path_prefix=target["path_prefix"],
+                               playlist_name=playlist.name,
+                               files=tracks
+                       )
 
                def finish():
                        NSRunAlertPanel("Complete!", "Synchronisation is complete", "Ok", None, None)
@@ -285,7 +327,7 @@ class NotiPodController(NSObject):
                                libnotipod.sync(
                                        dry_run=False,
                                        source=self.library.folder,
-                                       dest=folder, 
+                                       dest=target["folder"],
                                        files_to_copy=all_filenames,
                                )
                        ,
@@ -301,7 +343,7 @@ class NotiPodController(NSObject):
 
        def _migratePrefs(self):
                p = self.prefs()
-               
+
                playlists = p.stringArrayForKey_("playlists")
                if playlists is not None:
                        p.removeObjectForKey_("playlists")
@@ -318,7 +360,8 @@ class NotiPodController(NSObject):
                        target = {}
                        target["folder"] = f
                        target["playlists"] = list(playlists)
-                       target["uuid"] = uuid.uuid1().get_hex()
+                       target["uuid"] = uuid.uuid4().get_hex()
+                       target["path_prefix"] = "../"
                        if first:
                                first = False
                                self.setCurrentTarget_(target["uuid"])
@@ -329,8 +372,8 @@ class NotiPodController(NSObject):
        def _loadPrefs(self):
                p = self.prefs()
 
-               self.current_target = None
-               self.setCurrentTarget_(p.stringForKey_("current_target"))
+               self.currentTarget = None
+               self.setCurrentTarget_(p.stringForKey_("currentTarget"))
 
                self.targets = self.prefs().arrayForKey_("targets")
                if self.targets is None:
@@ -343,22 +386,22 @@ class NotiPodController(NSObject):
 
        def _savePrefs(self):
                p = self.prefs()
-               p.setObject_forKey_(self.current_target, "current_target")
+               p.setObject_forKey_(self.currentTarget, "currentTarget")
                p.setObject_forKey_(self.targets, "targets")
                p.synchronize()
 
        def getCurrentTarget(self):
                for target in self.targets:
-                       if target["uuid"] == self.current_target:
+                       if target["uuid"] == self.currentTarget:
                                return target
                return None
-       
-       def setCurrentTarget_(self, target_uuid):
-               old_uuid = self.current_target
-               self.current_target = target_uuid
-               if old_uuid is None and target_uuid is not None:
+
+       def setCurrentTarget_(self, targetUuid):
+               oldUuid = self.currentTarget
+               self.currentTarget = targetUuid
+               if oldUuid is None and targetUuid is not None:
                        self.playlistModel.outlineView.setEnabled_(True)
-               if old_uuid != target_uuid:
+               if oldUuid != targetUuid:
                        self.playlistModel.outlineView.reloadItem_reloadChildren_(None, True)
 
        def playlists(self):
@@ -377,7 +420,8 @@ class NotiPodController(NSObject):
                        target = {}
                        target["folder"] = folder
                        target["playlists"] = self.playlists()
-                       target["uuid"] = uuid.uuid1().get_hex()
+                       target["uuid"] = uuid.uuid4().get_hex()
+                       target["path_prefix"] = "../"
                        self.targets.insertObject_atIndex_(target, 0)
 
                self.setCurrentTarget_(target["uuid"])