Skip to content

Commit 22b2bbc

Browse files
committed
fix put working with first track > 1
discid_put always expects an array of 100 elements for the offsets and the offset position depending on the track no.
1 parent f0b6f1b commit 22b2bbc

File tree

2 files changed

+45
-26
lines changed

2 files changed

+45
-26
lines changed

discid/disc.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,14 @@ def put(self, first, last, disc_sectors, track_offsets):
169169
self._requested_features = ["read"]
170170

171171
offsets = [disc_sectors] + track_offsets
172-
c_offsets = (c_int * len(offsets))(*tuple(offsets))
172+
# libdiscid always expects an array of 100 integers, no matter the track count.
173+
c_offsets = (c_int * 100)()
174+
c_offsets[0] = offsets[0]
175+
try:
176+
for i, offset in enumerate(offsets[1:]):
177+
c_offsets[i + first] = offset
178+
except IndexError:
179+
raise TOCError("Too many tracks") from None
173180
result = _LIB.discid_put(self._handle, first, last, c_offsets) == 1
174181
self._success = result
175182
if not self._success:

test_discid.py

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,17 @@
1919
149160, 165115, 177710, 203325, 215555, 235590],
2020
"id": "TqvKjMu7dMliSfmVEBtrL7sBSno-",
2121
"freedb": "b60d770f"
22-
}
22+
},
23+
{
24+
"name": "Lunar - There Is No 1, first track is 2",
25+
"first": 2,
26+
"last" : 11,
27+
"sectors": 225781,
28+
"offsets": [150, 11512, 34143, 50747, 63640, 98491,
29+
123534, 174410, 195438, 201127],
30+
"id": "6RDuz0d7.M5SVMLe1z4DP0yaEC8-",
31+
"freedb": "840bc20b"
32+
},
2333
]
2434

2535
class TestModulePrivate(unittest.TestCase):
@@ -80,32 +90,34 @@ def test_put_fail(self):
8090
discid.put, 1, 2, 1000, [150, 500, 750])
8191
# total sectors / offset mismatch
8292
self.assertRaises(discid.TOCError, discid.put, 1, 2, 150, [150, 500])
93+
# too many tracks
94+
self.assertRaises(discid.TOCError, discid.put, 98, 100, 2000, [150, 500, 750])
8395

8496
def test_put_success(self):
85-
test_disc = test_discs[0]
86-
disc = discid.put(test_disc["first"], test_disc["last"],
87-
test_disc["sectors"], test_disc["offsets"])
88-
self.assertEqual(disc.id, test_disc["id"])
89-
self.assertEqual(disc.freedb_id, test_disc["freedb"])
90-
self.assertEqual(disc.first_track_num, test_disc["first"])
91-
self.assertEqual(disc.last_track_num, test_disc["last"])
92-
self.assertEqual(disc.sectors, test_disc["sectors"])
93-
track_offsets = [track.offset for track in disc.tracks]
94-
self.assertEqual(track_offsets, test_disc["offsets"])
95-
self.assertEqual(disc.sectors,
96-
disc.tracks[-1].offset + disc.tracks[-1].sectors)
97-
self.assertEqual(disc.seconds, math.floor((disc.sectors / 75.0) + 0.5))
98-
self.assertEqual(type(disc.seconds), int)
99-
for track in disc.tracks:
100-
self.assertEqual(track.seconds,
101-
math.floor((track.sectors / 75.0) + 0.5))
102-
self.assertEqual(type(track.seconds), int)
103-
toc_string = ["1", disc.last_track_num, disc.sectors] + track_offsets
104-
toc_string = " ".join(map(str, toc_string))
105-
self.assertEqual(disc.toc_string, toc_string)
106-
cddb_query_string = [disc.freedb_id, disc.last_track_num] + track_offsets + [disc.seconds]
107-
cddb_query_string = " ".join(map(str, cddb_query_string))
108-
self.assertEqual(disc.cddb_query_string, cddb_query_string)
97+
for test_disc in test_discs:
98+
disc = discid.put(test_disc["first"], test_disc["last"],
99+
test_disc["sectors"], test_disc["offsets"])
100+
self.assertEqual(disc.id, test_disc["id"])
101+
self.assertEqual(disc.freedb_id, test_disc["freedb"])
102+
self.assertEqual(disc.first_track_num, test_disc["first"])
103+
self.assertEqual(disc.last_track_num, test_disc["last"])
104+
self.assertEqual(disc.sectors, test_disc["sectors"])
105+
track_offsets = [track.offset for track in disc.tracks]
106+
self.assertEqual(track_offsets, test_disc["offsets"])
107+
self.assertEqual(disc.sectors,
108+
disc.tracks[-1].offset + disc.tracks[-1].sectors)
109+
self.assertEqual(disc.seconds, math.floor((disc.sectors / 75.0) + 0.5))
110+
self.assertEqual(type(disc.seconds), int)
111+
for track in disc.tracks:
112+
self.assertEqual(track.seconds,
113+
math.floor((track.sectors / 75.0) + 0.5))
114+
self.assertEqual(type(track.seconds), int)
115+
toc_string = [test_disc["first"], disc.last_track_num, disc.sectors] + track_offsets
116+
toc_string = " ".join(map(str, toc_string))
117+
self.assertEqual(disc.toc_string, toc_string)
118+
cddb_query_string = [disc.freedb_id, disc.last_track_num] + track_offsets + [disc.seconds]
119+
cddb_query_string = " ".join(map(str, cddb_query_string))
120+
self.assertEqual(disc.cddb_query_string, cddb_query_string)
109121

110122

111123
@unittest.skipUnless(

0 commit comments

Comments
 (0)