XSPF Coverage Dump
Here is an alternative XSPF coverage check program, based on concepts from the previous one. This script will dump all files in a directory structure, color coded by reference from one or more XSPF playlists. This makes it easy to see which files are included in any playlists, and if they are included more than once.
Take a look:
#!/usr/bin/python import xml.dom.minidom import re import os import getopt xspf_files = dict() fs_files = list() def print_usage(progname): print "Usage: %s [options] <directory> <xspf file> ... <xspf file>" % (progname) print "Options:" print " -c No ANSI color coding" print " -n No count prefix" def xspf_parse(playlist_filename, handler): xml_data = xml.dom.minidom.parse(playlist_filename) for playlist in xml_data.getElementsByTagName("playlist"): for tracklist in playlist.getElementsByTagName("trackList"): for track in tracklist.getElementsByTagName("track"): for location in track.getElementsByTagName("location"): data = re.sub("%([0-9a-fA-F]{2})", \ lambda x: chr(int(x.group(1), 16)), \ location.firstChild.data.encode("utf-8")) track_filename = data.decode("utf-8").replace("file://", "") handler(playlist_filename, track_filename) def add_xspf_file(playlist_filename, track_filename): if not track_filename in xspf_files: xspf_files[track_filename] = list() xspf_files[track_filename].append(playlist_filename) if __name__ == "__main__": import sys try: opts, args = getopt.getopt(filter(None, sys.argv[1:]), "hcn", ["help", "no-color", "no-count"]) except getopt.GetoptError as err: print str(err) print_usage(sys.argv[0]) sys.exit(1) if len(args) < 2: print_usage(sys.argv[0]) sys.exit(1) print_color = True print_count = True for o, a in opts: if o in ("-h", "--help"): print_usage(sys.argv[0]) sys.exit(1) elif o in ("-c", "--no-color"): print_color = False elif o in ("-n", "--no-count"): print_count = False for filename in args[1:]: xspf_parse(filename, add_xspf_file) for root, dirs, files in os.walk(args[0]): for filename in files: fs_files.append(os.path.join(root, filename).decode("iso-8859-1")) for fs_file in sorted(fs_files): if fs_file in xspf_files: count = len(xspf_files[fs_file]) if count > 1: if print_count: sys.stdout.write("%d " % (count)) if print_color: sys.stdout.write("\x1B[32;1m") sys.stdout.write(fs_file.encode("iso-8859-1")) if print_color: sys.stdout.write("\x1B[0m") sys.stdout.write("\n") else: if print_count: sys.stdout.write("1 ") if print_color: sys.stdout.write("\x1B[32m") sys.stdout.write(fs_file.encode("iso-8859-1")) if print_color: sys.stdout.write("\x1B[0m") sys.stdout.write("\n") else: if print_count: sys.stdout.write("0 ") sys.stdout.write(fs_file.encode("iso-8859-1")) sys.stdout.write("\n") sys.exit(0)