401 Commits

Author SHA1 Message Date
Rob Weber
a9e4e1711b added wiki screenshots 2020-12-03 14:40:59 -06:00
Rob Weber
f9eebf9efa matrix is default branch 2020-12-03 14:07:17 -06:00
Rob Weber
201d04afeb updated version number 2020-11-17 09:54:14 -06:00
Rob Weber
2dabb23c2d Merge branch 'matrix'
# Conflicts:
#	README.md
2020-11-17 09:52:39 -06:00
Rob Weber
2f19ec2b75 added download stats to README.md 2020-06-18 15:37:12 -05:00
Rob Weber
db215873cf updated badge path 2020-06-17 13:51:49 -05:00
Rob Weber
bd963719d4 updated badge path 2020-06-17 13:51:00 -05:00
Rob Weber
18b7f338c7 added attributes file to export-ignore 2020-06-16 15:07:16 -05:00
Rob Weber
92a9245bdc added export ignore items 2020-06-16 15:02:21 -05:00
Rob Weber
568c3758a4 add export-ignore files 2020-06-16 14:54:15 -05:00
robweber
af999f7d04 wrong rep 2020-06-15 20:56:11 -05:00
robweber
1264ab86b2 space 2020-06-15 20:48:15 -05:00
robweber
90c458d4fc updated changelog.md 2020-06-15 20:46:39 -05:00
robweber
0e6f5acfb5 added deploy script using kodi-addon-submitter 2020-06-15 20:44:41 -05:00
Wuff
c9dd381037 Version 1.6.3 - fix validatePath error (issue 166) (#167) 2020-05-20 13:01:43 -05:00
Rob Weber
55b2ac83d4 version bump 2020-04-09 14:37:09 -05:00
Rob Weber
0d14dd17c6 replace png path with jpg #165 2020-04-09 13:53:29 -05:00
Rob Weber
9fa354b467 replace PNG screenshots with JPG #165 2020-04-09 13:50:34 -05:00
Oldřich Jedlička
006485b19e Remove upper-case PNGs (#164)
Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com>
2020-02-11 15:23:52 -06:00
Rob Weber
3c2f512ecf update changelog 2019-12-31 11:03:18 -06:00
Rob Weber
190b4fd86f one more context lib 2019-12-31 11:03:11 -06:00
Rob Weber
9ecf706d63 use contextlib 2019-12-31 10:49:16 -06:00
Rob Weber
05c53b7ed8 localize advanced editor strings 2019-12-31 10:41:15 -06:00
Rob Weber
8bc73f2832 don't need this file 2019-12-31 10:33:13 -06:00
Rob Weber
edc4a7b20f updated to release version v1.6.1 2019-12-30 10:21:01 -06:00
Rob Weber
90b4aeeebe pep8 fixes 2019-12-30 10:17:58 -06:00
Rob Weber
7ce9123e1f updated changelog 2019-12-30 10:14:35 -06:00
Rob Weber
8bfef6692f Merge branch 'master' into matrix 2019-12-30 10:13:23 -06:00
Rob Weber
e63560f0c4 added a clean path function and applied it to rotate backups 2019-12-30 10:09:01 -06:00
Wuff
51f2ef3973 Fix deleting old backups on remote drives + log error (#163) 2019-12-30 09:59:03 -06:00
Rob Weber
04bac77690 moved scheduler to resources/lib and created non-complex entry point 2019-12-17 15:02:07 -06:00
Rob Weber
b1f6d36d73 updated news and version (beta2) 2019-12-10 15:24:56 -06:00
Rob
5d398836ba Show File Transfer Size (#160)
adds file transfer size to progress bar - closes #157
2019-12-10 15:16:54 -06:00
Rob Weber
23a14d67c4 Merge branch '1.6.0_fixes' into matrix 2019-12-06 13:56:06 -06:00
Rob Weber
0eebe1c5cc was using wrong dropbox version 2019-12-06 13:52:38 -06:00
Rob Weber
4d55385179 these files don't exist anymore 2019-12-06 13:33:31 -06:00
Rob Weber
ac68001aa1 labeled Dropbox dep version 2019-12-06 13:31:28 -06:00
Rob Weber
233dff0e15 removed references to dropbox code removal 2019-12-06 13:30:54 -06:00
Rob Weber
6f69f80742 use dropbox library module instead of bundling code 2019-12-06 13:30:00 -06:00
Rob Weber
47fcb119f3 pull build from matrix branch 2019-12-04 11:53:51 -06:00
Rob Weber
f9f49e3fe6 Merge branch 'master' into matrix 2019-12-04 11:53:12 -06:00
Rob Weber
7c23c17e33 Merge branch '1.6.0_fixes' 2019-12-04 11:49:35 -06:00
Rob Weber
710bcd08f8 pep8 fixes 2019-12-04 11:38:25 -06:00
Rob Weber
5e2d099448 fixes per enen92 2019-12-04 11:31:00 -06:00
Rob Weber
8d66fa6a9f part of #159 - this will get rid of the most significant logging and keep the essentials 2019-11-27 14:24:35 -06:00
Rob Weber
5ee610a586 update getSetting calls to get ints and bools where needed 2019-11-27 14:19:41 -06:00
Rob Weber
8c4465f552 add methods for getting bools and int values directly 2019-11-27 14:19:25 -06:00
Rob Weber
3849a902ea working 16.1 beta 2019-11-27 14:05:08 -06:00
Rob Weber
4492ab593e update news 2019-11-27 13:14:42 -06:00
Rob Weber
16e13c7d80 version bump - 1.6.0 2019-11-26 13:14:57 -06:00
Rob Weber
0cc0684263 Use the dropbox module instead of bundling code - module still needs to be updated in Kodi repo 2019-11-26 12:58:35 -06:00
Rob Weber
dd5b99c978 use setArt(), setting icon in constructor is deprecated 2019-11-26 11:31:40 -06:00
Rob Weber
6c99667afa replace relativedelta.py with one from dateutil package 2019-11-26 11:13:25 -06:00
Rob Weber
6514b3db02 added pep8 badge 2019-11-26 11:07:11 -06:00
Rob Weber
88341d9e1f pep8 - round 3 2019-11-26 10:49:17 -06:00
Rob Weber
95649c2b3f pep8 styling round 2 2019-11-26 10:43:38 -06:00
Rob Weber
3e9de429dd ignore bare except error 2019-11-26 10:31:48 -06:00
Rob Weber
db18c6a7b4 pep8 style fixes - round 1 2019-11-25 15:56:59 -06:00
Rob Weber
35e05acaf2 pep8 multi line imports 2019-11-25 15:48:42 -06:00
Rob Weber
92ec8bf25c pep8 commas 2019-11-25 15:45:41 -06:00
Rob Weber
0c79aef4e7 pep8 spaces 2019-11-25 15:33:34 -06:00
Rob Weber
fea7dca500 don't test relativedelta.py 2019-11-25 15:20:36 -06:00
Rob Weber
f7665c8ddd pep8 comments 2019-11-25 15:19:57 -06:00
Rob Weber
bbbfc3dd84 exclude dropbox 2019-11-22 15:21:20 -06:00
Rob Weber
0b03914175 use matrix as target 2019-11-22 15:18:36 -06:00
Rob Weber
51553f7720 pull from the right branch 2019-11-22 15:14:59 -06:00
Rob Weber
294683fb43 updated readme and changelog 2019-11-22 15:14:12 -06:00
Rob Weber
b74c1af704 target is Kodi 19 - matrix 2019-11-22 15:14:05 -06:00
Rob Weber
edd4002d3f fix dropbox import 2019-11-22 15:01:56 -06:00
Rob Weber
3aa912ca4c remove kodi-six, use python3 kodi libs 2019-11-22 14:53:20 -06:00
Rob Weber
5c3e1712f6 need to import local file 2019-11-22 14:53:07 -06:00
Rob Weber
82bdc955b5 marked dropbox specific imports 2019-11-22 14:52:51 -06:00
Rob Weber
4f1e5060e9 updated changelog 2019-10-11 13:17:30 -05:00
Rob Weber
7d895a6028 for python 3 need version 9+ of Dropbox 2019-10-11 13:16:38 -05:00
Rob Weber
7ede17fbbd pointing at wrong branch 2019-10-10 15:32:23 -05:00
Rob Weber
d32620ea18 added flake8 testing for travis-ci 2019-10-10 14:59:13 -05:00
Rob Weber
def99767e8 use leia branch here 2019-10-10 11:38:19 -05:00
Rob Weber
c7a9a8512d Merge branch 'master' into leia
# Conflicts:
#	README.md
2019-10-10 11:37:57 -05:00
Rob Weber
332afffc5b updated badge url 2019-10-10 11:35:42 -05:00
Rob Weber
42d0f1b451 added some shield urls 2019-10-09 14:49:53 -05:00
Rob Weber
8d07310980 updated changelog 2019-09-30 14:37:03 -05:00
Rob Weber
048d016e0e googleDrive removed, use isdigit() on object directly 2019-09-30 14:36:54 -05:00
Rob Weber
c50c5245fc fix dropbox import 2019-09-30 14:36:33 -05:00
Rob Weber
e91037208b Merge branch 'master' into leia 2019-09-30 14:23:19 -05:00
Rob Weber
ff2ca53a22 compare url was wrong 2019-09-30 14:12:17 -05:00
Rob Weber
1a27b279b0 version bump - 1.5.2 2019-09-30 14:09:15 -05:00
Rob Weber
6dfa4a5520 minor code fixes based on travis-ci output 2019-09-30 14:06:50 -05:00
Rob
a7b9aeb9c1 Replace Dropbox files with Kodi Module (#152)
* remove dropbox lib locally and use script.module.dropbox
closes #151
2019-09-30 13:55:40 -05:00
Rob Weber
7226178bfb updated changelog 2019-09-30 09:45:09 -05:00
Rob Weber
f5bd7130e2 don't need this import anymore 2019-09-30 09:45:03 -05:00
Rob Weber
ae76d24e86 use linux path seperator (/), was causing remote file system issues using os.path 2019-09-30 09:44:18 -05:00
Rob Weber
4d56331d8f fix for getting val file from non-zipped remote system 2019-09-30 09:33:06 -05:00
Rob Weber
45cf9a367d don't need this twice 2019-09-20 08:39:21 -05:00
Rob Weber
d8ceecb168 added some dates 2019-09-20 08:37:53 -05:00
Rob Weber
a2d7e8613a updated changelog to keepachangelog format 2019-09-20 08:31:27 -05:00
Rob Weber
c0b0fa82cb somehow screenshots lost 2019-09-11 15:31:04 -05:00
Rob Weber
6ac1d3559b updated build url 2019-09-11 15:29:30 -05:00
Rob Weber
d93589ecad Merge branch 'master' into leia 2019-09-11 10:16:14 -05:00
Rob Weber
b21c11de26 Merge branch 'master' into krypton 2019-09-11 10:05:16 -05:00
Rob Weber
a4bb3f3feb completely changed this class, default no longer matters. Just restore settings that differ from current, ignore default flags closes #154 2019-09-11 10:02:45 -05:00
Rob Weber
1f6324b2d5 use path separators for os 2019-09-11 08:58:21 -05:00
Rob Weber
12b25f7cea version bump 2019-09-10 15:38:34 -05:00
Rob
5d9d8a1820 Guisettings fix (#156)
fix guisettings restore issues - thanks Bluerayx
2019-09-10 15:36:52 -05:00
Rob Weber
2fdf8d37fe Merge branch 'master' into krypton 2019-09-10 15:17:23 -05:00
Rob Weber
aa94060cfe removed Google Drive support - too many python2/3 dependency issues 2019-09-05 14:30:06 -05:00
Rob Weber
b9e0424ea5 dropbox change per https://www.dropboxforum.com/t5/API-Support-Feedback/Upload-Error-with-v2-migration-from-v1/td-p/244561 2019-08-30 15:26:52 -05:00
Rob Weber
495ecb1048 fixes for unicode strs 2019-08-28 15:37:56 -05:00
Rob Weber
a1c0c0bbfe don't need to decode string 2019-08-28 14:54:31 -05:00
Rob Weber
9f570233d9 update get_params to remove urlparse 2019-08-28 14:50:33 -05:00
Rob Weber
b38aff2a8e move pydrive to it's own addon 2019-08-28 14:48:41 -05:00
Rob Weber
456ebe9374 updated Dropbox lib 2019-08-28 14:48:24 -05:00
Rob Weber
30f8b93629 update get_params, remove urlparse dep 2019-08-27 15:04:30 -05:00
Rob Weber
94f872fb81 use future for urllib2 2019-08-27 15:03:43 -05:00
Rob Weber
8f8402ae8a use kodi-six for kodi imports 2019-08-27 15:01:24 -05:00
Rob Weber
db93e40f59 don't need to encode here 2019-08-27 14:56:54 -05:00
Rob Weber
72c77fb33a fixed some imports 2019-08-27 14:55:22 -05:00
Rob Weber
1f0e262c5b leia removed this attribute 2019-08-27 14:47:18 -05:00
Rob Weber
b75487bb2a change Kodi version to Leia 2019-08-27 14:44:17 -05:00
Rob Weber
b34e538d6b probot not adhering to onlyLabels at the moment 2019-08-27 10:41:19 -05:00
Rob Weber
b5a7aada4c added probot to help with stale issues 2019-08-27 09:53:25 -05:00
Rob Weber
1a9c43b998 Merge branch 'master' of https://github.com/robweber/xbmcbackup 2019-08-27 09:42:23 -05:00
Rob Weber
b7f4b14fe2 delmit with comma, not ampersand (xml formatting) 2019-08-27 09:42:07 -05:00
Rob Weber
787b054bba Merge branch 'master' of https://github.com/robweber/xbmcbackup 2019-08-27 09:08:31 -05:00
Rob Weber
a7be48a341 forgot to add screenshots back in 2019-08-27 09:08:05 -05:00
Rob Weber
2fe76b7b52 Merge branch 'master' of https://github.com/robweber/xbmcbackup 2019-08-27 09:06:02 -05:00
Rob Weber
3aed105fd7 lowercase filename ext 2019-08-27 09:05:23 -05:00
Rob Weber
c9b4554eac allow folder/id mistmatch for this addon 2019-08-27 09:02:21 -05:00
Rob Weber
e736b964a5 added build status badge 2019-08-27 09:01:19 -05:00
Rob Weber
4c5f6774df added travis testing script (kodi addon checker) 2019-08-27 08:45:45 -05:00
Rob Weber
1f2e315208 updated screenshots 2019-08-27 08:30:26 -05:00
Rob Weber
138f910d07 updated breaking change dialog (onetime) 2019-08-26 15:43:56 -05:00
Rob Weber
1d3b2f58ab updated version - out of beta 2019-08-26 15:43:44 -05:00
Rob
865416977d Update for Leia (#117)
* updated addon.xml for Krypton

* default log level is always debug now

* added screenshots per krypton format

* started new way of defining backup directories

* reconfigured simple backup process

* added an advanced backup editor and combined settings.xml scripts into a launcher

* added strings for advanced editor

* there was a function to do this

* match excluded with regex

* updated def for the addons set

* directory has to end in slash to use exists()

* added a backup set chooser on restore

* added string for restore browser

* utilize details to show root folder and icons

* save non translated paths, better cross platform support

* revert dropbox python 2.6 changes

* start of #132

* can't have duplicate ids

* updated strings

* closes #132

* added a disclaimer for breaking changes

* split backup and restore into separate functions

* updated scripting to pass in list of sets to restore

* beta version

* added 2 min delay in startup - part of #147

* forgot to remove debug message

* change to wait for abort in case someone tries to close Kodi

* add retroplayer game saves to default file list

* display restore points with most recent on top

* remove length check, breaking change with this version means old archives are no longer compatible

* format restore list according to regional settings

* this function isn't used anymore, legacy of old file manager

* use images folder as default

* added note about compatibility

* added utils function for regional date, use for scheduler notifications as well

* add/remove include and exclude directories to a set

* paths should have / at the end

* show path relative to root

* if in advanced mode allow jumping to editor from launch screen

* check that path is within root folder of set

* cannot have duplicate set names or rules regarding folders within a set

* put strings in correct lang file

* beta version bump

* accidentally deleted string id

* change exclude criteria. Regex was not matching in complex cases

* make sure the dest folder (backup set root) exists before writing to it

* modify select display to show recursive value for included folders

* use a context menu here

* added ability to toggle recursion of sub folders

* beta 3

* added support doc

* wrong branch

* don't need this import anymore

* don't need these imports

* part of #133
2019-08-26 15:40:15 -05:00
Rob Weber
68093b2130 part of #133 2019-08-26 15:36:53 -05:00
Rob Weber
701a1831bf don't need these imports 2019-08-26 15:18:38 -05:00
Rob Weber
493e0d3a2e don't need this import anymore 2019-08-26 15:13:26 -05:00
Rob Weber
d87e209226 Merge branch 'master' into krypton 2019-08-26 14:55:52 -05:00
Rob
d703374792 Update issue templates 2019-08-26 14:46:28 -05:00
Rob Weber
c057f66a1e add support file 2019-08-26 14:06:16 -05:00
Rob Weber
9960e2fc6b wrong branch 2019-08-26 14:05:43 -05:00
Rob Weber
6aae9d9247 added support doc 2019-08-26 14:04:10 -05:00
Rob Weber
004b8dae58 beta 3 2019-08-23 14:43:00 -05:00
Rob Weber
6b934ed30c added ability to toggle recursion of sub folders 2019-08-23 14:30:11 -05:00
Rob Weber
e950400222 use a context menu here 2019-08-23 14:19:49 -05:00
Rob Weber
cb2bb8a237 modify select display to show recursive value for included folders 2019-08-23 14:16:58 -05:00
Rob Weber
eb765c974b make sure the dest folder (backup set root) exists before writing to it 2019-08-23 13:40:40 -05:00
Rob Weber
d18ed2960e change exclude criteria. Regex was not matching in complex cases 2019-08-22 14:42:41 -05:00
Rob Weber
9f1755686c accidentally deleted string id 2019-08-22 13:45:40 -05:00
Rob Weber
534b3b108f beta version bump 2019-08-22 13:30:59 -05:00
Rob Weber
4a8b891129 put strings in correct lang file 2019-08-22 13:30:02 -05:00
Rob Weber
49af21a67e cannot have duplicate set names or rules regarding folders within a set 2019-08-22 13:23:41 -05:00
Rob Weber
3ee2cb0414 check that path is within root folder of set 2019-08-22 13:07:03 -05:00
Rob Weber
061fd3efed if in advanced mode allow jumping to editor from launch screen 2019-08-22 13:01:02 -05:00
Rob Weber
76c2fdc0c2 show path relative to root 2019-08-22 13:00:45 -05:00
Rob Weber
2c999b46b9 paths should have / at the end 2019-08-22 13:00:35 -05:00
Rob Weber
4d891ab551 add/remove include and exclude directories to a set 2019-08-22 12:38:17 -05:00
Rob Weber
6c33e7c9ba added utils function for regional date, use for scheduler notifications as well 2019-08-20 11:50:46 -05:00
Rob Weber
f0d8e297a9 added note about compatibility 2019-08-20 11:37:54 -05:00
Rob Weber
04ec3bd8a8 use images folder as default 2019-08-20 11:32:07 -05:00
Rob Weber
65ea3c98c4 Merge branch 'master' into krypton
# Conflicts:
#	addon.xml
#	icon.png
#	resources/images/icon.png
#	resources/media/icon.png
#	scheduler.py
2019-08-20 11:29:14 -05:00
Rob Weber
ee2f38e865 missed a print statement 2019-08-19 15:34:32 -05:00
Rob Weber
4513eb67f9 fixed error handling for python 2.7+ 2019-08-19 15:23:48 -05:00
Rob Weber
d0b1d6bb34 fix language codes 2019-08-19 14:50:52 -05:00
Rob Weber
34529471a7 use monitor.abortRequested() 2019-08-19 14:26:15 -05:00
Rob Weber
c44d71b8b4 updated path 2019-08-19 14:21:40 -05:00
Rob Weber
bc91dfe2a2 updated croniter to match libraryautoupdate (newest) 2019-08-19 14:20:37 -05:00
Rob Weber
27fbadebda fixed addon.xml per guidlines on wiki 2019-08-19 14:18:17 -05:00
Rob Weber
4108f333e2 this function isn't used anymore, legacy of old file manager 2019-08-19 13:07:40 -05:00
Rob Weber
913090637c format restore list according to regional settings 2019-08-19 13:05:12 -05:00
Rob Weber
7139b920ad remove length check, breaking change with this version means old archives are no longer compatible 2019-08-19 12:48:16 -05:00
Rob Weber
48d07c24a0 display restore points with most recent on top 2019-08-19 11:52:21 -05:00
Rob Weber
90e4b0c1f4 add retroplayer game saves to default file list 2019-08-19 11:41:08 -05:00
Rob Weber
c9415cbf59 change to wait for abort in case someone tries to close Kodi 2019-08-09 10:01:53 -05:00
Rob Weber
32d2fde51c added timeout on startup to allow time to sync 2019-08-09 09:59:57 -05:00
robweber
181654b414 forgot to remove debug message 2019-08-03 10:31:18 -05:00
robweber
71b048418e added 2 min delay in startup - part of #147 2019-08-03 10:29:28 -05:00
Rob Weber
1896a684b0 beta version 2019-07-30 13:51:17 -05:00
Rob Weber
545bd93e8c updated scripting to pass in list of sets to restore 2019-07-30 13:26:55 -05:00
robweber
83a01a48bf split backup and restore into separate functions 2019-07-29 16:58:00 -05:00
Rob Weber
dcc8482d73 added a disclaimer for breaking changes 2019-02-04 13:23:12 -06:00
Rob Weber
85306f9469 closes #132 2019-02-04 11:57:36 -06:00
Rob Weber
c0d3b01ade updated strings 2019-02-04 11:57:17 -06:00
Rob Weber
5c6a8ce91a can't have duplicate ids 2019-02-04 11:40:42 -06:00
Rob Weber
c8f148cd1a Merge branch 'master' into krypton 2019-02-04 11:33:35 -06:00
Rob Weber
2e7080fef8 add no media file, part of #135 2018-02-12 08:46:54 -06:00
Rob Weber
e148bd4894 part of #134 2018-01-23 08:25:58 -06:00
Rob Weber
b6e57b04b1 start of #132 2018-01-23 08:17:02 -06:00
Rob Weber
8ac5da3b66 version bump 2017-12-29 13:27:17 -06:00
Rob Weber
adbf225ea2 revert dropbox python 2.6 changes 2017-12-29 13:25:40 -06:00
Rob Weber
d9d6c1ed42 Merge branch 'master' into krypton 2017-12-29 13:24:45 -06:00
Rob
55d6ca7464 Dropbox sessions (#130)
added file chunk support for files > 50MB, closes #129
2017-12-29 13:22:49 -06:00
Rob Weber
9490f7565c missed log statement in testing 2017-12-27 10:06:07 -06:00
Rob Weber
6a8573a0c8 version bump, closes #126 2017-12-27 09:57:47 -06:00
Rob
4b8b847544 Dropbox 2.6 fixes (#127)
Dropbox lib fixes for python 2.6
2017-12-27 09:55:20 -06:00
Rob Weber
f5f7bcfcb5 save non translated paths, better cross platform support 2017-12-08 11:36:51 -06:00
Rob Weber
4608f04d96 utilize details to show root folder and icons 2017-12-08 11:16:59 -06:00
Rob Weber
e1c8b5a61c Merge branch 'master' into krypton 2017-12-08 10:53:38 -06:00
Rob Weber
e02245e422 dirs can't end in slash for dropbox "exists" method part of #114 2017-12-08 08:46:12 -06:00
Rob Weber
ada1efb165 Merge branch 'master' into krypton 2017-12-07 08:34:37 -06:00
Rob Weber
588132c8dc nr should initialize before if statement, fixes #124 2017-12-07 08:28:10 -06:00
Rob Weber
5a43b5e340 added string for restore browser 2017-12-06 09:26:39 -06:00
Rob Weber
33bc84c288 added a backup set chooser on restore 2017-12-06 09:23:32 -06:00
Rob Weber
8c61616d3c directory has to end in slash to use exists() 2017-12-06 09:22:27 -06:00
Rob Weber
622939901e updated def for the addons set 2017-12-06 09:11:01 -06:00
Rob Weber
756f50bba1 match excluded with regex 2017-12-05 15:40:09 -06:00
Rob Weber
5fefbd286d there was a function to do this 2017-12-05 15:05:14 -06:00
Rob Weber
5779784e0a added strings for advanced editor 2017-12-05 15:04:20 -06:00
Rob Weber
24f570e888 added an advanced backup editor and combined settings.xml scripts into a launcher 2017-12-05 14:20:32 -06:00
Rob Weber
489dcd317f reconfigured simple backup process 2017-12-05 09:35:43 -06:00
Rob Weber
216e2f4561 Merge branch 'master' into krypton 2017-12-04 15:36:55 -06:00
Rob Weber
f31c2f7b4d imports missed during dropbox merge 2017-12-04 15:30:07 -06:00
Rob Weber
c3fe86293d Merge branch 'master' into krypton 2017-12-04 15:16:41 -06:00
robweber
92f84b07db language folder country code fix 2017-12-03 17:40:11 -06:00
Rob
af1ae52e69 Merge Dropbox V2 (#123)
* pulled all dropbox v1 code, added v2. fixed authorization flow
2017-12-03 17:32:21 -06:00
Rob Weber
87b1a832c5 updated for google oauth and googleapi version bumps 2017-11-22 15:38:06 -06:00
Rob Weber
20ee7a92ad started new way of defining backup directories 2017-11-08 15:57:44 -06:00
Rob Weber
64daaa13e8 Merge branch 'master' into krypton 2017-11-08 13:50:17 -06:00
Rob Weber
009d67d65b updated oauth2client version 2017-11-08 13:49:45 -06:00
Rob Weber
dda08d04a3 added screenshots per krypton format 2017-11-08 13:47:46 -06:00
Rob Weber
469b5ff340 default log level is always debug now 2017-11-08 13:32:07 -06:00
Rob Weber
ff2f764b2f Merge branch 'master' into krypton 2017-11-08 13:30:39 -06:00
Rob Weber
30ddff0bf2 updated README.md with links to wiki 2017-11-08 13:02:53 -06:00
Rob Weber
ec0c52ee6e converted to po files. closes #104 2017-11-08 08:54:30 -06:00
Rob Weber
4647bdec14 updated changelog.txt 2017-11-08 08:34:41 -06:00
Rob Weber
fc2c4b341a indent error - always returned false 2017-11-07 15:19:46 -06:00
Rob
71e8e44e27 Merge pull request #116 from robweber/miss_scheduled
Miss scheduled
2017-11-07 15:11:23 -06:00
Rob Weber
2af3070528 allow user to turn on/off 2017-11-07 15:10:21 -06:00
Rob Weber
7e01f51e86 use xbmcvfs for file reads/writes 2017-11-07 15:03:50 -06:00
Rob Weber
af93f1916b copy/paste from the original pull request 2017-11-07 14:35:36 -06:00
Rob Weber
4689ce9b82 closes #113 2017-11-07 14:23:23 -06:00
Rob Weber
db4b404a88 part of #110 2017-11-07 14:19:27 -06:00
Rob Weber
2927e31c59 updated FAQ in README.md 2017-04-06 12:50:18 -05:00
Rob Weber
7d51ee05bc updated addon.xml for Krypton 2017-02-16 15:11:22 -06:00
Rob Weber
2c634f9250 exclude packages dir by default, not needed closes #102 2017-02-10 15:19:22 -06:00
Rob Weber
3fcc15ebe5 updated changelog.txt 2017-01-31 15:02:39 -06:00
Rob Weber
94f0887393 fixes #99 2017-01-31 15:02:03 -06:00
Rob Weber
87c638a0d6 updated README.md 2017-01-31 09:33:16 -06:00
Rob Weber
fcafc77180 debug is default anyway 2017-01-31 09:15:48 -06:00
Rob Weber
72e9950af7 updated changelog.txt 2017-01-31 09:13:55 -06:00
Rob Weber
c46f684ea5 change this as settings are saved until close, call specific type with arg 2017-01-31 09:07:49 -06:00
Rob Weber
b1d16df817 put all strings in strings.xml 2017-01-31 08:16:54 -06:00
Rob Weber
49f6ae5270 moved cloud creation code to an authorizer class
added authorize as part of settings
2017-01-31 08:08:00 -06:00
Rob Weber
2e7552896a split general and remote directory areas 2017-01-30 12:59:03 -06:00
Rob
d3ed0bc63c Merge pull request #98 from robweber/tinyurl
Use TinyURL for OAuth
2017-01-30 12:54:57 -06:00
Rob Weber
8edaae803b use tinyurl for oauth urls 2017-01-30 12:51:50 -06:00
Rob Weber
d846cffd80 add tinyurl library and 2017-01-30 12:51:36 -06:00
Rob
439c8aae28 Merge pull request #97 from robweber/settings_utf_error
Encode Settings with UTF
2017-01-30 09:22:29 -06:00
Rob Weber
ca454d5eee version bump 2017-01-23 11:45:34 -06:00
Rob
17aeb98bf2 Merge pull request #96 from robweber/dropbox_2.6
Koying's patch for #94
2017-01-23 11:44:02 -06:00
Rob Weber
8a6518fd2d encode setting value as utf string 2017-01-23 11:34:35 -06:00
Rob Weber
b7c24896c9 trying koying's patch for #94 2017-01-23 09:57:01 -06:00
Rob
405783cde0 Update readme (#93)
convert readme to md type of file
2017-01-20 09:25:52 -06:00
Rob Weber
9f949e6320 restrict to jarvis and above 2017-01-13 11:36:42 -06:00
Rob Weber
cff2ea86b7 fixes #90 2017-01-13 11:28:48 -06:00
Rob Weber
e162ff3c19 version bump 2017-01-05 10:39:02 -06:00
Rob Weber
622039febb updated dropbox v1 api 2017-01-05 10:37:41 -06:00
Rob Weber
d0028d440c wonder how long this has been there, fixes #82 2017-01-05 09:10:11 -06:00
Rob Weber
210a907f8a updated google client version 2015-11-16 09:26:48 -06:00
Rob Weber
0926c5d3a1 version bump 2015-06-26 15:33:20 -05:00
Rob Weber
3e38f992b5 added extractor progress bar and additional progress info 2015-06-26 15:32:22 -05:00
Rob Weber
032a772a81 try tor emove error in pydrive 2015-06-26 14:46:18 -05:00
Rob Weber
97a977c721 minor fixes 2015-06-19 14:30:45 -05:00
Rob Weber
9add0b2981 Merge branch 'pydrive_fix' 2015-06-19 13:44:37 -05:00
Rob Weber
7ed70ca9cb delete the validation file after it was copied 2015-06-19 12:49:28 -05:00
Rob Weber
2a5accfed1 attempted fix for wrong args error 2015-05-26 08:43:21 -05:00
Rob Weber
faccf424b7 updated changelog.txt 2015-05-08 19:47:22 -05:00
robweber
2ad895626a Merge pull request #72 from brokeh/master
Fix duplicate files in zip backups
2015-05-08 19:45:59 -05:00
Rob Weber
98a369db6f closes #71 2015-05-08 19:40:28 -05:00
Rob Weber
09b6010738 added google drive support 2015-05-08 19:26:52 -05:00
Andrew Brock
6786a233e0 Fix zip files getting an extra copy of each file on each run of the scheduler 2015-05-06 21:36:50 +10:00
robweber
7d2c8c54c6 Merge pull request #67 from robweber/helix_google_drive
Helix google drive
2015-04-27 15:31:30 -05:00
Rob Weber
7448b6fea1 use most current versions of these 2015-04-27 15:30:11 -05:00
Rob Weber
99e19b8fd5 use this more restrictive scope 2015-04-27 15:21:12 -05:00
Rob Weber
1d7ca0afcf these appear to do nothing, deps are needed 2015-04-24 10:01:30 -05:00
Rob Weber
1eb84c6ecf added google drive string back in 2015-04-24 09:29:26 -05:00
Rob Weber
f0cce73851 Merge branch 'master' into helix_google_drive
Conflicts:
	resources/language/English/strings.xml
2015-04-24 09:28:05 -05:00
Rob Weber
776c3872ae version bump 2015-04-24 09:24:03 -05:00
Rob Weber
02e3a73623 make compression setting compatible with python 2.6 and above 2015-04-24 09:23:56 -05:00
Rob Weber
eaf5f12245 version bump 2015-03-26 10:44:36 -05:00
Rob Weber
49f6b176e8 exit if we can't delete the old archive 2015-03-26 10:38:51 -05:00
Rob Weber
5050af931c updated readme 2015-02-13 09:50:16 -06:00
Rob Weber
5c40b0edc4 mixed up string ids 2015-02-13 09:50:07 -06:00
Rob Weber
044cdc4bdc added google drive to removal list 2015-02-13 09:44:50 -06:00
Rob Weber
9d7076da0c Merge branch 'master' into helix_google_drive
Conflicts:
	addon.xml
	resources/language/English/strings.xml
	resources/settings.xml
2015-02-13 09:42:26 -06:00
Rob Weber
d62f829421 version bump 2015-02-13 09:33:23 -06:00
Rob Weber
6de7ccaddf closes #63 2015-02-13 09:28:55 -06:00
Rob Weber
65d10e22d9 fixed xbmc.python import 2015-01-06 15:28:50 -06:00
Rob Weber
f887df0197 folder should be Kodi Backup 2014-11-21 14:17:48 -06:00
Rob Weber
e395c60293 removed xbmc reference 2014-11-21 13:48:11 -06:00
Rob Weber
16f4d4073a weird space we don't need 2014-11-21 13:42:39 -06:00
Rob Weber
fec65afc8f Merge branch 'google_drive' into helix_google_drive
Conflicts:
	resources/lib/backup.py
2014-11-21 13:42:12 -06:00
Rob Weber
ee5dfed50b changed helix version number 2014-11-21 13:30:53 -06:00
Rob Weber
7730c727e5 fixed type in dropbox rmfile 2014-11-21 13:30:22 -06:00
Rob Weber
d9e31e32ad reworked strings again, insert "mode" into gui 2014-11-21 13:25:19 -06:00
Rob Weber
138047bd32 Kodi requires slash on directory "exists" 2014-11-21 10:44:53 -06:00
Rob Weber
2ac05ab042 make this text more specific 2014-11-21 10:44:42 -06:00
Rob Weber
b91591ec05 changed XBMC to Kodi references 2014-11-21 10:38:44 -06:00
Rob Weber
e803573340 dropbox unicode error 2014-11-10 12:40:29 -06:00
Rob Weber
687e830bcd version bump 2014-11-10 12:34:30 -06:00
Rob Weber
c578fe15d8 create a .restored version of guisettings 2014-11-10 12:33:55 -06:00
Rob Weber
d68679f534 updated dependencies 2014-11-05 09:48:59 -06:00
Rob Weber
744ba77251 updated for new file write checks 2014-11-05 08:47:47 -06:00
Rob Weber
fae5a052c7 string id changed 2014-11-05 08:47:30 -06:00
Rob Weber
8473542aaf Merge branch 'master' into google_drive
Conflicts:
	resources/language/English/strings.xml
	resources/lib/backup.py
2014-11-05 08:40:07 -06:00
robweber
72b2abfe8d Merge pull request #58 from robweber/gui_settings
Add limited system settings restore
2014-10-31 11:48:09 -05:00
Rob Weber
d6d7221551 updated readme,changelog and version info 2014-10-31 11:47:14 -05:00
Rob Weber
0b6a3ae506 restore xbmc allowed settings via json 2014-10-31 11:40:47 -05:00
Rob Weber
2fc26b6e8c show notification if files failed to copy 2014-10-31 09:56:02 -05:00
Rob Weber
f41f37782d version bump 2014-10-31 09:51:44 -05:00
Rob Weber
9e5873fcb7 check if destination is writeable 2014-10-31 09:50:37 -05:00
robweber
b0ecaa8416 Merge pull request #57 from robweber/master
Update from Master
2014-10-24 15:27:27 -05:00
Rob Weber
d335634618 openelec instructions invalid 2014-10-23 09:45:38 -05:00
Rob Weber
355135853b version bump 2014-10-23 09:42:35 -05:00
Rob Weber
f8c00b473f added userdata/library to config path 2014-10-23 09:41:10 -05:00
Rob Weber
cdf67dbd0c spelling 2014-10-13 14:35:21 -05:00
Rob Weber
69afda758b updated readme for google drive 2014-10-13 14:33:47 -05:00
Rob Weber
64ae75252f some spacing 2014-10-10 08:50:29 -05:00
Rob Weber
9246c9b586 vfs should return encoded dirs/files 2014-10-10 08:49:21 -05:00
Rob Weber
e90c8e7803 slight changes so mkdir works 2014-10-09 15:19:24 -05:00
Rob Weber
cf40edad79 use 'xbmc backup' as root directory 2014-10-09 14:42:59 -05:00
Rob Weber
e316e82013 create google file system 2014-10-09 14:40:05 -05:00
Rob Weber
9c73b5b0b8 added google drive to settings 2014-10-09 14:34:33 -05:00
Rob Weber
06fbef26db depends on googleapi 2014-10-09 14:34:26 -05:00
Rob Weber
74cb8c2b28 added google drive vfs 2014-10-09 14:30:39 -05:00
Rob Weber
c36df5ade9 pydrive license 2014-10-09 11:32:15 -05:00
Rob Weber
0df7364bea added pydrive files 2014-10-09 11:31:38 -05:00
Rob Weber
b593a55120 update to ignore file 2014-10-09 11:31:26 -05:00
Rob Weber
3e32882afc shouldn't always be logging this 2014-10-08 15:08:35 -05:00
Rob Weber
4d109d138f version bump 2014-10-08 13:02:39 -05:00
Rob Weber
08be62b4ec typo 2014-10-08 13:01:44 -05:00
Rob Weber
7bab6a9ada version bump 2014-10-07 11:22:12 -05:00
Rob Weber
f0a6b3351a missed a translate path 2014-10-07 11:21:47 -05:00
Rob Weber
64d788e9f7 add full path since it will be trimmed later 2014-10-06 15:55:57 -05:00
Rob Weber
62104184de changelog update 2014-10-05 14:20:29 -05:00
Rob Weber
91af11c9f7 need to expand out home path 2014-10-05 14:20:23 -05:00
Rob Weber
d9ff17eeec version bump 2014-10-05 14:06:40 -05:00
Rob Weber
53ddc92325 use zip64 2014-10-05 14:06:32 -05:00
Rob Weber
250a5021e0 closes #55 2014-08-08 10:39:03 -05:00
Rob Weber
eb2f5dce74 use "special://" as root and translate before writes 2014-08-08 10:37:16 -05:00
Rob Weber
b14fda20fb write the file based on the true source xbmcvfs.File 2014-08-08 10:26:39 -05:00
Rob Weber
38cc67a54d don't need to encode file path, just the name 2014-08-04 20:14:49 -05:00
Rob Weber
d69a1b2d27 delete old file, if it exists 2014-08-04 19:58:56 -05:00
Rob Weber
d7a0e622be try and encode filenames before writing to zip 2014-08-04 15:40:14 -05:00
Rob Weber
a1c91ef51c updated strings for zip notifications 2014-08-01 14:36:10 -05:00
Rob Weber
45b6cea057 best test we can do for zip file without looking in them 2014-08-01 14:32:29 -05:00
robweber
80f4e6bdfb Merge pull request #54 from robweber/zip_files
Zip files
2014-08-01 14:25:33 -05:00
Rob Weber
f249ea1583 cosmetics 2014-08-01 14:15:27 -05:00
Rob Weber
9945dc628e don't write to filesystem, use addFile 2014-08-01 14:14:40 -05:00
Rob Weber
24e1311db5 version bump 2014-08-01 14:09:37 -05:00
Rob Weber
49783f712a updated readme 2014-08-01 14:06:55 -05:00
Rob Weber
1255283f4d should clean up zip resources after extract 2014-08-01 14:03:03 -05:00
Rob Weber
b3bbdd6911 need to reset vfs to default root dirs before copying zip 2014-08-01 13:54:22 -05:00
Rob Weber
5dfa9d9b76 old logging and misssed name 2014-08-01 13:14:47 -05:00
Rob Weber
545843e949 need to treat backup zips as files 2014-08-01 13:12:43 -05:00
Rob Weber
647bd8811b don't need these checks anymore 2014-08-01 13:06:35 -05:00
Rob Weber
e6215dde51 read/write zip to temp directory 2014-08-01 13:05:58 -05:00
Rob Weber
9a89066e66 can restore full file tree 2014-08-01 12:57:55 -05:00
Rob Weber
c28f9fd26b will copy zip file from remote to dest 2014-08-01 12:37:57 -05:00
Rob Weber
933fdbdf09 copy zip file and open in write mode 2014-07-31 17:29:59 -05:00
Rob Weber
c49aebeba1 list zip files for restore 2014-07-31 16:02:53 -05:00
Rob Weber
525dd8ff86 delete temp zip file when done 2014-07-31 15:20:22 -05:00
Rob Weber
19fcb8bd46 created zip vfs, will create and copy directories to remote share 2014-07-30 15:16:58 -05:00
Rob Weber
24385a2c68 don't write to remote directly, use file manager 2014-07-30 13:41:54 -05:00
Rob Weber
6dc23de55b updated language files 2014-07-29 09:11:37 -05:00
Rob Weber
eeb25a4c58 version bump 2014-07-29 08:45:13 -05:00
Rob Weber
2365649f86 fixes #53 2014-07-29 08:43:34 -05:00
Rob Weber
097238cf7b version bump 2014-06-24 11:39:15 -05:00
robweber
dd3a50027e Merge pull request #52 from robweber/dropbox_fix
Fix for dropbox file recursion errors
2014-06-24 11:38:14 -05:00
robweberjr@gmail.com
ee435a90ef attempted fix for Dropbox file recursion 2014-06-03 13:34:02 -05:00
robweberjr@gmail.com
23b70af3dc closes #51 2014-05-06 13:44:00 -05:00
Rob Weber
a439863c05 bump xbmc python version 2014-04-05 10:10:38 -05:00
robweberjr@gmail.com
6f34d39822 updated progress bar display - needed new class 2014-03-31 13:16:11 -05:00
robweberjr@gmail.com
e025b3213c Merge branch 'gotham-dev'
Conflicts:
	addon.xml
	changelog.txt
	resources/language/Bulgarian/strings.xml
2014-03-31 12:45:28 -05:00
robweberjr@gmail.com
9f794549c2 fixed backup rotation error - fix from Gotham branch 2014-03-31 12:40:00 -05:00
robweberjr@gmail.com
290446c3a8 fixed error in backup rotation 2014-03-31 12:37:11 -05:00
robweberjr@gmail.com
35c1717699 Version bump and README.txt 2014-03-31 12:05:44 -05:00
robweber
3a25c1c4eb Merge pull request #48 from robweber/scripting_updates
Scripting Updates
2014-03-31 11:58:34 -05:00
robweberjr@gmail.com
37fb30d7ab allow sending of "archive" parameter for restores 2014-03-31 11:54:11 -05:00
robweberjr@gmail.com
a09677930f removed redundant log message 2014-03-31 09:14:28 -05:00
robweberjr@gmail.com
ed696a5c4f Merge branch 'gotham-dev' of https://github.com/robweber/xbmcbackup into gotham-dev 2014-03-26 12:03:18 -05:00
robweber
6f4de551dc Merge pull request #45 from NEOhidra/master
updated Bulgarian translation
2014-03-26 11:59:18 -05:00
robweber
6ad083ced8 Merge pull request #46 from NEOhidra/gotham-dev
updated Bulgarian translation
2014-03-26 11:59:11 -05:00
Rob Weber
eecdf4277c updated gitignore 2014-03-23 17:10:53 -05:00
NEOhidra
450687ba5d updated Bulgarian translation 2014-03-23 10:28:32 +02:00
NEOhidra
a217960576 updated Bulgarian translation 2014-03-23 09:52:41 +02:00
robweberjr@gmail.com
7f42129606 added home window properties 2014-03-18 13:48:53 -05:00
robweberjr@gmail.com
4312625003 updated README.txt 2014-03-17 13:11:49 -05:00
Rob Weber
2bec306892 Merge branch 'master' into gotham-dev
Conflicts:
	addon.xml
	changelog.txt
2014-02-09 14:09:57 -06:00
Rob Weber
542bc692d9 bump xbmc python version 2014-02-09 14:03:51 -06:00
Rob Weber
70ced05cd5 version bump 2014-02-09 14:02:04 -06:00
Rob Weber
405bbc08b5 added hour and minute to backup folder names 2014-02-09 13:56:25 -06:00
Rob Weber
775a5aeda2 Merge branch 'master' into gotham-dev
Conflicts:
	addon.xml
	changelog.txt
	resources/lib/utils.py
2014-01-23 12:53:30 -06:00
Rob Weber
e185ddf131 attempted fix for unicode errors on logging 2014-01-23 12:47:21 -06:00
Rob Weber
aec7d19b00 changelog update 2014-01-20 13:05:09 -06:00
Rob Weber
b0b611b5c9 added version info to logs 2014-01-20 13:04:50 -06:00
Rob Weber
884633073a version bump 2014-01-20 13:04:03 -06:00
Rob Weber
4fcd40c745 added version info to logs 2014-01-20 13:02:29 -06:00
Rob Weber
77dbd69ce2 version bump, closes #36 2014-01-20 12:53:27 -06:00
Rob Weber
e3be458a28 use xbmcgui.notification() part of #36 2014-01-20 12:48:23 -06:00
Rob Weber
987d90de12 added options for background progress bar. part of #36 2014-01-20 12:42:49 -06:00
Rob Weber
163124089b version increment for Gotham 2014-01-20 11:40:00 -06:00
90 changed files with 32 additions and 6264 deletions

32
README.md Normal file
View File

@@ -0,0 +1,32 @@
# Backup Addon
### __This is not the default branch - go to the [Matrix branch](https://github.com/robweber/xbmcbackup/tree/matrix) for the current supported version__
## About
I've had to recover my database, thumbnails, and source configuration enough times that I just wanted a quick easy way to back them up. That is what this addon is meant to do.
## Running the Program
Running the program will allow you to select Backup or Restore as a running mode. Selecting Backup will push files to your remote store using the addon settings you defined. Selecting Restore will give you a list of restore points currently in your remote destination. Selecting one will pull the files matching your selection criteria from the restore point to your local Kodi folders.
For more specific information please check out the [wiki on Github](https://github.com/robweber/xbmcbackup/wiki) for this project. Advanced descriptions for the following are all there:
* [Configuration](https://github.com/robweber/xbmcbackup/wiki/Configuration)
* [Cloud Storage](https://github.com/robweber/xbmcbackup/wiki/Cloud-Storage)
* [Scheduling](https://github.com/robweber/xbmcbackup/wiki/Scheduling)
* [Scripting](https://github.com/robweber/xbmcbackup/wiki/Scripting)
* [FAQ](https://github.com/robweber/xbmcbackup/wiki/FAQ)
## Attributions
Icon files from Open Iconic — www.useiconic.com/open

View File

@@ -1,65 +0,0 @@
XBMC Backup
About:
I've had to recover my database, thumbnails, and source configuration enough times that I just wanted a quick easy way to back them up. That is what this addon is meant to do.
Remote Destination/File Selection:
In the addon settings you can define a remote path for the destination of your xbmc files. Each backup will create a folder named in a YYYYMMDD format so you can create multiple backups. You can keep a set number of backups by setting the integer value of the Backups to Keep setting greater than 0.
On the Backup Selection page you can select which items from your user profile folder will be sent to the backup location. By default all are turned on except the Addon Data directory.
You can also define non-XBMC directories on your device. See "Custom Directories" for more information on how these are handled.
Scheduling:
You can schedule backups to be completed on a set interval via the scheduling area. When it is time for the backup to run it will be executed in the background.
When using the "Shutdown" function this will call XBMC's Shutdown method as defined in System Settings -> Power Saving -> Shutdown Function. This can be simply exiting xbmc, hibernating, or shutting down your htpc.
Running the Program:
Running the program will allow you to select Backup or Restore as a running mode. Selecting Backup will push files to your remote store using the addon settings you defined. Selecting Restore will give you a list of restore points currently in your remote destination. Selecting one will pull the files matching your selection criteria from the restore point to your local XBMC folders.
Custom Directories:
You can define custom directories that are not a part of your XBMC folder structure for backup. These create a custom_hash folder in your backup destination. The hash for these folders is very important. During a restore if the hash of the file path in Custom 1 does not match the hash in the restore folder it will not move the files. This is to prevent files from being restored to the wrong location in the event you change file paths in the addon settings. A dialog box will let you know if file paths do not match up.
Up to 2 Custom directories can be specified.
Using Dropbox:
Using Dropbox as a storage target adds a few steps the first time you wish to run a backup. First you will need to sign-up for you own developer app key and secret by visiting https://www.dropbox.com/developers. Name your app whatevery you want, and make it an "App Folder" type application. Your app can run in developer mode and you should never need to apply for production status. This is to get around Dropbox's rule not allow distribution of production key/secret pairs.
Once you have your app key and secret add them to the settings. XBMC Backup now needs to have permission to access your Dropbox account. When you see the prompt regarding the Dropbox URL Authorization DO NOT click OK. Check your XBMC log file for a line from "script.xbmcbackup" containing the authorization URL. Cut/paste this into a browser and click Allow. Once this is done you can click "OK" in XBMC and proceed as normal. XBMC Backup will cache the authorization code so you only have to do this once, or if you revoke the Dropbox permissions.
Scripting XBMC Backup:
If you wish to script this addon using an outside scheduler or script it can be given parameters via the Xbmc.RunScript() or JsonRPC.Addons.ExecuteAddon() methods. Parameters given are either "backup" or "restore" to launch the correct program mode. An example would be:
RunScript(script.xbmcbackup,backup)
FAQ:
I can't see any restore points when choosing "Restore", what is the problem?
If you've created restore points with an older version of the addon (pre 0.3.6) you may see this issue. New versions of the addon look for a file called xbmcbackup.val to validate that a folder is a valid restore archive. Your older restore folders may not have this file. All you need to do is create a blank text file and rename it to xbmcbackup.val. Then put this file inside the archive directory. Your restore points should show up after selecting "Restore" in the addon again.
Several settings aren't being restored, this includes views, weather, etc. How do I get these back?
GUISETTINGS.xml is a configuration file used heavily by XBMC for remembering GUI specific settings. Due to the fact that XBMC reads this file on startup, and writes from memory to this file on shutdown; it is not possible to restore this file while XBMC is running. You must manually move this file from your backup archives if you wish to restore it. User SouthMark has posted the following steps for restoring in the OpenELEC system where this is more difficult:
1. Run the restore of your backup
2. SSH using putty to the IP Address of your media centre username: root Password openelec
3. Type touch /var/lock/xbmc.disabled and then press enter
4. Type kill all -9 xbmc.bin and then press enter - Your media center machine should now go blank
5. Connect to your machine using WinSCP and copy the guisettings.xml file to the userdata folder (this is the guisettings.xml file from your backup)
6. go back to your putty window and type rm /var/lock/xbmc.disabled
Why is the Addon prompting me to restart XBMC to continue?
If you have an advancedsettings file in your restore folder the addon will ask you if you want to restore this file and restart xbmc to continue. This is because the advancedsettings file may contain path substitution information that you want to be loaded when doing the rest of your restore. By restoring this file and restarting xbmc it will be loaded and the rest of your files will go where they are supposed to. If you know your file does not contain any path substitutions you can select "no" and continue as normal.

View File

@@ -1,67 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.xbmcbackup"
name="XBMC Backup" version="0.4.4" provider-name="robweber">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
</requires>
<extension point="xbmc.python.script" library="default.py">
<provides>executable</provides>
</extension>
<extension point="xbmc.service" library="scheduler.py" start="startup" />
<extension point="xbmc.addon.metadata">
<summary lang="ar">قم بنسخ احتياطي و استعد قاعدة بيانات XBMC الخاص بك و ملفات التكوين في حال وقوع حادث أو تلف الملفات.</summary>
<summary lang="be">Backup and restore your XBMC database and configuration files in the event of a crash or file corruption.</summary>
<summary lang="ca">Copiau i restaurau la vostra base de dades d'XBMC i els fitxers de configuració en cas de caiguda o corrupció de fitxers.</summary>
<summary lang="da">Sikkerhedskopiér og genskab din XBMC database og konfigurationsfiler i tilfælde af et nedbrud eller en ødelagt fil.</summary>
<summary lang="de">Die XBMC Datenbank sichern und bei Dateiverlust oder Beschädigung wiederherstellen.</summary>
<summary lang="el">Δημιουργήστε αντίγραφα ασφαλείας της βάσης δεδομένων και των ρυθμίσεων του XBMC για την πιθανότητα σφαλμάτων ή καταστροφής αρχείων.</summary>
<summary lang="en">Backup and restore your XBMC database and configuration files in the event of a crash or file corruption.</summary>
<summary lang="es">Haz copia de seguridad de tu base de datos y configuración y recupera todo en caso de fallo.</summary>
<summary lang="es_MX">Respalda y restaura tu base de datos y archivos de configuración de XBMC dado el evento de un cuelgue o corrupción de archivos. </summary>
<summary lang="eu">XBMC datu-basea eta konfigurazio fitxategien babes-kopia egin kraskatze edo fitxategi hondamena saihesteko</summary>
<summary lang="fr">Sauvegarder et restaurer vos bases de données XBMC et vos fichiers de configuration en cas de crash ou de fichiers corrompus.</summary>
<summary lang="gl">Crear copia de seguranza e restaurar a base de datos e ficheiros de configuración de XBMC no caso dun fallo ou corrupción de ficheiros.</summary>
<summary lang="he">גיבוי ושחזור מסד הנתונים וקבצי ההגדרות של XBMC במקרה של קריסה או קבצים פגומים.</summary>
<summary lang="hr">Sigurnosno kopirajte i obnovite vašu XBMC bazu podataka i datoteke podešavanja prilikom rušenja ili oštećenja datoteka.</summary>
<summary lang="hu">Biztonsági mentés készítése az XBMC adatbázisról és a beállítófájlokról vagy állítsa helyre azokat egy rendszerösszeomlás vagy adatvesztés után.</summary>
<summary lang="it">Effettua il backup o ripristina il tuo database di XBMC e i file di configurazione qualora si verifichi una chiusura imprevista o un danneggiamento dei file.</summary>
<summary lang="ja">システムのクラッシュやファイル破損に備えて、XBMC のデータベースや設定ファイルをバックアップ・リストアできます。</summary>
<summary lang="ko">XBMC 데이터베이스와 설정 파일을 백업하고 복구합니다.</summary>
<summary lang="lt">Atsarginė kopija katra atkuria jūsų XBMC duomenų bazę ir konfigūracijos failus avarijos ar failo sugadinimo metu.</summary>
<summary lang="nl">Back-up en herstel je XBMC database en configuratiebestanden in geval van een crash of bestandscorruptie.</summary>
<summary lang="pl">Stwórz kopię bezpieczeńśtwa oraz przywróć twoją bazę XBMC łącznie z plikami konfiguracyjnymi w przypadku awarii lub uszkodzenia plików.</summary>
<summary lang="pt">Crie cópias de segurança da base de dados do XBMC e dos ficheiros de configuração. Pode restaurar o conteúdo se ocorrer um crash ou corrupção de ficheiros.</summary>
<summary lang="pt_BR">Faça backup e restaure o banco de dados do XBMC e seus arquivos de configuração, no caso de falha ou corrupção de arquivo.</summary>
<summary lang="sk">Zálohovanie a obnova XBMC databázy a konfiguračných súborov pre prípad havárie alebo poškodenia súboru.</summary>
<summary lang="sv">Ta backupp av eller återställ din XBMC-databas och konfigurationsfiler i händelse av en krash eller filkorruption.</summary>
<summary lang="zh">备份和恢复XBMC数据库和配置文件以防范系统崩溃或文件损坏问题。</summary>
<description lang="be">Ever hosed your XBMC configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by XBMC or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. </description>
<description lang="ca">Sempre canvia la configuració XBMC i ha desitjat tinir una còpia de seguretat? Ara pot fer-ho amb un simple clic. Podeu exportar la seva base de dades, llista de reproducció, miniatures, complements i altres detalls de la configuració per a qualsevol complement de XBMC o directament emmagatzemar-ho al Dropbox en el núvol. Les còpies de seguretat es poden executar a la demanda o per mitjà d'un planificador.</description>
<description lang="da">Har du prøvet at slette din XBMC opsætning, og ønsket at du havde haft sikkerhedskopi? Nu kan du få det med et enkelt klik. Du kan eksportere din database, afspilninglister, miniaturebilleder, addons og andre opsætningsdetaljer til enhver kilde, som er skrivbar for XBMC eller direkt til Dropbox cloud lager. Sikkerhedskopier kan køres manuelt eller via en tidsplan.</description>
<description lang="de">Jemals deine XBMC Konfiguration zerschossen und dir dann gewünscht, dass ein Backup existiert? Jetzt kannst du eine Sicherung mit nur einem Klick erzeugen. Du kannst deine Datenbanen, Playlisten, Thumbnails, Addons und andere Details zu einem Ort deiner Wahl sichern.</description>
<description lang="el">Σας έτυχε ποτέ να χάσετε τις ρυθμίσεις του XBMC και να εύχεστε να είχατε αντίγραφο ασφαλείας; Πλέον μπορείτε με ένα απλό κλικ. Μπορείτε να εξάγετε τη βάση δεδομένων, τις λίστες αναπαραγωγής, τις μικρογραφίες, τα πρόσθετα και άλλες λεπτομέρειες της εγκατάστασης σε οποιαδήποτε πηγή στην οποία μπορεί να γράψει το XBMC, ή απευθείας στο λογαριασμό σας στο Dropbox. Τα αντίγραφα μπορούν να γίνονται κατ' επιλογή ή μέσω προγραμματισμού.</description>
<description lang="en">Ever hosed your XBMC configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by XBMC or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. </description>
<description lang="es">¿Alguna vez te has cargado la configuración de XBMC y habrías deseado tener una copia de seguridad? Ahora puedes tenerla con un único click. Exporta tus base de datos, listas de reproducción, miniaturas, addons y resto de configuraciones a cualquier fuente accesible por XBMC o a tu almacenamiento en Dropbox. Las copias de seguridad pueden programarse o realizarse bajo demanda.</description>
<description lang="es_MX">¿Alguna vez haz echado a perder tu configuración de XBMC y haz deseado tener un respaldo? Ahora puedes tenerlo con un simple click. Puedes exportar tu base de datos, listas de reproducción, miniaturas, addons y otros detalles de configuración correspondientes a cualquier fuente que pueda escribir XBMC. Los respaldos pueden ser efectuados a pedido o mediante una programación temporal</description>
<description lang="fr">Avez-vous déjà perdu votre configuration XBMC et espéré avoir fait une sauvegarde ? Maintenant, vous pouvez le faire en un simple click. Vous pouvez exporter vos bases de données, playlists, miniatures, addons et autres fichiers de configuration vers n'importe quel endroit accessible depuis XBMC.</description>
<description lang="gl">De seguro que algunha vez eliminou a configuración do XBMC e desexou ter unha copia de seguranza?. Agora pode cun só clic. Pode exportar a súa base de datos, listaxes de reprodución, miniaturas, complementos e outros detalles da configuración a calquera medio escribíbel ou directamente ao Dropbox. As copias de seguranza pódense executar baixo demanda ou programadas.</description>
<description lang="he">Ever hosed your XBMC configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by XBMC. Backups can be run on demand or via a scheduler. </description>
<description lang="hr">Jeste li ikada oštetili vaša XBMC podešavanja i poželjeli ste ih obnoviti iz sigurnosne kopije? Sada to možete jednim klikom. Možete izvesti vašu bazu podataka, popis izvođenja, minijature, dodatke i ostale pojedinosti podešavanja na svaki izvor dostupan XBMC-u ili izravno na Dropbox oblak pohrane. Sigurnosno kopiranje se može pokrenuti na zahtjev ili u planiranom vremenu.</description>
<description lang="hu">Sikerült már összekutyulni az XBMC beállításait és jó lett volna egy biztonsági mentés? Most megteheti egy kattintással. Exportálhatja az adatbázisait, lejátszáslistáit, könyvjelzőit, kiegészítőit és egyéb beállításokat bármely, az XBMC által írható tárhelyre vagy közvetlenül a Dropbox felhő tárolóba. A mentések kézzel vagy időzítetten indíthatóak.</description>
<description lang="it">Hai mai distrutto la tua configurazione di XBMC ma non ne avevi una copia di backup? Ora puoi farlo con un semplice click. Puoi esportare il tuo database, le playlist, le anteprime, gli add-on ed altre configurazioni su ogni percorso accessibile da XBMC o direttamente su Dropbox. I backup si possono fare a richiesta o possono essere pianificati.</description>
<description lang="ja">XBMCの設定が消えてしまい、バックアップをとっておけば... と思ったことはありますかこれからは1クリックで簡単にバックアップできます。データベース、プレイリスト、サムネール、アドオン、その他設定項目を、XBMC が書き込み可能なメディアに書き出せます。Dropbox クラウドストレージにも直接書き出せます。スケジューラによる自動バックアップと、オンデマンドでのバックアップの両方が使えます。</description>
<description lang="lt">Kada naujinate ir konfiguruojate savo XBMC ar susimastėte, kad jums reikalinga atsarginė kopija? Dabar galite tai atlikti vienu spustelėjimu. Savo duomenų bazes, atkūrimą, miniatiūras, priedus ir kitas konfigūracijos failus galite eksportuoti iš bet kokio šaltinio. Atsarginė(-ės) kopija(-os) gali būti paleistos pareikalavus arba per tvarkaraštį.</description>
<description lang="nl">Ooit je XBMC configuratie verknalt en gewenst dat je een backup had? Nu kan dat met een simpele klik. Je kunt je bibliotheek, afspeellijsten, miniaturen, addons en andere configuratie optes exporteren naar elke bron die door XBMC beschrijfbaar is of direct naar een Dropbox cloud opslag. Backups kunnen op verzoek of via een rooster gedraaid worden.</description>
<description lang="pl">Straciłeś kiedyś swoją konfigurację XBMC i marzyłeś o kopii zapasowej? Teraz już możesz i to w prosty sposób. Możesz eksportować swoją bazę, playlisty, miniatury, dodatki oraz wiele więcej do dowolnego źródła bezpośrednio z XBMC. Kopia bezpieczeństwa może być uruchomiona na żądanie lub przez plan.</description>
<description lang="pt">Já arruinou a sua configuração do XBMC e desejou ter feito uma cópia de segurança? Agora pode, com apenas um clique. Exporte a base de dados, listas de reprodução, miniaturas, add-ons e outras configurações para qualquer fonte acedível pelo XBMC. As cópias de segurança podem ser executadas manualmente ou por temporizador.</description>
<description lang="pt_BR">Sempre se preocupou com sua configuração do XBMC e desejou ter um backup? Agora você pode com um simples clique. Você pode exportar seu banco de dados, listas de reprodução, miniaturas, addons e outros detalhes de configuração para qualquer fonte gravável pelo XBMC ou diretamente ao armazenamento na nuvem Dropbox. Os backups podem ser executados sob demanda ou por agendamento.</description>
<description lang="sk">Už ste niekedy poškodili konfiguráciu XBMC a priali si mať zálohu? Teraz môžete - na jeden klik. Môžete exportovať Vašu databázu, playlist, náhľady, doplnky a konfigurácie na ktorýkoľvek zdroj zapisovateľný XBMC. Zálohy môžu byť púšťané na požiadanie alebo plánovačom. </description>
<description lang="sv">Har du någonsin tappat bort din XBMC konfiguration och önskat att du hade en backup? Nu kan du enkelt med ett klick. Du kan exportera din databas, spellista, minityrer, tillägg och andra konfigurationsdetaljer till valfri källa som är skrivbar för XBMC. Backupper kan köras på begäran eller via scheman.</description>
<description lang="zh">你是否经常折腾你的XBMC因而希望能够有个备份你可以把资料库、播放列表、缩略图、插件和其他配置细节导出到XBMC可以写入的任意位置。备份可以按需运行或通过计划任务执行。</description>
<forum>http://forum.xbmc.org/showthread.php?tid=129499</forum>
<source>https://github.com/robweber/xbmcbackup</source>
<license>The MIT License</license>
<platform>all</platform>
<language></language>
</extension>
</addon>

View File

@@ -1,174 +0,0 @@
Version 0.4.4
modified the check for invalid file types
Version 0.4.3
added error message if remote directory is blank
added license tag
Version 0.4.2
Added support for userdata/profiles folder - thanks TUSSFC
Version 0.4.1
added encode() around notifications
Version 0.4.0
fixed settings display error - thanks zer04c
Version 0.3.9
added "just once" scheduler for one-off type backups
show notification on scheduler update
updated language files from Transifex
Version 0.3.8
added advancedsettings check on restore. prompts user to restore only this file and restart xbmc to continue. This fixes issues where path substitution was not working during restores - thanks ctrlbru
Version 0.3.7
added optional addon.xml tags
update language files from Transifex
Version 0.3.6
added up to 2 custom directories, can be toggled on/off
added a check for backup verification before rotation - no more deleting non backup related files
use monitor class for onSettingsChanged method
Version 0.3.5
test of custom directories - only 1 at the moment
Version 0.3.4
added ability to take parameters via RunScript() or JSONRPC.Addons.ExecuteAddon()
Version 0.3.3
updated xbmc python version (2.1.0)
Version 0.3.2
added settings for user provided Dropbox key and secret
Version 0.3.1
added try/except for multiple character encodings
remove token.txt file if Dropbox Authorization is revoked
can shutdown xbmc after scheduled backup
Version 0.3.0
major vfs rewrite
Added Dropbox as storage target
updated gui/removed settings - thanks SFX Group for idea!
Version 0.2.3
first official frodo build
Version 0.2.2
fix for backup rotation sort
Version 0.2.1
added ability to rotate backups, keeping a set number of days
Version 0.2.0
removed the vfs.py helper library
default.py file now uses xbmcvfs python library exclusively for listing directories and copy operations
Version 0.1.7
minor bug fixes and translations updates
Version 0.1.6
merged scheduler branch with master, can now schedule backups on an interval
Version 0.1.5
pulled xbmcbackup class into separate library
Version 0.1.4
added more verbose error message for incorrect paths
Version 0.1.3
backup folder format - thanks zeroram
added German translations - thanks dersphere
removed need for separate verbose logging setting
updated utf-8 encoding for all logging
backup now uses date as folder name, restore allows user to type date of last backup
Version 0.1.2
added French language translation - thanks mikebzh44
added some utf-8 encoding tags to filenames
Version 0.1.1
added check for key in vfs.py - Thanks Martijn!
Version 0.1.0
removed transparency from icon.png
Version 0.0.9
modified vfs.py again to filter out xsp files (smart playlists). Created running list for these types of compressed files
added enable/disable logging toggle in settings
Version 0.0.8
modified vfs.py script to exclude handling zip files as directories, added keymap and peripheral data folders in the "config" section
Version 0.0.7
removed "restore.txt" file and now write file listing to memory list instead
Version 0.0.6
Added the vfs module created by paddycarey
File Selection is now followed for both backup and restore options
Version 0.0.5
Added option to manually type a path rather than browse for one (only one used)
Show progress bar right away so you know this is doing something
Version 0.0.4
Finished code for restore mode.
Version 0.0.3
Added progress bar and "silent" option for running on startup or as a script
Version 0.0.2
First version, should backup directories as needed

View File

@@ -1,38 +0,0 @@
import xbmcgui
import resources.lib.utils as utils
from resources.lib.backup import XbmcBackup
#the program mode
mode = -1
#check if mode was passed in as an argument
if(len(sys.argv) > 1):
if(sys.argv[1].lower() == 'backup'):
mode = 0
elif(sys.argv[1].lower() == 'restore'):
mode = 1
if(mode == -1):
#figure out if this is a backup or a restore from the user
mode = xbmcgui.Dialog().select(utils.getString(30010) + " - " + utils.getString(30023),[utils.getString(30016),utils.getString(30017)])
if(mode != -1):
#run the profile backup
backup = XbmcBackup()
if(backup.remoteConfigured()):
if(mode == backup.Restore):
#allow user to select the backup to restore from
restorePoints = backup.listBackups()
selectedRestore = xbmcgui.Dialog().select(utils.getString(30010) + " - " + utils.getString(30021),restorePoints)
if(selectedRestore != -1):
backup.selectRestore(restorePoints[selectedRestore])
backup.run(mode)
else:
#can't go any further
xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045))
utils.openSettings()

BIN
icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -1,2 +0,0 @@
*.pyo

View File

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Afrikaans language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/af/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Algemeen</string>
<string id="30023">Modus</string>
<string id="30032">Databasis</string>
<string id="30033">Speellys</string>
<string id="30065">Sondag</string>
<string id="30066">Maandag</string>
<string id="30067">Dinsdag</string>
<string id="30068">Woensdag</string>
<string id="30069">Donderdag</string>
<string id="30070">Vrydag</string>
<string id="30071">Saterdag</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Albanian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/sq/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">I përgjithsëm</string>
<string id="30023">Mënyra</string>
<string id="30032">Baza e të dhënave</string>
<string id="30033">Lista e Lojës</string>
<string id="30065">E Diel</string>
<string id="30066">E Hënë</string>
<string id="30067">E Martë</string>
<string id="30068">E Mërkurë</string>
<string id="30069">E Ejnte</string>
<string id="30070">E Premte</string>
<string id="30071">E Shtunë</string>
</strings>

View File

@@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Amharic language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/am/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">ባጠቃላይ</string>
<string id="30023">ዘዴ </string>
<string id="30032">ዳታቤዝ</string>
<string id="30033">የሚጫወተው ዝርዝር </string>
<string id="30062">ሰአት </string>
<string id="30065">እሑድ </string>
<string id="30066">ሰኞ</string>
<string id="30067">ማክሰኞ</string>
<string id="30068">ረቡዕ </string>
<string id="30069">ሐሙስ</string>
<string id="30070">አርብ</string>
<string id="30071">ቅዳሜ</string>
</strings>

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Arabic language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ar/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">نسخ احتياطي XBMC</string>
<string id="30011">عام</string>
<string id="30012">تحديد ملف</string>
<string id="30013">جدولة</string>
<string id="30016">نسخ احتياطي</string>
<string id="30017">استعادة</string>
<string id="30018">استعراض مسار</string>
<string id="30019">نوع مسار</string>
<string id="30020">استعراض مسار خارجي</string>
<string id="30021">اسم مجلد النسخ الاحتياطي</string>
<string id="30022">تشغيل صامت</string>
<string id="30023">الوضع</string>
<string id="30024"> مسار نوع خارجي</string>
<string id="30025">نوع مسار خارجي</string>
<string id="30030">مستخدم إضافات</string>
<string id="30032">قاعدة البيانات</string>
<string id="30033">قائمة التشغيل</string>
<string id="30065">الاحد</string>
<string id="30066">الاثنين</string>
<string id="30067">الثلاثاء</string>
<string id="30068">الاربعاء</string>
<string id="30069">الخميس</string>
<string id="30070">الجمعة</string>
<string id="30071">السبت</string>
</strings>

View File

@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Basque language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/eu/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Babes-kopia</string>
<string id="30011">Orokorra</string>
<string id="30012">Fitxategi hautapena</string>
<string id="30013">Plangintza</string>
<string id="30016">Babes-kopia</string>
<string id="30017">Berrezarri</string>
<string id="30018">Arakatu bidea</string>
<string id="30021">Babes-kopia karpeta izena</string>
<string id="30022">Exekutatu isiltasunean</string>
<string id="30023">Modua</string>
<string id="30024">Idatzi Urruneko bidea</string>
<string id="30025">Urruneko bide mota</string>
<string id="30026">Mantentzeko babes-kopiak (0 denentzat)</string>
<string id="30030">Erabiltzaile gehigarriak</string>
<string id="30031">Gehigarri data</string>
<string id="30032">Datu basea</string>
<string id="30033">Zerrenda</string>
<string id="30035">Konfigurazio fitxategiak</string>
<string id="30045">Errorea: Urruneko bidea ez dago</string>
<string id="30046">Abiarazten</string>
<string id="30047">Karpeta lokala</string>
<string id="30048">Urruneko karpeta</string>
<string id="30049">Fitxategi zerrenda biltzen</string>
<string id="30050">Urruneko bidea badago - fitxategi zaharrak eduki ditzake!</string>
<string id="30051">Fitxategi zerrenda sortzen</string>
<string id="30052">Fitxategia idazten</string>
<string id="30053">Plangintzadun babes-kopia abiarazten</string>
<string id="30054">Babeskopia ezabatzen</string>
<string id="30060">Gaitu plangintza</string>
<string id="30061">Plangintza</string>
<string id="30062">Eguneko ordua</string>
<string id="30063">Asteko eguna</string>
<string id="30064">Cron plangintza</string>
<string id="30065">Igandea</string>
<string id="30066">Astelehena</string>
<string id="30067">Asteartea</string>
<string id="30068">Asteazkena</string>
<string id="30069">Osteguna</string>
<string id="30070">Ostirala</string>
<string id="30071">Larunbata</string>
<string id="30072">Egunero</string>
<string id="30073">Astero</string>
<string id="30074">Hilabeteko lehen egunean</string>
<string id="30075">Plangintza pertsonalizatua</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Belarusian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/be/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">General</string>
<string id="30012">File Selection</string>
<string id="30013">Scheduling</string>
<string id="30016">Backup</string>
<string id="30017">Restore</string>
<string id="30018">Browse Path</string>
<string id="30019">Type Path</string>
<string id="30020">Browse Remote Path</string>
<string id="30021">Backup Folder Name</string>
<string id="30022">Run Silent</string>
<string id="30023">Mode</string>
<string id="30024">Type Remote Path</string>
<string id="30025">Remote Path Type</string>
<string id="30026">Backups to keep (0 for all)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox Key</string>
<string id="30029">Dropbox Secret</string>
<string id="30030">User Addons</string>
<string id="30031">Addon Data</string>
<string id="30032">Database</string>
<string id="30033">Сьпіс прайграваньня</string>
<string id="30034">Thumbnails/Fanart</string>
<string id="30035">Config Files</string>
<string id="30036">Custom Directory 1</string>
<string id="30037">Custom Directory 2</string>
<string id="30038">Advanced Settings Detected</string>
<string id="30039">The advancedsettings file should be restored first</string>
<string id="30040">Select Yes to restore this file and restart XBMC</string>
<string id="30041">Select No to continue</string>
<string id="30042">Resume Restore</string>
<string id="30043">XBMC Backup has detected an unfinished restore</string>
<string id="30044">Would you like to continue?</string>
<string id="30045">Error: Remote path doesn't exist</string>
<string id="30046">Starting</string>
<string id="30047">Local Dir</string>
<string id="30048">Remote Dir</string>
<string id="30049">Gathering file list</string>
<string id="30050">Remote Path exists - may have old files in it!</string>
<string id="30051">Creating Files List</string>
<string id="30052">Writing file</string>
<string id="30053">Starting scheduled backup</string>
<string id="30054">Removing backup</string>
<string id="30056">Check log for Dropbox authorize URL</string>
<string id="30057">Click OK when authorized</string>
<string id="30058">Dropbox Developer Code Needed</string>
<string id="30059">Visit https://www.dropbox.com/developers</string>
<string id="30060">Enable Scheduler</string>
<string id="30061">Расклад</string>
<string id="30062">Hour of Day</string>
<string id="30063">Дзень тыдня</string>
<string id="30064">Cron Schedule</string>
<string id="30065">Нядзеля</string>
<string id="30066">Панядзелак</string>
<string id="30067">Аўторак</string>
<string id="30068">Серада</string>
<string id="30069">Чацьвер</string>
<string id="30070">Пятніца</string>
<string id="30071">Субота</string>
<string id="30072">Штодня</string>
<string id="30073">Штотыдзень</string>
<string id="30074">Першы дзень месяца</string>
<string id="30075">Custom Schedule</string>
<string id="30076">Shutdown After Backup</string>
<string id="30077">Restart XBMC</string>
<string id="30078">You should restart XBMC to continue</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Bosnian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/bs/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Opšte</string>
<string id="30023">Režim</string>
<string id="30032">Baza podataka</string>
<string id="30033">Spisak za rep.</string>
<string id="30065">Nedjelja</string>
<string id="30066">Ponedjeljak</string>
<string id="30067">Utorak</string>
<string id="30068">Srijeda</string>
<string id="30069">Četvrtak</string>
<string id="30070">Petak</string>
<string id="30071">Subota</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Bulgarian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/bg/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">General</string>
<string id="30023">Режим</string>
<string id="30032">База от данни</string>
<string id="30033">Плейлист</string>
<string id="30065">неделя</string>
<string id="30066">понеделник</string>
<string id="30067">вторник</string>
<string id="30068">сряда</string>
<string id="30069">четвъртък</string>
<string id="30070">петък</string>
<string id="30071">събота</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Catalan language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ca/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">Còpia de seguretat XBMC</string>
<string id="30011">General</string>
<string id="30012">Sel·lecció de fitxers</string>
<string id="30013">Planificació</string>
<string id="30016">Còpia de seguretat</string>
<string id="30017">Restauració</string>
<string id="30018">Navega per la ruta</string>
<string id="30019">Tipus de ruta</string>
<string id="30020">Navega per la ruta remota</string>
<string id="30021">Nom del directori de la còpia</string>
<string id="30022">Executa en silenci</string>
<string id="30023">Mode</string>
<string id="30024">Tipus de ruta remota</string>
<string id="30025">Tipus de ruta remota</string>
<string id="30026">Còpies de seguretat a mantenir (0 per totes)</string>
<string id="30027">Dropbox</string>
<string id="30028">Clau del Dropbox</string>
<string id="30029">Dropbox secret</string>
<string id="30030">Afegitons d'usuari</string>
<string id="30031">Dades d'afegitons</string>
<string id="30032">Base de dades</string>
<string id="30033">Llista de reproducció</string>
<string id="30034">Miniatures/Fanart</string>
<string id="30035">Fitxers de configuració</string>
<string id="30036">Directori Personalitzat 1</string>
<string id="30037">Directori Personalitzat 2</string>
<string id="30038">Detectada Configuració avançada</string>
<string id="30039">El fitxer de configuració avançada s'ha de restaurar primer</string>
<string id="30040">Selecciona SI per Restaurar aquest arxiu i reiniciar l'XBMC</string>
<string id="30041">Seleciona No per Continuar</string>
<string id="30042">Rependre la Restauració</string>
<string id="30043">Copia de seguretat d'XBMC ha detectat una restauració sense acabar</string>
<string id="30044">Vols continuar?</string>
<string id="30045">Error: La ruta remota no existeix</string>
<string id="30046">Inici</string>
<string id="30047">Directori local</string>
<string id="30048">Directori remot</string>
<string id="30049">Recollint llista de fitxers</string>
<string id="30050">La ruta remota existeix - hi pot haver fitxers antics!</string>
<string id="30051">Creant llista de fitxers</string>
<string id="30052">Escrivint fitxer</string>
<string id="30053">Iniciant còpia planificada</string>
<string id="30054">S'està eliminant la còpia de seguretat</string>
<string id="30056">Comproveu el registre per la URL d autorització de Dropbox</string>
<string id="30057">Clica OK quan hagi estat autoritzat</string>
<string id="30058">Es necessita codi de desembolupador de Dropbox</string>
<string id="30059">Visita https://www.dropbox.com/developers</string>
<string id="30060">Activa el planificador</string>
<string id="30061">Planificador</string>
<string id="30062">Hora del dia</string>
<string id="30063">Dia de la setmana</string>
<string id="30064">Planificador cron</string>
<string id="30065">Diumenge</string>
<string id="30066">Dilluns</string>
<string id="30067">Dimarts</string>
<string id="30068">Dimecres</string>
<string id="30069">Dijous</string>
<string id="30070">Divendres</string>
<string id="30071">Dissabte</string>
<string id="30072">Cada dia</string>
<string id="30073">Cada setmana</string>
<string id="30074">Primer dia del mes</string>
<string id="30075">Planificació personalitzada</string>
<string id="30076">Apagar despres de la copia de seguretat</string>
<string id="30077">Reiniciar XBMC</string>
<string id="30078">Cal que reinicieu XBMC per continuar</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Chinese (Simple) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/zh/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC备份</string>
<string id="30011">常用</string>
<string id="30012">文件选择</string>
<string id="30013">计划任务</string>
<string id="30016">备份</string>
<string id="30017">恢复</string>
<string id="30018">浏览目录</string>
<string id="30019">输入目录</string>
<string id="30020">浏览远程目录</string>
<string id="30021">备份文件夹名</string>
<string id="30022">静默运行</string>
<string id="30023">模式</string>
<string id="30024">输入远程目录</string>
<string id="30025">远程目录类型</string>
<string id="30026">保留备份数0为全部</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox用户</string>
<string id="30029">Dropbox密码</string>
<string id="30030">用户插件</string>
<string id="30031">插件数据</string>
<string id="30032">数据库</string>
<string id="30033">播放列表</string>
<string id="30034">缩略图/同人画</string>
<string id="30035">配置文件</string>
<string id="30036">自定义目录1</string>
<string id="30037">自定义目录2</string>
<string id="30038">检测到高级设置</string>
<string id="30039">将先恢复高级设置文件</string>
<string id="30040">选“是”恢复此文件并重启XBMC</string>
<string id="30041">选“否”继续</string>
<string id="30042">继续恢复</string>
<string id="30043">XBMC备份检测到未完成的恢复</string>
<string id="30044">要继续吗?</string>
<string id="30045">错误:远程目录不存在</string>
<string id="30046">开始</string>
<string id="30047">本地目录</string>
<string id="30048">远程目录</string>
<string id="30049">收集文件列表</string>
<string id="30050">远程目录存在 - 可能有旧文件留存!</string>
<string id="30051">创建文件列表</string>
<string id="30052">写入文件</string>
<string id="30053">启动按计划备份</string>
<string id="30054">删除备份</string>
<string id="30056">检查Dropbox授权URL日志</string>
<string id="30057">授权后点“确定”</string>
<string id="30058">需要Dropbox开发者Code</string>
<string id="30059">访问https://www.dropbox.com/developers</string>
<string id="30060">启用计划任务</string>
<string id="30061">时间安排</string>
<string id="30062">时刻</string>
<string id="30063">星期</string>
<string id="30064">Cron 计划任务</string>
<string id="30065">星期日</string>
<string id="30066">星期一</string>
<string id="30067">星期二</string>
<string id="30068">星期三</string>
<string id="30069">星期四</string>
<string id="30070">星期五</string>
<string id="30071">星期六</string>
<string id="30072">每天</string>
<string id="30073">每周</string>
<string id="30074">每月初</string>
<string id="30075">自定义计划</string>
<string id="30076">备份完成后关机</string>
<string id="30077">重启XBMC</string>
<string id="30078">需要重启XBMC以继续</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Chinese (Traditional) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/zh_TW/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">一般設定</string>
<string id="30023">模式</string>
<string id="30032">資料庫</string>
<string id="30033">播放列表</string>
<string id="30065">星期日</string>
<string id="30066">星期一</string>
<string id="30067">星期二</string>
<string id="30068">星期三</string>
<string id="30069">星期四</string>
<string id="30070">星期五</string>
<string id="30071">星期六</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Croatian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/hr/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC sigurnosno kopiranje</string>
<string id="30011">Općenito</string>
<string id="30012">Odabir datoteke</string>
<string id="30013">Planirano vrijeme</string>
<string id="30016">Sigurnosno kopiranje</string>
<string id="30017">Obnovi</string>
<string id="30018">Putanja pregleda</string>
<string id="30019">Vrsta putanje</string>
<string id="30020">Pregledaj udaljenu putanju</string>
<string id="30021">Sigurnosno kopiraj naziv mape</string>
<string id="30022">Pokreni u pozadini</string>
<string id="30023">Način</string>
<string id="30024">Upišite udaljenu putanju</string>
<string id="30025">Vrsta udaljene putanje</string>
<string id="30026">Sigurnosna kopiranja za zadržavanje (0 za sve)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox ključ</string>
<string id="30029">Dropbox tajna</string>
<string id="30030">Dodaci korisnika</string>
<string id="30031">Podaci dodatka</string>
<string id="30032">Baza podataka</string>
<string id="30033">Popisu izvođenja</string>
<string id="30034">Minijature/Slike omota</string>
<string id="30035">Datoteke podešavanja</string>
<string id="30036">Prilagođeni direktorij 1</string>
<string id="30037">Prilagođeni direktorij 2</string>
<string id="30038">Otkrivene su napredne postavke</string>
<string id="30039">Datoteka napredne postavke prvo se treba obnoviti</string>
<string id="30040">Odaberite 'Da' za obnavljanje ove datoteke i ponovno pokretanje XBMC-a</string>
<string id="30041">Odaberite 'Ne' za nastavak</string>
<string id="30042">Nastavi obnovu</string>
<string id="30043">XBMC sigurnosno kopiranje je otkrilo nezavršenu obnovu</string>
<string id="30044">Želite li nastaviti?</string>
<string id="30045">Greška: udaljena putanja ne postoji</string>
<string id="30046">Pokretanje</string>
<string id="30047">Lokalni direktorij</string>
<string id="30048">Udaljeni direktorij</string>
<string id="30049">Sakupljanje popisa datoteka</string>
<string id="30050">Udaljena putanja postoji - možda sadrži zastarjele datoteke!</string>
<string id="30051">Stvaranje popisa datoteka</string>
<string id="30052">Zapisivanje datoteke</string>
<string id="30053">Pokretanje sigurnosnog kopiranja u planirano vrijeme</string>
<string id="30054">Uklanjanje sigurnosnog kopiranja</string>
<string id="30056">Provjera zapisa za URL autorizacije Dropboxa</string>
<string id="30057">Kliknite 'U redu' kada je autorizirano</string>
<string id="30058">Potreban je kôd Dropbox razvijatelja</string>
<string id="30059">Posjetite https://www.dropbox.com/developers</string>
<string id="30060">Omogući planirano vrijeme</string>
<string id="30061">Planirano vrijeme</string>
<string id="30062">Sata dnevno</string>
<string id="30063">Dan u tjednu</string>
<string id="30064">Cron planirano vrijeme</string>
<string id="30065">Nedjelja</string>
<string id="30066">Ponedjeljak</string>
<string id="30067">Utorak</string>
<string id="30068">Srijeda</string>
<string id="30069">Četvrtak</string>
<string id="30070">Petak</string>
<string id="30071">Subota</string>
<string id="30072">Svaki dan</string>
<string id="30073">Svaki tjedan</string>
<string id="30074">Prvi dan mjeseca</string>
<string id="30075">Prilagođeno vrijeme planiranja</string>
<string id="30076">Isključi nakon sigurnosnog kopiranja</string>
<string id="30077">Ponovno pokreni XBMC</string>
<string id="30078">Za nastavak je potrebno ponovno pokretanje XBMC-a</string>
</strings>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Czech language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/cs/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Obecné</string>
<string id="30023">Režim</string>
<string id="30032">Databáze</string>
<string id="30033">Seznam stop</string>
<string id="30061">Rozvrh</string>
<string id="30065">Neděle</string>
<string id="30066">Pondělí</string>
<string id="30067">Úterý</string>
<string id="30068">Středa</string>
<string id="30069">Čtvrtek</string>
<string id="30070">Pátek</string>
<string id="30071">Sobota</string>
<string id="30077">Restartovat XBMC</string>
</strings>

View File

@@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Danish language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/da/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Sikkerhedskopi</string>
<string id="30011">Generelt</string>
<string id="30012">Filvalg</string>
<string id="30013">Planlægning</string>
<string id="30016">Backup</string>
<string id="30017">Genopret</string>
<string id="30018">Gennemse mapper</string>
<string id="30019">Indtast Sti</string>
<string id="30020">Gennemse netværksmapper</string>
<string id="30021">Navngiv mappe til sikkerhedskopi</string>
<string id="30022">Kør i baggrunden</string>
<string id="30023">Tilstand</string>
<string id="30024">Indtast netværkssti</string>
<string id="30025">Type af netværkssti</string>
<string id="30026">Sikkerhedskopier der skal gemmes (0 for alle)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox kodeord</string>
<string id="30029">Dropbox hemmeligt</string>
<string id="30030">Bruger-Addons</string>
<string id="30031">Addon-data</string>
<string id="30032">Database</string>
<string id="30033">Afspilningsliste</string>
<string id="30034">Miniaturer/Fankunst</string>
<string id="30035">Konfigurationsfil</string>
<string id="30045">Fejl: Netværksstien findes ikke</string>
<string id="30046">Starter</string>
<string id="30047">Lokal mappe</string>
<string id="30048">Netværksmappe</string>
<string id="30049">Indsamler filliste</string>
<string id="30050">Netværksstien findes - indeholder muligvis ældre filer!</string>
<string id="30051">Opbygger filliste</string>
<string id="30052">Skriver fil</string>
<string id="30053">Starter planlagt sikkerhedskopi</string>
<string id="30054">Fjerner sikkerhedskopi</string>
<string id="30056">Tjek log for autoriserings-URL til Dropbox</string>
<string id="30057">Tryk OK efter autorisering</string>
<string id="30058">Dropbox udviklerkode krævet</string>
<string id="30059">Besøg https://www.dropbox.com/developers</string>
<string id="30060">Aktivér Tidsplan</string>
<string id="30061">Tidsplan</string>
<string id="30062">Tid på dagen</string>
<string id="30063">Ugedag</string>
<string id="30064">Cron tidsplan</string>
<string id="30065">Søndag</string>
<string id="30066">Mandag</string>
<string id="30067">Tirsdag</string>
<string id="30068">Onsdag</string>
<string id="30069">Torsdag</string>
<string id="30070">Fredag</string>
<string id="30071">Lørdag</string>
<string id="30072">Hver dag</string>
<string id="30073">Hver uge</string>
<string id="30074">Første dag i måneden</string>
<string id="30075">Brugerdefineret tidsplan</string>
<string id="30076">Luk ned efter Sikkerhedskopiering</string>
<string id="30077">Genstart XBMC</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Dutch language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/nl/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">Algemeen</string>
<string id="30012">Bestand Selectie</string>
<string id="30013">Inplannen</string>
<string id="30016">Backup</string>
<string id="30017">Terugzetten</string>
<string id="30018">Zoek pad</string>
<string id="30019">Type pad</string>
<string id="30020">Blader externe locatie</string>
<string id="30021">Backup Folder Naam</string>
<string id="30022">Draai Zonder Mededelingen</string>
<string id="30023">Modus</string>
<string id="30024">Enter Extern Pad</string>
<string id="30025">Extern Pad Type</string>
<string id="30026">Te bewaren backups (0 voor alle)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox sleutel</string>
<string id="30029">Dropbox Geheim</string>
<string id="30030">Gebruiker addons</string>
<string id="30031">Addon Data</string>
<string id="30032">Database</string>
<string id="30033">Afspeellijst</string>
<string id="30034">Miniaturen/Fanart</string>
<string id="30035">Configuratiebestanden</string>
<string id="30036">Aangepaste Map 1</string>
<string id="30037">Aangepaste Map 2</string>
<string id="30038">Geavanceerde instellingen gevonden</string>
<string id="30039">Het advancedsettingsbestand moet eerst teruggezet worden</string>
<string id="30040">Kies Ja om dit bestand terug te zetten en XBMC te herstarten</string>
<string id="30041">Selecteer nee of verder te gaan</string>
<string id="30042">Verder gaan met herstellen</string>
<string id="30043">XBMC Backup heeft een onafgemaakte herstelling gededecteerd</string>
<string id="30044">Will je verder gaan?</string>
<string id="30045">Fout: Externe locatie bestaat niet</string>
<string id="30046">Starten</string>
<string id="30047">Lokale map</string>
<string id="30048">Externe map</string>
<string id="30049">Ophalen van bestandslijst</string>
<string id="30050">Extern Pad bestaat - er kunnen oude bestanden in zitten!</string>
<string id="30051">Aanmaken bestandslijst </string>
<string id="30052">Bestand schrijven</string>
<string id="30053">Start geplande backup</string>
<string id="30054">Verwijder backup</string>
<string id="30056">Controleer het log voor de Dropbox autoriseer URL</string>
<string id="30057">Klik OK wanneer geauthoriseerd</string>
<string id="30058">Dropbox Developer Code Nodig</string>
<string id="30059">Bezoek https://www.dropbox.com/developers</string>
<string id="30060">Planner inschakelen</string>
<string id="30061">Planning</string>
<string id="30062">Uur van de dag</string>
<string id="30063">Dag van de week</string>
<string id="30064">Cron Rooster</string>
<string id="30065">Zondag</string>
<string id="30066">Maandag</string>
<string id="30067">Dinsdag</string>
<string id="30068">Woensdag</string>
<string id="30069">Donderdag</string>
<string id="30070">Vrijdag</string>
<string id="30071">Zaterdag</string>
<string id="30072">Elke dag</string>
<string id="30073">Elke week</string>
<string id="30074">Eerste dag van de maand</string>
<string id="30075">Aangepast Rooster</string>
<string id="30076">Afsluiten na voltooiing back-up</string>
<string id="30077">Herstarten XBMC</string>
<string id="30078">Herstart XBMC om verder te gaan</string>
</strings>

View File

@@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- English language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/en/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">General</string>
<string id="30012">File Selection</string>
<string id="30013">Scheduling</string>
<string id="30016">Backup</string>
<string id="30017">Restore</string>
<string id="30018">Browse Path</string>
<string id="30019">Type Path</string>
<string id="30020">Browse Remote Path</string>
<string id="30021">Backup Folder Name</string>
<string id="30022">Run Silent</string>
<string id="30023">Mode</string>
<string id="30024">Type Remote Path</string>
<string id="30025">Remote Path Type</string>
<string id="30026">Backups to keep (0 for all)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox Key</string>
<string id="30029">Dropbox Secret</string>
<string id="30030">User Addons</string>
<string id="30031">Addon Data</string>
<string id="30032">Database</string>
<string id="30033">Playlist</string>
<string id="30034">Thumbnails/Fanart</string>
<string id="30035">Config Files</string>
<string id="30036">Custom Directory 1</string>
<string id="30037">Custom Directory 2</string>
<string id="30038">Advanced Settings Detected</string>
<string id="30039">The advancedsettings file should be restored first</string>
<string id="30040">Select Yes to restore this file and restart XBMC</string>
<string id="30041">Select No to continue</string>
<string id="30042">Resume Restore</string>
<string id="30043">XBMC Backup has detected an unfinished restore</string>
<string id="30044">Would you like to continue?</string>
<string id="30045">Error: Remote path doesn't exist</string>
<string id="30046">Starting</string>
<string id="30047">Local Dir</string>
<string id="30048">Remote Dir</string>
<string id="30049">Gathering file list</string>
<string id="30050">Remote Path exists - may have old files in it!</string>
<string id="30051">Creating Files List</string>
<string id="30052">Writing file</string>
<string id="30053">Starting scheduled backup</string>
<string id="30054">Removing backup</string>
<string id="30056">Check log for Dropbox authorize URL</string>
<string id="30057">Click OK when authorized</string>
<string id="30058">Dropbox Developer Code Needed</string>
<string id="30059">Visit https://www.dropbox.com/developers</string>
<string id="30060">Enable Scheduler</string>
<string id="30061">Schedule</string>
<string id="30062">Hour of Day</string>
<string id="30063">Day of Week</string>
<string id="30064">Cron Schedule</string>
<string id="30065">Sunday</string>
<string id="30066">Monday</string>
<string id="30067">Tuesday</string>
<string id="30068">Wednesday</string>
<string id="30069">Thursday</string>
<string id="30070">Friday</string>
<string id="30071">Saturday</string>
<string id="30072">Every Day</string>
<string id="30073">Every Week</string>
<string id="30074">First Day of Month</string>
<string id="30075">Custom Schedule</string>
<string id="30076">Shutdown After Backup</string>
<string id="30077">Restart XBMC</string>
<string id="30078">You should restart XBMC to continue</string>
<string id="30079">Just Today</string>
<string id="30080">Profiles</string>
<string id="30081">Scheduler will run again on</string>
</strings>

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Esperanto language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/eo/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Generalo</string>
<string id="30023">Mode</string>
<string id="30032">Datinbanko</string>
<string id="30065">Dimanĉo</string>
<string id="30066">Lundo</string>
<string id="30067">Mardo</string>
<string id="30068">Merkredo</string>
<string id="30069">Ĵaŭdo</string>
<string id="30070">Vendredo</string>
<string id="30071">Sabato</string>
</strings>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Estonian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/et/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Üldine</string>
<string id="30023">Režiim</string>
<string id="30032">Andmebaas</string>
<string id="30033">Mängukava</string>
<string id="30061">Ajakava</string>
<string id="30065">pühapäev</string>
<string id="30066">esmaspäev</string>
<string id="30067">teisipäev</string>
<string id="30068">kolmapäev</string>
<string id="30069">neljapäev</string>
<string id="30070">reede</string>
<string id="30071">laupäev</string>
<string id="30077">Taaskäivita XBMC</string>
</strings>

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Finnish language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/fi/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Yleiset</string>
<string id="30016">Varmuuskopio</string>
<string id="30023">Tila</string>
<string id="30032">Tietokanta</string>
<string id="30033">Toistolista</string>
<string id="30061">Ajastus</string>
<string id="30065">sunnuntai</string>
<string id="30066">maanantai</string>
<string id="30067">tiistai</string>
<string id="30068">keskiviikko</string>
<string id="30069">torstai</string>
<string id="30070">perjantai</string>
<string id="30071">lauantai</string>
<string id="30077">Käynnistä XBMC uudelleen</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- French language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/fr/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">Sauvegarde XBMC</string>
<string id="30011">Général</string>
<string id="30012">Sélection des fichiers</string>
<string id="30013">Planification</string>
<string id="30016">Sauvegarde</string>
<string id="30017">Restauration</string>
<string id="30018">Parcourir</string>
<string id="30019">Saisir</string>
<string id="30020">Parcourir le chemin de sauvegarde</string>
<string id="30021">Nom du répertoire de sauvegarde</string>
<string id="30022">Mode silencieux</string>
<string id="30023">Mode</string>
<string id="30024">Saisir le chemin de sauvegarde</string>
<string id="30025">Mode de saisie du chemin</string>
<string id="30026">Sauvegardes à conserver (0 pour tous)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox Clé</string>
<string id="30029">Dropbox Secret</string>
<string id="30030">Addons de l'utilisaeur</string>
<string id="30031">Données des addons</string>
<string id="30032">Base de données</string>
<string id="30033">Playliste</string>
<string id="30034">Miniatures / Fanart</string>
<string id="30035">Fichiers de configuration</string>
<string id="30036">Répertoire personnalisé 1</string>
<string id="30037">Répertoire personnalisé 2</string>
<string id="30038">Paramètres avancés détectés</string>
<string id="30039">Le fichier advancedsettings doit être restauré d'abord</string>
<string id="30040">Sélectionner Oui pour restaurer ce fichier et redémarrer XBMC</string>
<string id="30041">Sélectionner Non pour continuer</string>
<string id="30042">Reprendre la restauration</string>
<string id="30043">XBMC Backup a détecté une restauration inachevée</string>
<string id="30044">Voulez-vous continuer ?</string>
<string id="30045">Erreur : chemin distant n'existe pas</string>
<string id="30046">Démarrage</string>
<string id="30047">Dossier Local</string>
<string id="30048">Dossier Distant</string>
<string id="30049">Collecte de la liste des fichiers</string>
<string id="30050">Le chemin distant existe - d'anciens fichiers peuvent s'y trouver !</string>
<string id="30051">Création de la liste des fichiers</string>
<string id="30052">Ecriture du fichier</string>
<string id="30053">Démarrage de la sauvegarde planifiée</string>
<string id="30054">Suppression de la sauvegarde</string>
<string id="30056">Vérifiez le journal pour vérifier l'URL de Dropbox</string>
<string id="30057">Cliquez sur OK s'il y est autorisé</string>
<string id="30058">Code développeur Dropbox nécessaire</string>
<string id="30059">Visit https://www.dropbox.com/developers</string>
<string id="30060">Activer le planificateur</string>
<string id="30061">Planifier</string>
<string id="30062">Heure</string>
<string id="30063">Jour de la semaine</string>
<string id="30064">Planification Cron</string>
<string id="30065">Dimanche</string>
<string id="30066">Lundi</string>
<string id="30067">Mardi</string>
<string id="30068">Mercredi</string>
<string id="30069">Jeudi</string>
<string id="30070">Vendredi</string>
<string id="30071">Samedi</string>
<string id="30072">Chaque jour</string>
<string id="30073">Chaque semaine</string>
<string id="30074">Premier jour du mois</string>
<string id="30075">Planification personnalisée</string>
<string id="30076">Arrêter après la sauvegarde</string>
<string id="30077">Redémarrer XBMC</string>
<string id="30078">Vous devez redémarrer XBMC pour continuer</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Galician language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/gl/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">Copia de seguranza de XBMC</string>
<string id="30011">Xeral</string>
<string id="30012">Selección de ficheiro</string>
<string id="30013">Programación</string>
<string id="30016">Copia de seguranza</string>
<string id="30017">Restaurar</string>
<string id="30018">Buscar Camiño</string>
<string id="30019">Escribir Camiño</string>
<string id="30020">Buscar Camiño Remoto</string>
<string id="30021">Nome do cartafol de copias de seguranza</string>
<string id="30022">Executar en segundo plano</string>
<string id="30023">Modo</string>
<string id="30024">Escribir Camiño Remoto</string>
<string id="30025">Tipo de Camiño Remoto</string>
<string id="30026">Copias de seguranza (0 para todas)</string>
<string id="30027">Dropbox</string>
<string id="30028">Clave de Dropbox</string>
<string id="30029">Secreto de Dropbox</string>
<string id="30030">Complementos de usuario</string>
<string id="30031">Datos dos complementos</string>
<string id="30032">Base de datos</string>
<string id="30033">Lista de reprodución</string>
<string id="30034">Miniaturas/Cartel</string>
<string id="30035">Ficheiros de configuración</string>
<string id="30036">Cartafol Personalizado 1</string>
<string id="30037">Cartafol Personalizado 2</string>
<string id="30038">Detectada a Configuración Avanzada</string>
<string id="30039">Deberíase restaurar primeiro o ficheiro da configuración avanzada</string>
<string id="30040">Seleccione Si para restaurar este ficheiro e reiniciar o XBMC</string>
<string id="30041">Seleccione Non para continuar</string>
<string id="30042">Continuar a Restauración</string>
<string id="30043">O Sistema de Copias do XBMC detectou unha restauración se rematar</string>
<string id="30044">Quere continuar?</string>
<string id="30045">Erro: O camiño remoto non existe</string>
<string id="30046">Iniciando</string>
<string id="30047">Cart Local</string>
<string id="30048">Cart Remoto</string>
<string id="30049">Recollendo listaxe de ficheiros</string>
<string id="30050">O Camiño Remoto xa existe e pode conter ficheiros antigos!</string>
<string id="30051">Creando listaxe de ficheiros</string>
<string id="30052">A escribir o ficheiro</string>
<string id="30053">Iniciando copia de seguridade programada</string>
<string id="30054">Eliminando copia de seguranza</string>
<string id="30056">Verificar o rexistro para o URL de autorización de Dropbox</string>
<string id="30057">Prema Aceptar cando teña autorización</string>
<string id="30058">É necesario o códido de desenvolvedor de Dropbox</string>
<string id="30059">Visite https://www.dropbox.com/developers</string>
<string id="30060">Habilitar programación</string>
<string id="30061">Programación</string>
<string id="30062">Hora do día</string>
<string id="30063">Día da semana</string>
<string id="30064">Programación Cron</string>
<string id="30065">Domingo</string>
<string id="30066">Luns</string>
<string id="30067">Martes</string>
<string id="30068">Mércores</string>
<string id="30069">Xoves</string>
<string id="30070">Venres</string>
<string id="30071">Sábado</string>
<string id="30072">Cada día</string>
<string id="30073">Cada semana</string>
<string id="30074">Primeiro día do mes</string>
<string id="30075">Programación Personalizada</string>
<string id="30076">Apagar despois de realizar a copia de seguranza</string>
<string id="30077">Reiniciar XBMC</string>
<string id="30078">Ten de restaurar o XBMC para continuar</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- German language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/de/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">Allgemein</string>
<string id="30012">Datenauswahl</string>
<string id="30013">Zeitplan</string>
<string id="30016">Sichern</string>
<string id="30017">Wiederherstellen</string>
<string id="30018">Verzeichnis wählen</string>
<string id="30019">Verzeichnis eintippen</string>
<string id="30020">Entferntes Verzeichnis wählen</string>
<string id="30021">Sicherungsverzeichnisname</string>
<string id="30022">Im Hintergrund arbeiten</string>
<string id="30023">Modus</string>
<string id="30024">Entferntes Verzeichnis</string>
<string id="30025">Typ Entferntes Verzeichnis</string>
<string id="30026">Zu behaltende Sicherheitskopien (0 für alle)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox Schlüssel</string>
<string id="30029">Dropbox Secret</string>
<string id="30030">Benutzer Addons</string>
<string id="30031">Addon Daten</string>
<string id="30032">Datenbanken</string>
<string id="30033">Playlisten</string>
<string id="30034">Thumbnails/Fanart</string>
<string id="30035">Config Dateien</string>
<string id="30036">Benutzerdefiniertes Verzeichnis 1</string>
<string id="30037">Benutzerdefiniertes Verzeichnis 2</string>
<string id="30038">Erweiterte Einstellungen entdeckt</string>
<string id="30039">Die Erweiterte Einstellungsdatei sollte zuerst wiederhergestellt werden</string>
<string id="30040">Wähle ja um diese Datei wiederherzustellen und XBMC neuzustarten</string>
<string id="30041">Wähle Nein um fortzufahren</string>
<string id="30042">Wiederherstellung fortsetzen</string>
<string id="30043">XBMC Backup hat eine nicht komplette Wiederherstellung entdeckt</string>
<string id="30044">Möchtest du fortfahren?</string>
<string id="30045">Fehler: Entferntes Verzeichnis nicht konfiguriert</string>
<string id="30046">Starte</string>
<string id="30047">Lokales Verzeichnis</string>
<string id="30048">Entferntes Verzeichnis</string>
<string id="30049">Dateiliste wird erzeugt</string>
<string id="30050">Entferntes Verzeichnis existiert - es könnte bereits Dateien beinhalten!</string>
<string id="30051">Dateiliste wird erzeugt</string>
<string id="30052">Schreibe Datei</string>
<string id="30053">Starte geplantes backup</string>
<string id="30054">Sicherheitskopie entfernen</string>
<string id="30056">Überprüfe den Log für die Dropbox-Autorisierungs URL.</string>
<string id="30057">Klicke OK, sobald du autorisiert bist.</string>
<string id="30058">Dropbox Developer Code benötigt</string>
<string id="30059">Besuche https://www.dropbox.com/developers</string>
<string id="30060">Zeitplaner einschalten</string>
<string id="30061">Zeitplan</string>
<string id="30062">Stunde</string>
<string id="30063">Wochentag</string>
<string id="30064">Cron Plan</string>
<string id="30065">Sonntag</string>
<string id="30066">Montag</string>
<string id="30067">Dienstag</string>
<string id="30068">Mittwoch</string>
<string id="30069">Donnerstag</string>
<string id="30070">Freitag</string>
<string id="30071">Samstag</string>
<string id="30072">Jeden Tag</string>
<string id="30073">Jede Woche</string>
<string id="30074">Erster Tag eines Monats</string>
<string id="30075">Benutzerdefiniert</string>
<string id="30076">Herunterfahren nach Backup</string>
<string id="30077">XBMC neu starten</string>
<string id="30078">Du solltest XBMC neu starten, um fortzufahren</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Greek language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/el/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">Αντίγραφο Ασφαλείας XBMC</string>
<string id="30011">Γενικά</string>
<string id="30012">Επιλογή Αρχείου</string>
<string id="30013">Προγραμματισμός</string>
<string id="30016">Δημιουργία Αντιγράφου</string>
<string id="30017">Επαναφορά</string>
<string id="30018">Εντοπισμός της Διαδρομής</string>
<string id="30019">Πληκτρολόγηση της Διαδρομής</string>
<string id="30020">Εντοπισμός Απομακρυσμένης Διαδρομής</string>
<string id="30021">Όνομα Φακέλου Αντιγράφου Ασφαλείας</string>
<string id="30022">Σιωπηρή Εκτέλεση</string>
<string id="30023">Μέθοδος</string>
<string id="30024">Πληκτρολόγηση Απομακρυσμένης Διαδρομής</string>
<string id="30025">Τύπος Απομακρυσμένης Διαδρομής</string>
<string id="30026">Πόσα αντίγραφα να διατηρηθούν (0 για όλα)</string>
<string id="30027">Dropbox</string>
<string id="30028">Κλειδί Dropbox</string>
<string id="30029">Μυστικό Dropbox</string>
<string id="30030">Πρόσθετα Χρήστη</string>
<string id="30031">Δεδομένα Πρόσθετου</string>
<string id="30032">Βάση δεδομένων</string>
<string id="30033">Λίστα Αναπαραγωγής</string>
<string id="30034">Μικρογραφίες/Fanart</string>
<string id="30035">Αρχεία Ρυθμίσεων</string>
<string id="30036">Προσαρμοσμένος Φάκελος 1</string>
<string id="30037">Προσαρμοσμένος Φάκελος 2</string>
<string id="30038">Εντοπίστηκαν Προηγμένες Ρυθμίσεις (Advanced Settings)</string>
<string id="30039">Το αρχείο advancedsettings πρέπει να επαναφερθεί πρώτο</string>
<string id="30040">Select Yes to restore this file and restart XBMC</string>
<string id="30041">Επιλέξτε Όχι για να συνεχίσετε</string>
<string id="30042">Συνέχιση Επαναφοράς</string>
<string id="30043">Το XBMC Backup εντόπισε μια μη ολοκληρωμένη επαναφορά</string>
<string id="30044">Επιθυμείτε να συνεχίσετε;</string>
<string id="30045">Σφάλμα: Δεν υπάρχει η απομακρυσμένη διαδρομή</string>
<string id="30046">Έναρξη</string>
<string id="30047">Τοπικός Φάκελος</string>
<string id="30048">Απομακρυσμένος Φάκελος</string>
<string id="30049">Συγκέντρωση λίστας αρχείων</string>
<string id="30050">Η Απομακρυσμένη Διαδρομή υπάρχει - μπορεί να έχει ήδη αρχεία μέσα!</string>
<string id="30051">Δημιουργία Λίστας Αρχείων</string>
<string id="30052">Εγγραφή αρχείου</string>
<string id="30053">Έναρξη προγραμματισμένου αντιγράφου ασφαλείας</string>
<string id="30054">Αφαίρεση αντιγράφου</string>
<string id="30056">Ελέγξτε το αρχείο καταγραφής για τη διεύθυνση URL έγκρισης του Dropbox</string>
<string id="30057">Πιέστε 'Επιλογή' κατά την έγκριση</string>
<string id="30058">Απαιτείται Κωδικός Προγραμματιστή Dropbox</string>
<string id="30059">Επισκεφθείτε το https://www.dropbox.com/developers</string>
<string id="30060">Ενεργοποίηση Προγραμματισμού</string>
<string id="30061">Προγραμματισμός</string>
<string id="30062">Ώρα της Μέρας</string>
<string id="30063">Μέρα της Εβδομάδας</string>
<string id="30064">Προγραμματισμός Cron</string>
<string id="30065">Κυριακή</string>
<string id="30066">Δευτέρα</string>
<string id="30067">Τρίτη</string>
<string id="30068">Τετάρτη</string>
<string id="30069">Πέμπτη</string>
<string id="30070">Παρασκευή</string>
<string id="30071">Σάββατο</string>
<string id="30072">Κάθε Μέρα</string>
<string id="30073">Κάθε Εβδομάδα</string>
<string id="30074">Πρώτη του Μηνός</string>
<string id="30075">Προσαρμοσμένος Προγραμματισμός</string>
<string id="30076">Τερματισμός μετά τη δημιουργία Αντιγράφου</string>
<string id="30077">Επανεκκίνηση XBMC</string>
<string id="30078">Πρέπει να επανεκκινήσετε το XBMC για να συνεχίσετε</string>
</strings>

View File

@@ -1,62 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Hebrew language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/he/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">גיבוי XBMC</string>
<string id="30011">כללי</string>
<string id="30012">בחירת קובץ</string>
<string id="30013">תזמון</string>
<string id="30016">גיבוי</string>
<string id="30017">שחזור</string>
<string id="30018">עיין נתיב</string>
<string id="30019">הזן נתיב</string>
<string id="30020">עיין נתיב מרוחק</string>
<string id="30021">שם תיקיית גיבוי</string>
<string id="30022">ריצה שקטה</string>
<string id="30023">מצב</string>
<string id="30024">הזן נתיב מרוחק</string>
<string id="30025">סוג נתיב מרוחק</string>
<string id="30026">גיבויים לשמירה (0 להכול)</string>
<string id="30027">דרופבוקס</string>
<string id="30030">הרחבות משתמש</string>
<string id="30031">נתוני הרחבה</string>
<string id="30032">מסד נתונים</string>
<string id="30033">רשימת השמעה</string>
<string id="30034">תמונות ממוזערות/פאנארט</string>
<string id="30035">קבצי הגדרה</string>
<string id="30042">המשך שחזור</string>
<string id="30044">אתה רוצה להמשיך?</string>
<string id="30045">שגיאה: נתיב מרוחק אינו קיים</string>
<string id="30046">מתחיל</string>
<string id="30047">כונן מקומי</string>
<string id="30048">כונן מרוחק</string>
<string id="30049">אוסף רשימת קבצים</string>
<string id="30050">נתיב מרוחק נמצא - ייתכן שיש בתיקיה זו קבצים ישנים!</string>
<string id="30051">יוצר רשימת קבצים</string>
<string id="30052">כותב קובץ</string>
<string id="30053">התחלת גיבוי מתוזמן</string>
<string id="30054">מסיר גיבויים</string>
<string id="30056">דוק יומן רישום לכתובת דרום בוקס מאושרת</string>
<string id="30057">לחץ אישור כשמאושר</string>
<string id="30060">הפעל מתזמן</string>
<string id="30061">תזמון</string>
<string id="30062">שעה ביום</string>
<string id="30063">יום בשבוע</string>
<string id="30064">Cron Schedule</string>
<string id="30065">יום ראשון</string>
<string id="30066">יום שני</string>
<string id="30067">יום שלישי</string>
<string id="30068">יום רביעי</string>
<string id="30069">יום חמישי</string>
<string id="30070">יום שישי</string>
<string id="30071">יום שבת</string>
<string id="30072">כל יום</string>
<string id="30073">כל שבוע</string>
<string id="30074">יום ראשון של החודש</string>
<string id="30075">תזמון מותאם אישית</string>
<string id="30076">לכבות לאחר הגיבוי</string>
<string id="30077">הפעל מחדש XBMC</string>
<string id="30078">אתה להפעיל את XBMC מחדש כדי להמשיך</string>
</strings>

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Hindi (Devanagiri) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/hi/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">सामान्य</string>
<string id="30023">विधि</string>
<string id="30033">प्लेलिस्ट</string>
<string id="30065">रविवार</string>
<string id="30066">सोमवार</string>
<string id="30067">मंगलवार</string>
<string id="30068">बुधवार</string>
<string id="30069">गुरूवार</string>
<string id="30070">शुक्रवार</string>
<string id="30071">शनिवार</string>
</strings>

View File

@@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Hungarian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/hu/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC biztonsági mentés</string>
<string id="30011">Általános</string>
<string id="30012">Fájlok kiválasztás</string>
<string id="30013">Időzítés</string>
<string id="30016">Biztonsági mentés</string>
<string id="30017">Visszaállítás</string>
<string id="30018">Útvonal tallózása</string>
<string id="30019">Adja meg az útvonalat</string>
<string id="30020">Távoli útvonal tallózása</string>
<string id="30021">Biztonsási mentés mappa neve</string>
<string id="30022">Néma futtatás</string>
<string id="30023">Mód</string>
<string id="30024">Adja meg a távoli útvonalat</string>
<string id="30025">Távoli útvonal típusa</string>
<string id="30026">Megtartandó mentések száma (0, ha mindet)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox key</string>
<string id="30029">Dropbox secret</string>
<string id="30030">Felhasználói kiegészítők</string>
<string id="30031">Kiegészítő adatok</string>
<string id="30032">Adatbázis</string>
<string id="30033">Lejátszási lista</string>
<string id="30034">Bélyegképek / Rajongói képek</string>
<string id="30035">Konfigurációs fájlok</string>
<string id="30036">Saját könyvtár 1</string>
<string id="30037">Saját könyvtár 2</string>
<string id="30045">Hiba: A távoli útvonal nem létezik</string>
<string id="30046">Kezdődik</string>
<string id="30047">Helyi könyvtár</string>
<string id="30048">Távoli könyvtár</string>
<string id="30049">Fájl lista összegyüjtése</string>
<string id="30050">A távoli útvonal létezik - régi fájlok lehetnek benne!</string>
<string id="30051">Fájl lista létrehozása</string>
<string id="30052">Fájl írása</string>
<string id="30053">Időzített mentés kezdete</string>
<string id="30054">Mentés törlése</string>
<string id="30056">Ellenőrizze a naplófájlt a Dropbox bejelentkezési URL-hez</string>
<string id="30057">Nyomja meg az OK-t ha bejelentkezett</string>
<string id="30058">Dropbox fejlesztői kód szükséges</string>
<string id="30059">További információ: https://www.dropbox.com/developers</string>
<string id="30060">Időzítő engedélyezése</string>
<string id="30061">Időzítés</string>
<string id="30062">A nap órája</string>
<string id="30063">A hét napja</string>
<string id="30064">Cron időzítő</string>
<string id="30065">Vasárnap</string>
<string id="30066">Hétfő</string>
<string id="30067">Kedd</string>
<string id="30068">Szerda</string>
<string id="30069">Csütörtök</string>
<string id="30070">Péntek</string>
<string id="30071">Szombat</string>
<string id="30072">Minden nap</string>
<string id="30073">Minden Héten</string>
<string id="30074">A hónap első napján</string>
<string id="30075">Egyéni időzítő</string>
<string id="30076">Leállítás a biztonsági mentés után</string>
<string id="30077">XBMC újraindítása</string>
</strings>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Icelandic language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/is/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Almennt</string>
<string id="30023">Hamur</string>
<string id="30032">Gagnagrunnur</string>
<string id="30033">Lagalista</string>
<string id="30061">Dagskrá</string>
<string id="30065">Sunnudagur</string>
<string id="30066">Mánudagur</string>
<string id="30067">Þriðjudagur</string>
<string id="30068">Miðvikudagur</string>
<string id="30069">Fimmtudagur</string>
<string id="30070">Föstudagur</string>
<string id="30071">Laugardagur</string>
<string id="30077">Endurræsa XBMC</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Indonesian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/id/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Umum</string>
<string id="30023">Mode</string>
<string id="30032">Database</string>
<string id="30033">Daftar Main</string>
<string id="30065">Minggu</string>
<string id="30066">Senin</string>
<string id="30067">Selasa</string>
<string id="30068">Rabu</string>
<string id="30069">Kamis</string>
<string id="30070">Jumat</string>
<string id="30071">Sabtu</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Italian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/it/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">Backup XBMC</string>
<string id="30011">Generale</string>
<string id="30012">Selezione File</string>
<string id="30013">Pianificazione</string>
<string id="30016">Backup</string>
<string id="30017">Ripristina</string>
<string id="30018">Seleziona percorso</string>
<string id="30019">Scrivi percorso</string>
<string id="30020">Seleziona percorso remoto</string>
<string id="30021">Nome cartella backup</string>
<string id="30022">Avvio silenzioso</string>
<string id="30023">Modalità</string>
<string id="30024">Scrivi percorso remoto</string>
<string id="30025">Tipo percorso remoto</string>
<string id="30026">Backup da mantenere (0 per conservarli tutti)</string>
<string id="30027">Dropbox</string>
<string id="30028">Chiave Dropbox</string>
<string id="30029">Segreto Dropbox</string>
<string id="30030">Add-on dell'utente</string>
<string id="30031">Dati add-on</string>
<string id="30032">Banca dati</string>
<string id="30033">Lista di riproduzione</string>
<string id="30034">Anteprime/Fanart</string>
<string id="30035">File di Configurazione</string>
<string id="30036">Directory Personalizzata 1</string>
<string id="30037">Directory Personalizzata 2</string>
<string id="30038">Rilevate Impostazioni Avanzate</string>
<string id="30039">Il file advancedsettings dovrebbe essere ripristinato prima</string>
<string id="30040">Seleziona Si per rirpistinare questo file e riavvia XBMC</string>
<string id="30041">Selezione No per contunuare</string>
<string id="30042">Riprendi Rirpistino</string>
<string id="30043">XBMC Backup ha rilevato un errore</string>
<string id="30044">Vuoi continuare?</string>
<string id="30045">Error: Percorso remoto inesistente</string>
<string id="30046">Avvio in corso</string>
<string id="30047">Cartella Locale</string>
<string id="30048">Cartella Remota</string>
<string id="30049">Ottenimento lista file</string>
<string id="30050">Il percorso remoto è già esistente - dei file vecchi potrebbero già essere presenti!</string>
<string id="30051">Creazione lista file</string>
<string id="30052">Scrittura file</string>
<string id="30053">Inizio backup pianificato</string>
<string id="30054">Rimozione backup in corso</string>
<string id="30056">Controlla log per URL autorizzazione di Dropbox</string>
<string id="30057">Premi OK dopo l'autorizzazione</string>
<string id="30058">Codice Sviluppatore Dropbox Necessario</string>
<string id="30059">Visita https://www.dropbox.com/developers</string>
<string id="30060">Abilita pianificazione</string>
<string id="30061">Palinsesto</string>
<string id="30062">Ora del Giorno</string>
<string id="30063">Giorno della Settimana</string>
<string id="30064">Pianificazione Cron</string>
<string id="30065">Domenica</string>
<string id="30066">Lunedì</string>
<string id="30067">Martedì</string>
<string id="30068">Mercoledì</string>
<string id="30069">Giovedì</string>
<string id="30070">Venerdì</string>
<string id="30071">Sabato</string>
<string id="30072">Ogni Giorno</string>
<string id="30073">Ogni Settimana</string>
<string id="30074">Primo Giorno del Mese</string>
<string id="30075">Pianificazione personalizzata</string>
<string id="30076">Spegni dopo avere effettuato il backup</string>
<string id="30077">Riavvia XBMC</string>
<string id="30078">Dovresti riavviare XBMC per continuare</string>
</strings>

View File

@@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Japanese language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ja/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC バックアップ</string>
<string id="30011">一般</string>
<string id="30012">ファイル選択</string>
<string id="30013">スケジューリング</string>
<string id="30016">バックアップ</string>
<string id="30017">リストア</string>
<string id="30018">パスをブラウズ</string>
<string id="30019">パスを入力</string>
<string id="30020">リモートパスをブラウズ</string>
<string id="30021">バックアップフォルダ名</string>
<string id="30022">静かに実行</string>
<string id="30023">モード</string>
<string id="30024">リモートパスを入力</string>
<string id="30025">リモートパスのタイプ</string>
<string id="30026">保持するバックアップ (0 = 全部)</string>
<string id="30027">Dropbox</string>
<string id="30030">ユーザーアドオン</string>
<string id="30031">アドオンのデータ</string>
<string id="30032">データベース</string>
<string id="30033">プレイリスト</string>
<string id="30034">サムネール/ファンアート</string>
<string id="30035">設定ファイル</string>
<string id="30045">エラー:リモートパスが存在しません</string>
<string id="30046">開始中</string>
<string id="30047">ローカルディレクトリ</string>
<string id="30048">リモートディレクトリ</string>
<string id="30049">ファイル一覧を取得中</string>
<string id="30050">リモートパスが存在します - 古いファイルが残っているのかも!</string>
<string id="30051">ファイルリストを作成中</string>
<string id="30052">ファイル書き込み中</string>
<string id="30053">スケジュールバックアップを開始中</string>
<string id="30054">バックアップを削除中</string>
<string id="30056">Dropbox の認証URL はログを確認してください</string>
<string id="30057">認証が済んだらOKをクリックしてください</string>
<string id="30060">スケジューラを有効にする</string>
<string id="30061">スケジュール</string>
<string id="30062">時刻</string>
<string id="30063">曜日</string>
<string id="30064">Cron スケジュール</string>
<string id="30065">日曜日</string>
<string id="30066">月曜日</string>
<string id="30067">火曜日</string>
<string id="30068">水曜日</string>
<string id="30069">木曜日</string>
<string id="30070">金曜日</string>
<string id="30071">土曜日</string>
<string id="30072">毎日</string>
<string id="30073">毎週</string>
<string id="30074">毎月1日</string>
<string id="30075">カスタムスケジュール</string>
</strings>

View File

@@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Korean language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ko/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC 백업</string>
<string id="30011">일반</string>
<string id="30012">파일 선택</string>
<string id="30013">스케쥴</string>
<string id="30016">백업</string>
<string id="30017">복구</string>
<string id="30018">경로 탐색</string>
<string id="30019">경로 입력</string>
<string id="30020">원격 경로 탐색</string>
<string id="30021">백업 폴더명</string>
<string id="30022">자동 실행</string>
<string id="30023">모드</string>
<string id="30024">원격 경로 입력</string>
<string id="30025">원격 경로 유형</string>
<string id="30026">유지할 백업 (0은 모두 유지)</string>
<string id="30027">Dropbox</string>
<string id="30030">사용자 애드온</string>
<string id="30031">애드온 데이터</string>
<string id="30032">데이타베이스</string>
<string id="30033">재생목록</string>
<string id="30034">썸네일/팬아트</string>
<string id="30035">설정 파일</string>
<string id="30045">오류: 존재하지 않는 원격 경로</string>
<string id="30046">시작</string>
<string id="30047">로컬 디렉토리</string>
<string id="30048">원격 디렉토리</string>
<string id="30049">파일 목록을 가져오는 중</string>
<string id="30050">원격 경로 있음 - 오래된 파일이 있습니다!</string>
<string id="30051">파일 목록 작성 중</string>
<string id="30052">파일을 쓰는 중</string>
<string id="30053">예약된 백업 시작</string>
<string id="30054">백업 삭제</string>
<string id="30060">예약 사용</string>
<string id="30061">예약</string>
<string id="30062">시간</string>
<string id="30063">요일</string>
<string id="30064">Cron 예약</string>
<string id="30065">일요일</string>
<string id="30066">월요일</string>
<string id="30067">화요일</string>
<string id="30068">수요일</string>
<string id="30069">목요일</string>
<string id="30070">금요일</string>
<string id="30071">토요일</string>
<string id="30072">매일</string>
<string id="30073">매주</string>
<string id="30074">매월 첫 날</string>
<string id="30075">사용자 예약</string>
<string id="30077">XBMC 재시작</string>
</strings>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Latvian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/lv/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Vispārīgi</string>
<string id="30065">Svētdiena</string>
<string id="30066">Pirmdiena</string>
<string id="30067">Otrdiena</string>
<string id="30068">Trešdiena</string>
<string id="30069">Ceturtdiena</string>
<string id="30070">Piektdiena</string>
<string id="30071">Sestdiena</string>
</strings>

View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Lithuanian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/lt/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC atsarginė kopija</string>
<string id="30011">Pagrindinis</string>
<string id="30012">Failo parinkimas</string>
<string id="30013">Planavimas</string>
<string id="30016">Atsarginė kopija</string>
<string id="30017">Atkurti</string>
<string id="30018">Naršymo kelias</string>
<string id="30019">Tipo/rūšies kelias</string>
<string id="30020">Nuotolinio kelio peržiūra</string>
<string id="30021">Atsarginių kopijų aplanko pavadinimas</string>
<string id="30022">Tylus paleidimas</string>
<string id="30023">Režimas</string>
<string id="30024">Įveskite nuotolinį vadymo kelią</string>
<string id="30025">Nuotolinį vadymo kelio tipas</string>
<string id="30026">Atsarginių kopijų laikymas/saugojimas (0 visiems)</string>
<string id="30027">Dropbox</string>
<string id="30030">Vartotojo komplektacija</string>
<string id="30031">Priedo duomenys</string>
<string id="30032">Duomenų bazė</string>
<string id="30033">Grojaraštis</string>
<string id="30034">Miniatiūros/FanArt</string>
<string id="30035">Konfigūracijos failai</string>
<string id="30045">Klaida: Nuotolinis kelias neegzistuoja</string>
<string id="30046">Paleidimas</string>
<string id="30047">Vietos kryptis</string>
<string id="30048">Nuotolinio valdymo kryptis</string>
<string id="30049">Gauti failų sąrašą</string>
<string id="30050">Nuotolinio valdymo Kelias egzistuoja - jame gali būti senų failų!</string>
<string id="30051">Sukurti failų sąrašą</string>
<string id="30052">Kūrti/rašyti failą</string>
<string id="30053">Paleiti suplanuotą atsarginę kopiją</string>
<string id="30054">Pa6alinti atsarginę kopiją</string>
<string id="30056">Patikrinti URL prisijungimą prie Dropbox</string>
<string id="30057">Spauskite OK, kai leidžiama</string>
<string id="30060">Įjungti planavimą</string>
<string id="30061">Planuoti</string>
<string id="30062">Diena ir valanda</string>
<string id="30063">Savaitės diena</string>
<string id="30064">Planuoti 'Cron'</string>
<string id="30065">Sekmadienis</string>
<string id="30066">Pirmadienis</string>
<string id="30067">Antradienis</string>
<string id="30068">Trečiadienis</string>
<string id="30069">Ketvirtadienis</string>
<string id="30070">Penktadienis</string>
<string id="30071">Šeštadienis</string>
<string id="30072">Kasdien</string>
<string id="30073">Kiekvieną savaitę</string>
<string id="30074">Pirmą mėnesio dieną</string>
<string id="30075">Individualus tvarkaraštis</string>
<string id="30076">Išjungti kompiuterį baigus atsarginę kopiją</string>
<string id="30077">Perkrauti XBMC</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Macedonian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/mk/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Општо</string>
<string id="30023">Режим</string>
<string id="30032">База на податоци</string>
<string id="30033">Список за реп.</string>
<string id="30065">Недела</string>
<string id="30066">Понеделник</string>
<string id="30067">Вторник</string>
<string id="30068">Среда</string>
<string id="30069">Четврток</string>
<string id="30070">Петок</string>
<string id="30071">Сабота</string>
</strings>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Malay language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ms/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Am</string>
<string id="30065">Ahad</string>
<string id="30066">Isnin</string>
<string id="30067">Selasa</string>
<string id="30068">Rabu</string>
<string id="30069">Khamis</string>
<string id="30070">Jumaat</string>
<string id="30071">Sabtu</string>
</strings>

View File

@@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Malayalam language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ml/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">പോതുവായത്</string>
<string id="30062">ദിവസത്തില്‍ ഒരു മണിക്കൂര്‍</string>
<string id="30063">ആഴ്ചയില്‍ ഒരു ദിവസം</string>
<string id="30065">ഞായര്‍</string>
<string id="30066">തിങ്കള്‍</string>
<string id="30067">ചൊവ്വ</string>
<string id="30068">ബുധന്‍</string>
<string id="30069">വ്യാഴം</string>
<string id="30070">വെള്ളി</string>
<string id="30071">ശനി</string>
<string id="30072">എല്ലാ ദിവസവും</string>
<string id="30073">എല്ലാ ആഴ്ചയും</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Maltese language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/mt/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Ġenerali</string>
<string id="30023">Mode:</string>
<string id="30032">Database</string>
<string id="30033">Playlist</string>
<string id="30065">Il-Ħadd</string>
<string id="30066">It-Tnejn</string>
<string id="30067">It-Tlieta</string>
<string id="30068">L-Erbgħa</string>
<string id="30069">Il-Ħamis</string>
<string id="30070">Il-Ġimgħa</string>
<string id="30071">Is-Sibt</string>
</strings>

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Norwegian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/no/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Generelt</string>
<string id="30016">Sikkerhetskopiering</string>
<string id="30017">Gjenopprett</string>
<string id="30023">Modus</string>
<string id="30027">Dropbox</string>
<string id="30032">Database</string>
<string id="30033">Spilleliste</string>
<string id="30062">Time</string>
<string id="30063">Dag</string>
<string id="30065">Søndag</string>
<string id="30066">Mandag</string>
<string id="30067">Tirsdag</string>
<string id="30068">Onsdag</string>
<string id="30069">Torsdag</string>
<string id="30070">Fredag</string>
<string id="30071">Lørdag</string>
<string id="30073">Hver uke</string>
<string id="30074">Første dag i måneden</string>
</strings>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Persian (Iran) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/fa_IR/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">عمومی</string>
<string id="30032">پایگاه داده</string>
<string id="30033">لیست پخش</string>
</strings>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Persian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/fa/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">عمومی</string>
<string id="30065">یک‌شنبه</string>
<string id="30066">دوشنبه</string>
<string id="30067">سه‌شنبه</string>
<string id="30068">چهارشنبه</string>
<string id="30069">پنج‌شنبه</string>
<string id="30070">جمعه</string>
<string id="30071">شنبه</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Polish language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/pl/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">Kopia bezpieczeństwa XBMC</string>
<string id="30011">Ogólne</string>
<string id="30012">Wybór pliku</string>
<string id="30013">Planowanie</string>
<string id="30016">Kopia bezpieczeństwa</string>
<string id="30017">Przywracanie</string>
<string id="30018">Przeglądaj ścieżkę</string>
<string id="30019">Wpisz ścieżkę</string>
<string id="30020">Przeglądaj zdalną ścieżkę</string>
<string id="30021">Nazwa folderu Kopii bezpieczeństwa</string>
<string id="30022">Uruchom w trybie cichym</string>
<string id="30023">Tryb</string>
<string id="30024">Wpisz ścieżkę zdalną</string>
<string id="30025">Typ zdalnej ścieżki</string>
<string id="30026">Kopie bezpieczeństwa do przechowywania (0 dla wszystkich)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox Key</string>
<string id="30029">Dropbox Secret</string>
<string id="30030">Dodatki użytkownika</string>
<string id="30031">Dane dodatków</string>
<string id="30032">Baza danych</string>
<string id="30033">Playlista</string>
<string id="30034">Miniatury/Fanart</string>
<string id="30035">Pliki koniguracyjne</string>
<string id="30036">Własny katalog 1</string>
<string id="30037">Własny katalog 2</string>
<string id="30038">Wykryto Ustawienia Zaawansowane</string>
<string id="30039">Plik advancedsettings powinien być najpierw zrestartowany</string>
<string id="30040">Zaznacz Tak by odtworzyć ten plik i zrestartować XBMC</string>
<string id="30041">Wybierz Nie by kontykuować</string>
<string id="30042">Wznów Przywracanie</string>
<string id="30043">XBMC Backup wykrył niedokończone przyrwacanie</string>
<string id="30044">Czy chciałbyś kontynuować?</string>
<string id="30045">Błąd: Zdalna ścieżka nie istnieje</string>
<string id="30046">Uruchamiam</string>
<string id="30047">Lokalny katalog</string>
<string id="30048">Zdalny katalog</string>
<string id="30049">Zbieram liste plików</string>
<string id="30050">Zdalna ścieżka istnieje - może zawierać stare dane!!</string>
<string id="30051">Tworzę liste plików</string>
<string id="30052">Zapisuję plik</string>
<string id="30053">Uruchamiam zaplanowaną kopię bezpieczeństwa</string>
<string id="30054">Usuwanie kopii bezpieczeństwa</string>
<string id="30056">Sprawdź logi aby zobaczyć adres autoryzacji Dropbox </string>
<string id="30057">Po zautoryzowaniu naciśnij OK</string>
<string id="30058">Potrzebny Dropbox Developer Code</string>
<string id="30059">Odwiedź https://www.dropbox.com/developers</string>
<string id="30060">Uruchom planowanie</string>
<string id="30061">Plan</string>
<string id="30062">Godzina dnia</string>
<string id="30063">Dzień tygodnia</string>
<string id="30064">Plan chronologiczny</string>
<string id="30065">Niedziela</string>
<string id="30066">Poniedziałek</string>
<string id="30067">Wtorek</string>
<string id="30068">Środa</string>
<string id="30069">Czwartek</string>
<string id="30070">Piątek</string>
<string id="30071">Sobota</string>
<string id="30072">Każdy dzień</string>
<string id="30073">Każdy tydzień</string>
<string id="30074">Pierwszy dzień miesiąca</string>
<string id="30075">Własny plan</string>
<string id="30076">Wyłącz system po zrobieniu kopii zapasowej</string>
<string id="30077">Restartuj XBMC</string>
<string id="30078">Powinieneś zrestartować XBMC by kontynuować</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Portuguese (Brazil) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/pt_BR/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">Geral</string>
<string id="30012">Seleção de arquivo</string>
<string id="30013">Agendando</string>
<string id="30016">Backup</string>
<string id="30017">Restauração</string>
<string id="30018">Procurar caminho</string>
<string id="30019">Digite o caminho</string>
<string id="30020">Procurar caminho remoto</string>
<string id="30021">Nome da pasta de backup</string>
<string id="30022">Rodar em silêncio</string>
<string id="30023">Modo</string>
<string id="30024">Digite o caminho remoto</string>
<string id="30025">Tipo de caminho remoto</string>
<string id="30026">Backups para manter (0 para todos)</string>
<string id="30027">Dropbox</string>
<string id="30028">Chave Dropbox</string>
<string id="30029">Segredo Dropbox</string>
<string id="30030">Addons do usuário</string>
<string id="30031">Dados do addon</string>
<string id="30032">Banco de dados</string>
<string id="30033">Lista de reprodução</string>
<string id="30034">Miniaturas/Fanart</string>
<string id="30035">Arquivos de configuração</string>
<string id="30036">Diretório personalizado 1</string>
<string id="30037">Diretório personalizado 2</string>
<string id="30038">Configurações avançadas detectadas</string>
<string id="30039">O arquivo advancedsettings deve ser restaurado antes</string>
<string id="30040">Selecione Sim para restaurar este arquivo e reiniciar o XBMC</string>
<string id="30041">Selecione Não para continuar</string>
<string id="30042">Retomar Restauração</string>
<string id="30043">O XBMC Backup detectou uma restauração não finalizada</string>
<string id="30044">Gostaria de continuar?</string>
<string id="30045">Erro: Caminho remoto inexistente</string>
<string id="30046">Iniciando</string>
<string id="30047">Diretório local</string>
<string id="30048">Diretório remoto</string>
<string id="30049">Reunindo lista de arquivos</string>
<string id="30050">Caminho remoto existente - pode conter arquivos antigos nele!</string>
<string id="30051">Criando lista de arquivos</string>
<string id="30052">Escrevendo arquivo</string>
<string id="30053">Iniciando backup agendado</string>
<string id="30054">Removendo backup</string>
<string id="30056">Verifique o log da URL de autorização do Dropbox</string>
<string id="30057">Clique OK quando autorizado</string>
<string id="30058">Necessário código de desenvolvedor Dropbox</string>
<string id="30059">Visite https://www.dropbox.com/developers</string>
<string id="30060">Habilitar agendamento</string>
<string id="30061">Agenda</string>
<string id="30062">Hora do Dia</string>
<string id="30063">Dia da Semana</string>
<string id="30064">Agenda Cron</string>
<string id="30065">Domingo</string>
<string id="30066">Segunda</string>
<string id="30067">Terça</string>
<string id="30068">Quarta</string>
<string id="30069">Quinta</string>
<string id="30070">Sexta</string>
<string id="30071">Sábado</string>
<string id="30072">Todo dia</string>
<string id="30073">Toda semana</string>
<string id="30074">Primeiro dia do mês</string>
<string id="30075">Agenda customizada</string>
<string id="30076">Desligar após backup</string>
<string id="30077">Reiniciar XBMC</string>
<string id="30078">Você deve reiniciar o XBMC para continuar</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Portuguese language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/pt/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">Geral</string>
<string id="30012">Selecção de ficheiros</string>
<string id="30013">Agendamento</string>
<string id="30016">Cópia Segurança</string>
<string id="30017">Restaurar</string>
<string id="30018">Procurar Localização</string>
<string id="30019">Introduzir Localização</string>
<string id="30020">Procurar Localização Remota</string>
<string id="30021">Nome da pasta de cópia</string>
<string id="30022">Iniciar Silenciosamente</string>
<string id="30023">Modo</string>
<string id="30024">Introduza a localização remota</string>
<string id="30025">Tipo de localização remota</string>
<string id="30026">Número de cópias a manter (0 para manter todas)</string>
<string id="30027">Dropbox</string>
<string id="30028">Chave Dropbox</string>
<string id="30029">Segredo Dropbox</string>
<string id="30030">Add-ons do utilizador</string>
<string id="30031">Dados dos add-ons</string>
<string id="30032">Base de Dados</string>
<string id="30033">Lista de reprodução</string>
<string id="30034">Miniaturas/Fanart</string>
<string id="30035">Ficheiros de configuração</string>
<string id="30036">Pasta Personalizada 1</string>
<string id="30037">Pasta Personalizada 2</string>
<string id="30038">Definições Avançadas Detectadas</string>
<string id="30039">O ficheiro advancedsettings deve ser restaurado em primeiro lugar</string>
<string id="30040">Seleccione Sim para restaurar este ficheiro e reiniciar o XBMC</string>
<string id="30041">Seleccione Não para continuar</string>
<string id="30042">Retomar a Restauração</string>
<string id="30043">O XBMC Backup detectou uma restauração incompleta</string>
<string id="30044">Quer continuá-la?</string>
<string id="30045">Erro: a localização remota não existe</string>
<string id="30046">Iniciando</string>
<string id="30047">Pasta local</string>
<string id="30048">Pasta remota</string>
<string id="30049">Reunindo lista de ficheiros</string>
<string id="30050">Localização remota já existe - pode contar ficheiros antigos!</string>
<string id="30051">Criando lista de ficheiros</string>
<string id="30052">Gravando ficheiro</string>
<string id="30053">Iniciando cópia agendada</string>
<string id="30054">Removendo a cópia de segurança</string>
<string id="30056">Verifique o log para o URL de autorização Dropbox</string>
<string id="30057">Clique OK quando estiver autorizado</string>
<string id="30058">É necessário o código de programador do dropbox</string>
<string id="30059">Visite https://www.dropbox.com/developers</string>
<string id="30060">Activar Agendamento</string>
<string id="30061">Agendamento</string>
<string id="30062">Hora do Dia</string>
<string id="30063">Dia da Semana</string>
<string id="30064">Agendamento Cron</string>
<string id="30065">Domingo</string>
<string id="30066">Segunda</string>
<string id="30067">Terça</string>
<string id="30068">Quarta</string>
<string id="30069">Quinta</string>
<string id="30070">Sexta</string>
<string id="30071">Sábado</string>
<string id="30072">Diariamente</string>
<string id="30073">Semanalmente</string>
<string id="30074">Primeiro Dia do Mês</string>
<string id="30075">Agendamento Personalizado</string>
<string id="30076">Desligar após cópia de segurança</string>
<string id="30077">Reiniciar XBMC</string>
<string id="30078">Tem de reiniciar o XBMC para continuar</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Romanian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ro/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">General</string>
<string id="30023">Mod</string>
<string id="30032">Bază de date</string>
<string id="30033">Listă de redare</string>
<string id="30065">Duminică</string>
<string id="30066">Luni</string>
<string id="30067">Marți</string>
<string id="30068">Miercuri</string>
<string id="30069">Joi</string>
<string id="30070">Vineri</string>
<string id="30071">Sâmbătă</string>
</strings>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Russian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ru/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Выкл.</string>
<string id="30023">Режим</string>
<string id="30032">База данных</string>
<string id="30033">Плейлист</string>
<string id="30061">Расписание</string>
<string id="30065">Воскресенье</string>
<string id="30066">Понедельник</string>
<string id="30067">Вторник</string>
<string id="30068">Среда</string>
<string id="30069">Четверг</string>
<string id="30070">Пятница</string>
<string id="30071">Суббота</string>
<string id="30077">Перезапустить XBMC</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Serbian (Cyrillic) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/sr_RS/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Опште</string>
<string id="30023">Режим</string>
<string id="30032">База података</string>
<string id="30033">Списак за реп.</string>
<string id="30065">Недеља</string>
<string id="30066">Понедељак</string>
<string id="30067">Уторак</string>
<string id="30068">Среда</string>
<string id="30069">Четвртак</string>
<string id="30070">Петак</string>
<string id="30071">Субота</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Serbian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/sr/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Opšte</string>
<string id="30023">Režim</string>
<string id="30032">Baza podataka</string>
<string id="30033">Spisak za rep.</string>
<string id="30065">Nedelja</string>
<string id="30066">Ponedeljak</string>
<string id="30067">Utorak</string>
<string id="30068">Sreda</string>
<string id="30069">Četvrtak</string>
<string id="30070">Petak</string>
<string id="30071">Subota</string>
</strings>

View File

@@ -1,62 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Slovak language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/sk/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">Všeobecné</string>
<string id="30012">Voľba súboru</string>
<string id="30013">Plánovač</string>
<string id="30016">Záloha</string>
<string id="30017">Obnova</string>
<string id="30018">Prehliadať cestu</string>
<string id="30019">Zadať cestu</string>
<string id="30020">Prehliadať vzdialenú cestu</string>
<string id="30021">Meno priečinku zálohy</string>
<string id="30022">Tichý režim</string>
<string id="30023">Režim</string>
<string id="30024">Zadať vzdialenú cestu</string>
<string id="30025">Druh vzdialenej cesty</string>
<string id="30026">Koľko záloh zachovať (0 pre všetky)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox kľúč</string>
<string id="30029">Dropbox Secret</string>
<string id="30030">Užívateľské doplnky</string>
<string id="30031">Dáta Doplnkov</string>
<string id="30032">Databáza</string>
<string id="30033">Playlist</string>
<string id="30034">Náhlady/Fanarty</string>
<string id="30035">Konfiguračné súbory</string>
<string id="30045">Chyba: Vzdialená cesta neexistuje</string>
<string id="30046">Začiatok</string>
<string id="30047">Miestny priečinok</string>
<string id="30048">Vzdialený priečinok</string>
<string id="30049">Zbieram zoznam súborov</string>
<string id="30050">Vzdialená cesta existuje - môže obsahovať staré súbory!</string>
<string id="30051">Vytvára sa zoznam súborov</string>
<string id="30052">Zapisuje sa súbor</string>
<string id="30053">Začiatok plánovanej zálohy</string>
<string id="30054">Odstránenie zálohy</string>
<string id="30056">Skontrolujte log pre Dropbox autorizačné URL</string>
<string id="30057">Kliknite OK po získaní oprávnenia</string>
<string id="30058">Potrebný Dropbox vývojársky kód</string>
<string id="30059">Navštívte https://www.dropbox.com/developers</string>
<string id="30060">Povoliť plánovač</string>
<string id="30061">Plán</string>
<string id="30062">Hodina v dni</string>
<string id="30063">Deň v týždni</string>
<string id="30064">'Cron' plán</string>
<string id="30065">Nedeľa</string>
<string id="30066">Pondelok</string>
<string id="30067">Utorok</string>
<string id="30068">Streda</string>
<string id="30069">Štvrtok</string>
<string id="30070">Piatok</string>
<string id="30071">Sobota</string>
<string id="30072">Každý den</string>
<string id="30073">Každý týždeň</string>
<string id="30074">Prvý deň mesiaca</string>
<string id="30075">Vlastný plán</string>
<string id="30076">Vypnúť po skončení zálohy</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Slovenian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/sl/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Splošno</string>
<string id="30023">Način</string>
<string id="30032">Podatkovna baza</string>
<string id="30033">Seznam predvajanja</string>
<string id="30065">Nedelja</string>
<string id="30066">Ponedeljek</string>
<string id="30067">Torek</string>
<string id="30068">Sreda</string>
<string id="30069">Četrtek</string>
<string id="30070">Petek</string>
<string id="30071">Sobota</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Spanish (Argentina) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/es_AR/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">General</string>
<string id="30023">Modo</string>
<string id="30032">Base de Datos</string>
<string id="30033">Lista de reproducción</string>
<string id="30065">Domingo</string>
<string id="30066">Lunes</string>
<string id="30067">Martes</string>
<string id="30068">Miércoles</string>
<string id="30069">Jueves</string>
<string id="30070">Viernes</string>
<string id="30071">Sábado</string>
</strings>

View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Spanish (Mexico) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/es_MX/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">Respaldo de XBMC</string>
<string id="30011">General</string>
<string id="30012">Selección de Archivo</string>
<string id="30013">Programación</string>
<string id="30016">Respaldo</string>
<string id="30017">Restaurar</string>
<string id="30018">Explorar Ruta</string>
<string id="30019">Ingresar Ruta</string>
<string id="30020">Explorar Ruta Remota</string>
<string id="30021">Nombre de Carpeta de Respaldo</string>
<string id="30022">Ejecutar en Modo Silencioso</string>
<string id="30023">Modo</string>
<string id="30024">Ingresar Ruta Remota</string>
<string id="30025">Tipo de Ruta Remota</string>
<string id="30026">Respaldos a mantener (0 para todos)</string>
<string id="30027">Dropbox</string>
<string id="30030">Addons de Usuario</string>
<string id="30031">Datos de Addons</string>
<string id="30032">Base de datos</string>
<string id="30033">Lista de reproducción</string>
<string id="30034">Miniaturas/Fanart</string>
<string id="30035">Archivos de Configuración</string>
<string id="30045">Error: Ruta remota no existe</string>
<string id="30046">Comenzando</string>
<string id="30047">Directorio Local</string>
<string id="30048">Directorio Remoto</string>
<string id="30049">Obteniendo lista de archivos</string>
<string id="30050">Ruta Remota existe - ¡Puede tener archivos antiguos!</string>
<string id="30051">Creando Lista de Archivos</string>
<string id="30052">Escribiendo archivo</string>
<string id="30053">Empezando respaldo programado</string>
<string id="30054">Eliminando respaldo</string>
<string id="30056">Revisar el log para la URL de autorización de Dropbox</string>
<string id="30057">Hacer click en OK cuando esté autorizado</string>
<string id="30060">Habilitar Programación</string>
<string id="30061">Programación</string>
<string id="30062">Hora del Día</string>
<string id="30063">Día de la Semana</string>
<string id="30064">Programación Cron</string>
<string id="30065">Domingo</string>
<string id="30066">Lunes</string>
<string id="30067">Martes</string>
<string id="30068">Miércoles</string>
<string id="30069">Jueves</string>
<string id="30070">Viernes</string>
<string id="30071">Sábado</string>
<string id="30072">Todos los Días</string>
<string id="30073">Todas las Semanas</string>
<string id="30074">Primer Día del Mes</string>
<string id="30075">Programación Perzonalizada</string>
<string id="30076">Apagar luego de respaldar</string>
<string id="30077">Reiniciar XBMC</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Spanish language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/es/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backup</string>
<string id="30011">General</string>
<string id="30012">Selección de archivo</string>
<string id="30013">Planificando</string>
<string id="30016">Backup</string>
<string id="30017">Restaurar</string>
<string id="30018">Examinar ruta</string>
<string id="30019">Escribir ruta</string>
<string id="30020">Examinar ruta remota</string>
<string id="30021">Nombre de directorio de respaldo</string>
<string id="30022">Correr en segundo plano</string>
<string id="30023">Modo</string>
<string id="30024">Escribir directorio remoto</string>
<string id="30025">Tipo de Ruta Remota</string>
<string id="30026">Copias de seguridad a mantener (0 para todas)</string>
<string id="30027">Dropbox</string>
<string id="30028">Clave de Dropbox</string>
<string id="30029">Secreto de Dropbox</string>
<string id="30030">Addons del usuario</string>
<string id="30031">Addon Data</string>
<string id="30032">Base de Datos</string>
<string id="30033">Lista de reproducción</string>
<string id="30034">Thumbnails/Fanart</string>
<string id="30035">Ficheros de configuración</string>
<string id="30036">Directorio Personalizado 1</string>
<string id="30037">Directorio Personalizado 2</string>
<string id="30038">Opciones avanzadas detectadas</string>
<string id="30039">Primero debería ser restaurado el archivo advancedsettings</string>
<string id="30040">Selecciona SI para restaurar este archivo y reiniciar XBMC</string>
<string id="30041">Selecciona NO para continuar</string>
<string id="30042">Reanudar restauración</string>
<string id="30043">XBMC Backup ha detectado una restauración sin terminar</string>
<string id="30044">¿Desea continuar?</string>
<string id="30045">Error: La ruta Remota no existe</string>
<string id="30046">Empezando</string>
<string id="30047">Directorio Local</string>
<string id="30048">Directorio Remoto</string>
<string id="30049">Obteniendo lista de fichero</string>
<string id="30050">¡Ruta Remota ya existe - puede haber ficheros antiguos en ella!</string>
<string id="30051">Creando lista de ficheros</string>
<string id="30052">Escribiendo fichero</string>
<string id="30053">Empezando copia de seguridad planificada</string>
<string id="30054">Eliminar copia de seguridad</string>
<string id="30056">Autoriza la URL en Dropbox</string>
<string id="30057">Presiona OK cuando se haya autorizado</string>
<string id="30058">Código de Desarrollador Dropbox necesario</string>
<string id="30059">Visita https://www.dropbox.com/developers</string>
<string id="30060">Habilitar Planificador</string>
<string id="30061">Planificador</string>
<string id="30062">Hora del Día</string>
<string id="30063">Día de la Semana</string>
<string id="30064">Cron Schedule</string>
<string id="30065">Domingo</string>
<string id="30066">Lunes</string>
<string id="30067">Martes</string>
<string id="30068">Miércoles</string>
<string id="30069">Jueves</string>
<string id="30070">Viernes</string>
<string id="30071">Sábado</string>
<string id="30072">Todos los días</string>
<string id="30073">Todas las semanas</string>
<string id="30074">Primer día de la semana</string>
<string id="30075">Planificador Custom</string>
<string id="30076">Apagar tras realizar la copia de seguridad</string>
<string id="30077">Reiniciar XBMC</string>
<string id="30078">Debería reiniciar XBMC para continuar</string>
</strings>

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Swedish language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/sv/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC Backupp</string>
<string id="30011">Allmänt</string>
<string id="30012">Filval</string>
<string id="30013">Schemaläggning</string>
<string id="30016">Backupp</string>
<string id="30017">Återställ</string>
<string id="30018">Bläddra efter sökväg</string>
<string id="30019">Skriv sökväg</string>
<string id="30020">Bläddra efter fjärrsökväg</string>
<string id="30021">Backuppmappsnamn</string>
<string id="30022">Kör tyst</string>
<string id="30023">Läge</string>
<string id="30024">Skriv fjärrsökväg</string>
<string id="30025">Fjärrsökvägstyp</string>
<string id="30026">Backupper att behålla (0 för alla)</string>
<string id="30027">Dropbox</string>
<string id="30028">Dropbox Nyckel</string>
<string id="30029">Dropbox Hemlighet</string>
<string id="30030">Användartillägg</string>
<string id="30031">Tilläggsdata</string>
<string id="30032">Databas</string>
<string id="30033">Spellista</string>
<string id="30034">Miniatyrer/fanart</string>
<string id="30035">Konfigurationsfiler</string>
<string id="30036">Egen mapp 1</string>
<string id="30037">Egen mapp 2</string>
<string id="30038">Avancerade inställningar upptäcktes</string>
<string id="30039">Filen för avancerade inställningar bör återställas först</string>
<string id="30040">Välj Ja för att återställa denna fil och starta om XBMC</string>
<string id="30041">Välj Nej för att fortsätta</string>
<string id="30042">Återuppta återställning</string>
<string id="30043">XBMC Backup har upptäckt en ofärdig återställning</string>
<string id="30044">Vill du fortsätta?</string>
<string id="30045">Fel: Fjärrsökväg existerar inte</string>
<string id="30046">Startar</string>
<string id="30047">Lokalmapp</string>
<string id="30048">Fjärrmapp</string>
<string id="30049">Samlar fillista</string>
<string id="30050">Fjärrsökväg existerar - kan innehålla gamla filer!</string>
<string id="30051">Skapar fillista</string>
<string id="30052">Skriver fil</string>
<string id="30053">Startar schemalagd backupp</string>
<string id="30054">Tar bort backupper</string>
<string id="30056">Kontrollera loggen efter adress för Dropbox-inloggning</string>
<string id="30057">Klicka OK när du är inloggad</string>
<string id="30058">Dropbox utvecklarkod krävs</string>
<string id="30059">Besök https://www.dropbox.com/developers</string>
<string id="30060">Aktivera schemaläggare</string>
<string id="30061">Schemalägg</string>
<string id="30062">Timme av dagen</string>
<string id="30063">Dag av veckan</string>
<string id="30064">Cronschema</string>
<string id="30065">Söndag</string>
<string id="30066">Måndag</string>
<string id="30067">Tisdag</string>
<string id="30068">Onsdag</string>
<string id="30069">Torsdag</string>
<string id="30070">Fredag</string>
<string id="30071">Lördag</string>
<string id="30072">Varje dag</string>
<string id="30073">Varje vecka</string>
<string id="30074">Första dagen i månaden</string>
<string id="30075">Eget schema</string>
<string id="30076">Stäng av efter Backup</string>
<string id="30077">Starta om XBMC</string>
<string id="30078">Du borde starta om XBMC för att fortsätta</string>
</strings>

View File

@@ -1,52 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Tamil (India) language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/ta_IN/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30010">XBMC மறுபிரதி</string>
<string id="30011">பொதுவானது</string>
<string id="30012">கோப்பு தேர்வு</string>
<string id="30013">திட்டமிடல்</string>
<string id="30016">மறுபிரதி</string>
<string id="30017">மீட்டெடு</string>
<string id="30018">பாதை உலாவு</string>
<string id="30019">பாதை உள்ளிடு</string>
<string id="30020">தொலை பாதை உலாவு</string>
<string id="30021">மறுபிரதி கோப்புறை பெயர்</string>
<string id="30022">சத்தமில்லாது ஓட்டவும்</string>
<string id="30023">முறை</string>
<string id="30024">தொலை பாதை உள்ளிடு</string>
<string id="30025">தொலை பாதை உள்ளிடு</string>
<string id="30026">வைக்கவேண்டிய மறுபிரதிகள் (0 - அனைத்திற்கும்)</string>
<string id="30030">பயனர் துணை பயன்கள்</string>
<string id="30031">துணை பயன் தகவல்</string>
<string id="30032">தரவுத்தளம்</string>
<string id="30033">பட்டியல்</string>
<string id="30034">சிறுபடம்/விசிறிபடம்</string>
<string id="30035">அமைப்பு கோப்புகள்</string>
<string id="30045">பிழை: தொலை பாதை இல்லை</string>
<string id="30046">தொடங்குகிறது</string>
<string id="30047">உள்ளூர் கோப்புறை</string>
<string id="30048">தொலை கோப்புறை</string>
<string id="30049">கோப்பு பட்டியலை சேகரித்தல்</string>
<string id="30050">தொலை பாதை உள்ளது - அதில் பழைய கோப்புகள் இருக்கலாம்</string>
<string id="30051">கோப்பு பட்டியல உருவாக்குதல்</string>
<string id="30052">கோப்பில் எழுதப்படுகிறது</string>
<string id="30053">திட்டமிட்ட மறுபிரதியை தொடங்குகிறது</string>
<string id="30054">மறுபிரதியை நீக்கு</string>
<string id="30060">திட்டமிடுநர் செயல்படுத்து</string>
<string id="30061">திட்டமிடு</string>
<string id="30064">கிரான் திட்டமிடு</string>
<string id="30065">ஞாயிறு </string>
<string id="30066">திங்கள்</string>
<string id="30067">செவ்வாய்</string>
<string id="30068">புதன்</string>
<string id="30069">வியாழன்</string>
<string id="30070">வெள்ளி</string>
<string id="30071">சனி</string>
<string id="30072">ஒவ்வொரு நாளும்</string>
<string id="30073">ஒவ்வொரு வாரமும்</string>
<string id="30074">மாதத்தின் முதல் நாள்</string>
<string id="30075">தனிப்பயன் திட்டமிடு</string>
</strings>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Thai language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/th/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">ทั่วไป</string>
<string id="30023">โหมด</string>
<string id="30032">ฐานข้อมูล</string>
<string id="30033">รายการเพลง</string>
<string id="30061">ตารางงาน</string>
<string id="30065">อาทิตย์</string>
<string id="30066">จันทร์</string>
<string id="30067">อังคาร</string>
<string id="30068">พุธ</string>
<string id="30069">พฤหัสบดี</string>
<string id="30070">ศกร์</string>
<string id="30071">เสาร์</string>
<string id="30077">เริ่ม XBMC ใหม่</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Turkish language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/tr/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Genel</string>
<string id="30023">Mod</string>
<string id="30032">Veritabanı</string>
<string id="30033">Çalma listesi</string>
<string id="30065">Pazar</string>
<string id="30066">Pazartesi</string>
<string id="30067">Salı</string>
<string id="30068">Çarşamba</string>
<string id="30069">Perşembe</string>
<string id="30070">Cuma</string>
<string id="30071">Cumartesi</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Ukrainian language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/uk/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Загальні</string>
<string id="30023">Режим</string>
<string id="30032">База даних</string>
<string id="30033">Список відтворювання</string>
<string id="30065">Неділя</string>
<string id="30066">Понеділок</string>
<string id="30067">Вівторок</string>
<string id="30068">Середа</string>
<string id="30069">Четвер</string>
<string id="30070">П'ятниця</string>
<string id="30071">Субота</string>
</strings>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Translated using Transifex web application. For support, or if you would like to to help out, please visit your language team! -->
<!-- Vietnamese language-Team URL: http://www.transifex.com/projects/p/xbmc-addons/language/vi/ -->
<!-- Report language file syntax bugs at: alanwww1@xbmc.org -->
<strings>
<string id="30011">Tổng Quan</string>
<string id="30023">Chế độ</string>
<string id="30032">Cơ sở dữ liệu</string>
<string id="30033">Playlist</string>
<string id="30065">Chủ Nhật</string>
<string id="30066">Thứ Hai</string>
<string id="30067">Thứ Ba</string>
<string id="30068">Thứ Tư</string>
<string id="30069">Thứ Năm</string>
<string id="30070">Thứ Sáu</string>
<string id="30071">Thứ Bảy</string>
</strings>

View File

@@ -1,2 +0,0 @@
*.pyo

View File

@@ -1,432 +0,0 @@
import xbmc
import xbmcgui
import xbmcvfs
import utils as utils
import os.path
import time
from vfs import XBMCFileSystem,DropboxFileSystem
class XbmcBackup:
#constants for initiating a back or restore
Backup = 0
Restore = 1
#remote file system
xbmc_vfs = None
remote_vfs = None
restoreFile = None
remote_base_path = None
#for the progress bar
progressBar = None
filesLeft = 0
filesTotal = 1
fileManager = None
restore_point = None
skip_advanced = False #if we should check for the existance of advancedsettings in the restore
def __init__(self):
self.xbmc_vfs = XBMCFileSystem(xbmc.translatePath('special://home'))
self.configureRemote()
utils.log(utils.getString(30046))
def configureRemote(self):
if(utils.getSetting('remote_selection') == '1'):
self.remote_base_path = utils.getSetting('remote_path_2');
self.remote_vfs = XBMCFileSystem(utils.getSetting('remote_path_2'))
utils.setSetting("remote_path","")
elif(utils.getSetting('remote_selection') == '0'):
self.remote_base_path = utils.getSetting('remote_path');
self.remote_vfs = XBMCFileSystem(utils.getSetting("remote_path"))
elif(utils.getSetting('remote_selection') == '2'):
self.remote_base_path = "/"
self.remote_vfs = DropboxFileSystem("/")
def remoteConfigured(self):
result = True
if(self.remote_base_path == ""):
result = False
return result
def listBackups(self):
result = []
#get all the folders in the current root path
dirs,files = self.remote_vfs.listdir(self.remote_base_path)
for aDir in dirs:
if(self.remote_vfs.exists(self.remote_base_path + aDir + "/xbmcbackup.val")):
result.append(aDir)
return result
def selectRestore(self,restore_point):
self.restore_point = restore_point
def skipAdvanced(self):
self.skip_advanced = True
def run(self,mode=-1,runSilent=False):
#append backup folder name
progressBarTitle = utils.getString(30010) + " - "
if(mode == self.Backup and self.remote_vfs.root_path != ''):
self.remote_vfs.set_root(self.remote_vfs.root_path + time.strftime("%Y%m%d") + "/")
progressBarTitle = progressBarTitle + utils.getString(30016)
elif(mode == self.Restore and self.restore_point != None and self.remote_vfs.root_path != ''):
self.remote_vfs.set_root(self.remote_vfs.root_path + self.restore_point + "/")
progressBarTitle = progressBarTitle + utils.getString(30017)
else:
#kill the program here
self.remote_vfs = None
return
utils.log(utils.getString(30047) + ": " + self.xbmc_vfs.root_path)
utils.log(utils.getString(30048) + ": " + self.remote_vfs.root_path)
#check if we should use the progress bar
if(utils.getSetting('run_silent') == 'false' and not runSilent):
self.progressBar = xbmcgui.DialogProgress()
self.progressBar.create(progressBarTitle,utils.getString(30049) + "......")
if(mode == self.Backup):
utils.log(utils.getString(30023) + " - " + utils.getString(30016))
#check if remote path exists
if(self.remote_vfs.exists(self.remote_vfs.root_path)):
#may be data in here already
utils.log(utils.getString(30050))
else:
#make the remote directory
self.remote_vfs.mkdir(self.remote_vfs.root_path)
#create a validation file for backup rotation
self._createValidationFile()
utils.log(utils.getString(30051))
allFiles = []
fileManager = FileManager(self.xbmc_vfs)
#go through each of the user selected items and write them to the backup store
if(utils.getSetting('backup_addons') == 'true'):
self.remote_vfs.mkdir(self.remote_vfs.root_path + "addons")
fileManager.walkTree(xbmc.translatePath('special://home/addons'))
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata")
if(utils.getSetting('backup_addon_data') == 'true'):
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata/addon_data")
fileManager.walkTree(xbmc.translatePath('special://home/userdata/addon_data'))
if(utils.getSetting('backup_database') == 'true'):
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata/Database")
fileManager.walkTree(xbmc.translatePath('special://home/userdata/Database'))
if(utils.getSetting("backup_playlists") == 'true'):
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata/playlists")
fileManager.walkTree(xbmc.translatePath('special://home/userdata/playlists'))
if(utils.getSetting('backup_profiles') == 'true'):
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata/profiles")
fileManager.walkTree(xbmc.translatePath('special://home/userdata/profiles'))
if(utils.getSetting("backup_thumbnails") == "true"):
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata/Thumbnails")
fileManager.walkTree(xbmc.translatePath('special://home/userdata/Thumbnails'))
if(utils.getSetting("backup_config") == "true"):
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata/keymaps")
fileManager.walkTree(xbmc.translatePath('special://home/userdata/keymaps'))
self.remote_vfs.mkdir(self.remote_vfs.root_path + "userdata/peripheral_data")
fileManager.walkTree(xbmc.translatePath('special://home/userdata/peripheral_data'))
#this part is an oddity
dirs,configFiles = self.xbmc_vfs.listdir(xbmc.translatePath('special://home/userdata/'))
for aFile in configFiles:
if(aFile.endswith(".xml")):
fileManager.addFile(xbmc.translatePath('special://home/userdata/') + aFile)
#add to array
self.filesTotal = fileManager.size()
allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path,"files":fileManager.getFiles()})
#check if there are custom directories
if(utils.getSetting('custom_dir_1_enable') == 'true' and utils.getSetting('backup_custom_dir_1') != ''):
#create a special remote path with hash
self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_1'))
self.remote_vfs.mkdir(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))
#walk the directory
fileManager.walkTree(self.xbmc_vfs.root_path)
self.filesTotal = self.filesTotal + fileManager.size()
allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"files":fileManager.getFiles()})
if(utils.getSetting('custom_dir_2_enable') == 'true' and utils.getSetting('backup_custom_dir_2') != ''):
#create a special remote path with hash
self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_2'))
self.remote_vfs.mkdir(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))
#walk the directory
fileManager.walkTree(self.xbmc_vfs.root_path)
self.filesTotal = self.filesTotal + fileManager.size()
allFiles.append({"source":self.xbmc_vfs.root_path,"dest":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"files":fileManager.getFiles()})
#backup all the files
self.filesLeft = self.filesTotal
for fileGroup in allFiles:
self.xbmc_vfs.set_root(fileGroup['source'])
self.remote_vfs.set_root(fileGroup['dest'])
self.backupFiles(fileGroup['files'],self.xbmc_vfs,self.remote_vfs)
#remove old backups
self._rotateBackups()
elif (mode == self.Restore):
utils.log(utils.getString(30023) + " - " + utils.getString(30017))
#for restores remote path must exist
if(not self.remote_vfs.exists(self.remote_vfs.root_path)):
xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path)
return
utils.log(utils.getString(30051))
allFiles = []
fileManager = FileManager(self.remote_vfs)
#go through each of the user selected items and write them to the backup store
if(utils.getSetting("backup_config") == "true"):
#check for the existance of an advancedsettings file
if(self.remote_vfs.exists(self.remote_vfs.root_path + "userdata/advancedsettings.xml") and not self.skip_advanced):
#let the user know there is an advanced settings file present
restartXbmc = xbmcgui.Dialog().yesno(utils.getString(30038),utils.getString(30039),utils.getString(30040), utils.getString(30041))
if(restartXbmc):
#add only this file to the file list
fileManager.addFile(self.remote_vfs.root_path + "userdata/advancedsettings.xml")
self.backupFiles(fileManager.getFiles(),self.remote_vfs,self.xbmc_vfs)
#let the service know to resume this backup on startup
self._createResumeBackupFile()
#do not continue running
xbmcgui.Dialog().ok(utils.getString(30077),utils.getString(30078))
return
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/keymaps'))
fileManager.walkTree(self.remote_vfs.root_path + "userdata/keymaps")
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/peripheral_data'))
fileManager.walkTree(self.remote_vfs.root_path + "userdata/peripheral_data")
#this part is an oddity
dirs,configFiles = self.remote_vfs.listdir(self.remote_vfs.root_path + "userdata/")
for aFile in configFiles:
if(aFile.endswith(".xml")):
fileManager.addFile(self.remote_vfs.root_path + "userdata/" + aFile)
if(utils.getSetting('backup_addons') == 'true'):
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/addons'))
fileManager.walkTree(self.remote_vfs.root_path + "addons")
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata'))
if(utils.getSetting('backup_addon_data') == 'true'):
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/addon_data'))
fileManager.walkTree(self.remote_vfs.root_path + "userdata/addon_data")
if(utils.getSetting('backup_database') == 'true'):
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/Database'))
fileManager.walkTree(self.remote_vfs.root_path + "userdata/Database")
if(utils.getSetting("backup_playlists") == 'true'):
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/playlists'))
fileManager.walkTree(self.remote_vfs.root_path + "userdata/playlists")
if(utils.getSetting('backup_profiles') == 'true'):
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/profiles'))
fileManager.walkTree(self.remote_vfs.root_path + "userdata/profiles")
if(utils.getSetting("backup_thumbnails") == "true"):
self.xbmc_vfs.mkdir(xbmc.translatePath('special://home/userdata/Thumbnails'))
fileManager.walkTree(self.remote_vfs.root_path + "userdata/Thumbnails")
#add to array
self.filesTotal = fileManager.size()
allFiles.append({"source":self.remote_vfs.root_path,"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()})
#check if there are custom directories
if(utils.getSetting('custom_dir_1_enable') == 'true' and utils.getSetting('backup_custom_dir_1') != ''):
self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_1'))
if(self.remote_vfs.exists(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))):
#index files to restore
fileManager.walkTree(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))
self.filesTotal = self.filesTotal + fileManager.size()
allFiles.append({"source":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()})
else:
xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path + "custom_" + self._createCRC(utils.getSetting('backup_custom_dir_1')))
if(utils.getSetting('custom_dir_2_enable') == 'true' and utils.getSetting('backup_custom_dir_2') != ''):
self.xbmc_vfs.set_root(utils.getSetting('backup_custom_dir_2'))
if(self.remote_vfs.exists(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))):
#index files to restore
fileManager.walkTree(self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path))
self.filesTotal = self.filesTotal + fileManager.size()
allFiles.append({"source":self.remote_vfs.root_path + "custom_" + self._createCRC(self.xbmc_vfs.root_path),"dest":self.xbmc_vfs.root_path,"files":fileManager.getFiles()})
else:
xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30045),self.remote_vfs.root_path + "custom_" + self._createCRC(utils.getSetting('backup_custom_dir_2')))
#restore all the files
self.filesLeft = self.filesTotal
for fileGroup in allFiles:
self.remote_vfs.set_root(fileGroup['source'])
self.xbmc_vfs.set_root(fileGroup['dest'])
self.backupFiles(fileGroup['files'],self.remote_vfs,self.xbmc_vfs)
#call update addons to refresh everything
xbmc.executebuiltin('UpdateLocalAddons')
if(utils.getSetting('run_silent') == 'false' and not runSilent):
self.progressBar.close()
def backupFiles(self,fileList,source,dest):
utils.log("Writing files to: " + dest.root_path)
utils.log("Source: " + source.root_path)
for aFile in fileList:
if(not self._checkCancel()):
utils.log('Writing file: ' + aFile,xbmc.LOGDEBUG)
self._updateProgress(aFile)
if(aFile.startswith("-")):
dest.mkdir(dest.root_path + aFile[len(source.root_path) + 1:])
else:
if(isinstance(source,DropboxFileSystem)):
#if copying from dropbox we need the file handle, use get_file
source.get_file(aFile,dest.root_path + aFile[len(source.root_path):])
else:
#copy using normal method
dest.put(aFile,dest.root_path + aFile[len(source.root_path):])
def _createCRC(self,string):
#create hash from string
string = string.lower()
bytes = bytearray(string.encode())
crc = 0xffffffff;
for b in bytes:
crc = crc ^ (b << 24)
for i in range(8):
if (crc & 0x80000000 ):
crc = (crc << 1) ^ 0x04C11DB7
else:
crc = crc << 1;
crc = crc & 0xFFFFFFFF
return '%08x' % crc
def _updateProgress(self,message=''):
self.filesLeft = self.filesLeft - 1
#update the progress bar
if(self.progressBar != None):
self.progressBar.update(int((float(self.filesTotal - self.filesLeft)/float(self.filesTotal)) * 100),message)
def _checkCancel(self):
result = False
if(self.progressBar != None):
result = self.progressBar.iscanceled()
return result
def _rotateBackups(self):
total_backups = int(utils.getSetting('backup_rotation'))
if(total_backups > 0):
#get a list of valid backup folders
dirs = self.listBackups()
if(len(dirs) > total_backups):
#remove backups to equal total wanted
dirs.sort()
remove_num = len(dirs) - total_backups - 1
self.filesTotal = self.filesTotal + remove_num + 1
#update the progress bar if it is available
while(remove_num >= 0 and not self._checkCancel()):
self._updateProgress(utils.getString(30054) + " " + dirs[remove_num])
utils.log("Removing backup " + dirs[remove_num])
self.remote_vfs.rmdir(self.remote_base_path + dirs[remove_num] + "/")
remove_num = remove_num - 1
def _createValidationFile(self):
vFile = xbmcvfs.File(xbmc.translatePath(utils.data_dir() + "xbmcbackup.val"),'w')
vFile.write("XBMC Backup Validation File")
vFile.close()
self.remote_vfs.put(xbmc.translatePath(utils.data_dir() + "xbmcbackup.val"),self.remote_vfs.root_path + "xbmcbackup.val")
def _createResumeBackupFile(self):
rFile = xbmcvfs.File(xbmc.translatePath(utils.data_dir() + "resume.txt"),'w')
rFile.write(self.restore_point)
rFile.close()
class FileManager:
fileArray = []
not_dir = ['.zip','.xsp','.rar']
vfs = None
def __init__(self,vfs):
self.vfs = vfs
def walkTree(self,directory):
if(self.vfs.exists(directory)):
dirs,files = self.vfs.listdir(directory)
#create all the subdirs first
for aDir in dirs:
dirPath = xbmc.translatePath(directory + "/" + aDir)
file_ext = aDir.split('.')[-1]
self.addFile("-" + dirPath)
#catch for "non directory" type files
shouldWalk = True
for s in file_ext:
if(s in self.not_dir):
shouldWalk = False
if(shouldWalk):
self.walkTree(dirPath)
#copy all the files
for aFile in files:
utils.log(aFile)
filePath = xbmc.translatePath(directory + "/" + aFile)
self.addFile(filePath)
def addFile(self,filename):
try:
filename = filename.decode('UTF-8')
except UnicodeDecodeError:
filename = filename.decode('ISO-8859-2')
#write the full remote path name of this file
utils.log("Add File: " + filename,xbmc.LOGDEBUG)
self.fileArray.append(filename)
def getFiles(self):
result = self.fileArray
self.fileArray = []
return result
def size(self):
return len(self.fileArray)

View File

@@ -1,308 +0,0 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
from time import time, mktime
from datetime import datetime, date
from relativedelta import relativedelta
search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$')
only_int_re = re.compile(r'^\d+$')
any_int_re = re.compile(r'^\d+')
star_or_int_re = re.compile(r'^(\d+|\*)$')
__all__ = ('croniter',)
class croniter(object):
RANGES = (
(0, 59),
(0, 23),
(1, 31),
(1, 12),
(0, 6),
(0, 59)
)
DAYS = (
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
)
ALPHACONV = (
{ },
{ },
{ },
{ 'jan':1, 'feb':2, 'mar':3, 'apr':4, 'may':5, 'jun':6,
'jul':7, 'aug':8, 'sep':9, 'oct':10, 'nov':11, 'dec':12 },
{ 'sun':0, 'mon':1, 'tue':2, 'wed':3, 'thu':4, 'fri':5, 'sat':6 },
{ }
)
LOWMAP = (
{},
{},
{0: 1},
{0: 1},
{7: 0},
{},
)
bad_length = 'Exactly 5 or 6 columns has to be specified for iterator' \
'expression.'
def __init__(self, expr_format, start_time=time()):
if isinstance(start_time, datetime):
start_time = mktime(start_time.timetuple())
self.cur = start_time
self.exprs = expr_format.split()
if len(self.exprs) != 5 and len(self.exprs) != 6:
raise ValueError(self.bad_length)
expanded = []
for i, expr in enumerate(self.exprs):
e_list = expr.split(',')
res = []
while len(e_list) > 0:
e = e_list.pop()
t = re.sub(r'^\*(/.+)$', r'%d-%d\1' % (self.RANGES[i][0],
self.RANGES[i][1]),
str(e))
m = search_re.search(t)
if m:
(low, high, step) = m.group(1), m.group(2), m.group(4) or 1
if not any_int_re.search(low):
low = self.ALPHACONV[i][low.lower()]
if not any_int_re.search(high):
high = self.ALPHACONV[i][high.lower()]
if (not low or not high or int(low) > int(high)
or not only_int_re.search(str(step))):
raise ValueError("[%s] is not acceptable" %expr_format)
for j in xrange(int(low), int(high)+1):
if j % int(step) == 0:
e_list.append(j)
else:
if not star_or_int_re.search(t):
t = self.ALPHACONV[i][t.lower()]
try:
t = int(t)
except:
pass
if t in self.LOWMAP[i]:
t = self.LOWMAP[i][t]
if t != '*' and (int(t) < self.RANGES[i][0] or
int(t) > self.RANGES[i][1]):
raise ValueError("[%s] is not acceptable, out of range" % expr_format)
res.append(t)
res.sort()
expanded.append(['*'] if (len(res) == 1 and res[0] == '*') else res)
self.expanded = expanded
def get_next(self, ret_type=float):
return self._get_next(ret_type, is_prev=False)
def get_prev(self, ret_type=float):
return self._get_next(ret_type, is_prev=True)
def _get_next(self, ret_type=float, is_prev=False):
expanded = self.expanded[:]
if ret_type not in (float, datetime):
raise TypeError("Invalid ret_type, only 'float' or 'datetime' " \
"is acceptable.")
if expanded[2][0] != '*' and expanded[4][0] != '*':
bak = expanded[4]
expanded[4] = ['*']
t1 = self._calc(self.cur, expanded, is_prev)
expanded[4] = bak
expanded[2] = ['*']
t2 = self._calc(self.cur, expanded, is_prev)
if not is_prev:
result = t1 if t1 < t2 else t2
else:
result = t1 if t1 > t2 else t2
else:
result = self._calc(self.cur, expanded, is_prev)
self.cur = result
if ret_type == datetime:
result = datetime.fromtimestamp(result)
return result
def _calc(self, now, expanded, is_prev):
if is_prev:
nearest_method = self._get_prev_nearest
nearest_diff_method = self._get_prev_nearest_diff
sign = -1
else:
nearest_method = self._get_next_nearest
nearest_diff_method = self._get_next_nearest_diff
sign = 1
offset = len(expanded) == 6 and 1 or 60
dst = now = datetime.fromtimestamp(now + sign * offset)
day, month, year = dst.day, dst.month, dst.year
current_year = now.year
DAYS = self.DAYS
def proc_month(d):
if expanded[3][0] != '*':
diff_month = nearest_diff_method(month, expanded[3], 12)
days = DAYS[month - 1]
if month == 2 and self.is_leap(year) == True:
days += 1
reset_day = days if is_prev else 1
if diff_month != None and diff_month != 0:
if is_prev:
d += relativedelta(months=diff_month)
else:
d += relativedelta(months=diff_month, day=reset_day,
hour=0, minute=0, second=0)
return True, d
return False, d
def proc_day_of_month(d):
if expanded[2][0] != '*':
days = DAYS[month - 1]
if month == 2 and self.is_leap(year) == True:
days += 1
diff_day = nearest_diff_method(d.day, expanded[2], days)
if diff_day != None and diff_day != 0:
if is_prev:
d += relativedelta(days=diff_day)
else:
d += relativedelta(days=diff_day, hour=0, minute=0, second=0)
return True, d
return False, d
def proc_day_of_week(d):
if expanded[4][0] != '*':
diff_day_of_week = nearest_diff_method(d.isoweekday() % 7, expanded[4], 7)
if diff_day_of_week != None and diff_day_of_week != 0:
if is_prev:
d += relativedelta(days=diff_day_of_week)
else:
d += relativedelta(days=diff_day_of_week, hour=0, minute=0, second=0)
return True, d
return False, d
def proc_hour(d):
if expanded[1][0] != '*':
diff_hour = nearest_diff_method(d.hour, expanded[1], 24)
if diff_hour != None and diff_hour != 0:
if is_prev:
d += relativedelta(hours = diff_hour)
else:
d += relativedelta(hours = diff_hour, minute=0, second=0)
return True, d
return False, d
def proc_minute(d):
if expanded[0][0] != '*':
diff_min = nearest_diff_method(d.minute, expanded[0], 60)
if diff_min != None and diff_min != 0:
if is_prev:
d += relativedelta(minutes = diff_min)
else:
d += relativedelta(minutes = diff_min, second=0)
return True, d
return False, d
def proc_second(d):
if len(expanded) == 6:
if expanded[5][0] != '*':
diff_sec = nearest_diff_method(d.second, expanded[5], 60)
if diff_sec != None and diff_sec != 0:
dst += relativedelta(seconds = diff_sec)
return True, d
else:
d += relativedelta(second = 0)
return False, d
if is_prev:
procs = [proc_second,
proc_minute,
proc_hour,
proc_day_of_week,
proc_day_of_month,
proc_month]
else:
procs = [proc_month,
proc_day_of_month,
proc_day_of_week,
proc_hour,
proc_minute,
proc_second]
while abs(year - current_year) <= 1:
next = False
for proc in procs:
(changed, dst) = proc(dst)
if changed:
next = True
break
if next:
continue
return mktime(dst.timetuple())
raise "failed to find prev date"
def _get_next_nearest(self, x, to_check):
small = [item for item in to_check if item < x]
large = [item for item in to_check if item >= x]
large.extend(small)
return large[0]
def _get_prev_nearest(self, x, to_check):
small = [item for item in to_check if item <= x]
large = [item for item in to_check if item > x]
small.reverse()
large.reverse()
small.extend(large)
return small[0]
def _get_next_nearest_diff(self, x, to_check, range_val):
for i, d in enumerate(to_check):
if d >= x:
return d - x
return to_check[0] - x + range_val
def _get_prev_nearest_diff(self, x, to_check, range_val):
candidates = to_check[:]
candidates.reverse()
for d in candidates:
if d <= x:
return d - x
return (candidates[0]) - x - range_val
def is_leap(self, year):
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
return True
else:
return False
if __name__ == '__main__':
base = datetime(2010, 1, 25)
itr = croniter('0 0 1 * *', base)
n1 = itr.get_next(datetime)
print n1

View File

@@ -1,2 +0,0 @@
*.pyc

View File

@@ -1,3 +0,0 @@
from __future__ import absolute_import
from . import client, rest, session

View File

@@ -1,965 +0,0 @@
"""
The main client API you'll be working with most often. You'll need to
configure a dropbox.session.DropboxSession for this to work, but otherwise
it's fairly self-explanatory.
Before you can begin making requests to the dropbox API, you have to
authenticate your application with Dropbox and get the user to
authorize your application to use dropbox on his behalf. A typical
progam, from the initial imports to making a simple request (``account_info``),
looks like this:
.. code-block:: python
# Include the Dropbox SDK libraries
from dropbox import client, rest, session
# Get your app key and secret from the Dropbox developer website
APP_KEY = 'INSERT_APP_KEY_HERE'
APP_SECRET = 'INSERT_SECRET_HERE'
# ACCESS_TYPE should be 'dropbox' or 'app_folder' as configured for your app
ACCESS_TYPE = 'INSERT_ACCESS_TYPE_HERE'
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
request_token = sess.obtain_request_token()
url = sess.build_authorize_url(request_token)
# Make the user sign in and authorize this token
print "url:", url
print "Please visit this website and press the 'Allow' button, then hit 'Enter' here."
raw_input()
# This will fail if the user didn't visit the above URL and hit 'Allow'
access_token = sess.obtain_access_token(request_token)
client = client.DropboxClient(sess)
print "linked account:", client.account_info()
"""
from __future__ import absolute_import
import re
import os
from StringIO import StringIO
try:
import json
except ImportError:
import simplejson as json
from .rest import ErrorResponse, RESTClient
def format_path(path):
"""Normalize path for use with the Dropbox API.
This function turns multiple adjacent slashes into single
slashes, then ensures that there's a leading slash but
not a trailing slash.
"""
if not path:
return path
path = re.sub(r'/+', '/', path)
if path == '/':
return (u"" if isinstance(path, unicode) else "")
else:
return '/' + path.strip('/')
class DropboxClient(object):
"""
The main access point of doing REST calls on Dropbox. You should
first create and configure a dropbox.session.DropboxSession object,
and then pass it into DropboxClient's constructor. DropboxClient
then does all the work of properly calling each API method
with the correct OAuth authentication.
You should be aware that any of these methods can raise a
rest.ErrorResponse exception if the server returns a non-200
or invalid HTTP response. Note that a 401 return status at any
point indicates that the user needs to be reauthenticated.
"""
def __init__(self, session, rest_client=RESTClient):
"""Initialize the DropboxClient object.
Args:
``session``: A dropbox.session.DropboxSession object to use for making requests.
``rest_client``: A dropbox.rest.RESTClient-like object to use for making requests. [optional]
"""
self.session = session
self.rest_client = rest_client
def request(self, target, params=None, method='POST', content_server=False):
"""Make an HTTP request to a target API method.
This is an internal method used to properly craft the url, headers, and
params for a Dropbox API request. It is exposed for you in case you
need craft other API calls not in this library or if you want to debug it.
Args:
- ``target``: The target URL with leading slash (e.g. '/files')
- ``params``: A dictionary of parameters to add to the request
- ``method``: An HTTP method (e.g. 'GET' or 'POST')
- ``content_server``: A boolean indicating whether the request is to the
API content server, for example to fetch the contents of a file
rather than its metadata.
Returns:
- A tuple of (url, params, headers) that should be used to make the request.
OAuth authentication information will be added as needed within these fields.
"""
assert method in ['GET','POST', 'PUT'], "Only 'GET', 'POST', and 'PUT' are allowed."
if params is None:
params = {}
host = self.session.API_CONTENT_HOST if content_server else self.session.API_HOST
base = self.session.build_url(host, target)
headers, params = self.session.build_access_headers(method, base, params)
if method in ('GET', 'PUT'):
url = self.session.build_url(host, target, params)
else:
url = self.session.build_url(host, target)
return url, params, headers
def account_info(self):
"""Retrieve information about the user's account.
Returns:
- A dictionary containing account information.
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#account-info
"""
url, params, headers = self.request("/account/info", method='GET')
return self.rest_client.GET(url, headers)
def get_chunked_uploader(self, file_obj, length):
"""Creates a ChunkedUploader to upload the given file-like object.
Args:
- ``file_obj``: The file-like object which is the source of the data
being uploaded.
- ``length``: The number of bytes to upload.
The expected use of this function is as follows:
.. code-block:: python
bigFile = open("data.txt", 'rb')
uploader = myclient.get_chunked_uploader(bigFile, size)
print "uploading: ", size
while uploader.offset < size:
try:
upload = uploader.upload_chunked()
except rest.ErrorResponse, e:
# perform error handling and retry logic
The SDK leaves the error handling and retry logic to the developer
to implement, as the exact requirements will depend on the application
involved.
"""
return DropboxClient.ChunkedUploader(self, file_obj, length)
class ChunkedUploader(object):
"""Contains the logic around a chunked upload, which uploads a
large file to Dropbox via the /chunked_upload endpoint
"""
def __init__(self, client, file_obj, length):
self.client = client
self.offset = 0
self.upload_id = None
self.last_block = None
self.file_obj = file_obj
self.target_length = length
def upload_chunked(self, chunk_size = 4 * 1024 * 1024):
"""Uploads data from this ChunkedUploader's file_obj in chunks, until
an error occurs. Throws an exception when an error occurs, and can
be called again to resume the upload.
Args:
- ``chunk_size``: The number of bytes to put in each chunk. [default 4 MB]
"""
while self.offset < self.target_length:
next_chunk_size = min(chunk_size, self.target_length - self.offset)
if self.last_block == None:
self.last_block = self.file_obj.read(next_chunk_size)
try:
(self.offset, self.upload_id) = self.client.upload_chunk(StringIO(self.last_block), next_chunk_size, self.offset, self.upload_id)
self.last_block = None
except ErrorResponse, e:
reply = e.body
if "offset" in reply and reply['offset'] != 0:
if reply['offset'] > self.offset:
self.last_block = None
self.offset = reply['offset']
def finish(self, path, overwrite=False, parent_rev=None):
"""Commits the bytes uploaded by this ChunkedUploader to a file
in the users dropbox.
Args:
- ``path``: The full path of the file in the Dropbox.
- ``overwrite``: Whether to overwrite an existing file at the given path. [default False]
If overwrite is False and a file already exists there, Dropbox
will rename the upload to make sure it doesn't overwrite anything.
You need to check the metadata returned for the new name.
This field should only be True if your intent is to potentially
clobber changes to a file that you don't know about.
- ``parent_rev``: The rev field from the 'parent' of this upload. [optional]
If your intent is to update the file at the given path, you should
pass the parent_rev parameter set to the rev value from the most recent
metadata you have of the existing file at that path. If the server
has a more recent version of the file at the specified path, it will
automatically rename your uploaded file, spinning off a conflict.
Using this parameter effectively causes the overwrite parameter to be ignored.
The file will always be overwritten if you send the most-recent parent_rev,
and it will never be overwritten if you send a less-recent one.
"""
path = "/commit_chunked_upload/%s%s" % (self.client.session.root, format_path(path))
params = dict(
overwrite = bool(overwrite),
upload_id = self.upload_id
)
if parent_rev is not None:
params['parent_rev'] = parent_rev
url, params, headers = self.client.request(path, params, content_server=True)
return self.client.rest_client.POST(url, params, headers)
def upload_chunk(self, file_obj, length, offset=0, upload_id=None):
"""Uploads a single chunk of data from the given file like object. The majority of users
should use the ChunkedUploader object, which provides a simpler interface to the
chunked_upload API endpoint.
Args:
- ``file_obj``: The source of the data to upload
- ``length``: The number of bytes to upload in one chunk.
Returns:
- The reply from the server, as a dictionary
"""
params = dict()
if upload_id:
params['upload_id'] = upload_id
params['offset'] = offset
url, ignored_params, headers = self.request("/chunked_upload", params, method='PUT', content_server=True)
try:
reply = self.rest_client.PUT(url, file_obj, headers)
return reply['offset'], reply['upload_id']
except ErrorResponse, e:
raise e
def put_file(self, full_path, file_obj, overwrite=False, parent_rev=None):
"""Upload a file.
A typical use case would be as follows:
.. code-block:: python
f = open('working-draft.txt')
response = client.put_file('/magnum-opus.txt', f)
print "uploaded:", response
which would return the metadata of the uploaded file, similar to:
.. code-block:: python
{
'bytes': 77,
'icon': 'page_white_text',
'is_dir': False,
'mime_type': 'text/plain',
'modified': 'Wed, 20 Jul 2011 22:04:50 +0000',
'path': '/magnum-opus.txt',
'rev': '362e2029684fe',
'revision': 221922,
'root': 'dropbox',
'size': '77 bytes',
'thumb_exists': False
}
Args:
- ``full_path``: The full path to upload the file to, *including the file name*.
If the destination directory does not yet exist, it will be created.
- ``file_obj``: A file-like object to upload. If you would like, you can pass a string as file_obj.
- ``overwrite``: Whether to overwrite an existing file at the given path. [default False]
If overwrite is False and a file already exists there, Dropbox
will rename the upload to make sure it doesn't overwrite anything.
You need to check the metadata returned for the new name.
This field should only be True if your intent is to potentially
clobber changes to a file that you don't know about.
- ``parent_rev``: The rev field from the 'parent' of this upload. [optional]
If your intent is to update the file at the given path, you should
pass the parent_rev parameter set to the rev value from the most recent
metadata you have of the existing file at that path. If the server
has a more recent version of the file at the specified path, it will
automatically rename your uploaded file, spinning off a conflict.
Using this parameter effectively causes the overwrite parameter to be ignored.
The file will always be overwritten if you send the most-recent parent_rev,
and it will never be overwritten if you send a less-recent one.
Returns:
- A dictionary containing the metadata of the newly uploaded file.
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#files-put
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 503: User over quota
Note: In Python versions below version 2.6, httplib doesn't handle file-like objects.
In that case, this code will read the entire file into memory (!).
"""
path = "/files_put/%s%s" % (self.session.root, format_path(full_path))
params = {
'overwrite': bool(overwrite),
}
if parent_rev is not None:
params['parent_rev'] = parent_rev
url, params, headers = self.request(path, params, method='PUT', content_server=True)
return self.rest_client.PUT(url, file_obj, headers)
def get_file(self, from_path, rev=None):
"""Download a file.
Unlike most other calls, get_file returns a raw HTTPResponse with the connection open.
You should call .read() and perform any processing you need, then close the HTTPResponse.
A typical usage looks like this:
.. code-block:: python
out = open('magnum-opus.txt', 'w')
f, metadata = client.get_file_and_metadata('/magnum-opus.txt').read()
out.write(f)
which would download the file ``magnum-opus.txt`` and write the contents into
the file ``magnum-opus.txt`` on the local filesystem.
Args:
- ``from_path``: The path to the file to be downloaded.
- ``rev``: A previous rev value of the file to be downloaded. [optional]
Returns:
- An httplib.HTTPResponse that is the result of the request.
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at the given path, or the file that was there was deleted.
- 200: Request was okay but response was malformed in some way.
"""
path = "/files/%s%s" % (self.session.root, format_path(from_path))
params = {}
if rev is not None:
params['rev'] = rev
url, params, headers = self.request(path, params, method='GET', content_server=True)
return self.rest_client.request("GET", url, headers=headers, raw_response=True)
def get_file_and_metadata(self, from_path, rev=None):
"""Download a file alongwith its metadata.
Acts as a thin wrapper around get_file() (see get_file() comments for
more details)
Args:
- ``from_path``: The path to the file to be downloaded.
- ``rev``: A previous rev value of the file to be downloaded. [optional]
Returns:
- An httplib.HTTPResponse that is the result of the request.
- A dictionary containing the metadata of the file (see
https://www.dropbox.com/developers/reference/api#metadata for details).
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at the given path, or the file that was there was deleted.
- 200: Request was okay but response was malformed in some way.
"""
file_res = self.get_file(from_path, rev)
metadata = DropboxClient.__parse_metadata_as_dict(file_res)
return file_res, metadata
@staticmethod
def __parse_metadata_as_dict(dropbox_raw_response):
"""Parses file metadata from a raw dropbox HTTP response, raising a
dropbox.rest.ErrorResponse if parsing fails.
"""
metadata = None
for header, header_val in dropbox_raw_response.getheaders():
if header.lower() == 'x-dropbox-metadata':
try:
metadata = json.loads(header_val)
except ValueError:
raise ErrorResponse(dropbox_raw_response)
if not metadata: raise ErrorResponse(dropbox_raw_response)
return metadata
def delta(self, cursor=None):
"""A way of letting you keep up with changes to files and folders in a
user's Dropbox. You can periodically call delta() to get a list of "delta
entries", which are instructions on how to update your local state to
match the server's state.
Arguments:
- ``cursor``: On the first call, omit this argument (or pass in ``None``). On
subsequent calls, pass in the ``cursor`` string returned by the previous
call.
Returns: A dict with three fields.
- ``entries``: A list of "delta entries" (described below)
- ``reset``: If ``True``, you should your local state to be an empty folder
before processing the list of delta entries. This is only ``True`` only
in rare situations.
- ``cursor``: A string that is used to keep track of your current state.
On the next call to delta(), pass in this value to return entries
that were recorded since the cursor was returned.
- ``has_more``: If ``True``, then there are more entries available; you can
call delta() again immediately to retrieve those entries. If ``False``,
then wait at least 5 minutes (preferably longer) before checking again.
Delta Entries: Each entry is a 2-item list of one of following forms:
- [*path*, *metadata*]: Indicates that there is a file/folder at the given
path. You should add the entry to your local path. (The *metadata*
value is the same as what would be returned by the ``metadata()`` call.)
- If the new entry includes parent folders that don't yet exist in your
local state, create those parent folders in your local state. You
will eventually get entries for those parent folders.
- If the new entry is a file, replace whatever your local state has at
*path* with the new entry.
- If the new entry is a folder, check what your local state has at
*path*. If it's a file, replace it with the new entry. If it's a
folder, apply the new *metadata* to the folder, but do not modify
the folder's children.
- [*path*, ``nil``]: Indicates that there is no file/folder at the *path* on
Dropbox. To update your local state to match, delete whatever is at *path*,
including any children (you will sometimes also get "delete" delta entries
for the children, but this is not guaranteed). If your local state doesn't
have anything at *path*, ignore this entry.
Remember: Dropbox treats file names in a case-insensitive but case-preserving
way. To facilitate this, the *path* strings above are lower-cased versions of
the actual path. The *metadata* dicts have the original, case-preserved path.
"""
path = "/delta"
params = {}
if cursor is not None:
params['cursor'] = cursor
url, params, headers = self.request(path, params)
return self.rest_client.POST(url, params, headers)
def create_copy_ref(self, from_path):
"""Creates and returns a copy ref for a specific file. The copy ref can be
used to instantly copy that file to the Dropbox of another account.
Args:
- ``path``: The path to the file for a copy ref to be created on.
Returns:
- A dictionary that looks like the following example:
``{"expires":"Fri, 31 Jan 2042 21:01:05 +0000", "copy_ref":"z1X6ATl6aWtzOGq0c3g5Ng"}``
"""
path = "/copy_ref/%s%s" % (self.session.root, format_path(from_path))
url, params, headers = self.request(path, {}, method='GET')
return self.rest_client.GET(url, headers)
def add_copy_ref(self, copy_ref, to_path):
"""Adds the file referenced by the copy ref to the specified path
Args:
- ``copy_ref``: A copy ref string that was returned from a create_copy_ref call.
The copy_ref can be created from any other Dropbox account, or from the same account.
- ``path``: The path to where the file will be created.
Returns:
- A dictionary containing the metadata of the new copy of the file.
"""
path = "/fileops/copy"
params = {'from_copy_ref': copy_ref,
'to_path': format_path(to_path),
'root': self.session.root}
url, params, headers = self.request(path, params)
return self.rest_client.POST(url, params, headers)
def file_copy(self, from_path, to_path):
"""Copy a file or folder to a new location.
Args:
- ``from_path``: The path to the file or folder to be copied.
- ``to_path``: The destination path of the file or folder to be copied.
This parameter should include the destination filename (e.g.
from_path: '/test.txt', to_path: '/dir/test.txt'). If there's
already a file at the to_path, this copy will be renamed to
be unique.
Returns:
- A dictionary containing the metadata of the new copy of the file or folder.
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#fileops-copy
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of:
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at given from_path.
- 503: User over storage quota.
"""
params = {'root': self.session.root,
'from_path': format_path(from_path),
'to_path': format_path(to_path),
}
url, params, headers = self.request("/fileops/copy", params)
return self.rest_client.POST(url, params, headers)
def file_create_folder(self, path):
"""Create a folder.
Args:
- ``path``: The path of the new folder.
Returns:
- A dictionary containing the metadata of the newly created folder.
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#fileops-create-folder
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 403: A folder at that path already exists.
"""
params = {'root': self.session.root, 'path': format_path(path)}
url, params, headers = self.request("/fileops/create_folder", params)
return self.rest_client.POST(url, params, headers)
def file_delete(self, path):
"""Delete a file or folder.
Args:
- ``path``: The path of the file or folder.
Returns:
- A dictionary containing the metadata of the just deleted file.
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#fileops-delete
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at the given path.
"""
params = {'root': self.session.root, 'path': format_path(path)}
url, params, headers = self.request("/fileops/delete", params)
return self.rest_client.POST(url, params, headers)
def file_move(self, from_path, to_path):
"""Move a file or folder to a new location.
Args:
- ``from_path``: The path to the file or folder to be moved.
- ``to_path``: The destination path of the file or folder to be moved.
This parameter should include the destination filename (e.g.
- ``from_path``: '/test.txt', to_path: '/dir/test.txt'). If there's
already a file at the to_path, this file or folder will be renamed to
be unique.
Returns:
- A dictionary containing the metadata of the new copy of the file or folder.
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#fileops-move
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at given from_path.
- 503: User over storage quota.
"""
params = {'root': self.session.root, 'from_path': format_path(from_path), 'to_path': format_path(to_path)}
url, params, headers = self.request("/fileops/move", params)
return self.rest_client.POST(url, params, headers)
def metadata(self, path, list=True, file_limit=25000, hash=None, rev=None, include_deleted=False):
"""Retrieve metadata for a file or folder.
A typical use would be:
.. code-block:: python
folder_metadata = client.metadata('/')
print "metadata:", folder_metadata
which would return the metadata of the root directory. This
will look something like:
.. code-block:: python
{
'bytes': 0,
'contents': [
{
'bytes': 0,
'icon': 'folder',
'is_dir': True,
'modified': 'Thu, 25 Aug 2011 00:03:15 +0000',
'path': '/Sample Folder',
'rev': '803beb471',
'revision': 8,
'root': 'dropbox',
'size': '0 bytes',
'thumb_exists': False
},
{
'bytes': 77,
'icon': 'page_white_text',
'is_dir': False,
'mime_type': 'text/plain',
'modified': 'Wed, 20 Jul 2011 22:04:50 +0000',
'path': '/magnum-opus.txt',
'rev': '362e2029684fe',
'revision': 221922,
'root': 'dropbox',
'size': '77 bytes',
'thumb_exists': False
}
],
'hash': 'efdac89c4da886a9cece1927e6c22977',
'icon': 'folder',
'is_dir': True,
'path': '/',
'root': 'app_folder',
'size': '0 bytes',
'thumb_exists': False
}
In this example, the root directory contains two things: ``Sample Folder``,
which is a folder, and ``/magnum-opus.txt``, which is a text file 77 bytes long
Args:
- ``path``: The path to the file or folder.
- ``list``: Whether to list all contained files (only applies when
path refers to a folder).
- ``file_limit``: The maximum number of file entries to return within
a folder. If the number of files in the directory exceeds this
limit, an exception is raised. The server will return at max
25,000 files within a folder.
- ``hash``: Every directory listing has a hash parameter attached that
can then be passed back into this function later to save on\
bandwidth. Rather than returning an unchanged folder's contents,\
the server will instead return a 304.\
- ``rev``: The revision of the file to retrieve the metadata for. [optional]
This parameter only applies for files. If omitted, you'll receive
the most recent revision metadata.
Returns:
- A dictionary containing the metadata of the file or folder
(and contained files if appropriate).
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#metadata
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 304: Current directory hash matches hash parameters, so contents are unchanged.
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at given path.
- 406: Too many file entries to return.
"""
path = "/metadata/%s%s" % (self.session.root, format_path(path))
params = {'file_limit': file_limit,
'list': 'true',
'include_deleted': include_deleted,
}
if not list:
params['list'] = 'false'
if hash is not None:
params['hash'] = hash
if rev:
params['rev'] = rev
url, params, headers = self.request(path, params, method='GET')
return self.rest_client.GET(url, headers)
def thumbnail(self, from_path, size='large', format='JPEG'):
"""Download a thumbnail for an image.
Unlike most other calls, thumbnail returns a raw HTTPResponse with the connection open.
You should call .read() and perform any processing you need, then close the HTTPResponse.
Args:
- ``from_path``: The path to the file to be thumbnailed.
- ``size``: A string describing the desired thumbnail size.
At this time, 'small', 'medium', and 'large' are
officially supported sizes (32x32, 64x64, and 128x128
respectively), though others may be available. Check
https://www.dropbox.com/developers/reference/api#thumbnails for
more details.
Returns:
- An httplib.HTTPResponse that is the result of the request.
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at the given from_path, or files of that type cannot be thumbnailed.
- 415: Image is invalid and cannot be thumbnailed.
"""
assert format in ['JPEG', 'PNG'], "expected a thumbnail format of 'JPEG' or 'PNG', got %s" % format
path = "/thumbnails/%s%s" % (self.session.root, format_path(from_path))
url, params, headers = self.request(path, {'size': size, 'format': format}, method='GET', content_server=True)
return self.rest_client.request("GET", url, headers=headers, raw_response=True)
def thumbnail_and_metadata(self, from_path, size='large', format='JPEG'):
"""Download a thumbnail for an image alongwith its metadata.
Acts as a thin wrapper around thumbnail() (see thumbnail() comments for
more details)
Args:
- ``from_path``: The path to the file to be thumbnailed.
- ``size``: A string describing the desired thumbnail size. See thumbnail()
for details.
Returns:
- An httplib.HTTPResponse that is the result of the request.
- A dictionary containing the metadata of the file whose thumbnail
was downloaded (see https://www.dropbox.com/developers/reference/api#metadata
for details).
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No file was found at the given from_path, or files of that type cannot be thumbnailed.
- 415: Image is invalid and cannot be thumbnailed.
- 200: Request was okay but response was malformed in some way.
"""
thumbnail_res = self.thumbnail(from_path, size, format)
metadata = DropboxClient.__parse_metadata_as_dict(thumbnail_res)
return thumbnail_res, metadata
def search(self, path, query, file_limit=1000, include_deleted=False):
"""Search directory for filenames matching query.
Args:
- ``path``: The directory to search within.
- ``query``: The query to search on (minimum 3 characters).
- ``file_limit``: The maximum number of file entries to return within a folder.
The server will return at max 1,000 files.
- ``include_deleted``: Whether to include deleted files in search results.
Returns:
- A list of the metadata of all matching files (up to
file_limit entries). For a detailed description of what
this call returns, visit:
https://www.dropbox.com/developers/reference/api#search
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
"""
path = "/search/%s%s" % (self.session.root, format_path(path))
params = {
'query': query,
'file_limit': file_limit,
'include_deleted': include_deleted,
}
url, params, headers = self.request(path, params)
return self.rest_client.POST(url, params, headers)
def revisions(self, path, rev_limit=1000):
"""Retrieve revisions of a file.
Args:
- ``path``: The file to fetch revisions for. Note that revisions
are not available for folders.
- ``rev_limit``: The maximum number of file entries to return within
a folder. The server will return at max 1,000 revisions.
Returns:
- A list of the metadata of all matching files (up to rev_limit entries).
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#revisions
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: No revisions were found at the given path.
"""
path = "/revisions/%s%s" % (self.session.root, format_path(path))
params = {
'rev_limit': rev_limit,
}
url, params, headers = self.request(path, params, method='GET')
return self.rest_client.GET(url, headers)
def restore(self, path, rev):
"""Restore a file to a previous revision.
Args:
- ``path``: The file to restore. Note that folders can't be restored.
- ``rev``: A previous rev value of the file to be restored to.
Returns:
- A dictionary containing the metadata of the newly restored file.
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#restore
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: Unable to find the file at the given revision.
"""
path = "/restore/%s%s" % (self.session.root, format_path(path))
params = {
'rev': rev,
}
url, params, headers = self.request(path, params)
return self.rest_client.POST(url, params, headers)
def media(self, path):
"""Get a temporary unauthenticated URL for a media file.
All of Dropbox's API methods require OAuth, which may cause problems in
situations where an application expects to be able to hit a URL multiple times
(for example, a media player seeking around a video file). This method
creates a time-limited URL that can be accessed without any authentication,
and returns that to you, along with an expiration time.
Args:
- ``path``: The file to return a URL for. Folders are not supported.
Returns:
- A dictionary that looks like the following example:
``{'url': 'https://dl.dropbox.com/0/view/wvxv1fw6on24qw7/file.mov', 'expires': 'Thu, 16 Sep 2011 01:01:25 +0000'}``
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#media
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: Unable to find the file at the given path.
"""
path = "/media/%s%s" % (self.session.root, format_path(path))
url, params, headers = self.request(path, method='GET')
return self.rest_client.GET(url, headers)
def share(self, path):
"""Create a shareable link to a file or folder.
Shareable links created on Dropbox are time-limited, but don't require any
authentication, so they can be given out freely. The time limit should allow
at least a day of shareability, though users have the ability to disable
a link from their account if they like.
Args:
- ``path``: The file or folder to share.
Returns:
- A dictionary that looks like the following example:
``{'url': 'http://www.dropbox.com/s/m/a2mbDa2', 'expires': 'Thu, 16 Sep 2011 01:01:25 +0000'}``
For a detailed description of what this call returns, visit:
https://www.dropbox.com/developers/reference/api#shares
Raises:
- A dropbox.rest.ErrorResponse with an HTTP status of
- 400: Bad request (may be due to many things; check e.error for details)
- 404: Unable to find the file at the given path.
"""
path = "/shares/%s%s" % (self.session.root, format_path(path))
url, params, headers = self.request(path, method='GET')
return self.rest_client.GET(url, headers)

View File

@@ -1,4 +0,0 @@
import resources.lib.utils as utils
def resource_filename(*args):
return utils.addon_dir() + "/resources/lib/dropbox/trusted-certs.crt"

View File

@@ -1,317 +0,0 @@
"""
A simple JSON REST request abstraction layer that is used by the
dropbox.client and dropbox.session modules. You shouldn't need to use this.
"""
import httplib
import os
import pkg_resources
import re
import socket
import ssl
import sys
import urllib
import urlparse
from . import util
try:
import json
except ImportError:
import simplejson as json
SDK_VERSION = "1.5.1"
TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt')
class ProperHTTPSConnection(httplib.HTTPConnection):
"""
httplib.HTTPSConnection is broken because it doesn't do server certificate
validation. This class does certificate validation by ensuring:
1. The certificate sent down by the server has a signature chain to one of
the certs in our 'trusted-certs.crt' (this is mostly handled by the 'ssl'
module).
2. The hostname in the certificate matches the hostname we're connecting to.
"""
def __init__(self, host, port, trusted_cert_file=TRUSTED_CERT_FILE):
httplib.HTTPConnection.__init__(self, host, port)
self.ca_certs = trusted_cert_file
self.cert_reqs = ssl.CERT_REQUIRED
def connect(self):
sock = create_connection((self.host, self.port))
self.sock = ssl.wrap_socket(sock, cert_reqs=self.cert_reqs, ca_certs=self.ca_certs)
cert = self.sock.getpeercert()
hostname = self.host.split(':', 0)[0]
match_hostname(cert, hostname)
class CertificateError(ValueError):
pass
def _dnsname_to_pat(dn):
pats = []
for frag in dn.split(r'.'):
if frag == '*':
# When '*' is a fragment by itself, it matches a non-empty dotless
# fragment.
pats.append('[^.]+')
else:
# Otherwise, '*' matches any dotless fragment.
frag = re.escape(frag)
pats.append(frag.replace(r'\*', '[^.]*'))
return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
# This was ripped from Python 3.2 so it's not tested
def match_hostname(cert, hostname):
"""Verify that *cert* (in decoded format as returned by
SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules
are mostly followed, but IP addresses are not accepted for *hostname*.
CertificateError is raised on failure. On success, the function
returns nothing.
"""
if not cert:
raise ValueError("empty or no certificate")
dnsnames = []
san = cert.get('subjectAltName', ())
for key, value in san:
if key == 'DNS':
if _dnsname_to_pat(value).match(hostname):
return
dnsnames.append(value)
if not san:
# The subject is only checked when subjectAltName is empty
for sub in cert.get('subject', ()):
for key, value in sub:
# XXX according to RFC 2818, the most specific Common Name
# must be used.
if key == 'commonName':
if _dnsname_to_pat(value).match(hostname):
return
dnsnames.append(value)
if len(dnsnames) > 1:
raise CertificateError("hostname %r doesn't match either of %s" % (hostname, ', '.join(map(repr, dnsnames))))
elif len(dnsnames) == 1:
raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0]))
else:
raise CertificateError("no appropriate commonName or subjectAltName fields were found")
def create_connection(address):
host, port = address
err = None
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
sock = None
try:
sock = socket.socket(af, socktype, proto)
sock.connect(sa)
return sock
except socket.error, _:
err = _
if sock is not None:
sock.close()
if err is not None:
raise err
else:
raise socket.error("getaddrinfo returns an empty list")
def json_loadb(data):
if sys.version_info >= (3,):
data = data.decode('utf8')
return json.loads(data)
class RESTClientObject(object):
def __init__(self, http_connect=None):
self.http_connect = http_connect
def request(self, method, url, post_params=None, body=None, headers=None, raw_response=False):
post_params = post_params or {}
headers = headers or {}
headers['User-Agent'] = 'OfficialDropboxPythonSDK/' + SDK_VERSION
if post_params:
if body:
raise ValueError("body parameter cannot be used with post_params parameter")
body = urllib.urlencode(post_params)
headers["Content-type"] = "application/x-www-form-urlencoded"
# maintain dynamic lookup of ProperHTTPConnection
http_connect = self.http_connect
if http_connect is None:
http_connect = ProperHTTPSConnection
host = urlparse.urlparse(url).hostname
conn = http_connect(host, 443)
try:
# This code is here because httplib in pre-2.6 Pythons
# doesn't handle file-like objects as HTTP bodies and
# thus requires manual buffering
if not hasattr(body, 'read'):
conn.request(method, url, body, headers)
else:
# Content-Length should be set to prevent upload truncation errors.
clen, raw_data = util.analyze_file_obj(body)
headers["Content-Length"] = str(clen)
conn.request(method, url, "", headers)
if raw_data is not None:
conn.send(raw_data)
else:
BLOCKSIZE = 4 * 1024 * 1024 # 4MB buffering just because
bytes_read = 0
while True:
data = body.read(BLOCKSIZE)
if not data:
break
# Catch Content-Length overflow before the HTTP server does
bytes_read += len(data)
if bytes_read > clen:
raise util.AnalyzeFileObjBug(clen, bytes_read)
conn.send(data)
if bytes_read != clen:
raise util.AnalyzeFileObjBug(clen, bytes_read)
except socket.error, e:
raise RESTSocketError(host, e)
except CertificateError, e:
raise RESTSocketError(host, "SSL certificate error: " + e)
r = conn.getresponse()
if r.status != 200:
raise ErrorResponse(r)
if raw_response:
return r
else:
try:
resp = json_loadb(r.read())
except ValueError:
raise ErrorResponse(r)
finally:
conn.close()
return resp
def GET(self, url, headers=None, raw_response=False):
assert type(raw_response) == bool
return self.request("GET", url, headers=headers, raw_response=raw_response)
def POST(self, url, params=None, headers=None, raw_response=False):
assert type(raw_response) == bool
if params is None:
params = {}
return self.request("POST", url,
post_params=params, headers=headers, raw_response=raw_response)
def PUT(self, url, body, headers=None, raw_response=False):
assert type(raw_response) == bool
return self.request("PUT", url, body=body, headers=headers, raw_response=raw_response)
class RESTClient(object):
IMPL = RESTClientObject()
"""
An class with all static methods to perform JSON REST requests that is used internally
by the Dropbox Client API. It provides just enough gear to make requests
and get responses as JSON data (when applicable). All requests happen over SSL.
"""
@classmethod
def request(cls, *n, **kw):
"""Perform a REST request and parse the response.
Args:
- ``method``: An HTTP method (e.g. 'GET' or 'POST').
- ``url``: The URL to make a request to.
- ``post_params``: A dictionary of parameters to put in the body of the request.
This option may not be used if the body parameter is given.
- ``body``: The body of the request. Typically, this value will be a string.
It may also be a file-like object in Python 2.6 and above. The body
parameter may not be used with the post_params parameter.
- ``headers``: A dictionary of headers to send with the request.
- ``raw_response``: Whether to return the raw httplib.HTTPReponse object. [default False]
It's best enabled for requests that return large amounts of data that you
would want to .read() incrementally rather than loading into memory. Also
use this for calls where you need to read metadata like status or headers,
or if the body is not JSON.
Returns:
- The JSON-decoded data from the server, unless raw_response is
specified, in which case an httplib.HTTPReponse object is returned instead.
Raises:
- dropbox.rest.ErrorResponse: The returned HTTP status is not 200, or the body was
not parsed from JSON successfully.
- dropbox.rest.RESTSocketError: A socket.error was raised while contacting Dropbox.
"""
return cls.IMPL.request(*n, **kw)
@classmethod
def GET(cls, *n, **kw):
"""Perform a GET request using RESTClient.request"""
return cls.IMPL.GET(*n, **kw)
@classmethod
def POST(cls, *n, **kw):
"""Perform a POST request using RESTClient.request"""
return cls.IMPL.POST(*n, **kw)
@classmethod
def PUT(cls, *n, **kw):
"""Perform a PUT request using RESTClient.request"""
return cls.IMPL.PUT(*n, **kw)
class RESTSocketError(socket.error):
"""
A light wrapper for socket.errors raised by dropbox.rest.RESTClient.request
that adds more information to the socket.error.
"""
def __init__(self, host, e):
msg = "Error connecting to \"%s\": %s" % (host, str(e))
socket.error.__init__(self, msg)
class ErrorResponse(Exception):
"""
Raised by dropbox.rest.RESTClient.request for requests that:
- Return a non-200 HTTP response, or
- Have a non-JSON response body, or
- Have a malformed/missing header in the response.
Most errors that Dropbox returns will have a error field that is unpacked and
placed on the ErrorResponse exception. In some situations, a user_error field
will also come back. Messages under user_error are worth showing to an end-user
of your app, while other errors are likely only useful for you as the developer.
"""
def __init__(self, http_resp):
self.status = http_resp.status
self.reason = http_resp.reason
self.body = http_resp.read()
self.headers = http_resp.getheaders()
try:
self.body = json_loadb(self.body)
self.error_msg = self.body.get('error')
self.user_error_msg = self.body.get('user_error')
except ValueError:
self.error_msg = None
self.user_error_msg = None
def __str__(self):
if self.user_error_msg and self.user_error_msg != self.error_msg:
# one is translated and the other is English
msg = "%s (%s)" % (self.user_error_msg, self.error_msg)
elif self.error_msg:
msg = self.error_msg
elif not self.body:
msg = self.reason
else:
msg = "Error parsing response body or headers: " +\
"Body - %s Headers - %s" % (self.body, self.headers)
return "[%d] %s" % (self.status, repr(msg))

View File

@@ -1,286 +0,0 @@
"""
dropbox.session.DropboxSession is responsible for holding OAuth authentication info
(app key/secret, request key/secret, access key/secret) as well as configuration information for your app
('app_folder' or 'dropbox' access type, optional locale preference). It knows how to
use all of this information to craft properly constructed requests to Dropbox.
A DropboxSession object must be passed to a dropbox.client.DropboxClient object upon
initialization.
"""
from __future__ import absolute_import
import random
import sys
import time
import urllib
try:
from urlparse import parse_qs
except ImportError:
# fall back for Python 2.5
from cgi import parse_qs
from . import rest
class OAuthToken(object):
__slots__ = ('key', 'secret')
def __init__(self, key, secret):
self.key = key
self.secret = secret
class DropboxSession(object):
API_VERSION = 1
API_HOST = "api.dropbox.com"
WEB_HOST = "www.dropbox.com"
API_CONTENT_HOST = "api-content.dropbox.com"
def __init__(self, consumer_key, consumer_secret, access_type, locale=None, rest_client=rest.RESTClient):
"""Initialize a DropboxSession object.
Your consumer key and secret are available
at https://www.dropbox.com/developers/apps
Args:
- ``access_type``: Either 'dropbox' or 'app_folder'. All path-based operations
will occur relative to either the user's Dropbox root directory
or your application's app folder.
- ``locale``: A locale string ('en', 'pt_PT', etc.) [optional]
The locale setting will be used to translate any user-facing error
messages that the server generates. At this time Dropbox supports
'en', 'es', 'fr', 'de', and 'ja', though we will be supporting more
languages in the future. If you send a language the server doesn't
support, messages will remain in English. Look for these translated
messages in rest.ErrorResponse exceptions as e.user_error_msg.
"""
assert access_type in ['dropbox', 'app_folder'], "expected access_type of 'dropbox' or 'app_folder'"
self.consumer_creds = OAuthToken(consumer_key, consumer_secret)
self.token = None
self.request_token = None
self.root = 'sandbox' if access_type == 'app_folder' else 'dropbox'
self.locale = locale
self.rest_client = rest_client
def is_linked(self):
"""Return whether the DropboxSession has an access token attached."""
return bool(self.token)
def unlink(self):
"""Remove any attached access token from the DropboxSession."""
self.token = None
def set_token(self, access_token, access_token_secret):
"""Attach an access token to the DropboxSession.
Note that the access 'token' is made up of both a token string
and a secret string.
"""
self.token = OAuthToken(access_token, access_token_secret)
def set_request_token(self, request_token, request_token_secret):
"""Attach an request token to the DropboxSession.
Note that the request 'token' is made up of both a token string
and a secret string.
"""
self.request_token = OAuthToken(request_token, request_token_secret)
def build_path(self, target, params=None):
"""Build the path component for an API URL.
This method urlencodes the parameters, adds them
to the end of the target url, and puts a marker for the API
version in front.
Args:
- ``target``: A target url (e.g. '/files') to build upon.
- ``params``: A dictionary of parameters (name to value). [optional]
Returns:
- The path and parameters components of an API URL.
"""
if sys.version_info < (3,) and type(target) == unicode:
target = target.encode("utf8")
target_path = urllib.quote(target)
params = params or {}
params = params.copy()
if self.locale:
params['locale'] = self.locale
if params:
return "/%d%s?%s" % (self.API_VERSION, target_path, urllib.urlencode(params))
else:
return "/%d%s" % (self.API_VERSION, target_path)
def build_url(self, host, target, params=None):
"""Build an API URL.
This method adds scheme and hostname to the path
returned from build_path.
Args:
- ``target``: A target url (e.g. '/files') to build upon.
- ``params``: A dictionary of parameters (name to value). [optional]
Returns:
- The full API URL.
"""
return "https://%s%s" % (host, self.build_path(target, params))
def build_authorize_url(self, request_token, oauth_callback=None):
"""Build a request token authorization URL.
After obtaining a request token, you'll need to send the user to
the URL returned from this function so that they can confirm that
they want to connect their account to your app.
Args:
- ``request_token``: A request token from obtain_request_token.
- ``oauth_callback``: A url to redirect back to with the authorized
request token.
Returns:
- An authorization for the given request token.
"""
params = {'oauth_token': request_token.key,
}
if oauth_callback:
params['oauth_callback'] = oauth_callback
return self.build_url(self.WEB_HOST, '/oauth/authorize', params)
def obtain_request_token(self):
"""Obtain a request token from the Dropbox API.
This is your first step in the OAuth process. You call this to get a
request_token from the Dropbox server that you can then use with
DropboxSession.build_authorize_url() to get the user to authorize it.
After it's authorized you use this token with
DropboxSession.obtain_access_token() to get an access token.
NOTE: You should only need to do this once for each user, and then you
can store the access token for that user for later operations.
Returns:
- An dropbox.session.OAuthToken representing the request token Dropbox assigned
to this app. Also attaches the request token as self.request_token.
"""
self.token = None # clear any token currently on the request
url = self.build_url(self.API_HOST, '/oauth/request_token')
headers, params = self.build_access_headers('POST', url)
response = self.rest_client.POST(url, headers=headers, params=params, raw_response=True)
self.request_token = self._parse_token(response.read())
return self.request_token
def obtain_access_token(self, request_token=None):
"""Obtain an access token for a user.
After you get a request token, and then send the user to the authorize
URL, you can use the authorized request token with this method to get the
access token to use for future operations. The access token is stored on
the session object.
Args:
- ``request_token``: A request token from obtain_request_token. [optional]
The request_token should have been authorized via the
authorization url from build_authorize_url. If you don't pass
a request_token, the fallback is self.request_token, which
will exist if you previously called obtain_request_token on this
DropboxSession instance.
Returns:
- An tuple of (key, secret) representing the access token Dropbox assigned
to this app and user. Also attaches the access token as self.token.
"""
request_token = request_token or self.request_token
assert request_token, "No request_token available on the session. Please pass one."
url = self.build_url(self.API_HOST, '/oauth/access_token')
headers, params = self.build_access_headers('POST', url, request_token=request_token)
response = self.rest_client.POST(url, headers=headers, params=params, raw_response=True)
self.token = self._parse_token(response.read())
return self.token
def build_access_headers(self, method, resource_url, params=None, request_token=None):
"""Build OAuth access headers for a future request.
Args:
- ``method``: The HTTP method being used (e.g. 'GET' or 'POST').
- ``resource_url``: The full url the request will be made to.
- ``params``: A dictionary of parameters to add to what's already on the url.
Typically, this would consist of POST parameters.
Returns:
- A tuple of (header_dict, params) where header_dict is a dictionary
of header names and values appropriate for passing into dropbox.rest.RESTClient
and params is a dictionary like the one that was passed in, but augmented with
oauth-related parameters as appropriate.
"""
if params is None:
params = {}
else:
params = params.copy()
oauth_params = {
'oauth_consumer_key' : self.consumer_creds.key,
'oauth_timestamp' : self._generate_oauth_timestamp(),
'oauth_nonce' : self._generate_oauth_nonce(),
'oauth_version' : self._oauth_version(),
}
token = request_token if request_token is not None else self.token
if token:
oauth_params['oauth_token'] = token.key
self._oauth_sign_request(oauth_params, self.consumer_creds, token)
params.update(oauth_params)
return {}, params
@classmethod
def _oauth_sign_request(cls, params, consumer_pair, token_pair):
params.update({'oauth_signature_method' : 'PLAINTEXT',
'oauth_signature' : ('%s&%s' % (consumer_pair.secret, token_pair.secret)
if token_pair is not None else
'%s&' % (consumer_pair.secret,))})
@classmethod
def _generate_oauth_timestamp(cls):
return int(time.time())
@classmethod
def _generate_oauth_nonce(cls, length=8):
return ''.join([str(random.randint(0, 9)) for i in range(length)])
@classmethod
def _oauth_version(cls):
return '1.0'
@classmethod
def _parse_token(cls, s):
if not s:
raise ValueError("Invalid parameter string.")
params = parse_qs(s, keep_blank_values=False)
if not params:
raise ValueError("Invalid parameter string: %r" % s)
try:
key = params['oauth_token'][0]
except Exception:
raise ValueError("'oauth_token' not found in OAuth request.")
try:
secret = params['oauth_token_secret'][0]
except Exception:
raise ValueError("'oauth_token_secret' not found in "
"OAuth request.")
return OAuthToken(key, secret)

View File

@@ -1,11 +0,0 @@
import sys
def b(str_):
if sys.version_info >= (3,):
str_ = str_.encode('latin1')
return str_
def u(str_):
if sys.version_info < (3,):
str_ = str_.decode('latin1')
return str_

View File

@@ -1,341 +0,0 @@
# Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Server CA/emailAddress=server-certs@thawte.com <server-certs@thawte.com>
# Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Server CA/emailAddress= server-certs@thawte.com
-----BEGIN CERTIFICATE-----
MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
-----END CERTIFICATE-----
# Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com <premium-server@thawte.com>
# Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com <premium-server@thawte.com>
-----BEGIN CERTIFICATE-----
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
-----END CERTIFICATE-----
# Subject: C=US, O=VeriSign, Inc., OU=Class 1 Public Primary Certification Authority
# Issuer: C=US, O=VeriSign, Inc., OU=Class 1 Public Primary Certification Authority
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEDJQM89Q0VbzXIGtZVxPyCUwDQYJKoZIhvcNAQECBQAwXzELMAkG
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
MDEyOTAwMDAwMFoXDTIwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f
zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi
TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G
CSqGSIb3DQEBAgUAA4GBAEtEZmBoZOSYG/OwcuaViXzde7OVwB0u2NgZ0C00PcZQ
mhCGjKo/O6gE/DdSlcPZydvN8oYGxLEb8IKIMEKOF1AcZHq4PplJdJf8rAJD+5YM
VgQlDHx8h50kp9jwMim1pN9dokzFFjKoQvZFprY2ueC/ZTaTwtLXa9zeWdaiNfhF
-----END CERTIFICATE-----
# Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
# Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
-----END CERTIFICATE-----
# Subject: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
# Issuer: C=US, O=RSA Data Security, Inc., OU=Secure Server Certification Authority
-----BEGIN CERTIFICATE-----
MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
-----END CERTIFICATE-----
# Subject: C=US, O=Equifax Secure Inc., CN=Equifax Secure Global eBusiness CA-1
# Issuer: C=US, O=Equifax Secure Inc., CN=Equifax Secure Global eBusiness CA-1
-----BEGIN CERTIFICATE-----
MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
-----END CERTIFICATE-----
# Subject: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware
# Issuer: C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Hardware
-----BEGIN CERTIFICATE-----
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
-----END CERTIFICATE-----
# Subject: C=US, O=Network Solutions L.L.C., CN=Network Solutions Certificate Authority
# Issuer: C=US, O=Network Solutions L.L.C., CN=Network Solutions Certificate Authority
-----BEGIN CERTIFICATE-----
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
-----END CERTIFICATE-----
# Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
# Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
-----BEGIN CERTIFICATE-----
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
ReYNnyicsbkqWletNw+vHX/bvZ8=
-----END CERTIFICATE-----
# Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certificates.godaddy.com/repository<http://certificates.godaddy.com/repository>, CN=Go Daddy Secure Certification Authority/serialNumber=07969287
# Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
U+4=
-----END CERTIFICATE-----
# Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
# Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
4uJEvlz36hz1
-----END CERTIFICATE-----
# Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
# Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
# Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority
# Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority
-----BEGIN CERTIFICATE-----
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
-----END CERTIFICATE-----
# Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
# Issuer: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com//emailAddress=info@valicert.com<http://www.valicert.com//emailAddress=info@valicert.com>
-----BEGIN CERTIFICATE-----
MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
-----END CERTIFICATE-----
# Subject: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com//emailAddress=info@valicert.com<http://www.valicert.com//emailAddress=info@valicert.com>
# Issuer: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com//emailAddress=info@valicert.com<http://www.valicert.com//emailAddress=info@valicert.com>
-----BEGIN CERTIFICATE-----
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
-----END CERTIFICATE-----

View File

@@ -1,53 +0,0 @@
import os
class AnalyzeFileObjBug(Exception):
msg = ("\n"
"Expected file object to have %d bytes, instead we read %d bytes.\n"
"File size detection may have failed (see dropbox.util.AnalyzeFileObj)\n")
def __init__(self, expected, actual):
self.expected = expected
self.actual = actual
def __str__(self):
return self.msg % (self.expected, self.actual)
def analyze_file_obj(obj):
""" Get the size and contents of a file-like object.
Returns: (size, raw_data)
size: The amount of data waiting to be read
raw_data: If not None, the entire contents of the stream (as a string).
None if the stream should be read() in chunks.
"""
pos = 0
if hasattr(obj, 'tell'):
pos = obj.tell()
# Handle cStringIO and StringIO
if hasattr(obj, 'getvalue'):
# Why using getvalue() makes sense:
# For StringIO, this string is pre-computed anyway by read().
# For cStringIO, getvalue() is the only way
# to determine the length without read()'ing the whole thing.
raw_data = obj.getvalue()
if pos == 0:
return (len(raw_data), raw_data)
else:
# We could return raw_data[pos:], but that could drastically
# increase memory usage. Better to read it block at a time.
size = max(0, len(raw_data) - pos)
return (size, None)
# Handle real files
if hasattr(obj, 'fileno'):
size = max(0, os.fstat(obj.fileno()).st_size - pos)
return (size, None)
# User-defined object with len()
if hasattr(obj, '__len__'):
size = max(0, len(obj) - pos)
return (size, None)
# We don't know what kind of stream this is.
# To determine the size, we must read the whole thing.
raw_data = obj.read()
return (len(raw_data), raw_data)

View File

@@ -1,430 +0,0 @@
"""
Copyright (c) 2003-2010 Gustavo Niemeyer <gustavo@niemeyer.net>
This module offers extensions to the standard python 2.3+
datetime module.
"""
__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>"
__license__ = "PSF License"
import datetime
import calendar
__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"]
class weekday(object):
__slots__ = ["weekday", "n"]
def __init__(self, weekday, n=None):
self.weekday = weekday
self.n = n
def __call__(self, n):
if n == self.n:
return self
else:
return self.__class__(self.weekday, n)
def __eq__(self, other):
try:
if self.weekday != other.weekday or self.n != other.n:
return False
except AttributeError:
return False
return True
def __repr__(self):
s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday]
if not self.n:
return s
else:
return "%s(%+d)" % (s, self.n)
MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)])
class relativedelta:
"""
The relativedelta type is based on the specification of the excelent
work done by M.-A. Lemburg in his mx.DateTime extension. However,
notice that this type does *NOT* implement the same algorithm as
his work. Do *NOT* expect it to behave like mx.DateTime's counterpart.
There's two different ways to build a relativedelta instance. The
first one is passing it two date/datetime classes:
relativedelta(datetime1, datetime2)
And the other way is to use the following keyword arguments:
year, month, day, hour, minute, second, microsecond:
Absolute information.
years, months, weeks, days, hours, minutes, seconds, microseconds:
Relative information, may be negative.
weekday:
One of the weekday instances (MO, TU, etc). These instances may
receive a parameter N, specifying the Nth weekday, which could
be positive or negative (like MO(+1) or MO(-2). Not specifying
it is the same as specifying +1. You can also use an integer,
where 0=MO.
leapdays:
Will add given days to the date found, if year is a leap
year, and the date found is post 28 of february.
yearday, nlyearday:
Set the yearday or the non-leap year day (jump leap days).
These are converted to day/month/leapdays information.
Here is the behavior of operations with relativedelta:
1) Calculate the absolute year, using the 'year' argument, or the
original datetime year, if the argument is not present.
2) Add the relative 'years' argument to the absolute year.
3) Do steps 1 and 2 for month/months.
4) Calculate the absolute day, using the 'day' argument, or the
original datetime day, if the argument is not present. Then,
subtract from the day until it fits in the year and month
found after their operations.
5) Add the relative 'days' argument to the absolute day. Notice
that the 'weeks' argument is multiplied by 7 and added to
'days'.
6) Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds,
microsecond/microseconds.
7) If the 'weekday' argument is present, calculate the weekday,
with the given (wday, nth) tuple. wday is the index of the
weekday (0-6, 0=Mon), and nth is the number of weeks to add
forward or backward, depending on its signal. Notice that if
the calculated date is already Monday, for example, using
(0, 1) or (0, -1) won't change the day.
"""
def __init__(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0,
hours=0, minutes=0, seconds=0, microseconds=0,
year=None, month=None, day=None, weekday=None,
yearday=None, nlyearday=None,
hour=None, minute=None, second=None, microsecond=None):
if dt1 and dt2:
if not isinstance(dt1, datetime.date) or \
not isinstance(dt2, datetime.date):
raise TypeError, "relativedelta only diffs datetime/date"
if type(dt1) is not type(dt2):
if not isinstance(dt1, datetime.datetime):
dt1 = datetime.datetime.fromordinal(dt1.toordinal())
elif not isinstance(dt2, datetime.datetime):
dt2 = datetime.datetime.fromordinal(dt2.toordinal())
self.years = 0
self.months = 0
self.days = 0
self.leapdays = 0
self.hours = 0
self.minutes = 0
self.seconds = 0
self.microseconds = 0
self.year = None
self.month = None
self.day = None
self.weekday = None
self.hour = None
self.minute = None
self.second = None
self.microsecond = None
self._has_time = 0
months = (dt1.year*12+dt1.month)-(dt2.year*12+dt2.month)
self._set_months(months)
dtm = self.__radd__(dt2)
if dt1 < dt2:
while dt1 > dtm:
months += 1
self._set_months(months)
dtm = self.__radd__(dt2)
else:
while dt1 < dtm:
months -= 1
self._set_months(months)
dtm = self.__radd__(dt2)
delta = dt1 - dtm
self.seconds = delta.seconds+delta.days*86400
self.microseconds = delta.microseconds
else:
self.years = years
self.months = months
self.days = days+weeks*7
self.leapdays = leapdays
self.hours = hours
self.minutes = minutes
self.seconds = seconds
self.microseconds = microseconds
self.year = year
self.month = month
self.day = day
self.hour = hour
self.minute = minute
self.second = second
self.microsecond = microsecond
if type(weekday) is int:
self.weekday = weekdays[weekday]
else:
self.weekday = weekday
yday = 0
if nlyearday:
yday = nlyearday
elif yearday:
yday = yearday
if yearday > 59:
self.leapdays = -1
if yday:
ydayidx = [31,59,90,120,151,181,212,243,273,304,334,366]
for idx, ydays in enumerate(ydayidx):
if yday <= ydays:
self.month = idx+1
if idx == 0:
self.day = yday
else:
self.day = yday-ydayidx[idx-1]
break
else:
raise ValueError, "invalid year day (%d)" % yday
self._fix()
def _fix(self):
if abs(self.microseconds) > 999999:
s = self.microseconds//abs(self.microseconds)
div, mod = divmod(self.microseconds*s, 1000000)
self.microseconds = mod*s
self.seconds += div*s
if abs(self.seconds) > 59:
s = self.seconds//abs(self.seconds)
div, mod = divmod(self.seconds*s, 60)
self.seconds = mod*s
self.minutes += div*s
if abs(self.minutes) > 59:
s = self.minutes//abs(self.minutes)
div, mod = divmod(self.minutes*s, 60)
self.minutes = mod*s
self.hours += div*s
if abs(self.hours) > 23:
s = self.hours//abs(self.hours)
div, mod = divmod(self.hours*s, 24)
self.hours = mod*s
self.days += div*s
if abs(self.months) > 11:
s = self.months//abs(self.months)
div, mod = divmod(self.months*s, 12)
self.months = mod*s
self.years += div*s
if (self.hours or self.minutes or self.seconds or self.microseconds or
self.hour is not None or self.minute is not None or
self.second is not None or self.microsecond is not None):
self._has_time = 1
else:
self._has_time = 0
def _set_months(self, months):
self.months = months
if abs(self.months) > 11:
s = self.months//abs(self.months)
div, mod = divmod(self.months*s, 12)
self.months = mod*s
self.years = div*s
else:
self.years = 0
def __radd__(self, other):
if not isinstance(other, datetime.date):
raise TypeError, "unsupported type for add operation"
elif self._has_time and not isinstance(other, datetime.datetime):
other = datetime.datetime.fromordinal(other.toordinal())
year = (self.year or other.year)+self.years
month = self.month or other.month
if self.months:
assert 1 <= abs(self.months) <= 12
month += self.months
if month > 12:
year += 1
month -= 12
elif month < 1:
year -= 1
month += 12
day = min(calendar.monthrange(year, month)[1],
self.day or other.day)
repl = {"year": year, "month": month, "day": day}
for attr in ["hour", "minute", "second", "microsecond"]:
value = getattr(self, attr)
if value is not None:
repl[attr] = value
days = self.days
if self.leapdays and month > 2 and calendar.isleap(year):
days += self.leapdays
ret = (other.replace(**repl)
+ datetime.timedelta(days=days,
hours=self.hours,
minutes=self.minutes,
seconds=self.seconds,
microseconds=self.microseconds))
if self.weekday:
weekday, nth = self.weekday.weekday, self.weekday.n or 1
jumpdays = (abs(nth)-1)*7
if nth > 0:
jumpdays += (7-ret.weekday()+weekday)%7
else:
jumpdays += (ret.weekday()-weekday)%7
jumpdays *= -1
ret += datetime.timedelta(days=jumpdays)
return ret
def __rsub__(self, other):
return self.__neg__().__radd__(other)
def __add__(self, other):
if not isinstance(other, relativedelta):
raise TypeError, "unsupported type for add operation"
return relativedelta(years=other.years+self.years,
months=other.months+self.months,
days=other.days+self.days,
hours=other.hours+self.hours,
minutes=other.minutes+self.minutes,
seconds=other.seconds+self.seconds,
microseconds=other.microseconds+self.microseconds,
leapdays=other.leapdays or self.leapdays,
year=other.year or self.year,
month=other.month or self.month,
day=other.day or self.day,
weekday=other.weekday or self.weekday,
hour=other.hour or self.hour,
minute=other.minute or self.minute,
second=other.second or self.second,
microsecond=other.second or self.microsecond)
def __sub__(self, other):
if not isinstance(other, relativedelta):
raise TypeError, "unsupported type for sub operation"
return relativedelta(years=other.years-self.years,
months=other.months-self.months,
days=other.days-self.days,
hours=other.hours-self.hours,
minutes=other.minutes-self.minutes,
seconds=other.seconds-self.seconds,
microseconds=other.microseconds-self.microseconds,
leapdays=other.leapdays or self.leapdays,
year=other.year or self.year,
month=other.month or self.month,
day=other.day or self.day,
weekday=other.weekday or self.weekday,
hour=other.hour or self.hour,
minute=other.minute or self.minute,
second=other.second or self.second,
microsecond=other.second or self.microsecond)
def __neg__(self):
return relativedelta(years=-self.years,
months=-self.months,
days=-self.days,
hours=-self.hours,
minutes=-self.minutes,
seconds=-self.seconds,
microseconds=-self.microseconds,
leapdays=self.leapdays,
year=self.year,
month=self.month,
day=self.day,
weekday=self.weekday,
hour=self.hour,
minute=self.minute,
second=self.second,
microsecond=self.microsecond)
def __nonzero__(self):
return not (not self.years and
not self.months and
not self.days and
not self.hours and
not self.minutes and
not self.seconds and
not self.microseconds and
not self.leapdays and
self.year is None and
self.month is None and
self.day is None and
self.weekday is None and
self.hour is None and
self.minute is None and
self.second is None and
self.microsecond is None)
def __mul__(self, other):
f = float(other)
return relativedelta(years=self.years*f,
months=self.months*f,
days=self.days*f,
hours=self.hours*f,
minutes=self.minutes*f,
seconds=self.seconds*f,
microseconds=self.microseconds*f,
leapdays=self.leapdays,
year=self.year,
month=self.month,
day=self.day,
weekday=self.weekday,
hour=self.hour,
minute=self.minute,
second=self.second,
microsecond=self.microsecond)
def __eq__(self, other):
if not isinstance(other, relativedelta):
return False
if self.weekday or other.weekday:
if not self.weekday or not other.weekday:
return False
if self.weekday.weekday != other.weekday.weekday:
return False
n1, n2 = self.weekday.n, other.weekday.n
if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)):
return False
return (self.years == other.years and
self.months == other.months and
self.days == other.days and
self.hours == other.hours and
self.minutes == other.minutes and
self.seconds == other.seconds and
self.leapdays == other.leapdays and
self.year == other.year and
self.month == other.month and
self.day == other.day and
self.hour == other.hour and
self.minute == other.minute and
self.second == other.second and
self.microsecond == other.microsecond)
def __ne__(self, other):
return not self.__eq__(other)
def __div__(self, other):
return self.__mul__(1/float(other))
def __repr__(self):
l = []
for attr in ["years", "months", "days", "leapdays",
"hours", "minutes", "seconds", "microseconds"]:
value = getattr(self, attr)
if value:
l.append("%s=%+d" % (attr, value))
for attr in ["year", "month", "day", "weekday",
"hour", "minute", "second", "microsecond"]:
value = getattr(self, attr)
if value is not None:
l.append("%s=%s" % (attr, `value`))
return "%s(%s)" % (self.__class__.__name__, ", ".join(l))

View File

@@ -1,32 +0,0 @@
import xbmc
import xbmcaddon
__addon_id__= 'script.xbmcbackup'
__Addon = xbmcaddon.Addon(__addon_id__)
def data_dir():
return __Addon.getAddonInfo('profile')
def addon_dir():
return __Addon.getAddonInfo('path')
def openSettings():
__Addon.openSettings()
def log(message,loglevel=xbmc.LOGNOTICE):
xbmc.log(encode(__addon_id__ + ": " + message),level=loglevel)
def showNotification(message):
xbmc.executebuiltin("Notification(" + encode(getString(30010)) + "," + encode(message) + ",4000," + xbmc.translatePath(__Addon.getAddonInfo('path') + "/icon.png") + ")")
def getSetting(name):
return __Addon.getSetting(name)
def setSetting(name,value):
__Addon.setSetting(name,value)
def getString(string_id):
return __Addon.getLocalizedString(string_id)
def encode(string):
return string.encode('UTF-8','replace')

View File

@@ -1,203 +0,0 @@
import utils as utils
import xbmc
import xbmcvfs
import xbmcgui
import sys
from dropbox import client, rest, session
APP_KEY = utils.getSetting('dropbox_key')
APP_SECRET = utils.getSetting('dropbox_secret')
class Vfs:
root_path = None
def __init__(self,rootString):
self.set_root(rootString)
def set_root(self,rootString):
old_root = self.root_path
self.root_path = rootString
#fix slashes
self.root_path = self.root_path.replace("\\","/")
#check if trailing slash is included
if(self.root_path[-1:] != "/"):
self.root_path = self.root_path + "/"
#return the old root
return old_root
def listdir(self,directory):
return {}
def mkdir(self,directory):
return True
def put(self,source,dest):
return True
def getFile(self,source):
return True
def rmdir(self,directory):
return True
def exists(self,aFile):
return True
class XBMCFileSystem(Vfs):
def listdir(self,directory):
return xbmcvfs.listdir(directory)
def mkdir(self,directory):
return xbmcvfs.mkdir(directory)
def put(self,source,dest):
return xbmcvfs.copy(source,dest)
def rmdir(self,directory):
return xbmcvfs.rmdir(directory,True)
def exists(self,aFile):
return xbmcvfs.exists(aFile)
class DropboxFileSystem(Vfs):
client = None
def __init__(self,rootString):
self.set_root(rootString)
self.setup()
def setup(self):
if(APP_KEY == '' or APP_SECRET == ''):
xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30058),utils.getString(30059))
return
user_token_key,user_token_secret = self.getToken()
sess = session.DropboxSession(APP_KEY,APP_SECRET,"app_folder")
if(user_token_key == '' and user_token_secret == ''):
token = sess.obtain_request_token()
url = sess.build_authorize_url(token)
#print url in log
utils.log("Authorize URL: " + url)
xbmcgui.Dialog().ok(utils.getString(30010),utils.getString(30056),utils.getString(30057))
#if user authorized this will work
user_token = sess.obtain_access_token(token)
self.setToken(user_token.key,user_token.secret)
else:
sess.set_token(user_token_key,user_token_secret)
self.client = client.DropboxClient(sess)
try:
utils.log(str(self.client.account_info()))
except:
#this didn't work, delete the token file
self.deleteToken()
def listdir(self,directory):
if(self.client != None and self.exists(directory)):
files = []
dirs = []
metadata = self.client.metadata(directory)
for aFile in metadata['contents']:
if(aFile['is_dir']):
dirs.append(aFile['path'][len(directory):])
else:
files.append(aFile['path'][len(directory):])
return [dirs,files]
else:
return [[],[]]
def mkdir(self,directory):
directory = self._fix_slashes(directory)
if(self.client != None):
if(not self.exists(directory)):
self.client.file_create_folder(directory)
return True
else:
return False
def rmdir(self,directory):
directory = self._fix_slashes(directory)
if(self.client != None and self.exists(directory)):
self.client.file_delete(directory)
else:
return False
def exists(self,aFile):
aFile = self._fix_slashes(aFile)
if(self.client != None):
try:
meta_data = self.client.metadata(aFile)
#if we make it here the file does exist
return True
except:
return False
else:
return False
def put(self,source,dest):
dest = self._fix_slashes(dest)
if(self.client != None):
f = open(source,'rb')
try:
response = self.client.put_file(dest,f,True)
return True
except:
#if we have an exception retry
retry = True
return self.put(source,dest)
else:
return False
def get_file(self,source,dest):
if(self.client != None):
#write the file locally
out = open(dest,'wb')
f = self.client.get_file(source).read()
out.write(f)
out.close()
return True
else:
return False
def _fix_slashes(self,filename):
return filename.replace('\\','/')
def setToken(self,key,secret):
#write the token files
token_file = open(xbmc.translatePath(utils.data_dir() + "tokens.txt"),'w')
token_file.write("%s|%s" % (key,secret))
token_file.close()
def getToken(self):
#get tokens, if they exist
if(xbmcvfs.exists(xbmc.translatePath(utils.data_dir() + "tokens.txt"))):
token_file = open(xbmc.translatePath(utils.data_dir() + "tokens.txt"))
key,secret = token_file.read().split('|')
token_file.close()
return [key,secret]
else:
return ["",""]
def deleteToken(self):
if(xbmcvfs.exists(xbmc.translatePath(utils.data_dir() + "tokens.txt"))):
xbmcvfs.delete(xbmc.translatePath(utils.data_dir() + "tokens.txt"))

View File

@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settings>
<category id="general" label="30011">
<setting id="remote_selection" type="enum" lvalues="30018|30019|30027" default="0" label="30025"/>
<setting id="remote_path_2" type="text" label="30024" default="" visible="eq(-1,1)" />
<setting id="remote_path" type="folder" label="30020" visible="eq(-2,0)" />
<setting id="dropbox_key" type="text" label="30028" visible="eq(-3,2)" default="" />
<setting id="dropbox_secret" type="text" label="30029" visible="eq(-4,2)" default="" />
<setting id="backup_rotation" type="number" label="30026" default="0" />
<setting id="run_silent" type="bool" label="30022" default="false" />
</category>
<category id="selection" label="30012">
<setting id="backup_addons" type="bool" label="30030" default="true" />
<setting id="backup_addon_data" type="bool" label="30031" default="false" />
<setting id="backup_database" type="bool" label="30032" default="true" />
<setting id="backup_playlists" type="bool" label="30033" default="true" />
<setting id="backup_profiles" type="bool" label="30080" default="false" />
<setting id="backup_thumbnails" type="bool" label="30034" default="true" />
<setting id="backup_config" type="bool" label="30035" default="true" />
<setting id="custom_dir_1_enable" type="bool" label="30036" default="false" />
<setting id="backup_custom_dir_1" type="folder" label="30018" default="" visible="eq(-1,true)"/>
<setting id="custom_dir_2_enable" type="bool" label="30037" default="false" />
<setting id="backup_custom_dir_2" type="folder" label="30018" default="" visible="eq(-1,true)"/>
</category>
<category id="scheduling" label="30013">
<setting id="enable_scheduler" type="bool" label="30060" default="false" />
<setting id="schedule_interval" type="enum" label="30061" lvalues="30079|30072|30073|30074|30075" default="1" enable="eq(-1,true)"/>
<setting id="schedule_time" type="labelenum" label="30062" values="00:00|01:00|02:00|03:00|04:00|05:00|06:00|07:00|08:00|09:00|10:00|11:00|12:00|13:00|14:00|15:00|16:00|17:00|18:00|19:00|20:00|21:00|22:00|23:00" default="00:00" visible="!eq(-1,4)" enable="eq(-2,true)"/>
<setting id="day_of_week" type="enum" label="30063" lvalues="30065|30066|30067|30068|30069|30070|30071" default="0" visible="eq(-2,2)" enable="eq(-3,true)"/>
<setting id="cron_schedule" type="text" label="30064" default="0 0 * * *" visible="eq(-3,4)" enable="eq(-4,true)"/>
<setting id="cron_shutdown" type="bool" label="30076" default="false" enable="eq(-5,true)" />
</category>
</settings>

View File

@@ -1,147 +0,0 @@
import xbmc
import xbmcvfs
import xbmcgui
import datetime
import time
import os
import resources.lib.utils as utils
from resources.lib.croniter import croniter
from resources.lib.backup import XbmcBackup
class BackupScheduler:
monitor = None
enabled = "false"
next_run = 0
restore_point = None
def __init__(self):
self.monitor = UpdateMonitor(update_method = self.settingsChanged)
self.enabled = utils.getSetting("enable_scheduler")
if(self.enabled == "true"):
self.setup()
def setup(self):
#scheduler was turned on, find next run time
utils.log("scheduler enabled, finding next run time")
self.findNextRun(time.time())
utils.log("scheduler will run again on " + datetime.datetime.fromtimestamp(self.next_run).strftime('%m-%d-%Y %H:%M'))
def start(self):
#check if a backup should be resumed
resumeRestore = self._resumeCheck()
if(resumeRestore):
restore = XbmcBackup()
restore.selectRestore(self.restore_point)
#skip the advanced settings check
restore.skipAdvanced()
restore.run(XbmcBackup.Restore)
while(not xbmc.abortRequested):
if(self.enabled == "true"):
#scheduler is still on
now = time.time()
if(self.next_run <= now):
if(utils.getSetting('run_silent') == 'false'):
utils.showNotification(utils.getString(30053))
#run the job in backup mode, hiding the dialog box
backup = XbmcBackup()
if(backup.remoteConfigured()):
backup.run(XbmcBackup.Backup,True)
#check if this is a "one-off"
if(int(utils.getSetting("schedule_interval")) == 0):
#disable the scheduler after this run
self.enabled = "false"
utils.setSetting('enable_scheduler','false')
else:
utils.showNotification(utils.getString(30045))
#check if we should shut the computer down
if(utils.getSetting("cron_shutdown") == 'true'):
#wait 10 seconds to make sure all backup processes and files are completed
time.sleep(10)
xbmc.executebuiltin('ShutDown()')
else:
#find the next run time like normal
self.findNextRun(now)
xbmc.sleep(500)
#delete monitor to free up memory
del self.monitor
def findNextRun(self,now):
#find the cron expression and get the next run time
cron_exp = self.parseSchedule()
cron_ob = croniter(cron_exp,datetime.datetime.fromtimestamp(now))
new_run_time = cron_ob.get_next(float)
if(new_run_time != self.next_run):
self.next_run = new_run_time
utils.showNotification(utils.getString(30081) + " " + datetime.datetime.fromtimestamp(self.next_run).strftime('%m-%d-%Y %H:%M'))
utils.log("scheduler will run again on " + datetime.datetime.fromtimestamp(self.next_run).strftime('%m-%d-%Y %H:%M'))
def settingsChanged(self):
current_enabled = utils.getSetting("enable_scheduler")
if(current_enabled == "true" and self.enabled == "false"):
#scheduler was just turned on
self.enabled = current_enabled
self.setup()
elif (current_enabled == "false" and self.enabled == "true"):
#schedule was turn off
self.enabled = current_enabled
if(self.enabled == "true"):
#always recheck the next run time after an update
self.findNextRun(time.time())
def parseSchedule(self):
schedule_type = int(utils.getSetting("schedule_interval"))
cron_exp = utils.getSetting("cron_schedule")
hour_of_day = utils.getSetting("schedule_time")
hour_of_day = int(hour_of_day[0:2])
if(schedule_type == 0 or schedule_type == 1):
#every day
cron_exp = "0 " + str(hour_of_day) + " * * *"
elif(schedule_type == 2):
#once a week
day_of_week = utils.getSetting("day_of_week")
cron_exp = "0 " + str(hour_of_day) + " * * " + day_of_week
elif(schedule_type == 3):
#first day of month
cron_exp = "0 " + str(hour_of_day) + " 1 * *"
return cron_exp
def _resumeCheck(self):
shouldContinue = False
if(xbmcvfs.exists(xbmc.translatePath(utils.data_dir() + "resume.txt"))):
rFile = xbmcvfs.File(xbmc.translatePath(utils.data_dir() + "resume.txt"),'r')
self.restore_point = rFile.read()
rFile.close()
xbmcvfs.delete(xbmc.translatePath(utils.data_dir() + "resume.txt"))
shouldContinue = xbmcgui.Dialog().yesno(utils.getString(30042),utils.getString(30043),utils.getString(30044))
return shouldContinue
class UpdateMonitor(xbmc.Monitor):
update_method = None
def __init__(self,*args, **kwargs):
xbmc.Monitor.__init__(self)
self.update_method = kwargs['update_method']
def onSettingsChanged(self):
self.update_method()
BackupScheduler().start()

BIN
screenshots/screenshot1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
screenshots/screenshot2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
screenshots/screenshot3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
screenshots/screenshot4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
screenshots/screenshot5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
screenshots/screenshot6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB