]> code.delx.au - notipod/commitdiff
Various improvements:
authorJames Bunton <jamesbunton@delx.net.au>
Thu, 12 Jul 2012 07:52:36 +0000 (17:52 +1000)
committerJames Bunton <jamesbunton@delx.net.au>
Thu, 12 Jul 2012 07:52:36 +0000 (17:52 +1000)
 * Delete old playlists when doing a sync
 * Don't sync to folders containing non-hidden items without a '-Playlists-' folder
 * Always end path prefix with a path separator
 * Don't update progress bar more than 10 times per second

libnotipod.py
notipod_cli.py
notipod_gui.py

index 30a6a08c625afcc39d679a466e18e1195d104e22..2053b749dc984a9c53c8845b8818b9ebab863d50 100644 (file)
@@ -190,23 +190,44 @@ def mkdirhier(path):
                except OSError:
                        pass
 
-def export_m3u(dry_run, dest, path_prefix, playlist_name, files):
-       if dry_run:
+def delete_playlists(dry_run, dest):
+       dest = os.path.join(dest, "-Playlists-")
+       try:
+               filenames = os.listdir(dest)
+       except OSError:
                return
+
+       for filename in filenames:
+               if not filename.lower().endswith(".m3u"):
+                       continue
+               filename = os.path.join(dest, filename)
+               logging.info("Deleting: " + filename)
+               if not dry_run:
+                       try:
+                               os.unlink(filename)
+                       except OSError:
+                               pass
+
+def export_m3u(dry_run, dest, path_prefix, playlist_name, files):
        dest = os.path.join(dest, "-Playlists-")
-       if not path_prefix:
-               try:
-                       f = open(os.path.join(dest, ".path_prefix"))
-                       path_prefix = f.read().strip()
-               except:
-                       path_prefix = "../"
+       mkdirhier(dest)
+       playlist_name = playlist_name.replace("/", "-")
        playlist_file = os.path.join(dest, playlist_name) + ".m3u"
        playlist_file = encode_filename(playlist_file)
-       mkdirhier(os.path.dirname(playlist_file))
        logging.info("Writing: " + playlist_file)
+
+       if dry_run:
+               return
+
+       sep = "/"
+       if path_prefix.find("\\") > 0:
+               sep = "\\"
+       if path_prefix[-1] != sep:
+               path_prefix += sep
+
        f = open(playlist_file, "w")
        for filename in files:
-               if path_prefix.find("\\") > 0:
+               if sep == "\\":
                        filename = filename.replace("/", "\\")
                filename = encode_filename(filename)
                f.write("%s%s\n" % (path_prefix, filename))
index 378b4f197e00fc18c5201acb4d02e945ea12fd4c..7ffb9aee219d5fca0b4a03983ab8c76d629c64dd 100755 (executable)
@@ -62,14 +62,22 @@ def main():
                        logging.fatal("Could not find playlist: " + playlist)
                        sys.exit(1)
 
+       logging.info("Deleting playlists")
+       libnotipod.delete_playlists(opts.dry_run, opts.dest)
+
        logging.info("Loading playlists")
        all_filenames = []
        for playlist in opts.playlists:
                tracks = library.get_playlist_name(playlist).tracks
                filenames = [library.get_track_filename(trackID) for trackID in tracks]
                all_filenames.extend(filenames)
-               libnotipod.export_m3u(opts.dry_run, opts.dest,
-                       opts.path_prefix, playlist, filenames)
+               libnotipod.export_m3u(
+                       opts.dry_run,
+                       opts.dest,
+                       opts.path_prefix,
+                       playlist,
+                       filenames
+               )
 
        logging.info("Synchronising")
        gen = libnotipod.sync(opts.dry_run, library.folder, opts.dest, all_filenames)
index 57e352b77c96b4c64807fbeaa390fd6ae02d1b1c..d37350e70eaf0f810bad1c73467c2c28d1603beb 100644 (file)
@@ -5,6 +5,7 @@
 import logging
 import os
 import sys
+import time
 import traceback
 import uuid
 
@@ -173,12 +174,15 @@ class NotiPodController(NSObject):
 
        def runGeneratorThread(self, (gen, finish, fail)):
                pool = NSAutoreleasePool.alloc().init()
+               last_time = 0
                try:
                        for msg in gen:
                                if not self.runningGenerator:
                                        break
-                               self.loadingLabel.performSelectorOnMainThread_withObject_waitUntilDone_(
-                                       self.loadingLabel.setStringValue_, msg, True)
+                               now = time.time()
+                               if now - last_time > 0.1:
+                                       self.loadingLabel.performSelectorOnMainThread_withObject_waitUntilDone_(
+                                               self.loadingLabel.setStringValue_, msg, True)
                except Exception, e:
                        NSRunAlertPanel("Error!", str(e), "Ok", None, None)
                        traceback.print_exc()
@@ -205,7 +209,7 @@ class NotiPodController(NSObject):
                        self.playlistModel.setPlaylists(self.library.get_playlists())
                def fail():
                        NSRunAlertPanel("Error!", "Unable to load iTunes library! Exiting...", "Ok", None, None)
-                       sys.exit(0)
+                       os._exit(0)
                self.runGenerator(lambda: self.library.load_(None), finish, fail)
 
        @objc.IBAction
@@ -236,11 +240,16 @@ class NotiPodController(NSObject):
                        NSRunAlertPanel("Error!", "You must choose a folder first!", "Ok", None, None)
                        return
                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
-               target["folder"] = folder
-               target["path_prefix"] = target["path_prefix"].encode("utf-8")
+
+               folder_contents = [f for f in os.listdir(folder) if not f.startswith(".")]
+               if len(folder_contents) > 0 and "-Playlists-" not in folder_contents:
+                       NSRunAlertPanel("Error!", "Refusing to clobber files in non-empty folder: " + folder, "Ok", None, None)
+                       return
+
                return target
 
        def doPreviewThread(self):
@@ -302,6 +311,8 @@ class NotiPodController(NSObject):
                        all_filenames.append(self.library.get_track_filename(trackID))
                        all_playlists.update(self.library.get_track_playlists(trackID))
 
+               libnotipod.delete_playlists(dry_run=False, dest=target["folder"])
+
                for playlist_id in all_playlists:
                        playlist = self.library.get_playlist_pid(playlist_id)
                        if playlist is None: