X-Git-Url: https://code.delx.au/notipod/blobdiff_plain/091ffd73bb5472213fe7b2e40e85a8ac1a418891..a9de8db967ce3c8d7063301bf3a806a1b1597503:/libnotipod.py diff --git a/libnotipod.py b/libnotipod.py index 49af34a..76b7fb0 100644 --- a/libnotipod.py +++ b/libnotipod.py @@ -27,9 +27,10 @@ class Playlist(NSObject): def init(self): return self - def set(self, name, pid, tracks, parent): + def set(self, name, pid, ptype, tracks, parent): self.name = name self.pid = pid + self.ptype = ptype self.children = [] self.tracks = tracks self.parent = parent @@ -43,24 +44,55 @@ 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"] - self.playlists = {} + pl_lookup = {} + self.playlists = [] for pl_playlist in plist["Playlists"]: - playlist = self.make_playlist(pl_playlist, pl_tracks) + playlist = self.make_playlist(pl_playlist, pl_tracks, pl_lookup) + if not playlist: + continue yield "Read playlist: " + playlist.name - self.playlists[playlist.pid] = playlist + self.playlists.append(playlist) + pl_lookup[playlist.pid] = playlist def loc2name(self, location): return urllib.splithost(urllib.splittype(urllib.unquote(location))[1])[1] - def make_playlist(self, pl_playlist, pl_tracks): + def make_playlist(self, pl_playlist, pl_tracks, pl_lookup): + if int(pl_playlist.get("Master", 0)): + return + kind = int(pl_playlist.get("Distinguished Kind", -1)) + if kind == 26: + # Don't do genius + return + name = pl_playlist["Name"] pid = pl_playlist["Playlist Persistent ID"] + if kind > 0: + ptype = { + 2: "movies", + 3: "tv-shows", + 4: "music", + 5: "books", + 10: "podcasts", + 19: "purchased", + 22: "itunes-dj", + 31: "itunes-u", + }.get(kind, "playlist") + elif pl_playlist.has_key("Smart Info"): + ptype = "smart-playlist" + elif int(pl_playlist.get("Folder", 0)): + ptype = "folder" + else: + ptype = "playlist" + parent = None try: parent_pid = pl_playlist["Parent Persistent ID"] - parent = self.playlists.get(parent_pid) + parent = pl_lookup[parent_pid] except KeyError: pass tracks = [] @@ -75,7 +107,7 @@ class ITunesLibrary(NSObject): filename = strip_prefix(filename, self.folder) tracks.append(filename) playlist = Playlist.alloc().init() - playlist.set(name, pid, tracks, parent) + playlist.set(name, pid, ptype, tracks, parent) return playlist def has_playlist_name(self, name): @@ -95,25 +127,7 @@ class ITunesLibrary(NSObject): return playlist def get_playlists(self): - return self.playlists.values() - - def outlineView_numberOfChildrenOfItem_(self, view, item): - if item == None: - return len(self.playlists) - else: - return 0 - - def outlineView_isItemExpandable_(self, view, item): - return False - - def outlineView_child_ofItem_(self, view, index, item): - if item == None: - return self.playlists[index] - else: - return None - - def outlineView_objectValueForTableColumn_byItem_(self, view, column, item): - return item.name + return self.playlists encoded_names = {} @@ -159,6 +173,7 @@ def export_m3u(dry_run, dest, path_prefix, playlist_name, files): if not path_prefix: path_prefix = "../" playlist_file = os.path.join(dest, "-Playlists-", playlist_name) + ".m3u" + playlist_file = encode_filename(playlist_file) mkdirhier(os.path.dirname(playlist_file)) logging.info("Writing: " + playlist_file) f = open(playlist_file, "w")