From: James Bunton Date: Thu, 12 Jul 2012 07:52:36 +0000 (+1000) Subject: Various improvements: X-Git-Url: https://code.delx.au/notipod/commitdiff_plain/df67d37aefe30d0ff4ab0a2f12e8a46f4f0646b0 Various improvements: * 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 --- diff --git a/libnotipod.py b/libnotipod.py index 30a6a08..2053b74 100644 --- a/libnotipod.py +++ b/libnotipod.py @@ -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)) diff --git a/notipod_cli.py b/notipod_cli.py index 378b4f1..7ffb9ae 100755 --- a/notipod_cli.py +++ b/notipod_cli.py @@ -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) diff --git a/notipod_gui.py b/notipod_gui.py index 57e352b..d37350e 100644 --- a/notipod_gui.py +++ b/notipod_gui.py @@ -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: