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))
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)
import logging
import os
import sys
+import time
import traceback
import uuid
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()
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
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):
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: