ppub_builder.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from io import BytesIO, StringIO
  2. from PyPPUB.asset import Asset
  3. from PyPPUB.asset_index import AssetIndex
  4. from PyPPUB.metadata import Metadata
  5. import gzip
  6. class PpubBuilder:
  7. def __init__(self):
  8. self.assets = []
  9. self.metadata = Metadata()
  10. def add_asset(self, path, mimetype, data, flags = None, streamable = False):
  11. self.assets.append(BuilderAsset(path, mimetype, BytesIO(data), flags, streamable))
  12. def add_asset_stream(self, path, mimetype, stream, flags = None, streamable = False):
  13. self.assets.append(BuilderAsset(path, mimetype, stream, flags, streamable))
  14. def write_to_stream(self, stream):
  15. stream.write(b"ppub\n")
  16. data_blob = b""
  17. index = AssetIndex()
  18. assets = [BuilderAsset("metadata", "application/x-ppub-metadata", BytesIO(str(self.metadata).encode('utf-8'))),] + self.assets
  19. for builder_asset in assets:
  20. start_location = len(data_blob)
  21. asset_data = builder_asset.data.read()
  22. if(not builder_asset.streamable):
  23. asset_data_gzip = gzip.compress(asset_data, 9)
  24. if(len(asset_data) > len(asset_data_gzip)):
  25. asset_data = asset_data_gzip
  26. builder_asset.flags.append("gzip")
  27. data_blob += asset_data
  28. end_location = len(data_blob)
  29. asset = Asset(builder_asset.path, builder_asset.mimetype, start_location, end_location, builder_asset.flags)
  30. index.add_asset(asset)
  31. index_data = str(index)
  32. stream.write(str.format("{}\n", len(index_data)).encode('utf-8'))
  33. stream.write(index_data.encode('utf-8'))
  34. stream.write(data_blob)
  35. class BuilderAsset:
  36. def __init__(self, path, mimetype, data, flags = None, streamable = False):
  37. self.path = path
  38. self.mimetype = mimetype
  39. self.data = data
  40. self.flags = flags
  41. self.streamable = streamable
  42. if(self.flags == None):
  43. self.flags = []