]> code.delx.au - notipod/commitdiff
Display progress
authorJames Bunton <jamesbunton@fastmail.fm>
Sun, 2 Jan 2011 10:56:22 +0000 (21:56 +1100)
committerJames Bunton <jamesbunton@fastmail.fm>
Sun, 2 Jan 2011 10:56:22 +0000 (21:56 +1100)
English.lproj/NotiPod.xib
NotiPod.py
libsyncitunes.py
syncitunes.py

index 16c523e9b46569ae501e2927a6fdcdfe9b3f9b51..8d7bb0f5361c26d6880cc2138cb0cfb8f752e667 100644 (file)
@@ -8,6 +8,7 @@
                <string key="IBDocument.HIToolboxVersion">461.00</string>
                <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
                        <bool key="EncodedWithXMLCoder">YES</bool>
+                       <integer value="429"/>
                        <integer value="29"/>
                        <integer value="372"/>
                </object>
                        <object class="NSWindowTemplate" id="92204650">
                                <int key="NSWindowStyleMask">7</int>
                                <int key="NSWindowBacking">2</int>
-                               <string key="NSWindowRect">{{196, 436}, {204, 74}}</string>
+                               <string key="NSWindowRect">{{196, 436}, {342, 74}}</string>
                                <int key="NSWTFlags">603979776</int>
                                <string key="NSWindowTitle">Window</string>
                                <string key="NSWindowClass">NSWindow</string>
                                <nil key="NSViewClass"/>
                                <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
                                <object class="NSView" key="NSWindowView" id="851027294">
-                                       <nil key="NSNextResponder"/>
+                                       <reference key="NSNextResponder"/>
                                        <int key="NSvFlags">256</int>
                                        <object class="NSMutableArray" key="NSSubviews">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference key="NSNextResponder" ref="851027294"/>
                                                        <int key="NSvFlags">1292</int>
                                                        <object class="NSPSMatrix" key="NSDrawMatrix"/>
-                                                       <string key="NSFrame">{{18, 16}, {168, 20}}</string>
+                                                       <string key="NSFrame">{{18, 16}, {306, 20}}</string>
                                                        <reference key="NSSuperview" ref="851027294"/>
                                                        <int key="NSpiFlags">16394</int>
                                                        <double key="NSMinValue">2.000000e+01</double>
                                                        <double key="NSMaxValue">1.000000e+02</double>
                                                </object>
-                                               <object class="NSTextField" id="98522848">
+                                               <object class="NSTextField" id="142560492">
                                                        <reference key="NSNextResponder" ref="851027294"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{17, 44}, {111, 17}}</string>
+                                                       <string key="NSFrame">{{17, 44}, {308, 17}}</string>
                                                        <reference key="NSSuperview" ref="851027294"/>
                                                        <bool key="NSEnabled">YES</bool>
-                                                       <object class="NSTextFieldCell" key="NSCell" id="28320021">
+                                                       <object class="NSTextFieldCell" key="NSCell" id="1010085952">
                                                                <int key="NSCellFlags">67239488</int>
-                                                               <int key="NSCellFlags2">272630784</int>
-                                                               <string key="NSContents">Loading library...</string>
+                                                               <int key="NSCellFlags2">272631296</int>
+                                                               <string key="NSContents">Please wait...</string>
                                                                <reference key="NSSupport" ref="822023840"/>
-                                                               <reference key="NSControlView" ref="98522848"/>
+                                                               <reference key="NSControlView" ref="142560492"/>
                                                                <reference key="NSBackgroundColor" ref="439689891"/>
                                                                <reference key="NSTextColor" ref="888276067"/>
                                                        </object>
                                                </object>
                                        </object>
-                                       <string key="NSFrameSize">{204, 74}</string>
+                                       <string key="NSFrameSize">{342, 74}</string>
+                                       <reference key="NSSuperview"/>
                                </object>
                                <string key="NSScreenRect">{{0, 0}, {1024, 746}}</string>
                                <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
                        <object class="NSCustomObject" id="377758519">
                                <string key="NSClassName">FolderModel</string>
                        </object>
-                       <object class="NSWindowTemplate" id="359640654">
-                               <int key="NSWindowStyleMask">15</int>
-                               <int key="NSWindowBacking">2</int>
-                               <string key="NSWindowRect">{{196, 429}, {279, 81}}</string>
-                               <int key="NSWTFlags">603979776</int>
-                               <string key="NSWindowTitle">Synchronising</string>
-                               <string key="NSWindowClass">NSWindow</string>
-                               <nil key="NSViewClass"/>
-                               <object class="NSView" key="NSWindowView" id="63479689">
-                                       <nil key="NSNextResponder"/>
-                                       <int key="NSvFlags">256</int>
-                                       <object class="NSMutableArray" key="NSSubviews">
-                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSTextField" id="390857350">
-                                                       <reference key="NSNextResponder" ref="63479689"/>
-                                                       <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{17, 44}, {245, 17}}</string>
-                                                       <reference key="NSSuperview" ref="63479689"/>
-                                                       <bool key="NSEnabled">YES</bool>
-                                                       <object class="NSTextFieldCell" key="NSCell" id="811372136">
-                                                               <int key="NSCellFlags">68288064</int>
-                                                               <int key="NSCellFlags2">272630784</int>
-                                                               <string key="NSContents">Synchronising.. This may take a while.</string>
-                                                               <reference key="NSSupport" ref="822023840"/>
-                                                               <reference key="NSControlView" ref="390857350"/>
-                                                               <reference key="NSBackgroundColor" ref="439689891"/>
-                                                               <reference key="NSTextColor" ref="888276067"/>
-                                                       </object>
-                                               </object>
-                                               <object class="NSProgressIndicator" id="626714939">
-                                                       <reference key="NSNextResponder" ref="63479689"/>
-                                                       <int key="NSvFlags">1292</int>
-                                                       <object class="NSPSMatrix" key="NSDrawMatrix"/>
-                                                       <string key="NSFrame">{{18, 16}, {243, 20}}</string>
-                                                       <reference key="NSSuperview" ref="63479689"/>
-                                                       <int key="NSpiFlags">16394</int>
-                                                       <double key="NSMinValue">2.000000e+01</double>
-                                                       <double key="NSMaxValue">1.000000e+02</double>
-                                               </object>
-                                       </object>
-                                       <string key="NSFrameSize">{279, 81}</string>
-                               </object>
-                               <string key="NSScreenRect">{{0, 0}, {1280, 778}}</string>
-                               <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
-                       </object>
                </object>
                <object class="IBObjectContainer" key="IBDocument.Objects">
                        <object class="NSMutableArray" key="connectionRecords">
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">synchronizingSheet</string>
+                                               <string key="label">loadingLabel</string>
                                                <reference key="source" ref="719278169"/>
-                                               <reference key="destination" ref="359640654"/>
+                                               <reference key="destination" ref="142560492"/>
                                        </object>
-                                       <int key="connectionID">508</int>
+                                       <int key="connectionID">511</int>
                                </object>
                        </object>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference ref="327138569"/>
-                                                       <reference ref="98522848"/>
+                                                       <reference ref="142560492"/>
                                                </object>
                                                <reference key="parent" ref="92204650"/>
                                        </object>
                                                <reference key="object" ref="327138569"/>
                                                <reference key="parent" ref="851027294"/>
                                        </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">431</int>
-                                               <reference key="object" ref="98522848"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="28320021"/>
-                                               </object>
-                                               <reference key="parent" ref="851027294"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">432</int>
-                                               <reference key="object" ref="28320021"/>
-                                               <reference key="parent" ref="98522848"/>
-                                       </object>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">436</int>
                                                <reference key="object" ref="122068822"/>
                                                <reference key="parent" ref="0"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">503</int>
-                                               <reference key="object" ref="359640654"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="63479689"/>
-                                               </object>
-                                               <reference key="parent" ref="0"/>
-                                               <string key="objectName">SynchronizingSheet</string>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">504</int>
-                                               <reference key="object" ref="63479689"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="390857350"/>
-                                                       <reference ref="626714939"/>
-                                               </object>
-                                               <reference key="parent" ref="359640654"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">505</int>
-                                               <reference key="object" ref="390857350"/>
+                                               <int key="objectID">509</int>
+                                               <reference key="object" ref="142560492"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="811372136"/>
+                                                       <reference ref="1010085952"/>
                                                </object>
-                                               <reference key="parent" ref="63479689"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">506</int>
-                                               <reference key="object" ref="811372136"/>
-                                               <reference key="parent" ref="390857350"/>
+                                               <reference key="parent" ref="851027294"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">507</int>
-                                               <reference key="object" ref="626714939"/>
-                                               <reference key="parent" ref="63479689"/>
+                                               <int key="objectID">510</int>
+                                               <reference key="object" ref="1010085952"/>
+                                               <reference key="parent" ref="142560492"/>
                                        </object>
                                </object>
                        </object>
                                        <string>428.editorWindowContentRectSynchronizationRect</string>
                                        <string>429.IBPluginDependency</string>
                                        <string>430.IBPluginDependency</string>
-                                       <string>431.IBPluginDependency</string>
-                                       <string>432.IBPluginDependency</string>
                                        <string>436.IBPluginDependency</string>
                                        <string>437.IBPluginDependency</string>
                                        <string>438.IBPluginDependency</string>
                                        <string>472.IBPluginDependency</string>
                                        <string>477.IBPluginDependency</string>
                                        <string>484.IBPluginDependency</string>
+                                       <string>485.IBPluginDependency</string>
+                                       <string>486.IBPluginDependency</string>
                                        <string>490.IBPluginDependency</string>
-                                       <string>503.IBEditorWindowLastContentRect</string>
-                                       <string>503.IBPluginDependency</string>
-                                       <string>503.IBWindowTemplateEditedContentRect</string>
-                                       <string>503.NSWindowTemplate.visibleAtLaunch</string>
-                                       <string>504.IBPluginDependency</string>
-                                       <string>505.IBPluginDependency</string>
-                                       <string>506.IBPluginDependency</string>
-                                       <string>507.IBPluginDependency</string>
+                                       <string>509.IBPluginDependency</string>
+                                       <string>510.IBPluginDependency</string>
                                        <string>56.IBPluginDependency</string>
                                        <string>56.ImportedFromIB2</string>
                                        <string>57.IBPluginDependency</string>
                                        <string>{{89, 581}, {211, 33}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{21, 626}, {204, 74}}</string>
-                                       <string>{{21, 626}, {204, 74}}</string>
+                                       <string>{{82, 574}, {342, 74}}</string>
+                                       <string>{{82, 574}, {342, 74}}</string>
                                        <integer value="0"/>
                                        <string>{{196, 436}, {204, 74}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{42, 607}, {279, 81}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{42, 607}, {279, 81}}</string>
-                                       <boolean value="NO"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                </object>
                        </object>
                        <nil key="sourceID"/>
-                       <int key="maxID">508</int>
+                       <int key="maxID">511</int>
                </object>
                <object class="IBClassDescriber" key="IBDocument.Classes">
                        <object class="NSMutableArray" key="referencedPartialClassDescriptions">
                                                <object class="NSArray" key="dict.sortedKeys">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>folderModel</string>
+                                                       <string>loadingLabel</string>
                                                        <string>loadingSheet</string>
                                                        <string>playlistModel</string>
-                                                       <string>synchronizingSheet</string>
                                                        <string>window</string>
                                                </object>
                                                <object class="NSMutableArray" key="dict.values">
index b844b34409d71b84976e32b2cb344ba8505a0dde..f302f6f9ed167a3b01843a482990e51cb778dbcc 100644 (file)
@@ -104,19 +104,20 @@ class NotiPodAppDelegate(NSObject):
        playlistModel = objc.IBOutlet()
        folderModel = objc.IBOutlet()
        loadingSheet = objc.IBOutlet()
-       synchronizingSheet = objc.IBOutlet()
+       loadingLabel = objc.IBOutlet()
 
+       def awakeFromNib(self):
+               self.gen = None
 
        # Delegate methods
        def applicationWillFinishLaunching_(self, _):
                pass
 
        def applicationDidFinishLaunching_(self, _):
-               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
                self.library = libsyncitunes.ITunesLibrary.alloc().init()
-               self.playlistModel.setPlaylists(self.library.get_playlists())
-               NSApp.endSheet_(self.loadingSheet)
-               self.loadingSheet.orderOut_(self)
+               def finish():
+                       self.playlistModel.setPlaylists(self.library.get_playlists())
+               self.runGenerator(lambda: self.library.load_(None), finish)
 
        def applicationWillTerminate_(self, _):
                self.prefs().synchronize()
@@ -124,10 +125,29 @@ class NotiPodAppDelegate(NSObject):
        def applicationShouldTerminateAfterLastWindowClosed_(self, _):
                return True
 
+
+       # Utility methods
+       def runGenerator(self, func, finish):
+               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
+               self.gen = func()
+               self.finish = finish
+               self.runGeneratorNext()
+
+       def runGeneratorNext(self):
+               try:
+                       msg = self.gen.next()
+                       self.loadingLabel.setStringValue_(msg)
+                       self.performSelector_withObject_afterDelay_(
+                               self.runGeneratorNext, None, 0)
+               except StopIteration:
+                       self.gen = None
+                       NSApp.endSheet_(self.loadingSheet)
+                       self.loadingSheet.orderOut_(self)
+                       self.finish()
+                       self.finish = None
+
        @objc.IBAction
        def doSync_(self, sender):
-               NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.synchronizingSheet, self.window, None, None, None)
-
                folder = self.folders()[0]
                playlists = [self.library.get_playlist_pid(pid) for pid in self.playlists()]
 
@@ -137,13 +157,19 @@ class NotiPodAppDelegate(NSObject):
                        libsyncitunes.export_m3u(dry_run=False, dest=folder, path_prefix="",
                                        playlist_name=playlist.name, files=playlist.tracks)
 
-               libsyncitunes.sync(dry_run=False,
-                       source=self.library.folder, dest=folder, files=all_tracks)
-
-               NSApp.endSheet_(self.synchronizingSheet)
-               self.synchronizingSheet.orderOut_(self)
-
-               NSRunAlertPanel("Complete!", "Synchronisation is complete", "Ok", None, None)
+               def finish():
+                       NSRunAlertPanel("Complete!", "Synchronisation is complete", "Ok", None, None)
+               self.runGenerator(
+                       lambda:
+                               libsyncitunes.sync(
+                                       dry_run=False,
+                                       source=self.library.folder,
+                                       dest=folder, 
+                                       files=all_tracks
+                               )
+                       ,
+                       finish
+               )
 
 
        # Public accessors
index 9573fe6fc7dc93b70c36e5b46a952d6491a94531..c8d330ccd3c5a6af4ffae0e1cb60b0cbc53cc07b 100644 (file)
@@ -37,19 +37,19 @@ class Playlist(NSObject):
                        parent.children.append(self)
 
 class ITunesLibrary(NSObject):
-       def init(self):
-               return self.initWithFilename_("~/Music/iTunes/iTunes Music Library.xml")
-
-       def initWithFilename_(self, filename):
+       def load_(self, filename):
+               if filename is None:
+                       filename = "~/Music/iTunes/iTunes Music Library.xml"
                filename = os.path.expanduser(filename)
+               yield "Reading library..."
                plist = read_plist(os.path.expanduser(filename))
                self.folder = self.loc2name(plist["Music Folder"])
                pl_tracks = plist["Tracks"]
                self.playlists = {}
                for pl_playlist in plist["Playlists"]:
                        playlist = self.make_playlist(pl_playlist, pl_tracks)
+                       yield "Read playlist: " + playlist.name
                        self.playlists[playlist.pid] = playlist
-               return self
 
        def loc2name(self, location):
                return urllib.splithost(urllib.splittype(urllib.unquote(location))[1])[1]
@@ -69,7 +69,6 @@ class ITunesLibrary(NSObject):
                        filename = str(pl_tracks[str(trackID)]["Location"])
                        filename = self.loc2name(filename)
                        filename = filename.decode("utf-8")
-###                    filename = eval(repr(filename).lstrip("u")).decode("utf-8")
                        if not filename.startswith(self.folder):
                                logging.warn("Skipping: " + filename)
                                continue
@@ -189,23 +188,23 @@ def sync(dry_run, source, dest, files):
                                continue
 
                        if filename in files:
-                               sourcestat = os.stat(join(source, filename))
+                               sourcestat = os.stat(join(source, filemap[filename]))
                                deststat = os.stat(join(dest, filename))
                                same_time = abs(sourcestat.st_mtime - deststat.st_mtime) < 5
                                same_size = sourcestat.st_size == deststat.st_size
                                if same_time and same_size:
                                        files.remove(filename)
-                                       logging.debug("keep: " + filename)
+                                       yield "Keep: " + filename
                                else:
-                                       logging.debug("update: " + filename)
+                                       yield "Update: " + filename
 
                        elif not filename.endswith(".m3u"):
-                               logging.debug("delete: " + filename)
+                               yield "Delete: " + filename
                                if not dry_run:
                                        os.unlink(join(dest, filename))
 
                if len(os.listdir(full_dirpath)) == 0:
-                       logging.debug("rmdir: " + dirpath)
+                       yield "Delete: " + dirpath
                        if not dry_run:
                                os.rmdir(full_dirpath)
 
@@ -214,7 +213,7 @@ def sync(dry_run, source, dest, files):
        files = list(files)
        files.sort()
        for filename in files:
-               logging.debug("copy: " + filename)
+               yield "Copy: " + filename
                if not dry_run:
                        mkdirhier(os.path.dirname(join(dest, filename)))
                        shutil.copy2(join(source, filemap[filename]), join(dest, filename))
index fb9dba0eb20a265998a3eb9e2d392f440209f9e9..32ed08cbc16d288959bc0a01509e4fbe4bf72c65 100755 (executable)
@@ -52,11 +52,10 @@ def main():
                sys.exit(1)
 
        logging.info("Loading library")
-       library = libsyncitunes.ITunesLibrary.alloc()
-       if opts.itunes_library:
-               library = library.initWithFilename_(opts.itunes_library)
-       else:
-               library = library.init()
+       library = libsyncitunes.ITunesLibrary.alloc().init()
+       gen = library.load_(opts.itunes_library)
+       for msg in gen:
+               logging.debug(msg)
 
        for playlist in opts.playlists:
                if not library.has_playlist_name(playlist):
@@ -68,11 +67,13 @@ def main():
        for playlist in opts.playlists:
                tracks = library.get_playlist_name(playlist).tracks
                all_tracks.extend(tracks)
-               libsyncitunes.export_m3u(opts.dry_run, opts.dest, opts.path_prefix,
-                               playlist, tracks)
+               libsyncitunes.export_m3u(opts.dry_run, opts.dest,
+                       opts.path_prefix, playlist, tracks)
 
        logging.info("Synchronising")
-       libsyncitunes.sync(opts.dry_run, library.folder, opts.dest, all_tracks)
+       gen = libsyncitunes.sync(opts.dry_run, library.folder, opts.dest, all_tracks)
+       for msg in gen:
+               logging.debug(msg)
 
 
 if __name__ == "__main__":