import os
import sys
import traceback
+import uuid
import objc
from Foundation import *
self.root = []
self.playlists = {}
self.outlineView.setDataSource_(self)
+ self.outlineView.setEnabled_(False)
def setPlaylists(self, playlists):
self.root = []
window = objc.IBOutlet()
folderPopup = objc.IBOutlet()
- def awakeFromNib(self):
- folders = NSApp.delegate().folders()
+ def loadFolders_(self, folders):
self.folderPopup.addItemsWithTitles_(folders)
if len(folders) > 0:
self.folderPopup.selectItemAtIndex_(2)
currentIndex = self.folderPopup.indexOfSelectedItem()
if currentIndex >= 2:
self.lastIndex = currentIndex
- NSApp.delegate().addFolder_(self.folderPopup.titleOfSelectedItem())
+ NSApp.delegate().setFolder_(self.folderPopup.titleOfSelectedItem())
return
panel = NSOpenPanel.openPanel()
panel.setCanChooseFiles_(False)
if ret == NSOKButton:
assert len(panel.filenames()) == 1
folder = panel.filenames()[0]
- NSApp.delegate().addFolder_(folder)
+ NSApp.delegate().setFolder_(folder)
self.folderPopup.insertItemWithTitle_atIndex_(folder, 2)
self.folderPopup.selectItemAtIndex_(2)
else:
pass
def applicationDidFinishLaunching_(self, _):
+ self._loadPrefs()
+
+ folders = []
+ 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())
self.runningGenerator = False
def getDestFolder(self):
- folders = self.folders()
- if not folders:
+ target = self.getCurrentTarget()
+ if not target:
NSRunAlertPanel("Error!", "You must choose a folder first!", "Ok", None, None)
return
- folder = folders[0]
+ folder = target["folder"]
if not os.path.isdir(folder.encode("utf-8")):
NSRunAlertPanel("Error!", "Destination " + folder + " does not exist, try mounting it first?", "Ok", None, None)
return
)
- # Public accessors
+ # Preferences
def prefs(self):
return NSUserDefaults.standardUserDefaults()
- def _getArray(self, key):
- res = self.prefs().stringArrayForKey_(key)
- return list(res) if res else []
+ def _migratePrefs(self):
+ p = self.prefs()
+
+ playlists = p.stringArrayForKey_("playlists")
+ if playlists is not None:
+ p.removeObjectForKey_("playlists")
+ else:
+ playlists = []
- def _saveArray(self, key, array):
- self.prefs().setObject_forKey_(array, key)
+ folders = p.stringArrayForKey_("folders")
+ if not folders:
+ return
+ p.removeObjectForKey_("folders")
+
+ first = True
+ for f in folders:
+ target = {}
+ target["folder"] = f
+ target["playlists"] = list(playlists)
+ target["uuid"] = uuid.uuid1().get_hex()
+ if first:
+ first = False
+ self.setCurrentTarget_(target["uuid"])
+ self.targets.addObject_(target)
+
+ self._savePrefs()
+
+ def _loadPrefs(self):
+ p = self.prefs()
+
+ self.current_target = None
+ self.setCurrentTarget_(p.stringForKey_("current_target"))
+
+ self.targets = self.prefs().arrayForKey_("targets")
+ if self.targets is None:
+ self.targets = NSMutableArray.array()
+ else:
+ self.targets = NSMutableArray.arrayWithArray_(self.targets)
+
+ if self.getCurrentTarget() is None:
+ self._migratePrefs()
+
+ def _savePrefs(self):
+ p = self.prefs()
+ p.setObject_forKey_(self.current_target, "current_target")
+ p.setObject_forKey_(self.targets, "targets")
+ p.synchronize()
+
+ def getCurrentTarget(self):
+ for target in self.targets:
+ if target["uuid"] == self.current_target:
+ 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:
+ self.playlistModel.outlineView.setEnabled_(True)
+ if old_uuid != target_uuid:
+ self.playlistModel.outlineView.reloadItem_reloadChildren_(None, True)
def playlists(self):
- return self._getArray("playlists")
+ target = self.getCurrentTarget()
+ if not target:
+ return []
+ return list(target["playlists"])
+
+ def setFolder_(self, folder):
+ for i, target in enumerate(self.targets):
+ if target["folder"] == folder:
+ self.targets.removeObjectAtIndex_(i)
+ self.targets.insertObject_atIndex_(target, 0)
+ break
+ else:
+ target = {}
+ target["folder"] = folder
+ target["playlists"] = self.playlists()
+ target["uuid"] = uuid.uuid1().get_hex()
+ self.targets.insertObject_atIndex_(target, 0)
- def folders(self):
- return self._getArray("folders")
+ self.setCurrentTarget_(target["uuid"])
- def addFolder_(self, folder):
- folders = self.folders()
- while folder in folders:
- folders.remove(folder)
- folders.insert(0, folder)
- folders = folders[:10]
- self._saveArray("folders", folders)
+ self._savePrefs()
def setPlaylist_selected_(self, playlist, selected):
- playlists = self.playlists()
+ target = self.getCurrentTarget()
+ if not target:
+ raise AssertionError("No target selected when editing playlists")
+
+ playlists = target["playlists"]
if selected:
playlists.append(playlist)
else:
playlists.remove(playlist)
- playlists = list(set(playlists))
- self._saveArray("playlists", list(set(playlists)))
+ target["playlists"] = list(set(playlists))
+
+ self._savePrefs()
def main():