Adding musicbrainz support. First bits.
[clinton/abcde.git] / examples / musicbrainz-get-tracks
diff --git a/examples/musicbrainz-get-tracks b/examples/musicbrainz-get-tracks
new file mode 100755 (executable)
index 0000000..1d38480
--- /dev/null
@@ -0,0 +1,123 @@
+#!/usr/bin/python
+
+# Copyright 2005 Decklin Foster, licensed under the same terms as abcde.
+
+import sys
+import getopt
+import musicbrainz
+import musicbrainz.queries as mq
+
+DEF_CD_DEV = '/dev/cdrom'
+
+# TODO:
+#
+# * --cdrom should take an argument, e.g. /dev/cdrom1. musicbrainz.queries
+#   doesn't seem to provide for this.
+
+def get_toc_discid(mb):
+    mb.Query(mq.MBQ_GetCDTOC)
+    return mb.GetResultData(mq.MBE_TOCGetCDIndexId)
+
+def lookup_discid(mb, id):
+    mb.QueryWithArgs(mq.MBQ_GetCDInfoFromCDIndexId, [id])
+
+if __name__ == "__main__":
+    shortopts = 'cd:'
+    longopts = ['cdrom', 'discid=']
+
+    mb = musicbrainz.mb()
+    mb.SetDepth(2)
+
+    opts, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
+
+    id = None
+    if opts:
+        for opt, arg in opts:
+            if opt in ('--cdrom', '-c'):
+                id = get_toc_discid(mb)
+                lookup_discid(mb, id)
+            if opt in ('--discid', '-d'):
+                id = arg
+                lookup_discid(mb, id)
+    else:
+        id = get_toc_discid(mb)
+        lookup_discid(mb, id)
+
+    matches = mb.GetResultInt(mq.MBE_GetNumAlbums)
+    if matches == 0:
+        print >>sys.stderr, "could not find an entry for this CD"
+        sys.exit(1)
+    if matches > 1:
+        print >>sys.stderr, "warning: multiple matches, using first"
+
+    mb.Select1(mq.MBS_SelectAlbum, 1)
+    album = mb.GetResultData(mq.MBE_AlbumGetAlbumName)
+    n = mb.GetResultInt(mq.MBE_AlbumGetNumTracks)
+
+    artistid = mb.GetIDFromURL(mb.GetResultData(mq.MBE_AlbumGetAlbumArtistId))
+    if artistid == mq.MBI_VARIOUS_ARTIST_ID:
+        artist = 'Various Artists'
+    else:
+        try:
+            artist = mb.GetResultData1(mq.MBE_AlbumGetArtistName, 1)
+        except musicbrainz.MusicBrainzError:
+            artist = 'Unknown Artist'
+
+    if args:
+        tracks = map(int, args)
+    else:
+        tracks = range(1, n+1)
+
+    trackinfo = []
+    for i in tracks:
+        if artistid == mq.MBI_VARIOUS_ARTIST_ID:
+            try:
+                tartist = mb.GetResultData1(mq.MBE_AlbumGetArtistName, i)
+            except musicbrainz.MusicBrainzError:
+                tartist = 'Unknown Artist'
+        else:
+            tartist = None
+        try:
+            ttitle = mb.GetResultData1(mq.MBE_AlbumGetTrackName, i)
+        except musicbrainz.MusicBrainzError:
+            tartist = 'Unknown Track'
+        try:
+            tlength = mb.GetResultInt1(mq.MBE_AlbumGetTrackDuration, i)
+        except musicbrainz.MusicBrainzError:
+            tlength = 0
+        trackinfo.append((tartist, ttitle, tlength))
+
+    print "# fake CD database file generated by musicbrainz-get-tracks 0.1"
+    print "#"
+    print "# Track frame offsets:"
+
+    # Assume standard pregap
+    total_len = 2000
+    for t in trackinfo:
+        tartist, ttitle, tlength = t
+        print "#       %d" % (total_len / (1000.0/75.0))
+        total_len += tlength
+
+    print "#"
+    print "# Disc length: %d seconds" % (total_len / 1000)
+    print "#"
+    print "# Revision: 0"
+    print "# Processed by: MusicBrainz"
+    print "# Submitted by: MusicBrainz"
+    print "DISCID=%s" % id
+    print "DTITLE=%s / %s" % (artist, album)
+
+    for i in range(0, len(trackinfo)):
+        tartist, ttitle, tlength = trackinfo[i]
+        if tartist:
+            print "TTITLE%d=%s / %s" % (i, tartist, ttitle)
+        else:
+            print "TTITLE%d=%s" % (i, ttitle)
+
+    print "EXTD="
+
+    for i in range(0, len(trackinfo)):
+        print "EXTD%d=" % i
+
+    print "PLAYORDER="
+    print "."