mirror of
https://github.com/robweber/xbmcbackup.git
synced 2026-01-05 07:14:44 +01:00
Compare commits
401 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a9e4e1711b | ||
|
|
f9eebf9efa | ||
|
|
201d04afeb | ||
|
|
2dabb23c2d | ||
|
|
2f19ec2b75 | ||
|
|
db215873cf | ||
|
|
bd963719d4 | ||
|
|
18b7f338c7 | ||
|
|
92a9245bdc | ||
|
|
568c3758a4 | ||
|
|
af999f7d04 | ||
|
|
1264ab86b2 | ||
|
|
90c458d4fc | ||
|
|
0e6f5acfb5 | ||
|
|
c9dd381037 | ||
|
|
55b2ac83d4 | ||
|
|
0d14dd17c6 | ||
|
|
9fa354b467 | ||
|
|
006485b19e | ||
|
|
3c2f512ecf | ||
|
|
190b4fd86f | ||
|
|
9ecf706d63 | ||
|
|
05c53b7ed8 | ||
|
|
8bc73f2832 | ||
|
|
edc4a7b20f | ||
|
|
90b4aeeebe | ||
|
|
7ce9123e1f | ||
|
|
8bfef6692f | ||
|
|
e63560f0c4 | ||
|
|
51f2ef3973 | ||
|
|
04bac77690 | ||
|
|
b1f6d36d73 | ||
|
|
5d398836ba | ||
|
|
23a14d67c4 | ||
|
|
0eebe1c5cc | ||
|
|
4d55385179 | ||
|
|
ac68001aa1 | ||
|
|
233dff0e15 | ||
|
|
6f69f80742 | ||
|
|
47fcb119f3 | ||
|
|
f9f49e3fe6 | ||
|
|
7c23c17e33 | ||
|
|
710bcd08f8 | ||
|
|
5e2d099448 | ||
|
|
8d66fa6a9f | ||
|
|
5ee610a586 | ||
|
|
8c4465f552 | ||
|
|
3849a902ea | ||
|
|
4492ab593e | ||
|
|
16e13c7d80 | ||
|
|
0cc0684263 | ||
|
|
dd5b99c978 | ||
|
|
6c99667afa | ||
|
|
6514b3db02 | ||
|
|
88341d9e1f | ||
|
|
95649c2b3f | ||
|
|
3e9de429dd | ||
|
|
db18c6a7b4 | ||
|
|
35e05acaf2 | ||
|
|
92ec8bf25c | ||
|
|
0c79aef4e7 | ||
|
|
fea7dca500 | ||
|
|
f7665c8ddd | ||
|
|
bbbfc3dd84 | ||
|
|
0b03914175 | ||
|
|
51553f7720 | ||
|
|
294683fb43 | ||
|
|
b74c1af704 | ||
|
|
edd4002d3f | ||
|
|
3aa912ca4c | ||
|
|
5c3e1712f6 | ||
|
|
82bdc955b5 | ||
|
|
4f1e5060e9 | ||
|
|
7d895a6028 | ||
|
|
7ede17fbbd | ||
|
|
d32620ea18 | ||
|
|
def99767e8 | ||
|
|
c7a9a8512d | ||
|
|
332afffc5b | ||
|
|
42d0f1b451 | ||
|
|
8d07310980 | ||
|
|
048d016e0e | ||
|
|
c50c5245fc | ||
|
|
e91037208b | ||
|
|
ff2ca53a22 | ||
|
|
1a27b279b0 | ||
|
|
6dfa4a5520 | ||
|
|
a7b9aeb9c1 | ||
|
|
7226178bfb | ||
|
|
f5bd7130e2 | ||
|
|
ae76d24e86 | ||
|
|
4d56331d8f | ||
|
|
45cf9a367d | ||
|
|
d8ceecb168 | ||
|
|
a2d7e8613a | ||
|
|
c0b0fa82cb | ||
|
|
6ac1d3559b | ||
|
|
d93589ecad | ||
|
|
b21c11de26 | ||
|
|
a4bb3f3feb | ||
|
|
1f6324b2d5 | ||
|
|
12b25f7cea | ||
|
|
5d9d8a1820 | ||
|
|
2fdf8d37fe | ||
|
|
aa94060cfe | ||
|
|
b9e0424ea5 | ||
|
|
495ecb1048 | ||
|
|
a1c0c0bbfe | ||
|
|
9f570233d9 | ||
|
|
b38aff2a8e | ||
|
|
456ebe9374 | ||
|
|
30f8b93629 | ||
|
|
94f872fb81 | ||
|
|
8f8402ae8a | ||
|
|
db93e40f59 | ||
|
|
72c77fb33a | ||
|
|
1f0e262c5b | ||
|
|
b75487bb2a | ||
|
|
b34e538d6b | ||
|
|
b5a7aada4c | ||
|
|
1a9c43b998 | ||
|
|
b7f4b14fe2 | ||
|
|
787b054bba | ||
|
|
a7be48a341 | ||
|
|
2fe76b7b52 | ||
|
|
3aed105fd7 | ||
|
|
c9b4554eac | ||
|
|
e736b964a5 | ||
|
|
4c5f6774df | ||
|
|
1f2e315208 | ||
|
|
138f910d07 | ||
|
|
1d3b2f58ab | ||
|
|
865416977d | ||
|
|
68093b2130 | ||
|
|
701a1831bf | ||
|
|
493e0d3a2e | ||
|
|
d87e209226 | ||
|
|
d703374792 | ||
|
|
c057f66a1e | ||
|
|
9960e2fc6b | ||
|
|
6aae9d9247 | ||
|
|
004b8dae58 | ||
|
|
6b934ed30c | ||
|
|
e950400222 | ||
|
|
cb2bb8a237 | ||
|
|
eb765c974b | ||
|
|
d18ed2960e | ||
|
|
9f1755686c | ||
|
|
534b3b108f | ||
|
|
4a8b891129 | ||
|
|
49af21a67e | ||
|
|
3ee2cb0414 | ||
|
|
061fd3efed | ||
|
|
76c2fdc0c2 | ||
|
|
2c999b46b9 | ||
|
|
4d891ab551 | ||
|
|
6c33e7c9ba | ||
|
|
f0d8e297a9 | ||
|
|
04ec3bd8a8 | ||
|
|
65ea3c98c4 | ||
|
|
ee2f38e865 | ||
|
|
4513eb67f9 | ||
|
|
d0b1d6bb34 | ||
|
|
34529471a7 | ||
|
|
c44d71b8b4 | ||
|
|
bc91dfe2a2 | ||
|
|
27fbadebda | ||
|
|
4108f333e2 | ||
|
|
913090637c | ||
|
|
7139b920ad | ||
|
|
48d07c24a0 | ||
|
|
90e4b0c1f4 | ||
|
|
c9415cbf59 | ||
|
|
32d2fde51c | ||
|
|
181654b414 | ||
|
|
71b048418e | ||
|
|
1896a684b0 | ||
|
|
545bd93e8c | ||
|
|
83a01a48bf | ||
|
|
dcc8482d73 | ||
|
|
85306f9469 | ||
|
|
c0d3b01ade | ||
|
|
5c6a8ce91a | ||
|
|
c8f148cd1a | ||
|
|
2e7080fef8 | ||
|
|
e148bd4894 | ||
|
|
b6e57b04b1 | ||
|
|
8ac5da3b66 | ||
|
|
adbf225ea2 | ||
|
|
d9d6c1ed42 | ||
|
|
55d6ca7464 | ||
|
|
9490f7565c | ||
|
|
6a8573a0c8 | ||
|
|
4b8b847544 | ||
|
|
f5f7bcfcb5 | ||
|
|
4608f04d96 | ||
|
|
e1c8b5a61c | ||
|
|
e02245e422 | ||
|
|
ada1efb165 | ||
|
|
588132c8dc | ||
|
|
5a43b5e340 | ||
|
|
33bc84c288 | ||
|
|
8c61616d3c | ||
|
|
622939901e | ||
|
|
756f50bba1 | ||
|
|
5fefbd286d | ||
|
|
5779784e0a | ||
|
|
24f570e888 | ||
|
|
489dcd317f | ||
|
|
216e2f4561 | ||
|
|
f31c2f7b4d | ||
|
|
c3fe86293d | ||
|
|
92f84b07db | ||
|
|
af1ae52e69 | ||
|
|
87b1a832c5 | ||
|
|
20ee7a92ad | ||
|
|
64daaa13e8 | ||
|
|
009d67d65b | ||
|
|
dda08d04a3 | ||
|
|
469b5ff340 | ||
|
|
ff2f764b2f | ||
|
|
30ddff0bf2 | ||
|
|
ec0c52ee6e | ||
|
|
4647bdec14 | ||
|
|
fc2c4b341a | ||
|
|
71e8e44e27 | ||
|
|
2af3070528 | ||
|
|
7e01f51e86 | ||
|
|
af93f1916b | ||
|
|
4689ce9b82 | ||
|
|
db4b404a88 | ||
|
|
2927e31c59 | ||
|
|
7d51ee05bc | ||
|
|
2c634f9250 | ||
|
|
3fcc15ebe5 | ||
|
|
94f0887393 | ||
|
|
87c638a0d6 | ||
|
|
fcafc77180 | ||
|
|
72e9950af7 | ||
|
|
c46f684ea5 | ||
|
|
b1d16df817 | ||
|
|
49f6ae5270 | ||
|
|
2e7552896a | ||
|
|
d3ed0bc63c | ||
|
|
8edaae803b | ||
|
|
d846cffd80 | ||
|
|
439c8aae28 | ||
|
|
ca454d5eee | ||
|
|
17aeb98bf2 | ||
|
|
8a6518fd2d | ||
|
|
b7c24896c9 | ||
|
|
405783cde0 | ||
|
|
9f949e6320 | ||
|
|
cff2ea86b7 | ||
|
|
e162ff3c19 | ||
|
|
622039febb | ||
|
|
d0028d440c | ||
|
|
210a907f8a | ||
|
|
0926c5d3a1 | ||
|
|
3e38f992b5 | ||
|
|
032a772a81 | ||
|
|
97a977c721 | ||
|
|
9add0b2981 | ||
|
|
7ed70ca9cb | ||
|
|
2a5accfed1 | ||
|
|
faccf424b7 | ||
|
|
2ad895626a | ||
|
|
98a369db6f | ||
|
|
09b6010738 | ||
|
|
6786a233e0 | ||
|
|
7d2c8c54c6 | ||
|
|
7448b6fea1 | ||
|
|
99e19b8fd5 | ||
|
|
1d7ca0afcf | ||
|
|
1eb84c6ecf | ||
|
|
f0cce73851 | ||
|
|
776c3872ae | ||
|
|
02e3a73623 | ||
|
|
eaf5f12245 | ||
|
|
49f6b176e8 | ||
|
|
5050af931c | ||
|
|
5c40b0edc4 | ||
|
|
044cdc4bdc | ||
|
|
9d7076da0c | ||
|
|
d62f829421 | ||
|
|
6de7ccaddf | ||
|
|
65d10e22d9 | ||
|
|
f887df0197 | ||
|
|
e395c60293 | ||
|
|
16f4d4073a | ||
|
|
fec65afc8f | ||
|
|
ee5dfed50b | ||
|
|
7730c727e5 | ||
|
|
d9e31e32ad | ||
|
|
138047bd32 | ||
|
|
2ac05ab042 | ||
|
|
b91591ec05 | ||
|
|
e803573340 | ||
|
|
687e830bcd | ||
|
|
c578fe15d8 | ||
|
|
d68679f534 | ||
|
|
744ba77251 | ||
|
|
fae5a052c7 | ||
|
|
8473542aaf | ||
|
|
72b2abfe8d | ||
|
|
d6d7221551 | ||
|
|
0b6a3ae506 | ||
|
|
2fc26b6e8c | ||
|
|
f41f37782d | ||
|
|
9e5873fcb7 | ||
|
|
b0ecaa8416 | ||
|
|
d335634618 | ||
|
|
355135853b | ||
|
|
f8c00b473f | ||
|
|
cdf67dbd0c | ||
|
|
69afda758b | ||
|
|
64ae75252f | ||
|
|
9246c9b586 | ||
|
|
e90c8e7803 | ||
|
|
cf40edad79 | ||
|
|
e316e82013 | ||
|
|
9c73b5b0b8 | ||
|
|
06fbef26db | ||
|
|
74cb8c2b28 | ||
|
|
c36df5ade9 | ||
|
|
0df7364bea | ||
|
|
b593a55120 | ||
|
|
3e32882afc | ||
|
|
4d109d138f | ||
|
|
08be62b4ec | ||
|
|
7bab6a9ada | ||
|
|
f0a6b3351a | ||
|
|
64d788e9f7 | ||
|
|
62104184de | ||
|
|
91af11c9f7 | ||
|
|
d9ff17eeec | ||
|
|
53ddc92325 | ||
|
|
250a5021e0 | ||
|
|
eb2f5dce74 | ||
|
|
b14fda20fb | ||
|
|
38cc67a54d | ||
|
|
d69a1b2d27 | ||
|
|
d7a0e622be | ||
|
|
a1c91ef51c | ||
|
|
45b6cea057 | ||
|
|
80f4e6bdfb | ||
|
|
f249ea1583 | ||
|
|
9945dc628e | ||
|
|
24e1311db5 | ||
|
|
49783f712a | ||
|
|
1255283f4d | ||
|
|
b3bbdd6911 | ||
|
|
5dfa9d9b76 | ||
|
|
545843e949 | ||
|
|
647bd8811b | ||
|
|
e6215dde51 | ||
|
|
9a89066e66 | ||
|
|
c28f9fd26b | ||
|
|
933fdbdf09 | ||
|
|
c49aebeba1 | ||
|
|
525dd8ff86 | ||
|
|
19fcb8bd46 | ||
|
|
24385a2c68 | ||
|
|
6dc23de55b | ||
|
|
eeb25a4c58 | ||
|
|
2365649f86 | ||
|
|
097238cf7b | ||
|
|
dd3a50027e | ||
|
|
ee435a90ef | ||
|
|
23b70af3dc | ||
|
|
a439863c05 | ||
|
|
6f34d39822 | ||
|
|
e025b3213c | ||
|
|
9f794549c2 | ||
|
|
290446c3a8 | ||
|
|
35c1717699 | ||
|
|
3a25c1c4eb | ||
|
|
37fb30d7ab | ||
|
|
a09677930f | ||
|
|
ed696a5c4f | ||
|
|
6f4de551dc | ||
|
|
6ad083ced8 | ||
|
|
eecdf4277c | ||
|
|
450687ba5d | ||
|
|
a217960576 | ||
|
|
7f42129606 | ||
|
|
4312625003 | ||
|
|
2bec306892 | ||
|
|
542bc692d9 | ||
|
|
70ced05cd5 | ||
|
|
405bbc08b5 | ||
|
|
775a5aeda2 | ||
|
|
e185ddf131 | ||
|
|
aec7d19b00 | ||
|
|
b0b611b5c9 | ||
|
|
884633073a | ||
|
|
4fcd40c745 | ||
|
|
77dbd69ce2 | ||
|
|
e3be458a28 | ||
|
|
987d90de12 | ||
|
|
163124089b |
32
README.md
Normal file
32
README.md
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
65
README.txt
65
README.txt
@@ -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.
|
||||
|
||||
67
addon.xml
67
addon.xml
@@ -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>
|
||||
174
changelog.txt
174
changelog.txt
@@ -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
|
||||
|
||||
38
default.py
38
default.py
@@ -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()
|
||||
2
resources/.gitignore
vendored
2
resources/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
|
||||
*.pyo
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
2
resources/lib/.gitignore
vendored
2
resources/lib/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
|
||||
*.pyo
|
||||
@@ -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)
|
||||
@@ -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
|
||||
2
resources/lib/dropbox/.gitignore
vendored
2
resources/lib/dropbox/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
|
||||
*.pyc
|
||||
@@ -1,3 +0,0 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from . import client, rest, session
|
||||
@@ -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)
|
||||
@@ -1,4 +0,0 @@
|
||||
import resources.lib.utils as utils
|
||||
|
||||
def resource_filename(*args):
|
||||
return utils.addon_dir() + "/resources/lib/dropbox/trusted-certs.crt"
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
@@ -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_
|
||||
@@ -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-----
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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))
|
||||
@@ -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')
|
||||
@@ -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"))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
147
scheduler.py
147
scheduler.py
@@ -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
BIN
screenshots/screenshot1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
BIN
screenshots/screenshot2.jpg
Normal file
BIN
screenshots/screenshot2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
BIN
screenshots/screenshot3.jpg
Normal file
BIN
screenshots/screenshot3.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 135 KiB |
BIN
screenshots/screenshot4.jpg
Normal file
BIN
screenshots/screenshot4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 95 KiB |
BIN
screenshots/screenshot5.jpg
Normal file
BIN
screenshots/screenshot5.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
BIN
screenshots/screenshot6.jpg
Normal file
BIN
screenshots/screenshot6.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 103 KiB |
Reference in New Issue
Block a user