12 Commits

Author SHA1 Message Date
Rob Weber
6a9f65318f updated changelog 2025-12-31 14:21:59 -06:00
Rob Weber
6adceb3060 version bump 2025-12-31 14:16:09 -06:00
Rob Weber
eb52649eb8 fix bug with settings restore #248 2025-12-31 14:10:23 -06:00
Rob Weber
1dcc302ddd part of #247 2025-11-05 15:10:49 -06:00
robweber
1559df4d4c version 1.7.1 2024-08-17 11:03:32 -05:00
Rob Weber
dd2ddb50be updated changelog 2024-06-13 18:07:23 -05:00
robweber
4f00c1d983 change version 2024-04-28 10:43:35 -05:00
robweber
ca7f6e89c7 updated changelog 2024-04-28 10:40:00 -05:00
robweber
7e820c9ad7 part of #230 2024-04-28 10:35:24 -05:00
robweber
324f3a46cf fixes #235 2024-04-28 10:22:31 -05:00
robweber
d1907baf38 updated changelog.md 2024-04-28 10:12:12 -05:00
rjclark99
a32e6f2656 Enhanced self.APP_KEY and self.APP_SECRET grabbing. (#233)
* added function getSettingStringStripped to utils and implemented in authorizers.py dropbox  flow line 47

* added function getSettingStringStripped to utils and implemented in authorizers.py dropbox  flow line 47
2024-04-28 10:09:59 -05:00
7 changed files with 52 additions and 13 deletions

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.xbmcbackup" <addon id="script.xbmcbackup"
name="Backup" version="1.7.0" provider-name="robweber"> name="Backup" version="1.7.2" provider-name="robweber">
<requires> <requires>
<import addon="xbmc.python" version="3.0.0"/> <import addon="xbmc.python" version="3.0.0"/>
<import addon="script.module.dateutil" version="2.8.0" /> <import addon="script.module.dateutil" version="2.8.0" />
@@ -24,12 +24,9 @@
<screenshot>resources/images/screenshot3.jpg</screenshot> <screenshot>resources/images/screenshot3.jpg</screenshot>
<screenshot>resources/images/screenshot4.jpg</screenshot> <screenshot>resources/images/screenshot4.jpg</screenshot>
</assets> </assets>
<news>Version 1.7.0 <news>Version 1.7.2
Can add suffix to backup folder names Fix bug with gui settings restore
translations sync strptime Python bugfix
Minor UI fixes
Fixed Dropbox tokens expiring by using refresh tokens
Always recommend restart after a restore
</news> </news>
<summary lang="ar_SA">إنسخ إحتياطياً قاعده بيانات إكس بى إم سى وملفات اﻹعدادات فى حاله وقوع إنهيار مع إمكانيه اﻹسترجاع</summary> <summary lang="ar_SA">إنسخ إحتياطياً قاعده بيانات إكس بى إم سى وملفات اﻹعدادات فى حاله وقوع إنهيار مع إمكانيه اﻹسترجاع</summary>
<summary lang="bg_BG">Добавката може да създава резервни копия и възстановява базата данни и настройките на Kodi, в случай на срив или повреда на файловете.</summary> <summary lang="bg_BG">Добавката може да създава резервни копия и възстановява базата данни и настройките на Kodi, в случай на срив или повреда на файловете.</summary>

View File

@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
## [Version 1.7.2](https://github.com/robweber/xbmcbackup/compare/matrix-1.7.1...robweber:matrix-1.7.2)
### Fixed
- fixed a bug with the GUI settings restore, the settings key was not identified properly. Thanks @alexhass
- implemented [suggested fix](https://kodi.wiki/view/Python_Problems#datetime.strptime) for strptime Python bug
## [Version 1.7.1](https://github.com/robweber/xbmcbackup/compare/matrix-1.7.0...robweber:matrix-1.7.1)
### Added
- `utils.getSettingStripped` to trim whitespace around setting strings
### Changed
- Dropbox Secret and App Key are trimmed on loading - thanks @rjclark99
- added additional dialog information when gathering files for a Restore. This doesn't fix the speed which these happen since that is related to the platform but does provide more info that it's working.
### Fixed
- issue where Zip file restores were failing due to a missing `is_dir` attribute
## [Version 1.7.0](https://github.com/robweber/xbmcbackup/compare/matrix-1.6.8...robweber:matrix-1.7.0) ## [Version 1.7.0](https://github.com/robweber/xbmcbackup/compare/matrix-1.6.8...robweber:matrix-1.7.0)
### Added ### Added

View File

@@ -629,3 +629,11 @@ msgstr ""
msgctxt "#30161" msgctxt "#30161"
msgid "Amend a string to the end of each backup folder or ZIP file" msgid "Amend a string to the end of each backup folder or ZIP file"
msgstr "" msgstr ""
msgctxt "#30162"
msgid "this could take some time"
msgstr ""
msgctxt "#30163"
msgid "Current folder"
msgstr ""

View File

@@ -2,9 +2,10 @@ import xbmcgui
import xbmcvfs import xbmcvfs
import json import json
import pyqrcode import pyqrcode
import time
import resources.lib.tinyurl as tinyurl import resources.lib.tinyurl as tinyurl
import resources.lib.utils as utils import resources.lib.utils as utils
from datetime import datetime import datetime
# don't die on import error yet, these might not even get used # don't die on import error yet, these might not even get used
try: try:
@@ -13,6 +14,14 @@ try:
except ImportError: except ImportError:
pass pass
# fix for datetime.strptime bug https://kodi.wiki/view/Python_Problems#datetime.strptime
class proxydt(datetime.datetime):
@classmethod
def strptime(cls, date_string, format):
return datetime.datetime(*(time.strptime(date_string, format)[:6]))
datetime.datetime = proxydt
class QRCode(xbmcgui.WindowXMLDialog): class QRCode(xbmcgui.WindowXMLDialog):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -44,8 +53,8 @@ class DropboxAuthorizer:
APP_SECRET = "" APP_SECRET = ""
def __init__(self): def __init__(self):
self.APP_KEY = utils.getSetting('dropbox_key') self.APP_KEY = utils.getSettingStringStripped('dropbox_key')
self.APP_SECRET = utils.getSetting('dropbox_secret') self.APP_SECRET = utils.getSettingStringStripped('dropbox_secret')
def setup(self): def setup(self):
result = True result = True
@@ -145,7 +154,7 @@ class DropboxAuthorizer:
if(token.strip() != ""): if(token.strip() != ""):
result = json.loads(token) result = json.loads(token)
# convert expiration back to a datetime object # convert expiration back to a datetime object
result['expiration'] = datetime.strptime(result['expiration'], "%Y-%m-%d %H:%M:%S.%f") result['expiration'] = datetime.datetime.strptime(result['expiration'], "%Y-%m-%d %H:%M:%S.%f")
token_file.close() token_file.close()

View File

@@ -228,7 +228,7 @@ class XbmcBackup:
# copy just this file from the remote vfs # copy just this file from the remote vfs
self.transferSize = self.remote_vfs.fileSize(self.remote_base_path + self.restore_point) self.transferSize = self.remote_vfs.fileSize(self.remote_base_path + self.restore_point)
zipFile = [] zipFile = []
zipFile.append({'file': self.remote_base_path + self.restore_point, 'size': self.transferSize}) zipFile.append({'file': self.remote_base_path + self.restore_point, 'size': self.transferSize, 'is_dir': False})
# set transfer size # set transfer size
self.transferLeft = self.transferSize self.transferLeft = self.transferSize
@@ -316,6 +316,7 @@ class XbmcBackup:
self.xbmc_vfs.set_root(xbmcvfs.translatePath(aDir['path'])) self.xbmc_vfs.set_root(xbmcvfs.translatePath(aDir['path']))
if(self.remote_vfs.exists(self.remote_vfs.root_path + aDir['name'] + '/')): if(self.remote_vfs.exists(self.remote_vfs.root_path + aDir['name'] + '/')):
# walk the directory # walk the directory
self.progressBar.updateProgress(0, f"{utils.getString(30049)}....{utils.getString(30162)}\n{utils.getString(30163)}: {aDir['name']}")
fileManager.walkTree(self.remote_vfs.root_path + aDir['name'] + '/') fileManager.walkTree(self.remote_vfs.root_path + aDir['name'] + '/')
self.transferSize = self.transferSize + fileManager.fileSize() self.transferSize = self.transferSize + fileManager.fileSize()

View File

@@ -40,7 +40,7 @@ class GuiSettingsManager:
restoreCount = 0 restoreCount = 0
for aSetting in restoreSettings: for aSetting in restoreSettings:
# Ensure key exists before referencing # Ensure key exists before referencing
if(aSetting['id'] in settingsDict.values()): if(aSetting['id'] in settingsDict.keys()):
# only update a setting if its different than the current (action types have no value) # only update a setting if its different than the current (action types have no value)
if(aSetting['type'] != 'action' and settingsDict[aSetting['id']] != aSetting['value']): if(aSetting['type'] != 'action' and settingsDict[aSetting['id']] != aSetting['value']):
if(utils.getSettingBool('verbose_logging')): if(utils.getSettingBool('verbose_logging')):

View File

@@ -30,6 +30,8 @@ def showNotification(message):
def getSetting(name): def getSetting(name):
return __Addon.getSetting(name) return __Addon.getSetting(name)
def getSettingStringStripped(name):
return __Addon.getSettingString(name).strip()
def getSettingBool(name): def getSettingBool(name):
return bool(__Addon.getSettingBool(name)) return bool(__Addon.getSettingBool(name))