X-Git-Url: https://code.delx.au/notipod/blobdiff_plain/5f0b11ceda864a35911a4048f2371cb9b9f5b45a..e0bbbf5e05d9c7e4c6b710f54b01af7a10ecda77:/libnotipod.py diff --git a/libnotipod.py b/libnotipod.py index 3e30e4d..30a6a08 100644 --- a/libnotipod.py +++ b/libnotipod.py @@ -2,6 +2,7 @@ # Copyright 2009 James Bunton # Licensed for distribution under the GPL version 2, check COPYING for details +import collections import logging import os import shutil @@ -38,16 +39,23 @@ class Playlist(NSObject): parent.children.append(self) class ITunesLibrary(NSObject): - def load_(self, filename): + def load_(self, filename=None): if filename is None: - filename = "~/Music/iTunes/iTunes Music Library.xml" - filename = os.path.expanduser(filename) + filename = getattr(self, "filename", None) + if filename is None: + filename = os.path.expanduser("~/Music/iTunes/iTunes Music Library.xml") + self.filename = filename + self.mtime = os.stat(filename).st_mtime 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: @@ -56,6 +64,9 @@ class ITunesLibrary(NSObject): self.playlists.append(playlist) pl_lookup[playlist.pid] = playlist + def needs_reload(self): + return os.stat(self.filename).st_mtime > self.mtime + def loc2name(self, location): return urllib.splithost(urllib.splittype(urllib.unquote(location))[1])[1] @@ -93,17 +104,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 +143,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 +193,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)