Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion discid/disc.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion discid/libdiscid.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
62 changes: 37 additions & 25 deletions test_discid.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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(
Expand Down