]> code.delx.au - notipod/blob - syncitunes.py
It displays stuff
[notipod] / syncitunes.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 libsyncitunes
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 = libsyncitunes.ITunesLibrary.alloc()
63 if opts.itunes_library:
64 library = library.initWithFilename_(opts.itunes_library)
65 else:
66 library = library.init()
67
68 for playlist in opts.playlists:
69 if not library.has_playlist(playlist):
70 logging.fatal("Could not find playlist: " + playlist)
71 sys.exit(1)
72
73 logging.info("Loading playlists")
74 all_tracks = []
75 for playlist in opts.playlists:
76 tracks = list(library.get_playlist(playlist))
77 all_tracks.extend(tracks)
78 libsyncitunes.export_m3u(opts.dry_run, opts.full_dest,
79 opts.drive_letter, opts.media_dir,
80 playlist, tracks)
81
82 logging.info("Synchronising")
83 libsyncitunes.sync(opts.dry_run, library.folder, opts.full_dest, all_tracks)
84
85
86 if __name__ == "__main__":
87 main()
88