MediaFile.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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, project_id):
  7. if 'predictionResults' not in obj.keys():
  8. obj['predictionResults'] = {}
  9. self.project_id = project_id
  10. super().__init__(obj)
  11. def __get_file(self, identifier):
  12. file_directory = path.join(getcwd(), 'projects', self.project_id, 'data')
  13. file_name = identifier + self['extension']
  14. return file_directory, file_name
  15. def get_file(self):
  16. return self.__get_file(self['id'])
  17. def add_global_result(self, result, origin='user'):
  18. self.remove_global_result()
  19. self.add_result(result, origin)
  20. def remove_global_result(self):
  21. delete = []
  22. for result_id in self['predictionResults']:
  23. if 'x' not in self['predictionResults'][result_id]:
  24. delete.append(result_id)
  25. for result_id in delete:
  26. del self['predictionResults'][result_id]
  27. def add_result(self, result, origin='user'):
  28. result['id'] = str(uuid1())
  29. result['origin'] = origin
  30. self['predictionResults'][result['id']] = result
  31. def remove_result(self, identifier):
  32. del self['predictionResults'][identifier]
  33. def remove_pipeline_results(self):
  34. remove = list(filter(lambda k: self['predictionResults'][k]['origin'] == 'pipeline', self['predictionResults'].keys()))
  35. for key in remove:
  36. del self['predictionResults'][key]
  37. def update_result(self, identifier, result, origin='user'):
  38. result['id'] = identifier
  39. result['origin'] = origin
  40. self['predictionResults'][identifier] = result
  41. def resize(self, maximum_width):
  42. # check if resized file already exists
  43. resized = MediaFile(self.copy(), self.project_id)
  44. resized['id'] = self['id'] + '-' + maximum_width
  45. target_directory, target_name = self.__get_file(resized['id'])
  46. target_path = path.join(target_directory, target_name)
  47. if path.exists(target_path):
  48. return resized
  49. # load full size image
  50. current_directory, current_name = self.get_file()
  51. image = Image.open(path.join(current_directory, current_name))
  52. image_width, image_height = image.size
  53. # calculate target height
  54. maximum_width = int(maximum_width)
  55. maximum_height = int(maximum_width * image_height / image_width)
  56. # return self if requested size is larger than the image
  57. if image_width < maximum_width:
  58. return self
  59. # resize image
  60. resized_image = image.resize((maximum_width, maximum_height))
  61. # save to file
  62. resized_image.save(target_path, quality=80)
  63. return resized