# 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 *
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:
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()
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):
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()