diff --git a/core/ziptools.py b/core/ziptools.py
index ad3a88e7..1154e8f7 100644
--- a/core/ziptools.py
+++ b/core/ziptools.py
@@ -104,3 +104,14 @@ class ziptools(object):
dirs.sort()
return dirs
+
+ def zip(self, dir, file):
+ import os
+ zf = zipfile.ZipFile(file, "w", zipfile.ZIP_DEFLATED)
+ abs_src = os.path.abspath(dir)
+ for dirname, subdirs, files in os.walk(dir):
+ for filename in files:
+ absname = os.path.abspath(os.path.join(dirname, filename))
+ arcname = absname[len(abs_src) + 1:]
+ zf.write(absname, arcname)
+ zf.close()
\ No newline at end of file
diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py
index 840b9113..5c98d531 100644
--- a/platformcode/platformtools.py
+++ b/platformcode/platformtools.py
@@ -112,6 +112,12 @@ def dialog_textviewer(heading, text): # disponible a partir de kodi 16
return xbmcgui.Dialog().textviewer(heading, text)
+def dialog_browse(_type, heading, default=""):
+ dialog = xbmcgui.Dialog()
+ d = dialog.browse(_type, heading, 'files')
+ return d
+
+
def itemlist_refresh():
xbmc.executebuiltin("Container.Refresh")
diff --git a/resources/settings.xml b/resources/settings.xml
index e666b25c..fe19a695 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -42,7 +42,9 @@
-
+
+
+
diff --git a/specials/backup.py b/specials/backup.py
new file mode 100644
index 00000000..d42cc42c
--- /dev/null
+++ b/specials/backup.py
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+# ------------------------------------------------------------
+# Backup and restore video library
+# ------------------------------------------------------------
+
+import os, datetime
+
+import xbmc
+
+from core import ziptools, videolibrarytools, filetools
+from platformcode import logger, config, platformtools, xbmc_videolibrary
+from distutils.dir_util import copy_tree
+
+def export_videolibrary(item):
+ logger.info()
+
+ temp_path = xbmc.translatePath("special://userdata/addon_data/plugin.video.kod/temp/")
+ movies_path = os.path.join(temp_path, "movies")
+ tvshows_path = os.path.join(temp_path, "tvshows")
+
+ zip_file_folder = platformtools.dialog_browse(3, config.get_localized_string(80002))
+ if zip_file_folder == "":
+ return
+ zip_file = xbmc.translatePath(zip_file_folder + "KoD_video_library-" + str(datetime.date.today()) + ".zip")
+
+ p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(80003), config.get_localized_string(20000))
+ p_dialog.update(0)
+
+ if filetools.exists(temp_path):
+ filetools.rmdirtree(temp_path)
+ filetools.mkdir(temp_path)
+ p_dialog.update(25)
+ filetools.mkdir(movies_path)
+ copy_tree(videolibrarytools.MOVIES_PATH, movies_path)
+ p_dialog.update(50)
+ filetools.mkdir(tvshows_path)
+ copy_tree(videolibrarytools.TVSHOWS_PATH, tvshows_path)
+ p_dialog.update(75)
+
+ zipper = ziptools.ziptools()
+ zipper.zip(temp_path, zip_file)
+
+ filetools.rmdirtree(temp_path)
+
+ p_dialog.update(100)
+ xbmc.sleep(2000)
+ p_dialog.close()
+ platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(80004), icon=3, time=5000, sound=False)
+
+def import_videolibrary(item):
+ logger.info()
+
+ zip_file = platformtools.dialog_browse(1, config.get_localized_string(80005))
+ if zip_file == "":
+ return
+ if not platformtools.dialog_yesno(config.get_localized_string(20000), config.get_localized_string(80006)):
+ return
+
+ temp_path = xbmc.translatePath("special://userdata/addon_data/plugin.video.kod/temp/")
+
+ p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(80007), config.get_localized_string(20000))
+ p_dialog.update(0)
+
+ if filetools.exists(temp_path):
+ filetools.rmdirtree(temp_path)
+ filetools.mkdir(temp_path)
+
+ unzipper = ziptools.ziptools()
+ unzipper.extract(zip_file, temp_path)
+ p_dialog.update(25)
+
+ filetools.rmdirtree(videolibrarytools.VIDEOLIBRARY_PATH)
+ p_dialog.update(50)
+ if config.is_xbmc() and config.get_setting("videolibrary_kodi") == True:
+ xbmc.sleep(5000)
+ xbmc_videolibrary.clean()
+
+ config.verify_directories_created()
+ if filetools.exists(temp_path + "movies"):
+ copy_tree(temp_path + "movies", videolibrarytools.MOVIES_PATH)
+ p_dialog.update(70)
+ if filetools.exists(temp_path + "tvshows"):
+ copy_tree(temp_path + "tvshows", videolibrarytools.TVSHOWS_PATH)
+ p_dialog.update(90)
+ filetools.rmdirtree(temp_path)
+
+ p_dialog.update(100)
+ xbmc.sleep(2000)
+ p_dialog.close()
+ platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(80008), icon=3, time=5000, sound=False)
+
+ if platformtools.dialog_yesno(config.get_localized_string(20000), config.get_localized_string(80009)):
+ import videolibrary_service
+ videolibrary_service.check_for_update(overwrite=True)
+
+ if config.is_xbmc() and config.get_setting("videolibrary_kodi") == True:
+ xbmc_videolibrary.update()
\ No newline at end of file
diff --git a/specials/setting.py b/specials/setting.py
index 782b582f..5242dd42 100644
--- a/specials/setting.py
+++ b/specials/setting.py
@@ -445,7 +445,7 @@ def submenu_tools(item):
thumbnail=get_thumb("setting_0.png")))
itemlist.append(Item(channel=CHANNELNAME, title=config.get_localized_string(60566) + ":", action="", folder=False,
text_bold=True, thumbnail=get_thumb("videolibrary.png")))
- itemlist.append(Item(channel=CHANNELNAME, action="overwrite_tools", folder=False,
+ itemlist.append(Item(channel=CHANNELNAME, action="restore_tools", folder=False,
thumbnail=get_thumb("videolibrary.png"),
title="- " + config.get_localized_string(60567)))
itemlist.append(Item(channel="videolibrary", action="update_videolibrary", folder=False,
@@ -795,7 +795,7 @@ def channel_status(item, dict_values):
platformtools.dialog_notification(config.get_localized_string(60579), config.get_localized_string(60580))
-def overwrite_tools(item):
+def restore_tools(item):
import videolibrary_service
from core import videolibrarytools
import os