]> code.delx.au - notipod/blob - notipod_cli.py
category
[notipod] / notipod_cli.py
1 #!/usr/bin/env python
2
3 VERSION = "1.13"
4
5 import logging
6 import optparse
7 import os
8 import sys
9
10 import libnotipod
11
12
13 def parse_options():
14 parser = optparse.OptionParser(version="%prog " + VERSION,
15 description = "Synchronise an iTunes playlist with a directory",
16 usage = "%prog destination playlist [playlist ...]"
17 )
18 parser.add_option("-q", "--quiet",
19 action="store_true", dest="quiet", default=False)
20 parser.add_option("-v", "--verbose",
21 action="store_true", dest="verbose", default=False)
22 parser.add_option("-n", "--dry-run",
23 action="store_true", dest="dry_run", default=False)
24 parser.add_option("--itunes-library",
25 action="store", dest="itunes_library", default=None)
26 parser.add_option("--path-prefix",
27 action="store", dest="path_prefix", default="E:\\")
28
29 opts, args = parser.parse_args(sys.argv[1:])
30 if len(args) < 2:
31 parser.print_usage()
32 sys.exit(1)
33 opts.dest = args[0].decode("utf-8")
34 opts.playlists = args[1:]
35
36 return opts
37
38 def main():
39 opts = parse_options()
40
41 # Set up logging
42 logging.basicConfig(format="%(levelname)s: %(message)s")
43 if opts.quiet:
44 logging.getLogger().setLevel(logging.CRITICAL)
45 elif opts.verbose:
46 logging.getLogger().setLevel(logging.DEBUG)
47 else:
48 logging.getLogger().setLevel(logging.INFO)
49
50 if not os.path.isdir(opts.dest):
51 logging.fatal("Destination must be specified as an absolute path.")
52 sys.exit(1)
53
54 logging.info("Loading library")
55 library = libnotipod.ITunesLibrary.alloc().init()
56 gen = library.load_(opts.itunes_library)
57 for msg in gen:
58 logging.debug(msg)
59
60 for playlist in opts.playlists:
61 if not library.has_playlist_name(playlist):
62 logging.fatal("Could not find playlist: " + playlist)
63 sys.exit(1)
64
65 logging.info("Deleting playlists")
66 libnotipod.delete_playlists(opts.dry_run, opts.dest)
67
68 logging.info("Loading playlists")
69 all_filenames = []
70 for playlist in opts.playlists:
71 tracks = library.get_playlist_name(playlist).tracks
72 filenames = [library.get_track_filename(trackID) for trackID in tracks]
73 all_filenames.extend(filenames)
74 libnotipod.export_m3u(
75 opts.dry_run,
76 opts.dest,
77 opts.path_prefix,
78 playlist,
79 filenames
80 )
81
82 logging.info("Synchronising")
83 gen = libnotipod.sync(opts.dry_run, library.folder, opts.dest, all_filenames)
84 for msg in gen:
85 logging.debug(msg)
86
87
88 if __name__ == "__main__":
89 main()
90