MediaFile.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from os import path, getcwd
  2. from uuid import uuid1
  3. from PIL import Image
  4. from pycs.observable import ObservableDict
  5. class MediaFile(ObservableDict):
  6. def __init__(self, obj, parent):
  7. if 'predictionResults' not in obj.keys():
  8. obj['predictionResults'] = {}
  9. super().__init__(obj, parent)
  10. def __get_file(self, identifier):
  11. file_directory = path.join(getcwd(), 'projects', self.parent['id'], 'data')
  12. file_name = identifier + self['extension']
  13. return file_directory, file_name
  14. def get_file(self):
  15. return self.__get_file(self['id'])
  16. def add_result(self, result, origin='user'):
  17. result['id'] = str(uuid1())
  18. result['origin'] = origin
  19. self['predictionResults'][result['id']] = result
  20. def remove_result(self, identifier):
  21. del self['predictionResults'][identifier]
  22. def remove_pipeline_results(self):
  23. remove = list(filter(lambda k: self['predictionResults'][k]['origin'] == 'pipeline', self['predictionResults'].keys()))
  24. for key in remove:
  25. del self['predictionResults'][key]
  26. def update_result(self, identifier, result, origin='user'):
  27. result['id'] = identifier
  28. result['origin'] = origin
  29. self['predictionResults'][identifier] = result
  30. def resize(self, maximum_width):
  31. # check if resized file already exists
  32. resized = MediaFile(self, self.parent)
  33. resized['id'] = self['id'] + '-' + maximum_width
  34. target_directory, target_name = self.__get_file(resized['id'])
  35. target_path = path.join(target_directory, target_name)
  36. if path.exists(target_path):
  37. return resized
  38. # load full size image
  39. current_directory, current_name = self.get_file()
  40. image = Image.open(path.join(current_directory, current_name))
  41. image_width, image_height = image.size
  42. # calculate target height
  43. maximum_width = int(maximum_width)
  44. maximum_height = int(maximum_width * image_height / image_width)
  45. # return self if requested size is larger than the image
  46. if image_width < maximum_width:
  47. return self
  48. # resize image
  49. resized_image = image.resize((maximum_width, maximum_height))
  50. # save to file
  51. resized_image.save(target_path, quality=80)
  52. return resized