3 # Copyright 2005 Decklin Foster, licensed under the same terms as abcde.
8 import musicbrainz.queries as mq
10 DEF_CD_DEV = '/dev/cdrom'
12 def get_toc_discid(mb, dev):
15 mb.Query(mq.MBQ_GetCDTOC)
16 return mb.GetResultData(mq.MBE_TOCGetCDIndexId)
17 except musicbrainz.MusicBrainzError:
18 print >>sys.stderr, "error: could not read TOC from disc"
21 def lookup_discid(mb, id):
22 mb.QueryWithArgs(mq.MBQ_GetCDInfoFromCDIndexId, [id])
25 matches = mb.GetResultInt(mq.MBE_GetNumAlbums)
27 print >>sys.stderr, "error: could not find an entry for this disc"
30 print >>sys.stderr, "warning: multiple matches, using first"
32 mb.Select1(mq.MBS_SelectAlbum, 1)
33 album = mb.GetResultData(mq.MBE_AlbumGetAlbumName)
34 n = mb.GetResultInt(mq.MBE_AlbumGetNumTracks)
36 artistid = mb.GetIDFromURL(mb.GetResultData(mq.MBE_AlbumGetAlbumArtistId))
37 if artistid == mq.MBI_VARIOUS_ARTIST_ID:
38 artist = 'Various Artists'
41 artist = mb.GetResultData1(mq.MBE_AlbumGetArtistName, 1)
42 except musicbrainz.MusicBrainzError:
43 artist = 'Unknown Artist'
46 tracks = map(int, args)
48 tracks = range(1, n+1)
52 if artistid == mq.MBI_VARIOUS_ARTIST_ID:
54 tartist = mb.GetResultData1(mq.MBE_AlbumGetArtistName, i)
55 except musicbrainz.MusicBrainzError:
56 tartist = 'Unknown Artist'
60 ttitle = mb.GetResultData1(mq.MBE_AlbumGetTrackName, i)
61 except musicbrainz.MusicBrainzError:
62 tartist = 'Unknown Track'
64 tlength = mb.GetResultInt1(mq.MBE_AlbumGetTrackDuration, i)
65 except musicbrainz.MusicBrainzError:
67 trackinfo.append((tartist, ttitle, tlength))
69 print "# fake CD database file generated by musicbrainz-get-tracks 0.1"
71 print "# Track frame offsets:"
73 # Assume standard pregap
76 tartist, ttitle, tlength = t
77 print "# %d" % (total_len / (1000.0/75.0))
81 print "# Disc length: %d seconds" % (total_len / 1000)
84 print "# Processed by: MusicBrainz"
85 print "# Submitted by: MusicBrainz"
86 print "DISCID=%s" % id
87 print "DTITLE=%s / %s" % (artist, album)
89 for i in range(0, len(trackinfo)):
90 tartist, ttitle, tlength = trackinfo[i]
92 print "TTITLE%d=%s / %s" % (i, tartist, ttitle)
94 print "TTITLE%d=%s" % (i, ttitle)
98 for i in range(0, len(trackinfo)):
104 if __name__ == "__main__":
106 longopts = ['no-lookup', 'device=', 'id=']
108 mb = musicbrainz.mb()
111 opts, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
116 for opt, arg in opts:
117 if opt in ('--no-lookup', '-n'):
119 if opt in ('--device', '-d'):
120 id = get_toc_discid(mb, arg)
121 if opt in ('--id', '-i'):
124 id = get_toc_discid(mb, DEF_CD_DEV)
127 lookup_discid(mb, id)