ppub_builder.py 1.6 KB

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