<gh_stars>1-10
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)

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)
# base class