| 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 "." |