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)