]> code.delx.au - notipod/blobdiff - libnotipod.py
Save playlists separately for each target folder
[notipod] / libnotipod.py
index 3e30e4d965d61f4e3e664b16a5b8c83d927a031e..2a996ec1aa2fc849e0ac1b9d576d5060cf9283ac 100644 (file)
@@ -2,6 +2,7 @@
 # Copyright 2009 James Bunton <jamesbunton@fastmail.fm>
 # Licensed for distribution under the GPL version 2, check COPYING for details
 
+import collections
 import logging
 import os
 import shutil
@@ -44,10 +45,14 @@ class ITunesLibrary(NSObject):
                filename = os.path.expanduser(filename)
                yield "Reading library..."
                plist = read_plist(os.path.expanduser(filename))
+               if plist is None:
+                       raise Exception("Could not find music library: " + filename)
                self.folder = self.loc2name(plist["Music Folder"])
                pl_tracks = plist["Tracks"]
                pl_lookup = {}
                self.playlists = []
+               self.track2playlist = collections.defaultdict(set)
+               self.track2filename = {}
                for pl_playlist in plist["Playlists"]:
                        playlist = self.make_playlist(pl_playlist, pl_tracks, pl_lookup)
                        if not playlist:
@@ -93,17 +98,25 @@ class ITunesLibrary(NSObject):
                        parent = pl_lookup[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.decode("utf-8")
-                       if not filename.startswith(self.folder):
-                               logging.warn("Skipping: " + filename)
-                               continue
-                       filename = strip_prefix(filename, self.folder)
-                       tracks.append(filename)
+                       item = pl_tracks[str(trackID)]
+                       self.track2playlist[trackID].add(pid)
+                       tracks.append(trackID)
+                       if trackID not in self.track2filename:
+                               if item["Track Type"] != "File":
+                                       continue
+                               filename = str(item["Location"])
+                               filename = self.loc2name(filename)
+                               filename = filename.decode("utf-8")
+                               if not filename.startswith(self.folder):
+                                       logging.warn("Skipping: " + filename)
+                                       continue
+                               filename = strip_prefix(filename, self.folder)
+                               self.track2filename[trackID] = filename
+
                playlist = Playlist.alloc().init()
                playlist.set(name, pid, ptype, tracks, parent)
                return playlist
@@ -124,6 +137,12 @@ class ITunesLibrary(NSObject):
                        if playlist.pid == pid:
                                return playlist
 
+       def get_track_filename(self, trackID):
+               return self.track2filename.get(trackID, None)
+
+       def get_track_playlists(self, trackID):
+               return self.track2playlist.get(trackID, [])
+
        def get_playlists(self):
                return self.playlists
 
@@ -168,9 +187,14 @@ def mkdirhier(path):
 def export_m3u(dry_run, dest, path_prefix, playlist_name, files):
        if dry_run:
                return
+       dest = os.path.join(dest, "-Playlists-")
        if not path_prefix:
-               path_prefix = "../"
-       playlist_file = os.path.join(dest, "-Playlists-", playlist_name) + ".m3u"
+               try:
+                       f = open(os.path.join(dest, ".path_prefix"))
+                       path_prefix = f.read().strip()
+               except:
+                       path_prefix = "../"
+       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)