Adding musicbrainz support. First bits.
[abcde.git] / examples / musicbrainz-get-tracks
1 #!/usr/bin/python
2
3 # Copyright 2005 Decklin Foster, licensed under the same terms as abcde.
4
5 import sys
6 import getopt
7 import musicbrainz
8 import musicbrainz.queries as mq
9
10 DEF_CD_DEV = '/dev/cdrom'
11
12 # TODO:
13 #
14 # * --cdrom should take an argument, e.g. /dev/cdrom1. musicbrainz.queries
15 #   doesn't seem to provide for this.
16
17 def get_toc_discid(mb):
18     mb.Query(mq.MBQ_GetCDTOC)
19     return mb.GetResultData(mq.MBE_TOCGetCDIndexId)
20
21 def lookup_discid(mb, id):
22     mb.QueryWithArgs(mq.MBQ_GetCDInfoFromCDIndexId, [id])
23
24 if __name__ == "__main__":
25     shortopts = 'cd:'
26     longopts = ['cdrom', 'discid=']
27
28     mb = musicbrainz.mb()
29     mb.SetDepth(2)
30
31     opts, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
32
33     id = None
34     if opts:
35         for opt, arg in opts:
36             if opt in ('--cdrom', '-c'):
37                 id = get_toc_discid(mb)
38                 lookup_discid(mb, id)
39             if opt in ('--discid', '-d'):
40                 id = arg
41                 lookup_discid(mb, id)
42     else:
43         id = get_toc_discid(mb)
44         lookup_discid(mb, id)
45
46     matches = mb.GetResultInt(mq.MBE_GetNumAlbums)
47     if matches == 0:
48         print >>sys.stderr, "could not find an entry for this CD"
49         sys.exit(1)
50     if matches > 1:
51         print >>sys.stderr, "warning: multiple matches, using first"
52
53     mb.Select1(mq.MBS_SelectAlbum, 1)
54     album = mb.GetResultData(mq.MBE_AlbumGetAlbumName)
55     n = mb.GetResultInt(mq.MBE_AlbumGetNumTracks)
56
57     artistid = mb.GetIDFromURL(mb.GetResultData(mq.MBE_AlbumGetAlbumArtistId))
58     if artistid == mq.MBI_VARIOUS_ARTIST_ID:
59         artist = 'Various Artists'
60     else:
61         try:
62             artist = mb.GetResultData1(mq.MBE_AlbumGetArtistName, 1)
63         except musicbrainz.MusicBrainzError:
64             artist = 'Unknown Artist'
65
66     if args:
67         tracks = map(int, args)
68     else:
69         tracks = range(1, n+1)
70
71     trackinfo = []
72     for i in tracks:
73         if artistid == mq.MBI_VARIOUS_ARTIST_ID:
74             try:
75                 tartist = mb.GetResultData1(mq.MBE_AlbumGetArtistName, i)
76             except musicbrainz.MusicBrainzError:
77                 tartist = 'Unknown Artist'
78         else:
79             tartist = None
80         try:
81             ttitle = mb.GetResultData1(mq.MBE_AlbumGetTrackName, i)
82         except musicbrainz.MusicBrainzError:
83             tartist = 'Unknown Track'
84         try:
85             tlength = mb.GetResultInt1(mq.MBE_AlbumGetTrackDuration, i)
86         except musicbrainz.MusicBrainzError:
87             tlength = 0
88         trackinfo.append((tartist, ttitle, tlength))
89
90     print "# fake CD database file generated by musicbrainz-get-tracks 0.1"
91     print "#"
92     print "# Track frame offsets:"
93
94     # Assume standard pregap
95     total_len = 2000
96     for t in trackinfo:
97         tartist, ttitle, tlength = t
98         print "#       %d" % (total_len / (1000.0/75.0))
99         total_len += tlength
100
101     print "#"
102     print "# Disc length: %d seconds" % (total_len / 1000)
103     print "#"
104     print "# Revision: 0"
105     print "# Processed by: MusicBrainz"
106     print "# Submitted by: MusicBrainz"
107     print "DISCID=%s" % id
108     print "DTITLE=%s / %s" % (artist, album)
109
110     for i in range(0, len(trackinfo)):
111         tartist, ttitle, tlength = trackinfo[i]
112         if tartist:
113             print "TTITLE%d=%s / %s" % (i, tartist, ttitle)
114         else:
115             print "TTITLE%d=%s" % (i, ttitle)
116
117     print "EXTD="
118
119     for i in range(0, len(trackinfo)):
120         print "EXTD%d=" % i
121
122     print "PLAYORDER="
123     print "."