diff --git a/discid/disc.py b/discid/disc.py index ca79ac3..51282a3 100644 --- a/discid/disc.py +++ b/discid/disc.py @@ -169,7 +169,14 @@ def put(self, first, last, disc_sectors, track_offsets): self._requested_features = ["read"] offsets = [disc_sectors] + track_offsets - c_offsets = (c_int * len(offsets))(*tuple(offsets)) + # libdiscid always expects an array of 100 integers, no matter the track count. + c_offsets = (c_int * 100)() + c_offsets[0] = offsets[0] + try: + for i, offset in enumerate(offsets[1:]): + c_offsets[i + first] = offset + except IndexError: + raise TOCError("Too many tracks") from None result = _LIB.discid_put(self._handle, first, last, c_offsets) == 1 self._success = result if not self._success: diff --git a/discid/libdiscid.py b/discid/libdiscid.py index 19e092f..25c721e 100644 --- a/discid/libdiscid.py +++ b/discid/libdiscid.py @@ -100,7 +100,7 @@ def _open_library(lib_name): except OSError as exc: if lib_name not in str(exc): # replace uninformative Error on Windows - raise OSError("could not find libdiscid: %s" % lib_name) + raise OSError("could not find libdiscid: %s" % lib_name) from exc else: raise diff --git a/test_discid.py b/test_discid.py index e2ef0f0..50dd106 100755 --- a/test_discid.py +++ b/test_discid.py @@ -19,7 +19,17 @@ 149160, 165115, 177710, 203325, 215555, 235590], "id": "TqvKjMu7dMliSfmVEBtrL7sBSno-", "freedb": "b60d770f" - } + }, + { + "name": "Lunar - There Is No 1, first track is 2", + "first": 2, + "last" : 11, + "sectors": 225781, + "offsets": [150, 11512, 34143, 50747, 63640, 98491, + 123534, 174410, 195438, 201127], + "id": "6RDuz0d7.M5SVMLe1z4DP0yaEC8-", + "freedb": "840bc20b" + }, ] class TestModulePrivate(unittest.TestCase): @@ -80,32 +90,34 @@ def test_put_fail(self): discid.put, 1, 2, 1000, [150, 500, 750]) # total sectors / offset mismatch self.assertRaises(discid.TOCError, discid.put, 1, 2, 150, [150, 500]) + # too many tracks + self.assertRaises(discid.TOCError, discid.put, 98, 100, 2000, [150, 500, 750]) def test_put_success(self): - test_disc = test_discs[0] - disc = discid.put(test_disc["first"], test_disc["last"], - test_disc["sectors"], test_disc["offsets"]) - self.assertEqual(disc.id, test_disc["id"]) - self.assertEqual(disc.freedb_id, test_disc["freedb"]) - self.assertEqual(disc.first_track_num, test_disc["first"]) - self.assertEqual(disc.last_track_num, test_disc["last"]) - self.assertEqual(disc.sectors, test_disc["sectors"]) - track_offsets = [track.offset for track in disc.tracks] - self.assertEqual(track_offsets, test_disc["offsets"]) - self.assertEqual(disc.sectors, - disc.tracks[-1].offset + disc.tracks[-1].sectors) - self.assertEqual(disc.seconds, math.floor((disc.sectors / 75.0) + 0.5)) - self.assertEqual(type(disc.seconds), int) - for track in disc.tracks: - self.assertEqual(track.seconds, - math.floor((track.sectors / 75.0) + 0.5)) - self.assertEqual(type(track.seconds), int) - toc_string = ["1", disc.last_track_num, disc.sectors] + track_offsets - toc_string = " ".join(map(str, toc_string)) - self.assertEqual(disc.toc_string, toc_string) - cddb_query_string = [disc.freedb_id, disc.last_track_num] + track_offsets + [disc.seconds] - cddb_query_string = " ".join(map(str, cddb_query_string)) - self.assertEqual(disc.cddb_query_string, cddb_query_string) + for test_disc in test_discs: + disc = discid.put(test_disc["first"], test_disc["last"], + test_disc["sectors"], test_disc["offsets"]) + self.assertEqual(disc.id, test_disc["id"]) + self.assertEqual(disc.freedb_id, test_disc["freedb"]) + self.assertEqual(disc.first_track_num, test_disc["first"]) + self.assertEqual(disc.last_track_num, test_disc["last"]) + self.assertEqual(disc.sectors, test_disc["sectors"]) + track_offsets = [track.offset for track in disc.tracks] + self.assertEqual(track_offsets, test_disc["offsets"]) + self.assertEqual(disc.sectors, + disc.tracks[-1].offset + disc.tracks[-1].sectors) + self.assertEqual(disc.seconds, math.floor((disc.sectors / 75.0) + 0.5)) + self.assertEqual(type(disc.seconds), int) + for track in disc.tracks: + self.assertEqual(track.seconds, + math.floor((track.sectors / 75.0) + 0.5)) + self.assertEqual(type(track.seconds), int) + toc_string = [test_disc["first"], disc.last_track_num, disc.sectors] + track_offsets + toc_string = " ".join(map(str, toc_string)) + self.assertEqual(disc.toc_string, toc_string) + cddb_query_string = [disc.freedb_id, disc.last_track_num] + track_offsets + [disc.seconds] + cddb_query_string = " ".join(map(str, cddb_query_string)) + self.assertEqual(disc.cddb_query_string, cddb_query_string) @unittest.skipUnless(