Fix memory leak in exporter

This commit is contained in:
JonnyWong16 2020-10-15 21:19:42 -07:00
parent 5a14b5bc35
commit 39d6edd581
No known key found for this signature in database
GPG key ID: B1F1F9807184697A

View file

@ -128,6 +128,9 @@ class Export(object):
self.file_size = 0 self.file_size = 0
self.exported_thumb = False self.exported_thumb = False
self.exported_art = False self.exported_art = False
self._total_items = 0
self._exported_items = 0
self.success = False self.success = False
# Reset export options for m3u8 # Reset export options for m3u8
@ -1660,11 +1663,14 @@ class Export(object):
method = getattr(self.obj, self.export_type) method = getattr(self.obj, self.export_type)
items = method() items = method()
self._total_items = len(items)
logger.info("Tautulli Exporter :: Exporting %d item(s).", self._total_items)
pool = ThreadPool(processes=plexpy.CONFIG.EXPORT_THREADS) pool = ThreadPool(processes=plexpy.CONFIG.EXPORT_THREADS)
items = [ExportObject(self, item) for item in items] items = [ExportObject(self, item) for item in items]
try: try:
result = pool.map(self._export_obj, items) result = pool.map(self._do_export, items)
if self.individual_files: if self.individual_files:
for item, item_result in zip(items, result): for item, item_result in zip(items, result):
@ -1693,9 +1699,10 @@ class Export(object):
pool.join() pool.join()
self.set_export_state() self.set_export_state()
@staticmethod def _do_export(self, item):
def _export_obj(export_obj): result = item._export_obj()
return export_obj.export_obj(export_obj) self._exported_items += 1
return result
def _save_file(self, result, obj=None): def _save_file(self, result, obj=None):
filename = obj.filename filename = obj.filename
@ -1923,32 +1930,10 @@ class Export(object):
return items return items
def export_obj(self, export_obj): def _export_obj(self):
pass pass
def get_any_hdr(self, item, media_type): def export_obj(self, obj):
pass
def get_image(self, item, image):
pass
class ExportObject(Export):
def __init__(self, export, obj):
super(ExportObject, self).__init__()
self.__dict__.update(export.__dict__)
self.obj = obj
self.rating_key = self.obj.ratingKey
self.filename = self._filename(obj=self.obj)
self.title = self._filename(obj=self.obj, extension=False)
def export_obj(self, export_obj):
if isinstance(export_obj, ExportObject):
obj = export_obj.obj
else:
obj = export_obj
# Reload ~plexapi.base.PlexPartialObject # Reload ~plexapi.base.PlexPartialObject
if hasattr(obj, 'isPartialObject') and obj.isPartialObject(): if hasattr(obj, 'isPartialObject') and obj.isPartialObject():
obj = obj.reload() obj = obj.reload()
@ -2018,6 +2003,22 @@ class ExportObject(Export):
return os.path.join(os.path.basename(dirpath), filename) return os.path.join(os.path.basename(dirpath), filename)
class ExportObject(Export):
def __init__(self, export, obj):
super(ExportObject, self).__init__()
self.__dict__.update(export.__dict__)
self.obj = obj
self.rating_key = self.obj.ratingKey
self.filename = self._filename(obj=self.obj)
self.title = self._filename(obj=self.obj, extension=False)
def _export_obj(self):
result = self.export_obj(self.obj)
self.obj = None # Clear the object to prevent memory leak
return result
def get_export(export_id): def get_export(export_id):
db = database.MonitorDatabase() db = database.MonitorDatabase()
result = db.select_single('SELECT timestamp, title, file_format, thumb_level, art_level, ' result = db.select_single('SELECT timestamp, title, file_format, thumb_level, art_level, '