The basic use case is:

# this will load libdiscid
import discid

print("device: %s" % discid.get_default_device())
disc =        # reads from default device
print("id: %s" %
print("submission url:\n%s" % disc.submission_url)

You can also set the device explicitely:

device = discid.get_default_device()
disc =
id =

You can use other devices of course: see read().

When anything goes wrong reading from the device, DiscError is raised.


discid can do more than just provide the MusicBrainz Disc ID. You can get details about the tracks an fetch additional features like the ISRCs and the MCN, which is basically the EAN/UPC of the disc:

disc =["mcn", "isrc"])
print("mcn: %s" % disc.mcn)
for track in disc.tracks:
    print("{num:>2}: {isrc:13}".format(num=track.number, isrc=track.isrc))

Without Disc Access

When you just want to generate disc IDs and you have the necessary data laying around, you can use put(). You will need the numbers of the first track (should be 1), the number of the last audio track (cut off trailing data tracks), the total number of sectors for these tracks and the offset for every one of the tracks up to the last audio track.

An example for the TOC TqvKjMu7dMliSfmVEBtrL7sBSno-:

first = 1
last = 15
sectors = 258725
offsets = [150, 17510, ..., 235590]
disc = discid.put(first, last, sectors, offsets)
print("id: %s" %
last_track = disc.tracks[disc.last_track_num - 1]
print("last track length: %s seconds" % last_track.seconds)


The example disc has track 16 as a multimedia/data track. The sector count for the disc is the ending sector for track 15! Depending on how you get this number, you might need to substract 11400 (2:32 minutes) from your sector count. Make sure the last track length is correct!

See also

Disc ID Calculation for details on which numbers to choose.

Fetching Metadata

You can use python-musicbrainzngs to fetch metadata for your disc. The relevant function is musicbrainzngs.get_releases_by_discid():

import discid
import musicbrainzngs

musicbrainzngs.set_useragent("python-discid-example", "0.1", "your@mail")

disc =
    result = musicbrainzngs.get_releases_by_discid(,
except musicbrainzngs.ResponseError:
    print("disc not found or bad response")
    if result.get("disc"):
        print("artist:\t%s" %
        print("title:\t%s" % result["disc"]["release-list"][0]["title"])
    elif result.get("cdstub"):
        print("artist:\t" % result["cdstub"]["artist"])
        print("title:\t" % result["cdstub"]["title"])

You can fetch much more data. See musicbrainzngs for details.


Please submit your disc ID with Disc.submission_url when it isn’t found at the MusicBrainz server.