40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
from passport.wozardry import Track, raise_if
|
|
import bitarray
|
|
import json
|
|
|
|
class EDDError(Exception): pass # base class
|
|
class EDDLengthError(EDDError): pass
|
|
class EDDSeekError(EDDError): pass
|
|
|
|
class EDDReader:
|
|
def __init__(self, iostream):
|
|
self.tracks = []
|
|
for i in range(137):
|
|
raw_bytes = iostream.read(16384)
|
|
raise_if(len(raw_bytes) != 16384, EDDLengthError, "Bad EDD file (did you image by quarter tracks?)")
|
|
bits = bitarray.bitarray(endian="big")
|
|
bits.frombytes(raw_bytes)
|
|
self.tracks.append(Track(bits, 131072))
|
|
|
|
def seek(self, track_num):
|
|
if type(track_num) != float:
|
|
track_num = float(track_num)
|
|
if track_num < 0.0 or \
|
|
track_num > 35.0 or \
|
|
track_num.as_integer_ratio()[1] not in (1,2,4):
|
|
raise EDDSeekError("Invalid track %s" % track_num)
|
|
trk_id = int(track_num * 4)
|
|
return self.tracks[trk_id]
|
|
|
|
def to_json(self):
|
|
j = {"edd":
|
|
{"info":
|
|
{"synchronized":False,
|
|
"write_protected":False,
|
|
"cleaned":False
|
|
},
|
|
"meta":{}
|
|
}
|
|
}
|
|
return json.dumps(j, indent=2)
|