]> code.delx.au - notipod/blob - sync.py
Initial checkin
[notipod] / sync.py
1 #!/usr/bin/env python
2
3 VERSION = "0.1"
4
5 import logging
6 import optparse
7 import os
8 import sys
9
10 import itunes
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("--drive-letter",
27 action="store", dest="drive_letter", default="E")
28 parser.add_option("--media-dir",
29 action="store", dest="media_dir", default="iTunes")
30
31 opts, args = parser.parse_args(sys.argv[1:])
32 if len(args) < 2:
33 parser.print_usage()
34 sys.exit(1)
35 opts.dest = args[0]
36 opts.full_dest = os.path.join(opts.dest, opts.media_dir)
37 opts.playlists = args[1:]
38
39 return opts
40
41 def main():
42 opts = parse_options()
43
44 # Set up logging
45 try:
46 logging.basicConfig(format="%(levelname)s: %(message)s")
47 except TypeError:
48 # Support for Python 2.3
49 logging.basicConfig()
50 if opts.quiet:
51 logging.getLogger().setLevel(logging.CRITICAL)
52 elif opts.verbose:
53 logging.getLogger().setLevel(logging.DEBUG)
54 else:
55 logging.getLogger().setLevel(logging.INFO)
56
57 if not os.path.isdir(opts.dest):
58 logging.fatal("Destination must be specified as an absolute path.")
59 sys.exit(1)
60
61 logging.info("Loading library")
62 library = itunes.Library.alloc().initWithFilename_(opts.itunes_library)
63
64 for playlist in opts.playlists:
65 if not library.has_playlist(playlist):
66 logging.fatal("Could not find playlist: " + playlist)
67 sys.exit(1)
68
69 logging.info("Loading playlists")
70 all_tracks = []
71 for playlist in opts.playlists:
72 tracks = list(library.get_playlist(playlist))
73 all_tracks.extend(tracks)
74 itunes.export_m3u(opts.dry_run, opts.full_dest,
75 opts.drive_letter, opts.media_dir,
76 playlist, tracks)
77
78 logging.info("Synchronising")
79 itunes.sync(opts.dry_run, library.folder, opts.full_dest, all_tracks)
80
81
82 if __name__ == "__main__":
83 main()
84