]> code.delx.au - notipod/blobdiff - libsyncitunes.py
It works! :)
[notipod] / libsyncitunes.py
index ea3754118d03b1f8ff93694d087d98cb86e98f08..3bccfec30a9bbe1e4a00d279028ca6a9bddbb02e 100644 (file)
@@ -22,15 +22,20 @@ def read_plist(filename):
                raise TypeError(errStr)
        return plist
 
-class Playlist(object):
-       def __init__(self, name, tracks, parent=None):
+class Playlist(NSObject):
+       def init(self):
+               return self
+
+       def set(self, name, pid, tracks, parent):
                self.name = name
+               self.pid = pid
                self.children = []
                self.tracks = tracks
+               self.parent = parent
                if parent is not None:
                        parent.children.append(self)
 
-class Library(NSObject):
+class ITunesLibrary(NSObject):
        def init(self):
                return self.initWithFilename_("~/Music/iTunes/iTunes Music Library.xml")
 
@@ -39,9 +44,10 @@ class Library(NSObject):
                plist = read_plist(os.path.expanduser(filename))
                self.folder = self.loc2name(plist["Music Folder"])
                pl_tracks = plist["Tracks"]
-               self.playlists = []
+               self.playlists = {}
                for pl_playlist in plist["Playlists"]:
-                       self.playlists.append(self.make_playlist(pl_playlist, pl_tracks))
+                       playlist = self.make_playlist(pl_playlist, pl_tracks)
+                       self.playlists[playlist.pid] = playlist
                return self
 
        def loc2name(self, location):
@@ -49,28 +55,48 @@ class Library(NSObject):
        
        def make_playlist(self, pl_playlist, pl_tracks):
                name = pl_playlist["Name"]
+               pid = pl_playlist["Playlist Persistent ID"]
+               parent = None
+               try:
+                       parent_pid = pl_playlist["Parent Persistent ID"]
+                       parent = self.playlists.get(parent_pid)
+               except KeyError:
+                       pass
                tracks = []
                for item in pl_playlist.get("Playlist Items", []):
                        trackID = item["Track ID"]
                        filename = str(pl_tracks[str(trackID)]["Location"])
                        filename = self.loc2name(filename)
-                       filename = filename[len(self.folder):]
                        filename = eval(repr(filename).lstrip("u")).decode("utf-8")
+                       if not filename.startswith(self.folder):
+                               logging.warn("Skipping: " + filename)
+                               continue
+                       filename = filename[len(self.folder):]
+                       if filename.startswith("/"):
+                               filename = filename[1:]
                        tracks.append(filename)
-               return Playlist(name, tracks)
+               playlist = Playlist.alloc().init()
+               playlist.set(name, pid, tracks, parent)
+               return playlist
 
-       def has_playlist(self, playlist):
-               for p in self.playlists:
-                       if p.name == playlist:
+       def has_playlist_name(self, name):
+               for p in self.get_playlists():
+                       if p.name == name:
                                return True
                return False
 
-       def get_playlist(self, name):
-               playlist = [p for p in self.playlists if p.name == name][0]
-               return playlist.tracks
+       def get_playlist_name(self, name):
+               for playlist in self.get_playlists():
+                       if playlist.name == name:
+                               return playlist
+       
+       def get_playlist_pid(self, pid):
+               for playlist in self.get_playlists():
+                       if playlist.pid == pid:
+                               return playlist
 
-       def list_playlists(self):
-               return [p.name for p in self.playlists]
+       def get_playlists(self):
+               return self.playlists.values()
 
        def outlineView_numberOfChildrenOfItem_(self, view, item):
                if item == None:
@@ -91,13 +117,17 @@ class Library(NSObject):
                return item.name
 
 
-def export_m3u(dry_run, dest, drive_letter, music_dir, playlist_name, files):
+def export_m3u(dry_run, dest, path_prefix, playlist_name, files):
        if dry_run:
                return
-       f = open(os.path.join(dest, playlist_name) + ".m3u", "w")
+       playlist_file = os.path.join(dest, playlist_name) + ".m3u"
+       logging.info("Writing: " + playlist_file)
+       f = open(playlist_file, "w")
        for filename in files:
-               filename = filename.replace("/", "\\").encode("utf-8")
-               f.write("%s:\\%s\\%s\n" % (drive_letter, music_dir, filename))
+               if path_prefix.find("\\") > 0:
+                       filename = filename.replace("/", "\\")
+               filename = filename.encode("utf-8")
+               f.write("%s%s\n" % (path_prefix, filename))
        f.close()
 
 def strip_prefix(s, prefix):
@@ -147,7 +177,7 @@ def sync(dry_run, source, dest, files):
                                else:
                                        logging.debug("update: " + filename)
 
-                       elif not filename.startswith("Playlists/"):
+                       elif not filename.endswith(".m3u"):
                                logging.debug("delete: " + filename)
                                if not dry_run:
                                        os.unlink(join(dest, filename))